From cf46d4693e8c3cadb93e84873b46a240ed120db0 Mon Sep 17 00:00:00 2001 From: Li Date: Wed, 15 Mar 2023 02:36:58 +1300 Subject: [PATCH] first commit --- .gitignore | 18 + DumpDVD.sln | 37 + DumpDVD/DumpDVD.cpp | 70 + DumpDVD/DumpDVD.vcxproj | 163 + DumpDVD/DumpDVD.vcxproj.filters | 51 + DumpDVD/DumpDVD.vcxproj.user | 14 + DumpDVD/Gui/D3D.cpp | 106 + DumpDVD/Gui/D3D.hpp | 41 + DumpDVD/Gui/MainWindow.cpp | 79 + DumpDVD/Gui/MainWindow.hpp | 15 + DumpDVD/Gui/Renderer.hpp | 12 + DumpDVD/Gui/SDL.cpp | 93 + DumpDVD/Gui/SDL.hpp | 25 + DumpDVD/Scsi/CdRom.cpp | 101 + DumpDVD/Scsi/CdRom.hpp | 23 + DumpDVD/imgui.ini | 45 + ImGui/ImGui.vcxproj | 173 + ImGui/ImGui.vcxproj.filters | 66 + ImGui/ImGui.vcxproj.user | 6 + ImGui/backends/imgui_impl_allegro5.cpp | 604 + ImGui/backends/imgui_impl_allegro5.h | 32 + ImGui/backends/imgui_impl_android.cpp | 277 + ImGui/backends/imgui_impl_android.h | 28 + ImGui/backends/imgui_impl_dx10.cpp | 580 + ImGui/backends/imgui_impl_dx10.h | 25 + ImGui/backends/imgui_impl_dx11.cpp | 596 + ImGui/backends/imgui_impl_dx11.h | 26 + ImGui/backends/imgui_impl_dx12.cpp | 752 + ImGui/backends/imgui_impl_dx12.h | 38 + ImGui/backends/imgui_impl_dx9.cpp | 379 + ImGui/backends/imgui_impl_dx9.h | 25 + ImGui/backends/imgui_impl_glfw.cpp | 745 + ImGui/backends/imgui_impl_glfw.h | 46 + ImGui/backends/imgui_impl_glut.cpp | 300 + ImGui/backends/imgui_impl_glut.h | 40 + ImGui/backends/imgui_impl_metal.h | 64 + ImGui/backends/imgui_impl_metal.mm | 575 + ImGui/backends/imgui_impl_opengl2.cpp | 287 + ImGui/backends/imgui_impl_opengl2.h | 32 + ImGui/backends/imgui_impl_opengl3.cpp | 901 + ImGui/backends/imgui_impl_opengl3.h | 55 + ImGui/backends/imgui_impl_opengl3_loader.h | 805 + ImGui/backends/imgui_impl_osx.h | 44 + ImGui/backends/imgui_impl_osx.mm | 766 + ImGui/backends/imgui_impl_sdl2.cpp | 634 + ImGui/backends/imgui_impl_sdl2.h | 35 + ImGui/backends/imgui_impl_sdl3.cpp | 567 + ImGui/backends/imgui_impl_sdl3.h | 33 + ImGui/backends/imgui_impl_sdlrenderer.cpp | 250 + ImGui/backends/imgui_impl_sdlrenderer.h | 29 + ImGui/backends/imgui_impl_vulkan.cpp | 1450 ++ ImGui/backends/imgui_impl_vulkan.h | 157 + ImGui/backends/imgui_impl_wgpu.cpp | 748 + ImGui/backends/imgui_impl_wgpu.h | 25 + ImGui/backends/imgui_impl_win32.cpp | 826 + ImGui/backends/imgui_impl_win32.h | 44 + ImGui/backends/vulkan/generate_spv.sh | 6 + ImGui/backends/vulkan/glsl_shader.frag | 14 + ImGui/backends/vulkan/glsl_shader.vert | 25 + ImGui/examples/README.txt | 9 + ImGui/examples/example_allegro5/README.md | 36 + .../example_allegro5/example_allegro5.vcxproj | 180 + .../example_allegro5.vcxproj.filters | 58 + .../example_allegro5/imconfig_allegro5.h | 11 + ImGui/examples/example_allegro5/main.cpp | 145 + .../example_android_opengl3/CMakeLists.txt | 40 + .../android/.gitignore | 12 + .../android/app/build.gradle | 46 + .../android/app/src/main/AndroidManifest.xml | 24 + .../android/app/src/main/java/MainActivity.kt | 40 + .../android/build.gradle | 24 + .../android/settings.gradle | 1 + .../examples/example_android_opengl3/main.cpp | 378 + ImGui/examples/example_apple_metal/README.md | 10 + .../project.pbxproj | 503 + .../example_apple_metal/iOS/Info-iOS.plist | 49 + .../iOS/LaunchScreen.storyboard | 27 + .../macOS/Info-macOS.plist | 30 + .../macOS/MainMenu.storyboard | 93 + ImGui/examples/example_apple_metal/main.mm | 332 + .../project.pbxproj | 332 + ImGui/examples/example_apple_opengl2/main.mm | 251 + .../examples/example_emscripten_wgpu/Makefile | 88 + .../example_emscripten_wgpu/README.md | 24 + .../examples/example_emscripten_wgpu/main.cpp | 246 + .../example_emscripten_wgpu/web/index.html | 80 + ImGui/examples/example_glfw_metal/Makefile | 46 + ImGui/examples/example_glfw_metal/main.mm | 173 + ImGui/examples/example_glfw_opengl2/Makefile | 81 + .../example_glfw_opengl2/build_win32.bat | 8 + .../example_glfw_opengl2.vcxproj | 181 + .../example_glfw_opengl2.vcxproj.filters | 61 + ImGui/examples/example_glfw_opengl2/main.cpp | 162 + ImGui/examples/example_glfw_opengl3/Makefile | 89 + .../example_glfw_opengl3/Makefile.emscripten | 91 + .../example_glfw_opengl3/build_win32.bat | 8 + .../example_glfw_opengl3.vcxproj | 182 + .../example_glfw_opengl3.vcxproj.filters | 64 + ImGui/examples/example_glfw_opengl3/main.cpp | 190 + .../example_glfw_vulkan/CMakeLists.txt | 45 + .../example_glfw_vulkan/build_win32.bat | 14 + .../example_glfw_vulkan/build_win64.bat | 13 + .../example_glfw_vulkan.vcxproj | 185 + .../example_glfw_vulkan.vcxproj.filters | 61 + ImGui/examples/example_glfw_vulkan/main.cpp | 560 + ImGui/examples/example_glut_opengl2/Makefile | 75 + .../example_glut_opengl2.vcxproj | 181 + .../example_glut_opengl2.vcxproj.filters | 61 + ImGui/examples/example_glut_opengl2/main.cpp | 159 + ImGui/examples/example_null/Makefile | 92 + ImGui/examples/example_null/build_win32.bat | 3 + ImGui/examples/example_null/main.cpp | 37 + .../example_sdl2_directx11/build_win32.bat | 8 + .../example_sdl2_directx11.vcxproj | 182 + .../example_sdl2_directx11.vcxproj.filters | 60 + ImGui/examples/example_sdl2_metal/Makefile | 47 + ImGui/examples/example_sdl2_metal/main.mm | 185 + ImGui/examples/example_sdl2_opengl2/Makefile | 79 + ImGui/examples/example_sdl2_opengl2/README.md | 29 + .../example_sdl2_opengl2/build_win32.bat | 8 + .../example_sdl2_opengl2.vcxproj | 181 + .../example_sdl2_opengl2.vcxproj.filters | 61 + ImGui/examples/example_sdl2_opengl2/main.cpp | 161 + ImGui/examples/example_sdl2_opengl3/Makefile | 91 + .../example_sdl2_opengl3/Makefile.emscripten | 92 + ImGui/examples/example_sdl2_opengl3/README.md | 57 + .../example_sdl2_opengl3/build_win32.bat | 8 + .../example_sdl2_opengl3.vcxproj | 182 + .../example_sdl2_opengl3.vcxproj.filters | 64 + ImGui/examples/example_sdl2_opengl3/main.cpp | 198 + .../example_sdl2_sdlrenderer/Makefile | 79 + .../example_sdl2_sdlrenderer/README.md | 25 + .../example_sdl2_sdlrenderer/build_win32.bat | 8 + .../example_sdl2_sdlrenderer.vcxproj | 181 + .../example_sdl2_sdlrenderer.vcxproj.filters | 61 + .../example_sdl2_sdlrenderer/main.cpp | 164 + .../example_sdl2_vulkan/build_win32.bat | 10 + .../example_sdl2_vulkan.vcxproj | 185 + .../example_sdl2_vulkan.vcxproj.filters | 61 + ImGui/examples/example_sdl2_vulkan/main.cpp | 567 + ImGui/examples/example_sdl3_opengl3/Makefile | 84 + .../example_sdl3_opengl3/Makefile.emscripten | 92 + ImGui/examples/example_sdl3_opengl3/README.md | 57 + .../example_sdl3_opengl3/build_win32.bat | 8 + .../example_sdl3_opengl3.vcxproj | 182 + .../example_sdl3_opengl3.vcxproj.filters | 64 + ImGui/examples/example_sdl3_opengl3/main.cpp | 196 + .../example_win32_directx10/build_win32.bat | 8 + .../example_win32_directx10.vcxproj | 171 + .../example_win32_directx10.vcxproj.filters | 60 + .../examples/example_win32_directx10/main.cpp | 247 + .../example_win32_directx11/build_win32.bat | 9 + .../example_win32_directx11.vcxproj | 170 + .../example_win32_directx11.vcxproj.filters | 60 + .../examples/example_win32_directx11/main.cpp | 251 + .../example_win32_directx12/build_win32.bat | 9 + .../example_win32_directx12.vcxproj | 175 + .../example_win32_directx12.vcxproj.filters | 62 + .../examples/example_win32_directx12/main.cpp | 466 + .../example_win32_directx9/build_win32.bat | 8 + .../example_win32_directx9.vcxproj | 171 + .../example_win32_directx9.vcxproj.filters | 61 + .../examples/example_win32_directx9/main.cpp | 238 + ImGui/examples/imgui_examples.sln | 141 + .../emscripten/emscripten_mainloop_stub.h | 37 + .../libs/emscripten/shell_minimal.html | 65 + ImGui/examples/libs/glfw/COPYING.txt | 22 + ImGui/examples/libs/glfw/include/GLFW/glfw3.h | 4227 +++++ .../libs/glfw/include/GLFW/glfw3native.h | 456 + .../libs/glfw/lib-vc2010-32/glfw3.lib | Bin 0 -> 187376 bytes .../libs/glfw/lib-vc2010-64/glfw3.lib | Bin 0 -> 291120 bytes ImGui/examples/libs/usynergy/README.txt | 8 + ImGui/examples/libs/usynergy/uSynergy.c | 636 + ImGui/examples/libs/usynergy/uSynergy.h | 420 + ImGui/imconfig.h | 122 + ImGui/imgui.cpp | 14597 ++++++++++++++++ ImGui/imgui.h | 3121 ++++ ImGui/imgui_demo.cpp | 8036 +++++++++ ImGui/imgui_draw.cpp | 4174 +++++ ImGui/imgui_impl_dx11.cpp | 596 + ImGui/imgui_impl_dx11.h | 26 + ImGui/imgui_impl_sdl2.cpp | 634 + ImGui/imgui_impl_sdl2.h | 35 + ImGui/imgui_internal.h | 3262 ++++ ImGui/imgui_tables.cpp | 4117 +++++ ImGui/imgui_widgets.cpp | 8554 +++++++++ ImGui/imstb_rectpack.h | 627 + ImGui/imstb_textedit.h | 1437 ++ ImGui/imstb_truetype.h | 5085 ++++++ include/SDL/SDL.h | 233 + include/SDL/SDL_assert.h | 326 + include/SDL/SDL_atomic.h | 415 + include/SDL/SDL_audio.h | 1500 ++ include/SDL/SDL_bits.h | 126 + include/SDL/SDL_blendmode.h | 198 + include/SDL/SDL_clipboard.h | 141 + include/SDL/SDL_config.h | 331 + include/SDL/SDL_config.h.cmake | 445 + include/SDL/SDL_config.h.in | 389 + include/SDL/SDL_config_android.h | 157 + include/SDL/SDL_config_iphoneos.h | 166 + include/SDL/SDL_config_macosx.h | 197 + include/SDL/SDL_config_macosx.h.orig | 197 + include/SDL/SDL_config_minimal.h | 82 + include/SDL/SDL_config_pandora.h | 128 + include/SDL/SDL_config_psp.h | 144 + include/SDL/SDL_config_windows.h | 225 + include/SDL/SDL_config_winrt.h | 215 + include/SDL/SDL_config_wiz.h | 121 + include/SDL/SDL_copying.h | 20 + include/SDL/SDL_cpuinfo.h | 594 + include/SDL/SDL_egl.h | 2352 +++ include/SDL/SDL_endian.h | 348 + include/SDL/SDL_error.h | 163 + include/SDL/SDL_events.h | 1166 ++ include/SDL/SDL_filesystem.h | 149 + include/SDL/SDL_gamecontroller.h | 1074 ++ include/SDL/SDL_gesture.h | 117 + include/SDL/SDL_guid.h | 100 + include/SDL/SDL_haptic.h | 1341 ++ include/SDL/SDL_hidapi.h | 451 + include/SDL/SDL_hints.h | 2569 +++ include/SDL/SDL_joystick.h | 1066 ++ include/SDL/SDL_keyboard.h | 353 + include/SDL/SDL_keycode.h | 358 + include/SDL/SDL_loadso.h | 115 + include/SDL/SDL_locale.h | 103 + include/SDL/SDL_log.h | 404 + include/SDL/SDL_main.h | 275 + include/SDL/SDL_messagebox.h | 193 + include/SDL/SDL_metal.h | 113 + include/SDL/SDL_misc.h | 79 + include/SDL/SDL_mouse.h | 465 + include/SDL/SDL_mutex.h | 471 + include/SDL/SDL_name.h | 33 + include/SDL/SDL_opengl.h | 2132 +++ include/SDL/SDL_opengl_glext.h | 13209 ++++++++++++++ include/SDL/SDL_opengles.h | 39 + include/SDL/SDL_opengles2.h | 52 + include/SDL/SDL_opengles2_gl2.h | 656 + include/SDL/SDL_opengles2_gl2ext.h | 4033 +++++ include/SDL/SDL_opengles2_gl2platform.h | 27 + include/SDL/SDL_opengles2_khrplatform.h | 311 + include/SDL/SDL_pixels.h | 644 + include/SDL/SDL_platform.h | 261 + include/SDL/SDL_power.h | 88 + include/SDL/SDL_quit.h | 58 + include/SDL/SDL_rect.h | 376 + include/SDL/SDL_render.h | 1919 ++ include/SDL/SDL_revision.h | 7 + include/SDL/SDL_rwops.h | 841 + include/SDL/SDL_scancode.h | 438 + include/SDL/SDL_sensor.h | 322 + include/SDL/SDL_shape.h | 155 + include/SDL/SDL_stdinc.h | 830 + include/SDL/SDL_surface.h | 997 ++ include/SDL/SDL_system.h | 623 + include/SDL/SDL_syswm.h | 386 + include/SDL/SDL_test.h | 69 + include/SDL/SDL_test_assert.h | 105 + include/SDL/SDL_test_common.h | 236 + include/SDL/SDL_test_compare.h | 69 + include/SDL/SDL_test_crc32.h | 124 + include/SDL/SDL_test_font.h | 168 + include/SDL/SDL_test_fuzzer.h | 386 + include/SDL/SDL_test_harness.h | 134 + include/SDL/SDL_test_images.h | 78 + include/SDL/SDL_test_log.h | 67 + include/SDL/SDL_test_md5.h | 129 + include/SDL/SDL_test_memory.h | 63 + include/SDL/SDL_test_random.h | 115 + include/SDL/SDL_thread.h | 464 + include/SDL/SDL_timer.h | 222 + include/SDL/SDL_touch.h | 150 + include/SDL/SDL_types.h | 29 + include/SDL/SDL_version.h | 204 + include/SDL/SDL_video.h | 2150 +++ include/SDL/SDL_vulkan.h | 215 + include/SDL/begin_code.h | 187 + include/SDL/close_code.h | 40 + lib/ImGui.lib | Bin 0 -> 5847042 bytes lib/SDL2.lib | Bin 0 -> 20154942 bytes lib/libdvdcss.lib | Bin 0 -> 288634 bytes libdvdcss/.gitignore | 36 + libdvdcss/.gitlab-ci.yml | 74 + libdvdcss/AUTHORS | 88 + libdvdcss/COPYING | 339 + libdvdcss/INSTALL | 67 + libdvdcss/Makefile.am | 83 + libdvdcss/NEWS | 192 + libdvdcss/README.md | 76 + libdvdcss/configure.ac | 255 + libdvdcss/doc/doxygen.cfg.in | 2293 +++ libdvdcss/libdvdcss.spec.in | 181 + libdvdcss/m4/attributes.m4 | 295 + libdvdcss/msvc/config.h | 44 + libdvdcss/msvc/libdvdcss.vcxproj | 228 + libdvdcss/msvc/libdvdcss.vcxproj.user | 4 + libdvdcss/src/common.h | 72 + libdvdcss/src/css.c | 1756 ++ libdvdcss/src/css.h | 65 + libdvdcss/src/csstables.h | 396 + libdvdcss/src/device.c | 889 + libdvdcss/src/device.h | 56 + libdvdcss/src/dvdcss/dvdcss.h | 114 + libdvdcss/src/dvdcss/version.h | 37 + libdvdcss/src/dvdcss/version.h.in | 37 + libdvdcss/src/error.c | 66 + libdvdcss/src/ioctl.c | 1564 ++ libdvdcss/src/ioctl.h | 276 + libdvdcss/src/libdvdcss.c | 872 + libdvdcss/src/libdvdcss.h | 88 + libdvdcss/src/libdvdcss.pc.in | 10 + libdvdcss/test/csstest.c | 135 + libdvdcss/test/dvd_region.c | 297 + 315 files changed, 151213 insertions(+) create mode 100644 .gitignore create mode 100644 DumpDVD.sln create mode 100644 DumpDVD/DumpDVD.cpp create mode 100644 DumpDVD/DumpDVD.vcxproj create mode 100644 DumpDVD/DumpDVD.vcxproj.filters create mode 100644 DumpDVD/DumpDVD.vcxproj.user create mode 100644 DumpDVD/Gui/D3D.cpp create mode 100644 DumpDVD/Gui/D3D.hpp create mode 100644 DumpDVD/Gui/MainWindow.cpp create mode 100644 DumpDVD/Gui/MainWindow.hpp create mode 100644 DumpDVD/Gui/Renderer.hpp create mode 100644 DumpDVD/Gui/SDL.cpp create mode 100644 DumpDVD/Gui/SDL.hpp create mode 100644 DumpDVD/Scsi/CdRom.cpp create mode 100644 DumpDVD/Scsi/CdRom.hpp create mode 100644 DumpDVD/imgui.ini create mode 100644 ImGui/ImGui.vcxproj create mode 100644 ImGui/ImGui.vcxproj.filters create mode 100644 ImGui/ImGui.vcxproj.user create mode 100644 ImGui/backends/imgui_impl_allegro5.cpp create mode 100644 ImGui/backends/imgui_impl_allegro5.h create mode 100644 ImGui/backends/imgui_impl_android.cpp create mode 100644 ImGui/backends/imgui_impl_android.h create mode 100644 ImGui/backends/imgui_impl_dx10.cpp create mode 100644 ImGui/backends/imgui_impl_dx10.h create mode 100644 ImGui/backends/imgui_impl_dx11.cpp create mode 100644 ImGui/backends/imgui_impl_dx11.h create mode 100644 ImGui/backends/imgui_impl_dx12.cpp create mode 100644 ImGui/backends/imgui_impl_dx12.h create mode 100644 ImGui/backends/imgui_impl_dx9.cpp create mode 100644 ImGui/backends/imgui_impl_dx9.h create mode 100644 ImGui/backends/imgui_impl_glfw.cpp create mode 100644 ImGui/backends/imgui_impl_glfw.h create mode 100644 ImGui/backends/imgui_impl_glut.cpp create mode 100644 ImGui/backends/imgui_impl_glut.h create mode 100644 ImGui/backends/imgui_impl_metal.h create mode 100644 ImGui/backends/imgui_impl_metal.mm create mode 100644 ImGui/backends/imgui_impl_opengl2.cpp create mode 100644 ImGui/backends/imgui_impl_opengl2.h create mode 100644 ImGui/backends/imgui_impl_opengl3.cpp create mode 100644 ImGui/backends/imgui_impl_opengl3.h create mode 100644 ImGui/backends/imgui_impl_opengl3_loader.h create mode 100644 ImGui/backends/imgui_impl_osx.h create mode 100644 ImGui/backends/imgui_impl_osx.mm create mode 100644 ImGui/backends/imgui_impl_sdl2.cpp create mode 100644 ImGui/backends/imgui_impl_sdl2.h create mode 100644 ImGui/backends/imgui_impl_sdl3.cpp create mode 100644 ImGui/backends/imgui_impl_sdl3.h create mode 100644 ImGui/backends/imgui_impl_sdlrenderer.cpp create mode 100644 ImGui/backends/imgui_impl_sdlrenderer.h create mode 100644 ImGui/backends/imgui_impl_vulkan.cpp create mode 100644 ImGui/backends/imgui_impl_vulkan.h create mode 100644 ImGui/backends/imgui_impl_wgpu.cpp create mode 100644 ImGui/backends/imgui_impl_wgpu.h create mode 100644 ImGui/backends/imgui_impl_win32.cpp create mode 100644 ImGui/backends/imgui_impl_win32.h create mode 100644 ImGui/backends/vulkan/generate_spv.sh create mode 100644 ImGui/backends/vulkan/glsl_shader.frag create mode 100644 ImGui/backends/vulkan/glsl_shader.vert create mode 100644 ImGui/examples/README.txt create mode 100644 ImGui/examples/example_allegro5/README.md create mode 100644 ImGui/examples/example_allegro5/example_allegro5.vcxproj create mode 100644 ImGui/examples/example_allegro5/example_allegro5.vcxproj.filters create mode 100644 ImGui/examples/example_allegro5/imconfig_allegro5.h create mode 100644 ImGui/examples/example_allegro5/main.cpp create mode 100644 ImGui/examples/example_android_opengl3/CMakeLists.txt create mode 100644 ImGui/examples/example_android_opengl3/android/.gitignore create mode 100644 ImGui/examples/example_android_opengl3/android/app/build.gradle create mode 100644 ImGui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml create mode 100644 ImGui/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt create mode 100644 ImGui/examples/example_android_opengl3/android/build.gradle create mode 100644 ImGui/examples/example_android_opengl3/android/settings.gradle create mode 100644 ImGui/examples/example_android_opengl3/main.cpp create mode 100644 ImGui/examples/example_apple_metal/README.md create mode 100644 ImGui/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj create mode 100644 ImGui/examples/example_apple_metal/iOS/Info-iOS.plist create mode 100644 ImGui/examples/example_apple_metal/iOS/LaunchScreen.storyboard create mode 100644 ImGui/examples/example_apple_metal/macOS/Info-macOS.plist create mode 100644 ImGui/examples/example_apple_metal/macOS/MainMenu.storyboard create mode 100644 ImGui/examples/example_apple_metal/main.mm create mode 100644 ImGui/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj create mode 100644 ImGui/examples/example_apple_opengl2/main.mm create mode 100644 ImGui/examples/example_emscripten_wgpu/Makefile create mode 100644 ImGui/examples/example_emscripten_wgpu/README.md create mode 100644 ImGui/examples/example_emscripten_wgpu/main.cpp create mode 100644 ImGui/examples/example_emscripten_wgpu/web/index.html create mode 100644 ImGui/examples/example_glfw_metal/Makefile create mode 100644 ImGui/examples/example_glfw_metal/main.mm create mode 100644 ImGui/examples/example_glfw_opengl2/Makefile create mode 100644 ImGui/examples/example_glfw_opengl2/build_win32.bat create mode 100644 ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj create mode 100644 ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters create mode 100644 ImGui/examples/example_glfw_opengl2/main.cpp create mode 100644 ImGui/examples/example_glfw_opengl3/Makefile create mode 100644 ImGui/examples/example_glfw_opengl3/Makefile.emscripten create mode 100644 ImGui/examples/example_glfw_opengl3/build_win32.bat create mode 100644 ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj create mode 100644 ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters create mode 100644 ImGui/examples/example_glfw_opengl3/main.cpp create mode 100644 ImGui/examples/example_glfw_vulkan/CMakeLists.txt create mode 100644 ImGui/examples/example_glfw_vulkan/build_win32.bat create mode 100644 ImGui/examples/example_glfw_vulkan/build_win64.bat create mode 100644 ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj create mode 100644 ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters create mode 100644 ImGui/examples/example_glfw_vulkan/main.cpp create mode 100644 ImGui/examples/example_glut_opengl2/Makefile create mode 100644 ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj create mode 100644 ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters create mode 100644 ImGui/examples/example_glut_opengl2/main.cpp create mode 100644 ImGui/examples/example_null/Makefile create mode 100644 ImGui/examples/example_null/build_win32.bat create mode 100644 ImGui/examples/example_null/main.cpp create mode 100644 ImGui/examples/example_sdl2_directx11/build_win32.bat create mode 100644 ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj create mode 100644 ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters create mode 100644 ImGui/examples/example_sdl2_metal/Makefile create mode 100644 ImGui/examples/example_sdl2_metal/main.mm create mode 100644 ImGui/examples/example_sdl2_opengl2/Makefile create mode 100644 ImGui/examples/example_sdl2_opengl2/README.md create mode 100644 ImGui/examples/example_sdl2_opengl2/build_win32.bat create mode 100644 ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj create mode 100644 ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters create mode 100644 ImGui/examples/example_sdl2_opengl2/main.cpp create mode 100644 ImGui/examples/example_sdl2_opengl3/Makefile create mode 100644 ImGui/examples/example_sdl2_opengl3/Makefile.emscripten create mode 100644 ImGui/examples/example_sdl2_opengl3/README.md create mode 100644 ImGui/examples/example_sdl2_opengl3/build_win32.bat create mode 100644 ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj create mode 100644 ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters create mode 100644 ImGui/examples/example_sdl2_opengl3/main.cpp create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/Makefile create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/README.md create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/build_win32.bat create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj.filters create mode 100644 ImGui/examples/example_sdl2_sdlrenderer/main.cpp create mode 100644 ImGui/examples/example_sdl2_vulkan/build_win32.bat create mode 100644 ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj create mode 100644 ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters create mode 100644 ImGui/examples/example_sdl2_vulkan/main.cpp create mode 100644 ImGui/examples/example_sdl3_opengl3/Makefile create mode 100644 ImGui/examples/example_sdl3_opengl3/Makefile.emscripten create mode 100644 ImGui/examples/example_sdl3_opengl3/README.md create mode 100644 ImGui/examples/example_sdl3_opengl3/build_win32.bat create mode 100644 ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj create mode 100644 ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters create mode 100644 ImGui/examples/example_sdl3_opengl3/main.cpp create mode 100644 ImGui/examples/example_win32_directx10/build_win32.bat create mode 100644 ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj create mode 100644 ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters create mode 100644 ImGui/examples/example_win32_directx10/main.cpp create mode 100644 ImGui/examples/example_win32_directx11/build_win32.bat create mode 100644 ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj create mode 100644 ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters create mode 100644 ImGui/examples/example_win32_directx11/main.cpp create mode 100644 ImGui/examples/example_win32_directx12/build_win32.bat create mode 100644 ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj create mode 100644 ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters create mode 100644 ImGui/examples/example_win32_directx12/main.cpp create mode 100644 ImGui/examples/example_win32_directx9/build_win32.bat create mode 100644 ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj create mode 100644 ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters create mode 100644 ImGui/examples/example_win32_directx9/main.cpp create mode 100644 ImGui/examples/imgui_examples.sln create mode 100644 ImGui/examples/libs/emscripten/emscripten_mainloop_stub.h create mode 100644 ImGui/examples/libs/emscripten/shell_minimal.html create mode 100644 ImGui/examples/libs/glfw/COPYING.txt create mode 100644 ImGui/examples/libs/glfw/include/GLFW/glfw3.h create mode 100644 ImGui/examples/libs/glfw/include/GLFW/glfw3native.h create mode 100644 ImGui/examples/libs/glfw/lib-vc2010-32/glfw3.lib create mode 100644 ImGui/examples/libs/glfw/lib-vc2010-64/glfw3.lib create mode 100644 ImGui/examples/libs/usynergy/README.txt create mode 100644 ImGui/examples/libs/usynergy/uSynergy.c create mode 100644 ImGui/examples/libs/usynergy/uSynergy.h create mode 100644 ImGui/imconfig.h create mode 100644 ImGui/imgui.cpp create mode 100644 ImGui/imgui.h create mode 100644 ImGui/imgui_demo.cpp create mode 100644 ImGui/imgui_draw.cpp create mode 100644 ImGui/imgui_impl_dx11.cpp create mode 100644 ImGui/imgui_impl_dx11.h create mode 100644 ImGui/imgui_impl_sdl2.cpp create mode 100644 ImGui/imgui_impl_sdl2.h create mode 100644 ImGui/imgui_internal.h create mode 100644 ImGui/imgui_tables.cpp create mode 100644 ImGui/imgui_widgets.cpp create mode 100644 ImGui/imstb_rectpack.h create mode 100644 ImGui/imstb_textedit.h create mode 100644 ImGui/imstb_truetype.h create mode 100644 include/SDL/SDL.h create mode 100644 include/SDL/SDL_assert.h create mode 100644 include/SDL/SDL_atomic.h create mode 100644 include/SDL/SDL_audio.h create mode 100644 include/SDL/SDL_bits.h create mode 100644 include/SDL/SDL_blendmode.h create mode 100644 include/SDL/SDL_clipboard.h create mode 100644 include/SDL/SDL_config.h create mode 100644 include/SDL/SDL_config.h.cmake create mode 100644 include/SDL/SDL_config.h.in create mode 100644 include/SDL/SDL_config_android.h create mode 100644 include/SDL/SDL_config_iphoneos.h create mode 100644 include/SDL/SDL_config_macosx.h create mode 100644 include/SDL/SDL_config_macosx.h.orig create mode 100644 include/SDL/SDL_config_minimal.h create mode 100644 include/SDL/SDL_config_pandora.h create mode 100644 include/SDL/SDL_config_psp.h create mode 100644 include/SDL/SDL_config_windows.h create mode 100644 include/SDL/SDL_config_winrt.h create mode 100644 include/SDL/SDL_config_wiz.h create mode 100644 include/SDL/SDL_copying.h create mode 100644 include/SDL/SDL_cpuinfo.h create mode 100644 include/SDL/SDL_egl.h create mode 100644 include/SDL/SDL_endian.h create mode 100644 include/SDL/SDL_error.h create mode 100644 include/SDL/SDL_events.h create mode 100644 include/SDL/SDL_filesystem.h create mode 100644 include/SDL/SDL_gamecontroller.h create mode 100644 include/SDL/SDL_gesture.h create mode 100644 include/SDL/SDL_guid.h create mode 100644 include/SDL/SDL_haptic.h create mode 100644 include/SDL/SDL_hidapi.h create mode 100644 include/SDL/SDL_hints.h create mode 100644 include/SDL/SDL_joystick.h create mode 100644 include/SDL/SDL_keyboard.h create mode 100644 include/SDL/SDL_keycode.h create mode 100644 include/SDL/SDL_loadso.h create mode 100644 include/SDL/SDL_locale.h create mode 100644 include/SDL/SDL_log.h create mode 100644 include/SDL/SDL_main.h create mode 100644 include/SDL/SDL_messagebox.h create mode 100644 include/SDL/SDL_metal.h create mode 100644 include/SDL/SDL_misc.h create mode 100644 include/SDL/SDL_mouse.h create mode 100644 include/SDL/SDL_mutex.h create mode 100644 include/SDL/SDL_name.h create mode 100644 include/SDL/SDL_opengl.h create mode 100644 include/SDL/SDL_opengl_glext.h create mode 100644 include/SDL/SDL_opengles.h create mode 100644 include/SDL/SDL_opengles2.h create mode 100644 include/SDL/SDL_opengles2_gl2.h create mode 100644 include/SDL/SDL_opengles2_gl2ext.h create mode 100644 include/SDL/SDL_opengles2_gl2platform.h create mode 100644 include/SDL/SDL_opengles2_khrplatform.h create mode 100644 include/SDL/SDL_pixels.h create mode 100644 include/SDL/SDL_platform.h create mode 100644 include/SDL/SDL_power.h create mode 100644 include/SDL/SDL_quit.h create mode 100644 include/SDL/SDL_rect.h create mode 100644 include/SDL/SDL_render.h create mode 100644 include/SDL/SDL_revision.h create mode 100644 include/SDL/SDL_rwops.h create mode 100644 include/SDL/SDL_scancode.h create mode 100644 include/SDL/SDL_sensor.h create mode 100644 include/SDL/SDL_shape.h create mode 100644 include/SDL/SDL_stdinc.h create mode 100644 include/SDL/SDL_surface.h create mode 100644 include/SDL/SDL_system.h create mode 100644 include/SDL/SDL_syswm.h create mode 100644 include/SDL/SDL_test.h create mode 100644 include/SDL/SDL_test_assert.h create mode 100644 include/SDL/SDL_test_common.h create mode 100644 include/SDL/SDL_test_compare.h create mode 100644 include/SDL/SDL_test_crc32.h create mode 100644 include/SDL/SDL_test_font.h create mode 100644 include/SDL/SDL_test_fuzzer.h create mode 100644 include/SDL/SDL_test_harness.h create mode 100644 include/SDL/SDL_test_images.h create mode 100644 include/SDL/SDL_test_log.h create mode 100644 include/SDL/SDL_test_md5.h create mode 100644 include/SDL/SDL_test_memory.h create mode 100644 include/SDL/SDL_test_random.h create mode 100644 include/SDL/SDL_thread.h create mode 100644 include/SDL/SDL_timer.h create mode 100644 include/SDL/SDL_touch.h create mode 100644 include/SDL/SDL_types.h create mode 100644 include/SDL/SDL_version.h create mode 100644 include/SDL/SDL_video.h create mode 100644 include/SDL/SDL_vulkan.h create mode 100644 include/SDL/begin_code.h create mode 100644 include/SDL/close_code.h create mode 100644 lib/ImGui.lib create mode 100644 lib/SDL2.lib create mode 100644 lib/libdvdcss.lib create mode 100644 libdvdcss/.gitignore create mode 100644 libdvdcss/.gitlab-ci.yml create mode 100644 libdvdcss/AUTHORS create mode 100644 libdvdcss/COPYING create mode 100644 libdvdcss/INSTALL create mode 100644 libdvdcss/Makefile.am create mode 100644 libdvdcss/NEWS create mode 100644 libdvdcss/README.md create mode 100644 libdvdcss/configure.ac create mode 100644 libdvdcss/doc/doxygen.cfg.in create mode 100644 libdvdcss/libdvdcss.spec.in create mode 100644 libdvdcss/m4/attributes.m4 create mode 100644 libdvdcss/msvc/config.h create mode 100644 libdvdcss/msvc/libdvdcss.vcxproj create mode 100644 libdvdcss/msvc/libdvdcss.vcxproj.user create mode 100644 libdvdcss/src/common.h create mode 100644 libdvdcss/src/css.c create mode 100644 libdvdcss/src/css.h create mode 100644 libdvdcss/src/csstables.h create mode 100644 libdvdcss/src/device.c create mode 100644 libdvdcss/src/device.h create mode 100644 libdvdcss/src/dvdcss/dvdcss.h create mode 100644 libdvdcss/src/dvdcss/version.h create mode 100644 libdvdcss/src/dvdcss/version.h.in create mode 100644 libdvdcss/src/error.c create mode 100644 libdvdcss/src/ioctl.c create mode 100644 libdvdcss/src/ioctl.h create mode 100644 libdvdcss/src/libdvdcss.c create mode 100644 libdvdcss/src/libdvdcss.h create mode 100644 libdvdcss/src/libdvdcss.pc.in create mode 100644 libdvdcss/test/csstest.c create mode 100644 libdvdcss/test/dvd_region.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7c1d329 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +.vs/* +Debug/* +Release/* + +libdvdcss/msvc/Debug/* +libdvdcss/msvc/Release/* +libdvdcss/msvc/.vs/* + +ImGui/Release/* +ImGui/Debug/* + +DumpDVD/Debug/* +DumpDVD/Release/* + +*.pdb +*.iso +*.dsp +*.dsw diff --git a/DumpDVD.sln b/DumpDVD.sln new file mode 100644 index 0000000..0eaebce --- /dev/null +++ b/DumpDVD.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33205.214 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DumpDVD", "DumpDVD\DumpDVD.vcxproj", "{A9A5F041-541F-47EA-B583-DE84B59D9B62}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libdvdcss", "libdvdcss\msvc\libdvdcss.vcxproj", "{50F2BF62-8520-4B37-97DD-578EA282EC04}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImGui", "ImGui\ImGui.vcxproj", "{B2BCCCDA-BDB0-4FBE-84A3-EA1E8429F732}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A9A5F041-541F-47EA-B583-DE84B59D9B62}.Debug|x86.ActiveCfg = Debug|Win32 + {A9A5F041-541F-47EA-B583-DE84B59D9B62}.Debug|x86.Build.0 = Debug|Win32 + {A9A5F041-541F-47EA-B583-DE84B59D9B62}.Release|x86.ActiveCfg = Release|Win32 + {A9A5F041-541F-47EA-B583-DE84B59D9B62}.Release|x86.Build.0 = Release|Win32 + {50F2BF62-8520-4B37-97DD-578EA282EC04}.Debug|x86.ActiveCfg = Release|Win32 + {50F2BF62-8520-4B37-97DD-578EA282EC04}.Debug|x86.Build.0 = Release|Win32 + {50F2BF62-8520-4B37-97DD-578EA282EC04}.Release|x86.ActiveCfg = Release|Win32 + {50F2BF62-8520-4B37-97DD-578EA282EC04}.Release|x86.Build.0 = Release|Win32 + {B2BCCCDA-BDB0-4FBE-84A3-EA1E8429F732}.Debug|x86.ActiveCfg = Release|Win32 + {B2BCCCDA-BDB0-4FBE-84A3-EA1E8429F732}.Debug|x86.Build.0 = Release|Win32 + {B2BCCCDA-BDB0-4FBE-84A3-EA1E8429F732}.Release|x86.ActiveCfg = Release|Win32 + {B2BCCCDA-BDB0-4FBE-84A3-EA1E8429F732}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {F8DE3912-9382-47C7-80C3-77D5CC7A09DC} + EndGlobalSection +EndGlobal diff --git a/DumpDVD/DumpDVD.cpp b/DumpDVD/DumpDVD.cpp new file mode 100644 index 0000000..ead6496 --- /dev/null +++ b/DumpDVD/DumpDVD.cpp @@ -0,0 +1,70 @@ +#include +#include "Gui\MainWindow.hpp" + +#ifdef _WIN32 +#include +#endif +//#include "Extra.h" +//#include + +//const int readAtOnce = 0x1000; +//static uint8_t buffer[DVDCSS_BLOCK_SIZE * readAtOnce]; + +int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow) +{ +#ifdef _WIN32 + AllocConsole(); +#endif + + Li::Gui::MainWindow* mainWindow = new Li::Gui::MainWindow(); + delete mainWindow; + + /*FILE* fd; + fopen_s(&fd, "out.iso", "wb"); + if (fd == NULL) return 1; + + dvdcss_t drive = dvdcss_open(argv[1]); + HANDLE handle = (HANDLE)dvdcss_get_raw_fd(drive); + + uint64_t totalSectors = getTotalSectors(handle); + allowReadPastDisc(handle); + setDriveSpeed(handle, 0xFFFF, 0xFFFF); + dvdcss_seek(drive, 0, DVDCSS_SEEK_KEY); + + time_t stime; + time(&stime); + + uint64_t currentSector = 0; + int sectorsRead = 0; + do { + int sectorsToRead = readAtOnce; + if ( (currentSector + sectorsToRead) > totalSectors) { + sectorsToRead = totalSectors - currentSector; + } + + sectorsRead = dvdcss_read(drive, buffer, sectorsToRead, DVDCSS_READ_DECRYPT); + + if (sectorsRead <= 0) { + printf("\nthere was an error; SectorsRead = %i\nLastError = %i\n", sectorsRead, GetLastError()); + break; + } + + fwrite(buffer, DVDCSS_BLOCK_SIZE * sectorsRead, 1, fd); + + currentSector += sectorsRead; + + float progress = (((float)currentSector / (float)totalSectors) * 100.0); + printf("ripping dvd: %llu/%llu %f%%\r", currentSector, totalSectors, progress); + } while (currentSector < totalSectors); + + time_t etime; + time(&etime); + + time_t difference = (etime - stime); + + printf("\nstart time: %llu \nend time: %llu \n\ntotal time taken: %llus\n", stime, etime, difference); + + fclose(fd); + + return 0;*/ +} \ No newline at end of file diff --git a/DumpDVD/DumpDVD.vcxproj b/DumpDVD/DumpDVD.vcxproj new file mode 100644 index 0000000..34ee134 --- /dev/null +++ b/DumpDVD/DumpDVD.vcxproj @@ -0,0 +1,163 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + 16.0 + Win32Proj + {a9a5f041-541f-47ea-b583-de84b59d9b62} + DumpDVD + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)include\SDL;$(SolutionDir)ImGui;$(SolutionDir)libdvdcss\src\dvdcss;%(AdditionalIncludeDirectories) + stdcpp20 + stdc17 + + + Windows + true + $(SolutionDir)\lib;%(AdditionalLibraryDirectories) + d3d11.lib;winmm.lib;version.lib;Imm32.lib;Setupapi.lib;SDL2.lib;ImGui.lib;libdvdcss.lib;%(AdditionalDependencies) + + + + + + + Level3 + true + true + false + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)include\SDL;$(SolutionDir)ImGui;$(SolutionDir)libdvdcss\src\dvdcss;%(AdditionalIncludeDirectories) + MultiThreaded + stdcpp20 + stdc17 + + + Windows + true + true + false + $(SolutionDir)\lib;%(AdditionalLibraryDirectories) + d3d11.lib;winmm.lib;version.lib;Imm32.lib;Setupapi.lib;SDL2.lib;ImGui.lib;libdvdcss.lib;%(AdditionalDependencies) + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + stdc17 + + + Windows + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp20 + stdc17 + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/DumpDVD/DumpDVD.vcxproj.filters b/DumpDVD/DumpDVD.vcxproj.filters new file mode 100644 index 0000000..9e69e3d --- /dev/null +++ b/DumpDVD/DumpDVD.vcxproj.filters @@ -0,0 +1,51 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + \ No newline at end of file diff --git a/DumpDVD/DumpDVD.vcxproj.user b/DumpDVD/DumpDVD.vcxproj.user new file mode 100644 index 0000000..cb39547 --- /dev/null +++ b/DumpDVD/DumpDVD.vcxproj.user @@ -0,0 +1,14 @@ + + + + D: + WindowsLocalDebugger + + + D: + WindowsLocalDebugger + + + true + + \ No newline at end of file diff --git a/DumpDVD/Gui/D3D.cpp b/DumpDVD/Gui/D3D.cpp new file mode 100644 index 0000000..028e386 --- /dev/null +++ b/DumpDVD/Gui/D3D.cpp @@ -0,0 +1,106 @@ +#include "D3D.hpp" +#include +#include +#include +#include + +namespace Li::Gui { + void D3D::createRenderTarget() { + ID3D11Texture2D* backBuffer; + this->swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); + this->d3dDevice->CreateRenderTargetView(backBuffer, NULL, &this->mainRenderTargetView); + backBuffer->Release(); + } + + bool D3D::createDeviceD3D() { + // Setup swap chain + DXGI_SWAP_CHAIN_DESC sd; + memset(&sd, 0, sizeof(sd)); + sd.BufferCount = 2; + sd.BufferDesc.Width = 0; + sd.BufferDesc.Height = 0; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; + sd.BufferDesc.RefreshRate.Denominator = 1; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = this->hwnd; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + + UINT createDeviceFlags = 0; + //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + D3D_FEATURE_LEVEL featureLevel; + const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; + if (D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &this->swapChain, &this->d3dDevice, &featureLevel, &this->d3dDeviceContext) != S_OK) + return false; + + + return true; + } + + void D3D::cleanupDeviceD3D() { + if (this->swapChain) { + this->swapChain->Release(); + this->swapChain = NULL; + } + + if (this->d3dDeviceContext) { + this->d3dDeviceContext->Release(); + this->d3dDeviceContext = NULL; + } + + if (this->d3dDevice) { + this->d3dDevice->Release(); + this->d3dDevice = NULL; + } + } + + void D3D::cleanupRenderTarget() { + if (this->mainRenderTargetView) { + this->mainRenderTargetView->Release(); + this->mainRenderTargetView = NULL; + } + } + + ID3D11Device* D3D::D3dDevice() { + return this->d3dDevice; + } + ID3D11DeviceContext* D3D::D3dDeviceContext() { + return this->d3dDeviceContext; + } + + void D3D::InitImgui() { + ImGui_ImplDX11_Init(this->d3dDevice, this->d3dDeviceContext); + } + void D3D::ImGuiNewFrame() { + ImGui_ImplDX11_NewFrame(); + } + + void D3D::Resize() { + this->cleanupRenderTarget(); + this->swapChain->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0); + this->createRenderTarget(); + } + + void D3D::Render(ImVec4 clearColor) { + const float clearColorWithAlpha[4] = { clearColor.x * clearColor.w, clearColor.y * clearColor.w, clearColor.z * clearColor.w, clearColor.w }; + this->d3dDeviceContext->OMSetRenderTargets(1, &this->mainRenderTargetView, NULL); + this->d3dDeviceContext->ClearRenderTargetView(this->mainRenderTargetView, clearColorWithAlpha); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + this->swapChain->Present(1, 0); + } + + D3D::D3D(HWND hwnd) { + this->hwnd = hwnd; + this->createDeviceD3D(); + this->createRenderTarget(); + }; + + D3D::~D3D() { + this->cleanupRenderTarget(); + this->cleanupDeviceD3D(); + } +} \ No newline at end of file diff --git a/DumpDVD/Gui/D3D.hpp b/DumpDVD/Gui/D3D.hpp new file mode 100644 index 0000000..9aefae4 --- /dev/null +++ b/DumpDVD/Gui/D3D.hpp @@ -0,0 +1,41 @@ +#ifndef _LI_D3D_H +#define _LI_D3D_H 1 + +#ifndef _WIN32 +#error d3d not availible except on windows +#endif +#include "Renderer.hpp" + +#include +#include + +#include +#include + +namespace Li::Gui { + class D3D : public Renderer { + private: + HWND hwnd; + ID3D11Device* d3dDevice; + ID3D11DeviceContext* d3dDeviceContext; + IDXGISwapChain* swapChain; + ID3D11RenderTargetView* mainRenderTargetView; + + bool createDeviceD3D(); + void cleanupDeviceD3D(); + void createRenderTarget(); + void cleanupRenderTarget(); + public: + ID3D11Device* D3dDevice(); + ID3D11DeviceContext* D3dDeviceContext(); + + void Resize(); + void InitImgui(); + void ImGuiNewFrame(); + void Render(ImVec4 clearColor); + + D3D(HWND hwnd); + ~D3D(); + }; +} +#endif \ No newline at end of file diff --git a/DumpDVD/Gui/MainWindow.cpp b/DumpDVD/Gui/MainWindow.cpp new file mode 100644 index 0000000..bb97e4e --- /dev/null +++ b/DumpDVD/Gui/MainWindow.cpp @@ -0,0 +1,79 @@ +#include "MainWindow.hpp" +#ifdef _WIN32 +#include "D3D.hpp" +#include +#endif + +#include +#include +#include +#include +#include + +#include "SDL.hpp" +#include "../Scsi/CdRom.hpp" + +namespace Li::Gui { + + std::string getDrivesList() { + std::vector* drives = Li::Scsi::CdRom::ListOpticalDrives(); + + std::string drivesComboBox = ""; + for (std::string drive : *drives) { + drivesComboBox += drive + '\0'; + } + + return drivesComboBox; + } + + MainWindow::MainWindow() { + this->sdl = new SDL("DumpDVD", 800, 400); + bool showDemoWindow = true; + int selectedDrive = 0; + ImGuiWindowFlags windowFlags = 0; + windowFlags |= ImGuiWindowFlags_NoCollapse; + int selectedDriveSpeed = 22; + + std::string drives = getDrivesList(); + + while (!this->sdl->IsExiting()) { + this->sdl->PollEvent(); + this->sdl->NewFrame(); + + const ImGuiViewport* mainViewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(ImVec2(mainViewport->WorkPos.x, mainViewport->WorkPos.y), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); + + ImGui::Begin("DVD Dumper", NULL, windowFlags); + ImGui::Text("Select Drive:"); + ImGui::SameLine(); + ImGui::Combo("", &selectedDrive, drives.c_str()); + ImGui::SameLine(); + if (ImGui::Button("Refresh", ImVec2(70, 20))) { + drives = getDrivesList(); + } + + const int numDrvSpeeds = 23; + const char* driveSepeds[numDrvSpeeds] = { "1x", "2x", "2.4x", "3x", "4x", "5x", + "6x", "8x", "10x", "12x", "14x", "16x", + "18x", "20x", "22x", "24x", "32x", "40x", + "44x", "48x", "52x", "56x", "MAX"}; + const char* driveSpeedName = (selectedDriveSpeed >= 0 && selectedDriveSpeed < numDrvSpeeds) ? driveSepeds[selectedDriveSpeed] : "Unknown"; + ImGui::Text("Read Speed:"); + ImGui::SameLine(); + ImGui::SliderInt("", &selectedDriveSpeed, 0, numDrvSpeeds - 1, driveSpeedName); + + ImGui::End(); + if (showDemoWindow) + ImGui::ShowDemoWindow(&showDemoWindow); + + this->sdl->Render(); + } + + } + + MainWindow::~MainWindow() { + + } + +} \ No newline at end of file diff --git a/DumpDVD/Gui/MainWindow.hpp b/DumpDVD/Gui/MainWindow.hpp new file mode 100644 index 0000000..1ab6b2b --- /dev/null +++ b/DumpDVD/Gui/MainWindow.hpp @@ -0,0 +1,15 @@ +#ifndef _LI_MAINWINDOW_H +#define _LI_MAINWINDOW_H 1 +#include +#include "SDL.hpp" +namespace Li::Gui { + class MainWindow { + private: + SDL* sdl; + public: + MainWindow(); + ~MainWindow(); + }; +} + +#endif \ No newline at end of file diff --git a/DumpDVD/Gui/Renderer.hpp b/DumpDVD/Gui/Renderer.hpp new file mode 100644 index 0000000..0a4dac3 --- /dev/null +++ b/DumpDVD/Gui/Renderer.hpp @@ -0,0 +1,12 @@ +#ifndef _LI_RENDERER_H +#define _LI_RENDERER_H 1 +#include +namespace Li::Gui { + class Renderer { + public: + virtual void InitImgui() {}; + virtual void ImGuiNewFrame() {}; + virtual void Render(ImVec4 clearColor) {}; + }; +} +#endif \ No newline at end of file diff --git a/DumpDVD/Gui/SDL.cpp b/DumpDVD/Gui/SDL.cpp new file mode 100644 index 0000000..ad2cfac --- /dev/null +++ b/DumpDVD/Gui/SDL.cpp @@ -0,0 +1,93 @@ +#include "SDL.hpp" +#ifdef _WIN32 +#include "D3D.hpp" +#include +#include +#endif +#include +#include + +#include +#include + +namespace Li::Gui { + SDL::SDL(std::string windowTitle, int windowWidth, int windowHeight) { + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + std::cout << "Error: " << SDL_GetError() << std::endl; + return; + } + +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + SDL_WindowFlags windowFlags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + this->window = SDL_CreateWindow(windowTitle.c_str(), SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, windowWidth, windowHeight, windowFlags); + SDL_VERSION(&this->wmInfo.version); + SDL_GetWindowWMInfo(this->window, &this->wmInfo); + +#ifdef _WIN32 + HWND hwnd = (HWND)this->wmInfo.info.win.window; + this->renderer = new D3D(hwnd); +#endif + + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + ImGui::StyleColorsDark(); + +#ifdef _WIN32 + ImGui_ImplSDL2_InitForD3D(this->window); + this->renderer->InitImgui(); +#endif + isExiting = false; + } + bool SDL::IsExiting() { + return this->isExiting; + } + void SDL::PollEvent() { + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + isExiting = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + isExiting = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window)) + { + // Release all outstanding references to the swap chain's buffers before resizing. +#ifdef _WIN32 + D3D* d3d = (D3D*)this->renderer; + d3d->Resize(); +#endif + } + } + } + void SDL::NewFrame() { + this->renderer->ImGuiNewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + } + + + void SDL::Render() { + ImGui::Render(); + ImVec4 clearColor = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + this->renderer->Render(clearColor); + } + + SDL::~SDL() { +#ifdef _WIN32 + ImGui_ImplDX11_Shutdown(); +#endif + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + delete renderer; + SDL_DestroyWindow(this->window); + SDL_Quit(); + } +} \ No newline at end of file diff --git a/DumpDVD/Gui/SDL.hpp b/DumpDVD/Gui/SDL.hpp new file mode 100644 index 0000000..2a3bc13 --- /dev/null +++ b/DumpDVD/Gui/SDL.hpp @@ -0,0 +1,25 @@ +#ifndef _LI_SDL_H +#define _LI_SDL_H 1 +#include "Renderer.hpp" +#include +#include +#include + +namespace Li::Gui { + class SDL { + private: + SDL_WindowFlags windowFlags; + SDL_SysWMinfo wmInfo; + SDL_Window* window; + Renderer* renderer; + bool isExiting; + public: + bool IsExiting(); + void NewFrame(); + void PollEvent(); + void Render(); + SDL(std::string windowTitle, int windowWidth, int windowHeight); + ~SDL(); + }; +} +#endif \ No newline at end of file diff --git a/DumpDVD/Scsi/CdRom.cpp b/DumpDVD/Scsi/CdRom.cpp new file mode 100644 index 0000000..1163eb2 --- /dev/null +++ b/DumpDVD/Scsi/CdRom.cpp @@ -0,0 +1,101 @@ +#include "CdRom.hpp" + +#ifdef _WIN32 + +#define _NTSCSI_USER_MODE_ 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#endif + +#include +#include +#include + +namespace Li::Scsi { + CdRom::CdRom(std::string drive) { + this->dvdCssHandle = dvdcss_open(drive.c_str()); + this->osFileHandle = dvdcss_get_raw_fd(this->dvdCssHandle); + } + + CdRom::~CdRom() { + dvdcss_close(this->dvdCssHandle); + this->dvdCssHandle = NULL; + this->osFileHandle = NULL; + } + + size_t CdRom::GetTotalSectors() { +#ifdef _WIN32 + DISK_GEOMETRY_EX geo; + memset(&geo, 0x00, sizeof(DISK_GEOMETRY_EX)); + + DWORD unused; + BOOL success = DeviceIoControl((HANDLE)this->osFileHandle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, nullptr, 0, &geo, sizeof(DISK_GEOMETRY_EX), &unused, nullptr); + if (!success) { + std::cerr << "Error getting geometry: " << std::to_string(GetLastError()) << std::endl; + } + return (size_t)(geo.DiskSize.QuadPart / 2048); +#endif + } + bool CdRom::AllowReadingPastDisc() { +#ifdef _WIN32 + // On windows, you cannot read anything outside the last session of the disc, unless you enable this + // this means you cannot read the Lead-Out, *or* double densitity DVDs + DWORD unused; + BOOL success = DeviceIoControl((HANDLE)this->osFileHandle, FSCTL_ALLOW_EXTENDED_DASD_IO, nullptr, 0, nullptr, 0, &unused, nullptr); + if (!success) { + std::cerr << "Error enabling DASD I/O: " << std::to_string(GetLastError()) << std::endl; + } + return success; +#endif + } + bool CdRom::SetDriveSpeed(short readSpeed, short writeSpeed) + { +#ifdef _WIN32 + DWORD unused; + CDROM_SET_SPEED cdromSetSpeed; + memset(&cdromSetSpeed, 0x00, sizeof(CDROM_SET_SPEED)); + + cdromSetSpeed.RequestType = CdromSetSpeed; + cdromSetSpeed.ReadSpeed = readSpeed; + cdromSetSpeed.WriteSpeed = writeSpeed; + cdromSetSpeed.RotationControl = CdromDefaultRotation; + + BOOL success = DeviceIoControl((HANDLE)this->osFileHandle, IOCTL_CDROM_SET_SPEED, &cdromSetSpeed, sizeof(CDROM_SET_SPEED), nullptr, 0, &unused, nullptr); + if (!success) { + std::cerr << "Error setting speed: " << std::to_string(GetLastError()) << std::endl; + } + return success; +#endif + } + + std::vector* CdRom::ListOpticalDrives() { + std::vector* drives = new std::vector(); +#ifdef _WIN32 + const size_t drivesListSz = 0x1000; + WCHAR* drivesList = new WCHAR[drivesListSz]; + GetLogicalDriveStrings(drivesListSz, drivesList); + + WCHAR* curDrive = drivesList; + while (*curDrive != '\0') { + + UINT driveType = GetDriveType(curDrive); + if (driveType == DRIVE_CDROM) { + std::wstring wstr = std::wstring(curDrive); + std::string cdromDrive = std::string(wstr.begin(), wstr.end()); + cdromDrive = cdromDrive.substr(0, cdromDrive.size() - 1); + drives->push_back(cdromDrive); + } + curDrive += lstrlen(curDrive) + 1; + } +#endif + return drives; + } +} \ No newline at end of file diff --git a/DumpDVD/Scsi/CdRom.hpp b/DumpDVD/Scsi/CdRom.hpp new file mode 100644 index 0000000..bb2c729 --- /dev/null +++ b/DumpDVD/Scsi/CdRom.hpp @@ -0,0 +1,23 @@ +#ifndef _LI_CDROM_H +#define _LI_CDROM_H 1 +#include +#include +#include +#include + +namespace Li::Scsi { + class CdRom { + private: + dvdcss_t dvdCssHandle; + int osFileHandle; + public: + CdRom(std::string drive); + ~CdRom(); + + size_t GetTotalSectors(); + bool SetDriveSpeed(short readSpeed, short writeSpeed); + bool AllowReadingPastDisc(); + static std::vector* ListOpticalDrives(); + }; +} +#endif \ No newline at end of file diff --git a/DumpDVD/imgui.ini b/DumpDVD/imgui.ini new file mode 100644 index 0000000..d995f46 --- /dev/null +++ b/DumpDVD/imgui.ini @@ -0,0 +1,45 @@ +[Window][Debug##Default] +Pos=122,92 +Size=400,400 +Collapsed=0 + +[Window][Dear ImGui Demo] +Pos=476,67 +Size=550,679 +Collapsed=0 + +[Window][Hello, world!] +Pos=60,60 +Size=339,180 +Collapsed=0 + +[Window][DVD Dumper] +Pos=71,27 +Size=1333,735 +Collapsed=0 + +[Window][Example: Console] +Pos=345,114 +Size=520,600 +Collapsed=0 + +[Window][Example: Custom rendering] +Pos=60,60 +Size=485,414 +Collapsed=0 + +[Window][Same title as another window##2] +Pos=491,274 +Size=451,61 +Collapsed=0 + +[Window][###AnimatedTitle] +Pos=489,380 +Size=247,48 +Collapsed=0 + +[Window][Same title as another window##1] +Pos=473,190 +Size=451,61 +Collapsed=0 + diff --git a/ImGui/ImGui.vcxproj b/ImGui/ImGui.vcxproj new file mode 100644 index 0000000..7f29b1f --- /dev/null +++ b/ImGui/ImGui.vcxproj @@ -0,0 +1,173 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + + + + + + + + 16.0 + Win32Proj + {b2bcccda-bdb0-4fbe-84a3-ea1e8429f732} + ImGui + 10.0 + + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + false + v143 + true + Unicode + + + StaticLibrary + true + v143 + Unicode + + + StaticLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + $(SolutionDir)lib\ + + + $(SolutionDir)lib\ + + + + Level3 + true + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + NotUsing + pch.h + MultiThreadedDebug + $(SolutionDir)include\SDL + + + + + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + NotUsing + pch.h + MultiThreaded + $(SolutionDir)include\SDL + + + + + true + true + true + + + + + Level3 + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + Use + pch.h + + + + + true + + + + + Level3 + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + Use + pch.h + + + + + true + true + true + + + + + + \ No newline at end of file diff --git a/ImGui/ImGui.vcxproj.filters b/ImGui/ImGui.vcxproj.filters new file mode 100644 index 0000000..dd1ef59 --- /dev/null +++ b/ImGui/ImGui.vcxproj.filters @@ -0,0 +1,66 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/ImGui/ImGui.vcxproj.user b/ImGui/ImGui.vcxproj.user new file mode 100644 index 0000000..5df420f --- /dev/null +++ b/ImGui/ImGui.vcxproj.user @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/ImGui/backends/imgui_impl_allegro5.cpp b/ImGui/backends/imgui_impl_allegro5.cpp new file mode 100644 index 0000000..b7e7768 --- /dev/null +++ b/ImGui/backends/imgui_impl_allegro5.cpp @@ -0,0 +1,604 @@ +// dear imgui: Renderer + Platform Backend for Allegro 5 +// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy ALLEGRO_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Clipboard support (from Allegro 5.1.12) +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// Issues: +// [ ] Renderer: The renderer is suboptimal as we need to convert vertices manually. +// [ ] Platform: Missing gamepad support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-11-30: Renderer: Restoring using al_draw_indexed_prim() when Allegro version is >= 5.2.5. +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-17: Inputs: always calling io.AddKeyModsEvent() next and before key event (not in NewFrame) to fix input queue with very low framerates. +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-12-08: Renderer: Fixed mishandling of the the ImDrawCmd::IdxOffset field! This is an old bug but it never had an effect until some internal rendering changes in 1.86. +// 2021-08-17: Calling io.AddFocusEvent() on ALLEGRO_EVENT_DISPLAY_SWITCH_OUT/ALLEGRO_EVENT_DISPLAY_SWITCH_IN events. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: Renderer: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: Change blending equation to preserve alpha in output buffer. +// 2020-08-10: Inputs: Fixed horizontal mouse wheel direction. +// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. +// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter. +// 2019-05-11: Inputs: Don't filter character value from ALLEGRO_EVENT_KEY_CHAR before calling AddInputCharacter(). +// 2019-04-30: Renderer: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2018-11-30: Platform: Added touchscreen support. +// 2018-11-30: Misc: Setting up io.BackendPlatformName/io.BackendRendererName so they can be displayed in the About Window. +// 2018-06-13: Platform: Added clipboard support (from Allegro 5.1.12). +// 2018-06-13: Renderer: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-06-13: Renderer: Stopped using al_draw_indexed_prim() as it is buggy in Allegro's DX9 backend. +// 2018-06-13: Renderer: Backup/restore transform and clipping rectangle. +// 2018-06-11: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag. +// 2018-04-18: Misc: Renamed file from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp. +// 2018-04-18: Misc: Added support for 32-bit vertex indices to avoid conversion at runtime. Added imconfig_allegro5.h to enforce 32-bit indices when included from imgui.h. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplAllegro5_RenderDrawData() in the .h file so you can call it yourself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. + +#include // uint64_t +#include // memcpy +#include "imgui.h" +#include "imgui_impl_allegro5.h" + +// Allegro +#include +#include +#ifdef _WIN32 +#include +#endif +#define ALLEGRO_HAS_CLIPBOARD (ALLEGRO_VERSION_INT >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12 +#define ALLEGRO_HAS_DRAW_INDEXED_PRIM (ALLEGRO_VERSION_INT >= ((5 << 24) | (2 << 16) | ( 5 << 8))) // DX9 implementation of al_draw_indexed_prim() got fixed in Allegro 5.2.5 + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#endif + +struct ImDrawVertAllegro +{ + ImVec2 pos; + ImVec2 uv; + ALLEGRO_COLOR col; +}; + +// FIXME-OPT: Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 float as well.. +// FIXME-OPT: Consider inlining al_map_rgba()? +// see https://github.com/liballeg/allegro5/blob/master/src/pixels.c#L554 +// and https://github.com/liballeg/allegro5/blob/master/include/allegro5/internal/aintern_pixels.h +#define DRAW_VERT_IMGUI_TO_ALLEGRO(DST, SRC) { (DST)->pos = (SRC)->pos; (DST)->uv = (SRC)->uv; unsigned char* c = (unsigned char*)&(SRC)->col; (DST)->col = al_map_rgba(c[0], c[1], c[2], c[3]); } + +// Allegro Data +struct ImGui_ImplAllegro5_Data +{ + ALLEGRO_DISPLAY* Display; + ALLEGRO_BITMAP* Texture; + double Time; + ALLEGRO_MOUSE_CURSOR* MouseCursorInvisible; + ALLEGRO_VERTEX_DECL* VertexDecl; + char* ClipboardTextData; + + ImVector BufVertices; + ImVector BufIndices; + + ImGui_ImplAllegro5_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +static ImGui_ImplAllegro5_Data* ImGui_ImplAllegro5_GetBackendData() { return ImGui::GetCurrentContext() ? (ImGui_ImplAllegro5_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; } + +static void ImGui_ImplAllegro5_SetupRenderState(ImDrawData* draw_data) +{ + // Setup blending + al_set_separate_blender(ALLEGRO_ADD, ALLEGRO_ALPHA, ALLEGRO_INVERSE_ALPHA, ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); + + // Setup orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). + { + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + ALLEGRO_TRANSFORM transform; + al_identity_transform(&transform); + al_use_transform(&transform); + al_orthographic_transform(&transform, L, T, 1.0f, R, B, -1.0f); + al_use_projection_transform(&transform); + } +} + +// Render function. +void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + // Backup Allegro state that will be modified + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + ALLEGRO_TRANSFORM last_transform = *al_get_current_transform(); + ALLEGRO_TRANSFORM last_projection_transform = *al_get_current_projection_transform(); + int last_clip_x, last_clip_y, last_clip_w, last_clip_h; + al_get_clipping_rectangle(&last_clip_x, &last_clip_y, &last_clip_w, &last_clip_h); + int last_blender_op, last_blender_src, last_blender_dst; + al_get_blender(&last_blender_op, &last_blender_src, &last_blender_dst); + + // Setup desired render state + ImGui_ImplAllegro5_SetupRenderState(draw_data); + + // Render command lists + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + + ImVector& vertices = bd->BufVertices; +#if ALLEGRO_HAS_DRAW_INDEXED_PRIM + vertices.resize(cmd_list->VtxBuffer.Size); + for (int i = 0; i < cmd_list->VtxBuffer.Size; i++) + { + const ImDrawVert* src_v = &cmd_list->VtxBuffer[i]; + ImDrawVertAllegro* dst_v = &vertices[i]; + DRAW_VERT_IMGUI_TO_ALLEGRO(dst_v, src_v); + } + const int* indices = nullptr; + if (sizeof(ImDrawIdx) == 2) + { + // FIXME-OPT: Allegro doesn't support 16-bit indices. + // You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices. + // Otherwise, we convert them from 16-bit to 32-bit at runtime here, which works perfectly but is a little wasteful. + bd->BufIndices.resize(cmd_list->IdxBuffer.Size); + for (int i = 0; i < cmd_list->IdxBuffer.Size; ++i) + bd->BufIndices[i] = (int)cmd_list->IdxBuffer.Data[i]; + indices = bd->BufIndices.Data; + } + else if (sizeof(ImDrawIdx) == 4) + { + indices = (const int*)cmd_list->IdxBuffer.Data; + } +#else + // Allegro's implementation of al_draw_indexed_prim() for DX9 was broken until 5.2.5. Unindex buffers ourselves while converting vertex format. + vertices.resize(cmd_list->IdxBuffer.Size); + for (int i = 0; i < cmd_list->IdxBuffer.Size; i++) + { + const ImDrawVert* src_v = &cmd_list->VtxBuffer[cmd_list->IdxBuffer[i]]; + ImDrawVertAllegro* dst_v = &vertices[i]; + DRAW_VERT_IMGUI_TO_ALLEGRO(dst_v, src_v); + } +#endif + + // Render command lists + ImVec2 clip_off = draw_data->DisplayPos; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplAllegro5_SetupRenderState(draw_data); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle, Draw + ALLEGRO_BITMAP* texture = (ALLEGRO_BITMAP*)pcmd->GetTexID(); + al_set_clipping_rectangle(clip_min.x, clip_min.y, clip_max.x - clip_min.x, clip_max.y - clip_min.y); +#if ALLEGRO_HAS_DRAW_INDEXED_PRIM + al_draw_indexed_prim(&vertices[0], bd->VertexDecl, texture, &indices[pcmd->IdxOffset], pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST); +#else + al_draw_prim(&vertices[0], bd->VertexDecl, texture, pcmd->IdxOffset, pcmd->IdxOffset + pcmd->ElemCount, ALLEGRO_PRIM_TRIANGLE_LIST); +#endif + } + } + } + + // Restore modified Allegro state + al_set_blender(last_blender_op, last_blender_src, last_blender_dst); + al_set_clipping_rectangle(last_clip_x, last_clip_y, last_clip_w, last_clip_h); + al_use_transform(&last_transform); + al_use_projection_transform(&last_projection_transform); +} + +bool ImGui_ImplAllegro5_CreateDeviceObjects() +{ + // Build texture atlas + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // Create texture + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + int flags = al_get_new_bitmap_flags(); + int fmt = al_get_new_bitmap_format(); + al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP | ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); + al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ABGR_8888_LE); + ALLEGRO_BITMAP* img = al_create_bitmap(width, height); + al_set_new_bitmap_flags(flags); + al_set_new_bitmap_format(fmt); + if (!img) + return false; + + ALLEGRO_LOCKED_REGION* locked_img = al_lock_bitmap(img, al_get_bitmap_format(img), ALLEGRO_LOCK_WRITEONLY); + if (!locked_img) + { + al_destroy_bitmap(img); + return false; + } + memcpy(locked_img->data, pixels, sizeof(int) * width * height); + al_unlock_bitmap(img); + + // Convert software texture to hardware texture. + ALLEGRO_BITMAP* cloned_img = al_clone_bitmap(img); + al_destroy_bitmap(img); + if (!cloned_img) + return false; + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)(intptr_t)cloned_img); + bd->Texture = cloned_img; + + // Create an invisible mouse cursor + // Because al_hide_mouse_cursor() seems to mess up with the actual inputs.. + ALLEGRO_BITMAP* mouse_cursor = al_create_bitmap(8, 8); + bd->MouseCursorInvisible = al_create_mouse_cursor(mouse_cursor, 0, 0); + al_destroy_bitmap(mouse_cursor); + + return true; +} + +void ImGui_ImplAllegro5_InvalidateDeviceObjects() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + if (bd->Texture) + { + io.Fonts->SetTexID(0); + al_destroy_bitmap(bd->Texture); + bd->Texture = nullptr; + } + if (bd->MouseCursorInvisible) + { + al_destroy_mouse_cursor(bd->MouseCursorInvisible); + bd->MouseCursorInvisible = nullptr; + } +} + +#if ALLEGRO_HAS_CLIPBOARD +static const char* ImGui_ImplAllegro5_GetClipboardText(void*) +{ + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + if (bd->ClipboardTextData) + al_free(bd->ClipboardTextData); + bd->ClipboardTextData = al_get_clipboard_text(bd->Display); + return bd->ClipboardTextData; +} + +static void ImGui_ImplAllegro5_SetClipboardText(void*, const char* text) +{ + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + al_set_clipboard_text(bd->Display, text); +} +#endif + +static ImGuiKey ImGui_ImplAllegro5_KeyCodeToImGuiKey(int key_code) +{ + switch (key_code) + { + case ALLEGRO_KEY_TAB: return ImGuiKey_Tab; + case ALLEGRO_KEY_LEFT: return ImGuiKey_LeftArrow; + case ALLEGRO_KEY_RIGHT: return ImGuiKey_RightArrow; + case ALLEGRO_KEY_UP: return ImGuiKey_UpArrow; + case ALLEGRO_KEY_DOWN: return ImGuiKey_DownArrow; + case ALLEGRO_KEY_PGUP: return ImGuiKey_PageUp; + case ALLEGRO_KEY_PGDN: return ImGuiKey_PageDown; + case ALLEGRO_KEY_HOME: return ImGuiKey_Home; + case ALLEGRO_KEY_END: return ImGuiKey_End; + case ALLEGRO_KEY_INSERT: return ImGuiKey_Insert; + case ALLEGRO_KEY_DELETE: return ImGuiKey_Delete; + case ALLEGRO_KEY_BACKSPACE: return ImGuiKey_Backspace; + case ALLEGRO_KEY_SPACE: return ImGuiKey_Space; + case ALLEGRO_KEY_ENTER: return ImGuiKey_Enter; + case ALLEGRO_KEY_ESCAPE: return ImGuiKey_Escape; + case ALLEGRO_KEY_QUOTE: return ImGuiKey_Apostrophe; + case ALLEGRO_KEY_COMMA: return ImGuiKey_Comma; + case ALLEGRO_KEY_MINUS: return ImGuiKey_Minus; + case ALLEGRO_KEY_FULLSTOP: return ImGuiKey_Period; + case ALLEGRO_KEY_SLASH: return ImGuiKey_Slash; + case ALLEGRO_KEY_SEMICOLON: return ImGuiKey_Semicolon; + case ALLEGRO_KEY_EQUALS: return ImGuiKey_Equal; + case ALLEGRO_KEY_OPENBRACE: return ImGuiKey_LeftBracket; + case ALLEGRO_KEY_BACKSLASH: return ImGuiKey_Backslash; + case ALLEGRO_KEY_CLOSEBRACE: return ImGuiKey_RightBracket; + case ALLEGRO_KEY_TILDE: return ImGuiKey_GraveAccent; + case ALLEGRO_KEY_CAPSLOCK: return ImGuiKey_CapsLock; + case ALLEGRO_KEY_SCROLLLOCK: return ImGuiKey_ScrollLock; + case ALLEGRO_KEY_NUMLOCK: return ImGuiKey_NumLock; + case ALLEGRO_KEY_PRINTSCREEN: return ImGuiKey_PrintScreen; + case ALLEGRO_KEY_PAUSE: return ImGuiKey_Pause; + case ALLEGRO_KEY_PAD_0: return ImGuiKey_Keypad0; + case ALLEGRO_KEY_PAD_1: return ImGuiKey_Keypad1; + case ALLEGRO_KEY_PAD_2: return ImGuiKey_Keypad2; + case ALLEGRO_KEY_PAD_3: return ImGuiKey_Keypad3; + case ALLEGRO_KEY_PAD_4: return ImGuiKey_Keypad4; + case ALLEGRO_KEY_PAD_5: return ImGuiKey_Keypad5; + case ALLEGRO_KEY_PAD_6: return ImGuiKey_Keypad6; + case ALLEGRO_KEY_PAD_7: return ImGuiKey_Keypad7; + case ALLEGRO_KEY_PAD_8: return ImGuiKey_Keypad8; + case ALLEGRO_KEY_PAD_9: return ImGuiKey_Keypad9; + case ALLEGRO_KEY_PAD_DELETE: return ImGuiKey_KeypadDecimal; + case ALLEGRO_KEY_PAD_SLASH: return ImGuiKey_KeypadDivide; + case ALLEGRO_KEY_PAD_ASTERISK: return ImGuiKey_KeypadMultiply; + case ALLEGRO_KEY_PAD_MINUS: return ImGuiKey_KeypadSubtract; + case ALLEGRO_KEY_PAD_PLUS: return ImGuiKey_KeypadAdd; + case ALLEGRO_KEY_PAD_ENTER: return ImGuiKey_KeypadEnter; + case ALLEGRO_KEY_PAD_EQUALS: return ImGuiKey_KeypadEqual; + case ALLEGRO_KEY_LCTRL: return ImGuiKey_LeftCtrl; + case ALLEGRO_KEY_LSHIFT: return ImGuiKey_LeftShift; + case ALLEGRO_KEY_ALT: return ImGuiKey_LeftAlt; + case ALLEGRO_KEY_LWIN: return ImGuiKey_LeftSuper; + case ALLEGRO_KEY_RCTRL: return ImGuiKey_RightCtrl; + case ALLEGRO_KEY_RSHIFT: return ImGuiKey_RightShift; + case ALLEGRO_KEY_ALTGR: return ImGuiKey_RightAlt; + case ALLEGRO_KEY_RWIN: return ImGuiKey_RightSuper; + case ALLEGRO_KEY_MENU: return ImGuiKey_Menu; + case ALLEGRO_KEY_0: return ImGuiKey_0; + case ALLEGRO_KEY_1: return ImGuiKey_1; + case ALLEGRO_KEY_2: return ImGuiKey_2; + case ALLEGRO_KEY_3: return ImGuiKey_3; + case ALLEGRO_KEY_4: return ImGuiKey_4; + case ALLEGRO_KEY_5: return ImGuiKey_5; + case ALLEGRO_KEY_6: return ImGuiKey_6; + case ALLEGRO_KEY_7: return ImGuiKey_7; + case ALLEGRO_KEY_8: return ImGuiKey_8; + case ALLEGRO_KEY_9: return ImGuiKey_9; + case ALLEGRO_KEY_A: return ImGuiKey_A; + case ALLEGRO_KEY_B: return ImGuiKey_B; + case ALLEGRO_KEY_C: return ImGuiKey_C; + case ALLEGRO_KEY_D: return ImGuiKey_D; + case ALLEGRO_KEY_E: return ImGuiKey_E; + case ALLEGRO_KEY_F: return ImGuiKey_F; + case ALLEGRO_KEY_G: return ImGuiKey_G; + case ALLEGRO_KEY_H: return ImGuiKey_H; + case ALLEGRO_KEY_I: return ImGuiKey_I; + case ALLEGRO_KEY_J: return ImGuiKey_J; + case ALLEGRO_KEY_K: return ImGuiKey_K; + case ALLEGRO_KEY_L: return ImGuiKey_L; + case ALLEGRO_KEY_M: return ImGuiKey_M; + case ALLEGRO_KEY_N: return ImGuiKey_N; + case ALLEGRO_KEY_O: return ImGuiKey_O; + case ALLEGRO_KEY_P: return ImGuiKey_P; + case ALLEGRO_KEY_Q: return ImGuiKey_Q; + case ALLEGRO_KEY_R: return ImGuiKey_R; + case ALLEGRO_KEY_S: return ImGuiKey_S; + case ALLEGRO_KEY_T: return ImGuiKey_T; + case ALLEGRO_KEY_U: return ImGuiKey_U; + case ALLEGRO_KEY_V: return ImGuiKey_V; + case ALLEGRO_KEY_W: return ImGuiKey_W; + case ALLEGRO_KEY_X: return ImGuiKey_X; + case ALLEGRO_KEY_Y: return ImGuiKey_Y; + case ALLEGRO_KEY_Z: return ImGuiKey_Z; + case ALLEGRO_KEY_F1: return ImGuiKey_F1; + case ALLEGRO_KEY_F2: return ImGuiKey_F2; + case ALLEGRO_KEY_F3: return ImGuiKey_F3; + case ALLEGRO_KEY_F4: return ImGuiKey_F4; + case ALLEGRO_KEY_F5: return ImGuiKey_F5; + case ALLEGRO_KEY_F6: return ImGuiKey_F6; + case ALLEGRO_KEY_F7: return ImGuiKey_F7; + case ALLEGRO_KEY_F8: return ImGuiKey_F8; + case ALLEGRO_KEY_F9: return ImGuiKey_F9; + case ALLEGRO_KEY_F10: return ImGuiKey_F10; + case ALLEGRO_KEY_F11: return ImGuiKey_F11; + case ALLEGRO_KEY_F12: return ImGuiKey_F12; + default: return ImGuiKey_None; + } +} + +bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + // Setup backend capabilities flags + ImGui_ImplAllegro5_Data* bd = IM_NEW(ImGui_ImplAllegro5_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = io.BackendRendererName = "imgui_impl_allegro5"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + + bd->Display = display; + + // Create custom vertex declaration. + // Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 floats. + // We still use a custom declaration to use 'ALLEGRO_PRIM_TEX_COORD' instead of 'ALLEGRO_PRIM_TEX_COORD_PIXEL' else we can't do a reliable conversion. + ALLEGRO_VERTEX_ELEMENT elems[] = + { + { ALLEGRO_PRIM_POSITION, ALLEGRO_PRIM_FLOAT_2, IM_OFFSETOF(ImDrawVertAllegro, pos) }, + { ALLEGRO_PRIM_TEX_COORD, ALLEGRO_PRIM_FLOAT_2, IM_OFFSETOF(ImDrawVertAllegro, uv) }, + { ALLEGRO_PRIM_COLOR_ATTR, 0, IM_OFFSETOF(ImDrawVertAllegro, col) }, + { 0, 0, 0 } + }; + bd->VertexDecl = al_create_vertex_decl(elems, sizeof(ImDrawVertAllegro)); + +#if ALLEGRO_HAS_CLIPBOARD + io.SetClipboardTextFn = ImGui_ImplAllegro5_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplAllegro5_GetClipboardText; + io.ClipboardUserData = nullptr; +#endif + + return true; +} + +void ImGui_ImplAllegro5_Shutdown() +{ + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplAllegro5_InvalidateDeviceObjects(); + if (bd->VertexDecl) + al_destroy_vertex_decl(bd->VertexDecl); + if (bd->ClipboardTextData) + al_free(bd->ClipboardTextData); + + io.BackendPlatformUserData = nullptr; + io.BackendPlatformName = io.BackendRendererName = nullptr; + IM_DELETE(bd); +} + +// ev->keyboard.modifiers seems always zero so using that... +static void ImGui_ImplAllegro5_UpdateKeyModifiers() +{ + ImGuiIO& io = ImGui::GetIO(); + ALLEGRO_KEYBOARD_STATE keys; + al_get_keyboard_state(&keys); + io.AddKeyEvent(ImGuiMod_Ctrl, al_key_down(&keys, ALLEGRO_KEY_LCTRL) || al_key_down(&keys, ALLEGRO_KEY_RCTRL)); + io.AddKeyEvent(ImGuiMod_Shift, al_key_down(&keys, ALLEGRO_KEY_LSHIFT) || al_key_down(&keys, ALLEGRO_KEY_RSHIFT)); + io.AddKeyEvent(ImGuiMod_Alt, al_key_down(&keys, ALLEGRO_KEY_ALT) || al_key_down(&keys, ALLEGRO_KEY_ALTGR)); + io.AddKeyEvent(ImGuiMod_Super, al_key_down(&keys, ALLEGRO_KEY_LWIN) || al_key_down(&keys, ALLEGRO_KEY_RWIN)); +} + +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* ev) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + + switch (ev->type) + { + case ALLEGRO_EVENT_MOUSE_AXES: + if (ev->mouse.display == bd->Display) + { + io.AddMousePosEvent(ev->mouse.x, ev->mouse.y); + io.AddMouseWheelEvent(-ev->mouse.dw, ev->mouse.dz); + } + return true; + case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN: + case ALLEGRO_EVENT_MOUSE_BUTTON_UP: + if (ev->mouse.display == bd->Display && ev->mouse.button > 0 && ev->mouse.button <= 5) + io.AddMouseButtonEvent(ev->mouse.button - 1, ev->type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN); + return true; + case ALLEGRO_EVENT_TOUCH_MOVE: + if (ev->touch.display == bd->Display) + io.AddMousePosEvent(ev->touch.x, ev->touch.y); + return true; + case ALLEGRO_EVENT_TOUCH_BEGIN: + case ALLEGRO_EVENT_TOUCH_END: + case ALLEGRO_EVENT_TOUCH_CANCEL: + if (ev->touch.display == bd->Display && ev->touch.primary) + io.AddMouseButtonEvent(0, ev->type == ALLEGRO_EVENT_TOUCH_BEGIN); + return true; + case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY: + if (ev->mouse.display == bd->Display) + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + return true; + case ALLEGRO_EVENT_KEY_CHAR: + if (ev->keyboard.display == bd->Display) + if (ev->keyboard.unichar != 0) + io.AddInputCharacter((unsigned int)ev->keyboard.unichar); + return true; + case ALLEGRO_EVENT_KEY_DOWN: + case ALLEGRO_EVENT_KEY_UP: + if (ev->keyboard.display == bd->Display) + { + ImGui_ImplAllegro5_UpdateKeyModifiers(); + ImGuiKey key = ImGui_ImplAllegro5_KeyCodeToImGuiKey(ev->keyboard.keycode); + io.AddKeyEvent(key, (ev->type == ALLEGRO_EVENT_KEY_DOWN)); + io.SetKeyEventNativeData(key, ev->keyboard.keycode, -1); // To support legacy indexing (<1.87 user code) + } + return true; + case ALLEGRO_EVENT_DISPLAY_SWITCH_OUT: + if (ev->display.source == bd->Display) + io.AddFocusEvent(false); + return true; + case ALLEGRO_EVENT_DISPLAY_SWITCH_IN: + if (ev->display.source == bd->Display) + { + io.AddFocusEvent(true); +#if defined(ALLEGRO_UNSTABLE) + al_clear_keyboard_state(bd->Display); +#endif + } + return true; + } + return false; +} + +static void ImGui_ImplAllegro5_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return; + + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + al_set_mouse_cursor(bd->Display, bd->MouseCursorInvisible); + } + else + { + ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_DEFAULT; + switch (imgui_cursor) + { + case ImGuiMouseCursor_TextInput: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_EDIT; break; + case ImGuiMouseCursor_ResizeAll: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_MOVE; break; + case ImGuiMouseCursor_ResizeNS: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_N; break; + case ImGuiMouseCursor_ResizeEW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_E; break; + case ImGuiMouseCursor_ResizeNESW: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NE; break; + case ImGuiMouseCursor_ResizeNWSE: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_RESIZE_NW; break; + case ImGuiMouseCursor_NotAllowed: cursor_id = ALLEGRO_SYSTEM_MOUSE_CURSOR_UNAVAILABLE; break; + } + al_set_system_mouse_cursor(bd->Display, cursor_id); + } +} + +void ImGui_ImplAllegro5_NewFrame() +{ + ImGui_ImplAllegro5_Data* bd = ImGui_ImplAllegro5_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplAllegro5_Init()?"); + + if (!bd->Texture) + ImGui_ImplAllegro5_CreateDeviceObjects(); + + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + int w, h; + w = al_get_display_width(bd->Display); + h = al_get_display_height(bd->Display); + io.DisplaySize = ImVec2((float)w, (float)h); + + // Setup time step + double current_time = al_get_time(); + io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f); + bd->Time = current_time; + + // Setup mouse cursor shape + ImGui_ImplAllegro5_UpdateMouseCursor(); +} diff --git a/ImGui/backends/imgui_impl_allegro5.h b/ImGui/backends/imgui_impl_allegro5.h new file mode 100644 index 0000000..7e97969 --- /dev/null +++ b/ImGui/backends/imgui_impl_allegro5.h @@ -0,0 +1,32 @@ +// dear imgui: Renderer + Platform Backend for Allegro 5 +// (Info: Allegro 5 is a cross-platform general purpose library for handling windows, inputs, graphics, etc.) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ALLEGRO_BITMAP*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy ALLEGRO_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Clipboard support (from Allegro 5.1.12) +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// Issues: +// [ ] Renderer: The renderer is suboptimal as we need to unindex our buffers and convert vertices manually. +// [ ] Platform: Missing gamepad support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct ALLEGRO_DISPLAY; +union ALLEGRO_EVENT; + +IMGUI_IMPL_API bool ImGui_ImplAllegro5_Init(ALLEGRO_DISPLAY* display); +IMGUI_IMPL_API void ImGui_ImplAllegro5_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplAllegro5_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data); +IMGUI_IMPL_API bool ImGui_ImplAllegro5_ProcessEvent(ALLEGRO_EVENT* event); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API bool ImGui_ImplAllegro5_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplAllegro5_InvalidateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_android.cpp b/ImGui/backends/imgui_impl_android.cpp new file mode 100644 index 0000000..6b1dd4c --- /dev/null +++ b/ImGui/backends/imgui_impl_android.cpp @@ -0,0 +1,277 @@ +// dear imgui: Platform Binding for Android native app +// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3) + +// Implemented features: +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy AKEYCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// Missing features: +// [ ] Platform: Clipboard support. +// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android. +// Important: +// - Consider using SDL or GLFW backend on Android, which will be more full-featured than this. +// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446) +// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446) + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-03-04: Initial version. + +#include "imgui.h" +#include "imgui_impl_android.h" +#include +#include +#include +#include +#include + +// Android data +static double g_Time = 0.0; +static ANativeWindow* g_Window; +static char g_LogTag[] = "ImGuiExample"; + +static ImGuiKey ImGui_ImplAndroid_KeyCodeToImGuiKey(int32_t key_code) +{ + switch (key_code) + { + case AKEYCODE_TAB: return ImGuiKey_Tab; + case AKEYCODE_DPAD_LEFT: return ImGuiKey_LeftArrow; + case AKEYCODE_DPAD_RIGHT: return ImGuiKey_RightArrow; + case AKEYCODE_DPAD_UP: return ImGuiKey_UpArrow; + case AKEYCODE_DPAD_DOWN: return ImGuiKey_DownArrow; + case AKEYCODE_PAGE_UP: return ImGuiKey_PageUp; + case AKEYCODE_PAGE_DOWN: return ImGuiKey_PageDown; + case AKEYCODE_MOVE_HOME: return ImGuiKey_Home; + case AKEYCODE_MOVE_END: return ImGuiKey_End; + case AKEYCODE_INSERT: return ImGuiKey_Insert; + case AKEYCODE_FORWARD_DEL: return ImGuiKey_Delete; + case AKEYCODE_DEL: return ImGuiKey_Backspace; + case AKEYCODE_SPACE: return ImGuiKey_Space; + case AKEYCODE_ENTER: return ImGuiKey_Enter; + case AKEYCODE_ESCAPE: return ImGuiKey_Escape; + case AKEYCODE_APOSTROPHE: return ImGuiKey_Apostrophe; + case AKEYCODE_COMMA: return ImGuiKey_Comma; + case AKEYCODE_MINUS: return ImGuiKey_Minus; + case AKEYCODE_PERIOD: return ImGuiKey_Period; + case AKEYCODE_SLASH: return ImGuiKey_Slash; + case AKEYCODE_SEMICOLON: return ImGuiKey_Semicolon; + case AKEYCODE_EQUALS: return ImGuiKey_Equal; + case AKEYCODE_LEFT_BRACKET: return ImGuiKey_LeftBracket; + case AKEYCODE_BACKSLASH: return ImGuiKey_Backslash; + case AKEYCODE_RIGHT_BRACKET: return ImGuiKey_RightBracket; + case AKEYCODE_GRAVE: return ImGuiKey_GraveAccent; + case AKEYCODE_CAPS_LOCK: return ImGuiKey_CapsLock; + case AKEYCODE_SCROLL_LOCK: return ImGuiKey_ScrollLock; + case AKEYCODE_NUM_LOCK: return ImGuiKey_NumLock; + case AKEYCODE_SYSRQ: return ImGuiKey_PrintScreen; + case AKEYCODE_BREAK: return ImGuiKey_Pause; + case AKEYCODE_NUMPAD_0: return ImGuiKey_Keypad0; + case AKEYCODE_NUMPAD_1: return ImGuiKey_Keypad1; + case AKEYCODE_NUMPAD_2: return ImGuiKey_Keypad2; + case AKEYCODE_NUMPAD_3: return ImGuiKey_Keypad3; + case AKEYCODE_NUMPAD_4: return ImGuiKey_Keypad4; + case AKEYCODE_NUMPAD_5: return ImGuiKey_Keypad5; + case AKEYCODE_NUMPAD_6: return ImGuiKey_Keypad6; + case AKEYCODE_NUMPAD_7: return ImGuiKey_Keypad7; + case AKEYCODE_NUMPAD_8: return ImGuiKey_Keypad8; + case AKEYCODE_NUMPAD_9: return ImGuiKey_Keypad9; + case AKEYCODE_NUMPAD_DOT: return ImGuiKey_KeypadDecimal; + case AKEYCODE_NUMPAD_DIVIDE: return ImGuiKey_KeypadDivide; + case AKEYCODE_NUMPAD_MULTIPLY: return ImGuiKey_KeypadMultiply; + case AKEYCODE_NUMPAD_SUBTRACT: return ImGuiKey_KeypadSubtract; + case AKEYCODE_NUMPAD_ADD: return ImGuiKey_KeypadAdd; + case AKEYCODE_NUMPAD_ENTER: return ImGuiKey_KeypadEnter; + case AKEYCODE_NUMPAD_EQUALS: return ImGuiKey_KeypadEqual; + case AKEYCODE_CTRL_LEFT: return ImGuiKey_LeftCtrl; + case AKEYCODE_SHIFT_LEFT: return ImGuiKey_LeftShift; + case AKEYCODE_ALT_LEFT: return ImGuiKey_LeftAlt; + case AKEYCODE_META_LEFT: return ImGuiKey_LeftSuper; + case AKEYCODE_CTRL_RIGHT: return ImGuiKey_RightCtrl; + case AKEYCODE_SHIFT_RIGHT: return ImGuiKey_RightShift; + case AKEYCODE_ALT_RIGHT: return ImGuiKey_RightAlt; + case AKEYCODE_META_RIGHT: return ImGuiKey_RightSuper; + case AKEYCODE_MENU: return ImGuiKey_Menu; + case AKEYCODE_0: return ImGuiKey_0; + case AKEYCODE_1: return ImGuiKey_1; + case AKEYCODE_2: return ImGuiKey_2; + case AKEYCODE_3: return ImGuiKey_3; + case AKEYCODE_4: return ImGuiKey_4; + case AKEYCODE_5: return ImGuiKey_5; + case AKEYCODE_6: return ImGuiKey_6; + case AKEYCODE_7: return ImGuiKey_7; + case AKEYCODE_8: return ImGuiKey_8; + case AKEYCODE_9: return ImGuiKey_9; + case AKEYCODE_A: return ImGuiKey_A; + case AKEYCODE_B: return ImGuiKey_B; + case AKEYCODE_C: return ImGuiKey_C; + case AKEYCODE_D: return ImGuiKey_D; + case AKEYCODE_E: return ImGuiKey_E; + case AKEYCODE_F: return ImGuiKey_F; + case AKEYCODE_G: return ImGuiKey_G; + case AKEYCODE_H: return ImGuiKey_H; + case AKEYCODE_I: return ImGuiKey_I; + case AKEYCODE_J: return ImGuiKey_J; + case AKEYCODE_K: return ImGuiKey_K; + case AKEYCODE_L: return ImGuiKey_L; + case AKEYCODE_M: return ImGuiKey_M; + case AKEYCODE_N: return ImGuiKey_N; + case AKEYCODE_O: return ImGuiKey_O; + case AKEYCODE_P: return ImGuiKey_P; + case AKEYCODE_Q: return ImGuiKey_Q; + case AKEYCODE_R: return ImGuiKey_R; + case AKEYCODE_S: return ImGuiKey_S; + case AKEYCODE_T: return ImGuiKey_T; + case AKEYCODE_U: return ImGuiKey_U; + case AKEYCODE_V: return ImGuiKey_V; + case AKEYCODE_W: return ImGuiKey_W; + case AKEYCODE_X: return ImGuiKey_X; + case AKEYCODE_Y: return ImGuiKey_Y; + case AKEYCODE_Z: return ImGuiKey_Z; + case AKEYCODE_F1: return ImGuiKey_F1; + case AKEYCODE_F2: return ImGuiKey_F2; + case AKEYCODE_F3: return ImGuiKey_F3; + case AKEYCODE_F4: return ImGuiKey_F4; + case AKEYCODE_F5: return ImGuiKey_F5; + case AKEYCODE_F6: return ImGuiKey_F6; + case AKEYCODE_F7: return ImGuiKey_F7; + case AKEYCODE_F8: return ImGuiKey_F8; + case AKEYCODE_F9: return ImGuiKey_F9; + case AKEYCODE_F10: return ImGuiKey_F10; + case AKEYCODE_F11: return ImGuiKey_F11; + case AKEYCODE_F12: return ImGuiKey_F12; + default: return ImGuiKey_None; + } +} + +int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event) +{ + ImGuiIO& io = ImGui::GetIO(); + int32_t event_type = AInputEvent_getType(input_event); + switch (event_type) + { + case AINPUT_EVENT_TYPE_KEY: + { + int32_t event_key_code = AKeyEvent_getKeyCode(input_event); + int32_t event_scan_code = AKeyEvent_getScanCode(input_event); + int32_t event_action = AKeyEvent_getAction(input_event); + int32_t event_meta_state = AKeyEvent_getMetaState(input_event); + + io.AddKeyEvent(ImGuiMod_Ctrl, (event_meta_state & AMETA_CTRL_ON) != 0); + io.AddKeyEvent(ImGuiMod_Shift, (event_meta_state & AMETA_SHIFT_ON) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (event_meta_state & AMETA_ALT_ON) != 0); + io.AddKeyEvent(ImGuiMod_Super, (event_meta_state & AMETA_META_ON) != 0); + + switch (event_action) + { + // FIXME: AKEY_EVENT_ACTION_DOWN and AKEY_EVENT_ACTION_UP occur at once as soon as a touch pointer + // goes up from a key. We use a simple key event queue/ and process one event per key per frame in + // ImGui_ImplAndroid_NewFrame()...or consider using IO queue, if suitable: https://github.com/ocornut/imgui/issues/2787 + case AKEY_EVENT_ACTION_DOWN: + case AKEY_EVENT_ACTION_UP: + { + ImGuiKey key = ImGui_ImplAndroid_KeyCodeToImGuiKey(event_key_code); + if (key != ImGuiKey_None && (event_action == AKEY_EVENT_ACTION_DOWN || event_action == AKEY_EVENT_ACTION_UP)) + { + io.AddKeyEvent(key, event_action == AKEY_EVENT_ACTION_DOWN); + io.SetKeyEventNativeData(key, event_key_code, event_scan_code); + } + + break; + } + default: + break; + } + break; + } + case AINPUT_EVENT_TYPE_MOTION: + { + int32_t event_action = AMotionEvent_getAction(input_event); + int32_t event_pointer_index = (event_action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT; + event_action &= AMOTION_EVENT_ACTION_MASK; + switch (event_action) + { + case AMOTION_EVENT_ACTION_DOWN: + case AMOTION_EVENT_ACTION_UP: + // Physical mouse buttons (and probably other physical devices) also invoke the actions AMOTION_EVENT_ACTION_DOWN/_UP, + // but we have to process them separately to identify the actual button pressed. This is done below via + // AMOTION_EVENT_ACTION_BUTTON_PRESS/_RELEASE. Here, we only process "FINGER" input (and "UNKNOWN", as a fallback). + if((AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_FINGER) + || (AMotionEvent_getToolType(input_event, event_pointer_index) == AMOTION_EVENT_TOOL_TYPE_UNKNOWN)) + { + io.AddMousePosEvent(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index)); + io.AddMouseButtonEvent(0, event_action == AMOTION_EVENT_ACTION_DOWN); + } + break; + case AMOTION_EVENT_ACTION_BUTTON_PRESS: + case AMOTION_EVENT_ACTION_BUTTON_RELEASE: + { + int32_t button_state = AMotionEvent_getButtonState(input_event); + io.AddMouseButtonEvent(0, (button_state & AMOTION_EVENT_BUTTON_PRIMARY) != 0); + io.AddMouseButtonEvent(1, (button_state & AMOTION_EVENT_BUTTON_SECONDARY) != 0); + io.AddMouseButtonEvent(2, (button_state & AMOTION_EVENT_BUTTON_TERTIARY) != 0); + } + break; + case AMOTION_EVENT_ACTION_HOVER_MOVE: // Hovering: Tool moves while NOT pressed (such as a physical mouse) + case AMOTION_EVENT_ACTION_MOVE: // Touch pointer moves while DOWN + io.AddMousePosEvent(AMotionEvent_getX(input_event, event_pointer_index), AMotionEvent_getY(input_event, event_pointer_index)); + break; + case AMOTION_EVENT_ACTION_SCROLL: + io.AddMouseWheelEvent(AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_HSCROLL, event_pointer_index), AMotionEvent_getAxisValue(input_event, AMOTION_EVENT_AXIS_VSCROLL, event_pointer_index)); + break; + default: + break; + } + } + return 1; + default: + break; + } + + return 0; +} + +bool ImGui_ImplAndroid_Init(ANativeWindow* window) +{ + g_Window = window; + g_Time = 0.0; + + // Setup backend capabilities flags + ImGuiIO& io = ImGui::GetIO(); + io.BackendPlatformName = "imgui_impl_android"; + + return true; +} + +void ImGui_ImplAndroid_Shutdown() +{ +} + +void ImGui_ImplAndroid_NewFrame() +{ + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + int32_t window_width = ANativeWindow_getWidth(g_Window); + int32_t window_height = ANativeWindow_getHeight(g_Window); + int display_width = window_width; + int display_height = window_height; + + io.DisplaySize = ImVec2((float)window_width, (float)window_height); + if (window_width > 0 && window_height > 0) + io.DisplayFramebufferScale = ImVec2((float)display_width / window_width, (float)display_height / window_height); + + // Setup time step + struct timespec current_timespec; + clock_gettime(CLOCK_MONOTONIC, ¤t_timespec); + double current_time = (double)(current_timespec.tv_sec) + (current_timespec.tv_nsec / 1000000000.0); + io.DeltaTime = g_Time > 0.0 ? (float)(current_time - g_Time) : (float)(1.0f / 60.0f); + g_Time = current_time; +} diff --git a/ImGui/backends/imgui_impl_android.h b/ImGui/backends/imgui_impl_android.h new file mode 100644 index 0000000..8bfa186 --- /dev/null +++ b/ImGui/backends/imgui_impl_android.h @@ -0,0 +1,28 @@ +// dear imgui: Platform Binding for Android native app +// This needs to be used along with the OpenGL 3 Renderer (imgui_impl_opengl3) + +// Implemented features: +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy AKEYCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// Missing features: +// [ ] Platform: Clipboard support. +// [ ] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [ ] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. FIXME: Check if this is even possible with Android. +// Important: +// - Consider using SDL or GLFW backend on Android, which will be more full-featured than this. +// - FIXME: On-screen keyboard currently needs to be enabled by the application (see examples/ and issue #3446) +// - FIXME: Unicode character inputs needs to be passed by Dear ImGui by the application (see examples/ and issue #3446) + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once + +struct ANativeWindow; +struct AInputEvent; + +IMGUI_IMPL_API bool ImGui_ImplAndroid_Init(ANativeWindow* window); +IMGUI_IMPL_API int32_t ImGui_ImplAndroid_HandleInputEvent(AInputEvent* input_event); +IMGUI_IMPL_API void ImGui_ImplAndroid_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplAndroid_NewFrame(); diff --git a/ImGui/backends/imgui_impl_dx10.cpp b/ImGui/backends/imgui_impl_dx10.cpp new file mode 100644 index 0000000..e074359 --- /dev/null +++ b/ImGui/backends/imgui_impl_dx10.cpp @@ -0,0 +1,580 @@ +// dear imgui: Renderer Backend for DirectX10 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D10ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: DirectX10: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: DirectX10: Change blending equation to preserve alpha in output buffer. +// 2019-07-21: DirectX10: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData(). +// 2019-05-29: DirectX10: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: DirectX10: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile(). +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-07-13: DirectX10: Fixed unreleased resources in Init and Shutdown functions. +// 2018-06-08: Misc: Extracted imgui_impl_dx10.cpp/.h away from the old combined DX10+Win32 example. +// 2018-06-08: DirectX10: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-04-09: Misc: Fixed erroneous call to io.Fonts->ClearInputData() + ClearTexData() that was left in DX10 example but removed in 1.47 (Nov 2015) on other backends. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX10_RenderDrawData() in the .h file so you can call it yourself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2016-05-07: DirectX10: Disabling depth-write. + +#include "imgui.h" +#include "imgui_impl_dx10.h" + +// DirectX +#include +#include +#include +#include +#ifdef _MSC_VER +#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below. +#endif + +// DirectX data +struct ImGui_ImplDX10_Data +{ + ID3D10Device* pd3dDevice; + IDXGIFactory* pFactory; + ID3D10Buffer* pVB; + ID3D10Buffer* pIB; + ID3D10VertexShader* pVertexShader; + ID3D10InputLayout* pInputLayout; + ID3D10Buffer* pVertexConstantBuffer; + ID3D10PixelShader* pPixelShader; + ID3D10SamplerState* pFontSampler; + ID3D10ShaderResourceView* pFontTextureView; + ID3D10RasterizerState* pRasterizerState; + ID3D10BlendState* pBlendState; + ID3D10DepthStencilState* pDepthStencilState; + int VertexBufferSize; + int IndexBufferSize; + + ImGui_ImplDX10_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; } +}; + +struct VERTEX_CONSTANT_BUFFER_DX10 +{ + float mvp[4][4]; +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplDX10_Data* ImGui_ImplDX10_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplDX10_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +static void ImGui_ImplDX10_SetupRenderState(ImDrawData* draw_data, ID3D10Device* ctx) +{ + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + + // Setup viewport + D3D10_VIEWPORT vp; + memset(&vp, 0, sizeof(D3D10_VIEWPORT)); + vp.Width = (UINT)draw_data->DisplaySize.x; + vp.Height = (UINT)draw_data->DisplaySize.y; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = vp.TopLeftY = 0; + ctx->RSSetViewports(1, &vp); + + // Bind shader and vertex buffers + unsigned int stride = sizeof(ImDrawVert); + unsigned int offset = 0; + ctx->IASetInputLayout(bd->pInputLayout); + ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset); + ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); + ctx->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->VSSetShader(bd->pVertexShader); + ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer); + ctx->PSSetShader(bd->pPixelShader); + ctx->PSSetSamplers(0, 1, &bd->pFontSampler); + ctx->GSSetShader(nullptr); + + // Setup render state + const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f }; + ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff); + ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0); + ctx->RSSetState(bd->pRasterizerState); +} + +// Render function +void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + ID3D10Device* ctx = bd->pd3dDevice; + + // Create and grow vertex/index buffers if needed + if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount) + { + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + bd->VertexBufferSize = draw_data->TotalVtxCount + 5000; + D3D10_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D10_BUFFER_DESC)); + desc.Usage = D3D10_USAGE_DYNAMIC; + desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert); + desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + if (ctx->CreateBuffer(&desc, nullptr, &bd->pVB) < 0) + return; + } + + if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount) + { + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + bd->IndexBufferSize = draw_data->TotalIdxCount + 10000; + D3D10_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D10_BUFFER_DESC)); + desc.Usage = D3D10_USAGE_DYNAMIC; + desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx); + desc.BindFlags = D3D10_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + if (ctx->CreateBuffer(&desc, nullptr, &bd->pIB) < 0) + return; + } + + // Copy and convert all vertices into a single contiguous buffer + ImDrawVert* vtx_dst = nullptr; + ImDrawIdx* idx_dst = nullptr; + bd->pVB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&vtx_dst); + bd->pIB->Map(D3D10_MAP_WRITE_DISCARD, 0, (void**)&idx_dst); + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + bd->pVB->Unmap(); + bd->pIB->Unmap(); + + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + { + void* mapped_resource; + if (bd->pVertexConstantBuffer->Map(D3D10_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK) + return; + VERTEX_CONSTANT_BUFFER_DX10* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX10*)mapped_resource; + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + float mvp[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, + }; + memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); + bd->pVertexConstantBuffer->Unmap(); + } + + // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!) + struct BACKUP_DX10_STATE + { + UINT ScissorRectsCount, ViewportsCount; + D3D10_RECT ScissorRects[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + D3D10_VIEWPORT Viewports[D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + ID3D10RasterizerState* RS; + ID3D10BlendState* BlendState; + FLOAT BlendFactor[4]; + UINT SampleMask; + UINT StencilRef; + ID3D10DepthStencilState* DepthStencilState; + ID3D10ShaderResourceView* PSShaderResource; + ID3D10SamplerState* PSSampler; + ID3D10PixelShader* PS; + ID3D10VertexShader* VS; + ID3D10GeometryShader* GS; + D3D10_PRIMITIVE_TOPOLOGY PrimitiveTopology; + ID3D10Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer; + UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset; + DXGI_FORMAT IndexBufferFormat; + ID3D10InputLayout* InputLayout; + }; + BACKUP_DX10_STATE old = {}; + old.ScissorRectsCount = old.ViewportsCount = D3D10_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; + ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects); + ctx->RSGetViewports(&old.ViewportsCount, old.Viewports); + ctx->RSGetState(&old.RS); + ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask); + ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef); + ctx->PSGetShaderResources(0, 1, &old.PSShaderResource); + ctx->PSGetSamplers(0, 1, &old.PSSampler); + ctx->PSGetShader(&old.PS); + ctx->VSGetShader(&old.VS); + ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer); + ctx->GSGetShader(&old.GS); + ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology); + ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset); + ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); + ctx->IAGetInputLayout(&old.InputLayout); + + // Setup desired DX state + ImGui_ImplDX10_SetupRenderState(draw_data, ctx); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_vtx_offset = 0; + int global_idx_offset = 0; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplDX10_SetupRenderState(draw_data, ctx); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle + const D3D10_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; + ctx->RSSetScissorRects(1, &r); + + // Bind texture, Draw + ID3D10ShaderResourceView* texture_srv = (ID3D10ShaderResourceView*)pcmd->GetTexID(); + ctx->PSSetShaderResources(0, 1, &texture_srv); + ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } + + // Restore modified DX state + ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects); + ctx->RSSetViewports(old.ViewportsCount, old.Viewports); + ctx->RSSetState(old.RS); if (old.RS) old.RS->Release(); + ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release(); + ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release(); + ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release(); + ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release(); + ctx->PSSetShader(old.PS); if (old.PS) old.PS->Release(); + ctx->VSSetShader(old.VS); if (old.VS) old.VS->Release(); + ctx->GSSetShader(old.GS); if (old.GS) old.GS->Release(); + ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release(); + ctx->IASetPrimitiveTopology(old.PrimitiveTopology); + ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release(); + ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release(); + ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); +} + +static void ImGui_ImplDX10_CreateFontsTexture() +{ + // Build texture atlas + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // Upload texture to graphics system + { + D3D10_TEXTURE2D_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Width = width; + desc.Height = height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D10_USAGE_DEFAULT; + desc.BindFlags = D3D10_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + + ID3D10Texture2D* pTexture = nullptr; + D3D10_SUBRESOURCE_DATA subResource; + subResource.pSysMem = pixels; + subResource.SysMemPitch = desc.Width * 4; + subResource.SysMemSlicePitch = 0; + bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture); + IM_ASSERT(pTexture != nullptr); + + // Create texture view + D3D10_SHADER_RESOURCE_VIEW_DESC srv_desc; + ZeroMemory(&srv_desc, sizeof(srv_desc)); + srv_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srv_desc.ViewDimension = D3D10_SRV_DIMENSION_TEXTURE2D; + srv_desc.Texture2D.MipLevels = desc.MipLevels; + srv_desc.Texture2D.MostDetailedMip = 0; + bd->pd3dDevice->CreateShaderResourceView(pTexture, &srv_desc, &bd->pFontTextureView); + pTexture->Release(); + } + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView); + + // Create texture sampler + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + { + D3D10_SAMPLER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Filter = D3D10_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D10_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D10_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D10_TEXTURE_ADDRESS_WRAP; + desc.MipLODBias = 0.f; + desc.ComparisonFunc = D3D10_COMPARISON_ALWAYS; + desc.MinLOD = 0.f; + desc.MaxLOD = 0.f; + bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler); + } +} + +bool ImGui_ImplDX10_CreateDeviceObjects() +{ + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + if (!bd->pd3dDevice) + return false; + if (bd->pFontSampler) + ImGui_ImplDX10_InvalidateDeviceObjects(); + + // By using D3DCompile() from / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A) + // If you would like to use this DX10 sample code but remove this dependency you can: + // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution] + // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. + // See https://github.com/ocornut/imgui/pull/638 for sources and details. + + // Create the vertex shader + { + static const char* vertexShader = + "cbuffer vertexBuffer : register(b0) \ + {\ + float4x4 ProjectionMatrix; \ + };\ + struct VS_INPUT\ + {\ + float2 pos : POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + PS_INPUT main(VS_INPUT input)\ + {\ + PS_INPUT output;\ + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ + output.col = input.col;\ + output.uv = input.uv;\ + return output;\ + }"; + + ID3DBlob* vertexShaderBlob; + if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_4_0", 0, 0, &vertexShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pVertexShader) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + + // Create the input layout + D3D10_INPUT_ELEMENT_DESC local_layout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D10_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D10_INPUT_PER_VERTEX_DATA, 0 }, + }; + if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + vertexShaderBlob->Release(); + + // Create the constant buffer + { + D3D10_BUFFER_DESC desc; + desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX10); + desc.Usage = D3D10_USAGE_DYNAMIC; + desc.BindFlags = D3D10_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVertexConstantBuffer); + } + } + + // Create the pixel shader + { + static const char* pixelShader = + "struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + sampler sampler0;\ + Texture2D texture0;\ + \ + float4 main(PS_INPUT input) : SV_Target\ + {\ + float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \ + return out_col; \ + }"; + + ID3DBlob* pixelShaderBlob; + if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_4_0", 0, 0, &pixelShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), &bd->pPixelShader) != S_OK) + { + pixelShaderBlob->Release(); + return false; + } + pixelShaderBlob->Release(); + } + + // Create the blending setup + { + D3D10_BLEND_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.AlphaToCoverageEnable = false; + desc.BlendEnable[0] = true; + desc.SrcBlend = D3D10_BLEND_SRC_ALPHA; + desc.DestBlend = D3D10_BLEND_INV_SRC_ALPHA; + desc.BlendOp = D3D10_BLEND_OP_ADD; + desc.SrcBlendAlpha = D3D10_BLEND_ONE; + desc.DestBlendAlpha = D3D10_BLEND_INV_SRC_ALPHA; + desc.BlendOpAlpha = D3D10_BLEND_OP_ADD; + desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL; + bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState); + } + + // Create the rasterizer state + { + D3D10_RASTERIZER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.FillMode = D3D10_FILL_SOLID; + desc.CullMode = D3D10_CULL_NONE; + desc.ScissorEnable = true; + desc.DepthClipEnable = true; + bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState); + } + + // Create depth-stencil State + { + D3D10_DEPTH_STENCIL_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.DepthEnable = false; + desc.DepthWriteMask = D3D10_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D10_COMPARISON_ALWAYS; + desc.StencilEnable = false; + desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D10_STENCIL_OP_KEEP; + desc.FrontFace.StencilFunc = D3D10_COMPARISON_ALWAYS; + desc.BackFace = desc.FrontFace; + bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState); + } + + ImGui_ImplDX10_CreateFontsTexture(); + + return true; +} + +void ImGui_ImplDX10_InvalidateDeviceObjects() +{ + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + if (!bd->pd3dDevice) + return; + + if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = nullptr; } + if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well. + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; } + if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = nullptr; } + if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = nullptr; } + if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = nullptr; } + if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = nullptr; } + if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = nullptr; } + if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = nullptr; } +} + +bool ImGui_ImplDX10_Init(ID3D10Device* device) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplDX10_Data* bd = IM_NEW(ImGui_ImplDX10_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_dx10"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + // Get factory from device + IDXGIDevice* pDXGIDevice = nullptr; + IDXGIAdapter* pDXGIAdapter = nullptr; + IDXGIFactory* pFactory = nullptr; + if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK) + if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK) + if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK) + { + bd->pd3dDevice = device; + bd->pFactory = pFactory; + } + if (pDXGIDevice) pDXGIDevice->Release(); + if (pDXGIAdapter) pDXGIAdapter->Release(); + bd->pd3dDevice->AddRef(); + + return true; +} + +void ImGui_ImplDX10_Shutdown() +{ + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplDX10_InvalidateDeviceObjects(); + if (bd->pFactory) { bd->pFactory->Release(); } + if (bd->pd3dDevice) { bd->pd3dDevice->Release(); } + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplDX10_NewFrame() +{ + ImGui_ImplDX10_Data* bd = ImGui_ImplDX10_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX10_Init()?"); + + if (!bd->pFontSampler) + ImGui_ImplDX10_CreateDeviceObjects(); +} diff --git a/ImGui/backends/imgui_impl_dx10.h b/ImGui/backends/imgui_impl_dx10.h new file mode 100644 index 0000000..fde520c --- /dev/null +++ b/ImGui/backends/imgui_impl_dx10.h @@ -0,0 +1,25 @@ +// dear imgui: Renderer Backend for DirectX10 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D10ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct ID3D10Device; + +IMGUI_IMPL_API bool ImGui_ImplDX10_Init(ID3D10Device* device); +IMGUI_IMPL_API void ImGui_ImplDX10_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplDX10_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX10_RenderDrawData(ImDrawData* draw_data); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API void ImGui_ImplDX10_InvalidateDeviceObjects(); +IMGUI_IMPL_API bool ImGui_ImplDX10_CreateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_dx11.cpp b/ImGui/backends/imgui_impl_dx11.cpp new file mode 100644 index 0000000..43fe814 --- /dev/null +++ b/ImGui/backends/imgui_impl_dx11.cpp @@ -0,0 +1,596 @@ +// dear imgui: Renderer Backend for DirectX11 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer. +// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled). +// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore. +// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile(). +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility. +// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions. +// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example. +// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2016-05-07: DirectX11: Disabling depth-write. + +#include "imgui.h" +#include "imgui_impl_dx11.h" + +// DirectX +#include +#include +#include +#ifdef _MSC_VER +#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below. +#endif + +// DirectX11 data +struct ImGui_ImplDX11_Data +{ + ID3D11Device* pd3dDevice; + ID3D11DeviceContext* pd3dDeviceContext; + IDXGIFactory* pFactory; + ID3D11Buffer* pVB; + ID3D11Buffer* pIB; + ID3D11VertexShader* pVertexShader; + ID3D11InputLayout* pInputLayout; + ID3D11Buffer* pVertexConstantBuffer; + ID3D11PixelShader* pPixelShader; + ID3D11SamplerState* pFontSampler; + ID3D11ShaderResourceView* pFontTextureView; + ID3D11RasterizerState* pRasterizerState; + ID3D11BlendState* pBlendState; + ID3D11DepthStencilState* pDepthStencilState; + int VertexBufferSize; + int IndexBufferSize; + + ImGui_ImplDX11_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; } +}; + +struct VERTEX_CONSTANT_BUFFER_DX11 +{ + float mvp[4][4]; +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +static void ImGui_ImplDX11_SetupRenderState(ImDrawData* draw_data, ID3D11DeviceContext* ctx) +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + + // Setup viewport + D3D11_VIEWPORT vp; + memset(&vp, 0, sizeof(D3D11_VIEWPORT)); + vp.Width = draw_data->DisplaySize.x; + vp.Height = draw_data->DisplaySize.y; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = vp.TopLeftY = 0; + ctx->RSSetViewports(1, &vp); + + // Setup shader and vertex buffers + unsigned int stride = sizeof(ImDrawVert); + unsigned int offset = 0; + ctx->IASetInputLayout(bd->pInputLayout); + ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset); + ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->VSSetShader(bd->pVertexShader, nullptr, 0); + ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer); + ctx->PSSetShader(bd->pPixelShader, nullptr, 0); + ctx->PSSetSamplers(0, 1, &bd->pFontSampler); + ctx->GSSetShader(nullptr, nullptr, 0); + ctx->HSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + ctx->DSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + ctx->CSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + + // Setup blend state + const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f }; + ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff); + ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0); + ctx->RSSetState(bd->pRasterizerState); +} + +// Render function +void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + ID3D11DeviceContext* ctx = bd->pd3dDeviceContext; + + // Create and grow vertex/index buffers if needed + if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount) + { + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + bd->VertexBufferSize = draw_data->TotalVtxCount + 5000; + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVB) < 0) + return; + } + if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount) + { + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + bd->IndexBufferSize = draw_data->TotalIdxCount + 10000; + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pIB) < 0) + return; + } + + // Upload vertex/index data into a single contiguous GPU buffer + D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource; + if (ctx->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK) + return; + if (ctx->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK) + return; + ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData; + ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + ctx->Unmap(bd->pVB, 0); + ctx->Unmap(bd->pIB, 0); + + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + { + D3D11_MAPPED_SUBRESOURCE mapped_resource; + if (ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK) + return; + VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mapped_resource.pData; + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + float mvp[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, + }; + memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); + ctx->Unmap(bd->pVertexConstantBuffer, 0); + } + + // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!) + struct BACKUP_DX11_STATE + { + UINT ScissorRectsCount, ViewportsCount; + D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + ID3D11RasterizerState* RS; + ID3D11BlendState* BlendState; + FLOAT BlendFactor[4]; + UINT SampleMask; + UINT StencilRef; + ID3D11DepthStencilState* DepthStencilState; + ID3D11ShaderResourceView* PSShaderResource; + ID3D11SamplerState* PSSampler; + ID3D11PixelShader* PS; + ID3D11VertexShader* VS; + ID3D11GeometryShader* GS; + UINT PSInstancesCount, VSInstancesCount, GSInstancesCount; + ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation + D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology; + ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer; + UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset; + DXGI_FORMAT IndexBufferFormat; + ID3D11InputLayout* InputLayout; + }; + BACKUP_DX11_STATE old = {}; + old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; + ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects); + ctx->RSGetViewports(&old.ViewportsCount, old.Viewports); + ctx->RSGetState(&old.RS); + ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask); + ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef); + ctx->PSGetShaderResources(0, 1, &old.PSShaderResource); + ctx->PSGetSamplers(0, 1, &old.PSSampler); + old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256; + ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount); + ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount); + ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer); + ctx->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount); + + ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology); + ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset); + ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); + ctx->IAGetInputLayout(&old.InputLayout); + + // Setup desired DX state + ImGui_ImplDX11_SetupRenderState(draw_data, ctx); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_idx_offset = 0; + int global_vtx_offset = 0; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplDX11_SetupRenderState(draw_data, ctx); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle + const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; + ctx->RSSetScissorRects(1, &r); + + // Bind texture, Draw + ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); + ctx->PSSetShaderResources(0, 1, &texture_srv); + ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } + + // Restore modified DX state + ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects); + ctx->RSSetViewports(old.ViewportsCount, old.Viewports); + ctx->RSSetState(old.RS); if (old.RS) old.RS->Release(); + ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release(); + ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release(); + ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release(); + ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release(); + ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release(); + for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release(); + ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release(); + ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release(); + ctx->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release(); + for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release(); + ctx->IASetPrimitiveTopology(old.PrimitiveTopology); + ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release(); + ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release(); + ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); +} + +static void ImGui_ImplDX11_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // Upload texture to graphics system + { + D3D11_TEXTURE2D_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Width = width; + desc.Height = height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + + ID3D11Texture2D* pTexture = nullptr; + D3D11_SUBRESOURCE_DATA subResource; + subResource.pSysMem = pixels; + subResource.SysMemPitch = desc.Width * 4; + subResource.SysMemSlicePitch = 0; + bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture); + IM_ASSERT(pTexture != nullptr); + + // Create texture view + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; + ZeroMemory(&srvDesc, sizeof(srvDesc)); + srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = desc.MipLevels; + srvDesc.Texture2D.MostDetailedMip = 0; + bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->pFontTextureView); + pTexture->Release(); + } + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView); + + // Create texture sampler + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + { + D3D11_SAMPLER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.MipLODBias = 0.f; + desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + desc.MinLOD = 0.f; + desc.MaxLOD = 0.f; + bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler); + } +} + +bool ImGui_ImplDX11_CreateDeviceObjects() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + if (!bd->pd3dDevice) + return false; + if (bd->pFontSampler) + ImGui_ImplDX11_InvalidateDeviceObjects(); + + // By using D3DCompile() from / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A) + // If you would like to use this DX11 sample code but remove this dependency you can: + // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution] + // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. + // See https://github.com/ocornut/imgui/pull/638 for sources and details. + + // Create the vertex shader + { + static const char* vertexShader = + "cbuffer vertexBuffer : register(b0) \ + {\ + float4x4 ProjectionMatrix; \ + };\ + struct VS_INPUT\ + {\ + float2 pos : POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + PS_INPUT main(VS_INPUT input)\ + {\ + PS_INPUT output;\ + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ + output.col = input.col;\ + output.uv = input.uv;\ + return output;\ + }"; + + ID3DBlob* vertexShaderBlob; + if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_4_0", 0, 0, &vertexShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), nullptr, &bd->pVertexShader) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + + // Create the input layout + D3D11_INPUT_ELEMENT_DESC local_layout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + vertexShaderBlob->Release(); + + // Create the constant buffer + { + D3D11_BUFFER_DESC desc; + desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVertexConstantBuffer); + } + } + + // Create the pixel shader + { + static const char* pixelShader = + "struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + sampler sampler0;\ + Texture2D texture0;\ + \ + float4 main(PS_INPUT input) : SV_Target\ + {\ + float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \ + return out_col; \ + }"; + + ID3DBlob* pixelShaderBlob; + if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_4_0", 0, 0, &pixelShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), nullptr, &bd->pPixelShader) != S_OK) + { + pixelShaderBlob->Release(); + return false; + } + pixelShaderBlob->Release(); + } + + // Create the blending setup + { + D3D11_BLEND_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.AlphaToCoverageEnable = false; + desc.RenderTarget[0].BlendEnable = true; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState); + } + + // Create the rasterizer state + { + D3D11_RASTERIZER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.FillMode = D3D11_FILL_SOLID; + desc.CullMode = D3D11_CULL_NONE; + desc.ScissorEnable = true; + desc.DepthClipEnable = true; + bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState); + } + + // Create depth-stencil State + { + D3D11_DEPTH_STENCIL_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.DepthEnable = false; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D11_COMPARISON_ALWAYS; + desc.StencilEnable = false; + desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + desc.BackFace = desc.FrontFace; + bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState); + } + + ImGui_ImplDX11_CreateFontsTexture(); + + return true; +} + +void ImGui_ImplDX11_InvalidateDeviceObjects() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + if (!bd->pd3dDevice) + return; + + if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = nullptr; } + if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied data->pFontTextureView to io.Fonts->TexID so let's clear that as well. + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; } + if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = nullptr; } + if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = nullptr; } + if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = nullptr; } + if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = nullptr; } + if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = nullptr; } + if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = nullptr; } +} + +bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_dx11"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + // Get factory from device + IDXGIDevice* pDXGIDevice = nullptr; + IDXGIAdapter* pDXGIAdapter = nullptr; + IDXGIFactory* pFactory = nullptr; + + if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK) + if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK) + if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK) + { + bd->pd3dDevice = device; + bd->pd3dDeviceContext = device_context; + bd->pFactory = pFactory; + } + if (pDXGIDevice) pDXGIDevice->Release(); + if (pDXGIAdapter) pDXGIAdapter->Release(); + bd->pd3dDevice->AddRef(); + bd->pd3dDeviceContext->AddRef(); + + return true; +} + +void ImGui_ImplDX11_Shutdown() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplDX11_InvalidateDeviceObjects(); + if (bd->pFactory) { bd->pFactory->Release(); } + if (bd->pd3dDevice) { bd->pd3dDevice->Release(); } + if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); } + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplDX11_NewFrame() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX11_Init()?"); + + if (!bd->pFontSampler) + ImGui_ImplDX11_CreateDeviceObjects(); +} diff --git a/ImGui/backends/imgui_impl_dx11.h b/ImGui/backends/imgui_impl_dx11.h new file mode 100644 index 0000000..f12d718 --- /dev/null +++ b/ImGui/backends/imgui_impl_dx11.h @@ -0,0 +1,26 @@ +// dear imgui: Renderer Backend for DirectX11 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct ID3D11Device; +struct ID3D11DeviceContext; + +IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context); +IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects(); +IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_dx12.cpp b/ImGui/backends/imgui_impl_dx12.cpp new file mode 100644 index 0000000..2e390d2 --- /dev/null +++ b/ImGui/backends/imgui_impl_dx12.cpp @@ -0,0 +1,752 @@ +// dear imgui: Renderer Backend for DirectX12 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'. +// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. +// To build this on 32-bit systems: +// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file) +// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like. +// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!) +// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file) + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: DirectX12: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: DirectX12: Change blending equation to preserve alpha in output buffer. +// 2021-01-11: DirectX12: Improve Windows 7 compatibility (for D3D12On7) by loading d3d12.dll dynamically. +// 2020-09-16: DirectX12: Avoid rendering calls with zero-sized scissor rectangle since it generates a validation layer warning. +// 2020-09-08: DirectX12: Clarified support for building on 32-bit systems by redefining ImTextureID. +// 2019-10-18: DirectX12: *BREAKING CHANGE* Added extra ID3D12DescriptorHeap parameter to ImGui_ImplDX12_Init() function. +// 2019-05-29: DirectX12: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: DirectX12: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-03-29: Misc: Various minor tidying up. +// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile(). +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-06-12: DirectX12: Moved the ID3D12GraphicsCommandList* parameter from NewFrame() to RenderDrawData(). +// 2018-06-08: Misc: Extracted imgui_impl_dx12.cpp/.h away from the old combined DX12+Win32 example. +// 2018-06-08: DirectX12: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle (to ease support for future multi-viewport). +// 2018-02-22: Merged into master with all Win32 code synchronized to other examples. + +#include "imgui.h" +#include "imgui_impl_dx12.h" + +// DirectX +#include +#include +#include +#ifdef _MSC_VER +#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below. +#endif + +// DirectX data +struct ImGui_ImplDX12_RenderBuffers; +struct ImGui_ImplDX12_Data +{ + ID3D12Device* pd3dDevice; + ID3D12RootSignature* pRootSignature; + ID3D12PipelineState* pPipelineState; + DXGI_FORMAT RTVFormat; + ID3D12Resource* pFontTextureResource; + D3D12_CPU_DESCRIPTOR_HANDLE hFontSrvCpuDescHandle; + D3D12_GPU_DESCRIPTOR_HANDLE hFontSrvGpuDescHandle; + ID3D12DescriptorHeap* pd3dSrvDescHeap; + UINT numFramesInFlight; + + ImGui_ImplDX12_RenderBuffers* pFrameResources; + UINT frameIndex; + + ImGui_ImplDX12_Data() { memset((void*)this, 0, sizeof(*this)); frameIndex = UINT_MAX; } +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplDX12_Data* ImGui_ImplDX12_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplDX12_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Buffers used during the rendering of a frame +struct ImGui_ImplDX12_RenderBuffers +{ + ID3D12Resource* IndexBuffer; + ID3D12Resource* VertexBuffer; + int IndexBufferSize; + int VertexBufferSize; +}; + +struct VERTEX_CONSTANT_BUFFER_DX12 +{ + float mvp[4][4]; +}; + +// Functions +static void ImGui_ImplDX12_SetupRenderState(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx, ImGui_ImplDX12_RenderBuffers* fr) +{ + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). + VERTEX_CONSTANT_BUFFER_DX12 vertex_constant_buffer; + { + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + float mvp[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, + }; + memcpy(&vertex_constant_buffer.mvp, mvp, sizeof(mvp)); + } + + // Setup viewport + D3D12_VIEWPORT vp; + memset(&vp, 0, sizeof(D3D12_VIEWPORT)); + vp.Width = draw_data->DisplaySize.x; + vp.Height = draw_data->DisplaySize.y; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = vp.TopLeftY = 0.0f; + ctx->RSSetViewports(1, &vp); + + // Bind shader and vertex buffers + unsigned int stride = sizeof(ImDrawVert); + unsigned int offset = 0; + D3D12_VERTEX_BUFFER_VIEW vbv; + memset(&vbv, 0, sizeof(D3D12_VERTEX_BUFFER_VIEW)); + vbv.BufferLocation = fr->VertexBuffer->GetGPUVirtualAddress() + offset; + vbv.SizeInBytes = fr->VertexBufferSize * stride; + vbv.StrideInBytes = stride; + ctx->IASetVertexBuffers(0, 1, &vbv); + D3D12_INDEX_BUFFER_VIEW ibv; + memset(&ibv, 0, sizeof(D3D12_INDEX_BUFFER_VIEW)); + ibv.BufferLocation = fr->IndexBuffer->GetGPUVirtualAddress(); + ibv.SizeInBytes = fr->IndexBufferSize * sizeof(ImDrawIdx); + ibv.Format = sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT; + ctx->IASetIndexBuffer(&ibv); + ctx->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->SetPipelineState(bd->pPipelineState); + ctx->SetGraphicsRootSignature(bd->pRootSignature); + ctx->SetGraphicsRoot32BitConstants(0, 16, &vertex_constant_buffer, 0); + + // Setup blend factor + const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f }; + ctx->OMSetBlendFactor(blend_factor); +} + +template +static inline void SafeRelease(T*& res) +{ + if (res) + res->Release(); + res = nullptr; +} + +// Render function +void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* ctx) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + // FIXME: I'm assuming that this only gets called once per frame! + // If not, we can't just re-allocate the IB or VB, we'll have to do a proper allocator. + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + bd->frameIndex = bd->frameIndex + 1; + ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[bd->frameIndex % bd->numFramesInFlight]; + + // Create and grow vertex/index buffers if needed + if (fr->VertexBuffer == nullptr || fr->VertexBufferSize < draw_data->TotalVtxCount) + { + SafeRelease(fr->VertexBuffer); + fr->VertexBufferSize = draw_data->TotalVtxCount + 5000; + D3D12_HEAP_PROPERTIES props; + memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES)); + props.Type = D3D12_HEAP_TYPE_UPLOAD; + props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + D3D12_RESOURCE_DESC desc; + memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC)); + desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + desc.Width = fr->VertexBufferSize * sizeof(ImDrawVert); + desc.Height = 1; + desc.DepthOrArraySize = 1; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_UNKNOWN; + desc.SampleDesc.Count = 1; + desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + desc.Flags = D3D12_RESOURCE_FLAG_NONE; + if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&fr->VertexBuffer)) < 0) + return; + } + if (fr->IndexBuffer == nullptr || fr->IndexBufferSize < draw_data->TotalIdxCount) + { + SafeRelease(fr->IndexBuffer); + fr->IndexBufferSize = draw_data->TotalIdxCount + 10000; + D3D12_HEAP_PROPERTIES props; + memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES)); + props.Type = D3D12_HEAP_TYPE_UPLOAD; + props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + D3D12_RESOURCE_DESC desc; + memset(&desc, 0, sizeof(D3D12_RESOURCE_DESC)); + desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + desc.Width = fr->IndexBufferSize * sizeof(ImDrawIdx); + desc.Height = 1; + desc.DepthOrArraySize = 1; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_UNKNOWN; + desc.SampleDesc.Count = 1; + desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + desc.Flags = D3D12_RESOURCE_FLAG_NONE; + if (bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&fr->IndexBuffer)) < 0) + return; + } + + // Upload vertex/index data into a single contiguous GPU buffer + void* vtx_resource, *idx_resource; + D3D12_RANGE range; + memset(&range, 0, sizeof(D3D12_RANGE)); + if (fr->VertexBuffer->Map(0, &range, &vtx_resource) != S_OK) + return; + if (fr->IndexBuffer->Map(0, &range, &idx_resource) != S_OK) + return; + ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource; + ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + fr->VertexBuffer->Unmap(0, &range); + fr->IndexBuffer->Unmap(0, &range); + + // Setup desired DX state + ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_vtx_offset = 0; + int global_idx_offset = 0; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplDX12_SetupRenderState(draw_data, ctx, fr); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply Scissor/clipping rectangle, Bind texture, Draw + const D3D12_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; + D3D12_GPU_DESCRIPTOR_HANDLE texture_handle = {}; + texture_handle.ptr = (UINT64)pcmd->GetTexID(); + ctx->SetGraphicsRootDescriptorTable(1, texture_handle); + ctx->RSSetScissorRects(1, &r); + ctx->DrawIndexedInstanced(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } +} + +static void ImGui_ImplDX12_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // Upload texture to graphics system + { + D3D12_HEAP_PROPERTIES props; + memset(&props, 0, sizeof(D3D12_HEAP_PROPERTIES)); + props.Type = D3D12_HEAP_TYPE_DEFAULT; + props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + + D3D12_RESOURCE_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + desc.Alignment = 0; + desc.Width = width; + desc.Height = height; + desc.DepthOrArraySize = 1; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + desc.Flags = D3D12_RESOURCE_FLAG_NONE; + + ID3D12Resource* pTexture = nullptr; + bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, + D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(&pTexture)); + + UINT uploadPitch = (width * 4 + D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u) & ~(D3D12_TEXTURE_DATA_PITCH_ALIGNMENT - 1u); + UINT uploadSize = height * uploadPitch; + desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + desc.Alignment = 0; + desc.Width = uploadSize; + desc.Height = 1; + desc.DepthOrArraySize = 1; + desc.MipLevels = 1; + desc.Format = DXGI_FORMAT_UNKNOWN; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + desc.Flags = D3D12_RESOURCE_FLAG_NONE; + + props.Type = D3D12_HEAP_TYPE_UPLOAD; + props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; + props.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; + + ID3D12Resource* uploadBuffer = nullptr; + HRESULT hr = bd->pd3dDevice->CreateCommittedResource(&props, D3D12_HEAP_FLAG_NONE, &desc, + D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&uploadBuffer)); + IM_ASSERT(SUCCEEDED(hr)); + + void* mapped = nullptr; + D3D12_RANGE range = { 0, uploadSize }; + hr = uploadBuffer->Map(0, &range, &mapped); + IM_ASSERT(SUCCEEDED(hr)); + for (int y = 0; y < height; y++) + memcpy((void*) ((uintptr_t) mapped + y * uploadPitch), pixels + y * width * 4, width * 4); + uploadBuffer->Unmap(0, &range); + + D3D12_TEXTURE_COPY_LOCATION srcLocation = {}; + srcLocation.pResource = uploadBuffer; + srcLocation.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT; + srcLocation.PlacedFootprint.Footprint.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srcLocation.PlacedFootprint.Footprint.Width = width; + srcLocation.PlacedFootprint.Footprint.Height = height; + srcLocation.PlacedFootprint.Footprint.Depth = 1; + srcLocation.PlacedFootprint.Footprint.RowPitch = uploadPitch; + + D3D12_TEXTURE_COPY_LOCATION dstLocation = {}; + dstLocation.pResource = pTexture; + dstLocation.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dstLocation.SubresourceIndex = 0; + + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = pTexture; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE; + + ID3D12Fence* fence = nullptr; + hr = bd->pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&fence)); + IM_ASSERT(SUCCEEDED(hr)); + + HANDLE event = CreateEvent(0, 0, 0, 0); + IM_ASSERT(event != nullptr); + + D3D12_COMMAND_QUEUE_DESC queueDesc = {}; + queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + queueDesc.NodeMask = 1; + + ID3D12CommandQueue* cmdQueue = nullptr; + hr = bd->pd3dDevice->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&cmdQueue)); + IM_ASSERT(SUCCEEDED(hr)); + + ID3D12CommandAllocator* cmdAlloc = nullptr; + hr = bd->pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&cmdAlloc)); + IM_ASSERT(SUCCEEDED(hr)); + + ID3D12GraphicsCommandList* cmdList = nullptr; + hr = bd->pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, cmdAlloc, nullptr, IID_PPV_ARGS(&cmdList)); + IM_ASSERT(SUCCEEDED(hr)); + + cmdList->CopyTextureRegion(&dstLocation, 0, 0, 0, &srcLocation, nullptr); + cmdList->ResourceBarrier(1, &barrier); + + hr = cmdList->Close(); + IM_ASSERT(SUCCEEDED(hr)); + + cmdQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&cmdList); + hr = cmdQueue->Signal(fence, 1); + IM_ASSERT(SUCCEEDED(hr)); + + fence->SetEventOnCompletion(1, event); + WaitForSingleObject(event, INFINITE); + + cmdList->Release(); + cmdAlloc->Release(); + cmdQueue->Release(); + CloseHandle(event); + fence->Release(); + uploadBuffer->Release(); + + // Create texture view + D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc; + ZeroMemory(&srvDesc, sizeof(srvDesc)); + srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = desc.MipLevels; + srvDesc.Texture2D.MostDetailedMip = 0; + srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; + bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, bd->hFontSrvCpuDescHandle); + SafeRelease(bd->pFontTextureResource); + bd->pFontTextureResource = pTexture; + } + + // Store our identifier + // READ THIS IF THE STATIC_ASSERT() TRIGGERS: + // - Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'. + // - This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. + // [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in the 'example_win32_direct12/example_win32_direct12.vcxproj' project file) + // [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like. + // [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!) + // [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in the example_win32_direct12/build_win32.bat file) + static_assert(sizeof(ImTextureID) >= sizeof(bd->hFontSrvGpuDescHandle.ptr), "Can't pack descriptor handle into TexID, 32-bit not supported yet."); + io.Fonts->SetTexID((ImTextureID)bd->hFontSrvGpuDescHandle.ptr); +} + +bool ImGui_ImplDX12_CreateDeviceObjects() +{ + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + if (!bd || !bd->pd3dDevice) + return false; + if (bd->pPipelineState) + ImGui_ImplDX12_InvalidateDeviceObjects(); + + // Create the root signature + { + D3D12_DESCRIPTOR_RANGE descRange = {}; + descRange.RangeType = D3D12_DESCRIPTOR_RANGE_TYPE_SRV; + descRange.NumDescriptors = 1; + descRange.BaseShaderRegister = 0; + descRange.RegisterSpace = 0; + descRange.OffsetInDescriptorsFromTableStart = 0; + + D3D12_ROOT_PARAMETER param[2] = {}; + + param[0].ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; + param[0].Constants.ShaderRegister = 0; + param[0].Constants.RegisterSpace = 0; + param[0].Constants.Num32BitValues = 16; + param[0].ShaderVisibility = D3D12_SHADER_VISIBILITY_VERTEX; + + param[1].ParameterType = D3D12_ROOT_PARAMETER_TYPE_DESCRIPTOR_TABLE; + param[1].DescriptorTable.NumDescriptorRanges = 1; + param[1].DescriptorTable.pDescriptorRanges = &descRange; + param[1].ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL; + + // Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling. + D3D12_STATIC_SAMPLER_DESC staticSampler = {}; + staticSampler.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR; + staticSampler.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + staticSampler.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + staticSampler.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP; + staticSampler.MipLODBias = 0.f; + staticSampler.MaxAnisotropy = 0; + staticSampler.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS; + staticSampler.BorderColor = D3D12_STATIC_BORDER_COLOR_TRANSPARENT_BLACK; + staticSampler.MinLOD = 0.f; + staticSampler.MaxLOD = 0.f; + staticSampler.ShaderRegister = 0; + staticSampler.RegisterSpace = 0; + staticSampler.ShaderVisibility = D3D12_SHADER_VISIBILITY_PIXEL; + + D3D12_ROOT_SIGNATURE_DESC desc = {}; + desc.NumParameters = _countof(param); + desc.pParameters = param; + desc.NumStaticSamplers = 1; + desc.pStaticSamplers = &staticSampler; + desc.Flags = + D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | + D3D12_ROOT_SIGNATURE_FLAG_DENY_HULL_SHADER_ROOT_ACCESS | + D3D12_ROOT_SIGNATURE_FLAG_DENY_DOMAIN_SHADER_ROOT_ACCESS | + D3D12_ROOT_SIGNATURE_FLAG_DENY_GEOMETRY_SHADER_ROOT_ACCESS; + + // Load d3d12.dll and D3D12SerializeRootSignature() function address dynamically to facilitate using with D3D12On7. + // See if any version of d3d12.dll is already loaded in the process. If so, give preference to that. + static HINSTANCE d3d12_dll = ::GetModuleHandleA("d3d12.dll"); + if (d3d12_dll == nullptr) + { + // Attempt to load d3d12.dll from local directories. This will only succeed if + // (1) the current OS is Windows 7, and + // (2) there exists a version of d3d12.dll for Windows 7 (D3D12On7) in one of the following directories. + // See https://github.com/ocornut/imgui/pull/3696 for details. + const char* localD3d12Paths[] = { ".\\d3d12.dll", ".\\d3d12on7\\d3d12.dll", ".\\12on7\\d3d12.dll" }; // A. current directory, B. used by some games, C. used in Microsoft D3D12On7 sample + for (int i = 0; i < IM_ARRAYSIZE(localD3d12Paths); i++) + if ((d3d12_dll = ::LoadLibraryA(localD3d12Paths[i])) != nullptr) + break; + + // If failed, we are on Windows >= 10. + if (d3d12_dll == nullptr) + d3d12_dll = ::LoadLibraryA("d3d12.dll"); + + if (d3d12_dll == nullptr) + return false; + } + + PFN_D3D12_SERIALIZE_ROOT_SIGNATURE D3D12SerializeRootSignatureFn = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)::GetProcAddress(d3d12_dll, "D3D12SerializeRootSignature"); + if (D3D12SerializeRootSignatureFn == nullptr) + return false; + + ID3DBlob* blob = nullptr; + if (D3D12SerializeRootSignatureFn(&desc, D3D_ROOT_SIGNATURE_VERSION_1, &blob, nullptr) != S_OK) + return false; + + bd->pd3dDevice->CreateRootSignature(0, blob->GetBufferPointer(), blob->GetBufferSize(), IID_PPV_ARGS(&bd->pRootSignature)); + blob->Release(); + } + + // By using D3DCompile() from / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A) + // If you would like to use this DX12 sample code but remove this dependency you can: + // 1) compile once, save the compiled shader blobs into a file or source code and assign them to psoDesc.VS/PS [preferred solution] + // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. + // See https://github.com/ocornut/imgui/pull/638 for sources and details. + + D3D12_GRAPHICS_PIPELINE_STATE_DESC psoDesc; + memset(&psoDesc, 0, sizeof(D3D12_GRAPHICS_PIPELINE_STATE_DESC)); + psoDesc.NodeMask = 1; + psoDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + psoDesc.pRootSignature = bd->pRootSignature; + psoDesc.SampleMask = UINT_MAX; + psoDesc.NumRenderTargets = 1; + psoDesc.RTVFormats[0] = bd->RTVFormat; + psoDesc.SampleDesc.Count = 1; + psoDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE; + + ID3DBlob* vertexShaderBlob; + ID3DBlob* pixelShaderBlob; + + // Create the vertex shader + { + static const char* vertexShader = + "cbuffer vertexBuffer : register(b0) \ + {\ + float4x4 ProjectionMatrix; \ + };\ + struct VS_INPUT\ + {\ + float2 pos : POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + PS_INPUT main(VS_INPUT input)\ + {\ + PS_INPUT output;\ + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ + output.col = input.col;\ + output.uv = input.uv;\ + return output;\ + }"; + + if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_5_0", 0, 0, &vertexShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + psoDesc.VS = { vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize() }; + + // Create the input layout + static D3D12_INPUT_ELEMENT_DESC local_layout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }, + }; + psoDesc.InputLayout = { local_layout, 3 }; + } + + // Create the pixel shader + { + static const char* pixelShader = + "struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + SamplerState sampler0 : register(s0);\ + Texture2D texture0 : register(t0);\ + \ + float4 main(PS_INPUT input) : SV_Target\ + {\ + float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \ + return out_col; \ + }"; + + if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_5_0", 0, 0, &pixelShaderBlob, nullptr))) + { + vertexShaderBlob->Release(); + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + } + psoDesc.PS = { pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize() }; + } + + // Create the blending setup + { + D3D12_BLEND_DESC& desc = psoDesc.BlendState; + desc.AlphaToCoverageEnable = false; + desc.RenderTarget[0].BlendEnable = true; + desc.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; + } + + // Create the rasterizer state + { + D3D12_RASTERIZER_DESC& desc = psoDesc.RasterizerState; + desc.FillMode = D3D12_FILL_MODE_SOLID; + desc.CullMode = D3D12_CULL_MODE_NONE; + desc.FrontCounterClockwise = FALSE; + desc.DepthBias = D3D12_DEFAULT_DEPTH_BIAS; + desc.DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP; + desc.SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; + desc.DepthClipEnable = true; + desc.MultisampleEnable = FALSE; + desc.AntialiasedLineEnable = FALSE; + desc.ForcedSampleCount = 0; + desc.ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF; + } + + // Create depth-stencil State + { + D3D12_DEPTH_STENCIL_DESC& desc = psoDesc.DepthStencilState; + desc.DepthEnable = false; + desc.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D12_COMPARISON_FUNC_ALWAYS; + desc.StencilEnable = false; + desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D12_STENCIL_OP_KEEP; + desc.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS; + desc.BackFace = desc.FrontFace; + } + + HRESULT result_pipeline_state = bd->pd3dDevice->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&bd->pPipelineState)); + vertexShaderBlob->Release(); + pixelShaderBlob->Release(); + if (result_pipeline_state != S_OK) + return false; + + ImGui_ImplDX12_CreateFontsTexture(); + + return true; +} + +void ImGui_ImplDX12_InvalidateDeviceObjects() +{ + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + if (!bd || !bd->pd3dDevice) + return; + + ImGuiIO& io = ImGui::GetIO(); + SafeRelease(bd->pRootSignature); + SafeRelease(bd->pPipelineState); + SafeRelease(bd->pFontTextureResource); + io.Fonts->SetTexID(0); // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well. + + for (UINT i = 0; i < bd->numFramesInFlight; i++) + { + ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i]; + SafeRelease(fr->IndexBuffer); + SafeRelease(fr->VertexBuffer); + } +} + +bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap, + D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplDX12_Data* bd = IM_NEW(ImGui_ImplDX12_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_dx12"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + bd->pd3dDevice = device; + bd->RTVFormat = rtv_format; + bd->hFontSrvCpuDescHandle = font_srv_cpu_desc_handle; + bd->hFontSrvGpuDescHandle = font_srv_gpu_desc_handle; + bd->pFrameResources = new ImGui_ImplDX12_RenderBuffers[num_frames_in_flight]; + bd->numFramesInFlight = num_frames_in_flight; + bd->pd3dSrvDescHeap = cbv_srv_heap; + bd->frameIndex = UINT_MAX; + + // Create buffers with a default size (they will later be grown as needed) + for (int i = 0; i < num_frames_in_flight; i++) + { + ImGui_ImplDX12_RenderBuffers* fr = &bd->pFrameResources[i]; + fr->IndexBuffer = nullptr; + fr->VertexBuffer = nullptr; + fr->IndexBufferSize = 10000; + fr->VertexBufferSize = 5000; + } + + return true; +} + +void ImGui_ImplDX12_Shutdown() +{ + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + // Clean up windows and device objects + ImGui_ImplDX12_InvalidateDeviceObjects(); + delete[] bd->pFrameResources; + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplDX12_NewFrame() +{ + ImGui_ImplDX12_Data* bd = ImGui_ImplDX12_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX12_Init()?"); + + if (!bd->pPipelineState) + ImGui_ImplDX12_CreateDeviceObjects(); +} diff --git a/ImGui/backends/imgui_impl_dx12.h b/ImGui/backends/imgui_impl_dx12.h new file mode 100644 index 0000000..ea6d33b --- /dev/null +++ b/ImGui/backends/imgui_impl_dx12.h @@ -0,0 +1,38 @@ +// dear imgui: Renderer Backend for DirectX12 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'D3D12_GPU_DESCRIPTOR_HANDLE' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// Important: to compile on 32-bit systems, this backend requires code to be compiled with '#define ImTextureID ImU64'. +// See imgui_impl_dx12.cpp file for details. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API +#include // DXGI_FORMAT + +struct ID3D12Device; +struct ID3D12DescriptorHeap; +struct ID3D12GraphicsCommandList; +struct D3D12_CPU_DESCRIPTOR_HANDLE; +struct D3D12_GPU_DESCRIPTOR_HANDLE; + +// cmd_list is the command list that the implementation will use to render imgui draw lists. +// Before calling the render function, caller must prepare cmd_list by resetting it and setting the appropriate +// render target and descriptor heap that contains font_srv_cpu_desc_handle/font_srv_gpu_desc_handle. +// font_srv_cpu_desc_handle and font_srv_gpu_desc_handle are handles to a single SRV descriptor to use for the internal font texture. +IMGUI_IMPL_API bool ImGui_ImplDX12_Init(ID3D12Device* device, int num_frames_in_flight, DXGI_FORMAT rtv_format, ID3D12DescriptorHeap* cbv_srv_heap, + D3D12_CPU_DESCRIPTOR_HANDLE font_srv_cpu_desc_handle, D3D12_GPU_DESCRIPTOR_HANDLE font_srv_gpu_desc_handle); +IMGUI_IMPL_API void ImGui_ImplDX12_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplDX12_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX12_RenderDrawData(ImDrawData* draw_data, ID3D12GraphicsCommandList* graphics_command_list); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API void ImGui_ImplDX12_InvalidateDeviceObjects(); +IMGUI_IMPL_API bool ImGui_ImplDX12_CreateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_dx9.cpp b/ImGui/backends/imgui_impl_dx9.cpp new file mode 100644 index 0000000..61e9d6e --- /dev/null +++ b/ImGui/backends/imgui_impl_dx9.cpp @@ -0,0 +1,379 @@ +// dear imgui: Renderer Backend for DirectX9 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-06-25: DirectX9: Explicitly disable texture state stages after >= 1. +// 2021-05-19: DirectX9: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-04-23: DirectX9: Explicitly setting up more graphics states to increase compatibility with unusual non-default states. +// 2021-03-18: DirectX9: Calling IDirect3DStateBlock9::Capture() after CreateStateBlock() as a workaround for state restoring issues (see #3857). +// 2021-03-03: DirectX9: Added support for IMGUI_USE_BGRA_PACKED_COLOR in user's imconfig file. +// 2021-02-18: DirectX9: Change blending equation to preserve alpha in output buffer. +// 2019-05-29: DirectX9: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: DirectX9: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-03-29: Misc: Fixed erroneous assert in ImGui_ImplDX9_InvalidateDeviceObjects(). +// 2019-01-16: Misc: Disabled fog before drawing UI's. Fixes issue #2288. +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-06-08: Misc: Extracted imgui_impl_dx9.cpp/.h away from the old combined DX9+Win32 example. +// 2018-06-08: DirectX9: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-05-07: Render: Saving/restoring Transform because they don't seem to be included in the StateBlock. Setting shading mode to Gouraud. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX9_RenderDrawData() in the .h file so you can call it yourself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. + +#include "imgui.h" +#include "imgui_impl_dx9.h" + +// DirectX +#include + +// DirectX data +struct ImGui_ImplDX9_Data +{ + LPDIRECT3DDEVICE9 pd3dDevice; + LPDIRECT3DVERTEXBUFFER9 pVB; + LPDIRECT3DINDEXBUFFER9 pIB; + LPDIRECT3DTEXTURE9 FontTexture; + int VertexBufferSize; + int IndexBufferSize; + + ImGui_ImplDX9_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; } +}; + +struct CUSTOMVERTEX +{ + float pos[3]; + D3DCOLOR col; + float uv[2]; +}; +#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1) + +#ifdef IMGUI_USE_BGRA_PACKED_COLOR +#define IMGUI_COL_TO_DX9_ARGB(_COL) (_COL) +#else +#define IMGUI_COL_TO_DX9_ARGB(_COL) (((_COL) & 0xFF00FF00) | (((_COL) & 0xFF0000) >> 16) | (((_COL) & 0xFF) << 16)) +#endif + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplDX9_Data* ImGui_ImplDX9_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplDX9_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +static void ImGui_ImplDX9_SetupRenderState(ImDrawData* draw_data) +{ + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + + // Setup viewport + D3DVIEWPORT9 vp; + vp.X = vp.Y = 0; + vp.Width = (DWORD)draw_data->DisplaySize.x; + vp.Height = (DWORD)draw_data->DisplaySize.y; + vp.MinZ = 0.0f; + vp.MaxZ = 1.0f; + bd->pd3dDevice->SetViewport(&vp); + + // Setup render state: fixed-pipeline, alpha-blending, no face culling, no depth testing, shade mode (for gradient), bilinear sampling. + bd->pd3dDevice->SetPixelShader(nullptr); + bd->pd3dDevice->SetVertexShader(nullptr); + bd->pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + bd->pd3dDevice->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD); + bd->pd3dDevice->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + bd->pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + bd->pd3dDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + bd->pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + bd->pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + bd->pd3dDevice->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE); + bd->pd3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ONE); + bd->pd3dDevice->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA); + bd->pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); + bd->pd3dDevice->SetRenderState(D3DRS_FOGENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_RANGEFOGENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE); + bd->pd3dDevice->SetRenderState(D3DRS_CLIPPING, TRUE); + bd->pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + bd->pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); + bd->pd3dDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE); + bd->pd3dDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); + bd->pd3dDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); + + // Setup orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + // Being agnostic of whether or can be used, we aren't relying on D3DXMatrixIdentity()/D3DXMatrixOrthoOffCenterLH() or DirectX::XMMatrixIdentity()/DirectX::XMMatrixOrthographicOffCenterLH() + { + float L = draw_data->DisplayPos.x + 0.5f; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x + 0.5f; + float T = draw_data->DisplayPos.y + 0.5f; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y + 0.5f; + D3DMATRIX mat_identity = { { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f } } }; + D3DMATRIX mat_projection = + { { { + 2.0f/(R-L), 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f/(T-B), 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + (L+R)/(L-R), (T+B)/(B-T), 0.5f, 1.0f + } } }; + bd->pd3dDevice->SetTransform(D3DTS_WORLD, &mat_identity); + bd->pd3dDevice->SetTransform(D3DTS_VIEW, &mat_identity); + bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &mat_projection); + } +} + +// Render function. +void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + // Create and grow buffers if needed + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount) + { + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + bd->VertexBufferSize = draw_data->TotalVtxCount + 5000; + if (bd->pd3dDevice->CreateVertexBuffer(bd->VertexBufferSize * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &bd->pVB, nullptr) < 0) + return; + } + if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount) + { + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + bd->IndexBufferSize = draw_data->TotalIdxCount + 10000; + if (bd->pd3dDevice->CreateIndexBuffer(bd->IndexBufferSize * sizeof(ImDrawIdx), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, sizeof(ImDrawIdx) == 2 ? D3DFMT_INDEX16 : D3DFMT_INDEX32, D3DPOOL_DEFAULT, &bd->pIB, nullptr) < 0) + return; + } + + // Backup the DX9 state + IDirect3DStateBlock9* d3d9_state_block = nullptr; + if (bd->pd3dDevice->CreateStateBlock(D3DSBT_ALL, &d3d9_state_block) < 0) + return; + if (d3d9_state_block->Capture() < 0) + { + d3d9_state_block->Release(); + return; + } + + // Backup the DX9 transform (DX9 documentation suggests that it is included in the StateBlock but it doesn't appear to) + D3DMATRIX last_world, last_view, last_projection; + bd->pd3dDevice->GetTransform(D3DTS_WORLD, &last_world); + bd->pd3dDevice->GetTransform(D3DTS_VIEW, &last_view); + bd->pd3dDevice->GetTransform(D3DTS_PROJECTION, &last_projection); + + // Allocate buffers + CUSTOMVERTEX* vtx_dst; + ImDrawIdx* idx_dst; + if (bd->pVB->Lock(0, (UINT)(draw_data->TotalVtxCount * sizeof(CUSTOMVERTEX)), (void**)&vtx_dst, D3DLOCK_DISCARD) < 0) + { + d3d9_state_block->Release(); + return; + } + if (bd->pIB->Lock(0, (UINT)(draw_data->TotalIdxCount * sizeof(ImDrawIdx)), (void**)&idx_dst, D3DLOCK_DISCARD) < 0) + { + bd->pVB->Unlock(); + d3d9_state_block->Release(); + return; + } + + // Copy and convert all vertices into a single contiguous buffer, convert colors to DX9 default format. + // FIXME-OPT: This is a minor waste of resource, the ideal is to use imconfig.h and + // 1) to avoid repacking colors: #define IMGUI_USE_BGRA_PACKED_COLOR + // 2) to avoid repacking vertices: #define IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT struct ImDrawVert { ImVec2 pos; float z; ImU32 col; ImVec2 uv; } + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + const ImDrawVert* vtx_src = cmd_list->VtxBuffer.Data; + for (int i = 0; i < cmd_list->VtxBuffer.Size; i++) + { + vtx_dst->pos[0] = vtx_src->pos.x; + vtx_dst->pos[1] = vtx_src->pos.y; + vtx_dst->pos[2] = 0.0f; + vtx_dst->col = IMGUI_COL_TO_DX9_ARGB(vtx_src->col); + vtx_dst->uv[0] = vtx_src->uv.x; + vtx_dst->uv[1] = vtx_src->uv.y; + vtx_dst++; + vtx_src++; + } + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + idx_dst += cmd_list->IdxBuffer.Size; + } + bd->pVB->Unlock(); + bd->pIB->Unlock(); + bd->pd3dDevice->SetStreamSource(0, bd->pVB, 0, sizeof(CUSTOMVERTEX)); + bd->pd3dDevice->SetIndices(bd->pIB); + bd->pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); + + // Setup desired DX state + ImGui_ImplDX9_SetupRenderState(draw_data); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_vtx_offset = 0; + int global_idx_offset = 0; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplDX9_SetupRenderState(draw_data); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply Scissor/clipping rectangle, Bind texture, Draw + const RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; + const LPDIRECT3DTEXTURE9 texture = (LPDIRECT3DTEXTURE9)pcmd->GetTexID(); + bd->pd3dDevice->SetTexture(0, texture); + bd->pd3dDevice->SetScissorRect(&r); + bd->pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, pcmd->VtxOffset + global_vtx_offset, 0, (UINT)cmd_list->VtxBuffer.Size, pcmd->IdxOffset + global_idx_offset, pcmd->ElemCount / 3); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } + + // Restore the DX9 transform + bd->pd3dDevice->SetTransform(D3DTS_WORLD, &last_world); + bd->pd3dDevice->SetTransform(D3DTS_VIEW, &last_view); + bd->pd3dDevice->SetTransform(D3DTS_PROJECTION, &last_projection); + + // Restore the DX9 state + d3d9_state_block->Apply(); + d3d9_state_block->Release(); +} + +bool ImGui_ImplDX9_Init(IDirect3DDevice9* device) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplDX9_Data* bd = IM_NEW(ImGui_ImplDX9_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_dx9"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + bd->pd3dDevice = device; + bd->pd3dDevice->AddRef(); + + return true; +} + +void ImGui_ImplDX9_Shutdown() +{ + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplDX9_InvalidateDeviceObjects(); + if (bd->pd3dDevice) { bd->pd3dDevice->Release(); } + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +static bool ImGui_ImplDX9_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + unsigned char* pixels; + int width, height, bytes_per_pixel; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &bytes_per_pixel); + + // Convert RGBA32 to BGRA32 (because RGBA32 is not well supported by DX9 devices) +#ifndef IMGUI_USE_BGRA_PACKED_COLOR + if (io.Fonts->TexPixelsUseColors) + { + ImU32* dst_start = (ImU32*)ImGui::MemAlloc((size_t)width * height * bytes_per_pixel); + for (ImU32* src = (ImU32*)pixels, *dst = dst_start, *dst_end = dst_start + (size_t)width * height; dst < dst_end; src++, dst++) + *dst = IMGUI_COL_TO_DX9_ARGB(*src); + pixels = (unsigned char*)dst_start; + } +#endif + + // Upload texture to graphics system + bd->FontTexture = nullptr; + if (bd->pd3dDevice->CreateTexture(width, height, 1, D3DUSAGE_DYNAMIC, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &bd->FontTexture, nullptr) < 0) + return false; + D3DLOCKED_RECT tex_locked_rect; + if (bd->FontTexture->LockRect(0, &tex_locked_rect, nullptr, 0) != D3D_OK) + return false; + for (int y = 0; y < height; y++) + memcpy((unsigned char*)tex_locked_rect.pBits + (size_t)tex_locked_rect.Pitch * y, pixels + (size_t)width * bytes_per_pixel * y, (size_t)width * bytes_per_pixel); + bd->FontTexture->UnlockRect(0); + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)bd->FontTexture); + +#ifndef IMGUI_USE_BGRA_PACKED_COLOR + if (io.Fonts->TexPixelsUseColors) + ImGui::MemFree(pixels); +#endif + + return true; +} + +bool ImGui_ImplDX9_CreateDeviceObjects() +{ + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + if (!bd || !bd->pd3dDevice) + return false; + if (!ImGui_ImplDX9_CreateFontsTexture()) + return false; + return true; +} + +void ImGui_ImplDX9_InvalidateDeviceObjects() +{ + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + if (!bd || !bd->pd3dDevice) + return; + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + if (bd->FontTexture) { bd->FontTexture->Release(); bd->FontTexture = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied bd->pFontTextureView to io.Fonts->TexID so let's clear that as well. +} + +void ImGui_ImplDX9_NewFrame() +{ + ImGui_ImplDX9_Data* bd = ImGui_ImplDX9_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX9_Init()?"); + + if (!bd->FontTexture) + ImGui_ImplDX9_CreateDeviceObjects(); +} diff --git a/ImGui/backends/imgui_impl_dx9.h b/ImGui/backends/imgui_impl_dx9.h new file mode 100644 index 0000000..32e89ec --- /dev/null +++ b/ImGui/backends/imgui_impl_dx9.h @@ -0,0 +1,25 @@ +// dear imgui: Renderer Backend for DirectX9 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'LPDIRECT3DTEXTURE9' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct IDirect3DDevice9; + +IMGUI_IMPL_API bool ImGui_ImplDX9_Init(IDirect3DDevice9* device); +IMGUI_IMPL_API void ImGui_ImplDX9_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplDX9_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX9_RenderDrawData(ImDrawData* draw_data); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API bool ImGui_ImplDX9_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplDX9_InvalidateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_glfw.cpp b/ImGui/backends/imgui_impl_glfw.cpp new file mode 100644 index 0000000..f0e70a6 --- /dev/null +++ b/ImGui/backends/imgui_impl_glfw.cpp @@ -0,0 +1,745 @@ +// dear imgui: Platform Backend for GLFW +// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..) +// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.) +// (Requires: GLFW 3.1+. Prefer GLFW 3.3+ or GLFW 3.4+ for full feature support.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLFW_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange' (note: the resizing cursors requires GLFW 3.4+). + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-03: Emscripten: Registering custom low-level mouse wheel handler to get more accurate scrolling impulses on Emscripten. (#4019, #6096) +// 2023-01-04: Inputs: Fixed mods state on Linux when using Alt-GR text input (e.g. German keyboard layout), could lead to broken text input. Revert a 2022/01/17 change were we resumed using mods provided by GLFW, turns out they were faulty. +// 2022-11-22: Perform a dummy glfwGetError() read to cancel missing names with glfwGetKeyName(). (#5908) +// 2022-10-18: Perform a dummy glfwGetError() read to cancel missing mouse cursors errors. Using GLFW_VERSION_COMBINED directly. (#5785) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-09-01: Inputs: Honor GLFW_CURSOR_DISABLED by not setting mouse position. +// 2022-04-30: Inputs: Fixed ImGui_ImplGlfw_TranslateUntranslatedKey() for lower case letters on OSX. +// 2022-03-23: Inputs: Fixed a regression in 1.87 which resulted in keyboard modifiers events being reported incorrectly on Linux/X11. +// 2022-02-07: Added ImGui_ImplGlfw_InstallCallbacks()/ImGui_ImplGlfw_RestoreCallbacks() helpers to facilitate user installing callbacks after initializing backend. +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-17: Inputs: always update key mods next and before key event (not in NewFrame) to fix input queue with very low framerates. +// 2022-01-12: *BREAKING CHANGE*: Now using glfwSetCursorPosCallback(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetCursorPosCallback() and forward it to the backend via ImGui_ImplGlfw_CursorPosCallback(). +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2022-01-05: Inputs: Converting GLFW untranslated keycodes back to translated keycodes (in the ImGui_ImplGlfw_KeyCallback() function) in order to match the behavior of every other backend, and facilitate the use of GLFW with lettered-shortcuts API. +// 2021-08-17: *BREAKING CHANGE*: Now using glfwSetWindowFocusCallback() to calling io.AddFocusEvent(). If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() and forward it to the backend via ImGui_ImplGlfw_WindowFocusCallback(). +// 2021-07-29: *BREAKING CHANGE*: Now using glfwSetCursorEnterCallback(). MousePos is correctly reported when the host platform window is hovered but not focused. If you called ImGui_ImplGlfw_InitXXX() with install_callbacks = false, you MUST install glfwSetWindowFocusCallback() callback and forward it to the backend via ImGui_ImplGlfw_CursorEnterCallback(). +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2020-01-17: Inputs: Disable error callback while assigning mouse cursors because some X11 setup don't have them and it generates errors. +// 2019-12-05: Inputs: Added support for new mouse cursors added in GLFW 3.4+ (resizing cursors, not allowed cursor). +// 2019-10-18: Misc: Previously installed user callbacks are now restored on shutdown. +// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter. +// 2019-05-11: Inputs: Don't filter value from character callback before calling AddInputCharacter(). +// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized. +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-11-07: Inputs: When installing our GLFW callbacks, we save user's previously installed ones - if any - and chain call them. +// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls. +// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor. +// 2018-06-08: Misc: Extracted imgui_impl_glfw.cpp/.h away from the old combined GLFW+OpenGL/Vulkan examples. +// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag. +// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value, passed to glfwSetCursor()). +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. +// 2018-01-25: Inputs: Added gamepad support if ImGuiConfigFlags_NavEnableGamepad is set. +// 2018-01-25: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set). +// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support. +// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert. +// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1). +// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers. + +#include "imgui.h" +#include "imgui_impl_glfw.h" + +// Clang warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#endif + +// GLFW +#include + +#ifdef _WIN32 +#undef APIENTRY +#define GLFW_EXPOSE_NATIVE_WIN32 +#include // for glfwGetWin32Window() +#endif +#ifdef __APPLE__ +#define GLFW_EXPOSE_NATIVE_COCOA +#include // for glfwGetCocoaWindow() +#endif + +#ifdef __EMSCRIPTEN__ +#include +#include +#endif + +// We gather version tests as define in order to easily see which features are version-dependent. +#define GLFW_VERSION_COMBINED (GLFW_VERSION_MAJOR * 1000 + GLFW_VERSION_MINOR * 100 + GLFW_VERSION_REVISION) +#ifdef GLFW_RESIZE_NESW_CURSOR // Let's be nice to people who pulled GLFW between 2019-04-16 (3.4 define) and 2019-11-29 (cursors defines) // FIXME: Remove when GLFW 3.4 is released? +#define GLFW_HAS_NEW_CURSORS (GLFW_VERSION_COMBINED >= 3400) // 3.4+ GLFW_RESIZE_ALL_CURSOR, GLFW_RESIZE_NESW_CURSOR, GLFW_RESIZE_NWSE_CURSOR, GLFW_NOT_ALLOWED_CURSOR +#else +#define GLFW_HAS_NEW_CURSORS (0) +#endif +#define GLFW_HAS_GAMEPAD_API (GLFW_VERSION_COMBINED >= 3300) // 3.3+ glfwGetGamepadState() new api +#define GLFW_HAS_GETKEYNAME (GLFW_VERSION_COMBINED >= 3200) // 3.2+ glfwGetKeyName() + +// GLFW data +enum GlfwClientApi +{ + GlfwClientApi_Unknown, + GlfwClientApi_OpenGL, + GlfwClientApi_Vulkan +}; + +struct ImGui_ImplGlfw_Data +{ + GLFWwindow* Window; + GlfwClientApi ClientApi; + double Time; + GLFWwindow* MouseWindow; + GLFWcursor* MouseCursors[ImGuiMouseCursor_COUNT]; + ImVec2 LastValidMousePos; + bool InstalledCallbacks; + bool CallbacksChainForAllWindows; + + // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. + GLFWwindowfocusfun PrevUserCallbackWindowFocus; + GLFWcursorposfun PrevUserCallbackCursorPos; + GLFWcursorenterfun PrevUserCallbackCursorEnter; + GLFWmousebuttonfun PrevUserCallbackMousebutton; + GLFWscrollfun PrevUserCallbackScroll; + GLFWkeyfun PrevUserCallbackKey; + GLFWcharfun PrevUserCallbackChar; + GLFWmonitorfun PrevUserCallbackMonitor; + + ImGui_ImplGlfw_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +// - Because glfwPollEvents() process all windows and some events may be called outside of it, you will need to register your own callbacks +// (passing install_callbacks=false in ImGui_ImplGlfw_InitXXX functions), set the current dear imgui context and then call our callbacks. +// - Otherwise we may need to store a GLFWWindow* -> ImGuiContext* map and handle this in the backend, adding a little bit of extra complexity to it. +// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. +static ImGui_ImplGlfw_Data* ImGui_ImplGlfw_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplGlfw_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; +} + +// Functions +static const char* ImGui_ImplGlfw_GetClipboardText(void* user_data) +{ + return glfwGetClipboardString((GLFWwindow*)user_data); +} + +static void ImGui_ImplGlfw_SetClipboardText(void* user_data, const char* text) +{ + glfwSetClipboardString((GLFWwindow*)user_data, text); +} + +static ImGuiKey ImGui_ImplGlfw_KeyToImGuiKey(int key) +{ + switch (key) + { + case GLFW_KEY_TAB: return ImGuiKey_Tab; + case GLFW_KEY_LEFT: return ImGuiKey_LeftArrow; + case GLFW_KEY_RIGHT: return ImGuiKey_RightArrow; + case GLFW_KEY_UP: return ImGuiKey_UpArrow; + case GLFW_KEY_DOWN: return ImGuiKey_DownArrow; + case GLFW_KEY_PAGE_UP: return ImGuiKey_PageUp; + case GLFW_KEY_PAGE_DOWN: return ImGuiKey_PageDown; + case GLFW_KEY_HOME: return ImGuiKey_Home; + case GLFW_KEY_END: return ImGuiKey_End; + case GLFW_KEY_INSERT: return ImGuiKey_Insert; + case GLFW_KEY_DELETE: return ImGuiKey_Delete; + case GLFW_KEY_BACKSPACE: return ImGuiKey_Backspace; + case GLFW_KEY_SPACE: return ImGuiKey_Space; + case GLFW_KEY_ENTER: return ImGuiKey_Enter; + case GLFW_KEY_ESCAPE: return ImGuiKey_Escape; + case GLFW_KEY_APOSTROPHE: return ImGuiKey_Apostrophe; + case GLFW_KEY_COMMA: return ImGuiKey_Comma; + case GLFW_KEY_MINUS: return ImGuiKey_Minus; + case GLFW_KEY_PERIOD: return ImGuiKey_Period; + case GLFW_KEY_SLASH: return ImGuiKey_Slash; + case GLFW_KEY_SEMICOLON: return ImGuiKey_Semicolon; + case GLFW_KEY_EQUAL: return ImGuiKey_Equal; + case GLFW_KEY_LEFT_BRACKET: return ImGuiKey_LeftBracket; + case GLFW_KEY_BACKSLASH: return ImGuiKey_Backslash; + case GLFW_KEY_RIGHT_BRACKET: return ImGuiKey_RightBracket; + case GLFW_KEY_GRAVE_ACCENT: return ImGuiKey_GraveAccent; + case GLFW_KEY_CAPS_LOCK: return ImGuiKey_CapsLock; + case GLFW_KEY_SCROLL_LOCK: return ImGuiKey_ScrollLock; + case GLFW_KEY_NUM_LOCK: return ImGuiKey_NumLock; + case GLFW_KEY_PRINT_SCREEN: return ImGuiKey_PrintScreen; + case GLFW_KEY_PAUSE: return ImGuiKey_Pause; + case GLFW_KEY_KP_0: return ImGuiKey_Keypad0; + case GLFW_KEY_KP_1: return ImGuiKey_Keypad1; + case GLFW_KEY_KP_2: return ImGuiKey_Keypad2; + case GLFW_KEY_KP_3: return ImGuiKey_Keypad3; + case GLFW_KEY_KP_4: return ImGuiKey_Keypad4; + case GLFW_KEY_KP_5: return ImGuiKey_Keypad5; + case GLFW_KEY_KP_6: return ImGuiKey_Keypad6; + case GLFW_KEY_KP_7: return ImGuiKey_Keypad7; + case GLFW_KEY_KP_8: return ImGuiKey_Keypad8; + case GLFW_KEY_KP_9: return ImGuiKey_Keypad9; + case GLFW_KEY_KP_DECIMAL: return ImGuiKey_KeypadDecimal; + case GLFW_KEY_KP_DIVIDE: return ImGuiKey_KeypadDivide; + case GLFW_KEY_KP_MULTIPLY: return ImGuiKey_KeypadMultiply; + case GLFW_KEY_KP_SUBTRACT: return ImGuiKey_KeypadSubtract; + case GLFW_KEY_KP_ADD: return ImGuiKey_KeypadAdd; + case GLFW_KEY_KP_ENTER: return ImGuiKey_KeypadEnter; + case GLFW_KEY_KP_EQUAL: return ImGuiKey_KeypadEqual; + case GLFW_KEY_LEFT_SHIFT: return ImGuiKey_LeftShift; + case GLFW_KEY_LEFT_CONTROL: return ImGuiKey_LeftCtrl; + case GLFW_KEY_LEFT_ALT: return ImGuiKey_LeftAlt; + case GLFW_KEY_LEFT_SUPER: return ImGuiKey_LeftSuper; + case GLFW_KEY_RIGHT_SHIFT: return ImGuiKey_RightShift; + case GLFW_KEY_RIGHT_CONTROL: return ImGuiKey_RightCtrl; + case GLFW_KEY_RIGHT_ALT: return ImGuiKey_RightAlt; + case GLFW_KEY_RIGHT_SUPER: return ImGuiKey_RightSuper; + case GLFW_KEY_MENU: return ImGuiKey_Menu; + case GLFW_KEY_0: return ImGuiKey_0; + case GLFW_KEY_1: return ImGuiKey_1; + case GLFW_KEY_2: return ImGuiKey_2; + case GLFW_KEY_3: return ImGuiKey_3; + case GLFW_KEY_4: return ImGuiKey_4; + case GLFW_KEY_5: return ImGuiKey_5; + case GLFW_KEY_6: return ImGuiKey_6; + case GLFW_KEY_7: return ImGuiKey_7; + case GLFW_KEY_8: return ImGuiKey_8; + case GLFW_KEY_9: return ImGuiKey_9; + case GLFW_KEY_A: return ImGuiKey_A; + case GLFW_KEY_B: return ImGuiKey_B; + case GLFW_KEY_C: return ImGuiKey_C; + case GLFW_KEY_D: return ImGuiKey_D; + case GLFW_KEY_E: return ImGuiKey_E; + case GLFW_KEY_F: return ImGuiKey_F; + case GLFW_KEY_G: return ImGuiKey_G; + case GLFW_KEY_H: return ImGuiKey_H; + case GLFW_KEY_I: return ImGuiKey_I; + case GLFW_KEY_J: return ImGuiKey_J; + case GLFW_KEY_K: return ImGuiKey_K; + case GLFW_KEY_L: return ImGuiKey_L; + case GLFW_KEY_M: return ImGuiKey_M; + case GLFW_KEY_N: return ImGuiKey_N; + case GLFW_KEY_O: return ImGuiKey_O; + case GLFW_KEY_P: return ImGuiKey_P; + case GLFW_KEY_Q: return ImGuiKey_Q; + case GLFW_KEY_R: return ImGuiKey_R; + case GLFW_KEY_S: return ImGuiKey_S; + case GLFW_KEY_T: return ImGuiKey_T; + case GLFW_KEY_U: return ImGuiKey_U; + case GLFW_KEY_V: return ImGuiKey_V; + case GLFW_KEY_W: return ImGuiKey_W; + case GLFW_KEY_X: return ImGuiKey_X; + case GLFW_KEY_Y: return ImGuiKey_Y; + case GLFW_KEY_Z: return ImGuiKey_Z; + case GLFW_KEY_F1: return ImGuiKey_F1; + case GLFW_KEY_F2: return ImGuiKey_F2; + case GLFW_KEY_F3: return ImGuiKey_F3; + case GLFW_KEY_F4: return ImGuiKey_F4; + case GLFW_KEY_F5: return ImGuiKey_F5; + case GLFW_KEY_F6: return ImGuiKey_F6; + case GLFW_KEY_F7: return ImGuiKey_F7; + case GLFW_KEY_F8: return ImGuiKey_F8; + case GLFW_KEY_F9: return ImGuiKey_F9; + case GLFW_KEY_F10: return ImGuiKey_F10; + case GLFW_KEY_F11: return ImGuiKey_F11; + case GLFW_KEY_F12: return ImGuiKey_F12; + default: return ImGuiKey_None; + } +} + +// X11 does not include current pressed/released modifier key in 'mods' flags submitted by GLFW +// See https://github.com/ocornut/imgui/issues/6034 and https://github.com/glfw/glfw/issues/1630 +static void ImGui_ImplGlfw_UpdateKeyModifiers() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + io.AddKeyEvent(ImGuiMod_Ctrl, (glfwGetKey(bd->Window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_CONTROL) == GLFW_PRESS)); + io.AddKeyEvent(ImGuiMod_Shift, (glfwGetKey(bd->Window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SHIFT) == GLFW_PRESS)); + io.AddKeyEvent(ImGuiMod_Alt, (glfwGetKey(bd->Window, GLFW_KEY_LEFT_ALT) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_ALT) == GLFW_PRESS)); + io.AddKeyEvent(ImGuiMod_Super, (glfwGetKey(bd->Window, GLFW_KEY_LEFT_SUPER) == GLFW_PRESS) || (glfwGetKey(bd->Window, GLFW_KEY_RIGHT_SUPER) == GLFW_PRESS)); +} + +static bool ImGui_ImplGlfw_ShouldChainCallback(GLFWwindow* window) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + return bd->CallbacksChainForAllWindows ? true : (window == bd->Window); +} + +void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackMousebutton != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackMousebutton(window, button, action, mods); + + ImGui_ImplGlfw_UpdateKeyModifiers(); + + ImGuiIO& io = ImGui::GetIO(); + if (button >= 0 && button < ImGuiMouseButton_COUNT) + io.AddMouseButtonEvent(button, action == GLFW_PRESS); +} + +void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackScroll != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackScroll(window, xoffset, yoffset); + +#ifdef __EMSCRIPTEN__ + // Ignore GLFW events: will be processed in ImGui_ImplEmscripten_WheelCallback(). + return; +#endif + + ImGuiIO& io = ImGui::GetIO(); + io.AddMouseWheelEvent((float)xoffset, (float)yoffset); +} + +static int ImGui_ImplGlfw_TranslateUntranslatedKey(int key, int scancode) +{ +#if GLFW_HAS_GETKEYNAME && !defined(__EMSCRIPTEN__) + // GLFW 3.1+ attempts to "untranslate" keys, which goes the opposite of what every other framework does, making using lettered shortcuts difficult. + // (It had reasons to do so: namely GLFW is/was more likely to be used for WASD-type game controls rather than lettered shortcuts, but IHMO the 3.1 change could have been done differently) + // See https://github.com/glfw/glfw/issues/1502 for details. + // Adding a workaround to undo this (so our keys are translated->untranslated->translated, likely a lossy process). + // This won't cover edge cases but this is at least going to cover common cases. + if (key >= GLFW_KEY_KP_0 && key <= GLFW_KEY_KP_EQUAL) + return key; + GLFWerrorfun prev_error_callback = glfwSetErrorCallback(nullptr); + const char* key_name = glfwGetKeyName(key, scancode); + glfwSetErrorCallback(prev_error_callback); +#if (GLFW_VERSION_COMBINED >= 3300) // Eat errors (see #5908) + (void)glfwGetError(NULL); +#endif + if (key_name && key_name[0] != 0 && key_name[1] == 0) + { + const char char_names[] = "`-=[]\\,;\'./"; + const int char_keys[] = { GLFW_KEY_GRAVE_ACCENT, GLFW_KEY_MINUS, GLFW_KEY_EQUAL, GLFW_KEY_LEFT_BRACKET, GLFW_KEY_RIGHT_BRACKET, GLFW_KEY_BACKSLASH, GLFW_KEY_COMMA, GLFW_KEY_SEMICOLON, GLFW_KEY_APOSTROPHE, GLFW_KEY_PERIOD, GLFW_KEY_SLASH, 0 }; + IM_ASSERT(IM_ARRAYSIZE(char_names) == IM_ARRAYSIZE(char_keys)); + if (key_name[0] >= '0' && key_name[0] <= '9') { key = GLFW_KEY_0 + (key_name[0] - '0'); } + else if (key_name[0] >= 'A' && key_name[0] <= 'Z') { key = GLFW_KEY_A + (key_name[0] - 'A'); } + else if (key_name[0] >= 'a' && key_name[0] <= 'z') { key = GLFW_KEY_A + (key_name[0] - 'a'); } + else if (const char* p = strchr(char_names, key_name[0])) { key = char_keys[p - char_names]; } + } + // if (action == GLFW_PRESS) printf("key %d scancode %d name '%s'\n", key, scancode, key_name); +#else + IM_UNUSED(scancode); +#endif + return key; +} + +void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int keycode, int scancode, int action, int mods) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackKey != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackKey(window, keycode, scancode, action, mods); + + if (action != GLFW_PRESS && action != GLFW_RELEASE) + return; + + ImGui_ImplGlfw_UpdateKeyModifiers(); + + keycode = ImGui_ImplGlfw_TranslateUntranslatedKey(keycode, scancode); + + ImGuiIO& io = ImGui::GetIO(); + ImGuiKey imgui_key = ImGui_ImplGlfw_KeyToImGuiKey(keycode); + io.AddKeyEvent(imgui_key, (action == GLFW_PRESS)); + io.SetKeyEventNativeData(imgui_key, keycode, scancode); // To support legacy indexing (<1.87 user code) +} + +void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackWindowFocus != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackWindowFocus(window, focused); + + ImGuiIO& io = ImGui::GetIO(); + io.AddFocusEvent(focused != 0); +} + +void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackCursorPos != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackCursorPos(window, x, y); + if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) + return; + + ImGuiIO& io = ImGui::GetIO(); + io.AddMousePosEvent((float)x, (float)y); + bd->LastValidMousePos = ImVec2((float)x, (float)y); +} + +// Workaround: X11 seems to send spurious Leave/Enter events which would make us lose our position, +// so we back it up and restore on Leave/Enter (see https://github.com/ocornut/imgui/issues/4984) +void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackCursorEnter != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackCursorEnter(window, entered); + if (glfwGetInputMode(window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) + return; + + ImGuiIO& io = ImGui::GetIO(); + if (entered) + { + bd->MouseWindow = window; + io.AddMousePosEvent(bd->LastValidMousePos.x, bd->LastValidMousePos.y); + } + else if (!entered && bd->MouseWindow == window) + { + bd->LastValidMousePos = io.MousePos; + bd->MouseWindow = nullptr; + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + } +} + +void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if (bd->PrevUserCallbackChar != nullptr && ImGui_ImplGlfw_ShouldChainCallback(window)) + bd->PrevUserCallbackChar(window, c); + + ImGuiIO& io = ImGui::GetIO(); + io.AddInputCharacter(c); +} + +void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor*, int) +{ + // Unused in 'master' branch but 'docking' branch will use this, so we declare it ahead of it so if you have to install callbacks you can install this one too. +} + +#ifdef __EMSCRIPTEN__ +static EM_BOOL ImGui_ImplEmscripten_WheelCallback(int, const EmscriptenWheelEvent* ev, void*) +{ + // Mimic Emscripten_HandleWheel() in SDL. + // Corresponding equivalent in GLFW JS emulation layer has incorrect quantizing preventing small values. See #6096 + float multiplier = 0.0f; + if (ev->deltaMode == DOM_DELTA_PIXEL) { multiplier = 1.0f / 100.0f; } // 100 pixels make up a step. + else if (ev->deltaMode == DOM_DELTA_LINE) { multiplier = 1.0f / 3.0f; } // 3 lines make up a step. + else if (ev->deltaMode == DOM_DELTA_PAGE) { multiplier = 80.0f; } // A page makes up 80 steps. + float wheel_x = ev->deltaX * -multiplier; + float wheel_y = ev->deltaY * -multiplier; + ImGuiIO& io = ImGui::GetIO(); + io.AddMouseWheelEvent(wheel_x, wheel_y); + //IMGUI_DEBUG_LOG("[Emsc] mode %d dx: %.2f, dy: %.2f, dz: %.2f --> feed %.2f %.2f\n", (int)ev->deltaMode, ev->deltaX, ev->deltaY, ev->deltaZ, wheel_x, wheel_y); + return EM_TRUE; +} +#endif + +void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + IM_ASSERT(bd->InstalledCallbacks == false && "Callbacks already installed!"); + IM_ASSERT(bd->Window == window); + + bd->PrevUserCallbackWindowFocus = glfwSetWindowFocusCallback(window, ImGui_ImplGlfw_WindowFocusCallback); + bd->PrevUserCallbackCursorEnter = glfwSetCursorEnterCallback(window, ImGui_ImplGlfw_CursorEnterCallback); + bd->PrevUserCallbackCursorPos = glfwSetCursorPosCallback(window, ImGui_ImplGlfw_CursorPosCallback); + bd->PrevUserCallbackMousebutton = glfwSetMouseButtonCallback(window, ImGui_ImplGlfw_MouseButtonCallback); + bd->PrevUserCallbackScroll = glfwSetScrollCallback(window, ImGui_ImplGlfw_ScrollCallback); + bd->PrevUserCallbackKey = glfwSetKeyCallback(window, ImGui_ImplGlfw_KeyCallback); + bd->PrevUserCallbackChar = glfwSetCharCallback(window, ImGui_ImplGlfw_CharCallback); + bd->PrevUserCallbackMonitor = glfwSetMonitorCallback(ImGui_ImplGlfw_MonitorCallback); + bd->InstalledCallbacks = true; +} + +void ImGui_ImplGlfw_RestoreCallbacks(GLFWwindow* window) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + IM_ASSERT(bd->InstalledCallbacks == true && "Callbacks not installed!"); + IM_ASSERT(bd->Window == window); + + glfwSetWindowFocusCallback(window, bd->PrevUserCallbackWindowFocus); + glfwSetCursorEnterCallback(window, bd->PrevUserCallbackCursorEnter); + glfwSetCursorPosCallback(window, bd->PrevUserCallbackCursorPos); + glfwSetMouseButtonCallback(window, bd->PrevUserCallbackMousebutton); + glfwSetScrollCallback(window, bd->PrevUserCallbackScroll); + glfwSetKeyCallback(window, bd->PrevUserCallbackKey); + glfwSetCharCallback(window, bd->PrevUserCallbackChar); + glfwSetMonitorCallback(bd->PrevUserCallbackMonitor); + bd->InstalledCallbacks = false; + bd->PrevUserCallbackWindowFocus = nullptr; + bd->PrevUserCallbackCursorEnter = nullptr; + bd->PrevUserCallbackCursorPos = nullptr; + bd->PrevUserCallbackMousebutton = nullptr; + bd->PrevUserCallbackScroll = nullptr; + bd->PrevUserCallbackKey = nullptr; + bd->PrevUserCallbackChar = nullptr; + bd->PrevUserCallbackMonitor = nullptr; +} + +// Set to 'true' to enable chaining installed callbacks for all windows (including secondary viewports created by backends or by user. +// This is 'false' by default meaning we only chain callbacks for the main viewport. +// We cannot set this to 'true' by default because user callbacks code may be not testing the 'window' parameter of their callback. +// If you set this to 'true' your user callback code will need to make sure you are testing the 'window' parameter. +void ImGui_ImplGlfw_SetCallbacksChainForAllWindows(bool chain_for_all_windows) +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + bd->CallbacksChainForAllWindows = chain_for_all_windows; +} + +static bool ImGui_ImplGlfw_Init(GLFWwindow* window, bool install_callbacks, GlfwClientApi client_api) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + //printf("GLFW_VERSION: %d.%d.%d (%d)", GLFW_VERSION_MAJOR, GLFW_VERSION_MINOR, GLFW_VERSION_REVISION, GLFW_VERSION_COMBINED); + + // Setup backend capabilities flags + ImGui_ImplGlfw_Data* bd = IM_NEW(ImGui_ImplGlfw_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = "imgui_impl_glfw"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bd->Window = window; + bd->Time = 0.0; + + io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplGlfw_GetClipboardText; + io.ClipboardUserData = bd->Window; + + // Create mouse cursors + // (By design, on X11 cursors are user configurable and some cursors may be missing. When a cursor doesn't exist, + // GLFW will emit an error which will often be printed by the app, so we temporarily disable error reporting. + // Missing cursors will return nullptr and our _UpdateMouseCursor() function will use the Arrow cursor instead.) + GLFWerrorfun prev_error_callback = glfwSetErrorCallback(nullptr); + bd->MouseCursors[ImGuiMouseCursor_Arrow] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_TextInput] = glfwCreateStandardCursor(GLFW_IBEAM_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = glfwCreateStandardCursor(GLFW_VRESIZE_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = glfwCreateStandardCursor(GLFW_HRESIZE_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_Hand] = glfwCreateStandardCursor(GLFW_HAND_CURSOR); +#if GLFW_HAS_NEW_CURSORS + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_RESIZE_ALL_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_RESIZE_NESW_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_RESIZE_NWSE_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_NOT_ALLOWED_CURSOR); +#else + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = glfwCreateStandardCursor(GLFW_ARROW_CURSOR); +#endif + glfwSetErrorCallback(prev_error_callback); +#if (GLFW_VERSION_COMBINED >= 3300) // Eat errors (see #5785) + (void)glfwGetError(NULL); +#endif + + // Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any. + if (install_callbacks) + ImGui_ImplGlfw_InstallCallbacks(window); + // Register Emscripten Wheel callback to workaround issue in Emscripten GLFW Emulation (#6096) + // We intentionally do not check 'if (install_callbacks)' here, as some users may set it to false and call GLFW callback themselves. + // FIXME: May break chaining in case user registered their own Emscripten callback? +#ifdef __EMSCRIPTEN__ + emscripten_set_wheel_callback(EMSCRIPTEN_EVENT_TARGET_DOCUMENT, NULL, false, ImGui_ImplEmscripten_WheelCallback); +#endif + + // Set platform dependent data in viewport + ImGuiViewport* main_viewport = ImGui::GetMainViewport(); +#ifdef _WIN32 + main_viewport->PlatformHandleRaw = glfwGetWin32Window(bd->Window); +#elif defined(__APPLE__) + main_viewport->PlatformHandleRaw = (void*)glfwGetCocoaWindow(bd->Window); +#else + IM_UNUSED(main_viewport); +#endif + + bd->ClientApi = client_api; + return true; +} + +bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks) +{ + return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_OpenGL); +} + +bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks) +{ + return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Vulkan); +} + +bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks) +{ + return ImGui_ImplGlfw_Init(window, install_callbacks, GlfwClientApi_Unknown); +} + +void ImGui_ImplGlfw_Shutdown() +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + if (bd->InstalledCallbacks) + ImGui_ImplGlfw_RestoreCallbacks(bd->Window); + + for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) + glfwDestroyCursor(bd->MouseCursors[cursor_n]); + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + IM_DELETE(bd); +} + +static void ImGui_ImplGlfw_UpdateMouseData() +{ + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + if (glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) + { + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + return; + } + + // (those braces are here to reduce diff with multi-viewports support in 'docking' branch) + { + GLFWwindow* window = bd->Window; + +#ifdef __EMSCRIPTEN__ + const bool is_window_focused = true; +#else + const bool is_window_focused = glfwGetWindowAttrib(window, GLFW_FOCUSED) != 0; +#endif + if (is_window_focused) + { + // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) + if (io.WantSetMousePos) + glfwSetCursorPos(window, (double)io.MousePos.x, (double)io.MousePos.y); + + // (Optional) Fallback to provide mouse position when focused (ImGui_ImplGlfw_CursorPosCallback already provides this when hovered or captured) + if (bd->MouseWindow == nullptr) + { + double mouse_x, mouse_y; + glfwGetCursorPos(window, &mouse_x, &mouse_y); + bd->LastValidMousePos = ImVec2((float)mouse_x, (float)mouse_y); + io.AddMousePosEvent((float)mouse_x, (float)mouse_y); + } + } + } +} + +static void ImGui_ImplGlfw_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + if ((io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) || glfwGetInputMode(bd->Window, GLFW_CURSOR) == GLFW_CURSOR_DISABLED) + return; + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + // (those braces are here to reduce diff with multi-viewports support in 'docking' branch) + { + GLFWwindow* window = bd->Window; + if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_HIDDEN); + } + else + { + // Show OS mouse cursor + // FIXME-PLATFORM: Unfocused windows seems to fail changing the mouse cursor with GLFW 3.2, but 3.3 works here. + glfwSetCursor(window, bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + } + } +} + +// Update gamepad inputs +static inline float Saturate(float v) { return v < 0.0f ? 0.0f : v > 1.0f ? 1.0f : v; } +static void ImGui_ImplGlfw_UpdateGamepads() +{ + ImGuiIO& io = ImGui::GetIO(); + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + return; + + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; +#if GLFW_HAS_GAMEPAD_API + GLFWgamepadstate gamepad; + if (!glfwGetGamepadState(GLFW_JOYSTICK_1, &gamepad)) + return; + #define MAP_BUTTON(KEY_NO, BUTTON_NO, _UNUSED) do { io.AddKeyEvent(KEY_NO, gamepad.buttons[BUTTON_NO] != 0); } while (0) + #define MAP_ANALOG(KEY_NO, AXIS_NO, _UNUSED, V0, V1) do { float v = gamepad.axes[AXIS_NO]; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0) +#else + int axes_count = 0, buttons_count = 0; + const float* axes = glfwGetJoystickAxes(GLFW_JOYSTICK_1, &axes_count); + const unsigned char* buttons = glfwGetJoystickButtons(GLFW_JOYSTICK_1, &buttons_count); + if (axes_count == 0 || buttons_count == 0) + return; + #define MAP_BUTTON(KEY_NO, _UNUSED, BUTTON_NO) do { io.AddKeyEvent(KEY_NO, (buttons_count > BUTTON_NO && buttons[BUTTON_NO] == GLFW_PRESS)); } while (0) + #define MAP_ANALOG(KEY_NO, _UNUSED, AXIS_NO, V0, V1) do { float v = (axes_count > AXIS_NO) ? axes[AXIS_NO] : V0; v = (v - V0) / (V1 - V0); io.AddKeyAnalogEvent(KEY_NO, v > 0.10f, Saturate(v)); } while (0) +#endif + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + MAP_BUTTON(ImGuiKey_GamepadStart, GLFW_GAMEPAD_BUTTON_START, 7); + MAP_BUTTON(ImGuiKey_GamepadBack, GLFW_GAMEPAD_BUTTON_BACK, 6); + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, GLFW_GAMEPAD_BUTTON_X, 2); // Xbox X, PS Square + MAP_BUTTON(ImGuiKey_GamepadFaceRight, GLFW_GAMEPAD_BUTTON_B, 1); // Xbox B, PS Circle + MAP_BUTTON(ImGuiKey_GamepadFaceUp, GLFW_GAMEPAD_BUTTON_Y, 3); // Xbox Y, PS Triangle + MAP_BUTTON(ImGuiKey_GamepadFaceDown, GLFW_GAMEPAD_BUTTON_A, 0); // Xbox A, PS Cross + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, GLFW_GAMEPAD_BUTTON_DPAD_LEFT, 13); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, GLFW_GAMEPAD_BUTTON_DPAD_RIGHT, 11); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, GLFW_GAMEPAD_BUTTON_DPAD_UP, 10); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, GLFW_GAMEPAD_BUTTON_DPAD_DOWN, 12); + MAP_BUTTON(ImGuiKey_GamepadL1, GLFW_GAMEPAD_BUTTON_LEFT_BUMPER, 4); + MAP_BUTTON(ImGuiKey_GamepadR1, GLFW_GAMEPAD_BUTTON_RIGHT_BUMPER, 5); + MAP_ANALOG(ImGuiKey_GamepadL2, GLFW_GAMEPAD_AXIS_LEFT_TRIGGER, 4, -0.75f, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadR2, GLFW_GAMEPAD_AXIS_RIGHT_TRIGGER, 5, -0.75f, +1.0f); + MAP_BUTTON(ImGuiKey_GamepadL3, GLFW_GAMEPAD_BUTTON_LEFT_THUMB, 8); + MAP_BUTTON(ImGuiKey_GamepadR3, GLFW_GAMEPAD_BUTTON_RIGHT_THUMB, 9); + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, GLFW_GAMEPAD_AXIS_LEFT_X, 0, -0.25f, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, GLFW_GAMEPAD_AXIS_LEFT_X, 0, +0.25f, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, -0.25f, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, GLFW_GAMEPAD_AXIS_LEFT_Y, 1, +0.25f, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, -0.25f, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, GLFW_GAMEPAD_AXIS_RIGHT_X, 2, +0.25f, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, -0.25f, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, GLFW_GAMEPAD_AXIS_RIGHT_Y, 3, +0.25f, +1.0f); + #undef MAP_BUTTON + #undef MAP_ANALOG +} + +void ImGui_ImplGlfw_NewFrame() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplGlfw_InitForXXX()?"); + + // Setup display size (every frame to accommodate for window resizing) + int w, h; + int display_w, display_h; + glfwGetWindowSize(bd->Window, &w, &h); + glfwGetFramebufferSize(bd->Window, &display_w, &display_h); + io.DisplaySize = ImVec2((float)w, (float)h); + if (w > 0 && h > 0) + io.DisplayFramebufferScale = ImVec2((float)display_w / (float)w, (float)display_h / (float)h); + + // Setup time step + double current_time = glfwGetTime(); + io.DeltaTime = bd->Time > 0.0 ? (float)(current_time - bd->Time) : (float)(1.0f / 60.0f); + bd->Time = current_time; + + ImGui_ImplGlfw_UpdateMouseData(); + ImGui_ImplGlfw_UpdateMouseCursor(); + + // Update game controllers (if enabled and available) + ImGui_ImplGlfw_UpdateGamepads(); +} + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/ImGui/backends/imgui_impl_glfw.h b/ImGui/backends/imgui_impl_glfw.h new file mode 100644 index 0000000..f2f3405 --- /dev/null +++ b/ImGui/backends/imgui_impl_glfw.h @@ -0,0 +1,46 @@ +// dear imgui: Platform Backend for GLFW +// This needs to be used along with a Renderer (e.g. OpenGL3, Vulkan, WebGPU..) +// (Info: GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan graphics context creation, etc.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLFW_KEY_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange' (note: the resizing cursors requires GLFW 3.4+). + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct GLFWwindow; +struct GLFWmonitor; + +IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOpenGL(GLFWwindow* window, bool install_callbacks); +IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForVulkan(GLFWwindow* window, bool install_callbacks); +IMGUI_IMPL_API bool ImGui_ImplGlfw_InitForOther(GLFWwindow* window, bool install_callbacks); +IMGUI_IMPL_API void ImGui_ImplGlfw_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplGlfw_NewFrame(); + +// GLFW callbacks install +// - When calling Init with 'install_callbacks=true': ImGui_ImplGlfw_InstallCallbacks() is called. GLFW callbacks will be installed for you. They will chain-call user's previously installed callbacks, if any. +// - When calling Init with 'install_callbacks=false': GLFW callbacks won't be installed. You will need to call individual function yourself from your own GLFW callbacks. +IMGUI_IMPL_API void ImGui_ImplGlfw_InstallCallbacks(GLFWwindow* window); +IMGUI_IMPL_API void ImGui_ImplGlfw_RestoreCallbacks(GLFWwindow* window); + +// GFLW callbacks options: +// - Set 'chain_for_all_windows=true' to enable chaining callbacks for all windows (including secondary viewports created by backends or by user) +IMGUI_IMPL_API void ImGui_ImplGlfw_SetCallbacksChainForAllWindows(bool chain_for_all_windows); + +// GLFW callbacks (individual callbacks to call yourself if you didn't install callbacks) +IMGUI_IMPL_API void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused); // Since 1.84 +IMGUI_IMPL_API void ImGui_ImplGlfw_CursorEnterCallback(GLFWwindow* window, int entered); // Since 1.84 +IMGUI_IMPL_API void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y); // Since 1.87 +IMGUI_IMPL_API void ImGui_ImplGlfw_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods); +IMGUI_IMPL_API void ImGui_ImplGlfw_ScrollCallback(GLFWwindow* window, double xoffset, double yoffset); +IMGUI_IMPL_API void ImGui_ImplGlfw_KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods); +IMGUI_IMPL_API void ImGui_ImplGlfw_CharCallback(GLFWwindow* window, unsigned int c); +IMGUI_IMPL_API void ImGui_ImplGlfw_MonitorCallback(GLFWmonitor* monitor, int event); diff --git a/ImGui/backends/imgui_impl_glut.cpp b/ImGui/backends/imgui_impl_glut.cpp new file mode 100644 index 0000000..4734e49 --- /dev/null +++ b/ImGui/backends/imgui_impl_glut.cpp @@ -0,0 +1,300 @@ +// dear imgui: Platform Backend for GLUT/FreeGLUT +// This needs to be used along with a Renderer (e.g. OpenGL2) + +// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!! +// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!! +// !!! Nowadays, prefer using GLFW or SDL instead! + +// Implemented features: +// [X] Platform: Partial keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLUT values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// Issues: +// [ ] Platform: GLUT is unable to distinguish e.g. Backspace from CTRL+H or TAB from CTRL+I +// [ ] Platform: Missing horizontal mouse wheel support. +// [ ] Platform: Missing mouse cursor shape/visibility support. +// [ ] Platform: Missing clipboard support (not supported by Glut). +// [ ] Platform: Missing gamepad support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2019-04-03: Misc: Renamed imgui_impl_freeglut.cpp/.h to imgui_impl_glut.cpp/.h. +// 2019-03-25: Misc: Made io.DeltaTime always above zero. +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-03-22: Added GLUT Platform binding. + +#include "imgui.h" +#include "imgui_impl_glut.h" +#define GL_SILENCE_DEPRECATION +#ifdef __APPLE__ +#include +#else +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) +#endif + +static int g_Time = 0; // Current time, in milliseconds + +// Glut has 1 function for characters and one for "special keys". We map the characters in the 0..255 range and the keys above. +static ImGuiKey ImGui_ImplGLUT_KeyToImGuiKey(int key) +{ + switch (key) + { + case '\t': return ImGuiKey_Tab; + case 256 + GLUT_KEY_LEFT: return ImGuiKey_LeftArrow; + case 256 + GLUT_KEY_RIGHT: return ImGuiKey_RightArrow; + case 256 + GLUT_KEY_UP: return ImGuiKey_UpArrow; + case 256 + GLUT_KEY_DOWN: return ImGuiKey_DownArrow; + case 256 + GLUT_KEY_PAGE_UP: return ImGuiKey_PageUp; + case 256 + GLUT_KEY_PAGE_DOWN: return ImGuiKey_PageDown; + case 256 + GLUT_KEY_HOME: return ImGuiKey_Home; + case 256 + GLUT_KEY_END: return ImGuiKey_End; + case 256 + GLUT_KEY_INSERT: return ImGuiKey_Insert; + case 127: return ImGuiKey_Delete; + case 8: return ImGuiKey_Backspace; + case ' ': return ImGuiKey_Space; + case 13: return ImGuiKey_Enter; + case 27: return ImGuiKey_Escape; + case 39: return ImGuiKey_Apostrophe; + case 44: return ImGuiKey_Comma; + case 45: return ImGuiKey_Minus; + case 46: return ImGuiKey_Period; + case 47: return ImGuiKey_Slash; + case 59: return ImGuiKey_Semicolon; + case 61: return ImGuiKey_Equal; + case 91: return ImGuiKey_LeftBracket; + case 92: return ImGuiKey_Backslash; + case 93: return ImGuiKey_RightBracket; + case 96: return ImGuiKey_GraveAccent; + //case 0: return ImGuiKey_CapsLock; + //case 0: return ImGuiKey_ScrollLock; + case 256 + 0x006D: return ImGuiKey_NumLock; + //case 0: return ImGuiKey_PrintScreen; + //case 0: return ImGuiKey_Pause; + //case '0': return ImGuiKey_Keypad0; + //case '1': return ImGuiKey_Keypad1; + //case '2': return ImGuiKey_Keypad2; + //case '3': return ImGuiKey_Keypad3; + //case '4': return ImGuiKey_Keypad4; + //case '5': return ImGuiKey_Keypad5; + //case '6': return ImGuiKey_Keypad6; + //case '7': return ImGuiKey_Keypad7; + //case '8': return ImGuiKey_Keypad8; + //case '9': return ImGuiKey_Keypad9; + //case 46: return ImGuiKey_KeypadDecimal; + //case 47: return ImGuiKey_KeypadDivide; + case 42: return ImGuiKey_KeypadMultiply; + //case 45: return ImGuiKey_KeypadSubtract; + case 43: return ImGuiKey_KeypadAdd; + //case 13: return ImGuiKey_KeypadEnter; + //case 0: return ImGuiKey_KeypadEqual; + case 256 + 0x0072: return ImGuiKey_LeftCtrl; + case 256 + 0x0070: return ImGuiKey_LeftShift; + case 256 + 0x0074: return ImGuiKey_LeftAlt; + //case 0: return ImGuiKey_LeftSuper; + case 256 + 0x0073: return ImGuiKey_RightCtrl; + case 256 + 0x0071: return ImGuiKey_RightShift; + case 256 + 0x0075: return ImGuiKey_RightAlt; + //case 0: return ImGuiKey_RightSuper; + //case 0: return ImGuiKey_Menu; + case '0': return ImGuiKey_0; + case '1': return ImGuiKey_1; + case '2': return ImGuiKey_2; + case '3': return ImGuiKey_3; + case '4': return ImGuiKey_4; + case '5': return ImGuiKey_5; + case '6': return ImGuiKey_6; + case '7': return ImGuiKey_7; + case '8': return ImGuiKey_8; + case '9': return ImGuiKey_9; + case 'A': case 'a': return ImGuiKey_A; + case 'B': case 'b': return ImGuiKey_B; + case 'C': case 'c': return ImGuiKey_C; + case 'D': case 'd': return ImGuiKey_D; + case 'E': case 'e': return ImGuiKey_E; + case 'F': case 'f': return ImGuiKey_F; + case 'G': case 'g': return ImGuiKey_G; + case 'H': case 'h': return ImGuiKey_H; + case 'I': case 'i': return ImGuiKey_I; + case 'J': case 'j': return ImGuiKey_J; + case 'K': case 'k': return ImGuiKey_K; + case 'L': case 'l': return ImGuiKey_L; + case 'M': case 'm': return ImGuiKey_M; + case 'N': case 'n': return ImGuiKey_N; + case 'O': case 'o': return ImGuiKey_O; + case 'P': case 'p': return ImGuiKey_P; + case 'Q': case 'q': return ImGuiKey_Q; + case 'R': case 'r': return ImGuiKey_R; + case 'S': case 's': return ImGuiKey_S; + case 'T': case 't': return ImGuiKey_T; + case 'U': case 'u': return ImGuiKey_U; + case 'V': case 'v': return ImGuiKey_V; + case 'W': case 'w': return ImGuiKey_W; + case 'X': case 'x': return ImGuiKey_X; + case 'Y': case 'y': return ImGuiKey_Y; + case 'Z': case 'z': return ImGuiKey_Z; + case 256 + GLUT_KEY_F1: return ImGuiKey_F1; + case 256 + GLUT_KEY_F2: return ImGuiKey_F2; + case 256 + GLUT_KEY_F3: return ImGuiKey_F3; + case 256 + GLUT_KEY_F4: return ImGuiKey_F4; + case 256 + GLUT_KEY_F5: return ImGuiKey_F5; + case 256 + GLUT_KEY_F6: return ImGuiKey_F6; + case 256 + GLUT_KEY_F7: return ImGuiKey_F7; + case 256 + GLUT_KEY_F8: return ImGuiKey_F8; + case 256 + GLUT_KEY_F9: return ImGuiKey_F9; + case 256 + GLUT_KEY_F10: return ImGuiKey_F10; + case 256 + GLUT_KEY_F11: return ImGuiKey_F11; + case 256 + GLUT_KEY_F12: return ImGuiKey_F12; + default: return ImGuiKey_None; + } +} + +bool ImGui_ImplGLUT_Init() +{ + ImGuiIO& io = ImGui::GetIO(); + +#ifdef FREEGLUT + io.BackendPlatformName = "imgui_impl_glut (freeglut)"; +#else + io.BackendPlatformName = "imgui_impl_glut"; +#endif + g_Time = 0; + + return true; +} + +void ImGui_ImplGLUT_InstallFuncs() +{ + glutReshapeFunc(ImGui_ImplGLUT_ReshapeFunc); + glutMotionFunc(ImGui_ImplGLUT_MotionFunc); + glutPassiveMotionFunc(ImGui_ImplGLUT_MotionFunc); + glutMouseFunc(ImGui_ImplGLUT_MouseFunc); +#ifdef __FREEGLUT_EXT_H__ + glutMouseWheelFunc(ImGui_ImplGLUT_MouseWheelFunc); +#endif + glutKeyboardFunc(ImGui_ImplGLUT_KeyboardFunc); + glutKeyboardUpFunc(ImGui_ImplGLUT_KeyboardUpFunc); + glutSpecialFunc(ImGui_ImplGLUT_SpecialFunc); + glutSpecialUpFunc(ImGui_ImplGLUT_SpecialUpFunc); +} + +void ImGui_ImplGLUT_Shutdown() +{ +} + +void ImGui_ImplGLUT_NewFrame() +{ + // Setup time step + ImGuiIO& io = ImGui::GetIO(); + int current_time = glutGet(GLUT_ELAPSED_TIME); + int delta_time_ms = (current_time - g_Time); + if (delta_time_ms <= 0) + delta_time_ms = 1; + io.DeltaTime = delta_time_ms / 1000.0f; + g_Time = current_time; + + // Start the frame + ImGui::NewFrame(); +} + +static void ImGui_ImplGLUT_UpdateKeyModifiers() +{ + ImGuiIO& io = ImGui::GetIO(); + int glut_key_mods = glutGetModifiers(); + io.AddKeyEvent(ImGuiMod_Ctrl, (glut_key_mods & GLUT_ACTIVE_CTRL) != 0); + io.AddKeyEvent(ImGuiMod_Shift, (glut_key_mods & GLUT_ACTIVE_SHIFT) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (glut_key_mods & GLUT_ACTIVE_ALT) != 0); +} + +static void ImGui_ImplGLUT_AddKeyEvent(ImGuiKey key, bool down, int native_keycode) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(key, down); + io.SetKeyEventNativeData(key, native_keycode, -1); // To support legacy indexing (<1.87 user code) +} + +void ImGui_ImplGLUT_KeyboardFunc(unsigned char c, int x, int y) +{ + // Send character to imgui + //printf("char_down_func %d '%c'\n", c, c); + ImGuiIO& io = ImGui::GetIO(); + if (c >= 32) + io.AddInputCharacter((unsigned int)c); + + ImGuiKey key = ImGui_ImplGLUT_KeyToImGuiKey(c); + ImGui_ImplGLUT_AddKeyEvent(key, true, c); + ImGui_ImplGLUT_UpdateKeyModifiers(); + (void)x; (void)y; // Unused +} + +void ImGui_ImplGLUT_KeyboardUpFunc(unsigned char c, int x, int y) +{ + //printf("char_up_func %d '%c'\n", c, c); + ImGuiKey key = ImGui_ImplGLUT_KeyToImGuiKey(c); + ImGui_ImplGLUT_AddKeyEvent(key, false, c); + ImGui_ImplGLUT_UpdateKeyModifiers(); + (void)x; (void)y; // Unused +} + +void ImGui_ImplGLUT_SpecialFunc(int key, int x, int y) +{ + //printf("key_down_func %d\n", key); + ImGuiKey imgui_key = ImGui_ImplGLUT_KeyToImGuiKey(key + 256); + ImGui_ImplGLUT_AddKeyEvent(imgui_key, true, key + 256); + ImGui_ImplGLUT_UpdateKeyModifiers(); + (void)x; (void)y; // Unused +} + +void ImGui_ImplGLUT_SpecialUpFunc(int key, int x, int y) +{ + //printf("key_up_func %d\n", key); + ImGuiKey imgui_key = ImGui_ImplGLUT_KeyToImGuiKey(key + 256); + ImGui_ImplGLUT_AddKeyEvent(imgui_key, false, key + 256); + ImGui_ImplGLUT_UpdateKeyModifiers(); + (void)x; (void)y; // Unused +} + +void ImGui_ImplGLUT_MouseFunc(int glut_button, int state, int x, int y) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddMousePosEvent((float)x, (float)y); + int button = -1; + if (glut_button == GLUT_LEFT_BUTTON) button = 0; + if (glut_button == GLUT_RIGHT_BUTTON) button = 1; + if (glut_button == GLUT_MIDDLE_BUTTON) button = 2; + if (button != -1 && (state == GLUT_DOWN || state == GLUT_UP)) + io.AddMouseButtonEvent(button, state == GLUT_DOWN); +} + +#ifdef __FREEGLUT_EXT_H__ +void ImGui_ImplGLUT_MouseWheelFunc(int button, int dir, int x, int y) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddMousePosEvent((float)x, (float)y); + if (dir != 0) + io.AddMouseWheelEvent(0.0f, dir > 0 ? 1.0f : -1.0f); + (void)button; // Unused +} +#endif + +void ImGui_ImplGLUT_ReshapeFunc(int w, int h) +{ + ImGuiIO& io = ImGui::GetIO(); + io.DisplaySize = ImVec2((float)w, (float)h); +} + +void ImGui_ImplGLUT_MotionFunc(int x, int y) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddMousePosEvent((float)x, (float)y); +} diff --git a/ImGui/backends/imgui_impl_glut.h b/ImGui/backends/imgui_impl_glut.h new file mode 100644 index 0000000..545cd8d --- /dev/null +++ b/ImGui/backends/imgui_impl_glut.h @@ -0,0 +1,40 @@ +// dear imgui: Platform Backend for GLUT/FreeGLUT +// This needs to be used along with a Renderer (e.g. OpenGL2) + +// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!! +// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!! +// !!! Nowadays, prefer using GLFW or SDL instead! + +// Implemented features: +// [X] Platform: Partial keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy GLUT values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// Issues: +// [ ] Platform: GLUT is unable to distinguish e.g. Backspace from CTRL+H or TAB from CTRL+I +// [ ] Platform: Missing horizontal mouse wheel support. +// [ ] Platform: Missing mouse cursor shape/visibility support. +// [ ] Platform: Missing clipboard support (not supported by Glut). +// [ ] Platform: Missing gamepad support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +IMGUI_IMPL_API bool ImGui_ImplGLUT_Init(); +IMGUI_IMPL_API void ImGui_ImplGLUT_InstallFuncs(); +IMGUI_IMPL_API void ImGui_ImplGLUT_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplGLUT_NewFrame(); + +// You can call ImGui_ImplGLUT_InstallFuncs() to get all those functions installed automatically, +// or call them yourself from your own GLUT handlers. We are using the same weird names as GLUT for consistency.. +//---------------------------------------- GLUT name --------------------------------------------- Decent Name --------- +IMGUI_IMPL_API void ImGui_ImplGLUT_ReshapeFunc(int w, int h); // ~ ResizeFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_MotionFunc(int x, int y); // ~ MouseMoveFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_MouseFunc(int button, int state, int x, int y); // ~ MouseButtonFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_MouseWheelFunc(int button, int dir, int x, int y); // ~ MouseWheelFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardFunc(unsigned char c, int x, int y); // ~ CharPressedFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_KeyboardUpFunc(unsigned char c, int x, int y); // ~ CharReleasedFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialFunc(int key, int x, int y); // ~ KeyPressedFunc +IMGUI_IMPL_API void ImGui_ImplGLUT_SpecialUpFunc(int key, int x, int y); // ~ KeyReleasedFunc diff --git a/ImGui/backends/imgui_impl_metal.h b/ImGui/backends/imgui_impl_metal.h new file mode 100644 index 0000000..da9e9ef --- /dev/null +++ b/ImGui/backends/imgui_impl_metal.h @@ -0,0 +1,64 @@ +// dear imgui: Renderer Backend for Metal +// This needs to be used along with a Platform Backend (e.g. OSX) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" // IMGUI_IMPL_API + +//----------------------------------------------------------------------------- +// ObjC API +//----------------------------------------------------------------------------- + +#ifdef __OBJC__ + +@class MTLRenderPassDescriptor; +@protocol MTLDevice, MTLCommandBuffer, MTLRenderCommandEncoder; + +IMGUI_IMPL_API bool ImGui_ImplMetal_Init(id device); +IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, + id commandBuffer, + id commandEncoder); + +// Called by Init/NewFrame/Shutdown +IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(id device); +IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture(); +IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(id device); +IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects(); + +#endif + +//----------------------------------------------------------------------------- +// C++ API +//----------------------------------------------------------------------------- + +// Enable Metal C++ binding support with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file +// More info about using Metal from C++: https://developer.apple.com/metal/cpp/ + +#ifdef IMGUI_IMPL_METAL_CPP +#include +#ifndef __OBJC__ + +IMGUI_IMPL_API bool ImGui_ImplMetal_Init(MTL::Device* device); +IMGUI_IMPL_API void ImGui_ImplMetal_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor); +IMGUI_IMPL_API void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, + MTL::CommandBuffer* commandBuffer, + MTL::RenderCommandEncoder* commandEncoder); + +// Called by Init/NewFrame/Shutdown +IMGUI_IMPL_API bool ImGui_ImplMetal_CreateFontsTexture(MTL::Device* device); +IMGUI_IMPL_API void ImGui_ImplMetal_DestroyFontsTexture(); +IMGUI_IMPL_API bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device); +IMGUI_IMPL_API void ImGui_ImplMetal_DestroyDeviceObjects(); + +#endif +#endif diff --git a/ImGui/backends/imgui_impl_metal.mm b/ImGui/backends/imgui_impl_metal.mm new file mode 100644 index 0000000..5f05885 --- /dev/null +++ b/ImGui/backends/imgui_impl_metal.mm @@ -0,0 +1,575 @@ +// dear imgui: Renderer Backend for Metal +// This needs to be used along with a Platform Backend (e.g. OSX) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'MTLTexture' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-08-23: Metal: Update deprecated property 'sampleCount'->'rasterSampleCount'. +// 2022-07-05: Metal: Add dispatch synchronization. +// 2022-06-30: Metal: Use __bridge for ARC based systems. +// 2022-06-01: Metal: Fixed null dereference on exit inside command buffer completion handler. +// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts. +// 2022-01-03: Metal: Ignore ImDrawCmd where ElemCount == 0 (very rare but can technically be manufactured by user code). +// 2021-12-30: Metal: Added Metal C++ support. Enable with '#define IMGUI_IMPL_METAL_CPP' in your imconfig.h file. +// 2021-08-24: Metal: Fixed a crash when clipping rect larger than framebuffer is submitted. (#4464) +// 2021-05-19: Metal: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: Metal: Change blending equation to preserve alpha in output buffer. +// 2021-01-25: Metal: Fixed texture storage mode when building on Mac Catalyst. +// 2019-05-29: Metal: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: Metal: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-02-11: Metal: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-07-05: Metal: Added new Metal backend implementation. + +#include "imgui.h" +#include "imgui_impl_metal.h" +#import +#import + +#pragma mark - Support classes + +// A wrapper around a MTLBuffer object that knows the last time it was reused +@interface MetalBuffer : NSObject +@property (nonatomic, strong) id buffer; +@property (nonatomic, assign) double lastReuseTime; +- (instancetype)initWithBuffer:(id)buffer; +@end + +// An object that encapsulates the data necessary to uniquely identify a +// render pipeline state. These are used as cache keys. +@interface FramebufferDescriptor : NSObject +@property (nonatomic, assign) unsigned long sampleCount; +@property (nonatomic, assign) MTLPixelFormat colorPixelFormat; +@property (nonatomic, assign) MTLPixelFormat depthPixelFormat; +@property (nonatomic, assign) MTLPixelFormat stencilPixelFormat; +- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor*)renderPassDescriptor; +@end + +// A singleton that stores long-lived objects that are needed by the Metal +// renderer backend. Stores the render pipeline state cache and the default +// font texture, and manages the reusable buffer cache. +@interface MetalContext : NSObject +@property (nonatomic, strong) id device; +@property (nonatomic, strong) id depthStencilState; +@property (nonatomic, strong) FramebufferDescriptor* framebufferDescriptor; // framebuffer descriptor for current frame; transient +@property (nonatomic, strong) NSMutableDictionary* renderPipelineStateCache; // pipeline cache; keyed on framebuffer descriptors +@property (nonatomic, strong, nullable) id fontTexture; +@property (nonatomic, strong) NSMutableArray* bufferCache; +@property (nonatomic, assign) double lastBufferCachePurge; +- (MetalBuffer*)dequeueReusableBufferOfLength:(NSUInteger)length device:(id)device; +- (id)renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor*)descriptor device:(id)device; +@end + +struct ImGui_ImplMetal_Data +{ + MetalContext* SharedMetalContext; + + ImGui_ImplMetal_Data() { memset(this, 0, sizeof(*this)); } +}; + +static ImGui_ImplMetal_Data* ImGui_ImplMetal_CreateBackendData() { return IM_NEW(ImGui_ImplMetal_Data)(); } +static ImGui_ImplMetal_Data* ImGui_ImplMetal_GetBackendData() { return ImGui::GetCurrentContext() ? (ImGui_ImplMetal_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; } +static void ImGui_ImplMetal_DestroyBackendData(){ IM_DELETE(ImGui_ImplMetal_GetBackendData()); } + +static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return (CFTimeInterval)(double)(clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1e9); } + +#ifdef IMGUI_IMPL_METAL_CPP + +#pragma mark - Dear ImGui Metal C++ Backend API + +bool ImGui_ImplMetal_Init(MTL::Device* device) +{ + return ImGui_ImplMetal_Init((__bridge id)(device)); +} + +void ImGui_ImplMetal_NewFrame(MTL::RenderPassDescriptor* renderPassDescriptor) +{ + ImGui_ImplMetal_NewFrame((__bridge MTLRenderPassDescriptor*)(renderPassDescriptor)); +} + +void ImGui_ImplMetal_RenderDrawData(ImDrawData* draw_data, + MTL::CommandBuffer* commandBuffer, + MTL::RenderCommandEncoder* commandEncoder) +{ + ImGui_ImplMetal_RenderDrawData(draw_data, + (__bridge id)(commandBuffer), + (__bridge id)(commandEncoder)); + +} + +bool ImGui_ImplMetal_CreateFontsTexture(MTL::Device* device) +{ + return ImGui_ImplMetal_CreateFontsTexture((__bridge id)(device)); +} + +bool ImGui_ImplMetal_CreateDeviceObjects(MTL::Device* device) +{ + return ImGui_ImplMetal_CreateDeviceObjects((__bridge id)(device)); +} + +#endif // #ifdef IMGUI_IMPL_METAL_CPP + +#pragma mark - Dear ImGui Metal Backend API + +bool ImGui_ImplMetal_Init(id device) +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_CreateBackendData(); + ImGuiIO& io = ImGui::GetIO(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_metal"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + bd->SharedMetalContext = [[MetalContext alloc] init]; + bd->SharedMetalContext.device = device; + + return true; +} + +void ImGui_ImplMetal_Shutdown() +{ + ImGui_ImplMetal_DestroyDeviceObjects(); + ImGui_ImplMetal_DestroyBackendData(); +} + +void ImGui_ImplMetal_NewFrame(MTLRenderPassDescriptor* renderPassDescriptor) +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + IM_ASSERT(bd->SharedMetalContext != nil && "No Metal context. Did you call ImGui_ImplMetal_Init() ?"); + bd->SharedMetalContext.framebufferDescriptor = [[FramebufferDescriptor alloc] initWithRenderPassDescriptor:renderPassDescriptor]; + + if (bd->SharedMetalContext.depthStencilState == nil) + ImGui_ImplMetal_CreateDeviceObjects(bd->SharedMetalContext.device); +} + +static void ImGui_ImplMetal_SetupRenderState(ImDrawData* drawData, id commandBuffer, + id commandEncoder, id renderPipelineState, + MetalBuffer* vertexBuffer, size_t vertexBufferOffset) +{ + IM_UNUSED(commandBuffer); + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + [commandEncoder setCullMode:MTLCullModeNone]; + [commandEncoder setDepthStencilState:bd->SharedMetalContext.depthStencilState]; + + // Setup viewport, orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to + // draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayMin is typically (0,0) for single viewport apps. + MTLViewport viewport = + { + .originX = 0.0, + .originY = 0.0, + .width = (double)(drawData->DisplaySize.x * drawData->FramebufferScale.x), + .height = (double)(drawData->DisplaySize.y * drawData->FramebufferScale.y), + .znear = 0.0, + .zfar = 1.0 + }; + [commandEncoder setViewport:viewport]; + + float L = drawData->DisplayPos.x; + float R = drawData->DisplayPos.x + drawData->DisplaySize.x; + float T = drawData->DisplayPos.y; + float B = drawData->DisplayPos.y + drawData->DisplaySize.y; + float N = (float)viewport.znear; + float F = (float)viewport.zfar; + const float ortho_projection[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 1/(F-N), 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), N/(F-N), 1.0f }, + }; + [commandEncoder setVertexBytes:&ortho_projection length:sizeof(ortho_projection) atIndex:1]; + + [commandEncoder setRenderPipelineState:renderPipelineState]; + + [commandEncoder setVertexBuffer:vertexBuffer.buffer offset:0 atIndex:0]; + [commandEncoder setVertexBufferOffset:vertexBufferOffset atIndex:0]; +} + +// Metal Render function. +void ImGui_ImplMetal_RenderDrawData(ImDrawData* drawData, id commandBuffer, id commandEncoder) +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + MetalContext* ctx = bd->SharedMetalContext; + + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) + int fb_width = (int)(drawData->DisplaySize.x * drawData->FramebufferScale.x); + int fb_height = (int)(drawData->DisplaySize.y * drawData->FramebufferScale.y); + if (fb_width <= 0 || fb_height <= 0 || drawData->CmdListsCount == 0) + return; + + // Try to retrieve a render pipeline state that is compatible with the framebuffer config for this frame + // The hit rate for this cache should be very near 100%. + id renderPipelineState = ctx.renderPipelineStateCache[ctx.framebufferDescriptor]; + if (renderPipelineState == nil) + { + // No luck; make a new render pipeline state + renderPipelineState = [ctx renderPipelineStateForFramebufferDescriptor:ctx.framebufferDescriptor device:commandBuffer.device]; + + // Cache render pipeline state for later reuse + ctx.renderPipelineStateCache[ctx.framebufferDescriptor] = renderPipelineState; + } + + size_t vertexBufferLength = (size_t)drawData->TotalVtxCount * sizeof(ImDrawVert); + size_t indexBufferLength = (size_t)drawData->TotalIdxCount * sizeof(ImDrawIdx); + MetalBuffer* vertexBuffer = [ctx dequeueReusableBufferOfLength:vertexBufferLength device:commandBuffer.device]; + MetalBuffer* indexBuffer = [ctx dequeueReusableBufferOfLength:indexBufferLength device:commandBuffer.device]; + + ImGui_ImplMetal_SetupRenderState(drawData, commandBuffer, commandEncoder, renderPipelineState, vertexBuffer, 0); + + // Will project scissor/clipping rectangles into framebuffer space + ImVec2 clip_off = drawData->DisplayPos; // (0,0) unless using multi-viewports + ImVec2 clip_scale = drawData->FramebufferScale; // (1,1) unless using retina display which are often (2,2) + + // Render command lists + size_t vertexBufferOffset = 0; + size_t indexBufferOffset = 0; + for (int n = 0; n < drawData->CmdListsCount; n++) + { + const ImDrawList* cmd_list = drawData->CmdLists[n]; + + memcpy((char*)vertexBuffer.buffer.contents + vertexBufferOffset, cmd_list->VtxBuffer.Data, (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy((char*)indexBuffer.buffer.contents + indexBufferOffset, cmd_list->IdxBuffer.Data, (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplMetal_SetupRenderState(drawData, commandBuffer, commandEncoder, renderPipelineState, vertexBuffer, vertexBufferOffset); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + + // Clamp to viewport as setScissorRect() won't accept values that are off bounds + if (clip_min.x < 0.0f) { clip_min.x = 0.0f; } + if (clip_min.y < 0.0f) { clip_min.y = 0.0f; } + if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; } + if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; } + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + if (pcmd->ElemCount == 0) // drawIndexedPrimitives() validation doesn't accept this + continue; + + // Apply scissor/clipping rectangle + MTLScissorRect scissorRect = + { + .x = NSUInteger(clip_min.x), + .y = NSUInteger(clip_min.y), + .width = NSUInteger(clip_max.x - clip_min.x), + .height = NSUInteger(clip_max.y - clip_min.y) + }; + [commandEncoder setScissorRect:scissorRect]; + + // Bind texture, Draw + if (ImTextureID tex_id = pcmd->GetTexID()) + [commandEncoder setFragmentTexture:(__bridge id)(tex_id) atIndex:0]; + + [commandEncoder setVertexBufferOffset:(vertexBufferOffset + pcmd->VtxOffset * sizeof(ImDrawVert)) atIndex:0]; + [commandEncoder drawIndexedPrimitives:MTLPrimitiveTypeTriangle + indexCount:pcmd->ElemCount + indexType:sizeof(ImDrawIdx) == 2 ? MTLIndexTypeUInt16 : MTLIndexTypeUInt32 + indexBuffer:indexBuffer.buffer + indexBufferOffset:indexBufferOffset + pcmd->IdxOffset * sizeof(ImDrawIdx)]; + } + } + + vertexBufferOffset += (size_t)cmd_list->VtxBuffer.Size * sizeof(ImDrawVert); + indexBufferOffset += (size_t)cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx); + } + + [commandBuffer addCompletedHandler:^(id) + { + dispatch_async(dispatch_get_main_queue(), ^{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + if (bd != nullptr) + { + @synchronized(bd->SharedMetalContext.bufferCache) + { + [bd->SharedMetalContext.bufferCache addObject:vertexBuffer]; + [bd->SharedMetalContext.bufferCache addObject:indexBuffer]; + } + } + }); + }]; +} + +bool ImGui_ImplMetal_CreateFontsTexture(id device) +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + // We are retrieving and uploading the font atlas as a 4-channels RGBA texture here. + // In theory we could call GetTexDataAsAlpha8() and upload a 1-channel texture to save on memory access bandwidth. + // However, using a shader designed for 1-channel texture would make it less obvious to use the ImTextureID facility to render users own textures. + // You can make that change in your implementation. + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + MTLTextureDescriptor* textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatRGBA8Unorm + width:(NSUInteger)width + height:(NSUInteger)height + mipmapped:NO]; + textureDescriptor.usage = MTLTextureUsageShaderRead; +#if TARGET_OS_OSX || TARGET_OS_MACCATALYST + textureDescriptor.storageMode = MTLStorageModeManaged; +#else + textureDescriptor.storageMode = MTLStorageModeShared; +#endif + id texture = [device newTextureWithDescriptor:textureDescriptor]; + [texture replaceRegion:MTLRegionMake2D(0, 0, (NSUInteger)width, (NSUInteger)height) mipmapLevel:0 withBytes:pixels bytesPerRow:(NSUInteger)width * 4]; + bd->SharedMetalContext.fontTexture = texture; + io.Fonts->SetTexID((__bridge void*)bd->SharedMetalContext.fontTexture); // ImTextureID == void* + + return (bd->SharedMetalContext.fontTexture != nil); +} + +void ImGui_ImplMetal_DestroyFontsTexture() +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + bd->SharedMetalContext.fontTexture = nil; + io.Fonts->SetTexID(nullptr); +} + +bool ImGui_ImplMetal_CreateDeviceObjects(id device) +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + MTLDepthStencilDescriptor* depthStencilDescriptor = [[MTLDepthStencilDescriptor alloc] init]; + depthStencilDescriptor.depthWriteEnabled = NO; + depthStencilDescriptor.depthCompareFunction = MTLCompareFunctionAlways; + bd->SharedMetalContext.depthStencilState = [device newDepthStencilStateWithDescriptor:depthStencilDescriptor]; + ImGui_ImplMetal_CreateFontsTexture(device); + + return true; +} + +void ImGui_ImplMetal_DestroyDeviceObjects() +{ + ImGui_ImplMetal_Data* bd = ImGui_ImplMetal_GetBackendData(); + ImGui_ImplMetal_DestroyFontsTexture(); + [bd->SharedMetalContext.renderPipelineStateCache removeAllObjects]; +} + +#pragma mark - MetalBuffer implementation + +@implementation MetalBuffer +- (instancetype)initWithBuffer:(id)buffer +{ + if ((self = [super init])) + { + _buffer = buffer; + _lastReuseTime = GetMachAbsoluteTimeInSeconds(); + } + return self; +} +@end + +#pragma mark - FramebufferDescriptor implementation + +@implementation FramebufferDescriptor +- (instancetype)initWithRenderPassDescriptor:(MTLRenderPassDescriptor*)renderPassDescriptor +{ + if ((self = [super init])) + { + _sampleCount = renderPassDescriptor.colorAttachments[0].texture.sampleCount; + _colorPixelFormat = renderPassDescriptor.colorAttachments[0].texture.pixelFormat; + _depthPixelFormat = renderPassDescriptor.depthAttachment.texture.pixelFormat; + _stencilPixelFormat = renderPassDescriptor.stencilAttachment.texture.pixelFormat; + } + return self; +} + +- (nonnull id)copyWithZone:(nullable NSZone*)zone +{ + FramebufferDescriptor* copy = [[FramebufferDescriptor allocWithZone:zone] init]; + copy.sampleCount = self.sampleCount; + copy.colorPixelFormat = self.colorPixelFormat; + copy.depthPixelFormat = self.depthPixelFormat; + copy.stencilPixelFormat = self.stencilPixelFormat; + return copy; +} + +- (NSUInteger)hash +{ + NSUInteger sc = _sampleCount & 0x3; + NSUInteger cf = _colorPixelFormat & 0x3FF; + NSUInteger df = _depthPixelFormat & 0x3FF; + NSUInteger sf = _stencilPixelFormat & 0x3FF; + NSUInteger hash = (sf << 22) | (df << 12) | (cf << 2) | sc; + return hash; +} + +- (BOOL)isEqual:(id)object +{ + FramebufferDescriptor* other = object; + if (![other isKindOfClass:[FramebufferDescriptor class]]) + return NO; + return other.sampleCount == self.sampleCount && + other.colorPixelFormat == self.colorPixelFormat && + other.depthPixelFormat == self.depthPixelFormat && + other.stencilPixelFormat == self.stencilPixelFormat; +} + +@end + +#pragma mark - MetalContext implementation + +@implementation MetalContext +- (instancetype)init +{ + if ((self = [super init])) + { + self.renderPipelineStateCache = [NSMutableDictionary dictionary]; + self.bufferCache = [NSMutableArray array]; + _lastBufferCachePurge = GetMachAbsoluteTimeInSeconds(); + } + return self; +} + +- (MetalBuffer*)dequeueReusableBufferOfLength:(NSUInteger)length device:(id)device +{ + uint64_t now = GetMachAbsoluteTimeInSeconds(); + + @synchronized(self.bufferCache) + { + // Purge old buffers that haven't been useful for a while + if (now - self.lastBufferCachePurge > 1.0) + { + NSMutableArray* survivors = [NSMutableArray array]; + for (MetalBuffer* candidate in self.bufferCache) + if (candidate.lastReuseTime > self.lastBufferCachePurge) + [survivors addObject:candidate]; + self.bufferCache = [survivors mutableCopy]; + self.lastBufferCachePurge = now; + } + + // See if we have a buffer we can reuse + MetalBuffer* bestCandidate = nil; + for (MetalBuffer* candidate in self.bufferCache) + if (candidate.buffer.length >= length && (bestCandidate == nil || bestCandidate.lastReuseTime > candidate.lastReuseTime)) + bestCandidate = candidate; + + if (bestCandidate != nil) + { + [self.bufferCache removeObject:bestCandidate]; + bestCandidate.lastReuseTime = now; + return bestCandidate; + } + } + + // No luck; make a new buffer + id backing = [device newBufferWithLength:length options:MTLResourceStorageModeShared]; + return [[MetalBuffer alloc] initWithBuffer:backing]; +} + +// Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling. +- (id)renderPipelineStateForFramebufferDescriptor:(FramebufferDescriptor*)descriptor device:(id)device +{ + NSError* error = nil; + + NSString* shaderSource = @"" + "#include \n" + "using namespace metal;\n" + "\n" + "struct Uniforms {\n" + " float4x4 projectionMatrix;\n" + "};\n" + "\n" + "struct VertexIn {\n" + " float2 position [[attribute(0)]];\n" + " float2 texCoords [[attribute(1)]];\n" + " uchar4 color [[attribute(2)]];\n" + "};\n" + "\n" + "struct VertexOut {\n" + " float4 position [[position]];\n" + " float2 texCoords;\n" + " float4 color;\n" + "};\n" + "\n" + "vertex VertexOut vertex_main(VertexIn in [[stage_in]],\n" + " constant Uniforms &uniforms [[buffer(1)]]) {\n" + " VertexOut out;\n" + " out.position = uniforms.projectionMatrix * float4(in.position, 0, 1);\n" + " out.texCoords = in.texCoords;\n" + " out.color = float4(in.color) / float4(255.0);\n" + " return out;\n" + "}\n" + "\n" + "fragment half4 fragment_main(VertexOut in [[stage_in]],\n" + " texture2d texture [[texture(0)]]) {\n" + " constexpr sampler linearSampler(coord::normalized, min_filter::linear, mag_filter::linear, mip_filter::linear);\n" + " half4 texColor = texture.sample(linearSampler, in.texCoords);\n" + " return half4(in.color) * texColor;\n" + "}\n"; + + id library = [device newLibraryWithSource:shaderSource options:nil error:&error]; + if (library == nil) + { + NSLog(@"Error: failed to create Metal library: %@", error); + return nil; + } + + id vertexFunction = [library newFunctionWithName:@"vertex_main"]; + id fragmentFunction = [library newFunctionWithName:@"fragment_main"]; + + if (vertexFunction == nil || fragmentFunction == nil) + { + NSLog(@"Error: failed to find Metal shader functions in library: %@", error); + return nil; + } + + MTLVertexDescriptor* vertexDescriptor = [MTLVertexDescriptor vertexDescriptor]; + vertexDescriptor.attributes[0].offset = IM_OFFSETOF(ImDrawVert, pos); + vertexDescriptor.attributes[0].format = MTLVertexFormatFloat2; // position + vertexDescriptor.attributes[0].bufferIndex = 0; + vertexDescriptor.attributes[1].offset = IM_OFFSETOF(ImDrawVert, uv); + vertexDescriptor.attributes[1].format = MTLVertexFormatFloat2; // texCoords + vertexDescriptor.attributes[1].bufferIndex = 0; + vertexDescriptor.attributes[2].offset = IM_OFFSETOF(ImDrawVert, col); + vertexDescriptor.attributes[2].format = MTLVertexFormatUChar4; // color + vertexDescriptor.attributes[2].bufferIndex = 0; + vertexDescriptor.layouts[0].stepRate = 1; + vertexDescriptor.layouts[0].stepFunction = MTLVertexStepFunctionPerVertex; + vertexDescriptor.layouts[0].stride = sizeof(ImDrawVert); + + MTLRenderPipelineDescriptor* pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init]; + pipelineDescriptor.vertexFunction = vertexFunction; + pipelineDescriptor.fragmentFunction = fragmentFunction; + pipelineDescriptor.vertexDescriptor = vertexDescriptor; + pipelineDescriptor.rasterSampleCount = self.framebufferDescriptor.sampleCount; + pipelineDescriptor.colorAttachments[0].pixelFormat = self.framebufferDescriptor.colorPixelFormat; + pipelineDescriptor.colorAttachments[0].blendingEnabled = YES; + pipelineDescriptor.colorAttachments[0].rgbBlendOperation = MTLBlendOperationAdd; + pipelineDescriptor.colorAttachments[0].sourceRGBBlendFactor = MTLBlendFactorSourceAlpha; + pipelineDescriptor.colorAttachments[0].destinationRGBBlendFactor = MTLBlendFactorOneMinusSourceAlpha; + pipelineDescriptor.colorAttachments[0].alphaBlendOperation = MTLBlendOperationAdd; + pipelineDescriptor.colorAttachments[0].sourceAlphaBlendFactor = MTLBlendFactorOne; + pipelineDescriptor.colorAttachments[0].destinationAlphaBlendFactor = MTLBlendFactorOneMinusSourceAlpha; + pipelineDescriptor.depthAttachmentPixelFormat = self.framebufferDescriptor.depthPixelFormat; + pipelineDescriptor.stencilAttachmentPixelFormat = self.framebufferDescriptor.stencilPixelFormat; + + id renderPipelineState = [device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error]; + if (error != nil) + NSLog(@"Error: failed to create Metal pipeline state: %@", error); + + return renderPipelineState; +} + +@end diff --git a/ImGui/backends/imgui_impl_opengl2.cpp b/ImGui/backends/imgui_impl_opengl2.cpp new file mode 100644 index 0000000..eb26307 --- /dev/null +++ b/ImGui/backends/imgui_impl_opengl2.cpp @@ -0,0 +1,287 @@ +// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline) +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in imgui_impl_opengl3.cpp** +// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. +// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more +// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might +// confuse your GPU driver. +// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-12-08: OpenGL: Fixed mishandling of the the ImDrawCmd::IdxOffset field! This is an old bug but it never had an effect until some internal rendering changes in 1.86. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-01-03: OpenGL: Backup, setup and restore GL_SHADE_MODEL state, disable GL_STENCIL_TEST and disable GL_NORMAL_ARRAY client state to increase compatibility with legacy OpenGL applications. +// 2020-01-23: OpenGL: Backup, setup and restore GL_TEXTURE_ENV to increase compatibility with legacy OpenGL applications. +// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-08-03: OpenGL: Disabling/restoring GL_LIGHTING and GL_COLOR_MATERIAL to increase compatibility with legacy OpenGL applications. +// 2018-06-08: Misc: Extracted imgui_impl_opengl2.cpp/.h away from the old combined GLFW/SDL+OpenGL2 examples. +// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplOpenGL2_RenderDrawData() in the .h file so you can call it yourself. +// 2017-09-01: OpenGL: Save and restore current polygon mode. +// 2016-09-10: OpenGL: Uploading font texture as RGBA32 to increase compatibility with users shaders (not ideal). +// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. + +#include "imgui.h" +#include "imgui_impl_opengl2.h" +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// Include OpenGL header (without an OpenGL loader) requires a bit of fiddling +#if defined(_WIN32) && !defined(APIENTRY) +#define APIENTRY __stdcall // It is customary to use APIENTRY for OpenGL function pointer declarations on all platforms. Additionally, the Windows OpenGL header needs APIENTRY. +#endif +#if defined(_WIN32) && !defined(WINGDIAPI) +#define WINGDIAPI __declspec(dllimport) // Some Windows OpenGL headers need this +#endif +#if defined(__APPLE__) +#define GL_SILENCE_DEPRECATION +#include +#else +#include +#endif + +struct ImGui_ImplOpenGL2_Data +{ + GLuint FontTexture; + + ImGui_ImplOpenGL2_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplOpenGL2_Data* ImGui_ImplOpenGL2_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL2_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +bool ImGui_ImplOpenGL2_Init() +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplOpenGL2_Data* bd = IM_NEW(ImGui_ImplOpenGL2_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_opengl2"; + + return true; +} + +void ImGui_ImplOpenGL2_Shutdown() +{ + ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplOpenGL2_DestroyDeviceObjects(); + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplOpenGL2_NewFrame() +{ + ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL2_Init()?"); + + if (!bd->FontTexture) + ImGui_ImplOpenGL2_CreateDeviceObjects(); +} + +static void ImGui_ImplOpenGL2_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height) +{ + // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill. + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + //glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // In order to composite our output buffer we need to preserve alpha + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_STENCIL_TEST); + glDisable(GL_LIGHTING); + glDisable(GL_COLOR_MATERIAL); + glEnable(GL_SCISSOR_TEST); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + glEnable(GL_TEXTURE_2D); + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + glShadeModel(GL_SMOOTH); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + + // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), + // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below. + // (DO NOT MODIFY THIS FILE! Add the code in your calling function) + // GLint last_program; + // glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); + // glUseProgram(0); + // ImGui_ImplOpenGL2_RenderDrawData(...); + // glUseProgram(last_program) + // There are potentially many more states you could need to clear/setup that we can't access from default headers. + // e.g. glBindBuffer(GL_ARRAY_BUFFER, 0), glDisable(GL_TEXTURE_CUBE_MAP). + + // Setup viewport, orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height); + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(draw_data->DisplayPos.x, draw_data->DisplayPos.x + draw_data->DisplaySize.x, draw_data->DisplayPos.y + draw_data->DisplaySize.y, draw_data->DisplayPos.y, -1.0f, +1.0f); + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); +} + +// OpenGL2 Render function. +// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly. +// This is in order to be able to run within an OpenGL engine that doesn't do so. +void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) + int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); + int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); + if (fb_width == 0 || fb_height == 0) + return; + + // Backup GL state + GLint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); + GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); + GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); + GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); + GLint last_shade_model; glGetIntegerv(GL_SHADE_MODEL, &last_shade_model); + GLint last_tex_env_mode; glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &last_tex_env_mode); + glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT); + + // Setup desired GL state + ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height); + + // Will project scissor/clipping rectangles into framebuffer space + ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) + + // Render command lists + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; + glVertexPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, pos))); + glTexCoordPointer(2, GL_FLOAT, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, uv))); + glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(ImDrawVert), (const GLvoid*)((const char*)vtx_buffer + IM_OFFSETOF(ImDrawVert, col))); + + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle (Y is inverted in OpenGL) + glScissor((int)clip_min.x, (int)((float)fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y)); + + // Bind texture, Draw + glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID()); + glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset); + } + } + } + + // Restore modified GL state + glDisableClientState(GL_COLOR_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + glDisableClientState(GL_VERTEX_ARRAY); + glBindTexture(GL_TEXTURE_2D, (GLuint)last_texture); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glPopAttrib(); + glPolygonMode(GL_FRONT, (GLenum)last_polygon_mode[0]); glPolygonMode(GL_BACK, (GLenum)last_polygon_mode[1]); + glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); + glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); + glShadeModel(last_shade_model); + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, last_tex_env_mode); +} + +bool ImGui_ImplOpenGL2_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. + + // Upload texture to graphics system + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + GLint last_texture; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); + glGenTextures(1, &bd->FontTexture); + glBindTexture(GL_TEXTURE_2D, bd->FontTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); + + // Restore state + glBindTexture(GL_TEXTURE_2D, last_texture); + + return true; +} + +void ImGui_ImplOpenGL2_DestroyFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplOpenGL2_Data* bd = ImGui_ImplOpenGL2_GetBackendData(); + if (bd->FontTexture) + { + glDeleteTextures(1, &bd->FontTexture); + io.Fonts->SetTexID(0); + bd->FontTexture = 0; + } +} + +bool ImGui_ImplOpenGL2_CreateDeviceObjects() +{ + return ImGui_ImplOpenGL2_CreateFontsTexture(); +} + +void ImGui_ImplOpenGL2_DestroyDeviceObjects() +{ + ImGui_ImplOpenGL2_DestroyFontsTexture(); +} diff --git a/ImGui/backends/imgui_impl_opengl2.h b/ImGui/backends/imgui_impl_opengl2.h new file mode 100644 index 0000000..d00d27f --- /dev/null +++ b/ImGui/backends/imgui_impl_opengl2.h @@ -0,0 +1,32 @@ +// dear imgui: Renderer Backend for OpenGL2 (legacy OpenGL, fixed pipeline) +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in imgui_impl_opengl3.cpp** +// This code is mostly provided as a reference to learn how ImGui integration works, because it is shorter to read. +// If your code is using GL3+ context or any semi modern OpenGL calls, using this is likely to make everything more +// complicated, will require your code to reset every single OpenGL attributes to their initial state, and might +// confuse your GPU driver. +// The GL2 code is unable to reset attributes or even call e.g. "glUseProgram(0)" because they don't exist in that API. + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +IMGUI_IMPL_API bool ImGui_ImplOpenGL2_Init(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_RenderDrawData(ImDrawData* draw_data); + +// Called by Init/NewFrame/Shutdown +IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateFontsTexture(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyFontsTexture(); +IMGUI_IMPL_API bool ImGui_ImplOpenGL2_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplOpenGL2_DestroyDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_opengl3.cpp b/ImGui/backends/imgui_impl_opengl3.cpp new file mode 100644 index 0000000..134479f --- /dev/null +++ b/ImGui/backends/imgui_impl_opengl3.cpp @@ -0,0 +1,901 @@ +// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline +// - Desktop GL: 2.x 3.x 4.x +// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0) +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! +// [x] Renderer: Large meshes support (64k+ vertices) with 16-bit indices (Desktop OpenGL only). + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-03-06: OpenGL: Fixed restoration of a potentially deleted OpenGL program, by calling glIsProgram(). (#6220, #6224) +// 2022-11-09: OpenGL: Reverted use of glBufferSubData(), too many corruptions issues + old issues seemingly can't be reproed with Intel drivers nowadays (revert 2021-12-15 and 2022-05-23 changes). +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-27: OpenGL: Added ability to '#define IMGUI_IMPL_OPENGL_DEBUG'. +// 2022-05-23: OpenGL: Reworking 2021-12-15 "Using buffer orphaning" so it only happens on Intel GPU, seems to cause problems otherwise. (#4468, #4825, #4832, #5127). +// 2022-05-13: OpenGL: Fixed state corruption on OpenGL ES 2.0 due to not preserving GL_ELEMENT_ARRAY_BUFFER_BINDING and vertex attribute states. +// 2021-12-15: OpenGL: Using buffer orphaning + glBufferSubData(), seems to fix leaks with multi-viewports with some Intel HD drivers. +// 2021-08-23: OpenGL: Fixed ES 3.0 shader ("#version 300 es") use normal precision floats to avoid wobbly rendering at HD resolutions. +// 2021-08-19: OpenGL: Embed and use our own minimal GL loader (imgui_impl_opengl3_loader.h), removing requirement and support for third-party loader. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-06-25: OpenGL: Use OES_vertex_array extension on Emscripten + backup/restore current state. +// 2021-06-21: OpenGL: Destroy individual vertex/fragment shader objects right after they are linked into the main shader. +// 2021-05-24: OpenGL: Access GL_CLIP_ORIGIN when "GL_ARB_clip_control" extension is detected, inside of just OpenGL 4.5 version. +// 2021-05-19: OpenGL: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-04-06: OpenGL: Don't try to read GL_CLIP_ORIGIN unless we're OpenGL 4.5 or greater. +// 2021-02-18: OpenGL: Change blending equation to preserve alpha in output buffer. +// 2021-01-03: OpenGL: Backup, setup and restore GL_STENCIL_TEST state. +// 2020-10-23: OpenGL: Backup, setup and restore GL_PRIMITIVE_RESTART state. +// 2020-10-15: OpenGL: Use glGetString(GL_VERSION) instead of glGetIntegerv(GL_MAJOR_VERSION, ...) when the later returns zero (e.g. Desktop GL 2.x) +// 2020-09-17: OpenGL: Fix to avoid compiling/calling glBindSampler() on ES or pre 3.3 context which have the defines set by a loader. +// 2020-07-10: OpenGL: Added support for glad2 OpenGL loader. +// 2020-05-08: OpenGL: Made default GLSL version 150 (instead of 130) on OSX. +// 2020-04-21: OpenGL: Fixed handling of glClipControl(GL_UPPER_LEFT) by inverting projection matrix. +// 2020-04-12: OpenGL: Fixed context version check mistakenly testing for 4.0+ instead of 3.2+ to enable ImGuiBackendFlags_RendererHasVtxOffset. +// 2020-03-24: OpenGL: Added support for glbinding 2.x OpenGL loader. +// 2020-01-07: OpenGL: Added support for glbinding 3.x OpenGL loader. +// 2019-10-25: OpenGL: Using a combination of GL define and runtime GL version to decide whether to use glDrawElementsBaseVertex(). Fix building with pre-3.2 GL loaders. +// 2019-09-22: OpenGL: Detect default GL loader using __has_include compiler facility. +// 2019-09-16: OpenGL: Tweak initialization code to allow application calling ImGui_ImplOpenGL3_CreateFontsTexture() before the first NewFrame() call. +// 2019-05-29: OpenGL: Desktop GL only: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: OpenGL: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-03-29: OpenGL: Not calling glBindBuffer more than necessary in the render loop. +// 2019-03-15: OpenGL: Added a GL call + comments in ImGui_ImplOpenGL3_Init() to detect uninitialized GL function loaders early. +// 2019-03-03: OpenGL: Fix support for ES 2.0 (WebGL 1.0). +// 2019-02-20: OpenGL: Fix for OSX not supporting OpenGL 4.5, we don't try to read GL_CLIP_ORIGIN even if defined by the headers/loader. +// 2019-02-11: OpenGL: Projecting clipping rectangles correctly using draw_data->FramebufferScale to allow multi-viewports for retina display. +// 2019-02-01: OpenGL: Using GLSL 410 shaders for any version over 410 (e.g. 430, 450). +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-11-13: OpenGL: Support for GL 4.5's glClipControl(GL_UPPER_LEFT) / GL_CLIP_ORIGIN. +// 2018-08-29: OpenGL: Added support for more OpenGL loaders: glew and glad, with comments indicative that any loader can be used. +// 2018-08-09: OpenGL: Default to OpenGL ES 3 on iOS and Android. GLSL version default to "#version 300 ES". +// 2018-07-30: OpenGL: Support for GLSL 300 ES and 410 core. Fixes for Emscripten compilation. +// 2018-07-10: OpenGL: Support for more GLSL versions (based on the GLSL version string). Added error output when shaders fail to compile/link. +// 2018-06-08: Misc: Extracted imgui_impl_opengl3.cpp/.h away from the old combined GLFW/SDL+OpenGL3 examples. +// 2018-06-08: OpenGL: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-05-25: OpenGL: Removed unnecessary backup/restore of GL_ELEMENT_ARRAY_BUFFER_BINDING since this is part of the VAO state. +// 2018-05-14: OpenGL: Making the call to glBindSampler() optional so 3.2 context won't fail if the function is a nullptr pointer. +// 2018-03-06: OpenGL: Added const char* glsl_version parameter to ImGui_ImplOpenGL3_Init() so user can override the GLSL version e.g. "#version 150". +// 2018-02-23: OpenGL: Create the VAO in the render function so the setup can more easily be used with multiple shared GL context. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplSdlGL3_RenderDrawData() in the .h file so you can call it yourself. +// 2018-01-07: OpenGL: Changed GLSL shader version from 330 to 150. +// 2017-09-01: OpenGL: Save and restore current bound sampler. Save and restore current polygon mode. +// 2017-05-01: OpenGL: Fixed save and restore of current blend func state. +// 2017-05-01: OpenGL: Fixed save and restore of current GL_ACTIVE_TEXTURE. +// 2016-09-05: OpenGL: Fixed save and restore of current scissor rectangle. +// 2016-07-29: OpenGL: Explicitly setting GL_UNPACK_ROW_LENGTH to reduce issues because SDL changes it. (#752) + +//---------------------------------------- +// OpenGL GLSL GLSL +// version version string +//---------------------------------------- +// 2.0 110 "#version 110" +// 2.1 120 "#version 120" +// 3.0 130 "#version 130" +// 3.1 140 "#version 140" +// 3.2 150 "#version 150" +// 3.3 330 "#version 330 core" +// 4.0 400 "#version 400 core" +// 4.1 410 "#version 410 core" +// 4.2 420 "#version 410 core" +// 4.3 430 "#version 430 core" +// ES 2.0 100 "#version 100" = WebGL 1.0 +// ES 3.0 300 "#version 300 es" = WebGL 2.0 +//---------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#include "imgui_impl_opengl3.h" +#include +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif +#if defined(__APPLE__) +#include +#endif + +// Clang warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#endif +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' +#pragma GCC diagnostic ignored "-Wcast-function-type" // warning: cast between incompatible function types +#endif + +// GL includes +#if defined(IMGUI_IMPL_OPENGL_ES2) +#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) +#include // Use GL ES 2 +#else +#include // Use GL ES 2 +#endif +#if defined(__EMSCRIPTEN__) +#ifndef GL_GLEXT_PROTOTYPES +#define GL_GLEXT_PROTOTYPES +#endif +#include +#endif +#elif defined(IMGUI_IMPL_OPENGL_ES3) +#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) +#include // Use GL ES 3 +#else +#include // Use GL ES 3 +#endif +#elif !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) +// Modern desktop OpenGL doesn't have a standard portable header file to load OpenGL function pointers. +// Helper libraries are often used for this purpose! Here we are using our own minimal custom loader based on gl3w. +// In the rest of your app/engine, you can use another loader of your choice (gl3w, glew, glad, glbinding, glext, glLoadGen, etc.). +// If you happen to be developing a new feature for this backend (imgui_impl_opengl3.cpp): +// - You may need to regenerate imgui_impl_opengl3_loader.h to add new symbols. See https://github.com/dearimgui/gl3w_stripped +// - You can temporarily use an unstripped version. See https://github.com/dearimgui/gl3w_stripped/releases +// Changes to this backend using new APIs should be accompanied by a regenerated stripped loader version. +#define IMGL3W_IMPL +#include "imgui_impl_opengl3_loader.h" +#endif + +// Vertex arrays are not supported on ES2/WebGL1 unless Emscripten which uses an extension +#ifndef IMGUI_IMPL_OPENGL_ES2 +#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY +#elif defined(__EMSCRIPTEN__) +#define IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY +#define glBindVertexArray glBindVertexArrayOES +#define glGenVertexArrays glGenVertexArraysOES +#define glDeleteVertexArrays glDeleteVertexArraysOES +#define GL_VERTEX_ARRAY_BINDING GL_VERTEX_ARRAY_BINDING_OES +#endif + +// Desktop GL 2.0+ has glPolygonMode() which GL ES and WebGL don't have. +#ifdef GL_POLYGON_MODE +#define IMGUI_IMPL_HAS_POLYGON_MODE +#endif + +// Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have. +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_2) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET +#endif + +// Desktop GL 3.3+ has glBindSampler() +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_3) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER +#endif + +// Desktop GL 3.1+ has GL_PRIMITIVE_RESTART state +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && defined(GL_VERSION_3_1) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART +#endif + +// Desktop GL use extension detection +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) +#define IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS +#endif + +// [Debugging] +//#define IMGUI_IMPL_OPENGL_DEBUG +#ifdef IMGUI_IMPL_OPENGL_DEBUG +#include +#define GL_CALL(_CALL) do { _CALL; GLenum gl_err = glGetError(); if (gl_err != 0) fprintf(stderr, "GL error 0x%x returned from '%s'.\n", gl_err, #_CALL); } while (0) // Call with error check +#else +#define GL_CALL(_CALL) _CALL // Call without error check +#endif + +// OpenGL Data +struct ImGui_ImplOpenGL3_Data +{ + GLuint GlVersion; // Extracted at runtime using GL_MAJOR_VERSION, GL_MINOR_VERSION queries (e.g. 320 for GL 3.2) + char GlslVersionString[32]; // Specified by user or detected based on compile time GL settings. + GLuint FontTexture; + GLuint ShaderHandle; + GLint AttribLocationTex; // Uniforms location + GLint AttribLocationProjMtx; + GLuint AttribLocationVtxPos; // Vertex attributes location + GLuint AttribLocationVtxUV; + GLuint AttribLocationVtxColor; + unsigned int VboHandle, ElementsHandle; + GLsizeiptr VertexBufferSize; + GLsizeiptr IndexBufferSize; + bool HasClipOrigin; + bool UseBufferSubData; + + ImGui_ImplOpenGL3_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplOpenGL3_Data* ImGui_ImplOpenGL3_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplOpenGL3_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// OpenGL vertex attribute state (for ES 1.0 and ES 2.0 only) +#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY +struct ImGui_ImplOpenGL3_VtxAttribState +{ + GLint Enabled, Size, Type, Normalized, Stride; + GLvoid* Ptr; + + void GetState(GLint index) + { + glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &Enabled); + glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_SIZE, &Size); + glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_TYPE, &Type); + glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &Normalized); + glGetVertexAttribiv(index, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &Stride); + glGetVertexAttribPointerv(index, GL_VERTEX_ATTRIB_ARRAY_POINTER, &Ptr); + } + void SetState(GLint index) + { + glVertexAttribPointer(index, Size, Type, (GLboolean)Normalized, Stride, Ptr); + if (Enabled) glEnableVertexAttribArray(index); else glDisableVertexAttribArray(index); + } +}; +#endif + +// Functions +bool ImGui_ImplOpenGL3_Init(const char* glsl_version) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Initialize our loader +#if !defined(IMGUI_IMPL_OPENGL_ES2) && !defined(IMGUI_IMPL_OPENGL_ES3) && !defined(IMGUI_IMPL_OPENGL_LOADER_CUSTOM) + if (imgl3wInit() != 0) + { + fprintf(stderr, "Failed to initialize OpenGL loader!\n"); + return false; + } +#endif + + // Setup backend capabilities flags + ImGui_ImplOpenGL3_Data* bd = IM_NEW(ImGui_ImplOpenGL3_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_opengl3"; + + // Query for GL version (e.g. 320 for GL 3.2) +#if !defined(IMGUI_IMPL_OPENGL_ES2) + GLint major = 0; + GLint minor = 0; + glGetIntegerv(GL_MAJOR_VERSION, &major); + glGetIntegerv(GL_MINOR_VERSION, &minor); + if (major == 0 && minor == 0) + { + // Query GL_VERSION in desktop GL 2.x, the string will start with "." + const char* gl_version = (const char*)glGetString(GL_VERSION); + sscanf(gl_version, "%d.%d", &major, &minor); + } + bd->GlVersion = (GLuint)(major * 100 + minor * 10); + + bd->UseBufferSubData = false; + /* + // Query vendor to enable glBufferSubData kludge +#ifdef _WIN32 + if (const char* vendor = (const char*)glGetString(GL_VENDOR)) + if (strncmp(vendor, "Intel", 5) == 0) + bd->UseBufferSubData = true; +#endif + */ +#else + bd->GlVersion = 200; // GLES 2 +#endif + +#ifdef IMGUI_IMPL_OPENGL_DEBUG + printf("GL_MAJOR_VERSION = %d\nGL_MINOR_VERSION = %d\nGL_VENDOR = '%s'\nGL_RENDERER = '%s'\n", major, minor, (const char*)glGetString(GL_VENDOR), (const char*)glGetString(GL_RENDERER)); // [DEBUG] +#endif + +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET + if (bd->GlVersion >= 320) + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. +#endif + + // Store GLSL version string so we can refer to it later in case we recreate shaders. + // Note: GLSL version is NOT the same as GL version. Leave this to nullptr if unsure. + if (glsl_version == nullptr) + { +#if defined(IMGUI_IMPL_OPENGL_ES2) + glsl_version = "#version 100"; +#elif defined(IMGUI_IMPL_OPENGL_ES3) + glsl_version = "#version 300 es"; +#elif defined(__APPLE__) + glsl_version = "#version 150"; +#else + glsl_version = "#version 130"; +#endif + } + IM_ASSERT((int)strlen(glsl_version) + 2 < IM_ARRAYSIZE(bd->GlslVersionString)); + strcpy(bd->GlslVersionString, glsl_version); + strcat(bd->GlslVersionString, "\n"); + + // Make an arbitrary GL call (we don't actually need the result) + // IF YOU GET A CRASH HERE: it probably means the OpenGL function loader didn't do its job. Let us know! + GLint current_texture; + glGetIntegerv(GL_TEXTURE_BINDING_2D, ¤t_texture); + + // Detect extensions we support + bd->HasClipOrigin = (bd->GlVersion >= 450); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_EXTENSIONS + GLint num_extensions = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &num_extensions); + for (GLint i = 0; i < num_extensions; i++) + { + const char* extension = (const char*)glGetStringi(GL_EXTENSIONS, i); + if (extension != nullptr && strcmp(extension, "GL_ARB_clip_control") == 0) + bd->HasClipOrigin = true; + } +#endif + + return true; +} + +void ImGui_ImplOpenGL3_Shutdown() +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplOpenGL3_DestroyDeviceObjects(); + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplOpenGL3_NewFrame() +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplOpenGL3_Init()?"); + + if (!bd->ShaderHandle) + ImGui_ImplOpenGL3_CreateDeviceObjects(); +} + +static void ImGui_ImplOpenGL3_SetupRenderState(ImDrawData* draw_data, int fb_width, int fb_height, GLuint vertex_array_object) +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + + // Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill + glEnable(GL_BLEND); + glBlendEquation(GL_FUNC_ADD); + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_CULL_FACE); + glDisable(GL_DEPTH_TEST); + glDisable(GL_STENCIL_TEST); + glEnable(GL_SCISSOR_TEST); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART + if (bd->GlVersion >= 310) + glDisable(GL_PRIMITIVE_RESTART); +#endif +#ifdef IMGUI_IMPL_HAS_POLYGON_MODE + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +#endif + + // Support for GL 4.5 rarely used glClipControl(GL_UPPER_LEFT) +#if defined(GL_CLIP_ORIGIN) + bool clip_origin_lower_left = true; + if (bd->HasClipOrigin) + { + GLenum current_clip_origin = 0; glGetIntegerv(GL_CLIP_ORIGIN, (GLint*)¤t_clip_origin); + if (current_clip_origin == GL_UPPER_LEFT) + clip_origin_lower_left = false; + } +#endif + + // Setup viewport, orthographic projection matrix + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + GL_CALL(glViewport(0, 0, (GLsizei)fb_width, (GLsizei)fb_height)); + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; +#if defined(GL_CLIP_ORIGIN) + if (!clip_origin_lower_left) { float tmp = T; T = B; B = tmp; } // Swap top and bottom if origin is upper left +#endif + const float ortho_projection[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, -1.0f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.0f, 1.0f }, + }; + glUseProgram(bd->ShaderHandle); + glUniform1i(bd->AttribLocationTex, 0); + glUniformMatrix4fv(bd->AttribLocationProjMtx, 1, GL_FALSE, &ortho_projection[0][0]); + +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER + if (bd->GlVersion >= 330) + glBindSampler(0, 0); // We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise. +#endif + + (void)vertex_array_object; +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + glBindVertexArray(vertex_array_object); +#endif + + // Bind vertex/index buffers and setup attributes for ImDrawVert + GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, bd->VboHandle)); + GL_CALL(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bd->ElementsHandle)); + GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxPos)); + GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxUV)); + GL_CALL(glEnableVertexAttribArray(bd->AttribLocationVtxColor)); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxPos, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, pos))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxUV, 2, GL_FLOAT, GL_FALSE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, uv))); + GL_CALL(glVertexAttribPointer(bd->AttribLocationVtxColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(ImDrawVert), (GLvoid*)IM_OFFSETOF(ImDrawVert, col))); +} + +// OpenGL3 Render function. +// Note that this implementation is little overcomplicated because we are saving/setting up/restoring every OpenGL state explicitly. +// This is in order to be able to run within an OpenGL engine that doesn't do so. +void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) + int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); + int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); + if (fb_width <= 0 || fb_height <= 0) + return; + + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + + // Backup GL state + GLenum last_active_texture; glGetIntegerv(GL_ACTIVE_TEXTURE, (GLint*)&last_active_texture); + glActiveTexture(GL_TEXTURE0); + GLuint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, (GLint*)&last_program); + GLuint last_texture; glGetIntegerv(GL_TEXTURE_BINDING_2D, (GLint*)&last_texture); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER + GLuint last_sampler; if (bd->GlVersion >= 330) { glGetIntegerv(GL_SAMPLER_BINDING, (GLint*)&last_sampler); } else { last_sampler = 0; } +#endif + GLuint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, (GLint*)&last_array_buffer); +#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + // This is part of VAO on OpenGL 3.0+ and OpenGL ES 3.0+. + GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer); + ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_pos; last_vtx_attrib_state_pos.GetState(bd->AttribLocationVtxPos); + ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_uv; last_vtx_attrib_state_uv.GetState(bd->AttribLocationVtxUV); + ImGui_ImplOpenGL3_VtxAttribState last_vtx_attrib_state_color; last_vtx_attrib_state_color.GetState(bd->AttribLocationVtxColor); +#endif +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + GLuint last_vertex_array_object; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, (GLint*)&last_vertex_array_object); +#endif +#ifdef IMGUI_IMPL_HAS_POLYGON_MODE + GLint last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode); +#endif + GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport); + GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box); + GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb); + GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb); + GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha); + GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha); + GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb); + GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha); + GLboolean last_enable_blend = glIsEnabled(GL_BLEND); + GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE); + GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST); + GLboolean last_enable_stencil_test = glIsEnabled(GL_STENCIL_TEST); + GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART + GLboolean last_enable_primitive_restart = (bd->GlVersion >= 310) ? glIsEnabled(GL_PRIMITIVE_RESTART) : GL_FALSE; +#endif + + // Setup desired GL state + // Recreate the VAO every time (this is to easily allow multiple GL contexts to be rendered to. VAO are not shared among GL contexts) + // The renderer would actually work without any VAO bound, but then our VertexAttrib calls would overwrite the default one currently bound. + GLuint vertex_array_object = 0; +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + GL_CALL(glGenVertexArrays(1, &vertex_array_object)); +#endif + ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); + + // Will project scissor/clipping rectangles into framebuffer space + ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) + + // Render command lists + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + + // Upload vertex/index buffers + // - OpenGL drivers are in a very sorry state nowadays.... + // During 2021 we attempted to switch from glBufferData() to orphaning+glBufferSubData() following reports + // of leaks on Intel GPU when using multi-viewports on Windows. + // - After this we kept hearing of various display corruptions issues. We started disabling on non-Intel GPU, but issues still got reported on Intel. + // - We are now back to using exclusively glBufferData(). So bd->UseBufferSubData IS ALWAYS FALSE in this code. + // We are keeping the old code path for a while in case people finding new issues may want to test the bd->UseBufferSubData path. + // - See https://github.com/ocornut/imgui/issues/4468 and please report any corruption issues. + const GLsizeiptr vtx_buffer_size = (GLsizeiptr)cmd_list->VtxBuffer.Size * (int)sizeof(ImDrawVert); + const GLsizeiptr idx_buffer_size = (GLsizeiptr)cmd_list->IdxBuffer.Size * (int)sizeof(ImDrawIdx); + if (bd->UseBufferSubData) + { + if (bd->VertexBufferSize < vtx_buffer_size) + { + bd->VertexBufferSize = vtx_buffer_size; + GL_CALL(glBufferData(GL_ARRAY_BUFFER, bd->VertexBufferSize, nullptr, GL_STREAM_DRAW)); + } + if (bd->IndexBufferSize < idx_buffer_size) + { + bd->IndexBufferSize = idx_buffer_size; + GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, bd->IndexBufferSize, nullptr, GL_STREAM_DRAW)); + } + GL_CALL(glBufferSubData(GL_ARRAY_BUFFER, 0, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data)); + GL_CALL(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data)); + } + else + { + GL_CALL(glBufferData(GL_ARRAY_BUFFER, vtx_buffer_size, (const GLvoid*)cmd_list->VtxBuffer.Data, GL_STREAM_DRAW)); + GL_CALL(glBufferData(GL_ELEMENT_ARRAY_BUFFER, idx_buffer_size, (const GLvoid*)cmd_list->IdxBuffer.Data, GL_STREAM_DRAW)); + } + + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle (Y is inverted in OpenGL) + GL_CALL(glScissor((int)clip_min.x, (int)((float)fb_height - clip_max.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y))); + + // Bind texture, Draw + GL_CALL(glBindTexture(GL_TEXTURE_2D, (GLuint)(intptr_t)pcmd->GetTexID())); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_VTX_OFFSET + if (bd->GlVersion >= 320) + GL_CALL(glDrawElementsBaseVertex(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)), (GLint)pcmd->VtxOffset)); + else +#endif + GL_CALL(glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, (void*)(intptr_t)(pcmd->IdxOffset * sizeof(ImDrawIdx)))); + } + } + } + + // Destroy the temporary VAO +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + GL_CALL(glDeleteVertexArrays(1, &vertex_array_object)); +#endif + + // Restore modified GL state + // This "glIsProgram()" check is required because if the program is "pending deletion" at the time of binding backup, it will have been deleted by now and will cause an OpenGL error. See #6220. + if (glIsProgram(last_program)) glUseProgram(last_program); + glBindTexture(GL_TEXTURE_2D, last_texture); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_BIND_SAMPLER + if (bd->GlVersion >= 330) + glBindSampler(0, last_sampler); +#endif + glActiveTexture(last_active_texture); +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + glBindVertexArray(last_vertex_array_object); +#endif + glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); +#ifndef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer); + last_vtx_attrib_state_pos.SetState(bd->AttribLocationVtxPos); + last_vtx_attrib_state_uv.SetState(bd->AttribLocationVtxUV); + last_vtx_attrib_state_color.SetState(bd->AttribLocationVtxColor); +#endif + glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha); + glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha); + if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND); + if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); + if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST); + if (last_enable_stencil_test) glEnable(GL_STENCIL_TEST); else glDisable(GL_STENCIL_TEST); + if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST); +#ifdef IMGUI_IMPL_OPENGL_MAY_HAVE_PRIMITIVE_RESTART + if (bd->GlVersion >= 310) { if (last_enable_primitive_restart) glEnable(GL_PRIMITIVE_RESTART); else glDisable(GL_PRIMITIVE_RESTART); } +#endif + +#ifdef IMGUI_IMPL_HAS_POLYGON_MODE + glPolygonMode(GL_FRONT_AND_BACK, (GLenum)last_polygon_mode[0]); +#endif + glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]); + glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]); + (void)bd; // Not all compilation paths use this +} + +bool ImGui_ImplOpenGL3_CreateFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + + // Build texture atlas + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. + + // Upload texture to graphics system + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + GLint last_texture; + GL_CALL(glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture)); + GL_CALL(glGenTextures(1, &bd->FontTexture)); + GL_CALL(glBindTexture(GL_TEXTURE_2D, bd->FontTexture)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)); + GL_CALL(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)); +#ifdef GL_UNPACK_ROW_LENGTH // Not on WebGL/ES + GL_CALL(glPixelStorei(GL_UNPACK_ROW_LENGTH, 0)); +#endif + GL_CALL(glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels)); + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); + + // Restore state + GL_CALL(glBindTexture(GL_TEXTURE_2D, last_texture)); + + return true; +} + +void ImGui_ImplOpenGL3_DestroyFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + if (bd->FontTexture) + { + glDeleteTextures(1, &bd->FontTexture); + io.Fonts->SetTexID(0); + bd->FontTexture = 0; + } +} + +// If you get an error please report on github. You may try different GL context version or GLSL version. See GL<>GLSL version table at the top of this file. +static bool CheckShader(GLuint handle, const char* desc) +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + GLint status = 0, log_length = 0; + glGetShaderiv(handle, GL_COMPILE_STATUS, &status); + glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length); + if ((GLboolean)status == GL_FALSE) + fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to compile %s! With GLSL: %s\n", desc, bd->GlslVersionString); + if (log_length > 1) + { + ImVector buf; + buf.resize((int)(log_length + 1)); + glGetShaderInfoLog(handle, log_length, nullptr, (GLchar*)buf.begin()); + fprintf(stderr, "%s\n", buf.begin()); + } + return (GLboolean)status == GL_TRUE; +} + +// If you get an error please report on GitHub. You may try different GL context version or GLSL version. +static bool CheckProgram(GLuint handle, const char* desc) +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + GLint status = 0, log_length = 0; + glGetProgramiv(handle, GL_LINK_STATUS, &status); + glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length); + if ((GLboolean)status == GL_FALSE) + fprintf(stderr, "ERROR: ImGui_ImplOpenGL3_CreateDeviceObjects: failed to link %s! With GLSL %s\n", desc, bd->GlslVersionString); + if (log_length > 1) + { + ImVector buf; + buf.resize((int)(log_length + 1)); + glGetProgramInfoLog(handle, log_length, nullptr, (GLchar*)buf.begin()); + fprintf(stderr, "%s\n", buf.begin()); + } + return (GLboolean)status == GL_TRUE; +} + +bool ImGui_ImplOpenGL3_CreateDeviceObjects() +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + + // Backup GL state + GLint last_texture, last_array_buffer; + glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture); + glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer); +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + GLint last_vertex_array; + glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array); +#endif + + // Parse GLSL version string + int glsl_version = 130; + sscanf(bd->GlslVersionString, "#version %d", &glsl_version); + + const GLchar* vertex_shader_glsl_120 = + "uniform mat4 ProjMtx;\n" + "attribute vec2 Position;\n" + "attribute vec2 UV;\n" + "attribute vec4 Color;\n" + "varying vec2 Frag_UV;\n" + "varying vec4 Frag_Color;\n" + "void main()\n" + "{\n" + " Frag_UV = UV;\n" + " Frag_Color = Color;\n" + " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" + "}\n"; + + const GLchar* vertex_shader_glsl_130 = + "uniform mat4 ProjMtx;\n" + "in vec2 Position;\n" + "in vec2 UV;\n" + "in vec4 Color;\n" + "out vec2 Frag_UV;\n" + "out vec4 Frag_Color;\n" + "void main()\n" + "{\n" + " Frag_UV = UV;\n" + " Frag_Color = Color;\n" + " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" + "}\n"; + + const GLchar* vertex_shader_glsl_300_es = + "precision highp float;\n" + "layout (location = 0) in vec2 Position;\n" + "layout (location = 1) in vec2 UV;\n" + "layout (location = 2) in vec4 Color;\n" + "uniform mat4 ProjMtx;\n" + "out vec2 Frag_UV;\n" + "out vec4 Frag_Color;\n" + "void main()\n" + "{\n" + " Frag_UV = UV;\n" + " Frag_Color = Color;\n" + " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" + "}\n"; + + const GLchar* vertex_shader_glsl_410_core = + "layout (location = 0) in vec2 Position;\n" + "layout (location = 1) in vec2 UV;\n" + "layout (location = 2) in vec4 Color;\n" + "uniform mat4 ProjMtx;\n" + "out vec2 Frag_UV;\n" + "out vec4 Frag_Color;\n" + "void main()\n" + "{\n" + " Frag_UV = UV;\n" + " Frag_Color = Color;\n" + " gl_Position = ProjMtx * vec4(Position.xy,0,1);\n" + "}\n"; + + const GLchar* fragment_shader_glsl_120 = + "#ifdef GL_ES\n" + " precision mediump float;\n" + "#endif\n" + "uniform sampler2D Texture;\n" + "varying vec2 Frag_UV;\n" + "varying vec4 Frag_Color;\n" + "void main()\n" + "{\n" + " gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);\n" + "}\n"; + + const GLchar* fragment_shader_glsl_130 = + "uniform sampler2D Texture;\n" + "in vec2 Frag_UV;\n" + "in vec4 Frag_Color;\n" + "out vec4 Out_Color;\n" + "void main()\n" + "{\n" + " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" + "}\n"; + + const GLchar* fragment_shader_glsl_300_es = + "precision mediump float;\n" + "uniform sampler2D Texture;\n" + "in vec2 Frag_UV;\n" + "in vec4 Frag_Color;\n" + "layout (location = 0) out vec4 Out_Color;\n" + "void main()\n" + "{\n" + " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" + "}\n"; + + const GLchar* fragment_shader_glsl_410_core = + "in vec2 Frag_UV;\n" + "in vec4 Frag_Color;\n" + "uniform sampler2D Texture;\n" + "layout (location = 0) out vec4 Out_Color;\n" + "void main()\n" + "{\n" + " Out_Color = Frag_Color * texture(Texture, Frag_UV.st);\n" + "}\n"; + + // Select shaders matching our GLSL versions + const GLchar* vertex_shader = nullptr; + const GLchar* fragment_shader = nullptr; + if (glsl_version < 130) + { + vertex_shader = vertex_shader_glsl_120; + fragment_shader = fragment_shader_glsl_120; + } + else if (glsl_version >= 410) + { + vertex_shader = vertex_shader_glsl_410_core; + fragment_shader = fragment_shader_glsl_410_core; + } + else if (glsl_version == 300) + { + vertex_shader = vertex_shader_glsl_300_es; + fragment_shader = fragment_shader_glsl_300_es; + } + else + { + vertex_shader = vertex_shader_glsl_130; + fragment_shader = fragment_shader_glsl_130; + } + + // Create shaders + const GLchar* vertex_shader_with_version[2] = { bd->GlslVersionString, vertex_shader }; + GLuint vert_handle = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vert_handle, 2, vertex_shader_with_version, nullptr); + glCompileShader(vert_handle); + CheckShader(vert_handle, "vertex shader"); + + const GLchar* fragment_shader_with_version[2] = { bd->GlslVersionString, fragment_shader }; + GLuint frag_handle = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(frag_handle, 2, fragment_shader_with_version, nullptr); + glCompileShader(frag_handle); + CheckShader(frag_handle, "fragment shader"); + + // Link + bd->ShaderHandle = glCreateProgram(); + glAttachShader(bd->ShaderHandle, vert_handle); + glAttachShader(bd->ShaderHandle, frag_handle); + glLinkProgram(bd->ShaderHandle); + CheckProgram(bd->ShaderHandle, "shader program"); + + glDetachShader(bd->ShaderHandle, vert_handle); + glDetachShader(bd->ShaderHandle, frag_handle); + glDeleteShader(vert_handle); + glDeleteShader(frag_handle); + + bd->AttribLocationTex = glGetUniformLocation(bd->ShaderHandle, "Texture"); + bd->AttribLocationProjMtx = glGetUniformLocation(bd->ShaderHandle, "ProjMtx"); + bd->AttribLocationVtxPos = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Position"); + bd->AttribLocationVtxUV = (GLuint)glGetAttribLocation(bd->ShaderHandle, "UV"); + bd->AttribLocationVtxColor = (GLuint)glGetAttribLocation(bd->ShaderHandle, "Color"); + + // Create buffers + glGenBuffers(1, &bd->VboHandle); + glGenBuffers(1, &bd->ElementsHandle); + + ImGui_ImplOpenGL3_CreateFontsTexture(); + + // Restore modified GL state + glBindTexture(GL_TEXTURE_2D, last_texture); + glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer); +#ifdef IMGUI_IMPL_OPENGL_USE_VERTEX_ARRAY + glBindVertexArray(last_vertex_array); +#endif + + return true; +} + +void ImGui_ImplOpenGL3_DestroyDeviceObjects() +{ + ImGui_ImplOpenGL3_Data* bd = ImGui_ImplOpenGL3_GetBackendData(); + if (bd->VboHandle) { glDeleteBuffers(1, &bd->VboHandle); bd->VboHandle = 0; } + if (bd->ElementsHandle) { glDeleteBuffers(1, &bd->ElementsHandle); bd->ElementsHandle = 0; } + if (bd->ShaderHandle) { glDeleteProgram(bd->ShaderHandle); bd->ShaderHandle = 0; } + ImGui_ImplOpenGL3_DestroyFontsTexture(); +} + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif +#if defined(__clang__) +#pragma clang diagnostic pop +#endif diff --git a/ImGui/backends/imgui_impl_opengl3.h b/ImGui/backends/imgui_impl_opengl3.h new file mode 100644 index 0000000..3a95f05 --- /dev/null +++ b/ImGui/backends/imgui_impl_opengl3.h @@ -0,0 +1,55 @@ +// dear imgui: Renderer Backend for modern OpenGL with shaders / programmatic pipeline +// - Desktop GL: 2.x 3.x 4.x +// - Embedded GL: ES 2.0 (WebGL 1.0), ES 3.0 (WebGL 2.0) +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'GLuint' OpenGL texture identifier as void*/ImTextureID. Read the FAQ about ImTextureID! +// [x] Renderer: Large meshes support (64k+ vertices) with 16-bit indices (Desktop OpenGL only). + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// About GLSL version: +// The 'glsl_version' initialization parameter should be nullptr (default) or a "#version XXX" string. +// On computer platform the GLSL version default to "#version 130". On OpenGL ES 3 platform it defaults to "#version 300 es" +// Only override if your GL version doesn't handle this GLSL version. See GLSL version table at the top of imgui_impl_opengl3.cpp. + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +// Backend API +IMGUI_IMPL_API bool ImGui_ImplOpenGL3_Init(const char* glsl_version = nullptr); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_RenderDrawData(ImDrawData* draw_data); + +// (Optional) Called by Init/NewFrame/Shutdown +IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateFontsTexture(); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyFontsTexture(); +IMGUI_IMPL_API bool ImGui_ImplOpenGL3_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects(); + +// Specific OpenGL ES versions +//#define IMGUI_IMPL_OPENGL_ES2 // Auto-detected on Emscripten +//#define IMGUI_IMPL_OPENGL_ES3 // Auto-detected on iOS/Android + +// You can explicitly select GLES2 or GLES3 API by using one of the '#define IMGUI_IMPL_OPENGL_LOADER_XXX' in imconfig.h or compiler command-line. +#if !defined(IMGUI_IMPL_OPENGL_ES2) \ + && !defined(IMGUI_IMPL_OPENGL_ES3) + +// Try to detect GLES on matching platforms +#if defined(__APPLE__) +#include +#endif +#if (defined(__APPLE__) && (TARGET_OS_IOS || TARGET_OS_TV)) || (defined(__ANDROID__)) +#define IMGUI_IMPL_OPENGL_ES3 // iOS, Android -> GL ES 3, "#version 300 es" +#elif defined(__EMSCRIPTEN__) || defined(__amigaos4__) +#define IMGUI_IMPL_OPENGL_ES2 // Emscripten -> GL ES 2, "#version 100" +#else +// Otherwise imgui_impl_opengl3_loader.h will be used. +#endif + +#endif diff --git a/ImGui/backends/imgui_impl_opengl3_loader.h b/ImGui/backends/imgui_impl_opengl3_loader.h new file mode 100644 index 0000000..84a5a4a --- /dev/null +++ b/ImGui/backends/imgui_impl_opengl3_loader.h @@ -0,0 +1,805 @@ +//----------------------------------------------------------------------------- +// About imgui_impl_opengl3_loader.h: +// +// We embed our own OpenGL loader to not require user to provide their own or to have to use ours, +// which proved to be endless problems for users. +// Our loader is custom-generated, based on gl3w but automatically filtered to only include +// enums/functions that we use in our imgui_impl_opengl3.cpp source file in order to be small. +// +// YOU SHOULD NOT NEED TO INCLUDE/USE THIS DIRECTLY. THIS IS USED BY imgui_impl_opengl3.cpp ONLY. +// THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE. +// +// IF YOU GET BUILD ERRORS IN THIS FILE (commonly macro redefinitions or function redefinitions): +// IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCUDING 'imgui_impl_opengl3_loader.h' +// IN THE SAME COMPILATION UNIT AS ONE OF YOUR FILE WHICH IS USING A THIRD-PARTY OPENGL LOADER. +// (e.g. COULD HAPPEN IF YOU ARE DOING A UNITY/JUMBO BUILD, OR INCLUDING .CPP FILES FROM OTHERS) +// YOU SHOULD NOT BUILD BOTH IN THE SAME COMPILATION UNIT. +// BUT IF YOU REALLY WANT TO, you can '#define IMGUI_IMPL_OPENGL_LOADER_CUSTOM' and imgui_impl_opengl3.cpp +// WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT. +// +// Regenerate with: +// python gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt +// +// More info: +// https://github.com/dearimgui/gl3w_stripped +// https://github.com/ocornut/imgui/issues/4445 +//----------------------------------------------------------------------------- + +/* + * This file was generated with gl3w_gen.py, part of imgl3w + * (hosted at https://github.com/dearimgui/gl3w_stripped) + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef __gl3w_h_ +#define __gl3w_h_ + +// Adapted from KHR/khrplatform.h to avoid including entire file. +#ifndef __khrplatform_h_ +typedef float khronos_float_t; +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; +#ifdef _WIN64 +typedef signed long long int khronos_intptr_t; +typedef signed long long int khronos_ssize_t; +#else +typedef signed long int khronos_intptr_t; +typedef signed long int khronos_ssize_t; +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +typedef signed __int64 khronos_int64_t; +typedef unsigned __int64 khronos_uint64_t; +#elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100) +#include +typedef int64_t khronos_int64_t; +typedef uint64_t khronos_uint64_t; +#else +typedef signed long long khronos_int64_t; +typedef unsigned long long khronos_uint64_t; +#endif +#endif // __khrplatform_h_ + +#ifndef __gl_glcorearb_h_ +#define __gl_glcorearb_h_ 1 +#ifdef __cplusplus +extern "C" { +#endif +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif +/* glcorearb.h is for use with OpenGL core profile implementations. +** It should should be placed in the same directory as gl.h and +** included as . +** +** glcorearb.h includes only APIs in the latest OpenGL core profile +** implementation together with APIs in newer ARB extensions which +** can be supported by the core profile. It does not, and never will +** include functionality removed from the core profile, such as +** fixed-function vertex and fragment processing. +** +** Do not #include both and either of or +** in the same source file. +*/ +/* Generated C header for: + * API: gl + * Profile: core + * Versions considered: .* + * Versions emitted: .* + * Default extensions included: glcore + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ +#ifndef GL_VERSION_1_0 +typedef void GLvoid; +typedef unsigned int GLenum; + +typedef khronos_float_t GLfloat; +typedef int GLint; +typedef int GLsizei; +typedef unsigned int GLbitfield; +typedef double GLdouble; +typedef unsigned int GLuint; +typedef unsigned char GLboolean; +typedef khronos_uint8_t GLubyte; +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_FALSE 0 +#define GL_TRUE 1 +#define GL_TRIANGLES 0x0004 +#define GL_ONE 1 +#define GL_SRC_ALPHA 0x0302 +#define GL_ONE_MINUS_SRC_ALPHA 0x0303 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_POLYGON_MODE 0x0B40 +#define GL_CULL_FACE 0x0B44 +#define GL_DEPTH_TEST 0x0B71 +#define GL_STENCIL_TEST 0x0B90 +#define GL_VIEWPORT 0x0BA2 +#define GL_BLEND 0x0BE2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_RGBA 0x1908 +#define GL_FILL 0x1B02 +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 +#define GL_LINEAR 0x2601 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap); +typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap); +typedef void (APIENTRYP PFNGLFLUSHPROC) (void); +typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void); +typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); +typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); +typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode); +GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glClear (GLbitfield mask); +GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glDisable (GLenum cap); +GLAPI void APIENTRY glEnable (GLenum cap); +GLAPI void APIENTRY glFlush (void); +GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param); +GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GLAPI GLenum APIENTRY glGetError (void); +GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data); +GLAPI const GLubyte *APIENTRY glGetString (GLenum name); +GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap); +GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_0 */ +#ifndef GL_VERSION_1_1 +typedef khronos_float_t GLclampf; +typedef double GLclampd; +#define GL_TEXTURE_BINDING_2D 0x8069 +typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); +typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures); +#endif +#endif /* GL_VERSION_1_1 */ +#ifndef GL_VERSION_1_3 +#define GL_TEXTURE0 0x84C0 +#define GL_ACTIVE_TEXTURE 0x84E0 +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +#endif +#endif /* GL_VERSION_1_3 */ +#ifndef GL_VERSION_1_4 +#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_FUNC_ADD 0x8006 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ +#ifndef GL_VERSION_1_5 +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_intptr_t GLintptr; +#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_STREAM_DRAW 0x88E0 +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +#endif +#endif /* GL_VERSION_1_5 */ +#ifndef GL_VERSION_2_0 +typedef char GLchar; +typedef khronos_int16_t GLshort; +typedef khronos_int8_t GLbyte; +typedef khronos_uint16_t GLushort; +#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_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_COMPILE_STATUS 0x8B81 +#define GL_LINK_STATUS 0x8B82 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_CURRENT_PROGRAM 0x8B8D +#define GL_UPPER_LEFT 0x8CA2 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ +#ifndef GL_VERSION_3_0 +typedef khronos_uint16_t GLhalf; +#define GL_MAJOR_VERSION 0x821B +#define GL_MINOR_VERSION 0x821C +#define GL_NUM_EXTENSIONS 0x821D +#define GL_FRAMEBUFFER_SRGB 0x8DB9 +#define GL_VERTEX_ARRAY_BINDING 0x85B5 +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +#endif +#endif /* GL_VERSION_3_0 */ +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#define GL_PRIMITIVE_RESTART 0x8F9D +#endif /* GL_VERSION_3_1 */ +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +typedef khronos_uint64_t GLuint64; +typedef khronos_int64_t GLint64; +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +#endif +#endif /* GL_VERSION_3_2 */ +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#define GL_SAMPLER_BINDING 0x8919 +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +#endif +#endif /* GL_VERSION_3_3 */ +#ifndef GL_VERSION_4_1 +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#endif /* GL_VERSION_4_1 */ +#ifndef GL_VERSION_4_3 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#endif /* GL_VERSION_4_3 */ +#ifndef GL_VERSION_4_5 +#define GL_CLIP_ORIGIN 0x935C +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +#endif /* GL_VERSION_4_5 */ +#ifndef GL_ARB_bindless_texture +typedef khronos_uint64_t GLuint64EXT; +#endif /* GL_ARB_bindless_texture */ +#ifndef GL_ARB_cl_event +struct _cl_context; +struct _cl_event; +#endif /* GL_ARB_cl_event */ +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ +#ifndef GL_ARB_debug_output +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#endif /* GL_ARB_debug_output */ +#ifndef GL_EXT_EGL_image_storage +typedef void *GLeglImageOES; +#endif /* GL_EXT_EGL_image_storage */ +#ifndef GL_EXT_direct_state_access +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +#endif /* GL_EXT_direct_state_access */ +#ifndef GL_NV_draw_vulkan_image +typedef void (APIENTRY *GLVULKANPROCNV)(void); +#endif /* GL_NV_draw_vulkan_image */ +#ifndef GL_NV_gpu_shader5 +typedef khronos_int64_t GLint64EXT; +#endif /* GL_NV_gpu_shader5 */ +#ifndef GL_NV_vertex_buffer_unified_memory +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#endif /* GL_NV_vertex_buffer_unified_memory */ +#ifdef __cplusplus +} +#endif +#endif + +#ifndef GL3W_API +#define GL3W_API +#endif + +#ifndef __gl_h_ +#define __gl_h_ +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define GL3W_OK 0 +#define GL3W_ERROR_INIT -1 +#define GL3W_ERROR_LIBRARY_OPEN -2 +#define GL3W_ERROR_OPENGL_VERSION -3 + +typedef void (*GL3WglProc)(void); +typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc); + +/* gl3w api */ +GL3W_API int imgl3wInit(void); +GL3W_API int imgl3wInit2(GL3WGetProcAddressProc proc); +GL3W_API int imgl3wIsSupported(int major, int minor); +GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc); + +/* gl3w internal state */ +union GL3WProcs { + GL3WglProc ptr[59]; + struct { + PFNGLACTIVETEXTUREPROC ActiveTexture; + PFNGLATTACHSHADERPROC AttachShader; + PFNGLBINDBUFFERPROC BindBuffer; + PFNGLBINDSAMPLERPROC BindSampler; + PFNGLBINDTEXTUREPROC BindTexture; + PFNGLBINDVERTEXARRAYPROC BindVertexArray; + PFNGLBLENDEQUATIONPROC BlendEquation; + PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate; + PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate; + PFNGLBUFFERDATAPROC BufferData; + PFNGLBUFFERSUBDATAPROC BufferSubData; + PFNGLCLEARPROC Clear; + PFNGLCLEARCOLORPROC ClearColor; + PFNGLCOMPILESHADERPROC CompileShader; + PFNGLCREATEPROGRAMPROC CreateProgram; + PFNGLCREATESHADERPROC CreateShader; + PFNGLDELETEBUFFERSPROC DeleteBuffers; + PFNGLDELETEPROGRAMPROC DeleteProgram; + PFNGLDELETESHADERPROC DeleteShader; + PFNGLDELETETEXTURESPROC DeleteTextures; + PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays; + PFNGLDETACHSHADERPROC DetachShader; + PFNGLDISABLEPROC Disable; + PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray; + PFNGLDRAWELEMENTSPROC DrawElements; + PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex; + PFNGLENABLEPROC Enable; + PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray; + PFNGLFLUSHPROC Flush; + PFNGLGENBUFFERSPROC GenBuffers; + PFNGLGENTEXTURESPROC GenTextures; + PFNGLGENVERTEXARRAYSPROC GenVertexArrays; + PFNGLGETATTRIBLOCATIONPROC GetAttribLocation; + PFNGLGETERRORPROC GetError; + PFNGLGETINTEGERVPROC GetIntegerv; + PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog; + PFNGLGETPROGRAMIVPROC GetProgramiv; + PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog; + PFNGLGETSHADERIVPROC GetShaderiv; + PFNGLGETSTRINGPROC GetString; + PFNGLGETSTRINGIPROC GetStringi; + PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation; + PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv; + PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv; + PFNGLISENABLEDPROC IsEnabled; + PFNGLISPROGRAMPROC IsProgram; + PFNGLLINKPROGRAMPROC LinkProgram; + PFNGLPIXELSTOREIPROC PixelStorei; + PFNGLPOLYGONMODEPROC PolygonMode; + PFNGLREADPIXELSPROC ReadPixels; + PFNGLSCISSORPROC Scissor; + PFNGLSHADERSOURCEPROC ShaderSource; + PFNGLTEXIMAGE2DPROC TexImage2D; + PFNGLTEXPARAMETERIPROC TexParameteri; + PFNGLUNIFORM1IPROC Uniform1i; + PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv; + PFNGLUSEPROGRAMPROC UseProgram; + PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer; + PFNGLVIEWPORTPROC Viewport; + } gl; +}; + +GL3W_API extern union GL3WProcs imgl3wProcs; + +/* OpenGL functions */ +#define glActiveTexture imgl3wProcs.gl.ActiveTexture +#define glAttachShader imgl3wProcs.gl.AttachShader +#define glBindBuffer imgl3wProcs.gl.BindBuffer +#define glBindSampler imgl3wProcs.gl.BindSampler +#define glBindTexture imgl3wProcs.gl.BindTexture +#define glBindVertexArray imgl3wProcs.gl.BindVertexArray +#define glBlendEquation imgl3wProcs.gl.BlendEquation +#define glBlendEquationSeparate imgl3wProcs.gl.BlendEquationSeparate +#define glBlendFuncSeparate imgl3wProcs.gl.BlendFuncSeparate +#define glBufferData imgl3wProcs.gl.BufferData +#define glBufferSubData imgl3wProcs.gl.BufferSubData +#define glClear imgl3wProcs.gl.Clear +#define glClearColor imgl3wProcs.gl.ClearColor +#define glCompileShader imgl3wProcs.gl.CompileShader +#define glCreateProgram imgl3wProcs.gl.CreateProgram +#define glCreateShader imgl3wProcs.gl.CreateShader +#define glDeleteBuffers imgl3wProcs.gl.DeleteBuffers +#define glDeleteProgram imgl3wProcs.gl.DeleteProgram +#define glDeleteShader imgl3wProcs.gl.DeleteShader +#define glDeleteTextures imgl3wProcs.gl.DeleteTextures +#define glDeleteVertexArrays imgl3wProcs.gl.DeleteVertexArrays +#define glDetachShader imgl3wProcs.gl.DetachShader +#define glDisable imgl3wProcs.gl.Disable +#define glDisableVertexAttribArray imgl3wProcs.gl.DisableVertexAttribArray +#define glDrawElements imgl3wProcs.gl.DrawElements +#define glDrawElementsBaseVertex imgl3wProcs.gl.DrawElementsBaseVertex +#define glEnable imgl3wProcs.gl.Enable +#define glEnableVertexAttribArray imgl3wProcs.gl.EnableVertexAttribArray +#define glFlush imgl3wProcs.gl.Flush +#define glGenBuffers imgl3wProcs.gl.GenBuffers +#define glGenTextures imgl3wProcs.gl.GenTextures +#define glGenVertexArrays imgl3wProcs.gl.GenVertexArrays +#define glGetAttribLocation imgl3wProcs.gl.GetAttribLocation +#define glGetError imgl3wProcs.gl.GetError +#define glGetIntegerv imgl3wProcs.gl.GetIntegerv +#define glGetProgramInfoLog imgl3wProcs.gl.GetProgramInfoLog +#define glGetProgramiv imgl3wProcs.gl.GetProgramiv +#define glGetShaderInfoLog imgl3wProcs.gl.GetShaderInfoLog +#define glGetShaderiv imgl3wProcs.gl.GetShaderiv +#define glGetString imgl3wProcs.gl.GetString +#define glGetStringi imgl3wProcs.gl.GetStringi +#define glGetUniformLocation imgl3wProcs.gl.GetUniformLocation +#define glGetVertexAttribPointerv imgl3wProcs.gl.GetVertexAttribPointerv +#define glGetVertexAttribiv imgl3wProcs.gl.GetVertexAttribiv +#define glIsEnabled imgl3wProcs.gl.IsEnabled +#define glIsProgram imgl3wProcs.gl.IsProgram +#define glLinkProgram imgl3wProcs.gl.LinkProgram +#define glPixelStorei imgl3wProcs.gl.PixelStorei +#define glPolygonMode imgl3wProcs.gl.PolygonMode +#define glReadPixels imgl3wProcs.gl.ReadPixels +#define glScissor imgl3wProcs.gl.Scissor +#define glShaderSource imgl3wProcs.gl.ShaderSource +#define glTexImage2D imgl3wProcs.gl.TexImage2D +#define glTexParameteri imgl3wProcs.gl.TexParameteri +#define glUniform1i imgl3wProcs.gl.Uniform1i +#define glUniformMatrix4fv imgl3wProcs.gl.UniformMatrix4fv +#define glUseProgram imgl3wProcs.gl.UseProgram +#define glVertexAttribPointer imgl3wProcs.gl.VertexAttribPointer +#define glViewport imgl3wProcs.gl.Viewport + +#ifdef __cplusplus +} +#endif + +#endif + +#ifdef IMGL3W_IMPL +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + +#if defined(_WIN32) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +static HMODULE libgl; +typedef PROC(__stdcall* GL3WglGetProcAddr)(LPCSTR); +static GL3WglGetProcAddr wgl_get_proc_address; + +static int open_libgl(void) +{ + libgl = LoadLibraryA("opengl32.dll"); + if (!libgl) + return GL3W_ERROR_LIBRARY_OPEN; + wgl_get_proc_address = (GL3WglGetProcAddr)GetProcAddress(libgl, "wglGetProcAddress"); + return GL3W_OK; +} + +static void close_libgl(void) { FreeLibrary(libgl); } +static GL3WglProc get_proc(const char *proc) +{ + GL3WglProc res; + res = (GL3WglProc)wgl_get_proc_address(proc); + if (!res) + res = (GL3WglProc)GetProcAddress(libgl, proc); + return res; +} +#elif defined(__APPLE__) +#include + +static void *libgl; +static int open_libgl(void) +{ + libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL); + if (!libgl) + return GL3W_ERROR_LIBRARY_OPEN; + return GL3W_OK; +} + +static void close_libgl(void) { dlclose(libgl); } + +static GL3WglProc get_proc(const char *proc) +{ + GL3WglProc res; + *(void **)(&res) = dlsym(libgl, proc); + return res; +} +#else +#include + +static void *libgl; +static GL3WglProc (*glx_get_proc_address)(const GLubyte *); + +static int open_libgl(void) +{ + libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL); + if (!libgl) + return GL3W_ERROR_LIBRARY_OPEN; + *(void **)(&glx_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB"); + return GL3W_OK; +} + +static void close_libgl(void) { dlclose(libgl); } + +static GL3WglProc get_proc(const char *proc) +{ + GL3WglProc res; + res = glx_get_proc_address((const GLubyte *)proc); + if (!res) + *(void **)(&res) = dlsym(libgl, proc); + return res; +} +#endif + +static struct { int major, minor; } version; + +static int parse_version(void) +{ + if (!glGetIntegerv) + return GL3W_ERROR_INIT; + glGetIntegerv(GL_MAJOR_VERSION, &version.major); + glGetIntegerv(GL_MINOR_VERSION, &version.minor); + if (version.major == 0 && version.minor == 0) + { + // Query GL_VERSION in desktop GL 2.x, the string will start with "." + const char* gl_version = (const char*)glGetString(GL_VERSION); + sscanf(gl_version, "%d.%d", &version.major, &version.minor); + } + if (version.major < 2) + return GL3W_ERROR_OPENGL_VERSION; + return GL3W_OK; +} + +static void load_procs(GL3WGetProcAddressProc proc); + +int imgl3wInit(void) +{ + int res = open_libgl(); + if (res) + return res; + atexit(close_libgl); + return imgl3wInit2(get_proc); +} + +int imgl3wInit2(GL3WGetProcAddressProc proc) +{ + load_procs(proc); + return parse_version(); +} + +int imgl3wIsSupported(int major, int minor) +{ + if (major < 2) + return 0; + if (version.major == major) + return version.minor >= minor; + return version.major >= major; +} + +GL3WglProc imgl3wGetProcAddress(const char *proc) { return get_proc(proc); } + +static const char *proc_names[] = { + "glActiveTexture", + "glAttachShader", + "glBindBuffer", + "glBindSampler", + "glBindTexture", + "glBindVertexArray", + "glBlendEquation", + "glBlendEquationSeparate", + "glBlendFuncSeparate", + "glBufferData", + "glBufferSubData", + "glClear", + "glClearColor", + "glCompileShader", + "glCreateProgram", + "glCreateShader", + "glDeleteBuffers", + "glDeleteProgram", + "glDeleteShader", + "glDeleteTextures", + "glDeleteVertexArrays", + "glDetachShader", + "glDisable", + "glDisableVertexAttribArray", + "glDrawElements", + "glDrawElementsBaseVertex", + "glEnable", + "glEnableVertexAttribArray", + "glFlush", + "glGenBuffers", + "glGenTextures", + "glGenVertexArrays", + "glGetAttribLocation", + "glGetError", + "glGetIntegerv", + "glGetProgramInfoLog", + "glGetProgramiv", + "glGetShaderInfoLog", + "glGetShaderiv", + "glGetString", + "glGetStringi", + "glGetUniformLocation", + "glGetVertexAttribPointerv", + "glGetVertexAttribiv", + "glIsEnabled", + "glIsProgram", + "glLinkProgram", + "glPixelStorei", + "glPolygonMode", + "glReadPixels", + "glScissor", + "glShaderSource", + "glTexImage2D", + "glTexParameteri", + "glUniform1i", + "glUniformMatrix4fv", + "glUseProgram", + "glVertexAttribPointer", + "glViewport", +}; + +GL3W_API union GL3WProcs imgl3wProcs; + +static void load_procs(GL3WGetProcAddressProc proc) +{ + size_t i; + for (i = 0; i < ARRAY_SIZE(proc_names); i++) + imgl3wProcs.ptr[i] = proc(proc_names[i]); +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/ImGui/backends/imgui_impl_osx.h b/ImGui/backends/imgui_impl_osx.h new file mode 100644 index 0000000..da08c4c --- /dev/null +++ b/ImGui/backends/imgui_impl_osx.h @@ -0,0 +1,44 @@ +// dear imgui: Platform Backend for OSX / Cocoa +// This needs to be used along with a Renderer (e.g. OpenGL2, OpenGL3, Vulkan, Metal..) +// - Not well tested. If you want a portable application, prefer using the GLFW or SDL platform Backends on Mac. +// - Requires linking with the GameController framework ("-framework GameController"). + +// Implemented features: +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy kVK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend). +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: IME support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" // IMGUI_IMPL_API + +#ifdef __OBJC__ + +@class NSEvent; +@class NSView; + +IMGUI_IMPL_API bool ImGui_ImplOSX_Init(NSView* _Nonnull view); +IMGUI_IMPL_API void ImGui_ImplOSX_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(NSView* _Nullable view); + +#endif + +//----------------------------------------------------------------------------- +// C++ API +//----------------------------------------------------------------------------- + +#ifdef IMGUI_IMPL_METAL_CPP_EXTENSIONS +// #include +#ifndef __OBJC__ + +IMGUI_IMPL_API bool ImGui_ImplOSX_Init(void* _Nonnull view); +IMGUI_IMPL_API void ImGui_ImplOSX_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(void* _Nullable view); + +#endif +#endif diff --git a/ImGui/backends/imgui_impl_osx.mm b/ImGui/backends/imgui_impl_osx.mm new file mode 100644 index 0000000..edb376c --- /dev/null +++ b/ImGui/backends/imgui_impl_osx.mm @@ -0,0 +1,766 @@ +// dear imgui: Platform Backend for OSX / Cocoa +// This needs to be used along with a Renderer (e.g. OpenGL2, OpenGL3, Vulkan, Metal..) +// - Not well tested. If you want a portable application, prefer using the GLFW or SDL platform Backends on Mac. +// - Requires linking with the GameController framework ("-framework GameController"). + +// Implemented features: +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy kVK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: OSX clipboard is supported within core Dear ImGui (no specific code in this backend). +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: IME support. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#import "imgui.h" +#import "imgui_impl_osx.h" +#import +#import +#import +#import + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-01: Fixed scroll wheel scaling for devices emitting events with hasPreciseScrollingDeltas==false (e.g. non-Apple mices). +// 2022-11-02: Fixed mouse coordinates before clicking the host window. +// 2022-10-06: Fixed mouse inputs on flipped views. +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-05-03: Inputs: Removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture. +// 2022-04-27: Misc: Store backend data in a per-context struct, allowing to use this backend with multiple contexts. +// 2022-03-22: Inputs: Monitor NSKeyUp events to catch missing keyUp for key when user press Cmd + key +// 2022-02-07: Inputs: Forward keyDown/keyUp events to OS when unused by dear imgui. +// 2022-01-31: Fixed building with old Xcode versions that are missing gamepad features. +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-12: Inputs: Added basic Platform IME support, hooking the io.SetPlatformImeDataFn() function. +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-12-13: *BREAKING CHANGE* Add NSView parameter to ImGui_ImplOSX_Init(). Generally fix keyboard support. Using kVK_* codes for keyboard keys. +// 2021-12-13: Add game controller support. +// 2021-09-21: Use mach_absolute_time as CFAbsoluteTimeGetCurrent can jump backwards. +// 2021-08-17: Calling io.AddFocusEvent() on NSApplicationDidBecomeActiveNotification/NSApplicationDidResignActiveNotification events. +// 2021-06-23: Inputs: Added a fix for shortcuts using CTRL key instead of CMD key. +// 2021-04-19: Inputs: Added a fix for keys remaining stuck in pressed state when CMD-tabbing into different application. +// 2021-01-27: Inputs: Added a fix for mouse position not being reported when mouse buttons other than left one are down. +// 2020-10-28: Inputs: Added a fix for handling keypad-enter key. +// 2020-05-25: Inputs: Added a fix for missing trackpad clicks when done with "soft tap". +// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. +// 2019-10-11: Inputs: Fix using Backspace key. +// 2019-07-21: Re-added clipboard handlers as they are not enabled by default in core imgui.cpp (reverted 2019-05-18 change). +// 2019-05-28: Inputs: Added mouse cursor shape and visibility support. +// 2019-05-18: Misc: Removed clipboard handlers as they are now supported by core imgui.cpp. +// 2019-05-11: Inputs: Don't filter character values before calling AddInputCharacter() apart from 0xF700..0xFFFF range. +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-07-07: Initial version. + +#define APPLE_HAS_BUTTON_OPTIONS (__IPHONE_OS_VERSION_MIN_REQUIRED >= 130000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101500 || __TV_OS_VERSION_MIN_REQUIRED >= 130000) +#define APPLE_HAS_CONTROLLER (__IPHONE_OS_VERSION_MIN_REQUIRED >= 140000 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 110000 || __TV_OS_VERSION_MIN_REQUIRED >= 140000) +#define APPLE_HAS_THUMBSTICKS (__IPHONE_OS_VERSION_MIN_REQUIRED >= 120100 || __MAC_OS_X_VERSION_MIN_REQUIRED >= 101401 || __TV_OS_VERSION_MIN_REQUIRED >= 120100) + +@class ImGuiObserver; +@class KeyEventResponder; + +// Data +struct ImGui_ImplOSX_Data +{ + CFTimeInterval Time; + NSCursor* MouseCursors[ImGuiMouseCursor_COUNT]; + bool MouseCursorHidden; + ImGuiObserver* Observer; + KeyEventResponder* KeyEventResponder; + NSTextInputContext* InputContext; + id Monitor; + + ImGui_ImplOSX_Data() { memset(this, 0, sizeof(*this)); } +}; + +static ImGui_ImplOSX_Data* ImGui_ImplOSX_CreateBackendData() { return IM_NEW(ImGui_ImplOSX_Data)(); } +static ImGui_ImplOSX_Data* ImGui_ImplOSX_GetBackendData() { return (ImGui_ImplOSX_Data*)ImGui::GetIO().BackendPlatformUserData; } +static void ImGui_ImplOSX_DestroyBackendData() { IM_DELETE(ImGui_ImplOSX_GetBackendData()); } + +static inline CFTimeInterval GetMachAbsoluteTimeInSeconds() { return (CFTimeInterval)(double)(clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1e9); } + +// Forward Declarations +static void ImGui_ImplOSX_AddTrackingArea(NSView* _Nonnull view); +static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view); + +// Undocumented methods for creating cursors. +@interface NSCursor() ++ (id)_windowResizeNorthWestSouthEastCursor; ++ (id)_windowResizeNorthEastSouthWestCursor; ++ (id)_windowResizeNorthSouthCursor; ++ (id)_windowResizeEastWestCursor; +@end + +/** + KeyEventResponder implements the NSTextInputClient protocol as is required by the macOS text input manager. + + The macOS text input manager is invoked by calling the interpretKeyEvents method from the keyDown method. + Keyboard events are then evaluated by the macOS input manager and valid text input is passed back via the + insertText:replacementRange method. + + This is the same approach employed by other cross-platform libraries such as SDL2: + https://github.com/spurious/SDL-mirror/blob/e17aacbd09e65a4fd1e166621e011e581fb017a8/src/video/cocoa/SDL_cocoakeyboard.m#L53 + and GLFW: + https://github.com/glfw/glfw/blob/b55a517ae0c7b5127dffa79a64f5406021bf9076/src/cocoa_window.m#L722-L723 + */ +@interface KeyEventResponder: NSView +@end + +@implementation KeyEventResponder +{ + float _posX; + float _posY; + NSRect _imeRect; +} + +#pragma mark - Public + +- (void)setImePosX:(float)posX imePosY:(float)posY +{ + _posX = posX; + _posY = posY; +} + +- (void)updateImePosWithView:(NSView *)view +{ + NSWindow *window = view.window; + if (!window) + return; + NSRect contentRect = [window contentRectForFrameRect:window.frame]; + NSRect rect = NSMakeRect(_posX, contentRect.size.height - _posY, 0, 0); + _imeRect = [window convertRectToScreen:rect]; +} + +- (void)viewDidMoveToWindow +{ + // Ensure self is a first responder to receive the input events. + [self.window makeFirstResponder:self]; +} + +- (void)keyDown:(NSEvent*)event +{ + if (!ImGui_ImplOSX_HandleEvent(event, self)) + [super keyDown:event]; + + // Call to the macOS input manager system. + [self interpretKeyEvents:@[event]]; +} + +- (void)keyUp:(NSEvent*)event +{ + if (!ImGui_ImplOSX_HandleEvent(event, self)) + [super keyUp:event]; +} + +- (void)insertText:(id)aString replacementRange:(NSRange)replacementRange +{ + ImGuiIO& io = ImGui::GetIO(); + + NSString* characters; + if ([aString isKindOfClass:[NSAttributedString class]]) + characters = [aString string]; + else + characters = (NSString*)aString; + + io.AddInputCharactersUTF8(characters.UTF8String); +} + +- (BOOL)acceptsFirstResponder +{ + return YES; +} + +- (void)doCommandBySelector:(SEL)myselector +{ +} + +- (nullable NSAttributedString*)attributedSubstringForProposedRange:(NSRange)range actualRange:(nullable NSRangePointer)actualRange +{ + return nil; +} + +- (NSUInteger)characterIndexForPoint:(NSPoint)point +{ + return 0; +} + +- (NSRect)firstRectForCharacterRange:(NSRange)range actualRange:(nullable NSRangePointer)actualRange +{ + return _imeRect; +} + +- (BOOL)hasMarkedText +{ + return NO; +} + +- (NSRange)markedRange +{ + return NSMakeRange(NSNotFound, 0); +} + +- (NSRange)selectedRange +{ + return NSMakeRange(NSNotFound, 0); +} + +- (void)setMarkedText:(nonnull id)string selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange +{ +} + +- (void)unmarkText +{ +} + +- (nonnull NSArray*)validAttributesForMarkedText +{ + return @[]; +} + +@end + +@interface ImGuiObserver : NSObject + +- (void)onApplicationBecomeActive:(NSNotification*)aNotification; +- (void)onApplicationBecomeInactive:(NSNotification*)aNotification; + +@end + +@implementation ImGuiObserver + +- (void)onApplicationBecomeActive:(NSNotification*)aNotification +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddFocusEvent(true); +} + +- (void)onApplicationBecomeInactive:(NSNotification*)aNotification +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddFocusEvent(false); +} + +@end + +// Functions +static ImGuiKey ImGui_ImplOSX_KeyCodeToImGuiKey(int key_code) +{ + switch (key_code) + { + case kVK_ANSI_A: return ImGuiKey_A; + case kVK_ANSI_S: return ImGuiKey_S; + case kVK_ANSI_D: return ImGuiKey_D; + case kVK_ANSI_F: return ImGuiKey_F; + case kVK_ANSI_H: return ImGuiKey_H; + case kVK_ANSI_G: return ImGuiKey_G; + case kVK_ANSI_Z: return ImGuiKey_Z; + case kVK_ANSI_X: return ImGuiKey_X; + case kVK_ANSI_C: return ImGuiKey_C; + case kVK_ANSI_V: return ImGuiKey_V; + case kVK_ANSI_B: return ImGuiKey_B; + case kVK_ANSI_Q: return ImGuiKey_Q; + case kVK_ANSI_W: return ImGuiKey_W; + case kVK_ANSI_E: return ImGuiKey_E; + case kVK_ANSI_R: return ImGuiKey_R; + case kVK_ANSI_Y: return ImGuiKey_Y; + case kVK_ANSI_T: return ImGuiKey_T; + case kVK_ANSI_1: return ImGuiKey_1; + case kVK_ANSI_2: return ImGuiKey_2; + case kVK_ANSI_3: return ImGuiKey_3; + case kVK_ANSI_4: return ImGuiKey_4; + case kVK_ANSI_6: return ImGuiKey_6; + case kVK_ANSI_5: return ImGuiKey_5; + case kVK_ANSI_Equal: return ImGuiKey_Equal; + case kVK_ANSI_9: return ImGuiKey_9; + case kVK_ANSI_7: return ImGuiKey_7; + case kVK_ANSI_Minus: return ImGuiKey_Minus; + case kVK_ANSI_8: return ImGuiKey_8; + case kVK_ANSI_0: return ImGuiKey_0; + case kVK_ANSI_RightBracket: return ImGuiKey_RightBracket; + case kVK_ANSI_O: return ImGuiKey_O; + case kVK_ANSI_U: return ImGuiKey_U; + case kVK_ANSI_LeftBracket: return ImGuiKey_LeftBracket; + case kVK_ANSI_I: return ImGuiKey_I; + case kVK_ANSI_P: return ImGuiKey_P; + case kVK_ANSI_L: return ImGuiKey_L; + case kVK_ANSI_J: return ImGuiKey_J; + case kVK_ANSI_Quote: return ImGuiKey_Apostrophe; + case kVK_ANSI_K: return ImGuiKey_K; + case kVK_ANSI_Semicolon: return ImGuiKey_Semicolon; + case kVK_ANSI_Backslash: return ImGuiKey_Backslash; + case kVK_ANSI_Comma: return ImGuiKey_Comma; + case kVK_ANSI_Slash: return ImGuiKey_Slash; + case kVK_ANSI_N: return ImGuiKey_N; + case kVK_ANSI_M: return ImGuiKey_M; + case kVK_ANSI_Period: return ImGuiKey_Period; + case kVK_ANSI_Grave: return ImGuiKey_GraveAccent; + case kVK_ANSI_KeypadDecimal: return ImGuiKey_KeypadDecimal; + case kVK_ANSI_KeypadMultiply: return ImGuiKey_KeypadMultiply; + case kVK_ANSI_KeypadPlus: return ImGuiKey_KeypadAdd; + case kVK_ANSI_KeypadClear: return ImGuiKey_NumLock; + case kVK_ANSI_KeypadDivide: return ImGuiKey_KeypadDivide; + case kVK_ANSI_KeypadEnter: return ImGuiKey_KeypadEnter; + case kVK_ANSI_KeypadMinus: return ImGuiKey_KeypadSubtract; + case kVK_ANSI_KeypadEquals: return ImGuiKey_KeypadEqual; + case kVK_ANSI_Keypad0: return ImGuiKey_Keypad0; + case kVK_ANSI_Keypad1: return ImGuiKey_Keypad1; + case kVK_ANSI_Keypad2: return ImGuiKey_Keypad2; + case kVK_ANSI_Keypad3: return ImGuiKey_Keypad3; + case kVK_ANSI_Keypad4: return ImGuiKey_Keypad4; + case kVK_ANSI_Keypad5: return ImGuiKey_Keypad5; + case kVK_ANSI_Keypad6: return ImGuiKey_Keypad6; + case kVK_ANSI_Keypad7: return ImGuiKey_Keypad7; + case kVK_ANSI_Keypad8: return ImGuiKey_Keypad8; + case kVK_ANSI_Keypad9: return ImGuiKey_Keypad9; + case kVK_Return: return ImGuiKey_Enter; + case kVK_Tab: return ImGuiKey_Tab; + case kVK_Space: return ImGuiKey_Space; + case kVK_Delete: return ImGuiKey_Backspace; + case kVK_Escape: return ImGuiKey_Escape; + case kVK_CapsLock: return ImGuiKey_CapsLock; + case kVK_Control: return ImGuiKey_LeftCtrl; + case kVK_Shift: return ImGuiKey_LeftShift; + case kVK_Option: return ImGuiKey_LeftAlt; + case kVK_Command: return ImGuiKey_LeftSuper; + case kVK_RightControl: return ImGuiKey_RightCtrl; + case kVK_RightShift: return ImGuiKey_RightShift; + case kVK_RightOption: return ImGuiKey_RightAlt; + case kVK_RightCommand: return ImGuiKey_RightSuper; +// case kVK_Function: return ImGuiKey_; +// case kVK_F17: return ImGuiKey_; +// case kVK_VolumeUp: return ImGuiKey_; +// case kVK_VolumeDown: return ImGuiKey_; +// case kVK_Mute: return ImGuiKey_; +// case kVK_F18: return ImGuiKey_; +// case kVK_F19: return ImGuiKey_; +// case kVK_F20: return ImGuiKey_; + case kVK_F5: return ImGuiKey_F5; + case kVK_F6: return ImGuiKey_F6; + case kVK_F7: return ImGuiKey_F7; + case kVK_F3: return ImGuiKey_F3; + case kVK_F8: return ImGuiKey_F8; + case kVK_F9: return ImGuiKey_F9; + case kVK_F11: return ImGuiKey_F11; + case kVK_F13: return ImGuiKey_PrintScreen; +// case kVK_F16: return ImGuiKey_; +// case kVK_F14: return ImGuiKey_; + case kVK_F10: return ImGuiKey_F10; + case 0x6E: return ImGuiKey_Menu; + case kVK_F12: return ImGuiKey_F12; +// case kVK_F15: return ImGuiKey_; + case kVK_Help: return ImGuiKey_Insert; + case kVK_Home: return ImGuiKey_Home; + case kVK_PageUp: return ImGuiKey_PageUp; + case kVK_ForwardDelete: return ImGuiKey_Delete; + case kVK_F4: return ImGuiKey_F4; + case kVK_End: return ImGuiKey_End; + case kVK_F2: return ImGuiKey_F2; + case kVK_PageDown: return ImGuiKey_PageDown; + case kVK_F1: return ImGuiKey_F1; + case kVK_LeftArrow: return ImGuiKey_LeftArrow; + case kVK_RightArrow: return ImGuiKey_RightArrow; + case kVK_DownArrow: return ImGuiKey_DownArrow; + case kVK_UpArrow: return ImGuiKey_UpArrow; + default: return ImGuiKey_None; + } +} + +#ifdef IMGUI_IMPL_METAL_CPP_EXTENSIONS + +IMGUI_IMPL_API bool ImGui_ImplOSX_Init(void* _Nonnull view) { + return ImGui_ImplOSX_Init((__bridge NSView*)(view)); +} + +IMGUI_IMPL_API void ImGui_ImplOSX_NewFrame(void* _Nullable view) { + return ImGui_ImplOSX_NewFrame((__bridge NSView*)(view)); +} + +#endif + + +bool ImGui_ImplOSX_Init(NSView* view) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_CreateBackendData(); + io.BackendPlatformUserData = (void*)bd; + + // Setup backend capabilities flags + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + //io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + io.BackendPlatformName = "imgui_impl_osx"; + + bd->Observer = [ImGuiObserver new]; + + // Load cursors. Some of them are undocumented. + bd->MouseCursorHidden = false; + bd->MouseCursors[ImGuiMouseCursor_Arrow] = [NSCursor arrowCursor]; + bd->MouseCursors[ImGuiMouseCursor_TextInput] = [NSCursor IBeamCursor]; + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = [NSCursor closedHandCursor]; + bd->MouseCursors[ImGuiMouseCursor_Hand] = [NSCursor pointingHandCursor]; + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = [NSCursor operationNotAllowedCursor]; + bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = [NSCursor respondsToSelector:@selector(_windowResizeNorthSouthCursor)] ? [NSCursor _windowResizeNorthSouthCursor] : [NSCursor resizeUpDownCursor]; + bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = [NSCursor respondsToSelector:@selector(_windowResizeEastWestCursor)] ? [NSCursor _windowResizeEastWestCursor] : [NSCursor resizeLeftRightCursor]; + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = [NSCursor respondsToSelector:@selector(_windowResizeNorthEastSouthWestCursor)] ? [NSCursor _windowResizeNorthEastSouthWestCursor] : [NSCursor closedHandCursor]; + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = [NSCursor respondsToSelector:@selector(_windowResizeNorthWestSouthEastCursor)] ? [NSCursor _windowResizeNorthWestSouthEastCursor] : [NSCursor closedHandCursor]; + + // Note that imgui.cpp also include default OSX clipboard handlers which can be enabled + // by adding '#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS' in imconfig.h and adding '-framework ApplicationServices' to your linker command-line. + // Since we are already in ObjC land here, it is easy for us to add a clipboard handler using the NSPasteboard api. + io.SetClipboardTextFn = [](void*, const char* str) -> void + { + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + [pasteboard declareTypes:[NSArray arrayWithObject:NSPasteboardTypeString] owner:nil]; + [pasteboard setString:[NSString stringWithUTF8String:str] forType:NSPasteboardTypeString]; + }; + + io.GetClipboardTextFn = [](void*) -> const char* + { + NSPasteboard* pasteboard = [NSPasteboard generalPasteboard]; + NSString* available = [pasteboard availableTypeFromArray: [NSArray arrayWithObject:NSPasteboardTypeString]]; + if (![available isEqualToString:NSPasteboardTypeString]) + return NULL; + + NSString* string = [pasteboard stringForType:NSPasteboardTypeString]; + if (string == nil) + return NULL; + + const char* string_c = (const char*)[string UTF8String]; + size_t string_len = strlen(string_c); + static ImVector s_clipboard; + s_clipboard.resize((int)string_len + 1); + strcpy(s_clipboard.Data, string_c); + return s_clipboard.Data; + }; + + [[NSNotificationCenter defaultCenter] addObserver:bd->Observer + selector:@selector(onApplicationBecomeActive:) + name:NSApplicationDidBecomeActiveNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:bd->Observer + selector:@selector(onApplicationBecomeInactive:) + name:NSApplicationDidResignActiveNotification + object:nil]; + + // Add the NSTextInputClient to the view hierarchy, + // to receive keyboard events and translate them to input text. + bd->KeyEventResponder = [[KeyEventResponder alloc] initWithFrame:NSZeroRect]; + bd->InputContext = [[NSTextInputContext alloc] initWithClient:bd->KeyEventResponder]; + [view addSubview:bd->KeyEventResponder]; + ImGui_ImplOSX_AddTrackingArea(view); + + io.SetPlatformImeDataFn = [](ImGuiViewport* viewport, ImGuiPlatformImeData* data) -> void + { + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + if (data->WantVisible) + { + [bd->InputContext activate]; + } + else + { + [bd->InputContext discardMarkedText]; + [bd->InputContext invalidateCharacterCoordinates]; + [bd->InputContext deactivate]; + } + [bd->KeyEventResponder setImePosX:data->InputPos.x imePosY:data->InputPos.y + data->InputLineHeight]; + }; + + return true; +} + +void ImGui_ImplOSX_Shutdown() +{ + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + bd->Observer = nullptr; + if (bd->Monitor != nullptr) + { + [NSEvent removeMonitor:bd->Monitor]; + bd->Monitor = nullptr; + } + ImGui_ImplOSX_DestroyBackendData(); +} + +static void ImGui_ImplOSX_UpdateMouseCursor() +{ + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return; + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + if (!bd->MouseCursorHidden) + { + bd->MouseCursorHidden = true; + [NSCursor hide]; + } + } + else + { + NSCursor* desired = bd->MouseCursors[imgui_cursor] ?: bd->MouseCursors[ImGuiMouseCursor_Arrow]; + // -[NSCursor set] generates measureable overhead if called unconditionally. + if (desired != NSCursor.currentCursor) + { + [desired set]; + } + if (bd->MouseCursorHidden) + { + bd->MouseCursorHidden = false; + [NSCursor unhide]; + } + } +} + +static void ImGui_ImplOSX_UpdateGamepads() +{ + ImGuiIO& io = ImGui::GetIO(); + memset(io.NavInputs, 0, sizeof(io.NavInputs)); + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + return; + +#if APPLE_HAS_CONTROLLER + GCController* controller = GCController.current; +#else + GCController* controller = GCController.controllers.firstObject; +#endif + if (controller == nil || controller.extendedGamepad == nil) + { + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; + return; + } + + GCExtendedGamepad* gp = controller.extendedGamepad; + + // Update gamepad inputs + #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) + #define MAP_BUTTON(KEY_NO, BUTTON_NAME) { io.AddKeyEvent(KEY_NO, gp.BUTTON_NAME.isPressed); } + #define MAP_ANALOG(KEY_NO, AXIS_NAME, V0, V1) { float vn = (float)(gp.AXIS_NAME.value - V0) / (float)(V1 - V0); vn = IM_SATURATE(vn); io.AddKeyAnalogEvent(KEY_NO, vn > 0.1f, vn); } + const float thumb_dead_zone = 0.0f; + +#if APPLE_HAS_BUTTON_OPTIONS + MAP_BUTTON(ImGuiKey_GamepadBack, buttonOptions); +#endif + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, buttonX); // Xbox X, PS Square + MAP_BUTTON(ImGuiKey_GamepadFaceRight, buttonB); // Xbox B, PS Circle + MAP_BUTTON(ImGuiKey_GamepadFaceUp, buttonY); // Xbox Y, PS Triangle + MAP_BUTTON(ImGuiKey_GamepadFaceDown, buttonA); // Xbox A, PS Cross + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, dpad.left); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, dpad.right); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, dpad.up); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, dpad.down); + MAP_ANALOG(ImGuiKey_GamepadL1, leftShoulder, 0.0f, 1.0f); + MAP_ANALOG(ImGuiKey_GamepadR1, rightShoulder, 0.0f, 1.0f); + MAP_ANALOG(ImGuiKey_GamepadL2, leftTrigger, 0.0f, 1.0f); + MAP_ANALOG(ImGuiKey_GamepadR2, rightTrigger, 0.0f, 1.0f); +#if APPLE_HAS_THUMBSTICKS + MAP_BUTTON(ImGuiKey_GamepadL3, leftThumbstickButton); + MAP_BUTTON(ImGuiKey_GamepadR3, rightThumbstickButton); +#endif + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, leftThumbstick.xAxis, -thumb_dead_zone, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, leftThumbstick.xAxis, +thumb_dead_zone, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, leftThumbstick.yAxis, +thumb_dead_zone, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, leftThumbstick.yAxis, -thumb_dead_zone, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, rightThumbstick.xAxis, -thumb_dead_zone, -1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, rightThumbstick.xAxis, +thumb_dead_zone, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, rightThumbstick.yAxis, +thumb_dead_zone, +1.0f); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, rightThumbstick.yAxis, -thumb_dead_zone, -1.0f); + #undef MAP_BUTTON + #undef MAP_ANALOG + + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; +} + +static void ImGui_ImplOSX_UpdateImePosWithView(NSView* view) +{ + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + if (io.WantTextInput) + [bd->KeyEventResponder updateImePosWithView:view]; +} + +void ImGui_ImplOSX_NewFrame(NSView* view) +{ + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size + if (view) + { + const float dpi = (float)[view.window backingScaleFactor]; + io.DisplaySize = ImVec2((float)view.bounds.size.width, (float)view.bounds.size.height); + io.DisplayFramebufferScale = ImVec2(dpi, dpi); + } + + // Setup time step + if (bd->Time == 0.0) + bd->Time = GetMachAbsoluteTimeInSeconds(); + + double current_time = GetMachAbsoluteTimeInSeconds(); + io.DeltaTime = (float)(current_time - bd->Time); + bd->Time = current_time; + + ImGui_ImplOSX_UpdateMouseCursor(); + ImGui_ImplOSX_UpdateGamepads(); + ImGui_ImplOSX_UpdateImePosWithView(view); +} + +static bool ImGui_ImplOSX_HandleEvent(NSEvent* event, NSView* view) +{ + ImGuiIO& io = ImGui::GetIO(); + + if (event.type == NSEventTypeLeftMouseDown || event.type == NSEventTypeRightMouseDown || event.type == NSEventTypeOtherMouseDown) + { + int button = (int)[event buttonNumber]; + if (button >= 0 && button < ImGuiMouseButton_COUNT) + io.AddMouseButtonEvent(button, true); + return io.WantCaptureMouse; + } + + if (event.type == NSEventTypeLeftMouseUp || event.type == NSEventTypeRightMouseUp || event.type == NSEventTypeOtherMouseUp) + { + int button = (int)[event buttonNumber]; + if (button >= 0 && button < ImGuiMouseButton_COUNT) + io.AddMouseButtonEvent(button, false); + return io.WantCaptureMouse; + } + + if (event.type == NSEventTypeMouseMoved || event.type == NSEventTypeLeftMouseDragged || event.type == NSEventTypeRightMouseDragged || event.type == NSEventTypeOtherMouseDragged) + { + NSPoint mousePoint = event.locationInWindow; + if (event.window == nil) + mousePoint = [[view window] convertPointFromScreen:mousePoint]; + mousePoint = [view convertPoint:mousePoint fromView:nil]; + if ([view isFlipped]) + mousePoint = NSMakePoint(mousePoint.x, mousePoint.y); + else + mousePoint = NSMakePoint(mousePoint.x, view.bounds.size.height - mousePoint.y); + io.AddMousePosEvent((float)mousePoint.x, (float)mousePoint.y); + return io.WantCaptureMouse; + } + + if (event.type == NSEventTypeScrollWheel) + { + // Ignore canceled events. + // + // From macOS 12.1, scrolling with two fingers and then decelerating + // by tapping two fingers results in two events appearing: + // + // 1. A scroll wheel NSEvent, with a phase == NSEventPhaseMayBegin, when the user taps + // two fingers to decelerate or stop the scroll events. + // + // 2. A scroll wheel NSEvent, with a phase == NSEventPhaseCancelled, when the user releases the + // two-finger tap. It is this event that sometimes contains large values for scrollingDeltaX and + // scrollingDeltaY. When these are added to the current x and y positions of the scrolling view, + // it appears to jump up or down. It can be observed in Preview, various JetBrains IDEs and here. + if (event.phase == NSEventPhaseCancelled) + return false; + + double wheel_dx = 0.0; + double wheel_dy = 0.0; + + #if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) + { + wheel_dx = [event scrollingDeltaX]; + wheel_dy = [event scrollingDeltaY]; + if ([event hasPreciseScrollingDeltas]) + { + wheel_dx *= 0.01; + wheel_dy *= 0.01; + } + } + else + #endif // MAC_OS_X_VERSION_MAX_ALLOWED + { + wheel_dx = [event deltaX] * 0.1; + wheel_dy = [event deltaY] * 0.1; + } + if (wheel_dx != 0.0 || wheel_dy != 0.0) + io.AddMouseWheelEvent((float)wheel_dx, (float)wheel_dy); + + return io.WantCaptureMouse; + } + + if (event.type == NSEventTypeKeyDown || event.type == NSEventTypeKeyUp) + { + if ([event isARepeat]) + return io.WantCaptureKeyboard; + + int key_code = (int)[event keyCode]; + ImGuiKey key = ImGui_ImplOSX_KeyCodeToImGuiKey(key_code); + io.AddKeyEvent(key, event.type == NSEventTypeKeyDown); + io.SetKeyEventNativeData(key, key_code, -1); // To support legacy indexing (<1.87 user code) + + return io.WantCaptureKeyboard; + } + + if (event.type == NSEventTypeFlagsChanged) + { + unsigned short key_code = [event keyCode]; + NSEventModifierFlags modifier_flags = [event modifierFlags]; + + io.AddKeyEvent(ImGuiMod_Shift, (modifier_flags & NSEventModifierFlagShift) != 0); + io.AddKeyEvent(ImGuiMod_Ctrl, (modifier_flags & NSEventModifierFlagControl) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (modifier_flags & NSEventModifierFlagOption) != 0); + io.AddKeyEvent(ImGuiMod_Super, (modifier_flags & NSEventModifierFlagCommand) != 0); + + ImGuiKey key = ImGui_ImplOSX_KeyCodeToImGuiKey(key_code); + if (key != ImGuiKey_None) + { + // macOS does not generate down/up event for modifiers. We're trying + // to use hardware dependent masks to extract that information. + // 'imgui_mask' is left as a fallback. + NSEventModifierFlags mask = 0; + switch (key) + { + case ImGuiKey_LeftCtrl: mask = 0x0001; break; + case ImGuiKey_RightCtrl: mask = 0x2000; break; + case ImGuiKey_LeftShift: mask = 0x0002; break; + case ImGuiKey_RightShift: mask = 0x0004; break; + case ImGuiKey_LeftSuper: mask = 0x0008; break; + case ImGuiKey_RightSuper: mask = 0x0010; break; + case ImGuiKey_LeftAlt: mask = 0x0020; break; + case ImGuiKey_RightAlt: mask = 0x0040; break; + default: + return io.WantCaptureKeyboard; + } + + NSEventModifierFlags modifier_flags = [event modifierFlags]; + io.AddKeyEvent(key, (modifier_flags & mask) != 0); + io.SetKeyEventNativeData(key, key_code, -1); // To support legacy indexing (<1.87 user code) + } + + return io.WantCaptureKeyboard; + } + + return false; +} + +static void ImGui_ImplOSX_AddTrackingArea(NSView* _Nonnull view) +{ + // If we want to receive key events, we either need to be in the responder chain of the key view, + // or else we can install a local monitor. The consequence of this heavy-handed approach is that + // we receive events for all controls, not just Dear ImGui widgets. If we had native controls in our + // window, we'd want to be much more careful than just ingesting the complete event stream. + // To match the behavior of other backends, we pass every event down to the OS. + ImGui_ImplOSX_Data* bd = ImGui_ImplOSX_GetBackendData(); + if (bd->Monitor) + return; + NSEventMask eventMask = 0; + eventMask |= NSEventMaskMouseMoved | NSEventMaskScrollWheel; + eventMask |= NSEventMaskLeftMouseDown | NSEventMaskLeftMouseUp | NSEventMaskLeftMouseDragged; + eventMask |= NSEventMaskRightMouseDown | NSEventMaskRightMouseUp | NSEventMaskRightMouseDragged; + eventMask |= NSEventMaskOtherMouseDown | NSEventMaskOtherMouseUp | NSEventMaskOtherMouseDragged; + eventMask |= NSEventMaskKeyDown | NSEventMaskKeyUp | NSEventMaskFlagsChanged; + bd->Monitor = [NSEvent addLocalMonitorForEventsMatchingMask:eventMask + handler:^NSEvent* _Nullable(NSEvent* event) + { + ImGui_ImplOSX_HandleEvent(event, view); + return event; + }]; +} diff --git a/ImGui/backends/imgui_impl_sdl2.cpp b/ImGui/backends/imgui_impl_sdl2.cpp new file mode 100644 index 0000000..86be801 --- /dev/null +++ b/ImGui/backends/imgui_impl_sdl2.cpp @@ -0,0 +1,634 @@ +// dear imgui: Platform Backend for SDL2 +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) +// (Prefer SDL 2.0.5+ for full feature support.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-23: Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. (#6189, #6114, #3644) +// 2023-02-07: Implement IME handler (io.SetPlatformImeDataFn will call SDL_SetTextInputRect()/SDL_StartTextInput()). +// 2023-02-07: *BREAKING CHANGE* Renamed this backend file from imgui_impl_sdl.cpp/.h to imgui_impl_sdl2.cpp/.h in prevision for the future release of SDL3. +// 2023-02-02: Avoid calling SDL_SetCursor() when cursor has not changed, as the function is surprisingly costly on Mac with latest SDL (may be fixed in next SDL version). +// 2023-02-02: Added support for SDL 2.0.18+ preciseX/preciseY mouse wheel data for smooth scrolling + Scaling X value on Emscripten (bug?). (#4019, #6096) +// 2023-02-02: Removed SDL_MOUSEWHEEL value clamping, as values seem correct in latest Emscripten. (#4019) +// 2023-02-01: Flipping SDL_MOUSEWHEEL 'wheel.x' value to match other backends and offer consistent horizontal scrolling direction. (#4019, #6096, #1463) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-26: Inputs: Disable SDL 2.0.22 new "auto capture" (SDL_HINT_MOUSE_AUTO_CAPTURE) which prevents drag and drop across windows for multi-viewport support + don't capture when drag and dropping. (#5710) +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-03-22: Inputs: Fix mouse position issues when dragging outside of boundaries. SDL_CaptureMouse() erroneously still gives out LEAVE events when hovering OS decorations. +// 2022-03-22: Inputs: Added support for extra mouse buttons (SDL_BUTTON_X1/SDL_BUTTON_X2). +// 2022-02-04: Added SDL_Renderer* parameter to ImGui_ImplSDL2_InitForSDLRenderer(), so we can use SDL_GetRendererOutputSize() instead of SDL_GL_GetDrawableSize() when bound to a SDL_Renderer. +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-17: Inputs: always update key mods next and before key event (not in NewFrame) to fix input queue with very low framerates. +// 2022-01-12: Update mouse inputs using SDL_MOUSEMOTION/SDL_WINDOWEVENT_LEAVE + fallback to provide it when focused but not hovered/captured. More standard and will allow us to pass it to future input queue API. +// 2022-01-12: Maintain our own copy of MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-08-17: Calling io.AddFocusEvent() on SDL_WINDOWEVENT_FOCUS_GAINED/SDL_WINDOWEVENT_FOCUS_LOST. +// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using SDL_GetMouseFocus() + SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, requires SDL 2.0.5+) +// 2021-06-29: *BREAKING CHANGE* Removed 'SDL_Window* window' parameter to ImGui_ImplSDL2_NewFrame() which was unnecessary. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-03-22: Rework global mouse pos availability check listing supported platforms explicitly, effectively fixing mouse access on Raspberry Pi. (#2837, #3950) +// 2020-05-25: Misc: Report a zero display-size when window is minimized, to be consistent with other backends. +// 2020-02-20: Inputs: Fixed mapping for ImGuiKey_KeyPadEnter (using SDL_SCANCODE_KP_ENTER instead of SDL_SCANCODE_RETURN2). +// 2019-12-17: Inputs: On Wayland, use SDL_GetMouseState (because there is no global mouse state). +// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. +// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter. +// 2019-04-23: Inputs: Added support for SDL_GameController (if ImGuiConfigFlags_NavEnableGamepad is set by user application). +// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized. +// 2018-12-21: Inputs: Workaround for Android/iOS which don't seem to handle focus related calls. +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-11-14: Changed the signature of ImGui_ImplSDL2_ProcessEvent() to take a 'const SDL_Event*'. +// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls. +// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor. +// 2018-06-08: Misc: Extracted imgui_impl_sdl.cpp/.h away from the old combined SDL2+OpenGL/Vulkan examples. +// 2018-06-08: Misc: ImGui_ImplSDL2_InitForOpenGL() now takes a SDL_GLContext parameter. +// 2018-05-09: Misc: Fixed clipboard paste memory leak (we didn't call SDL_FreeMemory on the data returned by SDL_GetClipboardText). +// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag. +// 2018-02-16: Inputs: Added support for mouse cursors, honoring ImGui::GetMouseCursor() value. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. +// 2018-02-05: Misc: Using SDL_GetPerformanceCounter() instead of SDL_GetTicks() to be able to handle very high framerate (1000+ FPS). +// 2018-02-05: Inputs: Keyboard mapping is using scancodes everywhere instead of a confusing mixture of keycodes and scancodes. +// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support. +// 2018-01-19: Inputs: When available (SDL 2.0.4+) using SDL_CaptureMouse() to retrieve coordinates outside of client area when dragging. Otherwise (SDL 2.0.3 and before) testing for SDL_WINDOW_INPUT_FOCUS instead of SDL_WINDOW_MOUSE_FOCUS. +// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert. +// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1). +// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" + +// SDL +#include +#include +#if defined(__APPLE__) +#include +#endif + +#if SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__) +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1 +#else +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 0 +#endif +#define SDL_HAS_VULKAN SDL_VERSION_ATLEAST(2,0,6) + +// SDL Data +struct ImGui_ImplSDL2_Data +{ + SDL_Window* Window; + SDL_Renderer* Renderer; + Uint64 Time; + Uint32 MouseWindowID; + int MouseButtonsDown; + SDL_Cursor* MouseCursors[ImGuiMouseCursor_COUNT]; + SDL_Cursor* LastMouseCursor; + int PendingMouseLeaveFrame; + char* ClipboardTextData; + bool MouseCanUseGlobalState; + + ImGui_ImplSDL2_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. +static ImGui_ImplSDL2_Data* ImGui_ImplSDL2_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplSDL2_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; +} + +// Functions +static const char* ImGui_ImplSDL2_GetClipboardText(void*) +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + bd->ClipboardTextData = SDL_GetClipboardText(); + return bd->ClipboardTextData; +} + +static void ImGui_ImplSDL2_SetClipboardText(void*, const char* text) +{ + SDL_SetClipboardText(text); +} + +// Note: native IME will only display if user calls SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1") _before_ SDL_CreateWindow(). +static void ImGui_ImplSDL2_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeData* data) +{ + if (data->WantVisible) + { + SDL_Rect r; + r.x = (int)data->InputPos.x; + r.y = (int)data->InputPos.y; + r.w = 1; + r.h = (int)data->InputLineHeight; + SDL_SetTextInputRect(&r); + SDL_StartTextInput(); + } + else + { + SDL_StopTextInput(); + } +} + +static ImGuiKey ImGui_ImplSDL2_KeycodeToImGuiKey(int keycode) +{ + switch (keycode) + { + case SDLK_TAB: return ImGuiKey_Tab; + case SDLK_LEFT: return ImGuiKey_LeftArrow; + case SDLK_RIGHT: return ImGuiKey_RightArrow; + case SDLK_UP: return ImGuiKey_UpArrow; + case SDLK_DOWN: return ImGuiKey_DownArrow; + case SDLK_PAGEUP: return ImGuiKey_PageUp; + case SDLK_PAGEDOWN: return ImGuiKey_PageDown; + case SDLK_HOME: return ImGuiKey_Home; + case SDLK_END: return ImGuiKey_End; + case SDLK_INSERT: return ImGuiKey_Insert; + case SDLK_DELETE: return ImGuiKey_Delete; + case SDLK_BACKSPACE: return ImGuiKey_Backspace; + case SDLK_SPACE: return ImGuiKey_Space; + case SDLK_RETURN: return ImGuiKey_Enter; + case SDLK_ESCAPE: return ImGuiKey_Escape; + case SDLK_QUOTE: return ImGuiKey_Apostrophe; + case SDLK_COMMA: return ImGuiKey_Comma; + case SDLK_MINUS: return ImGuiKey_Minus; + case SDLK_PERIOD: return ImGuiKey_Period; + case SDLK_SLASH: return ImGuiKey_Slash; + case SDLK_SEMICOLON: return ImGuiKey_Semicolon; + case SDLK_EQUALS: return ImGuiKey_Equal; + case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket; + case SDLK_BACKSLASH: return ImGuiKey_Backslash; + case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket; + case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent; + case SDLK_CAPSLOCK: return ImGuiKey_CapsLock; + case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock; + case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock; + case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen; + case SDLK_PAUSE: return ImGuiKey_Pause; + case SDLK_KP_0: return ImGuiKey_Keypad0; + case SDLK_KP_1: return ImGuiKey_Keypad1; + case SDLK_KP_2: return ImGuiKey_Keypad2; + case SDLK_KP_3: return ImGuiKey_Keypad3; + case SDLK_KP_4: return ImGuiKey_Keypad4; + case SDLK_KP_5: return ImGuiKey_Keypad5; + case SDLK_KP_6: return ImGuiKey_Keypad6; + case SDLK_KP_7: return ImGuiKey_Keypad7; + case SDLK_KP_8: return ImGuiKey_Keypad8; + case SDLK_KP_9: return ImGuiKey_Keypad9; + case SDLK_KP_PERIOD: return ImGuiKey_KeypadDecimal; + case SDLK_KP_DIVIDE: return ImGuiKey_KeypadDivide; + case SDLK_KP_MULTIPLY: return ImGuiKey_KeypadMultiply; + case SDLK_KP_MINUS: return ImGuiKey_KeypadSubtract; + case SDLK_KP_PLUS: return ImGuiKey_KeypadAdd; + case SDLK_KP_ENTER: return ImGuiKey_KeypadEnter; + case SDLK_KP_EQUALS: return ImGuiKey_KeypadEqual; + case SDLK_LCTRL: return ImGuiKey_LeftCtrl; + case SDLK_LSHIFT: return ImGuiKey_LeftShift; + case SDLK_LALT: return ImGuiKey_LeftAlt; + case SDLK_LGUI: return ImGuiKey_LeftSuper; + case SDLK_RCTRL: return ImGuiKey_RightCtrl; + case SDLK_RSHIFT: return ImGuiKey_RightShift; + case SDLK_RALT: return ImGuiKey_RightAlt; + case SDLK_RGUI: return ImGuiKey_RightSuper; + case SDLK_APPLICATION: return ImGuiKey_Menu; + case SDLK_0: return ImGuiKey_0; + case SDLK_1: return ImGuiKey_1; + case SDLK_2: return ImGuiKey_2; + case SDLK_3: return ImGuiKey_3; + case SDLK_4: return ImGuiKey_4; + case SDLK_5: return ImGuiKey_5; + case SDLK_6: return ImGuiKey_6; + case SDLK_7: return ImGuiKey_7; + case SDLK_8: return ImGuiKey_8; + case SDLK_9: return ImGuiKey_9; + case SDLK_a: return ImGuiKey_A; + case SDLK_b: return ImGuiKey_B; + case SDLK_c: return ImGuiKey_C; + case SDLK_d: return ImGuiKey_D; + case SDLK_e: return ImGuiKey_E; + case SDLK_f: return ImGuiKey_F; + case SDLK_g: return ImGuiKey_G; + case SDLK_h: return ImGuiKey_H; + case SDLK_i: return ImGuiKey_I; + case SDLK_j: return ImGuiKey_J; + case SDLK_k: return ImGuiKey_K; + case SDLK_l: return ImGuiKey_L; + case SDLK_m: return ImGuiKey_M; + case SDLK_n: return ImGuiKey_N; + case SDLK_o: return ImGuiKey_O; + case SDLK_p: return ImGuiKey_P; + case SDLK_q: return ImGuiKey_Q; + case SDLK_r: return ImGuiKey_R; + case SDLK_s: return ImGuiKey_S; + case SDLK_t: return ImGuiKey_T; + case SDLK_u: return ImGuiKey_U; + case SDLK_v: return ImGuiKey_V; + case SDLK_w: return ImGuiKey_W; + case SDLK_x: return ImGuiKey_X; + case SDLK_y: return ImGuiKey_Y; + case SDLK_z: return ImGuiKey_Z; + case SDLK_F1: return ImGuiKey_F1; + case SDLK_F2: return ImGuiKey_F2; + case SDLK_F3: return ImGuiKey_F3; + case SDLK_F4: return ImGuiKey_F4; + case SDLK_F5: return ImGuiKey_F5; + case SDLK_F6: return ImGuiKey_F6; + case SDLK_F7: return ImGuiKey_F7; + case SDLK_F8: return ImGuiKey_F8; + case SDLK_F9: return ImGuiKey_F9; + case SDLK_F10: return ImGuiKey_F10; + case SDLK_F11: return ImGuiKey_F11; + case SDLK_F12: return ImGuiKey_F12; + } + return ImGuiKey_None; +} + +static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(ImGuiMod_Ctrl, (sdl_key_mods & KMOD_CTRL) != 0); + io.AddKeyEvent(ImGuiMod_Shift, (sdl_key_mods & KMOD_SHIFT) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (sdl_key_mods & KMOD_ALT) != 0); + io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & KMOD_GUI) != 0); +} + +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field. +bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + + switch (event->type) + { + case SDL_MOUSEMOTION: + { + ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y); + io.AddMousePosEvent(mouse_pos.x, mouse_pos.y); + return true; + } + case SDL_MOUSEWHEEL: + { + //IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY); +#if SDL_VERSION_ATLEAST(2,0,18) // If this fails to compile on Emscripten: update to latest Emscripten! + float wheel_x = -event->wheel.preciseX; + float wheel_y = event->wheel.preciseY; +#else + float wheel_x = -(float)event->wheel.x; + float wheel_y = (float)event->wheel.y; +#endif +#ifdef __EMSCRIPTEN__ + wheel_x /= 100.0f; +#endif + io.AddMouseWheelEvent(wheel_x, wheel_y); + return true; + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + int mouse_button = -1; + if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; } + if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; } + if (event->button.button == SDL_BUTTON_MIDDLE) { mouse_button = 2; } + if (event->button.button == SDL_BUTTON_X1) { mouse_button = 3; } + if (event->button.button == SDL_BUTTON_X2) { mouse_button = 4; } + if (mouse_button == -1) + break; + io.AddMouseButtonEvent(mouse_button, (event->type == SDL_MOUSEBUTTONDOWN)); + bd->MouseButtonsDown = (event->type == SDL_MOUSEBUTTONDOWN) ? (bd->MouseButtonsDown | (1 << mouse_button)) : (bd->MouseButtonsDown & ~(1 << mouse_button)); + return true; + } + case SDL_TEXTINPUT: + { + io.AddInputCharactersUTF8(event->text.text); + return true; + } + case SDL_KEYDOWN: + case SDL_KEYUP: + { + ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod); + ImGuiKey key = ImGui_ImplSDL2_KeycodeToImGuiKey(event->key.keysym.sym); + io.AddKeyEvent(key, (event->type == SDL_KEYDOWN)); + io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions. + return true; + } + case SDL_WINDOWEVENT: + { + // - When capturing mouse, SDL will send a bunch of conflicting LEAVE/ENTER event on every mouse move, but the final ENTER tends to be right. + // - However we won't get a correct LEAVE event for a captured window. + // - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late, + // causing SDL_WINDOWEVENT_LEAVE on previous frame to interrupt drag operation by clear mouse position. This is why + // we delay process the SDL_WINDOWEVENT_LEAVE events by one frame. See issue #5012 for details. + Uint8 window_event = event->window.event; + if (window_event == SDL_WINDOWEVENT_ENTER) + { + bd->MouseWindowID = event->window.windowID; + bd->PendingMouseLeaveFrame = 0; + } + if (window_event == SDL_WINDOWEVENT_LEAVE) + bd->PendingMouseLeaveFrame = ImGui::GetFrameCount() + 1; + if (window_event == SDL_WINDOWEVENT_FOCUS_GAINED) + io.AddFocusEvent(true); + else if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST) + io.AddFocusEvent(false); + return true; + } + } + return false; +} + +static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + // Check and store if we are on a SDL backend that supports global mouse position + // ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list) + bool mouse_can_use_global_state = false; +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + const char* sdl_backend = SDL_GetCurrentVideoDriver(); + const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" }; + for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++) + if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0) + mouse_can_use_global_state = true; +#endif + + // Setup backend capabilities flags + ImGui_ImplSDL2_Data* bd = IM_NEW(ImGui_ImplSDL2_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = "imgui_impl_sdl2"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bd->Window = window; + bd->Renderer = renderer; + bd->MouseCanUseGlobalState = mouse_can_use_global_state; + + io.SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText; + io.ClipboardUserData = nullptr; + io.SetPlatformImeDataFn = ImGui_ImplSDL2_SetPlatformImeData; + + // Load mouse cursors + bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); + bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); + bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS); + bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW); + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); + bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); + + // Set platform dependent data in viewport + // Our mouse update function expect PlatformHandle to be filled for the main viewport + ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + main_viewport->PlatformHandleRaw = nullptr; + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + if (SDL_GetWindowWMInfo(window, &info)) + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + main_viewport->PlatformHandleRaw = (void*)info.info.win.window; +#elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA) + main_viewport->PlatformHandleRaw = (void*)info.info.cocoa.window; +#endif + } + + // From 2.0.5: Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event. + // Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered. + // (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application. + // It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click: + // you can ignore SDL_MOUSEBUTTONDOWN events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED) +#ifdef SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH + SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); +#endif + + // From 2.0.18: Enable native IME. + // IMPORTANT: This is used at the time of SDL_CreateWindow() so this will only affects secondary windows, if any. + // For the main window to be affected, your application needs to call this manually before calling SDL_CreateWindow(). +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // From 2.0.22: Disable auto-capture, this is preventing drag and drop across multiple windows (see #5710) +#ifdef SDL_HINT_MOUSE_AUTO_CAPTURE + SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0"); +#endif + + return true; +} + +bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context) +{ + IM_UNUSED(sdl_gl_context); // Viewport branch will need this. + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window) +{ +#if !SDL_HAS_VULKAN + IM_ASSERT(0 && "Unsupported"); +#endif + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window) +{ +#if !defined(_WIN32) + IM_ASSERT(0 && "Unsupported"); +#endif + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window) +{ + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer) +{ + return ImGui_ImplSDL2_Init(window, renderer); +} + +void ImGui_ImplSDL2_Shutdown() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) + SDL_FreeCursor(bd->MouseCursors[cursor_n]); + bd->LastMouseCursor = NULL; + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + IM_DELETE(bd); +} + +static void ImGui_ImplSDL2_UpdateMouseData() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + // We forward mouse input when hovered or captured (via SDL_MOUSEMOTION) or when focused (below) +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + // SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside + SDL_CaptureMouse((bd->MouseButtonsDown != 0) ? SDL_TRUE : SDL_FALSE); + SDL_Window* focused_window = SDL_GetKeyboardFocus(); + const bool is_app_focused = (bd->Window == focused_window); +#else + const bool is_app_focused = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) != 0; // SDL 2.0.3 and non-windowed systems: single-viewport only +#endif + if (is_app_focused) + { + // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) + if (io.WantSetMousePos) + SDL_WarpMouseInWindow(bd->Window, (int)io.MousePos.x, (int)io.MousePos.y); + + // (Optional) Fallback to provide mouse position when focused (SDL_MOUSEMOTION already provides this when hovered or captured) + if (bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0) + { + int window_x, window_y, mouse_x_global, mouse_y_global; + SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global); + SDL_GetWindowPosition(bd->Window, &window_x, &window_y); + io.AddMousePosEvent((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y)); + } + } +} + +static void ImGui_ImplSDL2_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return; + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + SDL_ShowCursor(SDL_FALSE); + } + else + { + // Show OS mouse cursor + SDL_Cursor* expected_cursor = bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]; + if (bd->LastMouseCursor != expected_cursor) + { + SDL_SetCursor(expected_cursor); // SDL function doesn't have an early out (see #6113) + bd->LastMouseCursor = expected_cursor; + } + SDL_ShowCursor(SDL_TRUE); + } +} + +static void ImGui_ImplSDL2_UpdateGamepads() +{ + ImGuiIO& io = ImGui::GetIO(); + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + return; + + // Get gamepad + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; + SDL_GameController* game_controller = SDL_GameControllerOpen(0); + if (!game_controller) + return; + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + + // Update gamepad inputs + #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) + #define MAP_BUTTON(KEY_NO, BUTTON_NO) { io.AddKeyEvent(KEY_NO, SDL_GameControllerGetButton(game_controller, BUTTON_NO) != 0); } + #define MAP_ANALOG(KEY_NO, AXIS_NO, V0, V1) { float vn = (float)(SDL_GameControllerGetAxis(game_controller, AXIS_NO) - V0) / (float)(V1 - V0); vn = IM_SATURATE(vn); io.AddKeyAnalogEvent(KEY_NO, vn > 0.1f, vn); } + const int thumb_dead_zone = 8000; // SDL_gamecontroller.h suggests using this value. + MAP_BUTTON(ImGuiKey_GamepadStart, SDL_CONTROLLER_BUTTON_START); + MAP_BUTTON(ImGuiKey_GamepadBack, SDL_CONTROLLER_BUTTON_BACK); + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, SDL_CONTROLLER_BUTTON_X); // Xbox X, PS Square + MAP_BUTTON(ImGuiKey_GamepadFaceRight, SDL_CONTROLLER_BUTTON_B); // Xbox B, PS Circle + MAP_BUTTON(ImGuiKey_GamepadFaceUp, SDL_CONTROLLER_BUTTON_Y); // Xbox Y, PS Triangle + MAP_BUTTON(ImGuiKey_GamepadFaceDown, SDL_CONTROLLER_BUTTON_A); // Xbox A, PS Cross + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN); + MAP_BUTTON(ImGuiKey_GamepadL1, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); + MAP_BUTTON(ImGuiKey_GamepadR1, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); + MAP_ANALOG(ImGuiKey_GamepadL2, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 0.0f, 32767); + MAP_ANALOG(ImGuiKey_GamepadR2, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 0.0f, 32767); + MAP_BUTTON(ImGuiKey_GamepadL3, SDL_CONTROLLER_BUTTON_LEFTSTICK); + MAP_BUTTON(ImGuiKey_GamepadR3, SDL_CONTROLLER_BUTTON_RIGHTSTICK); + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, SDL_CONTROLLER_AXIS_RIGHTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, SDL_CONTROLLER_AXIS_RIGHTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, SDL_CONTROLLER_AXIS_RIGHTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumb_dead_zone, +32767); + #undef MAP_BUTTON + #undef MAP_ANALOG +} + +void ImGui_ImplSDL2_NewFrame() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDL2_Init()?"); + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + int w, h; + int display_w, display_h; + SDL_GetWindowSize(bd->Window, &w, &h); + if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) + w = h = 0; + if (bd->Renderer != nullptr) + SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h); + else + SDL_GL_GetDrawableSize(bd->Window, &display_w, &display_h); + io.DisplaySize = ImVec2((float)w, (float)h); + if (w > 0 && h > 0) + io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h); + + // Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution) + // (Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. Happens in VMs and Emscripten, see #6189, #6114, #3644) + static Uint64 frequency = SDL_GetPerformanceFrequency(); + Uint64 current_time = SDL_GetPerformanceCounter(); + if (current_time <= bd->Time) + current_time = bd->Time + 1; + io.DeltaTime = bd->Time > 0 ? (float)((double)(current_time - bd->Time) / frequency) : (float)(1.0f / 60.0f); + bd->Time = current_time; + + if (bd->PendingMouseLeaveFrame && bd->PendingMouseLeaveFrame >= ImGui::GetFrameCount() && bd->MouseButtonsDown == 0) + { + bd->MouseWindowID = 0; + bd->PendingMouseLeaveFrame = 0; + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + } + + ImGui_ImplSDL2_UpdateMouseData(); + ImGui_ImplSDL2_UpdateMouseCursor(); + + // Update game controllers (if enabled and available) + ImGui_ImplSDL2_UpdateGamepads(); +} diff --git a/ImGui/backends/imgui_impl_sdl2.h b/ImGui/backends/imgui_impl_sdl2.h new file mode 100644 index 0000000..68da36a --- /dev/null +++ b/ImGui/backends/imgui_impl_sdl2.h @@ -0,0 +1,35 @@ +// dear imgui: Platform Backend for SDL2 +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct SDL_Window; +struct SDL_Renderer; +typedef union SDL_Event SDL_Event; + +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer); +IMGUI_IMPL_API void ImGui_ImplSDL2_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplSDL2_NewFrame(); +IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event); + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +static inline void ImGui_ImplSDL2_NewFrame(SDL_Window*) { ImGui_ImplSDL2_NewFrame(); } // 1.84: removed unnecessary parameter +#endif diff --git a/ImGui/backends/imgui_impl_sdl3.cpp b/ImGui/backends/imgui_impl_sdl3.cpp new file mode 100644 index 0000000..9362f7e --- /dev/null +++ b/ImGui/backends/imgui_impl_sdl3.cpp @@ -0,0 +1,567 @@ +// dear imgui: Platform Backend for SDL3 (*EXPERIMENTAL*) +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL3 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) +// (IMPORTANT: SDL 3.0.0 is NOT YET RELEASED. IT IS POSSIBLE THAT ITS SPECS/API WILL CHANGE BEFORE RELEASE) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// Missing features: +// [x] Platform: Basic IME support. Position somehow broken in SDL3 + app needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-23: Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. (#6189, #6114, #3644) +// 2023-02-07: Forked "imgui_impl_sdl2" into "imgui_impl_sdl3". Removed version checks for old feature. Refer to imgui_impl_sdl2.cpp for older changelog. + +#include "imgui.h" +#include "imgui_impl_sdl3.h" + +// SDL +#include +#include +#if defined(__APPLE__) +#include +#endif + +#if !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__) +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1 +#else +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 0 +#endif + +// SDL Data +struct ImGui_ImplSDL3_Data +{ + SDL_Window* Window; + SDL_Renderer* Renderer; + Uint64 Time; + Uint32 MouseWindowID; + int MouseButtonsDown; + SDL_Cursor* MouseCursors[ImGuiMouseCursor_COUNT]; + SDL_Cursor* LastMouseCursor; + int PendingMouseLeaveFrame; + char* ClipboardTextData; + bool MouseCanUseGlobalState; + + ImGui_ImplSDL3_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. +static ImGui_ImplSDL3_Data* ImGui_ImplSDL3_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplSDL3_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; +} + +// Functions +static const char* ImGui_ImplSDL3_GetClipboardText(void*) +{ + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + bd->ClipboardTextData = SDL_GetClipboardText(); + return bd->ClipboardTextData; +} + +static void ImGui_ImplSDL3_SetClipboardText(void*, const char* text) +{ + SDL_SetClipboardText(text); +} + +static void ImGui_ImplSDL3_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeData* data) +{ + if (data->WantVisible) + { + SDL_Rect r; + r.x = (int)data->InputPos.x; + r.y = (int)data->InputPos.y; + r.w = 1; + r.h = (int)data->InputLineHeight; + SDL_SetTextInputRect(&r); + SDL_StartTextInput(); + } + else + { + SDL_StopTextInput(); + } +} + +static ImGuiKey ImGui_ImplSDL3_KeycodeToImGuiKey(int keycode) +{ + switch (keycode) + { + case SDLK_TAB: return ImGuiKey_Tab; + case SDLK_LEFT: return ImGuiKey_LeftArrow; + case SDLK_RIGHT: return ImGuiKey_RightArrow; + case SDLK_UP: return ImGuiKey_UpArrow; + case SDLK_DOWN: return ImGuiKey_DownArrow; + case SDLK_PAGEUP: return ImGuiKey_PageUp; + case SDLK_PAGEDOWN: return ImGuiKey_PageDown; + case SDLK_HOME: return ImGuiKey_Home; + case SDLK_END: return ImGuiKey_End; + case SDLK_INSERT: return ImGuiKey_Insert; + case SDLK_DELETE: return ImGuiKey_Delete; + case SDLK_BACKSPACE: return ImGuiKey_Backspace; + case SDLK_SPACE: return ImGuiKey_Space; + case SDLK_RETURN: return ImGuiKey_Enter; + case SDLK_ESCAPE: return ImGuiKey_Escape; + case SDLK_QUOTE: return ImGuiKey_Apostrophe; + case SDLK_COMMA: return ImGuiKey_Comma; + case SDLK_MINUS: return ImGuiKey_Minus; + case SDLK_PERIOD: return ImGuiKey_Period; + case SDLK_SLASH: return ImGuiKey_Slash; + case SDLK_SEMICOLON: return ImGuiKey_Semicolon; + case SDLK_EQUALS: return ImGuiKey_Equal; + case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket; + case SDLK_BACKSLASH: return ImGuiKey_Backslash; + case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket; + case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent; + case SDLK_CAPSLOCK: return ImGuiKey_CapsLock; + case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock; + case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock; + case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen; + case SDLK_PAUSE: return ImGuiKey_Pause; + case SDLK_KP_0: return ImGuiKey_Keypad0; + case SDLK_KP_1: return ImGuiKey_Keypad1; + case SDLK_KP_2: return ImGuiKey_Keypad2; + case SDLK_KP_3: return ImGuiKey_Keypad3; + case SDLK_KP_4: return ImGuiKey_Keypad4; + case SDLK_KP_5: return ImGuiKey_Keypad5; + case SDLK_KP_6: return ImGuiKey_Keypad6; + case SDLK_KP_7: return ImGuiKey_Keypad7; + case SDLK_KP_8: return ImGuiKey_Keypad8; + case SDLK_KP_9: return ImGuiKey_Keypad9; + case SDLK_KP_PERIOD: return ImGuiKey_KeypadDecimal; + case SDLK_KP_DIVIDE: return ImGuiKey_KeypadDivide; + case SDLK_KP_MULTIPLY: return ImGuiKey_KeypadMultiply; + case SDLK_KP_MINUS: return ImGuiKey_KeypadSubtract; + case SDLK_KP_PLUS: return ImGuiKey_KeypadAdd; + case SDLK_KP_ENTER: return ImGuiKey_KeypadEnter; + case SDLK_KP_EQUALS: return ImGuiKey_KeypadEqual; + case SDLK_LCTRL: return ImGuiKey_LeftCtrl; + case SDLK_LSHIFT: return ImGuiKey_LeftShift; + case SDLK_LALT: return ImGuiKey_LeftAlt; + case SDLK_LGUI: return ImGuiKey_LeftSuper; + case SDLK_RCTRL: return ImGuiKey_RightCtrl; + case SDLK_RSHIFT: return ImGuiKey_RightShift; + case SDLK_RALT: return ImGuiKey_RightAlt; + case SDLK_RGUI: return ImGuiKey_RightSuper; + case SDLK_APPLICATION: return ImGuiKey_Menu; + case SDLK_0: return ImGuiKey_0; + case SDLK_1: return ImGuiKey_1; + case SDLK_2: return ImGuiKey_2; + case SDLK_3: return ImGuiKey_3; + case SDLK_4: return ImGuiKey_4; + case SDLK_5: return ImGuiKey_5; + case SDLK_6: return ImGuiKey_6; + case SDLK_7: return ImGuiKey_7; + case SDLK_8: return ImGuiKey_8; + case SDLK_9: return ImGuiKey_9; + case SDLK_a: return ImGuiKey_A; + case SDLK_b: return ImGuiKey_B; + case SDLK_c: return ImGuiKey_C; + case SDLK_d: return ImGuiKey_D; + case SDLK_e: return ImGuiKey_E; + case SDLK_f: return ImGuiKey_F; + case SDLK_g: return ImGuiKey_G; + case SDLK_h: return ImGuiKey_H; + case SDLK_i: return ImGuiKey_I; + case SDLK_j: return ImGuiKey_J; + case SDLK_k: return ImGuiKey_K; + case SDLK_l: return ImGuiKey_L; + case SDLK_m: return ImGuiKey_M; + case SDLK_n: return ImGuiKey_N; + case SDLK_o: return ImGuiKey_O; + case SDLK_p: return ImGuiKey_P; + case SDLK_q: return ImGuiKey_Q; + case SDLK_r: return ImGuiKey_R; + case SDLK_s: return ImGuiKey_S; + case SDLK_t: return ImGuiKey_T; + case SDLK_u: return ImGuiKey_U; + case SDLK_v: return ImGuiKey_V; + case SDLK_w: return ImGuiKey_W; + case SDLK_x: return ImGuiKey_X; + case SDLK_y: return ImGuiKey_Y; + case SDLK_z: return ImGuiKey_Z; + case SDLK_F1: return ImGuiKey_F1; + case SDLK_F2: return ImGuiKey_F2; + case SDLK_F3: return ImGuiKey_F3; + case SDLK_F4: return ImGuiKey_F4; + case SDLK_F5: return ImGuiKey_F5; + case SDLK_F6: return ImGuiKey_F6; + case SDLK_F7: return ImGuiKey_F7; + case SDLK_F8: return ImGuiKey_F8; + case SDLK_F9: return ImGuiKey_F9; + case SDLK_F10: return ImGuiKey_F10; + case SDLK_F11: return ImGuiKey_F11; + case SDLK_F12: return ImGuiKey_F12; + } + return ImGuiKey_None; +} + +static void ImGui_ImplSDL3_UpdateKeyModifiers(SDL_Keymod sdl_key_mods) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(ImGuiMod_Ctrl, (sdl_key_mods & SDL_KMOD_CTRL) != 0); + io.AddKeyEvent(ImGuiMod_Shift, (sdl_key_mods & SDL_KMOD_SHIFT) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (sdl_key_mods & SDL_KMOD_ALT) != 0); + io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & SDL_KMOD_GUI) != 0); +} + +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field. +bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + + switch (event->type) + { + case SDL_EVENT_MOUSE_MOTION: + { + ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y); + io.AddMousePosEvent(mouse_pos.x, mouse_pos.y); + return true; + } + case SDL_EVENT_MOUSE_WHEEL: + { + //IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY); + float wheel_x = -event->wheel.x; + float wheel_y = event->wheel.y; + #ifdef __EMSCRIPTEN__ + wheel_x /= 100.0f; + #endif + io.AddMouseWheelEvent(wheel_x, wheel_y); + return true; + } + case SDL_EVENT_MOUSE_BUTTON_DOWN: + case SDL_EVENT_MOUSE_BUTTON_UP: + { + int mouse_button = -1; + if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; } + if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; } + if (event->button.button == SDL_BUTTON_MIDDLE) { mouse_button = 2; } + if (event->button.button == SDL_BUTTON_X1) { mouse_button = 3; } + if (event->button.button == SDL_BUTTON_X2) { mouse_button = 4; } + if (mouse_button == -1) + break; + io.AddMouseButtonEvent(mouse_button, (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN)); + bd->MouseButtonsDown = (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) ? (bd->MouseButtonsDown | (1 << mouse_button)) : (bd->MouseButtonsDown & ~(1 << mouse_button)); + return true; + } + case SDL_EVENT_TEXT_INPUT: + { + io.AddInputCharactersUTF8(event->text.text); + return true; + } + case SDL_EVENT_KEY_DOWN: + case SDL_EVENT_KEY_UP: + { + ImGui_ImplSDL3_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod); + ImGuiKey key = ImGui_ImplSDL3_KeycodeToImGuiKey(event->key.keysym.sym); + io.AddKeyEvent(key, (event->type == SDL_EVENT_KEY_DOWN)); + io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions. + return true; + } + case SDL_EVENT_WINDOW_MOUSE_ENTER: + { + bd->MouseWindowID = event->window.windowID; + bd->PendingMouseLeaveFrame = 0; + return true; + } + // - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late, + // causing SDL_WINDOWEVENT_LEAVE on previous frame to interrupt drag operation by clear mouse position. This is why + // we delay process the SDL_WINDOWEVENT_LEAVE events by one frame. See issue #5012 for details. + // FIXME: Unconfirmed whether this is still needed with SDL3. + case SDL_EVENT_WINDOW_MOUSE_LEAVE: + { + bd->PendingMouseLeaveFrame = ImGui::GetFrameCount() + 1; + return true; + } + case SDL_EVENT_WINDOW_FOCUS_GAINED: + io.AddFocusEvent(true); + return true; + case SDL_EVENT_WINDOW_FOCUS_LOST: + io.AddFocusEvent(false); + return true; + } + return false; +} + +static bool ImGui_ImplSDL3_Init(SDL_Window* window, SDL_Renderer* renderer) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + // Check and store if we are on a SDL backend that supports global mouse position + // ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list) + bool mouse_can_use_global_state = false; +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + const char* sdl_backend = SDL_GetCurrentVideoDriver(); + const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" }; + for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++) + if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0) + mouse_can_use_global_state = true; +#endif + + // Setup backend capabilities flags + ImGui_ImplSDL3_Data* bd = IM_NEW(ImGui_ImplSDL3_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = "imgui_impl_sdl3"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bd->Window = window; + bd->Renderer = renderer; + bd->MouseCanUseGlobalState = mouse_can_use_global_state; + + io.SetClipboardTextFn = ImGui_ImplSDL3_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplSDL3_GetClipboardText; + io.ClipboardUserData = nullptr; + io.SetPlatformImeDataFn = ImGui_ImplSDL3_SetPlatformImeData; + + // Load mouse cursors + bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); + bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); + bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS); + bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW); + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); + bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); + + // Set platform dependent data in viewport + // Our mouse update function expect PlatformHandle to be filled for the main viewport + ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + main_viewport->PlatformHandleRaw = nullptr; + SDL_SysWMinfo info; + if (SDL_GetWindowWMInfo(window, &info, SDL_SYSWM_CURRENT_VERSION) == 0) + { +#if defined(SDL_ENABLE_SYSWM_WINDOWS) + main_viewport->PlatformHandleRaw = (void*)info.info.win.window; +#elif defined(__APPLE__) && defined(SDL_ENABLE_SYSWM_COCOA) + main_viewport->PlatformHandleRaw = (void*)info.info.cocoa.window; +#endif + } + + // From 2.0.5: Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event. + // Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered. + // (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application. + // It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click: + // you can ignore SDL_MOUSEBUTTONDOWN events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED) +#ifdef SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH + SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); +#endif + + // From 2.0.22: Disable auto-capture, this is preventing drag and drop across multiple windows (see #5710) +#ifdef SDL_HINT_MOUSE_AUTO_CAPTURE + SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0"); +#endif + + return true; +} + +bool ImGui_ImplSDL3_InitForOpenGL(SDL_Window* window, void* sdl_gl_context) +{ + IM_UNUSED(sdl_gl_context); // Viewport branch will need this. + return ImGui_ImplSDL3_Init(window, nullptr); +} + +bool ImGui_ImplSDL3_InitForVulkan(SDL_Window* window) +{ + return ImGui_ImplSDL3_Init(window, nullptr); +} + +bool ImGui_ImplSDL3_InitForD3D(SDL_Window* window) +{ +#if !defined(_WIN32) + IM_ASSERT(0 && "Unsupported"); +#endif + return ImGui_ImplSDL3_Init(window, nullptr); +} + +bool ImGui_ImplSDL3_InitForMetal(SDL_Window* window) +{ + return ImGui_ImplSDL3_Init(window, nullptr); +} + +bool ImGui_ImplSDL3_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer) +{ + return ImGui_ImplSDL3_Init(window, renderer); +} + +void ImGui_ImplSDL3_Shutdown() +{ + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) + SDL_DestroyCursor(bd->MouseCursors[cursor_n]); + bd->LastMouseCursor = NULL; + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + IM_DELETE(bd); +} + +static void ImGui_ImplSDL3_UpdateMouseData() +{ + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + // We forward mouse input when hovered or captured (via SDL_MOUSEMOTION) or when focused (below) +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + // SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside + SDL_CaptureMouse((bd->MouseButtonsDown != 0) ? SDL_TRUE : SDL_FALSE); + SDL_Window* focused_window = SDL_GetKeyboardFocus(); + const bool is_app_focused = (bd->Window == focused_window); +#else + const bool is_app_focused = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) != 0; // SDL 2.0.3 and non-windowed systems: single-viewport only +#endif + if (is_app_focused) + { + // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) + if (io.WantSetMousePos) + SDL_WarpMouseInWindow(bd->Window, io.MousePos.x, io.MousePos.y); + + // (Optional) Fallback to provide mouse position when focused (SDL_MOUSEMOTION already provides this when hovered or captured) + if (bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0) + { + // Single-viewport mode: mouse position in client window coordinates (io.MousePos is (0,0) when the mouse is on the upper-left corner of the app window) + float mouse_x_global, mouse_y_global; + int window_x, window_y; + SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global); + SDL_GetWindowPosition(focused_window, &window_x, &window_y); + io.AddMousePosEvent(mouse_x_global - window_x, mouse_y_global - window_y); + } + } +} + +static void ImGui_ImplSDL3_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return; + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + SDL_HideCursor(); + } + else + { + // Show OS mouse cursor + SDL_Cursor* expected_cursor = bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]; + if (bd->LastMouseCursor != expected_cursor) + { + SDL_SetCursor(expected_cursor); // SDL function doesn't have an early out (see #6113) + bd->LastMouseCursor = expected_cursor; + } + SDL_ShowCursor(); + } +} + +static void ImGui_ImplSDL3_UpdateGamepads() +{ + ImGuiIO& io = ImGui::GetIO(); + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + return; + + // Get gamepad + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; + SDL_Gamepad* gamepad = SDL_OpenGamepad(0); + if (!gamepad) + return; + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + + // Update gamepad inputs + #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) + #define MAP_BUTTON(KEY_NO, BUTTON_NO) { io.AddKeyEvent(KEY_NO, SDL_GetGamepadButton(gamepad, BUTTON_NO) != 0); } + #define MAP_ANALOG(KEY_NO, AXIS_NO, V0, V1) { float vn = (float)(SDL_GetGamepadAxis(gamepad, AXIS_NO) - V0) / (float)(V1 - V0); vn = IM_SATURATE(vn); io.AddKeyAnalogEvent(KEY_NO, vn > 0.1f, vn); } + const int thumb_dead_zone = 8000; // SDL_gamecontroller.h suggests using this value. + MAP_BUTTON(ImGuiKey_GamepadStart, SDL_GAMEPAD_BUTTON_START); + MAP_BUTTON(ImGuiKey_GamepadBack, SDL_GAMEPAD_BUTTON_BACK); + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, SDL_GAMEPAD_BUTTON_X); // Xbox X, PS Square + MAP_BUTTON(ImGuiKey_GamepadFaceRight, SDL_GAMEPAD_BUTTON_B); // Xbox B, PS Circle + MAP_BUTTON(ImGuiKey_GamepadFaceUp, SDL_GAMEPAD_BUTTON_Y); // Xbox Y, PS Triangle + MAP_BUTTON(ImGuiKey_GamepadFaceDown, SDL_GAMEPAD_BUTTON_A); // Xbox A, PS Cross + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, SDL_GAMEPAD_BUTTON_DPAD_LEFT); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, SDL_GAMEPAD_BUTTON_DPAD_RIGHT); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, SDL_GAMEPAD_BUTTON_DPAD_UP); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, SDL_GAMEPAD_BUTTON_DPAD_DOWN); + MAP_BUTTON(ImGuiKey_GamepadL1, SDL_GAMEPAD_BUTTON_LEFT_SHOULDER); + MAP_BUTTON(ImGuiKey_GamepadR1, SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER); + MAP_ANALOG(ImGuiKey_GamepadL2, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, 0.0f, 32767); + MAP_ANALOG(ImGuiKey_GamepadR2, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, 0.0f, 32767); + MAP_BUTTON(ImGuiKey_GamepadL3, SDL_GAMEPAD_BUTTON_LEFT_STICK); + MAP_BUTTON(ImGuiKey_GamepadR3, SDL_GAMEPAD_BUTTON_RIGHT_STICK); + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, SDL_GAMEPAD_AXIS_LEFTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, SDL_GAMEPAD_AXIS_LEFTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, SDL_GAMEPAD_AXIS_LEFTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, SDL_GAMEPAD_AXIS_LEFTY, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, SDL_GAMEPAD_AXIS_RIGHTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, SDL_GAMEPAD_AXIS_RIGHTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, SDL_GAMEPAD_AXIS_RIGHTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, SDL_GAMEPAD_AXIS_RIGHTY, +thumb_dead_zone, +32767); + #undef MAP_BUTTON + #undef MAP_ANALOG +} + +void ImGui_ImplSDL3_NewFrame() +{ + ImGui_ImplSDL3_Data* bd = ImGui_ImplSDL3_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDL3_Init()?"); + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + int w, h; + int display_w, display_h; + SDL_GetWindowSize(bd->Window, &w, &h); + if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) + w = h = 0; + SDL_GetWindowSizeInPixels(bd->Window, &display_w, &display_h); + io.DisplaySize = ImVec2((float)w, (float)h); + if (w > 0 && h > 0) + io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h); + + // Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution) + // (Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. Happens in VMs and Emscripten, see #6189, #6114, #3644) + static Uint64 frequency = SDL_GetPerformanceFrequency(); + Uint64 current_time = SDL_GetPerformanceCounter(); + if (current_time <= bd->Time) + current_time = bd->Time + 1; + io.DeltaTime = bd->Time > 0 ? (float)((double)(current_time - bd->Time) / frequency) : (float)(1.0f / 60.0f); + bd->Time = current_time; + + if (bd->PendingMouseLeaveFrame && bd->PendingMouseLeaveFrame >= ImGui::GetFrameCount() && bd->MouseButtonsDown == 0) + { + bd->MouseWindowID = 0; + bd->PendingMouseLeaveFrame = 0; + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + } + + ImGui_ImplSDL3_UpdateMouseData(); + ImGui_ImplSDL3_UpdateMouseCursor(); + + // Update game controllers (if enabled and available) + ImGui_ImplSDL3_UpdateGamepads(); +} diff --git a/ImGui/backends/imgui_impl_sdl3.h b/ImGui/backends/imgui_impl_sdl3.h new file mode 100644 index 0000000..fd7e49c --- /dev/null +++ b/ImGui/backends/imgui_impl_sdl3.h @@ -0,0 +1,33 @@ +// dear imgui: Platform Backend for SDL3 (*EXPERIMENTAL*) +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL3 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) +// (IMPORTANT: SDL 3.0.0 is NOT YET RELEASED. IT IS POSSIBLE THAT ITS SPECS/API WILL CHANGE BEFORE RELEASE) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// Missing features: +// [x] Platform: Basic IME support. Position somehow broken in SDL3 + app needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct SDL_Window; +struct SDL_Renderer; +typedef union SDL_Event SDL_Event; + +IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForOpenGL(SDL_Window* window, void* sdl_gl_context); +IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForVulkan(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForD3D(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForMetal(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL3_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer); +IMGUI_IMPL_API void ImGui_ImplSDL3_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplSDL3_NewFrame(); +IMGUI_IMPL_API bool ImGui_ImplSDL3_ProcessEvent(const SDL_Event* event); diff --git a/ImGui/backends/imgui_impl_sdlrenderer.cpp b/ImGui/backends/imgui_impl_sdlrenderer.cpp new file mode 100644 index 0000000..b786ebd --- /dev/null +++ b/ImGui/backends/imgui_impl_sdlrenderer.cpp @@ -0,0 +1,250 @@ +// dear imgui: Renderer Backend for SDL_Renderer +// (Requires: SDL 2.0.17+) + +// Important to understand: SDL_Renderer is an _optional_ component of SDL. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. +// If your application will want to render any non trivial amount of graphics other than UI, +// please be aware that SDL_Renderer offers a limited graphic API to the end-user and it might +// be difficult to step out of those boundaries. +// However, we understand it is a convenient choice to get an app started easily. + +// Implemented features: +// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can copy and use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-12-21: Update SDL_RenderGeometryRaw() format to work with SDL 2.0.19. +// 2021-12-03: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2021-10-06: Backup and restore modified ClipRect/Viewport. +// 2021-09-21: Initial version. + +#include "imgui.h" +#include "imgui_impl_sdlrenderer.h" +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// SDL +#include +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function +#endif + +// SDL_Renderer data +struct ImGui_ImplSDLRenderer_Data +{ + SDL_Renderer* SDLRenderer; + SDL_Texture* FontTexture; + ImGui_ImplSDLRenderer_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplSDLRenderer_Data* ImGui_ImplSDLRenderer_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplSDLRenderer_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +bool ImGui_ImplSDLRenderer_Init(SDL_Renderer* renderer) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + IM_ASSERT(renderer != nullptr && "SDL_Renderer not initialized!"); + + // Setup backend capabilities flags + ImGui_ImplSDLRenderer_Data* bd = IM_NEW(ImGui_ImplSDLRenderer_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_sdlrenderer"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + bd->SDLRenderer = renderer; + + return true; +} + +void ImGui_ImplSDLRenderer_Shutdown() +{ + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplSDLRenderer_DestroyDeviceObjects(); + + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +static void ImGui_ImplSDLRenderer_SetupRenderState() +{ + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + + // Clear out any viewports and cliprect set by the user + // FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process. + SDL_RenderSetViewport(bd->SDLRenderer, nullptr); + SDL_RenderSetClipRect(bd->SDLRenderer, nullptr); +} + +void ImGui_ImplSDLRenderer_NewFrame() +{ + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDLRenderer_Init()?"); + + if (!bd->FontTexture) + ImGui_ImplSDLRenderer_CreateDeviceObjects(); +} + +void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data) +{ + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + + // If there's a scale factor set by the user, use that instead + // If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass + // to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here. + float rsx = 1.0f; + float rsy = 1.0f; + SDL_RenderGetScale(bd->SDLRenderer, &rsx, &rsy); + ImVec2 render_scale; + render_scale.x = (rsx == 1.0f) ? draw_data->FramebufferScale.x : 1.0f; + render_scale.y = (rsy == 1.0f) ? draw_data->FramebufferScale.y : 1.0f; + + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) + int fb_width = (int)(draw_data->DisplaySize.x * render_scale.x); + int fb_height = (int)(draw_data->DisplaySize.y * render_scale.y); + if (fb_width == 0 || fb_height == 0) + return; + + // Backup SDL_Renderer state that will be modified to restore it afterwards + struct BackupSDLRendererState + { + SDL_Rect Viewport; + bool ClipEnabled; + SDL_Rect ClipRect; + }; + BackupSDLRendererState old = {}; + old.ClipEnabled = SDL_RenderIsClipEnabled(bd->SDLRenderer) == SDL_TRUE; + SDL_RenderGetViewport(bd->SDLRenderer, &old.Viewport); + SDL_RenderGetClipRect(bd->SDLRenderer, &old.ClipRect); + + // Will project scissor/clipping rectangles into framebuffer space + ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + ImVec2 clip_scale = render_scale; + + // Render command lists + ImGui_ImplSDLRenderer_SetupRenderState(); + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; + + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplSDLRenderer_SetupRenderState(); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_min.x < 0.0f) { clip_min.x = 0.0f; } + if (clip_min.y < 0.0f) { clip_min.y = 0.0f; } + if (clip_max.x > (float)fb_width) { clip_max.x = (float)fb_width; } + if (clip_max.y > (float)fb_height) { clip_max.y = (float)fb_height; } + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + SDL_Rect r = { (int)(clip_min.x), (int)(clip_min.y), (int)(clip_max.x - clip_min.x), (int)(clip_max.y - clip_min.y) }; + SDL_RenderSetClipRect(bd->SDLRenderer, &r); + + const float* xy = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + IM_OFFSETOF(ImDrawVert, pos)); + const float* uv = (const float*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + IM_OFFSETOF(ImDrawVert, uv)); +#if SDL_VERSION_ATLEAST(2,0,19) + const SDL_Color* color = (const SDL_Color*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + IM_OFFSETOF(ImDrawVert, col)); // SDL 2.0.19+ +#else + const int* color = (const int*)(const void*)((const char*)(vtx_buffer + pcmd->VtxOffset) + IM_OFFSETOF(ImDrawVert, col)); // SDL 2.0.17 and 2.0.18 +#endif + + // Bind texture, Draw + SDL_Texture* tex = (SDL_Texture*)pcmd->GetTexID(); + SDL_RenderGeometryRaw(bd->SDLRenderer, tex, + xy, (int)sizeof(ImDrawVert), + color, (int)sizeof(ImDrawVert), + uv, (int)sizeof(ImDrawVert), + cmd_list->VtxBuffer.Size - pcmd->VtxOffset, + idx_buffer + pcmd->IdxOffset, pcmd->ElemCount, sizeof(ImDrawIdx)); + } + } + } + + // Restore modified SDL_Renderer state + SDL_RenderSetViewport(bd->SDLRenderer, &old.Viewport); + SDL_RenderSetClipRect(bd->SDLRenderer, old.ClipEnabled ? &old.ClipRect : nullptr); +} + +// Called by Init/NewFrame/Shutdown +bool ImGui_ImplSDLRenderer_CreateFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + + // Build texture atlas + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bit (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. + + // Upload texture to graphics system + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + bd->FontTexture = SDL_CreateTexture(bd->SDLRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STATIC, width, height); + if (bd->FontTexture == nullptr) + { + SDL_Log("error creating texture"); + return false; + } + SDL_UpdateTexture(bd->FontTexture, nullptr, pixels, 4 * width); + SDL_SetTextureBlendMode(bd->FontTexture, SDL_BLENDMODE_BLEND); + SDL_SetTextureScaleMode(bd->FontTexture, SDL_ScaleModeLinear); + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontTexture); + + return true; +} + +void ImGui_ImplSDLRenderer_DestroyFontsTexture() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplSDLRenderer_Data* bd = ImGui_ImplSDLRenderer_GetBackendData(); + if (bd->FontTexture) + { + io.Fonts->SetTexID(0); + SDL_DestroyTexture(bd->FontTexture); + bd->FontTexture = nullptr; + } +} + +bool ImGui_ImplSDLRenderer_CreateDeviceObjects() +{ + return ImGui_ImplSDLRenderer_CreateFontsTexture(); +} + +void ImGui_ImplSDLRenderer_DestroyDeviceObjects() +{ + ImGui_ImplSDLRenderer_DestroyFontsTexture(); +} diff --git a/ImGui/backends/imgui_impl_sdlrenderer.h b/ImGui/backends/imgui_impl_sdlrenderer.h new file mode 100644 index 0000000..de1eff6 --- /dev/null +++ b/ImGui/backends/imgui_impl_sdlrenderer.h @@ -0,0 +1,29 @@ +// dear imgui: Renderer Backend for SDL_Renderer +// (Requires: SDL 2.0.17+) + +// Important to understand: SDL_Renderer is an _optional_ component of SDL. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. +// If your application will want to render any non trivial amount of graphics other than UI, +// please be aware that SDL_Renderer offers a limited graphic API to the end-user and it might +// be difficult to step out of those boundaries. +// However, we understand it is a convenient choice to get an app started easily. + +// Implemented features: +// [X] Renderer: User texture binding. Use 'SDL_Texture*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct SDL_Renderer; + +IMGUI_IMPL_API bool ImGui_ImplSDLRenderer_Init(SDL_Renderer* renderer); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer_RenderDrawData(ImDrawData* draw_data); + +// Called by Init/NewFrame/Shutdown +IMGUI_IMPL_API bool ImGui_ImplSDLRenderer_CreateFontsTexture(); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer_DestroyFontsTexture(); +IMGUI_IMPL_API bool ImGui_ImplSDLRenderer_CreateDeviceObjects(); +IMGUI_IMPL_API void ImGui_ImplSDLRenderer_DestroyDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_vulkan.cpp b/ImGui/backends/imgui_impl_vulkan.cpp new file mode 100644 index 0000000..bfc488c --- /dev/null +++ b/ImGui/backends/imgui_impl_vulkan.cpp @@ -0,0 +1,1450 @@ +// dear imgui: Renderer Backend for Vulkan +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [!] Renderer: User texture binding. Use 'VkDescriptorSet' as ImTextureID. Read the FAQ about ImTextureID! See https://github.com/ocornut/imgui/pull/914 for discussions. +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'. +// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. +// To build this on 32-bit systems and support texture changes: +// - [Solution 1] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'ImTextureID=ImU64' (this is what we do in our .vcxproj files) +// - [Solution 2] IDE/msbuild: in "Properties/C++/Preprocessor Definitions" add 'IMGUI_USER_CONFIG="my_imgui_config.h"' and inside 'my_imgui_config.h' add '#define ImTextureID ImU64' and as many other options as you like. +// - [Solution 3] IDE/msbuild: edit imconfig.h and add '#define ImTextureID ImU64' (prefer solution 2 to create your own config file!) +// - [Solution 4] command-line: add '/D ImTextureID=ImU64' to your cl.exe command-line (this is what we do in our batch files) + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification. +// IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/ + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +// You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-01-02: Vulkan: Fixed sampler passed to ImGui_ImplVulkan_AddTexture() not being honored + removed a bunch of duplicate code. +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738). +// 2022-01-20: Vulkan: Added support for ImTextureID as VkDescriptorSet. User need to call ImGui_ImplVulkan_AddTexture(). Building for 32-bit targets requires '#define ImTextureID ImU64'. (#914). +// 2021-10-15: Vulkan: Call vkCmdSetScissor() at the end of render a full-viewport to reduce likehood of issues with people using VK_DYNAMIC_STATE_SCISSOR in their app without calling vkCmdSetScissor() explicitly every frame. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-03-22: Vulkan: Fix mapped memory validation error when buffer sizes are not multiple of VkPhysicalDeviceLimits::nonCoherentAtomSize. +// 2021-02-18: Vulkan: Change blending equation to preserve alpha in output buffer. +// 2021-01-27: Vulkan: Added support for custom function load and IMGUI_IMPL_VULKAN_NO_PROTOTYPES by using ImGui_ImplVulkan_LoadFunctions(). +// 2020-11-11: Vulkan: Added support for specifying which subpass to reference during VkPipeline creation. +// 2020-09-07: Vulkan: Added VkPipeline parameter to ImGui_ImplVulkan_RenderDrawData (default to one passed to ImGui_ImplVulkan_Init). +// 2020-05-04: Vulkan: Fixed crash if initial frame has no vertices. +// 2020-04-26: Vulkan: Fixed edge case where render callbacks wouldn't be called if the ImDrawData didn't have vertices. +// 2019-08-01: Vulkan: Added support for specifying multisample count. Set ImGui_ImplVulkan_InitInfo::MSAASamples to one of the VkSampleCountFlagBits values to use, default is non-multisampled as before. +// 2019-05-29: Vulkan: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: Vulkan: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2019-04-04: *BREAKING CHANGE*: Vulkan: Added ImageCount/MinImageCount fields in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). Added ImGui_ImplVulkan_SetMinImageCount(). +// 2019-04-04: Vulkan: Added VkInstance argument to ImGui_ImplVulkanH_CreateWindow() optional helper. +// 2019-04-04: Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like. +// 2019-04-01: Vulkan: Support for 32-bit index buffer (#define ImDrawIdx unsigned int). +// 2019-02-16: Vulkan: Viewport and clipping rectangles correctly using draw_data->FramebufferScale to allow retina display. +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-08-25: Vulkan: Fixed mishandled VkSurfaceCapabilitiesKHR::maxImageCount=0 case. +// 2018-06-22: Inverted the parameters to ImGui_ImplVulkan_RenderDrawData() to be consistent with other backends. +// 2018-06-08: Misc: Extracted imgui_impl_vulkan.cpp/.h away from the old combined GLFW+Vulkan example. +// 2018-06-08: Vulkan: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-03-03: Vulkan: Various refactor, created a couple of ImGui_ImplVulkanH_XXX helper that the example can use and that viewport support will use. +// 2018-03-01: Vulkan: Renamed ImGui_ImplVulkan_Init_Info to ImGui_ImplVulkan_InitInfo and fields to match more closely Vulkan terminology. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback, ImGui_ImplVulkan_Render() calls ImGui_ImplVulkan_RenderDrawData() itself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2017-05-15: Vulkan: Fix scissor offset being negative. Fix new Vulkan validation warnings. Set required depth member for buffer image copy. +// 2016-11-13: Vulkan: Fix validation layer warnings and errors and redeclare gl_PerVertex. +// 2016-10-18: Vulkan: Add location decorators & change to use structs as in/out in glsl, update embedded spv (produced with glslangValidator -x). Null the released resources. +// 2016-08-27: Vulkan: Fix Vulkan example for use when a depth buffer is active. + +#include "imgui_impl_vulkan.h" +#include + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#endif + +// Reusable buffers used for rendering 1 current in-flight frame, for ImGui_ImplVulkan_RenderDrawData() +// [Please zero-clear before use!] +struct ImGui_ImplVulkanH_FrameRenderBuffers +{ + VkDeviceMemory VertexBufferMemory; + VkDeviceMemory IndexBufferMemory; + VkDeviceSize VertexBufferSize; + VkDeviceSize IndexBufferSize; + VkBuffer VertexBuffer; + VkBuffer IndexBuffer; +}; + +// Each viewport will hold 1 ImGui_ImplVulkanH_WindowRenderBuffers +// [Please zero-clear before use!] +struct ImGui_ImplVulkanH_WindowRenderBuffers +{ + uint32_t Index; + uint32_t Count; + ImGui_ImplVulkanH_FrameRenderBuffers* FrameRenderBuffers; +}; + +// Vulkan data +struct ImGui_ImplVulkan_Data +{ + ImGui_ImplVulkan_InitInfo VulkanInitInfo; + VkRenderPass RenderPass; + VkDeviceSize BufferMemoryAlignment; + VkPipelineCreateFlags PipelineCreateFlags; + VkDescriptorSetLayout DescriptorSetLayout; + VkPipelineLayout PipelineLayout; + VkPipeline Pipeline; + uint32_t Subpass; + VkShaderModule ShaderModuleVert; + VkShaderModule ShaderModuleFrag; + + // Font data + VkSampler FontSampler; + VkDeviceMemory FontMemory; + VkImage FontImage; + VkImageView FontView; + VkDescriptorSet FontDescriptorSet; + VkDeviceMemory UploadBufferMemory; + VkBuffer UploadBuffer; + + // Render buffers for main window + ImGui_ImplVulkanH_WindowRenderBuffers MainWindowRenderBuffers; + + ImGui_ImplVulkan_Data() + { + memset((void*)this, 0, sizeof(*this)); + BufferMemoryAlignment = 256; + } +}; + +// Forward Declarations +bool ImGui_ImplVulkan_CreateDeviceObjects(); +void ImGui_ImplVulkan_DestroyDeviceObjects(); +void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator); +void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator); +void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator); +void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator); +void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count); +void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator); + +// Vulkan prototypes for use with custom loaders +// (see description of IMGUI_IMPL_VULKAN_NO_PROTOTYPES in imgui_impl_vulkan.h +#ifdef VK_NO_PROTOTYPES +static bool g_FunctionsLoaded = false; +#else +static bool g_FunctionsLoaded = true; +#endif +#ifdef VK_NO_PROTOTYPES +#define IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_MAP_MACRO) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateCommandBuffers) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateDescriptorSets) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkAllocateMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindBufferMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkBindImageMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindDescriptorSets) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindIndexBuffer) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindPipeline) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdBindVertexBuffers) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdCopyBufferToImage) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdDrawIndexed) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdPipelineBarrier) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdPushConstants) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdSetScissor) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCmdSetViewport) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateBuffer) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateCommandPool) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateDescriptorSetLayout) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateFence) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateFramebuffer) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateGraphicsPipelines) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateImage) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateImageView) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreatePipelineLayout) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateRenderPass) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSampler) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSemaphore) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateShaderModule) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkCreateSwapchainKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyBuffer) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyCommandPool) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyDescriptorSetLayout) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyFence) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyFramebuffer) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyImage) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyImageView) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyPipeline) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyPipelineLayout) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyRenderPass) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySampler) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySemaphore) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroyShaderModule) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySurfaceKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDestroySwapchainKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkDeviceWaitIdle) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkFlushMappedMemoryRanges) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeCommandBuffers) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeDescriptorSets) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkFreeMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetBufferMemoryRequirements) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetImageMemoryRequirements) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceMemoryProperties) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfaceCapabilitiesKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfaceFormatsKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetPhysicalDeviceSurfacePresentModesKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkGetSwapchainImagesKHR) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkMapMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkUnmapMemory) \ + IMGUI_VULKAN_FUNC_MAP_MACRO(vkUpdateDescriptorSets) + +// Define function pointers +#define IMGUI_VULKAN_FUNC_DEF(func) static PFN_##func func; +IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF) +#undef IMGUI_VULKAN_FUNC_DEF +#endif // VK_NO_PROTOTYPES + +//----------------------------------------------------------------------------- +// SHADERS +//----------------------------------------------------------------------------- + +// glsl_shader.vert, compiled with: +// # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert +/* +#version 450 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aUV; +layout(location = 2) in vec4 aColor; +layout(push_constant) uniform uPushConstant { vec2 uScale; vec2 uTranslate; } pc; + +out gl_PerVertex { vec4 gl_Position; }; +layout(location = 0) out struct { vec4 Color; vec2 UV; } Out; + +void main() +{ + Out.Color = aColor; + Out.UV = aUV; + gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1); +} +*/ +static uint32_t __glsl_shader_vert_spv[] = +{ + 0x07230203,0x00010000,0x00080001,0x0000002e,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015, + 0x0000001b,0x0000001c,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, + 0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43, + 0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f, + 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005, + 0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000, + 0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00040005,0x0000001c, + 0x736f5061,0x00000000,0x00060005,0x0000001e,0x73755075,0x6e6f4368,0x6e617473,0x00000074, + 0x00050006,0x0000001e,0x00000000,0x61635375,0x0000656c,0x00060006,0x0000001e,0x00000001, + 0x61725475,0x616c736e,0x00006574,0x00030005,0x00000020,0x00006370,0x00040047,0x0000000b, + 0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015, + 0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047, + 0x00000019,0x00000002,0x00040047,0x0000001c,0x0000001e,0x00000000,0x00050048,0x0000001e, + 0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023,0x00000008, + 0x00030047,0x0000001e,0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002, + 0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017, + 0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020, + 0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015, + 0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020, + 0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020, + 0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020, + 0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020, + 0x00000017,0x00000003,0x00000008,0x0003001e,0x00000019,0x00000007,0x00040020,0x0000001a, + 0x00000003,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000003,0x0004003b,0x00000014, + 0x0000001c,0x00000001,0x0004001e,0x0000001e,0x00000008,0x00000008,0x00040020,0x0000001f, + 0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,0x00000021, + 0x00000009,0x00000008,0x0004002b,0x00000006,0x00000028,0x00000000,0x0004002b,0x00000006, + 0x00000029,0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8, + 0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012, + 0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016, + 0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018, + 0x00000016,0x0004003d,0x00000008,0x0000001d,0x0000001c,0x00050041,0x00000021,0x00000022, + 0x00000020,0x0000000d,0x0004003d,0x00000008,0x00000023,0x00000022,0x00050085,0x00000008, + 0x00000024,0x0000001d,0x00000023,0x00050041,0x00000021,0x00000025,0x00000020,0x00000013, + 0x0004003d,0x00000008,0x00000026,0x00000025,0x00050081,0x00000008,0x00000027,0x00000024, + 0x00000026,0x00050051,0x00000006,0x0000002a,0x00000027,0x00000000,0x00050051,0x00000006, + 0x0000002b,0x00000027,0x00000001,0x00070050,0x00000007,0x0000002c,0x0000002a,0x0000002b, + 0x00000028,0x00000029,0x00050041,0x00000011,0x0000002d,0x0000001b,0x0000000d,0x0003003e, + 0x0000002d,0x0000002c,0x000100fd,0x00010038 +}; + +// glsl_shader.frag, compiled with: +// # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag +/* +#version 450 core +layout(location = 0) out vec4 fColor; +layout(set=0, binding=0) uniform sampler2D sTexture; +layout(location = 0) in struct { vec4 Color; vec2 UV; } In; +void main() +{ + fColor = In.Color * texture(sTexture, In.UV.st); +} +*/ +static uint32_t __glsl_shader_frag_spv[] = +{ + 0x07230203,0x00010000,0x00080001,0x0000001e,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010, + 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, + 0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000, + 0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001, + 0x00005655,0x00030005,0x0000000d,0x00006e49,0x00050005,0x00000016,0x78655473,0x65727574, + 0x00000000,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x0000001e, + 0x00000000,0x00040047,0x00000016,0x00000022,0x00000000,0x00040047,0x00000016,0x00000021, + 0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006, + 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003, + 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,0x00000006, + 0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,0x00000001, + 0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,0x00000020, + 0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000001, + 0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000, + 0x00000001,0x00000000,0x0003001b,0x00000014,0x00000013,0x00040020,0x00000015,0x00000000, + 0x00000014,0x0004003b,0x00000015,0x00000016,0x00000000,0x0004002b,0x0000000e,0x00000018, + 0x00000001,0x00040020,0x00000019,0x00000001,0x0000000a,0x00050036,0x00000002,0x00000004, + 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000010,0x00000011,0x0000000d, + 0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,0x0004003d,0x00000014,0x00000017, + 0x00000016,0x00050041,0x00000019,0x0000001a,0x0000000d,0x00000018,0x0004003d,0x0000000a, + 0x0000001b,0x0000001a,0x00050057,0x00000007,0x0000001c,0x00000017,0x0000001b,0x00050085, + 0x00000007,0x0000001d,0x00000012,0x0000001c,0x0003003e,0x00000009,0x0000001d,0x000100fd, + 0x00010038 +}; + +//----------------------------------------------------------------------------- +// FUNCTIONS +//----------------------------------------------------------------------------- + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not tested and probably dysfunctional in this backend. +static ImGui_ImplVulkan_Data* ImGui_ImplVulkan_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplVulkan_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +static uint32_t ImGui_ImplVulkan_MemoryType(VkMemoryPropertyFlags properties, uint32_t type_bits) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + VkPhysicalDeviceMemoryProperties prop; + vkGetPhysicalDeviceMemoryProperties(v->PhysicalDevice, &prop); + for (uint32_t i = 0; i < prop.memoryTypeCount; i++) + if ((prop.memoryTypes[i].propertyFlags & properties) == properties && type_bits & (1 << i)) + return i; + return 0xFFFFFFFF; // Unable to find memoryType +} + +static void check_vk_result(VkResult err) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + if (!bd) + return; + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + if (v->CheckVkResultFn) + v->CheckVkResultFn(err); +} + +static void CreateOrResizeBuffer(VkBuffer& buffer, VkDeviceMemory& buffer_memory, VkDeviceSize& p_buffer_size, size_t new_size, VkBufferUsageFlagBits usage) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + VkResult err; + if (buffer != VK_NULL_HANDLE) + vkDestroyBuffer(v->Device, buffer, v->Allocator); + if (buffer_memory != VK_NULL_HANDLE) + vkFreeMemory(v->Device, buffer_memory, v->Allocator); + + VkDeviceSize vertex_buffer_size_aligned = ((new_size - 1) / bd->BufferMemoryAlignment + 1) * bd->BufferMemoryAlignment; + VkBufferCreateInfo buffer_info = {}; + buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + buffer_info.size = vertex_buffer_size_aligned; + buffer_info.usage = usage; + buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &buffer); + check_vk_result(err); + + VkMemoryRequirements req; + vkGetBufferMemoryRequirements(v->Device, buffer, &req); + bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment; + VkMemoryAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + alloc_info.allocationSize = req.size; + alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits); + err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &buffer_memory); + check_vk_result(err); + + err = vkBindBufferMemory(v->Device, buffer, buffer_memory, 0); + check_vk_result(err); + p_buffer_size = req.size; +} + +static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline pipeline, VkCommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers* rb, int fb_width, int fb_height) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + + // Bind pipeline: + { + vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); + } + + // Bind Vertex And Index Buffer: + if (draw_data->TotalVtxCount > 0) + { + VkBuffer vertex_buffers[1] = { rb->VertexBuffer }; + VkDeviceSize vertex_offset[1] = { 0 }; + vkCmdBindVertexBuffers(command_buffer, 0, 1, vertex_buffers, vertex_offset); + vkCmdBindIndexBuffer(command_buffer, rb->IndexBuffer, 0, sizeof(ImDrawIdx) == 2 ? VK_INDEX_TYPE_UINT16 : VK_INDEX_TYPE_UINT32); + } + + // Setup viewport: + { + VkViewport viewport; + viewport.x = 0; + viewport.y = 0; + viewport.width = (float)fb_width; + viewport.height = (float)fb_height; + viewport.minDepth = 0.0f; + viewport.maxDepth = 1.0f; + vkCmdSetViewport(command_buffer, 0, 1, &viewport); + } + + // Setup scale and translation: + // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + { + float scale[2]; + scale[0] = 2.0f / draw_data->DisplaySize.x; + scale[1] = 2.0f / draw_data->DisplaySize.y; + float translate[2]; + translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0]; + translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1]; + vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale); + vkCmdPushConstants(command_buffer, bd->PipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate); + } +} + +// Render function +void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline) +{ + // Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates) + int fb_width = (int)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); + int fb_height = (int)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); + if (fb_width <= 0 || fb_height <= 0) + return; + + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + if (pipeline == VK_NULL_HANDLE) + pipeline = bd->Pipeline; + + // Allocate array to store enough vertex/index buffers + ImGui_ImplVulkanH_WindowRenderBuffers* wrb = &bd->MainWindowRenderBuffers; + if (wrb->FrameRenderBuffers == nullptr) + { + wrb->Index = 0; + wrb->Count = v->ImageCount; + wrb->FrameRenderBuffers = (ImGui_ImplVulkanH_FrameRenderBuffers*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count); + memset(wrb->FrameRenderBuffers, 0, sizeof(ImGui_ImplVulkanH_FrameRenderBuffers) * wrb->Count); + } + IM_ASSERT(wrb->Count == v->ImageCount); + wrb->Index = (wrb->Index + 1) % wrb->Count; + ImGui_ImplVulkanH_FrameRenderBuffers* rb = &wrb->FrameRenderBuffers[wrb->Index]; + + if (draw_data->TotalVtxCount > 0) + { + // Create or resize the vertex/index buffers + size_t vertex_size = draw_data->TotalVtxCount * sizeof(ImDrawVert); + size_t index_size = draw_data->TotalIdxCount * sizeof(ImDrawIdx); + if (rb->VertexBuffer == VK_NULL_HANDLE || rb->VertexBufferSize < vertex_size) + CreateOrResizeBuffer(rb->VertexBuffer, rb->VertexBufferMemory, rb->VertexBufferSize, vertex_size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); + if (rb->IndexBuffer == VK_NULL_HANDLE || rb->IndexBufferSize < index_size) + CreateOrResizeBuffer(rb->IndexBuffer, rb->IndexBufferMemory, rb->IndexBufferSize, index_size, VK_BUFFER_USAGE_INDEX_BUFFER_BIT); + + // Upload vertex/index data into a single contiguous GPU buffer + ImDrawVert* vtx_dst = nullptr; + ImDrawIdx* idx_dst = nullptr; + VkResult err = vkMapMemory(v->Device, rb->VertexBufferMemory, 0, rb->VertexBufferSize, 0, (void**)(&vtx_dst)); + check_vk_result(err); + err = vkMapMemory(v->Device, rb->IndexBufferMemory, 0, rb->IndexBufferSize, 0, (void**)(&idx_dst)); + check_vk_result(err); + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + VkMappedMemoryRange range[2] = {}; + range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range[0].memory = rb->VertexBufferMemory; + range[0].size = VK_WHOLE_SIZE; + range[1].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range[1].memory = rb->IndexBufferMemory; + range[1].size = VK_WHOLE_SIZE; + err = vkFlushMappedMemoryRanges(v->Device, 2, range); + check_vk_result(err); + vkUnmapMemory(v->Device, rb->VertexBufferMemory); + vkUnmapMemory(v->Device, rb->IndexBufferMemory); + } + + // Setup desired Vulkan state + ImGui_ImplVulkan_SetupRenderState(draw_data, pipeline, command_buffer, rb, fb_width, fb_height); + + // Will project scissor/clipping rectangles into framebuffer space + ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports + ImVec2 clip_scale = draw_data->FramebufferScale; // (1,1) unless using retina display which are often (2,2) + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_vtx_offset = 0; + int global_idx_offset = 0; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplVulkan_SetupRenderState(draw_data, pipeline, command_buffer, rb, fb_width, fb_height); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + + // Clamp to viewport as vkCmdSetScissor() won't accept values that are off bounds + if (clip_min.x < 0.0f) { clip_min.x = 0.0f; } + if (clip_min.y < 0.0f) { clip_min.y = 0.0f; } + if (clip_max.x > fb_width) { clip_max.x = (float)fb_width; } + if (clip_max.y > fb_height) { clip_max.y = (float)fb_height; } + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle + VkRect2D scissor; + scissor.offset.x = (int32_t)(clip_min.x); + scissor.offset.y = (int32_t)(clip_min.y); + scissor.extent.width = (uint32_t)(clip_max.x - clip_min.x); + scissor.extent.height = (uint32_t)(clip_max.y - clip_min.y); + vkCmdSetScissor(command_buffer, 0, 1, &scissor); + + // Bind DescriptorSet with font or user texture + VkDescriptorSet desc_set[1] = { (VkDescriptorSet)pcmd->TextureId }; + if (sizeof(ImTextureID) < sizeof(ImU64)) + { + // We don't support texture switches if ImTextureID hasn't been redefined to be 64-bit. Do a flaky check that other textures haven't been used. + IM_ASSERT(pcmd->TextureId == (ImTextureID)bd->FontDescriptorSet); + desc_set[0] = bd->FontDescriptorSet; + } + vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, nullptr); + + // Draw + vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } + + // Note: at this point both vkCmdSetViewport() and vkCmdSetScissor() have been called. + // Our last values will leak into user/application rendering IF: + // - Your app uses a pipeline with VK_DYNAMIC_STATE_VIEWPORT or VK_DYNAMIC_STATE_SCISSOR dynamic state + // - And you forgot to call vkCmdSetViewport() and vkCmdSetScissor() yourself to explicitly set that state. + // If you use VK_DYNAMIC_STATE_VIEWPORT or VK_DYNAMIC_STATE_SCISSOR you are responsible for setting the values before rendering. + // In theory we should aim to backup/restore those values but I am not sure this is possible. + // We perform a call to vkCmdSetScissor() to set back a full viewport which is likely to fix things for 99% users but technically this is not perfect. (See github #4644) + VkRect2D scissor = { { 0, 0 }, { (uint32_t)fb_width, (uint32_t)fb_height } }; + vkCmdSetScissor(command_buffer, 0, 1, &scissor); +} + +bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + size_t upload_size = width * height * 4 * sizeof(char); + + VkResult err; + + // Create the Image: + { + VkImageCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; + info.imageType = VK_IMAGE_TYPE_2D; + info.format = VK_FORMAT_R8G8B8A8_UNORM; + info.extent.width = width; + info.extent.height = height; + info.extent.depth = 1; + info.mipLevels = 1; + info.arrayLayers = 1; + info.samples = VK_SAMPLE_COUNT_1_BIT; + info.tiling = VK_IMAGE_TILING_OPTIMAL; + info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; + info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + err = vkCreateImage(v->Device, &info, v->Allocator, &bd->FontImage); + check_vk_result(err); + VkMemoryRequirements req; + vkGetImageMemoryRequirements(v->Device, bd->FontImage, &req); + VkMemoryAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + alloc_info.allocationSize = req.size; + alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, req.memoryTypeBits); + err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->FontMemory); + check_vk_result(err); + err = vkBindImageMemory(v->Device, bd->FontImage, bd->FontMemory, 0); + check_vk_result(err); + } + + // Create the Image View: + { + VkImageViewCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + info.image = bd->FontImage; + info.viewType = VK_IMAGE_VIEW_TYPE_2D; + info.format = VK_FORMAT_R8G8B8A8_UNORM; + info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + info.subresourceRange.levelCount = 1; + info.subresourceRange.layerCount = 1; + err = vkCreateImageView(v->Device, &info, v->Allocator, &bd->FontView); + check_vk_result(err); + } + + // Create the Descriptor Set: + bd->FontDescriptorSet = (VkDescriptorSet)ImGui_ImplVulkan_AddTexture(bd->FontSampler, bd->FontView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); + + // Create the Upload Buffer: + { + VkBufferCreateInfo buffer_info = {}; + buffer_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; + buffer_info.size = upload_size; + buffer_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; + buffer_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE; + err = vkCreateBuffer(v->Device, &buffer_info, v->Allocator, &bd->UploadBuffer); + check_vk_result(err); + VkMemoryRequirements req; + vkGetBufferMemoryRequirements(v->Device, bd->UploadBuffer, &req); + bd->BufferMemoryAlignment = (bd->BufferMemoryAlignment > req.alignment) ? bd->BufferMemoryAlignment : req.alignment; + VkMemoryAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO; + alloc_info.allocationSize = req.size; + alloc_info.memoryTypeIndex = ImGui_ImplVulkan_MemoryType(VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, req.memoryTypeBits); + err = vkAllocateMemory(v->Device, &alloc_info, v->Allocator, &bd->UploadBufferMemory); + check_vk_result(err); + err = vkBindBufferMemory(v->Device, bd->UploadBuffer, bd->UploadBufferMemory, 0); + check_vk_result(err); + } + + // Upload to Buffer: + { + char* map = nullptr; + err = vkMapMemory(v->Device, bd->UploadBufferMemory, 0, upload_size, 0, (void**)(&map)); + check_vk_result(err); + memcpy(map, pixels, upload_size); + VkMappedMemoryRange range[1] = {}; + range[0].sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range[0].memory = bd->UploadBufferMemory; + range[0].size = upload_size; + err = vkFlushMappedMemoryRanges(v->Device, 1, range); + check_vk_result(err); + vkUnmapMemory(v->Device, bd->UploadBufferMemory); + } + + // Copy to Image: + { + VkImageMemoryBarrier copy_barrier[1] = {}; + copy_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + copy_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + copy_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + copy_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + copy_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + copy_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + copy_barrier[0].image = bd->FontImage; + copy_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + copy_barrier[0].subresourceRange.levelCount = 1; + copy_barrier[0].subresourceRange.layerCount = 1; + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 0, nullptr, 0, nullptr, 1, copy_barrier); + + VkBufferImageCopy region = {}; + region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.imageSubresource.layerCount = 1; + region.imageExtent.width = width; + region.imageExtent.height = height; + region.imageExtent.depth = 1; + vkCmdCopyBufferToImage(command_buffer, bd->UploadBuffer, bd->FontImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); + + VkImageMemoryBarrier use_barrier[1] = {}; + use_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + use_barrier[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + use_barrier[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + use_barrier[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + use_barrier[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + use_barrier[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + use_barrier[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + use_barrier[0].image = bd->FontImage; + use_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + use_barrier[0].subresourceRange.levelCount = 1; + use_barrier[0].subresourceRange.layerCount = 1; + vkCmdPipelineBarrier(command_buffer, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, use_barrier); + } + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)bd->FontDescriptorSet); + + return true; +} + +static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator) +{ + // Create the shader modules + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + if (bd->ShaderModuleVert == VK_NULL_HANDLE) + { + VkShaderModuleCreateInfo vert_info = {}; + vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + vert_info.codeSize = sizeof(__glsl_shader_vert_spv); + vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv; + VkResult err = vkCreateShaderModule(device, &vert_info, allocator, &bd->ShaderModuleVert); + check_vk_result(err); + } + if (bd->ShaderModuleFrag == VK_NULL_HANDLE) + { + VkShaderModuleCreateInfo frag_info = {}; + frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO; + frag_info.codeSize = sizeof(__glsl_shader_frag_spv); + frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv; + VkResult err = vkCreateShaderModule(device, &frag_info, allocator, &bd->ShaderModuleFrag); + check_vk_result(err); + } +} + +static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline, uint32_t subpass) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_CreateShaderModules(device, allocator); + + VkPipelineShaderStageCreateInfo stage[2] = {}; + stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + stage[0].stage = VK_SHADER_STAGE_VERTEX_BIT; + stage[0].module = bd->ShaderModuleVert; + stage[0].pName = "main"; + stage[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; + stage[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; + stage[1].module = bd->ShaderModuleFrag; + stage[1].pName = "main"; + + VkVertexInputBindingDescription binding_desc[1] = {}; + binding_desc[0].stride = sizeof(ImDrawVert); + binding_desc[0].inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + + VkVertexInputAttributeDescription attribute_desc[3] = {}; + attribute_desc[0].location = 0; + attribute_desc[0].binding = binding_desc[0].binding; + attribute_desc[0].format = VK_FORMAT_R32G32_SFLOAT; + attribute_desc[0].offset = IM_OFFSETOF(ImDrawVert, pos); + attribute_desc[1].location = 1; + attribute_desc[1].binding = binding_desc[0].binding; + attribute_desc[1].format = VK_FORMAT_R32G32_SFLOAT; + attribute_desc[1].offset = IM_OFFSETOF(ImDrawVert, uv); + attribute_desc[2].location = 2; + attribute_desc[2].binding = binding_desc[0].binding; + attribute_desc[2].format = VK_FORMAT_R8G8B8A8_UNORM; + attribute_desc[2].offset = IM_OFFSETOF(ImDrawVert, col); + + VkPipelineVertexInputStateCreateInfo vertex_info = {}; + vertex_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; + vertex_info.vertexBindingDescriptionCount = 1; + vertex_info.pVertexBindingDescriptions = binding_desc; + vertex_info.vertexAttributeDescriptionCount = 3; + vertex_info.pVertexAttributeDescriptions = attribute_desc; + + VkPipelineInputAssemblyStateCreateInfo ia_info = {}; + ia_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; + ia_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; + + VkPipelineViewportStateCreateInfo viewport_info = {}; + viewport_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; + viewport_info.viewportCount = 1; + viewport_info.scissorCount = 1; + + VkPipelineRasterizationStateCreateInfo raster_info = {}; + raster_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; + raster_info.polygonMode = VK_POLYGON_MODE_FILL; + raster_info.cullMode = VK_CULL_MODE_NONE; + raster_info.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; + raster_info.lineWidth = 1.0f; + + VkPipelineMultisampleStateCreateInfo ms_info = {}; + ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO; + ms_info.rasterizationSamples = (MSAASamples != 0) ? MSAASamples : VK_SAMPLE_COUNT_1_BIT; + + VkPipelineColorBlendAttachmentState color_attachment[1] = {}; + color_attachment[0].blendEnable = VK_TRUE; + color_attachment[0].srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; + color_attachment[0].dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + color_attachment[0].colorBlendOp = VK_BLEND_OP_ADD; + color_attachment[0].srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; + color_attachment[0].dstAlphaBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; + color_attachment[0].alphaBlendOp = VK_BLEND_OP_ADD; + color_attachment[0].colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT; + + VkPipelineDepthStencilStateCreateInfo depth_info = {}; + depth_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO; + + VkPipelineColorBlendStateCreateInfo blend_info = {}; + blend_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO; + blend_info.attachmentCount = 1; + blend_info.pAttachments = color_attachment; + + VkDynamicState dynamic_states[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR }; + VkPipelineDynamicStateCreateInfo dynamic_state = {}; + dynamic_state.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO; + dynamic_state.dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states); + dynamic_state.pDynamicStates = dynamic_states; + + VkGraphicsPipelineCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO; + info.flags = bd->PipelineCreateFlags; + info.stageCount = 2; + info.pStages = stage; + info.pVertexInputState = &vertex_info; + info.pInputAssemblyState = &ia_info; + info.pViewportState = &viewport_info; + info.pRasterizationState = &raster_info; + info.pMultisampleState = &ms_info; + info.pDepthStencilState = &depth_info; + info.pColorBlendState = &blend_info; + info.pDynamicState = &dynamic_state; + info.layout = bd->PipelineLayout; + info.renderPass = renderPass; + info.subpass = subpass; + VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline); + check_vk_result(err); +} + +bool ImGui_ImplVulkan_CreateDeviceObjects() +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + VkResult err; + + if (!bd->FontSampler) + { + // Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling. + VkSamplerCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO; + info.magFilter = VK_FILTER_LINEAR; + info.minFilter = VK_FILTER_LINEAR; + info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; + info.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; + info.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; + info.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; + info.minLod = -1000; + info.maxLod = 1000; + info.maxAnisotropy = 1.0f; + err = vkCreateSampler(v->Device, &info, v->Allocator, &bd->FontSampler); + check_vk_result(err); + } + + if (!bd->DescriptorSetLayout) + { + VkDescriptorSetLayoutBinding binding[1] = {}; + binding[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + binding[0].descriptorCount = 1; + binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + VkDescriptorSetLayoutCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + info.bindingCount = 1; + info.pBindings = binding; + err = vkCreateDescriptorSetLayout(v->Device, &info, v->Allocator, &bd->DescriptorSetLayout); + check_vk_result(err); + } + + if (!bd->PipelineLayout) + { + // Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix + VkPushConstantRange push_constants[1] = {}; + push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + push_constants[0].offset = sizeof(float) * 0; + push_constants[0].size = sizeof(float) * 4; + VkDescriptorSetLayout set_layout[1] = { bd->DescriptorSetLayout }; + VkPipelineLayoutCreateInfo layout_info = {}; + layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; + layout_info.setLayoutCount = 1; + layout_info.pSetLayouts = set_layout; + layout_info.pushConstantRangeCount = 1; + layout_info.pPushConstantRanges = push_constants; + err = vkCreatePipelineLayout(v->Device, &layout_info, v->Allocator, &bd->PipelineLayout); + check_vk_result(err); + } + + ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, bd->RenderPass, v->MSAASamples, &bd->Pipeline, bd->Subpass); + + return true; +} + +void ImGui_ImplVulkan_DestroyFontUploadObjects() +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + if (bd->UploadBuffer) + { + vkDestroyBuffer(v->Device, bd->UploadBuffer, v->Allocator); + bd->UploadBuffer = VK_NULL_HANDLE; + } + if (bd->UploadBufferMemory) + { + vkFreeMemory(v->Device, bd->UploadBufferMemory, v->Allocator); + bd->UploadBufferMemory = VK_NULL_HANDLE; + } +} + +void ImGui_ImplVulkan_DestroyDeviceObjects() +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); + ImGui_ImplVulkan_DestroyFontUploadObjects(); + + if (bd->ShaderModuleVert) { vkDestroyShaderModule(v->Device, bd->ShaderModuleVert, v->Allocator); bd->ShaderModuleVert = VK_NULL_HANDLE; } + if (bd->ShaderModuleFrag) { vkDestroyShaderModule(v->Device, bd->ShaderModuleFrag, v->Allocator); bd->ShaderModuleFrag = VK_NULL_HANDLE; } + if (bd->FontView) { vkDestroyImageView(v->Device, bd->FontView, v->Allocator); bd->FontView = VK_NULL_HANDLE; } + if (bd->FontImage) { vkDestroyImage(v->Device, bd->FontImage, v->Allocator); bd->FontImage = VK_NULL_HANDLE; } + if (bd->FontMemory) { vkFreeMemory(v->Device, bd->FontMemory, v->Allocator); bd->FontMemory = VK_NULL_HANDLE; } + if (bd->FontSampler) { vkDestroySampler(v->Device, bd->FontSampler, v->Allocator); bd->FontSampler = VK_NULL_HANDLE; } + if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; } + if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; } + if (bd->Pipeline) { vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator); bd->Pipeline = VK_NULL_HANDLE; } +} + +bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data) +{ + // Load function pointers + // You can use the default Vulkan loader using: + // ImGui_ImplVulkan_LoadFunctions([](const char* function_name, void*) { return vkGetInstanceProcAddr(your_vk_isntance, function_name); }); + // But this would be equivalent to not setting VK_NO_PROTOTYPES. +#ifdef VK_NO_PROTOTYPES +#define IMGUI_VULKAN_FUNC_LOAD(func) \ + func = reinterpret_cast(loader_func(#func, user_data)); \ + if (func == nullptr) \ + return false; + IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_LOAD) +#undef IMGUI_VULKAN_FUNC_LOAD +#else + IM_UNUSED(loader_func); + IM_UNUSED(user_data); +#endif + g_FunctionsLoaded = true; + return true; +} + +bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass) +{ + IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!"); + + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplVulkan_Data* bd = IM_NEW(ImGui_ImplVulkan_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_vulkan"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + IM_ASSERT(info->Instance != VK_NULL_HANDLE); + IM_ASSERT(info->PhysicalDevice != VK_NULL_HANDLE); + IM_ASSERT(info->Device != VK_NULL_HANDLE); + IM_ASSERT(info->Queue != VK_NULL_HANDLE); + IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE); + IM_ASSERT(info->MinImageCount >= 2); + IM_ASSERT(info->ImageCount >= info->MinImageCount); + IM_ASSERT(render_pass != VK_NULL_HANDLE); + + bd->VulkanInitInfo = *info; + bd->RenderPass = render_pass; + bd->Subpass = info->Subpass; + + ImGui_ImplVulkan_CreateDeviceObjects(); + + return true; +} + +void ImGui_ImplVulkan_Shutdown() +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplVulkan_DestroyDeviceObjects(); + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplVulkan_NewFrame() +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplVulkan_Init()?"); + IM_UNUSED(bd); +} + +void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + IM_ASSERT(min_image_count >= 2); + if (bd->VulkanInitInfo.MinImageCount == min_image_count) + return; + + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + VkResult err = vkDeviceWaitIdle(v->Device); + check_vk_result(err); + ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &bd->MainWindowRenderBuffers, v->Allocator); + bd->VulkanInitInfo.MinImageCount = min_image_count; +} + +// Register a texture +// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions. +VkDescriptorSet ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + + // Create Descriptor Set: + VkDescriptorSet descriptor_set; + { + VkDescriptorSetAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + alloc_info.descriptorPool = v->DescriptorPool; + alloc_info.descriptorSetCount = 1; + alloc_info.pSetLayouts = &bd->DescriptorSetLayout; + VkResult err = vkAllocateDescriptorSets(v->Device, &alloc_info, &descriptor_set); + check_vk_result(err); + } + + // Update the Descriptor Set: + { + VkDescriptorImageInfo desc_image[1] = {}; + desc_image[0].sampler = sampler; + desc_image[0].imageView = image_view; + desc_image[0].imageLayout = image_layout; + VkWriteDescriptorSet write_desc[1] = {}; + write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + write_desc[0].dstSet = descriptor_set; + write_desc[0].descriptorCount = 1; + write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + write_desc[0].pImageInfo = desc_image; + vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, nullptr); + } + return descriptor_set; +} + +void ImGui_ImplVulkan_RemoveTexture(VkDescriptorSet descriptor_set) +{ + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); + ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + vkFreeDescriptorSets(v->Device, v->DescriptorPool, 1, &descriptor_set); +} + +//------------------------------------------------------------------------- +// Internal / Miscellaneous Vulkan Helpers +// (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own app.) +//------------------------------------------------------------------------- +// You probably do NOT need to use or care about those functions. +// Those functions only exist because: +// 1) they facilitate the readability and maintenance of the multiple main.cpp examples files. +// 2) the upcoming multi-viewport feature will need them internally. +// Generally we avoid exposing any kind of superfluous high-level helpers in the backends, +// but it is too much code to duplicate everywhere so we exceptionally expose them. +// +// Your engine/app will likely _already_ have code to setup all that stuff (swap chain, render pass, frame buffers, etc.). +// You may read this code to learn about Vulkan, but it is recommended you use you own custom tailored code to do equivalent work. +// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions) +//------------------------------------------------------------------------- + +VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space) +{ + IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!"); + IM_ASSERT(request_formats != nullptr); + IM_ASSERT(request_formats_count > 0); + + // Per Spec Format and View Format are expected to be the same unless VK_IMAGE_CREATE_MUTABLE_BIT was set at image creation + // Assuming that the default behavior is without setting this bit, there is no need for separate Swapchain image and image view format + // Additionally several new color spaces were introduced with Vulkan Spec v1.0.40, + // hence we must make sure that a format with the mostly available color space, VK_COLOR_SPACE_SRGB_NONLINEAR_KHR, is found and used. + uint32_t avail_count; + vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, nullptr); + ImVector avail_format; + avail_format.resize((int)avail_count); + vkGetPhysicalDeviceSurfaceFormatsKHR(physical_device, surface, &avail_count, avail_format.Data); + + // First check if only one format, VK_FORMAT_UNDEFINED, is available, which would imply that any format is available + if (avail_count == 1) + { + if (avail_format[0].format == VK_FORMAT_UNDEFINED) + { + VkSurfaceFormatKHR ret; + ret.format = request_formats[0]; + ret.colorSpace = request_color_space; + return ret; + } + else + { + // No point in searching another format + return avail_format[0]; + } + } + else + { + // Request several formats, the first found will be used + for (int request_i = 0; request_i < request_formats_count; request_i++) + for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++) + if (avail_format[avail_i].format == request_formats[request_i] && avail_format[avail_i].colorSpace == request_color_space) + return avail_format[avail_i]; + + // If none of the requested image formats could be found, use the first available + return avail_format[0]; + } +} + +VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count) +{ + IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!"); + IM_ASSERT(request_modes != nullptr); + IM_ASSERT(request_modes_count > 0); + + // Request a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory + uint32_t avail_count = 0; + vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, nullptr); + ImVector avail_modes; + avail_modes.resize((int)avail_count); + vkGetPhysicalDeviceSurfacePresentModesKHR(physical_device, surface, &avail_count, avail_modes.Data); + //for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++) + // printf("[vulkan] avail_modes[%d] = %d\n", avail_i, avail_modes[avail_i]); + + for (int request_i = 0; request_i < request_modes_count; request_i++) + for (uint32_t avail_i = 0; avail_i < avail_count; avail_i++) + if (request_modes[request_i] == avail_modes[avail_i]) + return request_modes[request_i]; + + return VK_PRESENT_MODE_FIFO_KHR; // Always available +} + +void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator) +{ + IM_ASSERT(physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE); + (void)physical_device; + (void)allocator; + + // Create Command Buffers + VkResult err; + for (uint32_t i = 0; i < wd->ImageCount; i++) + { + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; + ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i]; + { + VkCommandPoolCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + info.queueFamilyIndex = queue_family; + err = vkCreateCommandPool(device, &info, allocator, &fd->CommandPool); + check_vk_result(err); + } + { + VkCommandBufferAllocateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + info.commandPool = fd->CommandPool; + info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + info.commandBufferCount = 1; + err = vkAllocateCommandBuffers(device, &info, &fd->CommandBuffer); + check_vk_result(err); + } + { + VkFenceCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; + info.flags = VK_FENCE_CREATE_SIGNALED_BIT; + err = vkCreateFence(device, &info, allocator, &fd->Fence); + check_vk_result(err); + } + { + VkSemaphoreCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; + err = vkCreateSemaphore(device, &info, allocator, &fsd->ImageAcquiredSemaphore); + check_vk_result(err); + err = vkCreateSemaphore(device, &info, allocator, &fsd->RenderCompleteSemaphore); + check_vk_result(err); + } + } +} + +int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode) +{ + if (present_mode == VK_PRESENT_MODE_MAILBOX_KHR) + return 3; + if (present_mode == VK_PRESENT_MODE_FIFO_KHR || present_mode == VK_PRESENT_MODE_FIFO_RELAXED_KHR) + return 2; + if (present_mode == VK_PRESENT_MODE_IMMEDIATE_KHR) + return 1; + IM_ASSERT(0); + return 1; +} + +// Also destroy old swap chain and in-flight frames data, if any. +void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count) +{ + VkResult err; + VkSwapchainKHR old_swapchain = wd->Swapchain; + wd->Swapchain = VK_NULL_HANDLE; + err = vkDeviceWaitIdle(device); + check_vk_result(err); + + // We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one. + // Destroy old Framebuffer + for (uint32_t i = 0; i < wd->ImageCount; i++) + { + ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); + ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); + } + IM_FREE(wd->Frames); + IM_FREE(wd->FrameSemaphores); + wd->Frames = nullptr; + wd->FrameSemaphores = nullptr; + wd->ImageCount = 0; + if (wd->RenderPass) + vkDestroyRenderPass(device, wd->RenderPass, allocator); + if (wd->Pipeline) + vkDestroyPipeline(device, wd->Pipeline, allocator); + + // If min image count was not specified, request different count of images dependent on selected present mode + if (min_image_count == 0) + min_image_count = ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(wd->PresentMode); + + // Create Swapchain + { + VkSwapchainCreateInfoKHR info = {}; + info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR; + info.surface = wd->Surface; + info.minImageCount = min_image_count; + info.imageFormat = wd->SurfaceFormat.format; + info.imageColorSpace = wd->SurfaceFormat.colorSpace; + info.imageArrayLayers = 1; + info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; + info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; // Assume that graphics family == present family + info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; + info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; + info.presentMode = wd->PresentMode; + info.clipped = VK_TRUE; + info.oldSwapchain = old_swapchain; + VkSurfaceCapabilitiesKHR cap; + err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physical_device, wd->Surface, &cap); + check_vk_result(err); + if (info.minImageCount < cap.minImageCount) + info.minImageCount = cap.minImageCount; + else if (cap.maxImageCount != 0 && info.minImageCount > cap.maxImageCount) + info.minImageCount = cap.maxImageCount; + + if (cap.currentExtent.width == 0xffffffff) + { + info.imageExtent.width = wd->Width = w; + info.imageExtent.height = wd->Height = h; + } + else + { + info.imageExtent.width = wd->Width = cap.currentExtent.width; + info.imageExtent.height = wd->Height = cap.currentExtent.height; + } + err = vkCreateSwapchainKHR(device, &info, allocator, &wd->Swapchain); + check_vk_result(err); + err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, nullptr); + check_vk_result(err); + VkImage backbuffers[16] = {}; + IM_ASSERT(wd->ImageCount >= min_image_count); + IM_ASSERT(wd->ImageCount < IM_ARRAYSIZE(backbuffers)); + err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, backbuffers); + check_vk_result(err); + + IM_ASSERT(wd->Frames == nullptr); + wd->Frames = (ImGui_ImplVulkanH_Frame*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_Frame) * wd->ImageCount); + wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->ImageCount); + memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->ImageCount); + memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->ImageCount); + for (uint32_t i = 0; i < wd->ImageCount; i++) + wd->Frames[i].Backbuffer = backbuffers[i]; + } + if (old_swapchain) + vkDestroySwapchainKHR(device, old_swapchain, allocator); + + // Create the Render Pass + { + VkAttachmentDescription attachment = {}; + attachment.format = wd->SurfaceFormat.format; + attachment.samples = VK_SAMPLE_COUNT_1_BIT; + attachment.loadOp = wd->ClearEnable ? VK_ATTACHMENT_LOAD_OP_CLEAR : VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachment.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; + attachment.finalLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR; + VkAttachmentReference color_attachment = {}; + color_attachment.attachment = 0; + color_attachment.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + VkSubpassDescription subpass = {}; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &color_attachment; + VkSubpassDependency dependency = {}; + dependency.srcSubpass = VK_SUBPASS_EXTERNAL; + dependency.dstSubpass = 0; + dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + dependency.srcAccessMask = 0; + dependency.dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + VkRenderPassCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + info.attachmentCount = 1; + info.pAttachments = &attachment; + info.subpassCount = 1; + info.pSubpasses = &subpass; + info.dependencyCount = 1; + info.pDependencies = &dependency; + err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass); + check_vk_result(err); + + // We do not create a pipeline by default as this is also used by examples' main.cpp, + // but secondary viewport in multi-viewport mode may want to create one with: + //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, bd->Subpass); + } + + // Create The Image Views + { + VkImageViewCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; + info.viewType = VK_IMAGE_VIEW_TYPE_2D; + info.format = wd->SurfaceFormat.format; + info.components.r = VK_COMPONENT_SWIZZLE_R; + info.components.g = VK_COMPONENT_SWIZZLE_G; + info.components.b = VK_COMPONENT_SWIZZLE_B; + info.components.a = VK_COMPONENT_SWIZZLE_A; + VkImageSubresourceRange image_range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 }; + info.subresourceRange = image_range; + for (uint32_t i = 0; i < wd->ImageCount; i++) + { + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; + info.image = fd->Backbuffer; + err = vkCreateImageView(device, &info, allocator, &fd->BackbufferView); + check_vk_result(err); + } + } + + // Create Framebuffer + { + VkImageView attachment[1]; + VkFramebufferCreateInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; + info.renderPass = wd->RenderPass; + info.attachmentCount = 1; + info.pAttachments = attachment; + info.width = wd->Width; + info.height = wd->Height; + info.layers = 1; + for (uint32_t i = 0; i < wd->ImageCount; i++) + { + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; + attachment[0] = fd->BackbufferView; + err = vkCreateFramebuffer(device, &info, allocator, &fd->Framebuffer); + check_vk_result(err); + } + } +} + +// Create or resize window +void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count) +{ + IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!"); + (void)instance; + ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count); + ImGui_ImplVulkanH_CreateWindowCommandBuffers(physical_device, device, wd, queue_family, allocator); +} + +void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator) +{ + vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals) + //vkQueueWaitIdle(bd->Queue); + + for (uint32_t i = 0; i < wd->ImageCount; i++) + { + ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); + ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); + } + IM_FREE(wd->Frames); + IM_FREE(wd->FrameSemaphores); + wd->Frames = nullptr; + wd->FrameSemaphores = nullptr; + vkDestroyPipeline(device, wd->Pipeline, allocator); + vkDestroyRenderPass(device, wd->RenderPass, allocator); + vkDestroySwapchainKHR(device, wd->Swapchain, allocator); + vkDestroySurfaceKHR(instance, wd->Surface, allocator); + + *wd = ImGui_ImplVulkanH_Window(); +} + +void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator) +{ + vkDestroyFence(device, fd->Fence, allocator); + vkFreeCommandBuffers(device, fd->CommandPool, 1, &fd->CommandBuffer); + vkDestroyCommandPool(device, fd->CommandPool, allocator); + fd->Fence = VK_NULL_HANDLE; + fd->CommandBuffer = VK_NULL_HANDLE; + fd->CommandPool = VK_NULL_HANDLE; + + vkDestroyImageView(device, fd->BackbufferView, allocator); + vkDestroyFramebuffer(device, fd->Framebuffer, allocator); +} + +void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator) +{ + vkDestroySemaphore(device, fsd->ImageAcquiredSemaphore, allocator); + vkDestroySemaphore(device, fsd->RenderCompleteSemaphore, allocator); + fsd->ImageAcquiredSemaphore = fsd->RenderCompleteSemaphore = VK_NULL_HANDLE; +} + +void ImGui_ImplVulkanH_DestroyFrameRenderBuffers(VkDevice device, ImGui_ImplVulkanH_FrameRenderBuffers* buffers, const VkAllocationCallbacks* allocator) +{ + if (buffers->VertexBuffer) { vkDestroyBuffer(device, buffers->VertexBuffer, allocator); buffers->VertexBuffer = VK_NULL_HANDLE; } + if (buffers->VertexBufferMemory) { vkFreeMemory(device, buffers->VertexBufferMemory, allocator); buffers->VertexBufferMemory = VK_NULL_HANDLE; } + if (buffers->IndexBuffer) { vkDestroyBuffer(device, buffers->IndexBuffer, allocator); buffers->IndexBuffer = VK_NULL_HANDLE; } + if (buffers->IndexBufferMemory) { vkFreeMemory(device, buffers->IndexBufferMemory, allocator); buffers->IndexBufferMemory = VK_NULL_HANDLE; } + buffers->VertexBufferSize = 0; + buffers->IndexBufferSize = 0; +} + +void ImGui_ImplVulkanH_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulkanH_WindowRenderBuffers* buffers, const VkAllocationCallbacks* allocator) +{ + for (uint32_t n = 0; n < buffers->Count; n++) + ImGui_ImplVulkanH_DestroyFrameRenderBuffers(device, &buffers->FrameRenderBuffers[n], allocator); + IM_FREE(buffers->FrameRenderBuffers); + buffers->FrameRenderBuffers = nullptr; + buffers->Index = 0; + buffers->Count = 0; +} diff --git a/ImGui/backends/imgui_impl_vulkan.h b/ImGui/backends/imgui_impl_vulkan.h new file mode 100644 index 0000000..64cc887 --- /dev/null +++ b/ImGui/backends/imgui_impl_vulkan.h @@ -0,0 +1,157 @@ +// dear imgui: Renderer Backend for Vulkan +// This needs to be used along with a Platform Backend (e.g. GLFW, SDL, Win32, custom..) + +// Implemented features: +// [!] Renderer: User texture binding. Use 'VkDescriptorSet' as ImTextureID. Read the FAQ about ImTextureID! See https://github.com/ocornut/imgui/pull/914 for discussions. +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// Important: on 32-bit systems, user texture binding is only supported if your imconfig file has '#define ImTextureID ImU64'. +// See imgui_impl_vulkan.cpp file for details. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// The aim of imgui_impl_vulkan.h/.cpp is to be usable in your engine without any modification. +// IF YOU FEEL YOU NEED TO MAKE ANY CHANGE TO THIS CODE, please share them and your feedback at https://github.com/ocornut/imgui/ + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +// You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +// [Configuration] in order to use a custom Vulkan function loader: +// (1) You'll need to disable default Vulkan function prototypes. +// We provide a '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' convenience configuration flag. +// In order to make sure this is visible from the imgui_impl_vulkan.cpp compilation unit: +// - Add '#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES' in your imconfig.h file +// - Or as a compilation flag in your build system +// - Or uncomment here (not recommended because you'd be modifying imgui sources!) +// - Do not simply add it in a .cpp file! +// (2) Call ImGui_ImplVulkan_LoadFunctions() before ImGui_ImplVulkan_Init() with your custom function. +// If you have no idea what this is, leave it alone! +//#define IMGUI_IMPL_VULKAN_NO_PROTOTYPES + +// Vulkan includes +#if defined(IMGUI_IMPL_VULKAN_NO_PROTOTYPES) && !defined(VK_NO_PROTOTYPES) +#define VK_NO_PROTOTYPES +#endif +#include + +// Initialization data, for ImGui_ImplVulkan_Init() +// [Please zero-clear before use!] +struct ImGui_ImplVulkan_InitInfo +{ + VkInstance Instance; + VkPhysicalDevice PhysicalDevice; + VkDevice Device; + uint32_t QueueFamily; + VkQueue Queue; + VkPipelineCache PipelineCache; + VkDescriptorPool DescriptorPool; + uint32_t Subpass; + uint32_t MinImageCount; // >= 2 + uint32_t ImageCount; // >= MinImageCount + VkSampleCountFlagBits MSAASamples; // >= VK_SAMPLE_COUNT_1_BIT (0 -> default to VK_SAMPLE_COUNT_1_BIT) + const VkAllocationCallbacks* Allocator; + void (*CheckVkResultFn)(VkResult err); +}; + +// Called by user code +IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass); +IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE); +IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer); +IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontUploadObjects(); +IMGUI_IMPL_API void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated) + +// Register a texture (VkDescriptorSet == ImTextureID) +// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem +// Please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions. +IMGUI_IMPL_API VkDescriptorSet ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout); +IMGUI_IMPL_API void ImGui_ImplVulkan_RemoveTexture(VkDescriptorSet descriptor_set); + +// Optional: load Vulkan functions with a custom function loader +// This is only useful with IMGUI_IMPL_VULKAN_NO_PROTOTYPES / VK_NO_PROTOTYPES +IMGUI_IMPL_API bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data = nullptr); + +//------------------------------------------------------------------------- +// Internal / Miscellaneous Vulkan Helpers +// (Used by example's main.cpp. Used by multi-viewport features. PROBABLY NOT used by your own engine/app.) +//------------------------------------------------------------------------- +// You probably do NOT need to use or care about those functions. +// Those functions only exist because: +// 1) they facilitate the readability and maintenance of the multiple main.cpp examples files. +// 2) the multi-viewport / platform window implementation needs them internally. +// Generally we avoid exposing any kind of superfluous high-level helpers in the bindings, +// but it is too much code to duplicate everywhere so we exceptionally expose them. +// +// Your engine/app will likely _already_ have code to setup all that stuff (swap chain, render pass, frame buffers, etc.). +// You may read this code to learn about Vulkan, but it is recommended you use you own custom tailored code to do equivalent work. +// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions) +//------------------------------------------------------------------------- + +struct ImGui_ImplVulkanH_Frame; +struct ImGui_ImplVulkanH_Window; + +// Helpers +IMGUI_IMPL_API void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wnd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count); +IMGUI_IMPL_API void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wnd, const VkAllocationCallbacks* allocator); +IMGUI_IMPL_API VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space); +IMGUI_IMPL_API VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count); +IMGUI_IMPL_API int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode); + +// Helper structure to hold the data needed by one rendering frame +// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.) +// [Please zero-clear before use!] +struct ImGui_ImplVulkanH_Frame +{ + VkCommandPool CommandPool; + VkCommandBuffer CommandBuffer; + VkFence Fence; + VkImage Backbuffer; + VkImageView BackbufferView; + VkFramebuffer Framebuffer; +}; + +struct ImGui_ImplVulkanH_FrameSemaphores +{ + VkSemaphore ImageAcquiredSemaphore; + VkSemaphore RenderCompleteSemaphore; +}; + +// Helper structure to hold the data needed by one rendering context into one OS window +// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.) +struct ImGui_ImplVulkanH_Window +{ + int Width; + int Height; + VkSwapchainKHR Swapchain; + VkSurfaceKHR Surface; + VkSurfaceFormatKHR SurfaceFormat; + VkPresentModeKHR PresentMode; + VkRenderPass RenderPass; + VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo + bool ClearEnable; + VkClearValue ClearValue; + uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount) + uint32_t ImageCount; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count) + uint32_t SemaphoreIndex; // Current set of swapchain wait semaphores we're using (needs to be distinct from per frame data) + ImGui_ImplVulkanH_Frame* Frames; + ImGui_ImplVulkanH_FrameSemaphores* FrameSemaphores; + + ImGui_ImplVulkanH_Window() + { + memset((void*)this, 0, sizeof(*this)); + PresentMode = (VkPresentModeKHR)~0; // Ensure we get an error if user doesn't set this. + ClearEnable = true; + } +}; + diff --git a/ImGui/backends/imgui_impl_wgpu.cpp b/ImGui/backends/imgui_impl_wgpu.cpp new file mode 100644 index 0000000..946b447 --- /dev/null +++ b/ImGui/backends/imgui_impl_wgpu.cpp @@ -0,0 +1,748 @@ +// dear imgui: Renderer for WebGPU +// This needs to be used along with a Platform Binding (e.g. GLFW) +// (Please note that WebGPU is currently experimental, will not run on non-beta browsers, and may break.) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-01-25: Revert automatic pipeline layout generation (see https://github.com/gpuweb/gpuweb/issues/2470) +// 2022-11-24: Fixed validation error with default depth buffer settings. +// 2022-11-10: Fixed rendering when a depth buffer is enabled. Added 'WGPUTextureFormat depth_format' parameter to ImGui_ImplWGPU_Init(). +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-11-29: Passing explicit buffer sizes to wgpuRenderPassEncoderSetVertexBuffer()/wgpuRenderPassEncoderSetIndexBuffer(). +// 2021-08-24: Fixed for latest specs. +// 2021-05-24: Add support for draw_data->FramebufferScale. +// 2021-05-19: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-05-16: Update to latest WebGPU specs (compatible with Emscripten 2.0.20 and Chrome Canary 92). +// 2021-02-18: Change blending equation to preserve alpha in output buffer. +// 2021-01-28: Initial version. + +#include "imgui.h" +#include "imgui_impl_wgpu.h" +#include +#include + +// Dear ImGui prototypes from imgui_internal.h +extern ImGuiID ImHashData(const void* data_p, size_t data_size, ImU32 seed = 0); + +// WebGPU data +static WGPUDevice g_wgpuDevice = nullptr; +static WGPUQueue g_defaultQueue = nullptr; +static WGPUTextureFormat g_renderTargetFormat = WGPUTextureFormat_Undefined; +static WGPUTextureFormat g_depthStencilFormat = WGPUTextureFormat_Undefined; +static WGPURenderPipeline g_pipelineState = nullptr; + +struct RenderResources +{ + WGPUTexture FontTexture; // Font texture + WGPUTextureView FontTextureView; // Texture view for font texture + WGPUSampler Sampler; // Sampler for the font texture + WGPUBuffer Uniforms; // Shader uniforms + WGPUBindGroup CommonBindGroup; // Resources bind-group to bind the common resources to pipeline + ImGuiStorage ImageBindGroups; // Resources bind-group to bind the font/image resources to pipeline (this is a key->value map) + WGPUBindGroup ImageBindGroup; // Default font-resource of Dear ImGui + WGPUBindGroupLayout ImageBindGroupLayout; // Cache layout used for the image bind group. Avoids allocating unnecessary JS objects when working with WebASM +}; +static RenderResources g_resources; + +struct FrameResources +{ + WGPUBuffer IndexBuffer; + WGPUBuffer VertexBuffer; + ImDrawIdx* IndexBufferHost; + ImDrawVert* VertexBufferHost; + int IndexBufferSize; + int VertexBufferSize; +}; +static FrameResources* g_pFrameResources = nullptr; +static unsigned int g_numFramesInFlight = 0; +static unsigned int g_frameIndex = UINT_MAX; + +struct Uniforms +{ + float MVP[4][4]; +}; + +//----------------------------------------------------------------------------- +// SHADERS +//----------------------------------------------------------------------------- + +// glsl_shader.vert, compiled with: +// # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert +/* +#version 450 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aUV; +layout(location = 2) in vec4 aColor; +layout(set=0, binding = 0) uniform transform { mat4 mvp; }; + +out gl_PerVertex { vec4 gl_Position; }; +layout(location = 0) out struct { vec4 Color; vec2 UV; } Out; + +void main() +{ + Out.Color = aColor; + Out.UV = aUV; + gl_Position = mvp * vec4(aPos, 0, 1); +} +*/ +static uint32_t __glsl_shader_vert_spv[] = +{ + 0x07230203,0x00010000,0x00080007,0x0000002c,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015, + 0x0000001b,0x00000023,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, + 0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43, + 0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f, + 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005, + 0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000, + 0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00050005,0x0000001d, + 0x6e617274,0x726f6673,0x0000006d,0x00040006,0x0000001d,0x00000000,0x0070766d,0x00030005, + 0x0000001f,0x00000000,0x00040005,0x00000023,0x736f5061,0x00000000,0x00040047,0x0000000b, + 0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015, + 0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047, + 0x00000019,0x00000002,0x00040048,0x0000001d,0x00000000,0x00000005,0x00050048,0x0000001d, + 0x00000000,0x00000023,0x00000000,0x00050048,0x0000001d,0x00000000,0x00000007,0x00000010, + 0x00030047,0x0000001d,0x00000002,0x00040047,0x0000001f,0x00000022,0x00000000,0x00040047, + 0x0000001f,0x00000021,0x00000000,0x00040047,0x00000023,0x0000001e,0x00000000,0x00020013, + 0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006,0x00000020,0x00040017, + 0x00000007,0x00000006,0x00000004,0x00040017,0x00000008,0x00000006,0x00000002,0x0004001e, + 0x00000009,0x00000007,0x00000008,0x00040020,0x0000000a,0x00000003,0x00000009,0x0004003b, + 0x0000000a,0x0000000b,0x00000003,0x00040015,0x0000000c,0x00000020,0x00000001,0x0004002b, + 0x0000000c,0x0000000d,0x00000000,0x00040020,0x0000000e,0x00000001,0x00000007,0x0004003b, + 0x0000000e,0x0000000f,0x00000001,0x00040020,0x00000011,0x00000003,0x00000007,0x0004002b, + 0x0000000c,0x00000013,0x00000001,0x00040020,0x00000014,0x00000001,0x00000008,0x0004003b, + 0x00000014,0x00000015,0x00000001,0x00040020,0x00000017,0x00000003,0x00000008,0x0003001e, + 0x00000019,0x00000007,0x00040020,0x0000001a,0x00000003,0x00000019,0x0004003b,0x0000001a, + 0x0000001b,0x00000003,0x00040018,0x0000001c,0x00000007,0x00000004,0x0003001e,0x0000001d, + 0x0000001c,0x00040020,0x0000001e,0x00000002,0x0000001d,0x0004003b,0x0000001e,0x0000001f, + 0x00000002,0x00040020,0x00000020,0x00000002,0x0000001c,0x0004003b,0x00000014,0x00000023, + 0x00000001,0x0004002b,0x00000006,0x00000025,0x00000000,0x0004002b,0x00000006,0x00000026, + 0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005, + 0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012,0x0000000b, + 0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016,0x00000015, + 0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018,0x00000016, + 0x00050041,0x00000020,0x00000021,0x0000001f,0x0000000d,0x0004003d,0x0000001c,0x00000022, + 0x00000021,0x0004003d,0x00000008,0x00000024,0x00000023,0x00050051,0x00000006,0x00000027, + 0x00000024,0x00000000,0x00050051,0x00000006,0x00000028,0x00000024,0x00000001,0x00070050, + 0x00000007,0x00000029,0x00000027,0x00000028,0x00000025,0x00000026,0x00050091,0x00000007, + 0x0000002a,0x00000022,0x00000029,0x00050041,0x00000011,0x0000002b,0x0000001b,0x0000000d, + 0x0003003e,0x0000002b,0x0000002a,0x000100fd,0x00010038 +}; + +// glsl_shader.frag, compiled with: +// # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag +/* +#version 450 core +layout(location = 0) out vec4 fColor; +layout(set=0, binding=1) uniform sampler s; +layout(set=1, binding=0) uniform texture2D t; +layout(location = 0) in struct { vec4 Color; vec2 UV; } In; +void main() +{ + fColor = In.Color * texture(sampler2D(t, s), In.UV.st); +} +*/ +static uint32_t __glsl_shader_frag_spv[] = +{ + 0x07230203,0x00010000,0x00080007,0x00000023,0x00000000,0x00020011,0x00000001,0x0006000b, + 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, + 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010, + 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, + 0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000, + 0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001, + 0x00005655,0x00030005,0x0000000d,0x00006e49,0x00030005,0x00000015,0x00000074,0x00030005, + 0x00000019,0x00000073,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d, + 0x0000001e,0x00000000,0x00040047,0x00000015,0x00000022,0x00000001,0x00040047,0x00000015, + 0x00000021,0x00000000,0x00040047,0x00000019,0x00000022,0x00000000,0x00040047,0x00000019, + 0x00000021,0x00000001,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016, + 0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008, + 0x00000003,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a, + 0x00000006,0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c, + 0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e, + 0x00000020,0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010, + 0x00000001,0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000, + 0x00000000,0x00000001,0x00000000,0x00040020,0x00000014,0x00000000,0x00000013,0x0004003b, + 0x00000014,0x00000015,0x00000000,0x0002001a,0x00000017,0x00040020,0x00000018,0x00000000, + 0x00000017,0x0004003b,0x00000018,0x00000019,0x00000000,0x0003001b,0x0000001b,0x00000013, + 0x0004002b,0x0000000e,0x0000001d,0x00000001,0x00040020,0x0000001e,0x00000001,0x0000000a, + 0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041, + 0x00000010,0x00000011,0x0000000d,0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011, + 0x0004003d,0x00000013,0x00000016,0x00000015,0x0004003d,0x00000017,0x0000001a,0x00000019, + 0x00050056,0x0000001b,0x0000001c,0x00000016,0x0000001a,0x00050041,0x0000001e,0x0000001f, + 0x0000000d,0x0000001d,0x0004003d,0x0000000a,0x00000020,0x0000001f,0x00050057,0x00000007, + 0x00000021,0x0000001c,0x00000020,0x00050085,0x00000007,0x00000022,0x00000012,0x00000021, + 0x0003003e,0x00000009,0x00000022,0x000100fd,0x00010038 +}; + +static void SafeRelease(ImDrawIdx*& res) +{ + if (res) + delete[] res; + res = nullptr; +} +static void SafeRelease(ImDrawVert*& res) +{ + if (res) + delete[] res; + res = nullptr; +} +static void SafeRelease(WGPUBindGroupLayout& res) +{ + if (res) + wgpuBindGroupLayoutRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUBindGroup& res) +{ + if (res) + wgpuBindGroupRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUBuffer& res) +{ + if (res) + wgpuBufferRelease(res); + res = nullptr; +} +static void SafeRelease(WGPURenderPipeline& res) +{ + if (res) + wgpuRenderPipelineRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUSampler& res) +{ + if (res) + wgpuSamplerRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUShaderModule& res) +{ + if (res) + wgpuShaderModuleRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUTextureView& res) +{ + if (res) + wgpuTextureViewRelease(res); + res = nullptr; +} +static void SafeRelease(WGPUTexture& res) +{ + if (res) + wgpuTextureRelease(res); + res = nullptr; +} + +static void SafeRelease(RenderResources& res) +{ + SafeRelease(res.FontTexture); + SafeRelease(res.FontTextureView); + SafeRelease(res.Sampler); + SafeRelease(res.Uniforms); + SafeRelease(res.CommonBindGroup); + SafeRelease(res.ImageBindGroup); + SafeRelease(res.ImageBindGroupLayout); +}; + +static void SafeRelease(FrameResources& res) +{ + SafeRelease(res.IndexBuffer); + SafeRelease(res.VertexBuffer); + SafeRelease(res.IndexBufferHost); + SafeRelease(res.VertexBufferHost); +} + +static WGPUProgrammableStageDescriptor ImGui_ImplWGPU_CreateShaderModule(uint32_t* binary_data, uint32_t binary_data_size) +{ + WGPUShaderModuleSPIRVDescriptor spirv_desc = {}; + spirv_desc.chain.sType = WGPUSType_ShaderModuleSPIRVDescriptor; + spirv_desc.codeSize = binary_data_size; + spirv_desc.code = binary_data; + + WGPUShaderModuleDescriptor desc = {}; + desc.nextInChain = reinterpret_cast(&spirv_desc); + + WGPUProgrammableStageDescriptor stage_desc = {}; + stage_desc.module = wgpuDeviceCreateShaderModule(g_wgpuDevice, &desc); + stage_desc.entryPoint = "main"; + return stage_desc; +} + +static WGPUBindGroup ImGui_ImplWGPU_CreateImageBindGroup(WGPUBindGroupLayout layout, WGPUTextureView texture) +{ + WGPUBindGroupEntry image_bg_entries[] = { { nullptr, 0, 0, 0, 0, 0, texture } }; + + WGPUBindGroupDescriptor image_bg_descriptor = {}; + image_bg_descriptor.layout = layout; + image_bg_descriptor.entryCount = sizeof(image_bg_entries) / sizeof(WGPUBindGroupEntry); + image_bg_descriptor.entries = image_bg_entries; + return wgpuDeviceCreateBindGroup(g_wgpuDevice, &image_bg_descriptor); +} + +static void ImGui_ImplWGPU_SetupRenderState(ImDrawData* draw_data, WGPURenderPassEncoder ctx, FrameResources* fr) +{ + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). + { + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + float mvp[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, + }; + wgpuQueueWriteBuffer(g_defaultQueue, g_resources.Uniforms, 0, mvp, sizeof(mvp)); + } + + // Setup viewport + wgpuRenderPassEncoderSetViewport(ctx, 0, 0, draw_data->FramebufferScale.x * draw_data->DisplaySize.x, draw_data->FramebufferScale.y * draw_data->DisplaySize.y, 0, 1); + + // Bind shader and vertex buffers + wgpuRenderPassEncoderSetVertexBuffer(ctx, 0, fr->VertexBuffer, 0, fr->VertexBufferSize * sizeof(ImDrawVert)); + wgpuRenderPassEncoderSetIndexBuffer(ctx, fr->IndexBuffer, sizeof(ImDrawIdx) == 2 ? WGPUIndexFormat_Uint16 : WGPUIndexFormat_Uint32, 0, fr->IndexBufferSize * sizeof(ImDrawIdx)); + wgpuRenderPassEncoderSetPipeline(ctx, g_pipelineState); + wgpuRenderPassEncoderSetBindGroup(ctx, 0, g_resources.CommonBindGroup, 0, nullptr); + + // Setup blend factor + WGPUColor blend_color = { 0.f, 0.f, 0.f, 0.f }; + wgpuRenderPassEncoderSetBlendConstant(ctx, &blend_color); +} + +// Render function +// (this used to be set in io.RenderDrawListsFn and called by ImGui::Render(), but you can now call this directly from your main loop) +void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder pass_encoder) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + // FIXME: Assuming that this only gets called once per frame! + // If not, we can't just re-allocate the IB or VB, we'll have to do a proper allocator. + g_frameIndex = g_frameIndex + 1; + FrameResources* fr = &g_pFrameResources[g_frameIndex % g_numFramesInFlight]; + + // Create and grow vertex/index buffers if needed + if (fr->VertexBuffer == nullptr || fr->VertexBufferSize < draw_data->TotalVtxCount) + { + if (fr->VertexBuffer) + { + wgpuBufferDestroy(fr->VertexBuffer); + wgpuBufferRelease(fr->VertexBuffer); + } + SafeRelease(fr->VertexBufferHost); + fr->VertexBufferSize = draw_data->TotalVtxCount + 5000; + + WGPUBufferDescriptor vb_desc = + { + nullptr, + "Dear ImGui Vertex buffer", + WGPUBufferUsage_CopyDst | WGPUBufferUsage_Vertex, + fr->VertexBufferSize * sizeof(ImDrawVert), + false + }; + fr->VertexBuffer = wgpuDeviceCreateBuffer(g_wgpuDevice, &vb_desc); + if (!fr->VertexBuffer) + return; + + fr->VertexBufferHost = new ImDrawVert[fr->VertexBufferSize]; + } + if (fr->IndexBuffer == nullptr || fr->IndexBufferSize < draw_data->TotalIdxCount) + { + if (fr->IndexBuffer) + { + wgpuBufferDestroy(fr->IndexBuffer); + wgpuBufferRelease(fr->IndexBuffer); + } + SafeRelease(fr->IndexBufferHost); + fr->IndexBufferSize = draw_data->TotalIdxCount + 10000; + + WGPUBufferDescriptor ib_desc = + { + nullptr, + "Dear ImGui Index buffer", + WGPUBufferUsage_CopyDst | WGPUBufferUsage_Index, + fr->IndexBufferSize * sizeof(ImDrawIdx), + false + }; + fr->IndexBuffer = wgpuDeviceCreateBuffer(g_wgpuDevice, &ib_desc); + if (!fr->IndexBuffer) + return; + + fr->IndexBufferHost = new ImDrawIdx[fr->IndexBufferSize]; + } + + // Upload vertex/index data into a single contiguous GPU buffer + ImDrawVert* vtx_dst = (ImDrawVert*)fr->VertexBufferHost; + ImDrawIdx* idx_dst = (ImDrawIdx*)fr->IndexBufferHost; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + int64_t vb_write_size = ((char*)vtx_dst - (char*)fr->VertexBufferHost + 3) & ~3; + int64_t ib_write_size = ((char*)idx_dst - (char*)fr->IndexBufferHost + 3) & ~3; + wgpuQueueWriteBuffer(g_defaultQueue, fr->VertexBuffer, 0, fr->VertexBufferHost, vb_write_size); + wgpuQueueWriteBuffer(g_defaultQueue, fr->IndexBuffer, 0, fr->IndexBufferHost, ib_write_size); + + // Setup desired render state + ImGui_ImplWGPU_SetupRenderState(draw_data, pass_encoder, fr); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_vtx_offset = 0; + int global_idx_offset = 0; + ImVec2 clip_scale = draw_data->FramebufferScale; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplWGPU_SetupRenderState(draw_data, pass_encoder, fr); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Bind custom texture + ImTextureID tex_id = pcmd->GetTexID(); + ImGuiID tex_id_hash = ImHashData(&tex_id, sizeof(tex_id)); + auto bind_group = g_resources.ImageBindGroups.GetVoidPtr(tex_id_hash); + if (bind_group) + { + wgpuRenderPassEncoderSetBindGroup(pass_encoder, 1, (WGPUBindGroup)bind_group, 0, nullptr); + } + else + { + WGPUBindGroup image_bind_group = ImGui_ImplWGPU_CreateImageBindGroup(g_resources.ImageBindGroupLayout, (WGPUTextureView)tex_id); + g_resources.ImageBindGroups.SetVoidPtr(tex_id_hash, image_bind_group); + wgpuRenderPassEncoderSetBindGroup(pass_encoder, 1, image_bind_group, 0, nullptr); + } + + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min((pcmd->ClipRect.x - clip_off.x) * clip_scale.x, (pcmd->ClipRect.y - clip_off.y) * clip_scale.y); + ImVec2 clip_max((pcmd->ClipRect.z - clip_off.x) * clip_scale.x, (pcmd->ClipRect.w - clip_off.y) * clip_scale.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle, Draw + wgpuRenderPassEncoderSetScissorRect(pass_encoder, (uint32_t)clip_min.x, (uint32_t)clip_min.y, (uint32_t)(clip_max.x - clip_min.x), (uint32_t)(clip_max.y - clip_min.y)); + wgpuRenderPassEncoderDrawIndexed(pass_encoder, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } +} + +static void ImGui_ImplWGPU_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + unsigned char* pixels; + int width, height, size_pp; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height, &size_pp); + + // Upload texture to graphics system + { + WGPUTextureDescriptor tex_desc = {}; + tex_desc.label = "Dear ImGui Font Texture"; + tex_desc.dimension = WGPUTextureDimension_2D; + tex_desc.size.width = width; + tex_desc.size.height = height; + tex_desc.size.depthOrArrayLayers = 1; + tex_desc.sampleCount = 1; + tex_desc.format = WGPUTextureFormat_RGBA8Unorm; + tex_desc.mipLevelCount = 1; + tex_desc.usage = WGPUTextureUsage_CopyDst | WGPUTextureUsage_TextureBinding; + g_resources.FontTexture = wgpuDeviceCreateTexture(g_wgpuDevice, &tex_desc); + + WGPUTextureViewDescriptor tex_view_desc = {}; + tex_view_desc.format = WGPUTextureFormat_RGBA8Unorm; + tex_view_desc.dimension = WGPUTextureViewDimension_2D; + tex_view_desc.baseMipLevel = 0; + tex_view_desc.mipLevelCount = 1; + tex_view_desc.baseArrayLayer = 0; + tex_view_desc.arrayLayerCount = 1; + tex_view_desc.aspect = WGPUTextureAspect_All; + g_resources.FontTextureView = wgpuTextureCreateView(g_resources.FontTexture, &tex_view_desc); + } + + // Upload texture data + { + WGPUImageCopyTexture dst_view = {}; + dst_view.texture = g_resources.FontTexture; + dst_view.mipLevel = 0; + dst_view.origin = { 0, 0, 0 }; + dst_view.aspect = WGPUTextureAspect_All; + WGPUTextureDataLayout layout = {}; + layout.offset = 0; + layout.bytesPerRow = width * size_pp; + layout.rowsPerImage = height; + WGPUExtent3D size = { (uint32_t)width, (uint32_t)height, 1 }; + wgpuQueueWriteTexture(g_defaultQueue, &dst_view, pixels, (uint32_t)(width * size_pp * height), &layout, &size); + } + + // Create the associated sampler + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + { + WGPUSamplerDescriptor sampler_desc = {}; + sampler_desc.minFilter = WGPUFilterMode_Linear; + sampler_desc.magFilter = WGPUFilterMode_Linear; + sampler_desc.mipmapFilter = WGPUFilterMode_Linear; + sampler_desc.addressModeU = WGPUAddressMode_Repeat; + sampler_desc.addressModeV = WGPUAddressMode_Repeat; + sampler_desc.addressModeW = WGPUAddressMode_Repeat; + sampler_desc.maxAnisotropy = 1; + g_resources.Sampler = wgpuDeviceCreateSampler(g_wgpuDevice, &sampler_desc); + } + + // Store our identifier + static_assert(sizeof(ImTextureID) >= sizeof(g_resources.FontTexture), "Can't pack descriptor handle into TexID, 32-bit not supported yet."); + io.Fonts->SetTexID((ImTextureID)g_resources.FontTextureView); +} + +static void ImGui_ImplWGPU_CreateUniformBuffer() +{ + WGPUBufferDescriptor ub_desc = + { + nullptr, + "Dear ImGui Uniform buffer", + WGPUBufferUsage_CopyDst | WGPUBufferUsage_Uniform, + sizeof(Uniforms), + false + }; + g_resources.Uniforms = wgpuDeviceCreateBuffer(g_wgpuDevice, &ub_desc); +} + +bool ImGui_ImplWGPU_CreateDeviceObjects() +{ + if (!g_wgpuDevice) + return false; + if (g_pipelineState) + ImGui_ImplWGPU_InvalidateDeviceObjects(); + + // Create render pipeline + WGPURenderPipelineDescriptor graphics_pipeline_desc = {}; + graphics_pipeline_desc.primitive.topology = WGPUPrimitiveTopology_TriangleList; + graphics_pipeline_desc.primitive.stripIndexFormat = WGPUIndexFormat_Undefined; + graphics_pipeline_desc.primitive.frontFace = WGPUFrontFace_CW; + graphics_pipeline_desc.primitive.cullMode = WGPUCullMode_None; + graphics_pipeline_desc.multisample.count = 1; + graphics_pipeline_desc.multisample.mask = UINT_MAX; + graphics_pipeline_desc.multisample.alphaToCoverageEnabled = false; + + // Bind group layouts + WGPUBindGroupLayoutEntry common_bg_layout_entries[2] = {}; + common_bg_layout_entries[0].binding = 0; + common_bg_layout_entries[0].visibility = WGPUShaderStage_Vertex; + common_bg_layout_entries[0].buffer.type = WGPUBufferBindingType_Uniform; + common_bg_layout_entries[1].binding = 1; + common_bg_layout_entries[1].visibility = WGPUShaderStage_Fragment; + common_bg_layout_entries[1].sampler.type = WGPUSamplerBindingType_Filtering; + + WGPUBindGroupLayoutEntry image_bg_layout_entries[1] = {}; + image_bg_layout_entries[0].binding = 0; + image_bg_layout_entries[0].visibility = WGPUShaderStage_Fragment; + image_bg_layout_entries[0].texture.sampleType = WGPUTextureSampleType_Float; + image_bg_layout_entries[0].texture.viewDimension = WGPUTextureViewDimension_2D; + + WGPUBindGroupLayoutDescriptor common_bg_layout_desc = {}; + common_bg_layout_desc.entryCount = 2; + common_bg_layout_desc.entries = common_bg_layout_entries; + + WGPUBindGroupLayoutDescriptor image_bg_layout_desc = {}; + image_bg_layout_desc.entryCount = 1; + image_bg_layout_desc.entries = image_bg_layout_entries; + + WGPUBindGroupLayout bg_layouts[2]; + bg_layouts[0] = wgpuDeviceCreateBindGroupLayout(g_wgpuDevice, &common_bg_layout_desc); + bg_layouts[1] = wgpuDeviceCreateBindGroupLayout(g_wgpuDevice, &image_bg_layout_desc); + + WGPUPipelineLayoutDescriptor layout_desc = {}; + layout_desc.bindGroupLayoutCount = 2; + layout_desc.bindGroupLayouts = bg_layouts; + graphics_pipeline_desc.layout = wgpuDeviceCreatePipelineLayout(g_wgpuDevice, &layout_desc); + + // Create the vertex shader + WGPUProgrammableStageDescriptor vertex_shader_desc = ImGui_ImplWGPU_CreateShaderModule(__glsl_shader_vert_spv, sizeof(__glsl_shader_vert_spv) / sizeof(uint32_t)); + graphics_pipeline_desc.vertex.module = vertex_shader_desc.module; + graphics_pipeline_desc.vertex.entryPoint = vertex_shader_desc.entryPoint; + + // Vertex input configuration + WGPUVertexAttribute attribute_desc[] = + { + { WGPUVertexFormat_Float32x2, (uint64_t)IM_OFFSETOF(ImDrawVert, pos), 0 }, + { WGPUVertexFormat_Float32x2, (uint64_t)IM_OFFSETOF(ImDrawVert, uv), 1 }, + { WGPUVertexFormat_Unorm8x4, (uint64_t)IM_OFFSETOF(ImDrawVert, col), 2 }, + }; + + WGPUVertexBufferLayout buffer_layouts[1]; + buffer_layouts[0].arrayStride = sizeof(ImDrawVert); + buffer_layouts[0].stepMode = WGPUVertexStepMode_Vertex; + buffer_layouts[0].attributeCount = 3; + buffer_layouts[0].attributes = attribute_desc; + + graphics_pipeline_desc.vertex.bufferCount = 1; + graphics_pipeline_desc.vertex.buffers = buffer_layouts; + + // Create the pixel shader + WGPUProgrammableStageDescriptor pixel_shader_desc = ImGui_ImplWGPU_CreateShaderModule(__glsl_shader_frag_spv, sizeof(__glsl_shader_frag_spv) / sizeof(uint32_t)); + + // Create the blending setup + WGPUBlendState blend_state = {}; + blend_state.alpha.operation = WGPUBlendOperation_Add; + blend_state.alpha.srcFactor = WGPUBlendFactor_One; + blend_state.alpha.dstFactor = WGPUBlendFactor_OneMinusSrcAlpha; + blend_state.color.operation = WGPUBlendOperation_Add; + blend_state.color.srcFactor = WGPUBlendFactor_SrcAlpha; + blend_state.color.dstFactor = WGPUBlendFactor_OneMinusSrcAlpha; + + WGPUColorTargetState color_state = {}; + color_state.format = g_renderTargetFormat; + color_state.blend = &blend_state; + color_state.writeMask = WGPUColorWriteMask_All; + + WGPUFragmentState fragment_state = {}; + fragment_state.module = pixel_shader_desc.module; + fragment_state.entryPoint = pixel_shader_desc.entryPoint; + fragment_state.targetCount = 1; + fragment_state.targets = &color_state; + + graphics_pipeline_desc.fragment = &fragment_state; + + // Create depth-stencil State + WGPUDepthStencilState depth_stencil_state = {}; + depth_stencil_state.format = g_depthStencilFormat; + depth_stencil_state.depthWriteEnabled = false; + depth_stencil_state.depthCompare = WGPUCompareFunction_Always; + depth_stencil_state.stencilFront.compare = WGPUCompareFunction_Always; + depth_stencil_state.stencilBack.compare = WGPUCompareFunction_Always; + + // Configure disabled depth-stencil state + graphics_pipeline_desc.depthStencil = g_depthStencilFormat == WGPUTextureFormat_Undefined ? nullptr : &depth_stencil_state; + + g_pipelineState = wgpuDeviceCreateRenderPipeline(g_wgpuDevice, &graphics_pipeline_desc); + + ImGui_ImplWGPU_CreateFontsTexture(); + ImGui_ImplWGPU_CreateUniformBuffer(); + + // Create resource bind group + WGPUBindGroupEntry common_bg_entries[] = + { + { nullptr, 0, g_resources.Uniforms, 0, sizeof(Uniforms), 0, 0 }, + { nullptr, 1, 0, 0, 0, g_resources.Sampler, 0 }, + }; + + WGPUBindGroupDescriptor common_bg_descriptor = {}; + common_bg_descriptor.layout = bg_layouts[0]; + common_bg_descriptor.entryCount = sizeof(common_bg_entries) / sizeof(WGPUBindGroupEntry); + common_bg_descriptor.entries = common_bg_entries; + g_resources.CommonBindGroup = wgpuDeviceCreateBindGroup(g_wgpuDevice, &common_bg_descriptor); + + WGPUBindGroup image_bind_group = ImGui_ImplWGPU_CreateImageBindGroup(bg_layouts[1], g_resources.FontTextureView); + g_resources.ImageBindGroup = image_bind_group; + g_resources.ImageBindGroupLayout = bg_layouts[1]; + g_resources.ImageBindGroups.SetVoidPtr(ImHashData(&g_resources.FontTextureView, sizeof(ImTextureID)), image_bind_group); + + SafeRelease(vertex_shader_desc.module); + SafeRelease(pixel_shader_desc.module); + SafeRelease(bg_layouts[0]); + + return true; +} + +void ImGui_ImplWGPU_InvalidateDeviceObjects() +{ + if (!g_wgpuDevice) + return; + + SafeRelease(g_pipelineState); + SafeRelease(g_resources); + + ImGuiIO& io = ImGui::GetIO(); + io.Fonts->SetTexID(0); // We copied g_pFontTextureView to io.Fonts->TexID so let's clear that as well. + + for (unsigned int i = 0; i < g_numFramesInFlight; i++) + SafeRelease(g_pFrameResources[i]); +} + +bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format, WGPUTextureFormat depth_format) +{ + // Setup backend capabilities flags + ImGuiIO& io = ImGui::GetIO(); + io.BackendRendererName = "imgui_impl_webgpu"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + g_wgpuDevice = device; + g_defaultQueue = wgpuDeviceGetQueue(g_wgpuDevice); + g_renderTargetFormat = rt_format; + g_depthStencilFormat = depth_format; + g_pFrameResources = new FrameResources[num_frames_in_flight]; + g_numFramesInFlight = num_frames_in_flight; + g_frameIndex = UINT_MAX; + + g_resources.FontTexture = nullptr; + g_resources.FontTextureView = nullptr; + g_resources.Sampler = nullptr; + g_resources.Uniforms = nullptr; + g_resources.CommonBindGroup = nullptr; + g_resources.ImageBindGroups.Data.reserve(100); + g_resources.ImageBindGroup = nullptr; + g_resources.ImageBindGroupLayout = nullptr; + + // Create buffers with a default size (they will later be grown as needed) + for (int i = 0; i < num_frames_in_flight; i++) + { + FrameResources* fr = &g_pFrameResources[i]; + fr->IndexBuffer = nullptr; + fr->VertexBuffer = nullptr; + fr->IndexBufferHost = nullptr; + fr->VertexBufferHost = nullptr; + fr->IndexBufferSize = 10000; + fr->VertexBufferSize = 5000; + } + + return true; +} + +void ImGui_ImplWGPU_Shutdown() +{ + ImGui_ImplWGPU_InvalidateDeviceObjects(); + delete[] g_pFrameResources; + g_pFrameResources = nullptr; + wgpuQueueRelease(g_defaultQueue); + g_wgpuDevice = nullptr; + g_numFramesInFlight = 0; + g_frameIndex = UINT_MAX; +} + +void ImGui_ImplWGPU_NewFrame() +{ + if (!g_pipelineState) + ImGui_ImplWGPU_CreateDeviceObjects(); +} diff --git a/ImGui/backends/imgui_impl_wgpu.h b/ImGui/backends/imgui_impl_wgpu.h new file mode 100644 index 0000000..0914207 --- /dev/null +++ b/ImGui/backends/imgui_impl_wgpu.h @@ -0,0 +1,25 @@ +// dear imgui: Renderer for WebGPU +// This needs to be used along with a Platform Binding (e.g. GLFW) +// (Please note that WebGPU is currently experimental, will not run on non-beta browsers, and may break.) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'WGPUTextureView' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API +#include + +IMGUI_IMPL_API bool ImGui_ImplWGPU_Init(WGPUDevice device, int num_frames_in_flight, WGPUTextureFormat rt_format, WGPUTextureFormat depth_format = WGPUTextureFormat_Undefined); +IMGUI_IMPL_API void ImGui_ImplWGPU_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplWGPU_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplWGPU_RenderDrawData(ImDrawData* draw_data, WGPURenderPassEncoder pass_encoder); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API void ImGui_ImplWGPU_InvalidateDeviceObjects(); +IMGUI_IMPL_API bool ImGui_ImplWGPU_CreateDeviceObjects(); diff --git a/ImGui/backends/imgui_impl_win32.cpp b/ImGui/backends/imgui_impl_win32.cpp new file mode 100644 index 0000000..7cc5717 --- /dev/null +++ b/ImGui/backends/imgui_impl_win32.cpp @@ -0,0 +1,826 @@ +// dear imgui: Platform Backend for Windows (standard windows API for 32-bits AND 64-bits applications) +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) + +// Implemented features: +// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui) +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_win32.h" +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include +#include // GET_X_LPARAM(), GET_Y_LPARAM() +#include +#include + +// Configuration flags to add in your imconfig.h file: +//#define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD // Disable gamepad support. This was meaningful before <1.81 but we now load XInput dynamically so the option is now less relevant. + +// Using XInput for gamepad (will load DLL dynamically) +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD +#include +typedef DWORD (WINAPI *PFN_XInputGetCapabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*); +typedef DWORD (WINAPI *PFN_XInputGetState)(DWORD, XINPUT_STATE*); +#endif + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-15: Inputs: Use WM_NCMOUSEMOVE / WM_NCMOUSELEAVE to track mouse position over non-client area (e.g. OS decorations) when app is not focused. (#6045, #6162) +// 2023-02-02: Inputs: Flipping WM_MOUSEHWHEEL (horizontal mouse-wheel) value to match other backends and offer consistent horizontal scrolling direction. (#4019, #6096, #1463) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-28: Inputs: Convert WM_CHAR values with MultiByteToWideChar() when window class was registered as MBCS (not Unicode). +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-17: Inputs: always update key mods next and before a key event (not in NewFrame) to fix input queue with very low framerates. +// 2022-01-12: Inputs: Update mouse inputs using WM_MOUSEMOVE/WM_MOUSELEAVE + fallback to provide it when focused but not hovered/captured. More standard and will allow us to pass it to future input queue API. +// 2022-01-12: Inputs: Maintain our own copy of MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-12-16: Inputs: Fill VK_LCONTROL/VK_RCONTROL/VK_LSHIFT/VK_RSHIFT/VK_LMENU/VK_RMENU for completeness. +// 2021-08-17: Calling io.AddFocusEvent() on WM_SETFOCUS/WM_KILLFOCUS messages. +// 2021-08-02: Inputs: Fixed keyboard modifiers being reported when host window doesn't have focus. +// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using TrackMouseEvent() to receive WM_MOUSELEAVE events). +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-06-08: Fixed ImGui_ImplWin32_EnableDpiAwareness() and ImGui_ImplWin32_GetDpiScaleForMonitor() to handle Windows 8.1/10 features without a manifest (per-monitor DPI, and properly calls SetProcessDpiAwareness() on 8.1). +// 2021-03-23: Inputs: Clearing keyboard down array when losing focus (WM_KILLFOCUS). +// 2021-02-18: Added ImGui_ImplWin32_EnableAlphaCompositing(). Non Visual Studio users will need to link with dwmapi.lib (MinGW/gcc: use -ldwmapi). +// 2021-02-17: Fixed ImGui_ImplWin32_EnableDpiAwareness() attempting to get SetProcessDpiAwareness from shcore.dll on Windows 8 whereas it is only supported on Windows 8.1. +// 2021-01-25: Inputs: Dynamically loading XInput DLL. +// 2020-12-04: Misc: Fixed setting of io.DisplaySize to invalid/uninitialized data when after hwnd has been closed. +// 2020-03-03: Inputs: Calling AddInputCharacterUTF16() to support surrogate pairs leading to codepoint >= 0x10000 (for more complete CJK inputs) +// 2020-02-17: Added ImGui_ImplWin32_EnableDpiAwareness(), ImGui_ImplWin32_GetDpiScaleForHwnd(), ImGui_ImplWin32_GetDpiScaleForMonitor() helper functions. +// 2020-01-14: Inputs: Added support for #define IMGUI_IMPL_WIN32_DISABLE_GAMEPAD/IMGUI_IMPL_WIN32_DISABLE_LINKING_XINPUT. +// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. +// 2019-05-11: Inputs: Don't filter value from WM_CHAR before calling AddInputCharacter(). +// 2019-01-17: Misc: Using GetForegroundWindow()+IsChild() instead of GetActiveWindow() to be compatible with windows created in a different thread or parent. +// 2019-01-17: Inputs: Added support for mouse buttons 4 and 5 via WM_XBUTTON* messages. +// 2019-01-15: Inputs: Added support for XInput gamepads (if ImGuiConfigFlags_NavEnableGamepad is set by user application). +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor. +// 2018-06-10: Inputs: Fixed handling of mouse wheel messages to support fine position messages (typically sent by track-pads). +// 2018-06-08: Misc: Extracted imgui_impl_win32.cpp/.h away from the old combined DX9/DX10/DX11/DX12 examples. +// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors and ImGuiBackendFlags_HasSetMousePos flags + honor ImGuiConfigFlags_NoMouseCursorChange flag. +// 2018-02-20: Inputs: Added support for mouse cursors (ImGui::GetMouseCursor() value and WM_SETCURSOR message handling). +// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. +// 2018-02-06: Inputs: Honoring the io.WantSetMousePos by repositioning the mouse (when using navigation and ImGuiConfigFlags_NavMoveMouse is set). +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support. +// 2018-01-08: Inputs: Added mapping for ImGuiKey_Insert. +// 2018-01-05: Inputs: Added WM_LBUTTONDBLCLK double-click handlers for window classes with the CS_DBLCLKS flag. +// 2017-10-23: Inputs: Added WM_SYSKEYDOWN / WM_SYSKEYUP handlers so e.g. the VK_MENU key can be read. +// 2017-10-23: Inputs: Using Win32 ::SetCapture/::GetCapture() to retrieve mouse positions outside the client area when dragging. +// 2016-11-12: Inputs: Only call Win32 ::SetCursor(nullptr) when io.MouseDrawCursor is set. + +struct ImGui_ImplWin32_Data +{ + HWND hWnd; + HWND MouseHwnd; + int MouseTrackedArea; // 0: not tracked, 1: client are, 2: non-client area + int MouseButtonsDown; + INT64 Time; + INT64 TicksPerSecond; + ImGuiMouseCursor LastMouseCursor; + +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + bool HasGamepad; + bool WantUpdateHasGamepad; + HMODULE XInputDLL; + PFN_XInputGetCapabilities XInputGetCapabilities; + PFN_XInputGetState XInputGetState; +#endif + + ImGui_ImplWin32_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. +static ImGui_ImplWin32_Data* ImGui_ImplWin32_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplWin32_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; +} + +// Functions +bool ImGui_ImplWin32_Init(void* hwnd) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + INT64 perf_frequency, perf_counter; + if (!::QueryPerformanceFrequency((LARGE_INTEGER*)&perf_frequency)) + return false; + if (!::QueryPerformanceCounter((LARGE_INTEGER*)&perf_counter)) + return false; + + // Setup backend capabilities flags + ImGui_ImplWin32_Data* bd = IM_NEW(ImGui_ImplWin32_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = "imgui_impl_win32"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bd->hWnd = (HWND)hwnd; + bd->TicksPerSecond = perf_frequency; + bd->Time = perf_counter; + bd->LastMouseCursor = ImGuiMouseCursor_COUNT; + + // Set platform dependent data in viewport + ImGui::GetMainViewport()->PlatformHandleRaw = (void*)hwnd; + + // Dynamically load XInput library +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + bd->WantUpdateHasGamepad = true; + const char* xinput_dll_names[] = + { + "xinput1_4.dll", // Windows 8+ + "xinput1_3.dll", // DirectX SDK + "xinput9_1_0.dll", // Windows Vista, Windows 7 + "xinput1_2.dll", // DirectX SDK + "xinput1_1.dll" // DirectX SDK + }; + for (int n = 0; n < IM_ARRAYSIZE(xinput_dll_names); n++) + if (HMODULE dll = ::LoadLibraryA(xinput_dll_names[n])) + { + bd->XInputDLL = dll; + bd->XInputGetCapabilities = (PFN_XInputGetCapabilities)::GetProcAddress(dll, "XInputGetCapabilities"); + bd->XInputGetState = (PFN_XInputGetState)::GetProcAddress(dll, "XInputGetState"); + break; + } +#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + + return true; +} + +void ImGui_ImplWin32_Shutdown() +{ + ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + // Unload XInput library +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + if (bd->XInputDLL) + ::FreeLibrary(bd->XInputDLL); +#endif // IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + IM_DELETE(bd); +} + +static bool ImGui_ImplWin32_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return false; + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (imgui_cursor == ImGuiMouseCursor_None || io.MouseDrawCursor) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + ::SetCursor(nullptr); + } + else + { + // Show OS mouse cursor + LPTSTR win32_cursor = IDC_ARROW; + switch (imgui_cursor) + { + case ImGuiMouseCursor_Arrow: win32_cursor = IDC_ARROW; break; + case ImGuiMouseCursor_TextInput: win32_cursor = IDC_IBEAM; break; + case ImGuiMouseCursor_ResizeAll: win32_cursor = IDC_SIZEALL; break; + case ImGuiMouseCursor_ResizeEW: win32_cursor = IDC_SIZEWE; break; + case ImGuiMouseCursor_ResizeNS: win32_cursor = IDC_SIZENS; break; + case ImGuiMouseCursor_ResizeNESW: win32_cursor = IDC_SIZENESW; break; + case ImGuiMouseCursor_ResizeNWSE: win32_cursor = IDC_SIZENWSE; break; + case ImGuiMouseCursor_Hand: win32_cursor = IDC_HAND; break; + case ImGuiMouseCursor_NotAllowed: win32_cursor = IDC_NO; break; + } + ::SetCursor(::LoadCursor(nullptr, win32_cursor)); + } + return true; +} + +static bool IsVkDown(int vk) +{ + return (::GetKeyState(vk) & 0x8000) != 0; +} + +static void ImGui_ImplWin32_AddKeyEvent(ImGuiKey key, bool down, int native_keycode, int native_scancode = -1) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(key, down); + io.SetKeyEventNativeData(key, native_keycode, native_scancode); // To support legacy indexing (<1.87 user code) + IM_UNUSED(native_scancode); +} + +static void ImGui_ImplWin32_ProcessKeyEventsWorkarounds() +{ + // Left & right Shift keys: when both are pressed together, Windows tend to not generate the WM_KEYUP event for the first released one. + if (ImGui::IsKeyDown(ImGuiKey_LeftShift) && !IsVkDown(VK_LSHIFT)) + ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, false, VK_LSHIFT); + if (ImGui::IsKeyDown(ImGuiKey_RightShift) && !IsVkDown(VK_RSHIFT)) + ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, false, VK_RSHIFT); + + // Sometimes WM_KEYUP for Win key is not passed down to the app (e.g. for Win+V on some setups, according to GLFW). + if (ImGui::IsKeyDown(ImGuiKey_LeftSuper) && !IsVkDown(VK_LWIN)) + ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftSuper, false, VK_LWIN); + if (ImGui::IsKeyDown(ImGuiKey_RightSuper) && !IsVkDown(VK_RWIN)) + ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightSuper, false, VK_RWIN); +} + +static void ImGui_ImplWin32_UpdateKeyModifiers() +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(ImGuiMod_Ctrl, IsVkDown(VK_CONTROL)); + io.AddKeyEvent(ImGuiMod_Shift, IsVkDown(VK_SHIFT)); + io.AddKeyEvent(ImGuiMod_Alt, IsVkDown(VK_MENU)); + io.AddKeyEvent(ImGuiMod_Super, IsVkDown(VK_APPS)); +} + +static void ImGui_ImplWin32_UpdateMouseData() +{ + ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(bd->hWnd != 0); + + HWND focused_window = ::GetForegroundWindow(); + const bool is_app_focused = (focused_window == bd->hWnd); + if (is_app_focused) + { + // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) + if (io.WantSetMousePos) + { + POINT pos = { (int)io.MousePos.x, (int)io.MousePos.y }; + if (::ClientToScreen(bd->hWnd, &pos)) + ::SetCursorPos(pos.x, pos.y); + } + + // (Optional) Fallback to provide mouse position when focused (WM_MOUSEMOVE already provides this when hovered or captured) + // This also fills a short gap when clicking non-client area: WM_NCMOUSELEAVE -> modal OS move -> gap -> WM_NCMOUSEMOVE + if (!io.WantSetMousePos && bd->MouseTrackedArea == 0) + { + POINT pos; + if (::GetCursorPos(&pos) && ::ScreenToClient(bd->hWnd, &pos)) + io.AddMousePosEvent((float)pos.x, (float)pos.y); + } + } +} + +// Gamepad navigation mapping +static void ImGui_ImplWin32_UpdateGamepads() +{ +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); + //if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + // return; + + // Calling XInputGetState() every frame on disconnected gamepads is unfortunately too slow. + // Instead we refresh gamepad availability by calling XInputGetCapabilities() _only_ after receiving WM_DEVICECHANGE. + if (bd->WantUpdateHasGamepad) + { + XINPUT_CAPABILITIES caps = {}; + bd->HasGamepad = bd->XInputGetCapabilities ? (bd->XInputGetCapabilities(0, XINPUT_FLAG_GAMEPAD, &caps) == ERROR_SUCCESS) : false; + bd->WantUpdateHasGamepad = false; + } + + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; + XINPUT_STATE xinput_state; + XINPUT_GAMEPAD& gamepad = xinput_state.Gamepad; + if (!bd->HasGamepad || bd->XInputGetState == nullptr || bd->XInputGetState(0, &xinput_state) != ERROR_SUCCESS) + return; + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + + #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) + #define MAP_BUTTON(KEY_NO, BUTTON_ENUM) { io.AddKeyEvent(KEY_NO, (gamepad.wButtons & BUTTON_ENUM) != 0); } + #define MAP_ANALOG(KEY_NO, VALUE, V0, V1) { float vn = (float)(VALUE - V0) / (float)(V1 - V0); io.AddKeyAnalogEvent(KEY_NO, vn > 0.10f, IM_SATURATE(vn)); } + MAP_BUTTON(ImGuiKey_GamepadStart, XINPUT_GAMEPAD_START); + MAP_BUTTON(ImGuiKey_GamepadBack, XINPUT_GAMEPAD_BACK); + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, XINPUT_GAMEPAD_X); + MAP_BUTTON(ImGuiKey_GamepadFaceRight, XINPUT_GAMEPAD_B); + MAP_BUTTON(ImGuiKey_GamepadFaceUp, XINPUT_GAMEPAD_Y); + MAP_BUTTON(ImGuiKey_GamepadFaceDown, XINPUT_GAMEPAD_A); + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, XINPUT_GAMEPAD_DPAD_LEFT); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, XINPUT_GAMEPAD_DPAD_RIGHT); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, XINPUT_GAMEPAD_DPAD_UP); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, XINPUT_GAMEPAD_DPAD_DOWN); + MAP_BUTTON(ImGuiKey_GamepadL1, XINPUT_GAMEPAD_LEFT_SHOULDER); + MAP_BUTTON(ImGuiKey_GamepadR1, XINPUT_GAMEPAD_RIGHT_SHOULDER); + MAP_ANALOG(ImGuiKey_GamepadL2, gamepad.bLeftTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255); + MAP_ANALOG(ImGuiKey_GamepadR2, gamepad.bRightTrigger, XINPUT_GAMEPAD_TRIGGER_THRESHOLD, 255); + MAP_BUTTON(ImGuiKey_GamepadL3, XINPUT_GAMEPAD_LEFT_THUMB); + MAP_BUTTON(ImGuiKey_GamepadR3, XINPUT_GAMEPAD_RIGHT_THUMB); + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, gamepad.sThumbLX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, gamepad.sThumbLX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, gamepad.sThumbLY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, gamepad.sThumbLY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, gamepad.sThumbRX, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, gamepad.sThumbRX, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, gamepad.sThumbRY, +XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, gamepad.sThumbRY, -XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE, -32768); + #undef MAP_BUTTON + #undef MAP_ANALOG +#endif // #ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD +} + +void ImGui_ImplWin32_NewFrame() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplWin32_Init()?"); + + // Setup display size (every frame to accommodate for window resizing) + RECT rect = { 0, 0, 0, 0 }; + ::GetClientRect(bd->hWnd, &rect); + io.DisplaySize = ImVec2((float)(rect.right - rect.left), (float)(rect.bottom - rect.top)); + + // Setup time step + INT64 current_time = 0; + ::QueryPerformanceCounter((LARGE_INTEGER*)¤t_time); + io.DeltaTime = (float)(current_time - bd->Time) / bd->TicksPerSecond; + bd->Time = current_time; + + // Update OS mouse position + ImGui_ImplWin32_UpdateMouseData(); + + // Process workarounds for known Windows key handling issues + ImGui_ImplWin32_ProcessKeyEventsWorkarounds(); + + // Update OS mouse cursor with the cursor requested by imgui + ImGuiMouseCursor mouse_cursor = io.MouseDrawCursor ? ImGuiMouseCursor_None : ImGui::GetMouseCursor(); + if (bd->LastMouseCursor != mouse_cursor) + { + bd->LastMouseCursor = mouse_cursor; + ImGui_ImplWin32_UpdateMouseCursor(); + } + + // Update game controllers (if enabled and available) + ImGui_ImplWin32_UpdateGamepads(); +} + +// There is no distinct VK_xxx for keypad enter, instead it is VK_RETURN + KF_EXTENDED, we assign it an arbitrary value to make code more readable (VK_ codes go up to 255) +#define IM_VK_KEYPAD_ENTER (VK_RETURN + 256) + +// Map VK_xxx to ImGuiKey_xxx. +static ImGuiKey ImGui_ImplWin32_VirtualKeyToImGuiKey(WPARAM wParam) +{ + switch (wParam) + { + case VK_TAB: return ImGuiKey_Tab; + case VK_LEFT: return ImGuiKey_LeftArrow; + case VK_RIGHT: return ImGuiKey_RightArrow; + case VK_UP: return ImGuiKey_UpArrow; + case VK_DOWN: return ImGuiKey_DownArrow; + case VK_PRIOR: return ImGuiKey_PageUp; + case VK_NEXT: return ImGuiKey_PageDown; + case VK_HOME: return ImGuiKey_Home; + case VK_END: return ImGuiKey_End; + case VK_INSERT: return ImGuiKey_Insert; + case VK_DELETE: return ImGuiKey_Delete; + case VK_BACK: return ImGuiKey_Backspace; + case VK_SPACE: return ImGuiKey_Space; + case VK_RETURN: return ImGuiKey_Enter; + case VK_ESCAPE: return ImGuiKey_Escape; + case VK_OEM_7: return ImGuiKey_Apostrophe; + case VK_OEM_COMMA: return ImGuiKey_Comma; + case VK_OEM_MINUS: return ImGuiKey_Minus; + case VK_OEM_PERIOD: return ImGuiKey_Period; + case VK_OEM_2: return ImGuiKey_Slash; + case VK_OEM_1: return ImGuiKey_Semicolon; + case VK_OEM_PLUS: return ImGuiKey_Equal; + case VK_OEM_4: return ImGuiKey_LeftBracket; + case VK_OEM_5: return ImGuiKey_Backslash; + case VK_OEM_6: return ImGuiKey_RightBracket; + case VK_OEM_3: return ImGuiKey_GraveAccent; + case VK_CAPITAL: return ImGuiKey_CapsLock; + case VK_SCROLL: return ImGuiKey_ScrollLock; + case VK_NUMLOCK: return ImGuiKey_NumLock; + case VK_SNAPSHOT: return ImGuiKey_PrintScreen; + case VK_PAUSE: return ImGuiKey_Pause; + case VK_NUMPAD0: return ImGuiKey_Keypad0; + case VK_NUMPAD1: return ImGuiKey_Keypad1; + case VK_NUMPAD2: return ImGuiKey_Keypad2; + case VK_NUMPAD3: return ImGuiKey_Keypad3; + case VK_NUMPAD4: return ImGuiKey_Keypad4; + case VK_NUMPAD5: return ImGuiKey_Keypad5; + case VK_NUMPAD6: return ImGuiKey_Keypad6; + case VK_NUMPAD7: return ImGuiKey_Keypad7; + case VK_NUMPAD8: return ImGuiKey_Keypad8; + case VK_NUMPAD9: return ImGuiKey_Keypad9; + case VK_DECIMAL: return ImGuiKey_KeypadDecimal; + case VK_DIVIDE: return ImGuiKey_KeypadDivide; + case VK_MULTIPLY: return ImGuiKey_KeypadMultiply; + case VK_SUBTRACT: return ImGuiKey_KeypadSubtract; + case VK_ADD: return ImGuiKey_KeypadAdd; + case IM_VK_KEYPAD_ENTER: return ImGuiKey_KeypadEnter; + case VK_LSHIFT: return ImGuiKey_LeftShift; + case VK_LCONTROL: return ImGuiKey_LeftCtrl; + case VK_LMENU: return ImGuiKey_LeftAlt; + case VK_LWIN: return ImGuiKey_LeftSuper; + case VK_RSHIFT: return ImGuiKey_RightShift; + case VK_RCONTROL: return ImGuiKey_RightCtrl; + case VK_RMENU: return ImGuiKey_RightAlt; + case VK_RWIN: return ImGuiKey_RightSuper; + case VK_APPS: return ImGuiKey_Menu; + case '0': return ImGuiKey_0; + case '1': return ImGuiKey_1; + case '2': return ImGuiKey_2; + case '3': return ImGuiKey_3; + case '4': return ImGuiKey_4; + case '5': return ImGuiKey_5; + case '6': return ImGuiKey_6; + case '7': return ImGuiKey_7; + case '8': return ImGuiKey_8; + case '9': return ImGuiKey_9; + case 'A': return ImGuiKey_A; + case 'B': return ImGuiKey_B; + case 'C': return ImGuiKey_C; + case 'D': return ImGuiKey_D; + case 'E': return ImGuiKey_E; + case 'F': return ImGuiKey_F; + case 'G': return ImGuiKey_G; + case 'H': return ImGuiKey_H; + case 'I': return ImGuiKey_I; + case 'J': return ImGuiKey_J; + case 'K': return ImGuiKey_K; + case 'L': return ImGuiKey_L; + case 'M': return ImGuiKey_M; + case 'N': return ImGuiKey_N; + case 'O': return ImGuiKey_O; + case 'P': return ImGuiKey_P; + case 'Q': return ImGuiKey_Q; + case 'R': return ImGuiKey_R; + case 'S': return ImGuiKey_S; + case 'T': return ImGuiKey_T; + case 'U': return ImGuiKey_U; + case 'V': return ImGuiKey_V; + case 'W': return ImGuiKey_W; + case 'X': return ImGuiKey_X; + case 'Y': return ImGuiKey_Y; + case 'Z': return ImGuiKey_Z; + case VK_F1: return ImGuiKey_F1; + case VK_F2: return ImGuiKey_F2; + case VK_F3: return ImGuiKey_F3; + case VK_F4: return ImGuiKey_F4; + case VK_F5: return ImGuiKey_F5; + case VK_F6: return ImGuiKey_F6; + case VK_F7: return ImGuiKey_F7; + case VK_F8: return ImGuiKey_F8; + case VK_F9: return ImGuiKey_F9; + case VK_F10: return ImGuiKey_F10; + case VK_F11: return ImGuiKey_F11; + case VK_F12: return ImGuiKey_F12; + default: return ImGuiKey_None; + } +} + +// Allow compilation with old Windows SDK. MinGW doesn't have default _WIN32_WINNT/WINVER versions. +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif +#ifndef DBT_DEVNODES_CHANGED +#define DBT_DEVNODES_CHANGED 0x0007 +#endif + +// Win32 message handler (process Win32 mouse/keyboard inputs, etc.) +// Call from your application's message handler. Keep calling your message handler unless this function returns TRUE. +// When implementing your own backend, you can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if Dear ImGui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to Dear ImGui, and hide them from your application based on those two flags. +// PS: In this Win32 handler, we use the capture API (GetCapture/SetCapture/ReleaseCapture) to be able to read mouse coordinates when dragging mouse outside of our window bounds. +// PS: We treat DBLCLK messages as regular mouse down messages, so this code will work on windows classes that have the CS_DBLCLKS flag set. Our own example app code doesn't set this flag. +#if 0 +// Copy this line into your .cpp file to forward declare the function. +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +#endif +IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui::GetCurrentContext() == nullptr) + return 0; + + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplWin32_Data* bd = ImGui_ImplWin32_GetBackendData(); + + switch (msg) + { + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + { + // We need to call TrackMouseEvent in order to receive WM_MOUSELEAVE events + const int area = (msg == WM_MOUSEMOVE) ? 1 : 2; + bd->MouseHwnd = hwnd; + if (bd->MouseTrackedArea != area) + { + TRACKMOUSEEVENT tme_cancel = { sizeof(tme_cancel), TME_CANCEL, hwnd, 0 }; + TRACKMOUSEEVENT tme_track = { sizeof(tme_track), (DWORD)((area == 2) ? (TME_LEAVE | TME_NONCLIENT) : TME_LEAVE), hwnd, 0 }; + if (bd->MouseTrackedArea != 0) + ::TrackMouseEvent(&tme_cancel); + ::TrackMouseEvent(&tme_track); + bd->MouseTrackedArea = area; + } + POINT mouse_pos = { (LONG)GET_X_LPARAM(lParam), (LONG)GET_Y_LPARAM(lParam) }; + if (msg == WM_NCMOUSEMOVE && ::ScreenToClient(hwnd, &mouse_pos) == FALSE) // WM_NCMOUSEMOVE are provided in absolute coordinates. + break; + io.AddMousePosEvent((float)mouse_pos.x, (float)mouse_pos.y); + break; + } + case WM_MOUSELEAVE: + case WM_NCMOUSELEAVE: + { + const int area = (msg == WM_MOUSELEAVE) ? 1 : 2; + if (bd->MouseTrackedArea == area) + { + if (bd->MouseHwnd == hwnd) + bd->MouseHwnd = nullptr; + bd->MouseTrackedArea = 0; + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + } + break; + } + case WM_LBUTTONDOWN: case WM_LBUTTONDBLCLK: + case WM_RBUTTONDOWN: case WM_RBUTTONDBLCLK: + case WM_MBUTTONDOWN: case WM_MBUTTONDBLCLK: + case WM_XBUTTONDOWN: case WM_XBUTTONDBLCLK: + { + int button = 0; + if (msg == WM_LBUTTONDOWN || msg == WM_LBUTTONDBLCLK) { button = 0; } + if (msg == WM_RBUTTONDOWN || msg == WM_RBUTTONDBLCLK) { button = 1; } + if (msg == WM_MBUTTONDOWN || msg == WM_MBUTTONDBLCLK) { button = 2; } + if (msg == WM_XBUTTONDOWN || msg == WM_XBUTTONDBLCLK) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + if (bd->MouseButtonsDown == 0 && ::GetCapture() == nullptr) + ::SetCapture(hwnd); + bd->MouseButtonsDown |= 1 << button; + io.AddMouseButtonEvent(button, true); + return 0; + } + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + case WM_XBUTTONUP: + { + int button = 0; + if (msg == WM_LBUTTONUP) { button = 0; } + if (msg == WM_RBUTTONUP) { button = 1; } + if (msg == WM_MBUTTONUP) { button = 2; } + if (msg == WM_XBUTTONUP) { button = (GET_XBUTTON_WPARAM(wParam) == XBUTTON1) ? 3 : 4; } + bd->MouseButtonsDown &= ~(1 << button); + if (bd->MouseButtonsDown == 0 && ::GetCapture() == hwnd) + ::ReleaseCapture(); + io.AddMouseButtonEvent(button, false); + return 0; + } + case WM_MOUSEWHEEL: + io.AddMouseWheelEvent(0.0f, (float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA); + return 0; + case WM_MOUSEHWHEEL: + io.AddMouseWheelEvent(-(float)GET_WHEEL_DELTA_WPARAM(wParam) / (float)WHEEL_DELTA, 0.0f); + return 0; + case WM_KEYDOWN: + case WM_KEYUP: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + { + const bool is_key_down = (msg == WM_KEYDOWN || msg == WM_SYSKEYDOWN); + if (wParam < 256) + { + // Submit modifiers + ImGui_ImplWin32_UpdateKeyModifiers(); + + // Obtain virtual key code + // (keypad enter doesn't have its own... VK_RETURN with KF_EXTENDED flag means keypad enter, see IM_VK_KEYPAD_ENTER definition for details, it is mapped to ImGuiKey_KeyPadEnter.) + int vk = (int)wParam; + if ((wParam == VK_RETURN) && (HIWORD(lParam) & KF_EXTENDED)) + vk = IM_VK_KEYPAD_ENTER; + + // Submit key event + const ImGuiKey key = ImGui_ImplWin32_VirtualKeyToImGuiKey(vk); + const int scancode = (int)LOBYTE(HIWORD(lParam)); + if (key != ImGuiKey_None) + ImGui_ImplWin32_AddKeyEvent(key, is_key_down, vk, scancode); + + // Submit individual left/right modifier events + if (vk == VK_SHIFT) + { + // Important: Shift keys tend to get stuck when pressed together, missing key-up events are corrected in ImGui_ImplWin32_ProcessKeyEventsWorkarounds() + if (IsVkDown(VK_LSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftShift, is_key_down, VK_LSHIFT, scancode); } + if (IsVkDown(VK_RSHIFT) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightShift, is_key_down, VK_RSHIFT, scancode); } + } + else if (vk == VK_CONTROL) + { + if (IsVkDown(VK_LCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftCtrl, is_key_down, VK_LCONTROL, scancode); } + if (IsVkDown(VK_RCONTROL) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightCtrl, is_key_down, VK_RCONTROL, scancode); } + } + else if (vk == VK_MENU) + { + if (IsVkDown(VK_LMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_LeftAlt, is_key_down, VK_LMENU, scancode); } + if (IsVkDown(VK_RMENU) == is_key_down) { ImGui_ImplWin32_AddKeyEvent(ImGuiKey_RightAlt, is_key_down, VK_RMENU, scancode); } + } + } + return 0; + } + case WM_SETFOCUS: + case WM_KILLFOCUS: + io.AddFocusEvent(msg == WM_SETFOCUS); + return 0; + case WM_CHAR: + if (::IsWindowUnicode(hwnd)) + { + // You can also use ToAscii()+GetKeyboardState() to retrieve characters. + if (wParam > 0 && wParam < 0x10000) + io.AddInputCharacterUTF16((unsigned short)wParam); + } + else + { + wchar_t wch = 0; + ::MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (char*)&wParam, 1, &wch, 1); + io.AddInputCharacter(wch); + } + return 0; + case WM_SETCURSOR: + // This is required to restore cursor when transitioning from e.g resize borders to client area. + if (LOWORD(lParam) == HTCLIENT && ImGui_ImplWin32_UpdateMouseCursor()) + return 1; + return 0; + case WM_DEVICECHANGE: +#ifndef IMGUI_IMPL_WIN32_DISABLE_GAMEPAD + if ((UINT)wParam == DBT_DEVNODES_CHANGED) + bd->WantUpdateHasGamepad = true; +#endif + return 0; + } + return 0; +} + + +//-------------------------------------------------------------------------------------------------------- +// DPI-related helpers (optional) +//-------------------------------------------------------------------------------------------------------- +// - Use to enable DPI awareness without having to create an application manifest. +// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps. +// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc. +// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime, +// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies. +//--------------------------------------------------------------------------------------------------------- +// This is the scheme successfully used by GLFW (from which we borrowed some of the code) and other apps aiming to be highly portable. +// ImGui_ImplWin32_EnableDpiAwareness() is just a helper called by main.cpp, we don't call it automatically. +// If you are trying to implement your own backend for your own engine, you may ignore that noise. +//--------------------------------------------------------------------------------------------------------- + +// Perform our own check with RtlVerifyVersionInfo() instead of using functions from as they +// require a manifest to be functional for checks above 8.1. See https://github.com/ocornut/imgui/issues/4200 +static BOOL _IsWindowsVersionOrGreater(WORD major, WORD minor, WORD) +{ + typedef LONG(WINAPI* PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*, ULONG, ULONGLONG); + static PFN_RtlVerifyVersionInfo RtlVerifyVersionInfoFn = nullptr; + if (RtlVerifyVersionInfoFn == nullptr) + if (HMODULE ntdllModule = ::GetModuleHandleA("ntdll.dll")) + RtlVerifyVersionInfoFn = (PFN_RtlVerifyVersionInfo)GetProcAddress(ntdllModule, "RtlVerifyVersionInfo"); + if (RtlVerifyVersionInfoFn == nullptr) + return FALSE; + + RTL_OSVERSIONINFOEXW versionInfo = { }; + ULONGLONG conditionMask = 0; + versionInfo.dwOSVersionInfoSize = sizeof(RTL_OSVERSIONINFOEXW); + versionInfo.dwMajorVersion = major; + versionInfo.dwMinorVersion = minor; + VER_SET_CONDITION(conditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL); + VER_SET_CONDITION(conditionMask, VER_MINORVERSION, VER_GREATER_EQUAL); + return (RtlVerifyVersionInfoFn(&versionInfo, VER_MAJORVERSION | VER_MINORVERSION, conditionMask) == 0) ? TRUE : FALSE; +} + +#define _IsWindowsVistaOrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0600), LOBYTE(0x0600), 0) // _WIN32_WINNT_VISTA +#define _IsWindows8OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0602), LOBYTE(0x0602), 0) // _WIN32_WINNT_WIN8 +#define _IsWindows8Point1OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0603), LOBYTE(0x0603), 0) // _WIN32_WINNT_WINBLUE +#define _IsWindows10OrGreater() _IsWindowsVersionOrGreater(HIBYTE(0x0A00), LOBYTE(0x0A00), 0) // _WIN32_WINNT_WINTHRESHOLD / _WIN32_WINNT_WIN10 + +#ifndef DPI_ENUMS_DECLARED +typedef enum { PROCESS_DPI_UNAWARE = 0, PROCESS_SYSTEM_DPI_AWARE = 1, PROCESS_PER_MONITOR_DPI_AWARE = 2 } PROCESS_DPI_AWARENESS; +typedef enum { MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, MDT_RAW_DPI = 2, MDT_DEFAULT = MDT_EFFECTIVE_DPI } MONITOR_DPI_TYPE; +#endif +#ifndef _DPI_AWARENESS_CONTEXTS_ +DECLARE_HANDLE(DPI_AWARENESS_CONTEXT); +#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE (DPI_AWARENESS_CONTEXT)-3 +#endif +#ifndef DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 +#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (DPI_AWARENESS_CONTEXT)-4 +#endif +typedef HRESULT(WINAPI* PFN_SetProcessDpiAwareness)(PROCESS_DPI_AWARENESS); // Shcore.lib + dll, Windows 8.1+ +typedef HRESULT(WINAPI* PFN_GetDpiForMonitor)(HMONITOR, MONITOR_DPI_TYPE, UINT*, UINT*); // Shcore.lib + dll, Windows 8.1+ +typedef DPI_AWARENESS_CONTEXT(WINAPI* PFN_SetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT); // User32.lib + dll, Windows 10 v1607+ (Creators Update) + +// Helper function to enable DPI awareness without setting up a manifest +void ImGui_ImplWin32_EnableDpiAwareness() +{ + if (_IsWindows10OrGreater()) + { + static HINSTANCE user32_dll = ::LoadLibraryA("user32.dll"); // Reference counted per-process + if (PFN_SetThreadDpiAwarenessContext SetThreadDpiAwarenessContextFn = (PFN_SetThreadDpiAwarenessContext)::GetProcAddress(user32_dll, "SetThreadDpiAwarenessContext")) + { + SetThreadDpiAwarenessContextFn(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); + return; + } + } + if (_IsWindows8Point1OrGreater()) + { + static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process + if (PFN_SetProcessDpiAwareness SetProcessDpiAwarenessFn = (PFN_SetProcessDpiAwareness)::GetProcAddress(shcore_dll, "SetProcessDpiAwareness")) + { + SetProcessDpiAwarenessFn(PROCESS_PER_MONITOR_DPI_AWARE); + return; + } + } +#if _WIN32_WINNT >= 0x0600 + ::SetProcessDPIAware(); +#endif +} + +#if defined(_MSC_VER) && !defined(NOGDI) +#pragma comment(lib, "gdi32") // Link with gdi32.lib for GetDeviceCaps(). MinGW will require linking with '-lgdi32' +#endif + +float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor) +{ + UINT xdpi = 96, ydpi = 96; + if (_IsWindows8Point1OrGreater()) + { + static HINSTANCE shcore_dll = ::LoadLibraryA("shcore.dll"); // Reference counted per-process + static PFN_GetDpiForMonitor GetDpiForMonitorFn = nullptr; + if (GetDpiForMonitorFn == nullptr && shcore_dll != nullptr) + GetDpiForMonitorFn = (PFN_GetDpiForMonitor)::GetProcAddress(shcore_dll, "GetDpiForMonitor"); + if (GetDpiForMonitorFn != nullptr) + { + GetDpiForMonitorFn((HMONITOR)monitor, MDT_EFFECTIVE_DPI, &xdpi, &ydpi); + IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert! + return xdpi / 96.0f; + } + } +#ifndef NOGDI + const HDC dc = ::GetDC(nullptr); + xdpi = ::GetDeviceCaps(dc, LOGPIXELSX); + ydpi = ::GetDeviceCaps(dc, LOGPIXELSY); + IM_ASSERT(xdpi == ydpi); // Please contact me if you hit this assert! + ::ReleaseDC(nullptr, dc); +#endif + return xdpi / 96.0f; +} + +float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd) +{ + HMONITOR monitor = ::MonitorFromWindow((HWND)hwnd, MONITOR_DEFAULTTONEAREST); + return ImGui_ImplWin32_GetDpiScaleForMonitor(monitor); +} + +//--------------------------------------------------------------------------------------------------------- +// Transparency related helpers (optional) +//-------------------------------------------------------------------------------------------------------- + +#if defined(_MSC_VER) +#pragma comment(lib, "dwmapi") // Link with dwmapi.lib. MinGW will require linking with '-ldwmapi' +#endif + +// [experimental] +// Borrowed from GLFW's function updateFramebufferTransparency() in src/win32_window.c +// (the Dwm* functions are Vista era functions but we are borrowing logic from GLFW) +void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd) +{ + if (!_IsWindowsVistaOrGreater()) + return; + + BOOL composition; + if (FAILED(::DwmIsCompositionEnabled(&composition)) || !composition) + return; + + BOOL opaque; + DWORD color; + if (_IsWindows8OrGreater() || (SUCCEEDED(::DwmGetColorizationColor(&color, &opaque)) && !opaque)) + { + HRGN region = ::CreateRectRgn(0, 0, -1, -1); + DWM_BLURBEHIND bb = {}; + bb.dwFlags = DWM_BB_ENABLE | DWM_BB_BLURREGION; + bb.hRgnBlur = region; + bb.fEnable = TRUE; + ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb); + ::DeleteObject(region); + } + else + { + DWM_BLURBEHIND bb = {}; + bb.dwFlags = DWM_BB_ENABLE; + ::DwmEnableBlurBehindWindow((HWND)hwnd, &bb); + } +} + +//--------------------------------------------------------------------------------------------------------- diff --git a/ImGui/backends/imgui_impl_win32.h b/ImGui/backends/imgui_impl_win32.h new file mode 100644 index 0000000..b74b438 --- /dev/null +++ b/ImGui/backends/imgui_impl_win32.h @@ -0,0 +1,44 @@ +// dear imgui: Platform Backend for Windows (standard windows API for 32-bits AND 64-bits applications) +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) + +// Implemented features: +// [X] Platform: Clipboard support (for Win32 this is actually part of core dear imgui) +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy VK_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +IMGUI_IMPL_API bool ImGui_ImplWin32_Init(void* hwnd); +IMGUI_IMPL_API void ImGui_ImplWin32_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplWin32_NewFrame(); + +// Win32 message handler your application need to call. +// - Intentionally commented out in a '#if 0' block to avoid dragging dependencies on from this helper. +// - You should COPY the line below into your .cpp code to forward declare the function and then you can call it. +// - Call from your application's message handler. Keep calling your message handler unless this function returns TRUE. + +#if 0 +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); +#endif + +// DPI-related helpers (optional) +// - Use to enable DPI awareness without having to create an application manifest. +// - Your own app may already do this via a manifest or explicit calls. This is mostly useful for our examples/ apps. +// - In theory we could call simple functions from Windows SDK such as SetProcessDPIAware(), SetProcessDpiAwareness(), etc. +// but most of the functions provided by Microsoft require Windows 8.1/10+ SDK at compile time and Windows 8/10+ at runtime, +// neither we want to require the user to have. So we dynamically select and load those functions to avoid dependencies. +IMGUI_IMPL_API void ImGui_ImplWin32_EnableDpiAwareness(); +IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForHwnd(void* hwnd); // HWND hwnd +IMGUI_IMPL_API float ImGui_ImplWin32_GetDpiScaleForMonitor(void* monitor); // HMONITOR monitor + +// Transparency related helpers (optional) [experimental] +// - Use to enable alpha compositing transparency with the desktop. +// - Use together with e.g. clearing your framebuffer with zero-alpha. +IMGUI_IMPL_API void ImGui_ImplWin32_EnableAlphaCompositing(void* hwnd); // HWND hwnd diff --git a/ImGui/backends/vulkan/generate_spv.sh b/ImGui/backends/vulkan/generate_spv.sh new file mode 100644 index 0000000..948ef77 --- /dev/null +++ b/ImGui/backends/vulkan/generate_spv.sh @@ -0,0 +1,6 @@ +#!/bin/bash +## -V: create SPIR-V binary +## -x: save binary output as text-based 32-bit hexadecimal numbers +## -o: output file +glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag +glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert diff --git a/ImGui/backends/vulkan/glsl_shader.frag b/ImGui/backends/vulkan/glsl_shader.frag new file mode 100644 index 0000000..ce7e6f7 --- /dev/null +++ b/ImGui/backends/vulkan/glsl_shader.frag @@ -0,0 +1,14 @@ +#version 450 core +layout(location = 0) out vec4 fColor; + +layout(set=0, binding=0) uniform sampler2D sTexture; + +layout(location = 0) in struct { + vec4 Color; + vec2 UV; +} In; + +void main() +{ + fColor = In.Color * texture(sTexture, In.UV.st); +} diff --git a/ImGui/backends/vulkan/glsl_shader.vert b/ImGui/backends/vulkan/glsl_shader.vert new file mode 100644 index 0000000..9425365 --- /dev/null +++ b/ImGui/backends/vulkan/glsl_shader.vert @@ -0,0 +1,25 @@ +#version 450 core +layout(location = 0) in vec2 aPos; +layout(location = 1) in vec2 aUV; +layout(location = 2) in vec4 aColor; + +layout(push_constant) uniform uPushConstant { + vec2 uScale; + vec2 uTranslate; +} pc; + +out gl_PerVertex { + vec4 gl_Position; +}; + +layout(location = 0) out struct { + vec4 Color; + vec2 UV; +} Out; + +void main() +{ + Out.Color = aColor; + Out.UV = aUV; + gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1); +} diff --git a/ImGui/examples/README.txt b/ImGui/examples/README.txt new file mode 100644 index 0000000..6db2f3c --- /dev/null +++ b/ImGui/examples/README.txt @@ -0,0 +1,9 @@ +See BACKENDS and EXAMPLES files in the docs/ folder, or on the web at: https://github.com/ocornut/imgui/tree/master/docs + +Backends = Helper code to facilitate integration with platforms/graphics api (used by Examples + should be used by your app). +Examples = Standalone applications showcasing integration with platforms/graphics api. + +Some Examples have extra README files in their respective directory, please check them too! + +Once Dear ImGui is running (in either examples or your own application/game/engine), +run and refer to ImGui::ShowDemoWindow() in imgui_demo.cpp for the end-user API. diff --git a/ImGui/examples/example_allegro5/README.md b/ImGui/examples/example_allegro5/README.md new file mode 100644 index 0000000..c86179c --- /dev/null +++ b/ImGui/examples/example_allegro5/README.md @@ -0,0 +1,36 @@ + +# Configuration + +Dear ImGui outputs 16-bit vertex indices by default. +Allegro doesn't support them natively, so we have two solutions: convert the indices manually in imgui_impl_allegro5.cpp, or compile dear imgui with 32-bit indices. +You can either modify imconfig.h that comes with Dear ImGui (easier), or set a C++ preprocessor option IMGUI_USER_CONFIG to find to a filename. +We are providing `imconfig_allegro5.h` that enables 32-bit indices. +Note that the backend supports _BOTH_ 16-bit and 32-bit indices, but 32-bit indices will be slightly faster as they won't require a manual conversion. + +# How to Build + +### On Ubuntu 14.04+ and macOS + +```bash +g++ -DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_allegro5.cpp ../../imgui*.cpp -lallegro -lallegro_main -lallegro_primitives -o allegro5_example +``` + +On macOS, install Allegro with homebrew: `brew install allegro`. + +### On Windows with Visual Studio's CLI + +You may install Allegro using vcpkg: +``` +git clone https://github.com/Microsoft/vcpkg +cd vcpkg +bootstrap-vcpkg.bat +vcpkg install allegro5 --triplet=x86-windows ; for win32 +vcpkg install allegro5 --triplet=x64-windows ; for win64 +vcpkg integrate install ; register include / libs in Visual Studio +``` + +Build: +``` +set ALLEGRODIR=path_to_your_allegro5_folder +cl /Zi /MD /I %ALLEGRODIR%\include /DIMGUI_USER_CONFIG=\"examples/example_allegro5/imconfig_allegro5.h\" /I .. /I ..\.. /I ..\..\backends main.cpp ..\..\backends\imgui_impl_allegro5.cpp ..\..\imgui*.cpp /link /LIBPATH:%ALLEGRODIR%\lib allegro-5.0.10-monolith-md.lib user32.lib +``` diff --git a/ImGui/examples/example_allegro5/example_allegro5.vcxproj b/ImGui/examples/example_allegro5/example_allegro5.vcxproj new file mode 100644 index 0000000..69b0ece --- /dev/null +++ b/ImGui/examples/example_allegro5/example_allegro5.vcxproj @@ -0,0 +1,180 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {73F235B5-7D31-4FC6-8682-DDC5A097B9C1} + example_allegro5 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + + + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + + + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + false + + + true + true + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + false + + + true + true + true + %(AdditionalLibraryDirectories) + opengl32.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_allegro5/example_allegro5.vcxproj.filters b/ImGui/examples/example_allegro5/example_allegro5.vcxproj.filters new file mode 100644 index 0000000..7fea78b --- /dev/null +++ b/ImGui/examples/example_allegro5/example_allegro5.vcxproj.filters @@ -0,0 +1,58 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + + + + sources + + + diff --git a/ImGui/examples/example_allegro5/imconfig_allegro5.h b/ImGui/examples/example_allegro5/imconfig_allegro5.h new file mode 100644 index 0000000..35afa67 --- /dev/null +++ b/ImGui/examples/example_allegro5/imconfig_allegro5.h @@ -0,0 +1,11 @@ +//----------------------------------------------------------------------------- +// COMPILE-TIME OPTIONS FOR DEAR IMGUI ALLEGRO 5 EXAMPLE +// See imconfig.h for the full template +// Because Allegro doesn't support 16-bit vertex indices, we enable the compile-time option of imgui to use 32-bit indices +//----------------------------------------------------------------------------- + +#pragma once + +// Use 32-bit vertex indices because Allegro doesn't support 16-bit ones +// This allows us to avoid converting vertices format at runtime +#define ImDrawIdx int diff --git a/ImGui/examples/example_allegro5/main.cpp b/ImGui/examples/example_allegro5/main.cpp new file mode 100644 index 0000000..be27e6b --- /dev/null +++ b/ImGui/examples/example_allegro5/main.cpp @@ -0,0 +1,145 @@ +// Dear ImGui: standalone example application for Allegro 5 +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// On Windows, you can install Allegro5 using vcpkg: +// git clone https://github.com/Microsoft/vcpkg +// cd vcpkg +// bootstrap - vcpkg.bat +// vcpkg install allegro5 --triplet=x86-windows ; for win32 +// vcpkg install allegro5 --triplet=x64-windows ; for win64 +// vcpkg integrate install ; register include and libs in Visual Studio + +#include +#include +#include +#include "imgui.h" +#include "imgui_impl_allegro5.h" + +int main(int, char**) +{ + // Setup Allegro + al_init(); + al_install_keyboard(); + al_install_mouse(); + al_init_primitives_addon(); + al_set_new_display_flags(ALLEGRO_RESIZABLE); + ALLEGRO_DISPLAY* display = al_create_display(1280, 720); + al_set_window_title(display, "Dear ImGui Allegro 5 example"); + ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue(); + al_register_event_source(queue, al_get_display_event_source(display)); + al_register_event_source(queue, al_get_keyboard_event_source()); + al_register_event_source(queue, al_get_mouse_event_source()); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplAllegro5_Init(display); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool running = true; + while (running) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + ALLEGRO_EVENT ev; + while (al_get_next_event(queue, &ev)) + { + ImGui_ImplAllegro5_ProcessEvent(&ev); + if (ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) + running = false; + if (ev.type == ALLEGRO_EVENT_DISPLAY_RESIZE) + { + ImGui_ImplAllegro5_InvalidateDeviceObjects(); + al_acknowledge_resize(display); + ImGui_ImplAllegro5_CreateDeviceObjects(); + } + } + + // Start the Dear ImGui frame + ImGui_ImplAllegro5_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + al_clear_to_color(al_map_rgba_f(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w)); + ImGui_ImplAllegro5_RenderDrawData(ImGui::GetDrawData()); + al_flip_display(); + } + + // Cleanup + ImGui_ImplAllegro5_Shutdown(); + ImGui::DestroyContext(); + al_destroy_event_queue(queue); + al_destroy_display(display); + + return 0; +} diff --git a/ImGui/examples/example_android_opengl3/CMakeLists.txt b/ImGui/examples/example_android_opengl3/CMakeLists.txt new file mode 100644 index 0000000..63531f4 --- /dev/null +++ b/ImGui/examples/example_android_opengl3/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.6) + +project(ImGuiExample) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +add_library(${CMAKE_PROJECT_NAME} SHARED + ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_demo.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_draw.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_tables.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../imgui_widgets.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_android.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/../../backends/imgui_impl_opengl3.cpp + ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c +) + +set(CMAKE_SHARED_LINKER_FLAGS + "${CMAKE_SHARED_LINKER_FLAGS} -u ANativeActivity_onCreate" +) + +target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE + IMGUI_IMPL_OPENGL_ES3 +) + +target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/../.. + ${CMAKE_CURRENT_SOURCE_DIR}/../../backends + ${ANDROID_NDK}/sources/android/native_app_glue +) + +target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE + android + EGL + GLESv3 + log +) diff --git a/ImGui/examples/example_android_opengl3/android/.gitignore b/ImGui/examples/example_android_opengl3/android/.gitignore new file mode 100644 index 0000000..3c7a619 --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/.gitignore @@ -0,0 +1,12 @@ +.cxx +.externalNativeBuild +build/ +*.iml + +.idea +.gradle +local.properties + +# Android Studio puts a Gradle wrapper here, that we don't want: +gradle/ +gradlew* diff --git a/ImGui/examples/example_android_opengl3/android/app/build.gradle b/ImGui/examples/example_android_opengl3/android/app/build.gradle new file mode 100644 index 0000000..53181ba --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/app/build.gradle @@ -0,0 +1,46 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +android { + compileSdkVersion 33 + buildToolsVersion "33.0.2" + ndkVersion "25.2.9519653" + + defaultConfig { + applicationId "imgui.example.android" + namespace "imgui.example.android" + minSdkVersion 24 + targetSdkVersion 33 + versionCode 1 + versionName "1.0" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt') + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget="11" + } + + externalNativeBuild { + cmake { + path "../../CMakeLists.txt" + version '3.22.1' + } + } +} +repositories { + mavenCentral() +} +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/ImGui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml b/ImGui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..a87b95b --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt b/ImGui/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt new file mode 100644 index 0000000..896a88c --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/app/src/main/java/MainActivity.kt @@ -0,0 +1,40 @@ +package imgui.example.android + +import android.app.NativeActivity +import android.os.Bundle +import android.content.Context +import android.view.inputmethod.InputMethodManager +import android.view.KeyEvent +import java.util.concurrent.LinkedBlockingQueue + +class MainActivity : NativeActivity() { + public override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + } + + fun showSoftInput() { + val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.showSoftInput(this.window.decorView, 0) + } + + fun hideSoftInput() { + val inputMethodManager = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + inputMethodManager.hideSoftInputFromWindow(this.window.decorView.windowToken, 0) + } + + // Queue for the Unicode characters to be polled from native code (via pollUnicodeChar()) + private var unicodeCharacterQueue: LinkedBlockingQueue = LinkedBlockingQueue() + + // We assume dispatchKeyEvent() of the NativeActivity is actually called for every + // KeyEvent and not consumed by any View before it reaches here + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + if (event.action == KeyEvent.ACTION_DOWN) { + unicodeCharacterQueue.offer(event.getUnicodeChar(event.metaState)) + } + return super.dispatchKeyEvent(event) + } + + fun pollUnicodeChar(): Int { + return unicodeCharacterQueue.poll() ?: 0 + } +} diff --git a/ImGui/examples/example_android_opengl3/android/build.gradle b/ImGui/examples/example_android_opengl3/android/build.gradle new file mode 100644 index 0000000..ccd2185 --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/build.gradle @@ -0,0 +1,24 @@ +buildscript { + ext.kotlin_version = '1.8.0' + repositories { + google() + mavenCentral() + + } + dependencies { + classpath 'com.android.tools.build:gradle:7.4.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/ImGui/examples/example_android_opengl3/android/settings.gradle b/ImGui/examples/example_android_opengl3/android/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/ImGui/examples/example_android_opengl3/android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/ImGui/examples/example_android_opengl3/main.cpp b/ImGui/examples/example_android_opengl3/main.cpp new file mode 100644 index 0000000..c801999 --- /dev/null +++ b/ImGui/examples/example_android_opengl3/main.cpp @@ -0,0 +1,378 @@ +// dear imgui: standalone example application for Android + OpenGL ES 3 +// If you are new to dear imgui, see examples/README.txt and documentation at the top of imgui.cpp. + +#include "imgui.h" +#include "imgui_impl_android.h" +#include "imgui_impl_opengl3.h" +#include +#include +#include +#include +#include +#include + +// Data +static EGLDisplay g_EglDisplay = EGL_NO_DISPLAY; +static EGLSurface g_EglSurface = EGL_NO_SURFACE; +static EGLContext g_EglContext = EGL_NO_CONTEXT; +static struct android_app* g_App = NULL; +static bool g_Initialized = false; +static char g_LogTag[] = "ImGuiExample"; +static std::string g_IniFilename = ""; + +// Forward declarations of helper functions +static void Init(struct android_app* app); +static void Shutdown(); +static void MainLoopStep(); +static int ShowSoftKeyboardInput(); +static int PollUnicodeChars(); +static int GetAssetData(const char* filename, void** out_data); + +// Main code +static void handleAppCmd(struct android_app* app, int32_t appCmd) +{ + switch (appCmd) + { + case APP_CMD_SAVE_STATE: + break; + case APP_CMD_INIT_WINDOW: + Init(app); + break; + case APP_CMD_TERM_WINDOW: + Shutdown(); + break; + case APP_CMD_GAINED_FOCUS: + case APP_CMD_LOST_FOCUS: + break; + } +} + +static int32_t handleInputEvent(struct android_app* app, AInputEvent* inputEvent) +{ + return ImGui_ImplAndroid_HandleInputEvent(inputEvent); +} + +void android_main(struct android_app* app) +{ + app->onAppCmd = handleAppCmd; + app->onInputEvent = handleInputEvent; + + while (true) + { + int out_events; + struct android_poll_source* out_data; + + // Poll all events. If the app is not visible, this loop blocks until g_Initialized == true. + while (ALooper_pollAll(g_Initialized ? 0 : -1, NULL, &out_events, (void**)&out_data) >= 0) + { + // Process one event + if (out_data != NULL) + out_data->process(app, out_data); + + // Exit the app by returning from within the infinite loop + if (app->destroyRequested != 0) + { + // shutdown() should have been called already while processing the + // app command APP_CMD_TERM_WINDOW. But we play save here + if (!g_Initialized) + Shutdown(); + + return; + } + } + + // Initiate a new frame + MainLoopStep(); + } +} + +void Init(struct android_app* app) +{ + if (g_Initialized) + return; + + g_App = app; + ANativeWindow_acquire(g_App->window); + + // Initialize EGL + // This is mostly boilerplate code for EGL... + { + g_EglDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (g_EglDisplay == EGL_NO_DISPLAY) + __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglGetDisplay(EGL_DEFAULT_DISPLAY) returned EGL_NO_DISPLAY"); + + if (eglInitialize(g_EglDisplay, 0, 0) != EGL_TRUE) + __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglInitialize() returned with an error"); + + const EGLint egl_attributes[] = { EGL_BLUE_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_RED_SIZE, 8, EGL_DEPTH_SIZE, 24, EGL_SURFACE_TYPE, EGL_WINDOW_BIT, EGL_NONE }; + EGLint num_configs = 0; + if (eglChooseConfig(g_EglDisplay, egl_attributes, nullptr, 0, &num_configs) != EGL_TRUE) + __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned with an error"); + if (num_configs == 0) + __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglChooseConfig() returned 0 matching config"); + + // Get the first matching config + EGLConfig egl_config; + eglChooseConfig(g_EglDisplay, egl_attributes, &egl_config, 1, &num_configs); + EGLint egl_format; + eglGetConfigAttrib(g_EglDisplay, egl_config, EGL_NATIVE_VISUAL_ID, &egl_format); + ANativeWindow_setBuffersGeometry(g_App->window, 0, 0, egl_format); + + const EGLint egl_context_attributes[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE }; + g_EglContext = eglCreateContext(g_EglDisplay, egl_config, EGL_NO_CONTEXT, egl_context_attributes); + + if (g_EglContext == EGL_NO_CONTEXT) + __android_log_print(ANDROID_LOG_ERROR, g_LogTag, "%s", "eglCreateContext() returned EGL_NO_CONTEXT"); + + g_EglSurface = eglCreateWindowSurface(g_EglDisplay, egl_config, g_App->window, NULL); + eglMakeCurrent(g_EglDisplay, g_EglSurface, g_EglSurface, g_EglContext); + } + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + + // Redirect loading/saving of .ini file to our location. + // Make sure 'g_IniFilename' persists while we use Dear ImGui. + g_IniFilename = std::string(app->activity->internalDataPath) + "/imgui.ini"; + io.IniFilename = g_IniFilename.c_str();; + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplAndroid_Init(g_App->window); + ImGui_ImplOpenGL3_Init("#version 300 es"); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Android: The TTF files have to be placed into the assets/ directory (android/app/src/main/assets), we use our GetAssetData() helper to retrieve them. + + // We load the default font with increased size to improve readability on many devices with "high" DPI. + // FIXME: Put some effort into DPI awareness. + // Important: when calling AddFontFromMemoryTTF(), ownership of font_data is transfered by Dear ImGui by default (deleted is handled by Dear ImGui), unless we set FontDataOwnedByAtlas=false in ImFontConfig + ImFontConfig font_cfg; + font_cfg.SizePixels = 22.0f; + io.Fonts->AddFontDefault(&font_cfg); + //void* font_data; + //int font_data_size; + //ImFont* font; + //font_data_size = GetAssetData("segoeui.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); + //IM_ASSERT(font != NULL); + //font_data_size = GetAssetData("DroidSans.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); + //IM_ASSERT(font != NULL); + //font_data_size = GetAssetData("Roboto-Medium.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 16.0f); + //IM_ASSERT(font != NULL); + //font_data_size = GetAssetData("Cousine-Regular.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 15.0f); + //IM_ASSERT(font != NULL); + //font_data_size = GetAssetData("ArialUni.ttf", &font_data); + //font = io.Fonts->AddFontFromMemoryTTF(font_data, font_data_size, 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Arbitrary scale-up + // FIXME: Put some effort into DPI awareness + ImGui::GetStyle().ScaleAllSizes(3.0f); + + g_Initialized = true; +} + +void MainLoopStep() +{ + ImGuiIO& io = ImGui::GetIO(); + if (g_EglDisplay == EGL_NO_DISPLAY) + return; + + // Our state + // (we use static, which essentially makes the variable globals, as a convenience to keep the example code easy to follow) + static bool show_demo_window = true; + static bool show_another_window = false; + static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Poll Unicode characters via JNI + // FIXME: do not call this every frame because of JNI overhead + PollUnicodeChars(); + + // Open on-screen (soft) input if requested by Dear ImGui + static bool WantTextInputLast = false; + if (io.WantTextInput && !WantTextInputLast) + ShowSoftKeyboardInput(); + WantTextInputLast = io.WantTextInput; + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplAndroid_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + eglSwapBuffers(g_EglDisplay, g_EglSurface); +} + +void Shutdown() +{ + if (!g_Initialized) + return; + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplAndroid_Shutdown(); + ImGui::DestroyContext(); + + if (g_EglDisplay != EGL_NO_DISPLAY) + { + eglMakeCurrent(g_EglDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + + if (g_EglContext != EGL_NO_CONTEXT) + eglDestroyContext(g_EglDisplay, g_EglContext); + + if (g_EglSurface != EGL_NO_SURFACE) + eglDestroySurface(g_EglDisplay, g_EglSurface); + + eglTerminate(g_EglDisplay); + } + + g_EglDisplay = EGL_NO_DISPLAY; + g_EglContext = EGL_NO_CONTEXT; + g_EglSurface = EGL_NO_SURFACE; + ANativeWindow_release(g_App->window); + + g_Initialized = false; +} + +// Helper functions + +// Unfortunately, there is no way to show the on-screen input from native code. +// Therefore, we call ShowSoftKeyboardInput() of the main activity implemented in MainActivity.kt via JNI. +static int ShowSoftKeyboardInput() +{ + JavaVM* java_vm = g_App->activity->vm; + JNIEnv* java_env = NULL; + + jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); + if (jni_return == JNI_ERR) + return -1; + + jni_return = java_vm->AttachCurrentThread(&java_env, NULL); + if (jni_return != JNI_OK) + return -2; + + jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); + if (native_activity_clazz == NULL) + return -3; + + jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "showSoftInput", "()V"); + if (method_id == NULL) + return -4; + + java_env->CallVoidMethod(g_App->activity->clazz, method_id); + + jni_return = java_vm->DetachCurrentThread(); + if (jni_return != JNI_OK) + return -5; + + return 0; +} + +// Unfortunately, the native KeyEvent implementation has no getUnicodeChar() function. +// Therefore, we implement the processing of KeyEvents in MainActivity.kt and poll +// the resulting Unicode characters here via JNI and send them to Dear ImGui. +static int PollUnicodeChars() +{ + JavaVM* java_vm = g_App->activity->vm; + JNIEnv* java_env = NULL; + + jint jni_return = java_vm->GetEnv((void**)&java_env, JNI_VERSION_1_6); + if (jni_return == JNI_ERR) + return -1; + + jni_return = java_vm->AttachCurrentThread(&java_env, NULL); + if (jni_return != JNI_OK) + return -2; + + jclass native_activity_clazz = java_env->GetObjectClass(g_App->activity->clazz); + if (native_activity_clazz == NULL) + return -3; + + jmethodID method_id = java_env->GetMethodID(native_activity_clazz, "pollUnicodeChar", "()I"); + if (method_id == NULL) + return -4; + + // Send the actual characters to Dear ImGui + ImGuiIO& io = ImGui::GetIO(); + jint unicode_character; + while ((unicode_character = java_env->CallIntMethod(g_App->activity->clazz, method_id)) != 0) + io.AddInputCharacter(unicode_character); + + jni_return = java_vm->DetachCurrentThread(); + if (jni_return != JNI_OK) + return -5; + + return 0; +} + +// Helper to retrieve data placed into the assets/ directory (android/app/src/main/assets) +static int GetAssetData(const char* filename, void** outData) +{ + int num_bytes = 0; + AAsset* asset_descriptor = AAssetManager_open(g_App->activity->assetManager, filename, AASSET_MODE_BUFFER); + if (asset_descriptor) + { + num_bytes = AAsset_getLength(asset_descriptor); + *outData = IM_ALLOC(num_bytes); + int64_t num_bytes_read = AAsset_read(asset_descriptor, *outData, num_bytes); + AAsset_close(asset_descriptor); + IM_ASSERT(num_bytes_read == num_bytes); + } + return num_bytes; +} diff --git a/ImGui/examples/example_apple_metal/README.md b/ImGui/examples/example_apple_metal/README.md new file mode 100644 index 0000000..48a2b57 --- /dev/null +++ b/ImGui/examples/example_apple_metal/README.md @@ -0,0 +1,10 @@ +# iOS / OSX Metal example + +## Introduction + +This example shows how to integrate Dear ImGui with Metal. It is based on the "cross-platform" game template provided with Xcode as of Xcode 9. + +Consider basing your work off the example_glfw_metal/ or example_sdl2_metal/ examples. They are better supported and will be portable unlike this one. + + + diff --git a/ImGui/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj b/ImGui/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj new file mode 100644 index 0000000..4bb4fc2 --- /dev/null +++ b/ImGui/examples/example_apple_metal/example_apple_metal.xcodeproj/project.pbxproj @@ -0,0 +1,503 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05318E0E274C397200A8DE2E /* GameController.framework */; }; + 07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; }; + 07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82ED72139413C0078D120 /* imgui_widgets.cpp */; }; + 5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822D257677DB0038A28D /* imgui_tables.cpp */; }; + 8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BD8E253CCAAA0045E2A1 /* UIKit.framework */; }; + 8309BDA5253CCC070045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; }; + 8309BDA8253CCC080045E2A1 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDA0253CCBC10045E2A1 /* main.mm */; }; + 8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; }; + 8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */; }; + 8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */; }; + 8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8309BDC5253CCCFE0045E2A1 /* AppKit.framework */; }; + 8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */; }; + 8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */; }; + 83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E420EB46B900295997 /* Metal.framework */; }; + 83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9E620EB46BD00295997 /* MetalKit.framework */; }; + 83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EA20EB471700295997 /* MetalKit.framework */; }; + 83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 83BBE9EB20EB471700295997 /* Metal.framework */; }; + 83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; }; + 83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0120EB54E700295997 /* imgui_draw.cpp */; }; + 83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; }; + 83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0220EB54E700295997 /* imgui_demo.cpp */; }; + 83BBEA0920EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; }; + 83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83BBEA0320EB54E700295997 /* imgui.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 05318E0E274C397200A8DE2E /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; + 07A82ED62139413C0078D120 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = ""; }; + 07A82ED72139413C0078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = ""; }; + 5079822D257677DB0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = ""; }; + 8307E7C420E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8307E7DA20E9F9C900473790 /* example_apple_metal.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = example_apple_metal.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8309BD8E253CCAAA0045E2A1 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + 8309BDA0253CCBC10045E2A1 /* main.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = ""; }; + 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_metal.mm; path = ../../backends/imgui_impl_metal.mm; sourceTree = ""; }; + 8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = ""; }; + 8309BDC5253CCCFE0045E2A1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = ""; }; + 8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainMenu.storyboard; sourceTree = ""; }; + 8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = ""; }; + 83BBE9E420EB46B900295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; }; + 83BBE9E620EB46BD00295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/MetalKit.framework; sourceTree = DEVELOPER_DIR; }; + 83BBE9E820EB46C100295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.4.sdk/System/Library/Frameworks/ModelIO.framework; sourceTree = DEVELOPER_DIR; }; + 83BBE9EA20EB471700295997 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = System/Library/Frameworks/MetalKit.framework; sourceTree = SDKROOT; }; + 83BBE9EB20EB471700295997 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; }; + 83BBE9EE20EB471C00295997 /* ModelIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ModelIO.framework; path = System/Library/Frameworks/ModelIO.framework; sourceTree = SDKROOT; }; + 83BBEA0020EB54E700295997 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = ""; }; + 83BBEA0120EB54E700295997 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = ""; }; + 83BBEA0220EB54E700295997 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = ""; }; + 83BBEA0320EB54E700295997 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = ""; }; + 83BBEA0420EB54E700295997 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8307E7C120E9F9C900473790 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BD8F253CCAAA0045E2A1 /* UIKit.framework in Frameworks */, + 83BBE9E720EB46BD00295997 /* MetalKit.framework in Frameworks */, + 83BBE9E520EB46B900295997 /* Metal.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8307E7D720E9F9C900473790 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BDC6253CCCFE0045E2A1 /* AppKit.framework in Frameworks */, + 83BBE9EC20EB471700295997 /* MetalKit.framework in Frameworks */, + 05318E0F274C397200A8DE2E /* GameController.framework in Frameworks */, + 83BBE9ED20EB471700295997 /* Metal.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8307E7B520E9F9C700473790 = { + isa = PBXGroup; + children = ( + 83BBE9F020EB544400295997 /* imgui */, + 8309BD9E253CCBA70045E2A1 /* example */, + 8307E7C520E9F9C900473790 /* Products */, + 83BBE9E320EB46B800295997 /* Frameworks */, + ); + sourceTree = ""; + }; + 8307E7C520E9F9C900473790 /* Products */ = { + isa = PBXGroup; + children = ( + 8307E7C420E9F9C900473790 /* example_apple_metal.app */, + 8307E7DA20E9F9C900473790 /* example_apple_metal.app */, + ); + name = Products; + sourceTree = ""; + }; + 8309BD9E253CCBA70045E2A1 /* example */ = { + isa = PBXGroup; + children = ( + 8309BDF6253CDAAE0045E2A1 /* iOS */, + 8309BDF9253CDAAE0045E2A1 /* macOS */, + 8309BDA0253CCBC10045E2A1 /* main.mm */, + ); + name = example; + sourceTree = ""; + }; + 8309BDF6253CDAAE0045E2A1 /* iOS */ = { + isa = PBXGroup; + children = ( + 8309BDF7253CDAAE0045E2A1 /* LaunchScreen.storyboard */, + 8309BDF8253CDAAE0045E2A1 /* Info-iOS.plist */, + ); + path = iOS; + sourceTree = ""; + }; + 8309BDF9253CDAAE0045E2A1 /* macOS */ = { + isa = PBXGroup; + children = ( + 8309BDFA253CDAAE0045E2A1 /* MainMenu.storyboard */, + 8309BDFB253CDAAE0045E2A1 /* Info-macOS.plist */, + ); + path = macOS; + sourceTree = ""; + }; + 83BBE9E320EB46B800295997 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 05318E0E274C397200A8DE2E /* GameController.framework */, + 8309BDC5253CCCFE0045E2A1 /* AppKit.framework */, + 8309BD8E253CCAAA0045E2A1 /* UIKit.framework */, + 83BBE9EE20EB471C00295997 /* ModelIO.framework */, + 83BBE9EB20EB471700295997 /* Metal.framework */, + 83BBE9EA20EB471700295997 /* MetalKit.framework */, + 83BBE9E820EB46C100295997 /* ModelIO.framework */, + 83BBE9E620EB46BD00295997 /* MetalKit.framework */, + 83BBE9E420EB46B900295997 /* Metal.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 83BBE9F020EB544400295997 /* imgui */ = { + isa = PBXGroup; + children = ( + 5079822D257677DB0038A28D /* imgui_tables.cpp */, + 8309BDB5253CCC9D0045E2A1 /* imgui_impl_metal.mm */, + 8309BDB6253CCC9D0045E2A1 /* imgui_impl_osx.mm */, + 83BBEA0420EB54E700295997 /* imconfig.h */, + 83BBEA0320EB54E700295997 /* imgui.cpp */, + 83BBEA0020EB54E700295997 /* imgui.h */, + 83BBEA0220EB54E700295997 /* imgui_demo.cpp */, + 83BBEA0120EB54E700295997 /* imgui_draw.cpp */, + 07A82ED62139413C0078D120 /* imgui_internal.h */, + 07A82ED72139413C0078D120 /* imgui_widgets.cpp */, + ); + name = imgui; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8307E7C320E9F9C900473790 /* example_apple_metal_ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */; + buildPhases = ( + 8307E7C020E9F9C900473790 /* Sources */, + 8307E7C120E9F9C900473790 /* Frameworks */, + 8307E7C220E9F9C900473790 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = example_apple_metal_ios; + productName = "imguiex iOS"; + productReference = 8307E7C420E9F9C900473790 /* example_apple_metal.app */; + productType = "com.apple.product-type.application"; + }; + 8307E7D920E9F9C900473790 /* example_apple_metal_macos */ = { + isa = PBXNativeTarget; + buildConfigurationList = 8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */; + buildPhases = ( + 8307E7D620E9F9C900473790 /* Sources */, + 8307E7D720E9F9C900473790 /* Frameworks */, + 8307E7D820E9F9C900473790 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = example_apple_metal_macos; + productName = "imguiex macOS"; + productReference = 8307E7DA20E9F9C900473790 /* example_apple_metal.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 8307E7B620E9F9C700473790 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1200; + ORGANIZATIONNAME = "Warren Moore"; + TargetAttributes = { + 8307E7C320E9F9C900473790 = { + CreatedOnToolsVersion = 9.4.1; + ProvisioningStyle = Automatic; + }; + 8307E7D920E9F9C900473790 = { + CreatedOnToolsVersion = 9.4.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 8307E7B520E9F9C700473790; + productRefGroup = 8307E7C520E9F9C900473790 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 8307E7C320E9F9C900473790 /* example_apple_metal_ios */, + 8307E7D920E9F9C900473790 /* example_apple_metal_macos */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8307E7C220E9F9C900473790 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BDFC253CDAB30045E2A1 /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8307E7D820E9F9C900473790 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BE04253CDAB60045E2A1 /* MainMenu.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8307E7C020E9F9C900473790 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BDBB253CCCAD0045E2A1 /* imgui_impl_metal.mm in Sources */, + 83BBEA0920EB54E700295997 /* imgui.cpp in Sources */, + 83BBEA0720EB54E700295997 /* imgui_demo.cpp in Sources */, + 83BBEA0520EB54E700295997 /* imgui_draw.cpp in Sources */, + 5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */, + 07A82ED82139413D0078D120 /* imgui_widgets.cpp in Sources */, + 8309BDA5253CCC070045E2A1 /* main.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8307E7D620E9F9C900473790 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8309BDBE253CCCB60045E2A1 /* imgui_impl_metal.mm in Sources */, + 8309BDBF253CCCB60045E2A1 /* imgui_impl_osx.mm in Sources */, + 83BBEA0A20EB54E700295997 /* imgui.cpp in Sources */, + 83BBEA0820EB54E700295997 /* imgui_demo.cpp in Sources */, + 83BBEA0620EB54E700295997 /* imgui_draw.cpp in Sources */, + 5079822E257677DB0038A28D /* imgui_tables.cpp in Sources */, + 07A82ED92139418F0078D120 /* imgui_widgets.cpp in Sources */, + 8309BDA8253CCC080045E2A1 /* main.mm in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 8307E7EE20E9F9C900473790 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + 8307E7EF20E9F9C900473790 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + }; + name = Release; + }; + 8307E7F120E9F9C900473790 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios"; + PRODUCT_NAME = example_apple_metal; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; + }; + name = Debug; + }; + 8307E7F220E9F9C900473790 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/iOS/Info-iOS.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-ios"; + PRODUCT_NAME = example_apple_metal; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 8307E7F420E9F9C900473790 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos"; + PRODUCT_NAME = example_apple_metal; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; + }; + name = Debug; + }; + 8307E7F520E9F9C900473790 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = "$(SRCROOT)/macOS/Info-macOS.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_BUNDLE_IDENTIFIER = "org.imgui.example.apple-metal-macos"; + PRODUCT_NAME = example_apple_metal; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../**"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 8307E7B920E9F9C700473790 /* Build configuration list for PBXProject "example_apple_metal" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8307E7EE20E9F9C900473790 /* Debug */, + 8307E7EF20E9F9C900473790 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8307E7F020E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8307E7F120E9F9C900473790 /* Debug */, + 8307E7F220E9F9C900473790 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 8307E7F320E9F9C900473790 /* Build configuration list for PBXNativeTarget "example_apple_metal_macos" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 8307E7F420E9F9C900473790 /* Debug */, + 8307E7F520E9F9C900473790 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 8307E7B620E9F9C700473790 /* Project object */; +} diff --git a/ImGui/examples/example_apple_metal/iOS/Info-iOS.plist b/ImGui/examples/example_apple_metal/iOS/Info-iOS.plist new file mode 100644 index 0000000..93ef078 --- /dev/null +++ b/ImGui/examples/example_apple_metal/iOS/Info-iOS.plist @@ -0,0 +1,49 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + imgui + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIRequiredDeviceCapabilities + + armv7 + metal + + UIRequiresFullScreen + + UIStatusBarHidden + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ImGui/examples/example_apple_metal/iOS/LaunchScreen.storyboard b/ImGui/examples/example_apple_metal/iOS/LaunchScreen.storyboard new file mode 100644 index 0000000..12c52cf --- /dev/null +++ b/ImGui/examples/example_apple_metal/iOS/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_apple_metal/macOS/Info-macOS.plist b/ImGui/examples/example_apple_metal/macOS/Info-macOS.plist new file mode 100644 index 0000000..6f4a2b2 --- /dev/null +++ b/ImGui/examples/example_apple_metal/macOS/Info-macOS.plist @@ -0,0 +1,30 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + imgui + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSMainStoryboardFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/ImGui/examples/example_apple_metal/macOS/MainMenu.storyboard b/ImGui/examples/example_apple_metal/macOS/MainMenu.storyboard new file mode 100644 index 0000000..38ad432 --- /dev/null +++ b/ImGui/examples/example_apple_metal/macOS/MainMenu.storyboard @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_apple_metal/main.mm b/ImGui/examples/example_apple_metal/main.mm new file mode 100644 index 0000000..f75d3c1 --- /dev/null +++ b/ImGui/examples/example_apple_metal/main.mm @@ -0,0 +1,332 @@ +// Dear ImGui: standalone example application for OSX + Metal. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#import + +#if TARGET_OS_OSX +#import +#else +#import +#endif + +#import +#import + +#include "imgui.h" +#include "imgui_impl_metal.h" +#if TARGET_OS_OSX +#include "imgui_impl_osx.h" +@interface AppViewController : NSViewController +@end +#else +@interface AppViewController : UIViewController +@end +#endif + +@interface AppViewController () +@property (nonatomic, readonly) MTKView *mtkView; +@property (nonatomic, strong) id device; +@property (nonatomic, strong) id commandQueue; +@end + +//----------------------------------------------------------------------------------- +// AppViewController +//----------------------------------------------------------------------------------- + +@implementation AppViewController + +-(instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + + _device = MTLCreateSystemDefaultDevice(); + _commandQueue = [_device newCommandQueue]; + + if (!self.device) + { + NSLog(@"Metal is not supported"); + abort(); + } + + // Setup Dear ImGui context + // FIXME: This example doesn't have proper cleanup... + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Renderer backend + ImGui_ImplMetal_Init(_device); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + return self; +} + +-(MTKView *)mtkView +{ + return (MTKView *)self.view; +} + +-(void)loadView +{ + self.view = [[MTKView alloc] initWithFrame:CGRectMake(0, 0, 1200, 720)]; +} + +-(void)viewDidLoad +{ + [super viewDidLoad]; + + self.mtkView.device = self.device; + self.mtkView.delegate = self; + +#if TARGET_OS_OSX + ImGui_ImplOSX_Init(self.view); + [NSApp activateIgnoringOtherApps:YES]; +#endif +} + +-(void)drawInMTKView:(MTKView*)view +{ + ImGuiIO& io = ImGui::GetIO(); + io.DisplaySize.x = view.bounds.size.width; + io.DisplaySize.y = view.bounds.size.height; + +#if TARGET_OS_OSX + CGFloat framebufferScale = view.window.screen.backingScaleFactor ?: NSScreen.mainScreen.backingScaleFactor; +#else + CGFloat framebufferScale = view.window.screen.scale ?: UIScreen.mainScreen.scale; +#endif + io.DisplayFramebufferScale = ImVec2(framebufferScale, framebufferScale); + + id commandBuffer = [self.commandQueue commandBuffer]; + + MTLRenderPassDescriptor* renderPassDescriptor = view.currentRenderPassDescriptor; + if (renderPassDescriptor == nil) + { + [commandBuffer commit]; + return; + } + + // Start the Dear ImGui frame + ImGui_ImplMetal_NewFrame(renderPassDescriptor); +#if TARGET_OS_OSX + ImGui_ImplOSX_NewFrame(view); +#endif + ImGui::NewFrame(); + + // Our state (make them static = more or less global) as a convenience to keep the example terse. + static bool show_demo_window = true; + static bool show_another_window = false; + static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + + renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + id renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; + [renderEncoder pushDebugGroup:@"Dear ImGui rendering"]; + ImGui_ImplMetal_RenderDrawData(draw_data, commandBuffer, renderEncoder); + [renderEncoder popDebugGroup]; + [renderEncoder endEncoding]; + + // Present + [commandBuffer presentDrawable:view.currentDrawable]; + [commandBuffer commit]; +} + +-(void)mtkView:(MTKView*)view drawableSizeWillChange:(CGSize)size +{ +} + +//----------------------------------------------------------------------------------- +// Input processing +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +- (void)viewWillAppear +{ + [super viewWillAppear]; + self.view.window.delegate = self; +} + +- (void)windowWillClose:(NSNotification *)notification +{ + ImGui_ImplMetal_Shutdown(); + ImGui_ImplOSX_Shutdown(); + ImGui::DestroyContext(); +} + +#else + +// This touch mapping is super cheesy/hacky. We treat any touch on the screen +// as if it were a depressed left mouse button, and we don't bother handling +// multitouch correctly at all. This causes the "cursor" to behave very erratically +// when there are multiple active touches. But for demo purposes, single-touch +// interaction actually works surprisingly well. +-(void)updateIOWithTouchEvent:(UIEvent *)event +{ + UITouch *anyTouch = event.allTouches.anyObject; + CGPoint touchLocation = [anyTouch locationInView:self.view]; + ImGuiIO &io = ImGui::GetIO(); + io.AddMousePosEvent(touchLocation.x, touchLocation.y); + + BOOL hasActiveTouch = NO; + for (UITouch *touch in event.allTouches) + { + if (touch.phase != UITouchPhaseEnded && touch.phase != UITouchPhaseCancelled) + { + hasActiveTouch = YES; + break; + } + } + io.AddMouseButtonEvent(0, hasActiveTouch); +} + +-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; } +-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; } +-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; } +-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { [self updateIOWithTouchEvent:event]; } + +#endif + +@end + +//----------------------------------------------------------------------------------- +// AppDelegate +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +@interface AppDelegate : NSObject +@property (nonatomic, strong) NSWindow *window; +@end + +@implementation AppDelegate + +-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender +{ + return YES; +} + +-(instancetype)init +{ + if (self = [super init]) + { + NSViewController *rootViewController = [[AppViewController alloc] initWithNibName:nil bundle:nil]; + self.window = [[NSWindow alloc] initWithContentRect:NSZeroRect + styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskMiniaturizable + backing:NSBackingStoreBuffered + defer:NO]; + self.window.contentViewController = rootViewController; + [self.window center]; + [self.window makeKeyAndOrderFront:self]; + } + return self; +} + +@end + +#else + +@interface AppDelegate : UIResponder +@property (strong, nonatomic) UIWindow *window; +@end + +@implementation AppDelegate + +-(BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + UIViewController *rootViewController = [[AppViewController alloc] init]; + self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; + self.window.rootViewController = rootViewController; + [self.window makeKeyAndVisible]; + return YES; +} + +@end + +#endif + +//----------------------------------------------------------------------------------- +// Application main() function +//----------------------------------------------------------------------------------- + +#if TARGET_OS_OSX + +int main(int argc, const char * argv[]) +{ + return NSApplicationMain(argc, argv); +} + +#else + +int main(int argc, char * argv[]) +{ + @autoreleasepool + { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} + +#endif diff --git a/ImGui/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj b/ImGui/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj new file mode 100644 index 0000000..a168373 --- /dev/null +++ b/ImGui/examples/example_apple_opengl2/example_apple_opengl2.xcodeproj/project.pbxproj @@ -0,0 +1,332 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 05E31B59274EF0700083FCB6 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05E31B57274EF0360083FCB6 /* GameController.framework */; }; + 07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07A82EDA213941D00078D120 /* imgui_widgets.cpp */; }; + 4080A99820B02D340036BA46 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A98A20B02CD90036BA46 /* main.mm */; }; + 4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */; }; + 4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A620B0343C0036BA46 /* imgui_demo.cpp */; }; + 4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9A720B0343C0036BA46 /* imgui.cpp */; }; + 4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */; }; + 4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4080A99F20B034280036BA46 /* imgui_impl_osx.mm */; }; + 4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B220B034E40036BA46 /* Cocoa.framework */; }; + 4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4080A9B420B034EA0036BA46 /* OpenGL.framework */; }; + 50798230257677FD0038A28D /* imgui_tables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5079822F257677FC0038A28D /* imgui_tables.cpp */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 4080A96920B029B00036BA46 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 05E31B57274EF0360083FCB6 /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; + 07A82EDA213941D00078D120 /* imgui_widgets.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_widgets.cpp; path = ../../imgui_widgets.cpp; sourceTree = ""; }; + 4080A96B20B029B00036BA46 /* example_osx_opengl2 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = example_osx_opengl2; sourceTree = BUILT_PRODUCTS_DIR; }; + 4080A98A20B02CD90036BA46 /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = SOURCE_ROOT; }; + 4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_impl_opengl2.cpp; path = ../../backends/imgui_impl_opengl2.cpp; sourceTree = ""; }; + 4080A99F20B034280036BA46 /* imgui_impl_osx.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = imgui_impl_osx.mm; path = ../../backends/imgui_impl_osx.mm; sourceTree = ""; }; + 4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_opengl2.h; path = ../../backends/imgui_impl_opengl2.h; sourceTree = ""; }; + 4080A9A120B034280036BA46 /* imgui_impl_osx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_impl_osx.h; path = ../../backends/imgui_impl_osx.h; sourceTree = ""; }; + 4080A9A520B0343C0036BA46 /* imgui_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui_internal.h; path = ../../imgui_internal.h; sourceTree = ""; }; + 4080A9A620B0343C0036BA46 /* imgui_demo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_demo.cpp; path = ../../imgui_demo.cpp; sourceTree = ""; }; + 4080A9A720B0343C0036BA46 /* imgui.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui.cpp; path = ../../imgui.cpp; sourceTree = ""; }; + 4080A9A820B0343C0036BA46 /* imgui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imgui.h; path = ../../imgui.h; sourceTree = ""; }; + 4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_draw.cpp; path = ../../imgui_draw.cpp; sourceTree = ""; }; + 4080A9AC20B0343C0036BA46 /* imconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = imconfig.h; path = ../../imconfig.h; sourceTree = ""; }; + 4080A9B220B034E40036BA46 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 4080A9B420B034EA0036BA46 /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; + 5079822F257677FC0038A28D /* imgui_tables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = imgui_tables.cpp; path = ../../imgui_tables.cpp; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 4080A96820B029B00036BA46 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4080A9B520B034EA0036BA46 /* OpenGL.framework in Frameworks */, + 4080A9B320B034E40036BA46 /* Cocoa.framework in Frameworks */, + 05E31B59274EF0700083FCB6 /* GameController.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 4080A96220B029B00036BA46 = { + isa = PBXGroup; + children = ( + 5079822F257677FC0038A28D /* imgui_tables.cpp */, + 4080A9AC20B0343C0036BA46 /* imconfig.h */, + 4080A9A720B0343C0036BA46 /* imgui.cpp */, + 4080A9A820B0343C0036BA46 /* imgui.h */, + 07A82EDA213941D00078D120 /* imgui_widgets.cpp */, + 4080A9A620B0343C0036BA46 /* imgui_demo.cpp */, + 4080A9AA20B0343C0036BA46 /* imgui_draw.cpp */, + 4080A9A520B0343C0036BA46 /* imgui_internal.h */, + 4080A99E20B034280036BA46 /* imgui_impl_opengl2.cpp */, + 4080A9A020B034280036BA46 /* imgui_impl_opengl2.h */, + 4080A9A120B034280036BA46 /* imgui_impl_osx.h */, + 4080A99F20B034280036BA46 /* imgui_impl_osx.mm */, + 4080A98A20B02CD90036BA46 /* main.mm */, + 4080A96C20B029B00036BA46 /* Products */, + 4080A9B120B034E40036BA46 /* Frameworks */, + ); + sourceTree = ""; + }; + 4080A96C20B029B00036BA46 /* Products */ = { + isa = PBXGroup; + children = ( + 4080A96B20B029B00036BA46 /* example_osx_opengl2 */, + ); + name = Products; + sourceTree = ""; + }; + 4080A9B120B034E40036BA46 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 05E31B57274EF0360083FCB6 /* GameController.framework */, + 4080A9B420B034EA0036BA46 /* OpenGL.framework */, + 4080A9B220B034E40036BA46 /* Cocoa.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 4080A96A20B029B00036BA46 /* example_osx_opengl2 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */; + buildPhases = ( + 4080A96720B029B00036BA46 /* Sources */, + 4080A96820B029B00036BA46 /* Frameworks */, + 4080A96920B029B00036BA46 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = example_osx_opengl2; + productName = example_osx_opengl2; + productReference = 4080A96B20B029B00036BA46 /* example_osx_opengl2 */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 4080A96320B029B00036BA46 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0930; + ORGANIZATIONNAME = ImGui; + TargetAttributes = { + 4080A96A20B029B00036BA46 = { + CreatedOnToolsVersion = 9.3.1; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 4080A96220B029B00036BA46; + productRefGroup = 4080A96C20B029B00036BA46 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 4080A96A20B029B00036BA46 /* example_osx_opengl2 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 4080A96720B029B00036BA46 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4080A99820B02D340036BA46 /* main.mm in Sources */, + 4080A9AD20B0343C0036BA46 /* imgui_demo.cpp in Sources */, + 4080A9AF20B0343C0036BA46 /* imgui_draw.cpp in Sources */, + 4080A9A220B034280036BA46 /* imgui_impl_opengl2.cpp in Sources */, + 4080A9B020B0347A0036BA46 /* imgui_impl_osx.mm in Sources */, + 4080A9AE20B0343C0036BA46 /* imgui.cpp in Sources */, + 50798230257677FD0038A28D /* imgui_tables.cpp in Sources */, + 07A82EDB213941D00078D120 /* imgui_widgets.cpp in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 4080A97020B029B00036BA46 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 4080A97120B029B00036BA46 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 4080A97320B029B00036BA46 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = ../..; + }; + name = Debug; + }; + 4080A97420B029B00036BA46 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + MACOSX_DEPLOYMENT_TARGET = 10.12; + PRODUCT_NAME = "$(TARGET_NAME)"; + USER_HEADER_SEARCH_PATHS = ../..; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4080A96620B029B00036BA46 /* Build configuration list for PBXProject "example_apple_opengl2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4080A97020B029B00036BA46 /* Debug */, + 4080A97120B029B00036BA46 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 4080A97220B029B00036BA46 /* Build configuration list for PBXNativeTarget "example_osx_opengl2" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4080A97320B029B00036BA46 /* Debug */, + 4080A97420B029B00036BA46 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 4080A96320B029B00036BA46 /* Project object */; +} diff --git a/ImGui/examples/example_apple_opengl2/main.mm b/ImGui/examples/example_apple_opengl2/main.mm new file mode 100644 index 0000000..11b5bf4 --- /dev/null +++ b/ImGui/examples/example_apple_opengl2/main.mm @@ -0,0 +1,251 @@ +// Dear ImGui: standalone example application for OSX + OpenGL2, using legacy fixed pipeline +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#import +#import +#import + +#include "imgui.h" +#include "imgui_impl_opengl2.h" +#include "imgui_impl_osx.h" + +//----------------------------------------------------------------------------------- +// AppView +//----------------------------------------------------------------------------------- + +@interface AppView : NSOpenGLView +{ + NSTimer* animationTimer; +} +@end + +@implementation AppView + +-(void)prepareOpenGL +{ + [super prepareOpenGL]; + +#ifndef DEBUG + GLint swapInterval = 1; + [[self openGLContext] setValues:&swapInterval forParameter:NSOpenGLCPSwapInterval]; + if (swapInterval == 0) + NSLog(@"Error: Cannot set swap interval."); +#endif +} + +-(void)initialize +{ + // Setup Dear ImGui context + // FIXME: This example doesn't have proper cleanup... + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplOSX_Init(self); + ImGui_ImplOpenGL2_Init(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); +} + +-(void)updateAndDrawDemoView +{ + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplOSX_NewFrame(self); + ImGui::NewFrame(); + + // Our state (make them static = more or less global) as a convenience to keep the example terse. + static bool show_demo_window = true; + static bool show_another_window = false; + static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + + [[self openGLContext] makeCurrentContext]; + GLsizei width = (GLsizei)(draw_data->DisplaySize.x * draw_data->FramebufferScale.x); + GLsizei height = (GLsizei)(draw_data->DisplaySize.y * draw_data->FramebufferScale.y); + glViewport(0, 0, width, height); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + + ImGui_ImplOpenGL2_RenderDrawData(draw_data); + + // Present + [[self openGLContext] flushBuffer]; + + if (!animationTimer) + animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.017 target:self selector:@selector(animationTimerFired:) userInfo:nil repeats:YES]; +} + +-(void)reshape { [super reshape]; [[self openGLContext] update]; [self updateAndDrawDemoView]; } +-(void)drawRect:(NSRect)bounds { [self updateAndDrawDemoView]; } +-(void)animationTimerFired:(NSTimer*)timer { [self setNeedsDisplay:YES]; } +-(void)dealloc { animationTimer = nil; } + +@end + +//----------------------------------------------------------------------------------- +// AppDelegate +//----------------------------------------------------------------------------------- + +@interface AppDelegate : NSObject +@property (nonatomic, readonly) NSWindow* window; +@end + +@implementation AppDelegate +@synthesize window = _window; + +-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication +{ + return YES; +} + +-(NSWindow*)window +{ + if (_window != nil) + return (_window); + + NSRect viewRect = NSMakeRect(100.0, 100.0, 100.0 + 1280.0, 100 + 720.0); + + _window = [[NSWindow alloc] initWithContentRect:viewRect styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskMiniaturizable|NSWindowStyleMaskResizable|NSWindowStyleMaskClosable backing:NSBackingStoreBuffered defer:YES]; + [_window setTitle:@"Dear ImGui OSX+OpenGL2 Example"]; + [_window setAcceptsMouseMovedEvents:YES]; + [_window setOpaque:YES]; + [_window makeKeyAndOrderFront:NSApp]; + + return (_window); +} + +-(void)setupMenu +{ + NSMenu* mainMenuBar = [[NSMenu alloc] init]; + NSMenu* appMenu; + NSMenuItem* menuItem; + + appMenu = [[NSMenu alloc] initWithTitle:@"Dear ImGui OSX+OpenGL2 Example"]; + menuItem = [appMenu addItemWithTitle:@"Quit Dear ImGui OSX+OpenGL2 Example" action:@selector(terminate:) keyEquivalent:@"q"]; + [menuItem setKeyEquivalentModifierMask:NSEventModifierFlagCommand]; + + menuItem = [[NSMenuItem alloc] init]; + [menuItem setSubmenu:appMenu]; + + [mainMenuBar addItem:menuItem]; + + appMenu = nil; + [NSApp setMainMenu:mainMenuBar]; +} + +-(void)dealloc +{ + _window = nil; +} + +-(void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + // Make the application a foreground application (else it won't receive keyboard events) + ProcessSerialNumber psn = {0, kCurrentProcess}; + TransformProcessType(&psn, kProcessTransformToForegroundApplication); + + // Menu + [self setupMenu]; + + NSOpenGLPixelFormatAttribute attrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFADepthSize, 32, + 0 + }; + + NSOpenGLPixelFormat* format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; + AppView* view = [[AppView alloc] initWithFrame:self.window.frame pixelFormat:format]; + format = nil; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_6) + [view setWantsBestResolutionOpenGLSurface:YES]; +#endif // MAC_OS_X_VERSION_MAX_ALLOWED >= 1070 + [self.window setContentView:view]; + + if ([view openGLContext] == nil) + NSLog(@"No OpenGL Context!"); + + [view initialize]; +} + +@end + +//----------------------------------------------------------------------------------- +// Application main() function +//----------------------------------------------------------------------------------- + +int main(int argc, const char* argv[]) +{ + @autoreleasepool + { + NSApp = [NSApplication sharedApplication]; + AppDelegate* delegate = [[AppDelegate alloc] init]; + [[NSApplication sharedApplication] setDelegate:delegate]; + [NSApp run]; + } + return NSApplicationMain(argc, argv); +} diff --git a/ImGui/examples/example_emscripten_wgpu/Makefile b/ImGui/examples/example_emscripten_wgpu/Makefile new file mode 100644 index 0000000..5c79f0c --- /dev/null +++ b/ImGui/examples/example_emscripten_wgpu/Makefile @@ -0,0 +1,88 @@ +# +# Makefile to use with emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make` will produce three files: +# - web/index.html (current stored in the repository) +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.js +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_wgpu.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s USE_GLFW=3 -s USE_WEBGPU=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +#LDFLAGS += --shell-file shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -f $(EXE) $(OBJS) $(WEB_DIR)/*.js $(WEB_DIR)/*.wasm $(WEB_DIR)/*.wasm.pre diff --git a/ImGui/examples/example_emscripten_wgpu/README.md b/ImGui/examples/example_emscripten_wgpu/README.md new file mode 100644 index 0000000..c4c4dec --- /dev/null +++ b/ImGui/examples/example_emscripten_wgpu/README.md @@ -0,0 +1,24 @@ +## How to Build + +- You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. + +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. + +- Then build using `make` while in the `example_emscripten_wgpu/` directory. + +- Requires recent Emscripten as WGPU is still a work-in-progress API. + +## How to Run + +To run on a local machine: +- Make sure your browse supports WGPU and it is enabled. WGPU is still WIP not enabled by default in most browser. +- `make serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver: + - Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
+_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ + - Emscripten SDK has a handy `emrun` command: `emrun web/example_emscripten_opengl3.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. + - You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). + - You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. + - If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/ImGui/examples/example_emscripten_wgpu/main.cpp b/ImGui/examples/example_emscripten_wgpu/main.cpp new file mode 100644 index 0000000..729e759 --- /dev/null +++ b/ImGui/examples/example_emscripten_wgpu/main.cpp @@ -0,0 +1,246 @@ +// Dear ImGui: standalone example application for Emscripten, using GLFW + WebGPU +// (Emscripten is a C++-to-javascript compiler, used to publish executables for the web. See https://emscripten.org/) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_wgpu.h" +#include +#include +#include +#include +#include +#include +#include + +// Global WebGPU required states +static WGPUDevice wgpu_device = NULL; +static WGPUSurface wgpu_surface = NULL; +static WGPUSwapChain wgpu_swap_chain = NULL; +static int wgpu_swap_chain_width = 0; +static int wgpu_swap_chain_height = 0; + +// Forward declarations +static void MainLoopStep(void* window); +static bool InitWGPU(); +static void print_glfw_error(int error, const char* description); +static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*); + +// Main code +int main(int, char**) +{ + glfwSetErrorCallback(print_glfw_error); + if (!glfwInit()) + return 1; + + // Make sure GLFW does not initialize any graphics context. + // This needs to be done explicitly later. + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+WebGPU example", NULL, NULL); + if (!window) + { + glfwTerminate(); + return 1; + } + + // Initialize the WebGPU environment + if (!InitWGPU()) + { + if (window) + glfwDestroyWindow(window); + glfwTerminate(); + return 1; + } + glfwShowWindow(window); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = NULL; + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOther(window, true); + ImGui_ImplWGPU_Init(wgpu_device, 3, WGPUTextureFormat_RGBA8Unorm, WGPUTextureFormat_Undefined); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Emscripten allows preloading a file or folder to be accessible at runtime. See Makefile for details. + //io.Fonts->AddFontDefault(); +#ifndef IMGUI_DISABLE_FILE_FUNCTIONS + //io.Fonts->AddFontFromFileTTF("fonts/segoeui.ttf", 18.0f); + io.Fonts->AddFontFromFileTTF("fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("fonts/Cousine-Regular.ttf", 15.0f); + //io.Fonts->AddFontFromFileTTF("fonts/ProggyTiny.ttf", 10.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("fonts/ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); +#endif + + // This function will directly return and exit the main function. + // Make sure that no required objects get cleaned up. + // This way we can use the browsers 'requestAnimationFrame' to control the rendering. + emscripten_set_main_loop_arg(MainLoopStep, window, 0, false); + + return 0; +} + +static bool InitWGPU() +{ + wgpu_device = emscripten_webgpu_get_device(); + if (!wgpu_device) + return false; + + wgpuDeviceSetUncapturedErrorCallback(wgpu_device, print_wgpu_error, NULL); + + // Use C++ wrapper due to misbehavior in Emscripten. + // Some offset computation for wgpuInstanceCreateSurface in JavaScript + // seem to be inline with struct alignments in the C++ structure + wgpu::SurfaceDescriptorFromCanvasHTMLSelector html_surface_desc = {}; + html_surface_desc.selector = "#canvas"; + + wgpu::SurfaceDescriptor surface_desc = {}; + surface_desc.nextInChain = &html_surface_desc; + + // Use 'null' instance + wgpu::Instance instance = {}; + wgpu_surface = instance.CreateSurface(&surface_desc).Release(); + + return true; +} + +static void MainLoopStep(void* window) +{ + ImGuiIO& io = ImGui::GetIO(); + + glfwPollEvents(); + + int width, height; + glfwGetFramebufferSize((GLFWwindow*)window, &width, &height); + + // React to changes in screen size + if (width != wgpu_swap_chain_width && height != wgpu_swap_chain_height) + { + ImGui_ImplWGPU_InvalidateDeviceObjects(); + if (wgpu_swap_chain) + wgpuSwapChainRelease(wgpu_swap_chain); + wgpu_swap_chain_width = width; + wgpu_swap_chain_height = height; + WGPUSwapChainDescriptor swap_chain_desc = {}; + swap_chain_desc.usage = WGPUTextureUsage_RenderAttachment; + swap_chain_desc.format = WGPUTextureFormat_RGBA8Unorm; + swap_chain_desc.width = width; + swap_chain_desc.height = height; + swap_chain_desc.presentMode = WGPUPresentMode_Fifo; + wgpu_swap_chain = wgpuDeviceCreateSwapChain(wgpu_device, wgpu_surface, &swap_chain_desc); + ImGui_ImplWGPU_CreateDeviceObjects(); + } + + // Start the Dear ImGui frame + ImGui_ImplWGPU_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // Our state + // (we use static, which essentially makes the variable globals, as a convenience to keep the example code easy to follow) + static bool show_demo_window = true; + static bool show_another_window = false; + static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + + WGPURenderPassColorAttachment color_attachments = {}; + color_attachments.loadOp = WGPULoadOp_Clear; + color_attachments.storeOp = WGPUStoreOp_Store; + color_attachments.clearValue = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + color_attachments.view = wgpuSwapChainGetCurrentTextureView(wgpu_swap_chain); + WGPURenderPassDescriptor render_pass_desc = {}; + render_pass_desc.colorAttachmentCount = 1; + render_pass_desc.colorAttachments = &color_attachments; + render_pass_desc.depthStencilAttachment = NULL; + + WGPUCommandEncoderDescriptor enc_desc = {}; + WGPUCommandEncoder encoder = wgpuDeviceCreateCommandEncoder(wgpu_device, &enc_desc); + + WGPURenderPassEncoder pass = wgpuCommandEncoderBeginRenderPass(encoder, &render_pass_desc); + ImGui_ImplWGPU_RenderDrawData(ImGui::GetDrawData(), pass); + wgpuRenderPassEncoderEnd(pass); + + WGPUCommandBufferDescriptor cmd_buffer_desc = {}; + WGPUCommandBuffer cmd_buffer = wgpuCommandEncoderFinish(encoder, &cmd_buffer_desc); + WGPUQueue queue = wgpuDeviceGetQueue(wgpu_device); + wgpuQueueSubmit(queue, 1, &cmd_buffer); +} + +static void print_glfw_error(int error, const char* description) +{ + printf("GLFW Error %d: %s\n", error, description); +} + +static void print_wgpu_error(WGPUErrorType error_type, const char* message, void*) +{ + const char* error_type_lbl = ""; + switch (error_type) + { + case WGPUErrorType_Validation: error_type_lbl = "Validation"; break; + case WGPUErrorType_OutOfMemory: error_type_lbl = "Out of memory"; break; + case WGPUErrorType_Unknown: error_type_lbl = "Unknown"; break; + case WGPUErrorType_DeviceLost: error_type_lbl = "Device lost"; break; + default: error_type_lbl = "Unknown"; + } + printf("%s error: %s\n", error_type_lbl, message); +} diff --git a/ImGui/examples/example_emscripten_wgpu/web/index.html b/ImGui/examples/example_emscripten_wgpu/web/index.html new file mode 100644 index 0000000..82b1c42 --- /dev/null +++ b/ImGui/examples/example_emscripten_wgpu/web/index.html @@ -0,0 +1,80 @@ + + + + + + Dear ImGui Emscripten+WebGPU example + + + + + + + diff --git a/ImGui/examples/example_glfw_metal/Makefile b/ImGui/examples/example_glfw_metal/Makefile new file mode 100644 index 0000000..82d5ac9 --- /dev/null +++ b/ImGui/examples/example_glfw_metal/Makefile @@ -0,0 +1,46 @@ +# +# You will need GLFW (http://www.glfw.org): +# brew install glfw +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_glfw_metal +IMGUI_DIR = ../.. +SOURCES = main.mm +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_metal.mm +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) + +LIBS = -framework Metal -framework MetalKit -framework Cocoa -framework IOKit -framework CoreVideo -framework QuartzCore +LIBS += -L/usr/local/lib -L/opt/homebrew/lib +LIBS += -lglfw + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include -I/opt/homebrew/include +CXXFLAGS += -Wall -Wformat +CFLAGS = $(CXXFLAGS) + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +all: $(EXE) + @echo Build complete + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_glfw_metal/main.mm b/ImGui/examples/example_glfw_metal/main.mm new file mode 100644 index 0000000..9617862 --- /dev/null +++ b/ImGui/examples/example_glfw_metal/main.mm @@ -0,0 +1,173 @@ +// Dear ImGui: standalone example application for GLFW + Metal, using programmable pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_metal.h" +#include + +#define GLFW_INCLUDE_NONE +#define GLFW_EXPOSE_NATIVE_COCOA +#include +#include + +#import +#import + +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "Glfw Error %d: %s\n", error, description); +} + +int main(int, char**) +{ + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Setup window + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Create window with graphics context + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Metal example", NULL, NULL); + if (window == NULL) + return 1; + + id device = MTLCreateSystemDefaultDevice(); + id commandQueue = [device newCommandQueue]; + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplMetal_Init(device); + + NSWindow *nswin = glfwGetCocoaWindow(window); + CAMetalLayer *layer = [CAMetalLayer layer]; + layer.device = device; + layer.pixelFormat = MTLPixelFormatBGRA8Unorm; + nswin.contentView.layer = layer; + nswin.contentView.wantsLayer = YES; + + MTLRenderPassDescriptor *renderPassDescriptor = [MTLRenderPassDescriptor new]; + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + float clear_color[4] = {0.45f, 0.55f, 0.60f, 1.00f}; + + // Main loop + while (!glfwWindowShouldClose(window)) + { + @autoreleasepool + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + glfwPollEvents(); + + int width, height; + glfwGetFramebufferSize(window, &width, &height); + layer.drawableSize = CGSizeMake(width, height); + id drawable = [layer nextDrawable]; + + id commandBuffer = [commandQueue commandBuffer]; + renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color[0] * clear_color[3], clear_color[1] * clear_color[3], clear_color[2] * clear_color[3], clear_color[3]); + renderPassDescriptor.colorAttachments[0].texture = drawable.texture; + renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; + renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; + id renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; + [renderEncoder pushDebugGroup:@"ImGui demo"]; + + // Start the Dear ImGui frame + ImGui_ImplMetal_NewFrame(renderPassDescriptor); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(), commandBuffer, renderEncoder); + + [renderEncoder popDebugGroup]; + [renderEncoder endEncoding]; + + [commandBuffer presentDrawable:drawable]; + [commandBuffer commit]; + } + } + + // Cleanup + ImGui_ImplMetal_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/ImGui/examples/example_glfw_opengl2/Makefile b/ImGui/examples/example_glfw_opengl2/Makefile new file mode 100644 index 0000000..1f15c15 --- /dev/null +++ b/ImGui/examples/example_glfw_opengl2/Makefile @@ -0,0 +1,81 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need GLFW (http://www.glfw.org): +# Linux: +# apt-get install libglfw-dev +# Mac OS X: +# brew install glfw +# MSYS2: +# pacman -S --noconfirm --needed mingw-w64-x86_64-toolchain mingw-w64-x86_64-glfw +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_glfw_opengl2 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl2.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL `pkg-config --static --libs glfw3` + + CXXFLAGS += `pkg-config --cflags glfw3` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo + LIBS += -L/usr/local/lib -L/opt/local/lib -L/opt/homebrew/lib + #LIBS += -lglfw3 + LIBS += -lglfw + + CXXFLAGS += -I/usr/local/include -I/opt/local/include -I/opt/homebrew/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lglfw3 -lgdi32 -lopengl32 -limm32 + + CXXFLAGS += `pkg-config --cflags glfw3` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) + diff --git a/ImGui/examples/example_glfw_opengl2/build_win32.bat b/ImGui/examples/example_glfw_opengl2/build_win32.bat new file mode 100644 index 0000000..a0a75f9 --- /dev/null +++ b/ImGui/examples/example_glfw_opengl2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_glfw_opengl2 +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj b/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj new file mode 100644 index 0000000..faf6d9a --- /dev/null +++ b/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9CDA7840-B7A5-496D-A527-E95571496D18} + example_glfw_opengl2 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + + + true + ..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + + + true + ..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + ..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + ..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters b/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters new file mode 100644 index 0000000..b9efa1b --- /dev/null +++ b/ImGui/examples/example_glfw_opengl2/example_glfw_opengl2.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {c336cfe3-f0c4-464c-9ef0-a9e17a7ff222} + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_glfw_opengl2/main.cpp b/ImGui/examples/example_glfw_opengl2/main.cpp new file mode 100644 index 0000000..a8d0a8c --- /dev/null +++ b/ImGui/examples/example_glfw_opengl2/main.cpp @@ -0,0 +1,162 @@ +// Dear ImGui: standalone example application for GLFW + OpenGL2, using legacy fixed pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_glfw_opengl2/ folder** +// See imgui_impl_glfw.cpp for details. + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl2.h" +#include +#ifdef __APPLE__ +#define GL_SILENCE_DEPRECATION +#endif +#include + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Main code +int main(int, char**) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Create window with graphics context + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL2 example", NULL, NULL); + if (window == NULL) + return 1; + glfwMakeContextCurrent(window); + glfwSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL2_Init(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + while (!glfwWindowShouldClose(window)) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + glfwPollEvents(); + + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + + // If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!), + // you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below. + //GLint last_program; + //glGetIntegerv(GL_CURRENT_PROGRAM, &last_program); + //glUseProgram(0); + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + //glUseProgram(last_program); + + glfwMakeContextCurrent(window); + glfwSwapBuffers(window); + } + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/ImGui/examples/example_glfw_opengl3/Makefile b/ImGui/examples/example_glfw_opengl3/Makefile new file mode 100644 index 0000000..252ce57 --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/Makefile @@ -0,0 +1,89 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need GLFW (http://www.glfw.org): +# Linux: +# apt-get install libglfw-dev +# Mac OS X: +# brew install glfw +# MSYS2: +# pacman -S --noconfirm --needed mingw-w64-x86_64-toolchain mingw-w64-x86_64-glfw +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_glfw_opengl3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## OPENGL ES +##--------------------------------------------------------------------- + +## This assumes a GL ES library available in the system, e.g. libGLESv2.so +# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 +# LINUX_GL_LIBS = -lGLESv2 + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += $(LINUX_GL_LIBS) `pkg-config --static --libs glfw3` + + CXXFLAGS += `pkg-config --cflags glfw3` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo + LIBS += -L/usr/local/lib -L/opt/local/lib -L/opt/homebrew/lib + #LIBS += -lglfw3 + LIBS += -lglfw + + CXXFLAGS += -I/usr/local/include -I/opt/local/include -I/opt/homebrew/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lglfw3 -lgdi32 -lopengl32 -limm32 + + CXXFLAGS += `pkg-config --cflags glfw3` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_glfw_opengl3/Makefile.emscripten b/ImGui/examples/example_glfw_opengl3/Makefile.emscripten new file mode 100644 index 0000000..8ea4eac --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/Makefile.emscripten @@ -0,0 +1,91 @@ +# +# Makefile to use with GLFW+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glfw.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s USE_GLFW=3 -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +# LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/ImGui/examples/example_glfw_opengl3/build_win32.bat b/ImGui/examples/example_glfw_opengl3/build_win32.bat new file mode 100644 index 0000000..4ba58d8 --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_glfw_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 glfw3.lib opengl32.lib gdi32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj b/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj new file mode 100644 index 0000000..7721c8f --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4a1fb5ea-22f5-42a8-ab92-1d2df5d47fb9} + example_glfw_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + + + true + ..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + + + true + ..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + ..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + ..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + opengl32.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters b/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters new file mode 100644 index 0000000..1caab2c --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/example_glfw_opengl3.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_glfw_opengl3/main.cpp b/ImGui/examples/example_glfw_opengl3/main.cpp new file mode 100644 index 0000000..580aae8 --- /dev/null +++ b/ImGui/examples/example_glfw_opengl3/main.cpp @@ -0,0 +1,190 @@ +// Dear ImGui: standalone example application for GLFW + OpenGL 3, using programmable pipeline +// (GLFW is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_opengl3.h" +#include +#define GL_SILENCE_DEPRECATION +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#endif +#include // Will drag system OpenGL headers + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} + +// Main code +int main(int, char**) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API); +#elif defined(__APPLE__) + // GL 3.2 + GLSL 150 + const char* glsl_version = "#version 150"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Required on Mac +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + //glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 3.2+ only + //glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // 3.0+ only +#endif + + // Create window with graphics context + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL); + if (window == NULL) + return 1; + glfwMakeContextCurrent(window); + glfwSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForOpenGL(window, true); + ImGui_ImplOpenGL3_Init(glsl_version); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = NULL; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!glfwWindowShouldClose(window)) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + glfwPollEvents(); + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + int display_w, display_h; + glfwGetFramebufferSize(window, &display_w, &display_h); + glViewport(0, 0, display_w, display_h); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + + glfwSwapBuffers(window); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/ImGui/examples/example_glfw_vulkan/CMakeLists.txt b/ImGui/examples/example_glfw_vulkan/CMakeLists.txt new file mode 100644 index 0000000..a6e5bf9 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/CMakeLists.txt @@ -0,0 +1,45 @@ +# Example usage: +# mkdir build +# cd build +# cmake -g "Visual Studio 14 2015" .. + +cmake_minimum_required(VERSION 2.8) +project(imgui_example_glfw_vulkan C CXX) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Debug CACHE STRING "" FORCE) +endif() + +set(CMAKE_CXX_STANDARD 11) +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DVK_PROTOTYPES") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_PROTOTYPES") + +# GLFW +set(GLFW_DIR ../../../glfw) # Set this to point to an up-to-date GLFW repo +option(GLFW_BUILD_EXAMPLES "Build the GLFW example programs" OFF) +option(GLFW_BUILD_TESTS "Build the GLFW test programs" OFF) +option(GLFW_BUILD_DOCS "Build the GLFW documentation" OFF) +option(GLFW_INSTALL "Generate installation target" OFF) +option(GLFW_DOCUMENT_INTERNALS "Include internals in documentation" OFF) +add_subdirectory(${GLFW_DIR} binary_dir EXCLUDE_FROM_ALL) +include_directories(${GLFW_DIR}/include) + +# Dear ImGui +set(IMGUI_DIR ../../) +include_directories(${IMGUI_DIR} ${IMGUI_DIR}/backends ..) + +# Libraries +find_package(Vulkan REQUIRED) +#find_library(VULKAN_LIBRARY + #NAMES vulkan vulkan-1) +#set(LIBRARIES "glfw;${VULKAN_LIBRARY}") +set(LIBRARIES "glfw;Vulkan::Vulkan") + +# Use vulkan headers from glfw: +include_directories(${GLFW_DIR}/deps) + +file(GLOB sources *.cpp) + +add_executable(example_glfw_vulkan ${sources} ${IMGUI_DIR}/backends/imgui_impl_glfw.cpp ${IMGUI_DIR}/backends/imgui_impl_vulkan.cpp ${IMGUI_DIR}/imgui.cpp ${IMGUI_DIR}/imgui_draw.cpp ${IMGUI_DIR}/imgui_demo.cpp ${IMGUI_DIR}/imgui_tables.cpp ${IMGUI_DIR}/imgui_widgets.cpp) +target_link_libraries(example_glfw_vulkan ${LIBRARIES}) +target_compile_definitions(example_glfw_vulkan PUBLIC -DImTextureID=ImU64) diff --git a/ImGui/examples/example_glfw_vulkan/build_win32.bat b/ImGui/examples/example_glfw_vulkan/build_win32.bat new file mode 100644 index 0000000..82f0111 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/build_win32.bat @@ -0,0 +1,14 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. + +@set OUT_EXE=example_glfw_vulkan +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-32 /libpath:%VULKAN_SDK%\lib32 glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + +@set OUT_DIR=Release +mkdir %OUT_DIR% +cl /nologo /Zi /MD /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_glfw_vulkan/build_win64.bat b/ImGui/examples/example_glfw_vulkan/build_win64.bat new file mode 100644 index 0000000..0bf7936 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/build_win64.bat @@ -0,0 +1,13 @@ +@REM Build for Visual Studio compiler. Run your copy of amd64/vcvars32.bat to setup 64-bit command-line compiler. + +@set INCLUDES=/I..\.. /I..\..\backends /I..\libs\glfw\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\backends\imgui_impl_glfw.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:..\libs\glfw\lib-vc2010-64 /libpath:%VULKAN_SDK%\lib glfw3.lib opengl32.lib gdi32.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + +@set OUT_DIR=Release +mkdir %OUT_DIR% +cl /nologo /Zi /MD /Ox /Oi %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj b/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj new file mode 100644 index 0000000..ed8fe96 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80} + example_glfw_vulkan + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + %VULKAN_SDK%\lib32;..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + vulkan-1.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + %VULKAN_SDK%\lib;..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + vulkan-1.lib;glfw3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + true + true + %VULKAN_SDK%\lib32;..\libs\glfw\lib-vc2010-32;%(AdditionalLibraryDirectories) + vulkan-1.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;..\libs\glfw\include;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + true + true + %VULKAN_SDK%\lib;..\libs\glfw\lib-vc2010-64;%(AdditionalLibraryDirectories) + vulkan-1.lib;glfw3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters b/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters new file mode 100644 index 0000000..234da21 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/example_glfw_vulkan.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_glfw_vulkan/main.cpp b/ImGui/examples/example_glfw_vulkan/main.cpp new file mode 100644 index 0000000..00d1c88 --- /dev/null +++ b/ImGui/examples/example_glfw_vulkan/main.cpp @@ -0,0 +1,560 @@ +// Dear ImGui: standalone example application for Glfw + Vulkan +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +// You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#include "imgui.h" +#include "imgui_impl_glfw.h" +#include "imgui_impl_vulkan.h" +#include // printf, fprintf +#include // abort +#define GLFW_INCLUDE_NONE +#define GLFW_INCLUDE_VULKAN +#include +#include + +// [Win32] Our example includes a copy of glfw3.lib pre-compiled with VS2010 to maximize ease of testing and compatibility with old VS compilers. +// To link with VS2010-era libraries, VS2015+ requires linking with legacy_stdio_definitions.lib, which we do using this pragma. +// Your own project should not be affected, as you are likely to link with a newer binary of GLFW that is adequate for your version of Visual Studio. +#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#pragma comment(lib, "legacy_stdio_definitions") +#endif + +//#define IMGUI_UNLIMITED_FRAME_RATE +#ifdef _DEBUG +#define IMGUI_VULKAN_DEBUG_REPORT +#endif + +// Data +static VkAllocationCallbacks* g_Allocator = NULL; +static VkInstance g_Instance = VK_NULL_HANDLE; +static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; +static VkDevice g_Device = VK_NULL_HANDLE; +static uint32_t g_QueueFamily = (uint32_t)-1; +static VkQueue g_Queue = VK_NULL_HANDLE; +static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; +static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE; +static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; + +static ImGui_ImplVulkanH_Window g_MainWindowData; +static int g_MinImageCount = 2; +static bool g_SwapChainRebuild = false; + +static void glfw_error_callback(int error, const char* description) +{ + fprintf(stderr, "GLFW Error %d: %s\n", error, description); +} +static void check_vk_result(VkResult err) +{ + if (err == 0) + return; + fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); + if (err < 0) + abort(); +} + +#ifdef IMGUI_VULKAN_DEBUG_REPORT +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) +{ + (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments + fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); + return VK_FALSE; +} +#endif // IMGUI_VULKAN_DEBUG_REPORT + +static void SetupVulkan(const char** extensions, uint32_t extensions_count) +{ + VkResult err; + + // Create Vulkan Instance + { + VkInstanceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + create_info.enabledExtensionCount = extensions_count; + create_info.ppEnabledExtensionNames = extensions; +#ifdef IMGUI_VULKAN_DEBUG_REPORT + // Enabling validation layers + const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; + create_info.enabledLayerCount = 1; + create_info.ppEnabledLayerNames = layers; + + // Enable debug report extension (we need additional storage, so we duplicate the user array to add our new extension to it) + const char** extensions_ext = (const char**)malloc(sizeof(const char*) * (extensions_count + 1)); + memcpy(extensions_ext, extensions, extensions_count * sizeof(const char*)); + extensions_ext[extensions_count] = "VK_EXT_debug_report"; + create_info.enabledExtensionCount = extensions_count + 1; + create_info.ppEnabledExtensionNames = extensions_ext; + + // Create Vulkan Instance + err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); + check_vk_result(err); + free(extensions_ext); + + // Get the function pointer (required for any extensions) + auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); + IM_ASSERT(vkCreateDebugReportCallbackEXT != NULL); + + // Setup the debug report callback + VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; + debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; + debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + debug_report_ci.pfnCallback = debug_report; + debug_report_ci.pUserData = NULL; + err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); + check_vk_result(err); +#else + // Create Vulkan Instance without any debug feature + err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); + check_vk_result(err); + IM_UNUSED(g_DebugReport); +#endif + } + + // Select GPU + { + uint32_t gpu_count; + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, NULL); + check_vk_result(err); + IM_ASSERT(gpu_count > 0); + + VkPhysicalDevice* gpus = (VkPhysicalDevice*)malloc(sizeof(VkPhysicalDevice) * gpu_count); + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus); + check_vk_result(err); + + // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers + // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple + // dedicated GPUs) is out of scope of this sample. + int use_gpu = 0; + for (int i = 0; i < (int)gpu_count; i++) + { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(gpus[i], &properties); + if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + { + use_gpu = i; + break; + } + } + + g_PhysicalDevice = gpus[use_gpu]; + free(gpus); + } + + // Select graphics queue family + { + uint32_t count; + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, NULL); + VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); + for (uint32_t i = 0; i < count; i++) + if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + g_QueueFamily = i; + break; + } + free(queues); + IM_ASSERT(g_QueueFamily != (uint32_t)-1); + } + + // Create Logical Device (with 1 queue) + { + int device_extension_count = 1; + const char* device_extensions[] = { "VK_KHR_swapchain" }; + const float queue_priority[] = { 1.0f }; + VkDeviceQueueCreateInfo queue_info[1] = {}; + queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_info[0].queueFamilyIndex = g_QueueFamily; + queue_info[0].queueCount = 1; + queue_info[0].pQueuePriorities = queue_priority; + VkDeviceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); + create_info.pQueueCreateInfos = queue_info; + create_info.enabledExtensionCount = device_extension_count; + create_info.ppEnabledExtensionNames = device_extensions; + err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); + check_vk_result(err); + vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); + } + + // Create Descriptor Pool + { + VkDescriptorPoolSize pool_sizes[] = + { + { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } + }; + VkDescriptorPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes); + pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); + check_vk_result(err); + } +} + +// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. +// Your real engine/app may not use them. +static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) +{ + wd->Surface = surface; + + // Check for WSI support + VkBool32 res; + vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); + if (res != VK_TRUE) + { + fprintf(stderr, "Error no WSI support on physical device 0\n"); + exit(-1); + } + + // Select Surface Format + const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; + const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; + wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); + + // Select Present Mode +#ifdef IMGUI_UNLIMITED_FRAME_RATE + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; +#else + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; +#endif + wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); + //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); + + // Create SwapChain, RenderPass, Framebuffer, etc. + IM_ASSERT(g_MinImageCount >= 2); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +} + +static void CleanupVulkan() +{ + vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); + +#ifdef IMGUI_VULKAN_DEBUG_REPORT + // Remove the debug report callback + auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); + vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // IMGUI_VULKAN_DEBUG_REPORT + + vkDestroyDevice(g_Device, g_Allocator); + vkDestroyInstance(g_Instance, g_Allocator); +} + +static void CleanupVulkanWindow() +{ + ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); +} + +static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) +{ + VkResult err; + + VkSemaphore image_acquired_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; + { + err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking + check_vk_result(err); + + err = vkResetFences(g_Device, 1, &fd->Fence); + check_vk_result(err); + } + { + err = vkResetCommandPool(g_Device, fd->CommandPool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(fd->CommandBuffer, &info); + check_vk_result(err); + } + { + VkRenderPassBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + info.renderPass = wd->RenderPass; + info.framebuffer = fd->Framebuffer; + info.renderArea.extent.width = wd->Width; + info.renderArea.extent.height = wd->Height; + info.clearValueCount = 1; + info.pClearValues = &wd->ClearValue; + vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); + } + + // Record dear imgui primitives into command buffer + ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); + + // Submit command buffer + vkCmdEndRenderPass(fd->CommandBuffer); + { + VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + VkSubmitInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &image_acquired_semaphore; + info.pWaitDstStageMask = &wait_stage; + info.commandBufferCount = 1; + info.pCommandBuffers = &fd->CommandBuffer; + info.signalSemaphoreCount = 1; + info.pSignalSemaphores = &render_complete_semaphore; + + err = vkEndCommandBuffer(fd->CommandBuffer); + check_vk_result(err); + err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); + check_vk_result(err); + } +} + +static void FramePresent(ImGui_ImplVulkanH_Window* wd) +{ + if (g_SwapChainRebuild) + return; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + VkPresentInfoKHR info = {}; + info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &render_complete_semaphore; + info.swapchainCount = 1; + info.pSwapchains = &wd->Swapchain; + info.pImageIndices = &wd->FrameIndex; + VkResult err = vkQueuePresentKHR(g_Queue, &info); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores +} + +// Main code +int main(int, char**) +{ + glfwSetErrorCallback(glfw_error_callback); + if (!glfwInit()) + return 1; + + // Create window with Vulkan context + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+Vulkan example", NULL, NULL); + if (!glfwVulkanSupported()) + { + printf("GLFW: Vulkan Not Supported\n"); + return 1; + } + uint32_t extensions_count = 0; + const char** extensions = glfwGetRequiredInstanceExtensions(&extensions_count); + SetupVulkan(extensions, extensions_count); + + // Create Window Surface + VkSurfaceKHR surface; + VkResult err = glfwCreateWindowSurface(g_Instance, window, g_Allocator, &surface); + check_vk_result(err); + + // Create Framebuffers + int w, h; + glfwGetFramebufferSize(window, &w, &h); + ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; + SetupVulkanWindow(wd, surface, w, h); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplGlfw_InitForVulkan(window, true); + ImGui_ImplVulkan_InitInfo init_info = {}; + init_info.Instance = g_Instance; + init_info.PhysicalDevice = g_PhysicalDevice; + init_info.Device = g_Device; + init_info.QueueFamily = g_QueueFamily; + init_info.Queue = g_Queue; + init_info.PipelineCache = g_PipelineCache; + init_info.DescriptorPool = g_DescriptorPool; + init_info.Subpass = 0; + init_info.MinImageCount = g_MinImageCount; + init_info.ImageCount = wd->ImageCount; + init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; + init_info.Allocator = g_Allocator; + init_info.CheckVkResultFn = check_vk_result; + ImGui_ImplVulkan_Init(&init_info, wd->RenderPass); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Upload Fonts + { + // Use any command queue + VkCommandPool command_pool = wd->Frames[wd->FrameIndex].CommandPool; + VkCommandBuffer command_buffer = wd->Frames[wd->FrameIndex].CommandBuffer; + + err = vkResetCommandPool(g_Device, command_pool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo begin_info = {}; + begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + begin_info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(command_buffer, &begin_info); + check_vk_result(err); + + ImGui_ImplVulkan_CreateFontsTexture(command_buffer); + + VkSubmitInfo end_info = {}; + end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + end_info.commandBufferCount = 1; + end_info.pCommandBuffers = &command_buffer; + err = vkEndCommandBuffer(command_buffer); + check_vk_result(err); + err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE); + check_vk_result(err); + + err = vkDeviceWaitIdle(g_Device); + check_vk_result(err); + ImGui_ImplVulkan_DestroyFontUploadObjects(); + } + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + while (!glfwWindowShouldClose(window)) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + glfwPollEvents(); + + // Resize swap chain? + if (g_SwapChainRebuild) + { + int width, height; + glfwGetFramebufferSize(window, &width, &height); + if (width > 0 && height > 0) + { + ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); + g_MainWindowData.FrameIndex = 0; + g_SwapChainRebuild = false; + } + } + + // Start the Dear ImGui frame + ImGui_ImplVulkan_NewFrame(); + ImGui_ImplGlfw_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); + if (!is_minimized) + { + wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; + wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; + wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; + wd->ClearValue.color.float32[3] = clear_color.w; + FrameRender(wd, draw_data); + FramePresent(wd); + } + } + + // Cleanup + err = vkDeviceWaitIdle(g_Device); + check_vk_result(err); + ImGui_ImplVulkan_Shutdown(); + ImGui_ImplGlfw_Shutdown(); + ImGui::DestroyContext(); + + CleanupVulkanWindow(); + CleanupVulkan(); + + glfwDestroyWindow(window); + glfwTerminate(); + + return 0; +} diff --git a/ImGui/examples/example_glut_opengl2/Makefile b/ImGui/examples/example_glut_opengl2/Makefile new file mode 100644 index 0000000..7af289d --- /dev/null +++ b/ImGui/examples/example_glut_opengl2/Makefile @@ -0,0 +1,75 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# Linux: +# apt-get install freeglut3-dev +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_glut_opengl2 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_glut.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl2.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL -lglut + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework GLUT + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 +ifeq ($(shell pkg-config freeglut --exists 2> /dev/null && echo yes || echo no),yes) + CXXFLAGS += $(shell pkg-config freeglut --cflags) + LIBS += $(shell pkg-config freeglut --libs) +else + LIBS += -lglut +endif + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj b/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj new file mode 100644 index 0000000..4c9d00f --- /dev/null +++ b/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {F90D0333-5FB1-440D-918D-DD39A1B5187E} + example_glut_opengl2 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + + + true + $(GLUT_ROOT_PATH)/lib;%(AdditionalLibraryDirectories) + opengl32.lib;freeglut.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + + + true + $(GLUT_ROOT_PATH)/lib/x64;%(AdditionalLibraryDirectories) + opengl32.lib;freeglut.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + false + + + true + true + true + $(GLUT_ROOT_PATH)/lib;%(AdditionalLibraryDirectories) + opengl32.lib;freeglut.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + $(GLUT_INCLUDE_DIR);..\..;..\..\backends;%(AdditionalIncludeDirectories) + false + + + true + true + true + $(GLUT_ROOT_PATH)/lib/x64;%(AdditionalLibraryDirectories) + opengl32.lib;freeglut.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters b/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters new file mode 100644 index 0000000..3c017ba --- /dev/null +++ b/ImGui/examples/example_glut_opengl2/example_glut_opengl2.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {c336cfe3-f0c4-464c-9ef0-a9e17a7ff222} + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + sources + + + diff --git a/ImGui/examples/example_glut_opengl2/main.cpp b/ImGui/examples/example_glut_opengl2/main.cpp new file mode 100644 index 0000000..bde1f16 --- /dev/null +++ b/ImGui/examples/example_glut_opengl2/main.cpp @@ -0,0 +1,159 @@ +// Dear ImGui: standalone example application for GLUT/FreeGLUT + OpenGL2, using legacy fixed pipeline +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// !!! GLUT/FreeGLUT IS OBSOLETE PREHISTORIC SOFTWARE. Using GLUT is not recommended unless you really miss the 90's. !!! +// !!! If someone or something is teaching you GLUT today, you are being abused. Please show some resistance. !!! +// !!! Nowadays, prefer using GLFW or SDL instead! + +// On Windows, you can install Freeglut using vcpkg: +// git clone https://github.com/Microsoft/vcpkg +// cd vcpkg +// bootstrap - vcpkg.bat +// vcpkg install freeglut --triplet=x86-windows ; for win32 +// vcpkg install freeglut --triplet=x64-windows ; for win64 +// vcpkg integrate install ; register include and libs in Visual Studio + +#include "imgui.h" +#include "imgui_impl_glut.h" +#include "imgui_impl_opengl2.h" +#define GL_SILENCE_DEPRECATION +#ifdef __APPLE__ +#include +#else +#include +#endif + +#ifdef _MSC_VER +#pragma warning (disable: 4505) // unreferenced local function has been removed +#endif + +// Forward declarations of helper functions +void MainLoopStep(); + +// Our state +static bool show_demo_window = true; +static bool show_another_window = false; +static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + +int main(int argc, char** argv) +{ + // Create GLUT window + glutInit(&argc, argv); +#ifdef __FREEGLUT_EXT_H__ + glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_MULTISAMPLE); + glutInitWindowSize(1280, 720); + glutCreateWindow("Dear ImGui GLUT+OpenGL2 Example"); + + // Setup GLUT display function + // We will also call ImGui_ImplGLUT_InstallFuncs() to get all the other functions installed for us, + // otherwise it is possible to install our own functions and call the imgui_impl_glut.h functions ourselves. + glutDisplayFunc(MainLoopStep); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + // FIXME: Consider reworking this example to install our own GLUT funcs + forward calls ImGui_ImplGLUT_XXX ones, instead of using ImGui_ImplGLUT_InstallFuncs(). + ImGui_ImplGLUT_Init(); + ImGui_ImplOpenGL2_Init(); + + // Install GLUT handlers (glutReshapeFunc(), glutMotionFunc(), glutPassiveMotionFunc(), glutMouseFunc(), glutKeyboardFunc() etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + ImGui_ImplGLUT_InstallFuncs(); + + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Main loop + glutMainLoop(); + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplGLUT_Shutdown(); + ImGui::DestroyContext(); + + return 0; +} + +void MainLoopStep() +{ + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplGLUT_NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImGuiIO& io = ImGui::GetIO(); + glViewport(0, 0, (GLsizei)io.DisplaySize.x, (GLsizei)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound, but prefer using the GL3+ code. + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + + glutSwapBuffers(); + glutPostRedisplay(); +} diff --git a/ImGui/examples/example_null/Makefile b/ImGui/examples/example_null/Makefile new file mode 100644 index 0000000..9ceb353 --- /dev/null +++ b/ImGui/examples/example_null/Makefile @@ -0,0 +1,92 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# Important: This is a "null backend" application, with no visible output or interaction! +# This is used for testing purpose and continuous integration, and has little use for end-user. +# + +# Options +WITH_EXTRA_WARNINGS ?= 0 +WITH_FREETYPE ?= 0 + +EXE = example_null +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS += -std=c++11 -I$(IMGUI_DIR) +CXXFLAGS += -g -Wall -Wformat +LIBS = + +# We use the WITH_EXTRA_WARNINGS flag on our CI setup to eagerly catch zealous warnings +ifeq ($(WITH_EXTRA_WARNINGS), 1) + CXXFLAGS += -Wno-zero-as-null-pointer-constant -Wno-double-promotion -Wno-variadic-macros +endif + +# We use the WITH_FREETYPE flag on our CI setup to test compiling misc/freetype/imgui_freetype.cpp +# (only supported on Linux, and note that the imgui_freetype code currently won't be executed) +ifeq ($(WITH_FREETYPE), 1) + SOURCES += $(IMGUI_DIR)/misc/freetype/imgui_freetype.cpp + CXXFLAGS += $(shell pkg-config --cflags freetype2) + LIBS += $(shell pkg-config --libs freetype2) +endif + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + ifeq ($(WITH_EXTRA_WARNINGS), 1) + CXXFLAGS += -Wextra -Wpedantic + ifeq ($(shell $(CXX) -v 2>&1 | grep -c "clang version"), 1) + CXXFLAGS += -Wshadow -Wsign-conversion + endif + endif + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + ifeq ($(WITH_EXTRA_WARNINGS), 1) + CXXFLAGS += -Weverything -Wno-reserved-id-macro -Wno-c++98-compat-pedantic -Wno-padded -Wno-poison-system-directories + endif + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + ifeq ($(WITH_EXTRA_WARNINGS), 1) + CXXFLAGS += -Wextra -Wpedantic + endif + LIBS += -limm32 + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/misc/freetype/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_null/build_win32.bat b/ImGui/examples/example_null/build_win32.bat new file mode 100644 index 0000000..0cdfdc9 --- /dev/null +++ b/ImGui/examples/example_null/build_win32.bat @@ -0,0 +1,3 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +mkdir Debug +cl /nologo /Zi /MD /I ..\.. %* *.cpp ..\..\*.cpp /FeDebug/example_null.exe /FoDebug/ /link gdi32.lib shell32.lib imm32.lib diff --git a/ImGui/examples/example_null/main.cpp b/ImGui/examples/example_null/main.cpp new file mode 100644 index 0000000..72381f0 --- /dev/null +++ b/ImGui/examples/example_null/main.cpp @@ -0,0 +1,37 @@ +// dear imgui: "null" example application +// (compile and link imgui, create context, run headless with NO INPUTS, NO GRAPHICS OUTPUT) +// This is useful to test building, but you cannot interact with anything here! +#include "imgui.h" +#include + +int main(int, char**) +{ + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + + // Build atlas + unsigned char* tex_pixels = NULL; + int tex_w, tex_h; + io.Fonts->GetTexDataAsRGBA32(&tex_pixels, &tex_w, &tex_h); + + for (int n = 0; n < 20; n++) + { + printf("NewFrame() %d\n", n); + io.DisplaySize = ImVec2(1920, 1080); + io.DeltaTime = 1.0f / 60.0f; + ImGui::NewFrame(); + + static float f = 0.0f; + ImGui::Text("Hello, world!"); + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::ShowDemoWindow(NULL); + + ImGui::Render(); + } + + printf("DestroyContext()\n"); + ImGui::DestroyContext(); + return 0; +} diff --git a/ImGui/examples/example_sdl2_directx11/build_win32.bat b/ImGui/examples/example_sdl2_directx11/build_win32.bat new file mode 100644 index 0000000..54f30fc --- /dev/null +++ b/ImGui/examples/example_sdl2_directx11/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_directx11 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj b/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj new file mode 100644 index 0000000..27da483 --- /dev/null +++ b/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9E1987E3-1F19-45CA-B9C9-D31E791836D8} + example_sdl2_directx11 + 8.1 + example_sdl2_directx11 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x86;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters b/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters new file mode 100644 index 0000000..3476d84 --- /dev/null +++ b/ImGui/examples/example_sdl2_directx11/example_sdl2_directx11.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6} + + + {08e36723-ce4f-4cff-9662-c40801cf1acf} + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + sources + + + imgui + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl2_metal/Makefile b/ImGui/examples/example_sdl2_metal/Makefile new file mode 100644 index 0000000..53c5f75 --- /dev/null +++ b/ImGui/examples/example_sdl2_metal/Makefile @@ -0,0 +1,47 @@ +# +# You will need SDL2 (http://www.libsdl.org): +# brew install sdl2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_metal +IMGUI_DIR = ../.. +SOURCES = main.mm +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_metal.mm +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) + +LIBS = -framework Metal -framework MetalKit -framework Cocoa -framework IOKit -framework CoreVideo -framework QuartzCore +LIBS += `sdl2-config --libs` +LIBS += -L/usr/local/lib + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends -I/usr/local/include +CXXFLAGS += `sdl2-config --cflags` +CXXFLAGS += -Wall -Wformat +CFLAGS = $(CXXFLAGS) + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.mm + $(CXX) $(CXXFLAGS) -ObjC++ -fobjc-weak -fobjc-arc -c -o $@ $< + +all: $(EXE) + @echo Build complete + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_sdl2_metal/main.mm b/ImGui/examples/example_sdl2_metal/main.mm new file mode 100644 index 0000000..ae5f4d4 --- /dev/null +++ b/ImGui/examples/example_sdl2_metal/main.mm @@ -0,0 +1,185 @@ +// Dear ImGui: standalone example application for SDL2 + Metal +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_metal.h" +#include +#include + +#import +#import + +int main(int, char**) +{ + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Setup SDL + // (Some versions of SDL before <2.0.10 appears to have performance/stalling issues on a minority of Windows systems, + // depending on whether SDL_INIT_GAMECONTROLLER is enabled or disabled.. updating to latest version of SDL is recommended!) + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // Inform SDL that we will be using metal for rendering. Without this hint initialization of metal renderer may fail. + SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); + + // Enable native IME. + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL+Metal example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + if (window == NULL) + { + printf("Error creating window: %s\n", SDL_GetError()); + return -2; + } + + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + if (renderer == NULL) + { + printf("Error creating renderer: %s\n", SDL_GetError()); + return -3; + } + + // Setup Platform/Renderer backends + CAMetalLayer* layer = (__bridge CAMetalLayer*)SDL_RenderGetMetalLayer(renderer); + layer.pixelFormat = MTLPixelFormatBGRA8Unorm; + ImGui_ImplMetal_Init(layer.device); + ImGui_ImplSDL2_InitForMetal(window); + + id commandQueue = [layer.device newCommandQueue]; + MTLRenderPassDescriptor* renderPassDescriptor = [MTLRenderPassDescriptor new]; + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + float clear_color[4] = {0.45f, 0.55f, 0.60f, 1.00f}; + + // Main loop + bool done = false; + while (!done) + { + @autoreleasepool + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + int width, height; + SDL_GetRendererOutputSize(renderer, &width, &height); + layer.drawableSize = CGSizeMake(width, height); + id drawable = [layer nextDrawable]; + + id commandBuffer = [commandQueue commandBuffer]; + renderPassDescriptor.colorAttachments[0].clearColor = MTLClearColorMake(clear_color[0] * clear_color[3], clear_color[1] * clear_color[3], clear_color[2] * clear_color[3], clear_color[3]); + renderPassDescriptor.colorAttachments[0].texture = drawable.texture; + renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; + renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; + id renderEncoder = [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; + [renderEncoder pushDebugGroup:@"ImGui demo"]; + + // Start the Dear ImGui frame + ImGui_ImplMetal_NewFrame(renderPassDescriptor); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImGui_ImplMetal_RenderDrawData(ImGui::GetDrawData(), commandBuffer, renderEncoder); + + [renderEncoder popDebugGroup]; + [renderEncoder endEncoding]; + + [commandBuffer presentDrawable:drawable]; + [commandBuffer commit]; + } + } + + // Cleanup + ImGui_ImplMetal_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_sdl2_opengl2/Makefile b/ImGui/examples/example_sdl2_opengl2/Makefile new file mode 100644 index 0000000..a85ced0 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/Makefile @@ -0,0 +1,79 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_opengl2 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl2.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_sdl2_opengl2/README.md b/ImGui/examples/example_sdl2_opengl2/README.md new file mode 100644 index 0000000..40a49e6 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/README.md @@ -0,0 +1,29 @@ + +# How to Build + +- On Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl2.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl2.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/ImGui/examples/example_sdl2_opengl2/build_win32.bat b/ImGui/examples/example_sdl2_opengl2/build_win32.bat new file mode 100644 index 0000000..287a418 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl2 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl2.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj b/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj new file mode 100644 index 0000000..a551511 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741} + example_sdl2_opengl2 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters b/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters new file mode 100644 index 0000000..0419ea0 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/example_sdl2_opengl2.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl2_opengl2/main.cpp b/ImGui/examples/example_sdl2_opengl2/main.cpp new file mode 100644 index 0000000..e569624 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl2/main.cpp @@ -0,0 +1,161 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// **DO NOT USE THIS CODE IF YOUR CODE/ENGINE IS USING MODERN OPENGL (SHADERS, VBO, VAO, etc.)** +// **Prefer using the code in the example_sdl2_opengl3/ folder** +// See imgui_impl_sdl2.cpp for details. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_opengl2.h" +#include +#include +#include + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Setup window + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL2_Init(); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + //glUseProgram(0); // You may want this if using this code in an OpenGL 3+ context where shaders may be bound + ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } + + // Cleanup + ImGui_ImplOpenGL2_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_sdl2_opengl3/Makefile b/ImGui/examples/example_sdl2_opengl3/Makefile new file mode 100644 index 0000000..5b4f941 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/Makefile @@ -0,0 +1,91 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_opengl3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## OPENGL ES +##--------------------------------------------------------------------- + +## This assumes a GL ES library available in the system, e.g. libGLESv2.so +# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 +# LINUX_GL_LIBS = -lGLESv2 +## If you're on a Raspberry Pi and want to use the legacy drivers, +## use the following instead: +# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += $(LINUX_GL_LIBS) -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_sdl2_opengl3/Makefile.emscripten b/ImGui/examples/example_sdl2_opengl3/Makefile.emscripten new file mode 100644 index 0000000..da03484 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/Makefile.emscripten @@ -0,0 +1,92 @@ +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/ImGui/examples/example_sdl2_opengl3/README.md b/ImGui/examples/example_sdl2_opengl3/README.md new file mode 100644 index 0000000..9ecb9e9 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/README.md @@ -0,0 +1,57 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib opengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl2-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl2-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +**Building** + +You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. +- Then build using `make -f Makefile.emscripten` while in the current directory. + +**Running an Emscripten project** + +To run on a local machine: +- `make -f Makefile.emscripten serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver. Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
+_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ +- Emscripten SDK has a handy `emrun` command: `emrun web/index.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. +- You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). +- You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. +- If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/ImGui/examples/example_sdl2_opengl3/build_win32.bat b/ImGui/examples/example_sdl2_opengl3/build_win32.bat new file mode 100644 index 0000000..abbf3c7 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj b/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj new file mode 100644 index 0000000..d45705e --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BBAEB705-1669-40F3-8567-04CF6A991F4C} + example_sdl2_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters b/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters new file mode 100644 index 0000000..fbc39b1 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/example_sdl2_opengl3.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl2_opengl3/main.cpp b/ImGui/examples/example_sdl2_opengl3/main.cpp new file mode 100644 index 0000000..39c0db2 --- /dev/null +++ b/ImGui/examples/example_sdl2_opengl3/main.cpp @@ -0,0 +1,198 @@ +// Dear ImGui: standalone example application for SDL2 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_opengl3.h" +#include +#include +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#else +#include +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) + // GL 3.2 Core + GLSL 150 + const char* glsl_version = "#version 150"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with graphics context + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL3_Init(glsl_version); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = NULL; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!done) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_sdl2_sdlrenderer/Makefile b/ImGui/examples/example_sdl2_sdlrenderer/Makefile new file mode 100644 index 0000000..0050f0e --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/Makefile @@ -0,0 +1,79 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL2 (http://www.libsdl.org): +# Linux: +# apt-get install libsdl2-dev +# Mac OS X: +# brew install sdl2 +# MSYS2: +# pacman -S mingw-w64-i686-SDL2 +# + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl2_sdlrenderer +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl2.cpp $(IMGUI_DIR)/backends/imgui_impl_sdlrenderer.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += -lGL -ldl `sdl2-config --libs` + + CXXFLAGS += `sdl2-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl2-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl2-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl2` + + CXXFLAGS += `pkg-config --cflags sdl2` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_sdl2_sdlrenderer/README.md b/ImGui/examples/example_sdl2_sdlrenderer/README.md new file mode 100644 index 0000000..4fa3743 --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/README.md @@ -0,0 +1,25 @@ + +# How to Build + +- On Windows with Visual Studio's CLI + +``` +set SDL2_DIR=path_to_your_sdl2_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp /FeDebug/example_sdl2_sdlrenderer.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL2.lib SDL2main.lib /subsystem:console +``` + +- On Linux and similar Unixes + +``` +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer.cpp ../../imgui*.cpp `sdl2-config --libs` -lGL +``` + +- On Mac OS X + +``` +brew install sdl2 +c++ `sdl2-config --cflags` -I .. -I ../.. main.cpp ../../backends/imgui_impl_sdl2.cpp ../../backends/imgui_impl_sdlrenderer.cpp ../../imgui*.cpp `sdl2-config --libs` -framework OpenGl +``` diff --git a/ImGui/examples/example_sdl2_sdlrenderer/build_win32.bat b/ImGui/examples/example_sdl2_sdlrenderer/build_win32.bat new file mode 100644 index 0000000..1bae121 --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl2_sdlrenderer_ +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_sdlrenderer.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 SDL2.lib SDL2main.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj b/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj new file mode 100644 index 0000000..df7e144 --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj @@ -0,0 +1,181 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {0C0B2BEA-311F-473C-9652-87923EF639E3} + example_sdl2_sdlrenderer + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + + + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL2_DIR%\include;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj.filters b/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj.filters new file mode 100644 index 0000000..6c8f5a1 --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/example_sdl2_sdlrenderer.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl2_sdlrenderer/main.cpp b/ImGui/examples/example_sdl2_sdlrenderer/main.cpp new file mode 100644 index 0000000..4961855 --- /dev/null +++ b/ImGui/examples/example_sdl2_sdlrenderer/main.cpp @@ -0,0 +1,164 @@ +// Dear ImGui: standalone example application for SDL2 + SDL_Renderer +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// Important to understand: SDL_Renderer is an _optional_ component of SDL. We do not recommend you use SDL_Renderer +// because it provides a rather limited API to the end-user. We provide this backend for the sake of completeness. +// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_sdlrenderer.h" +#include +#include + +#if !SDL_VERSION_ATLEAST(2,0,17) +#error This backend requires SDL 2.0.17+ because of SDL_RenderGeometry() function +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with SDL_Renderer graphics context + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+SDL_Renderer example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (renderer == NULL) + { + SDL_Log("Error creating SDL_Renderer!"); + return 0; + } + //SDL_RendererInfo info; + //SDL_GetRendererInfo(renderer, &info); + //SDL_Log("Current SDL_Renderer: %s", info.name); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForSDLRenderer(window, renderer); + ImGui_ImplSDLRenderer_Init(renderer); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplSDLRenderer_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + SDL_SetRenderDrawColor(renderer, (Uint8)(clear_color.x * 255), (Uint8)(clear_color.y * 255), (Uint8)(clear_color.z * 255), (Uint8)(clear_color.w * 255)); + SDL_RenderClear(renderer); + ImGui_ImplSDLRenderer_RenderDrawData(ImGui::GetDrawData()); + SDL_RenderPresent(renderer); + } + + // Cleanup + ImGui_ImplSDLRenderer_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + SDL_DestroyRenderer(renderer); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_sdl2_vulkan/build_win32.bat b/ImGui/examples/example_sdl2_vulkan/build_win32.bat new file mode 100644 index 0000000..5bc5198 --- /dev/null +++ b/ImGui/examples/example_sdl2_vulkan/build_win32.bat @@ -0,0 +1,10 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. + +@set OUT_EXE=example_sdl2_vulkan +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL2_DIR%\include /I %VULKAN_SDK%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl2.cpp ..\..\backends\imgui_impl_vulkan.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL2_DIR%\lib\x86 /libpath:%VULKAN_SDK%\lib32 SDL2.lib SDL2main.lib shell32.lib vulkan-1.lib + +@set OUT_DIR=Debug +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D ImTextureID=ImU64 %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj b/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj new file mode 100644 index 0000000..35282cc --- /dev/null +++ b/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj @@ -0,0 +1,185 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3} + example_sdl2_vulkan + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + true + true + %VULKAN_SDK%\lib32;%SDL2_DIR%\lib\x86;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%VULKAN_SDK%\include;%SDL2_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL2;%(AdditionalIncludeDirectories) + false + ImTextureID=ImU64;_MBCS;%(PreprocessorDefinitions) + + + true + true + true + %VULKAN_SDK%\lib;%SDL2_DIR%\lib\x64;%(AdditionalLibraryDirectories) + vulkan-1.lib;SDL2.lib;SDL2main.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters b/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters new file mode 100644 index 0000000..d3b1298 --- /dev/null +++ b/ImGui/examples/example_sdl2_vulkan/example_sdl2_vulkan.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl2_vulkan/main.cpp b/ImGui/examples/example_sdl2_vulkan/main.cpp new file mode 100644 index 0000000..7eb4a97 --- /dev/null +++ b/ImGui/examples/example_sdl2_vulkan/main.cpp @@ -0,0 +1,567 @@ +// Dear ImGui: standalone example application for SDL2 + Vulkan +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// Important note to the reader who wish to integrate imgui_impl_vulkan.cpp/.h in their own engine/app. +// - Common ImGui_ImplVulkan_XXX functions and structures are used to interface with imgui_impl_vulkan.cpp/.h. +// You will use those if you want to use this rendering backend in your engine/app. +// - Helper ImGui_ImplVulkanH_XXX functions and structures are only used by this example (main.cpp) and by +// the backend itself (imgui_impl_vulkan.cpp), but should PROBABLY NOT be used by your own engine/app code. +// Read comments in imgui_impl_vulkan.h. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" +#include "imgui_impl_vulkan.h" +#include // printf, fprintf +#include // abort +#include +#include +#include + +//#define IMGUI_UNLIMITED_FRAME_RATE +#ifdef _DEBUG +#define IMGUI_VULKAN_DEBUG_REPORT +#endif + +// Data +static VkAllocationCallbacks* g_Allocator = NULL; +static VkInstance g_Instance = VK_NULL_HANDLE; +static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE; +static VkDevice g_Device = VK_NULL_HANDLE; +static uint32_t g_QueueFamily = (uint32_t)-1; +static VkQueue g_Queue = VK_NULL_HANDLE; +static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE; +static VkPipelineCache g_PipelineCache = VK_NULL_HANDLE; +static VkDescriptorPool g_DescriptorPool = VK_NULL_HANDLE; + +static ImGui_ImplVulkanH_Window g_MainWindowData; +static uint32_t g_MinImageCount = 2; +static bool g_SwapChainRebuild = false; + +static void check_vk_result(VkResult err) +{ + if (err == 0) + return; + fprintf(stderr, "[vulkan] Error: VkResult = %d\n", err); + if (err < 0) + abort(); +} + +#ifdef IMGUI_VULKAN_DEBUG_REPORT +static VKAPI_ATTR VkBool32 VKAPI_CALL debug_report(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) +{ + (void)flags; (void)object; (void)location; (void)messageCode; (void)pUserData; (void)pLayerPrefix; // Unused arguments + fprintf(stderr, "[vulkan] Debug report from ObjectType: %i\nMessage: %s\n\n", objectType, pMessage); + return VK_FALSE; +} +#endif // IMGUI_VULKAN_DEBUG_REPORT + +static void SetupVulkan(const char** extensions, uint32_t extensions_count) +{ + VkResult err; + + // Create Vulkan Instance + { + VkInstanceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; + create_info.enabledExtensionCount = extensions_count; + create_info.ppEnabledExtensionNames = extensions; +#ifdef IMGUI_VULKAN_DEBUG_REPORT + // Enabling validation layers + const char* layers[] = { "VK_LAYER_KHRONOS_validation" }; + create_info.enabledLayerCount = 1; + create_info.ppEnabledLayerNames = layers; + + // Enable debug report extension (we need additional storage, so we duplicate the user array to add our new extension to it) + const char** extensions_ext = (const char**)malloc(sizeof(const char*) * (extensions_count + 1)); + memcpy(extensions_ext, extensions, extensions_count * sizeof(const char*)); + extensions_ext[extensions_count] = "VK_EXT_debug_report"; + create_info.enabledExtensionCount = extensions_count + 1; + create_info.ppEnabledExtensionNames = extensions_ext; + + // Create Vulkan Instance + err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); + check_vk_result(err); + free(extensions_ext); + + // Get the function pointer (required for any extensions) + auto vkCreateDebugReportCallbackEXT = (PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkCreateDebugReportCallbackEXT"); + IM_ASSERT(vkCreateDebugReportCallbackEXT != NULL); + + // Setup the debug report callback + VkDebugReportCallbackCreateInfoEXT debug_report_ci = {}; + debug_report_ci.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT; + debug_report_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; + debug_report_ci.pfnCallback = debug_report; + debug_report_ci.pUserData = NULL; + err = vkCreateDebugReportCallbackEXT(g_Instance, &debug_report_ci, g_Allocator, &g_DebugReport); + check_vk_result(err); +#else + // Create Vulkan Instance without any debug feature + err = vkCreateInstance(&create_info, g_Allocator, &g_Instance); + check_vk_result(err); + IM_UNUSED(g_DebugReport); +#endif + } + + // Select GPU + { + uint32_t gpu_count; + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, NULL); + check_vk_result(err); + IM_ASSERT(gpu_count > 0); + + VkPhysicalDevice* gpus = (VkPhysicalDevice*)malloc(sizeof(VkPhysicalDevice) * gpu_count); + err = vkEnumeratePhysicalDevices(g_Instance, &gpu_count, gpus); + check_vk_result(err); + + // If a number >1 of GPUs got reported, find discrete GPU if present, or use first one available. This covers + // most common cases (multi-gpu/integrated+dedicated graphics). Handling more complicated setups (multiple + // dedicated GPUs) is out of scope of this sample. + int use_gpu = 0; + for (int i = 0; i < (int)gpu_count; i++) + { + VkPhysicalDeviceProperties properties; + vkGetPhysicalDeviceProperties(gpus[i], &properties); + if (properties.deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU) + { + use_gpu = i; + break; + } + } + + g_PhysicalDevice = gpus[use_gpu]; + free(gpus); + } + + // Select graphics queue family + { + uint32_t count; + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, NULL); + VkQueueFamilyProperties* queues = (VkQueueFamilyProperties*)malloc(sizeof(VkQueueFamilyProperties) * count); + vkGetPhysicalDeviceQueueFamilyProperties(g_PhysicalDevice, &count, queues); + for (uint32_t i = 0; i < count; i++) + if (queues[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) + { + g_QueueFamily = i; + break; + } + free(queues); + IM_ASSERT(g_QueueFamily != (uint32_t)-1); + } + + // Create Logical Device (with 1 queue) + { + int device_extension_count = 1; + const char* device_extensions[] = { "VK_KHR_swapchain" }; + const float queue_priority[] = { 1.0f }; + VkDeviceQueueCreateInfo queue_info[1] = {}; + queue_info[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO; + queue_info[0].queueFamilyIndex = g_QueueFamily; + queue_info[0].queueCount = 1; + queue_info[0].pQueuePriorities = queue_priority; + VkDeviceCreateInfo create_info = {}; + create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO; + create_info.queueCreateInfoCount = sizeof(queue_info) / sizeof(queue_info[0]); + create_info.pQueueCreateInfos = queue_info; + create_info.enabledExtensionCount = device_extension_count; + create_info.ppEnabledExtensionNames = device_extensions; + err = vkCreateDevice(g_PhysicalDevice, &create_info, g_Allocator, &g_Device); + check_vk_result(err); + vkGetDeviceQueue(g_Device, g_QueueFamily, 0, &g_Queue); + } + + // Create Descriptor Pool + { + VkDescriptorPoolSize pool_sizes[] = + { + { VK_DESCRIPTOR_TYPE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1000 }, + { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1000 }, + { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, 1000 }, + { VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1000 } + }; + VkDescriptorPoolCreateInfo pool_info = {}; + pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + pool_info.maxSets = 1000 * IM_ARRAYSIZE(pool_sizes); + pool_info.poolSizeCount = (uint32_t)IM_ARRAYSIZE(pool_sizes); + pool_info.pPoolSizes = pool_sizes; + err = vkCreateDescriptorPool(g_Device, &pool_info, g_Allocator, &g_DescriptorPool); + check_vk_result(err); + } +} + +// All the ImGui_ImplVulkanH_XXX structures/functions are optional helpers used by the demo. +// Your real engine/app may not use them. +static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height) +{ + wd->Surface = surface; + + // Check for WSI support + VkBool32 res; + vkGetPhysicalDeviceSurfaceSupportKHR(g_PhysicalDevice, g_QueueFamily, wd->Surface, &res); + if (res != VK_TRUE) + { + fprintf(stderr, "Error no WSI support on physical device 0\n"); + exit(-1); + } + + // Select Surface Format + const VkFormat requestSurfaceImageFormat[] = { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_B8G8R8_UNORM, VK_FORMAT_R8G8B8_UNORM }; + const VkColorSpaceKHR requestSurfaceColorSpace = VK_COLORSPACE_SRGB_NONLINEAR_KHR; + wd->SurfaceFormat = ImGui_ImplVulkanH_SelectSurfaceFormat(g_PhysicalDevice, wd->Surface, requestSurfaceImageFormat, (size_t)IM_ARRAYSIZE(requestSurfaceImageFormat), requestSurfaceColorSpace); + + // Select Present Mode +#ifdef IMGUI_UNLIMITED_FRAME_RATE + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_MAILBOX_KHR, VK_PRESENT_MODE_IMMEDIATE_KHR, VK_PRESENT_MODE_FIFO_KHR }; +#else + VkPresentModeKHR present_modes[] = { VK_PRESENT_MODE_FIFO_KHR }; +#endif + wd->PresentMode = ImGui_ImplVulkanH_SelectPresentMode(g_PhysicalDevice, wd->Surface, &present_modes[0], IM_ARRAYSIZE(present_modes)); + //printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode); + + // Create SwapChain, RenderPass, Framebuffer, etc. + IM_ASSERT(g_MinImageCount >= 2); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); +} + +static void CleanupVulkan() +{ + vkDestroyDescriptorPool(g_Device, g_DescriptorPool, g_Allocator); + +#ifdef IMGUI_VULKAN_DEBUG_REPORT + // Remove the debug report callback + auto vkDestroyDebugReportCallbackEXT = (PFN_vkDestroyDebugReportCallbackEXT)vkGetInstanceProcAddr(g_Instance, "vkDestroyDebugReportCallbackEXT"); + vkDestroyDebugReportCallbackEXT(g_Instance, g_DebugReport, g_Allocator); +#endif // IMGUI_VULKAN_DEBUG_REPORT + + vkDestroyDevice(g_Device, g_Allocator); + vkDestroyInstance(g_Instance, g_Allocator); +} + +static void CleanupVulkanWindow() +{ + ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, &g_MainWindowData, g_Allocator); +} + +static void FrameRender(ImGui_ImplVulkanH_Window* wd, ImDrawData* draw_data) +{ + VkResult err; + + VkSemaphore image_acquired_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].ImageAcquiredSemaphore; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + + ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex]; + { + err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking + check_vk_result(err); + + err = vkResetFences(g_Device, 1, &fd->Fence); + check_vk_result(err); + } + { + err = vkResetCommandPool(g_Device, fd->CommandPool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(fd->CommandBuffer, &info); + check_vk_result(err); + } + { + VkRenderPassBeginInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; + info.renderPass = wd->RenderPass; + info.framebuffer = fd->Framebuffer; + info.renderArea.extent.width = wd->Width; + info.renderArea.extent.height = wd->Height; + info.clearValueCount = 1; + info.pClearValues = &wd->ClearValue; + vkCmdBeginRenderPass(fd->CommandBuffer, &info, VK_SUBPASS_CONTENTS_INLINE); + } + + // Record dear imgui primitives into command buffer + ImGui_ImplVulkan_RenderDrawData(draw_data, fd->CommandBuffer); + + // Submit command buffer + vkCmdEndRenderPass(fd->CommandBuffer); + { + VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT; + VkSubmitInfo info = {}; + info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &image_acquired_semaphore; + info.pWaitDstStageMask = &wait_stage; + info.commandBufferCount = 1; + info.pCommandBuffers = &fd->CommandBuffer; + info.signalSemaphoreCount = 1; + info.pSignalSemaphores = &render_complete_semaphore; + + err = vkEndCommandBuffer(fd->CommandBuffer); + check_vk_result(err); + err = vkQueueSubmit(g_Queue, 1, &info, fd->Fence); + check_vk_result(err); + } +} + +static void FramePresent(ImGui_ImplVulkanH_Window* wd) +{ + if (g_SwapChainRebuild) + return; + VkSemaphore render_complete_semaphore = wd->FrameSemaphores[wd->SemaphoreIndex].RenderCompleteSemaphore; + VkPresentInfoKHR info = {}; + info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR; + info.waitSemaphoreCount = 1; + info.pWaitSemaphores = &render_complete_semaphore; + info.swapchainCount = 1; + info.pSwapchains = &wd->Swapchain; + info.pImageIndices = &wd->FrameIndex; + VkResult err = vkQueuePresentKHR(g_Queue, &info); + if (err == VK_ERROR_OUT_OF_DATE_KHR || err == VK_SUBOPTIMAL_KHR) + { + g_SwapChainRebuild = true; + return; + } + check_vk_result(err); + wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores +} + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMECONTROLLER) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // From 2.0.18: Enable native IME. +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // Create window with Vulkan graphics context + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL2+Vulkan example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + uint32_t extensions_count = 0; + SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, NULL); + const char** extensions = new const char*[extensions_count]; + SDL_Vulkan_GetInstanceExtensions(window, &extensions_count, extensions); + SetupVulkan(extensions, extensions_count); + delete[] extensions; + + // Create Window Surface + VkSurfaceKHR surface; + VkResult err; + if (SDL_Vulkan_CreateSurface(window, g_Instance, &surface) == 0) + { + printf("Failed to create Vulkan surface.\n"); + return 1; + } + + // Create Framebuffers + int w, h; + SDL_GetWindowSize(window, &w, &h); + ImGui_ImplVulkanH_Window* wd = &g_MainWindowData; + SetupVulkanWindow(wd, surface, w, h); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForVulkan(window); + ImGui_ImplVulkan_InitInfo init_info = {}; + init_info.Instance = g_Instance; + init_info.PhysicalDevice = g_PhysicalDevice; + init_info.Device = g_Device; + init_info.QueueFamily = g_QueueFamily; + init_info.Queue = g_Queue; + init_info.PipelineCache = g_PipelineCache; + init_info.DescriptorPool = g_DescriptorPool; + init_info.Subpass = 0; + init_info.MinImageCount = g_MinImageCount; + init_info.ImageCount = wd->ImageCount; + init_info.MSAASamples = VK_SAMPLE_COUNT_1_BIT; + init_info.Allocator = g_Allocator; + init_info.CheckVkResultFn = check_vk_result; + ImGui_ImplVulkan_Init(&init_info, wd->RenderPass); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Upload Fonts + { + // Use any command queue + VkCommandPool command_pool = wd->Frames[wd->FrameIndex].CommandPool; + VkCommandBuffer command_buffer = wd->Frames[wd->FrameIndex].CommandBuffer; + + err = vkResetCommandPool(g_Device, command_pool, 0); + check_vk_result(err); + VkCommandBufferBeginInfo begin_info = {}; + begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + begin_info.flags |= VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + err = vkBeginCommandBuffer(command_buffer, &begin_info); + check_vk_result(err); + + ImGui_ImplVulkan_CreateFontsTexture(command_buffer); + + VkSubmitInfo end_info = {}; + end_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO; + end_info.commandBufferCount = 1; + end_info.pCommandBuffers = &command_buffer; + err = vkEndCommandBuffer(command_buffer); + check_vk_result(err); + err = vkQueueSubmit(g_Queue, 1, &end_info, VK_NULL_HANDLE); + check_vk_result(err); + + err = vkDeviceWaitIdle(g_Device); + check_vk_result(err); + ImGui_ImplVulkan_DestroyFontUploadObjects(); + } + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) + done = true; + if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_CLOSE && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Resize swap chain? + if (g_SwapChainRebuild) + { + int width, height; + SDL_GetWindowSize(window, &width, &height); + if (width > 0 && height > 0) + { + ImGui_ImplVulkan_SetMinImageCount(g_MinImageCount); + ImGui_ImplVulkanH_CreateOrResizeWindow(g_Instance, g_PhysicalDevice, g_Device, &g_MainWindowData, g_QueueFamily, g_Allocator, width, height, g_MinImageCount); + g_MainWindowData.FrameIndex = 0; + g_SwapChainRebuild = false; + } + } + + // Start the Dear ImGui frame + ImGui_ImplVulkan_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + const bool is_minimized = (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f); + if (!is_minimized) + { + wd->ClearValue.color.float32[0] = clear_color.x * clear_color.w; + wd->ClearValue.color.float32[1] = clear_color.y * clear_color.w; + wd->ClearValue.color.float32[2] = clear_color.z * clear_color.w; + wd->ClearValue.color.float32[3] = clear_color.w; + FrameRender(wd, draw_data); + FramePresent(wd); + } + } + + // Cleanup + err = vkDeviceWaitIdle(g_Device); + check_vk_result(err); + ImGui_ImplVulkan_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); + + CleanupVulkanWindow(); + CleanupVulkan(); + + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_sdl3_opengl3/Makefile b/ImGui/examples/example_sdl3_opengl3/Makefile new file mode 100644 index 0000000..3a00a31 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/Makefile @@ -0,0 +1,84 @@ +# +# Cross Platform Makefile +# Compatible with MSYS2/MINGW, Ubuntu 14.04.1 and Mac OS X +# +# You will need SDL3 (http://www.libsdl.org) which is still unreleased/unpackaged. + +#CXX = g++ +#CXX = clang++ + +EXE = example_sdl3_opengl3 +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +LINUX_GL_LIBS = -lGL + +CXXFLAGS = -std=c++11 -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +CXXFLAGS += -g -Wall -Wformat +LIBS = + +##--------------------------------------------------------------------- +## OPENGL ES +##--------------------------------------------------------------------- + +## This assumes a GL ES library available in the system, e.g. libGLESv2.so +# CXXFLAGS += -DIMGUI_IMPL_OPENGL_ES2 +# LINUX_GL_LIBS = -lGLESv2 +## If you're on a Raspberry Pi and want to use the legacy drivers, +## use the following instead: +# LINUX_GL_LIBS = -L/opt/vc/lib -lbrcmGLESv2 + +##--------------------------------------------------------------------- +## BUILD FLAGS PER PLATFORM +##--------------------------------------------------------------------- + +ifeq ($(UNAME_S), Linux) #LINUX + ECHO_MESSAGE = "Linux" + LIBS += $(LINUX_GL_LIBS) -ldl `sdl3-config --libs` + + CXXFLAGS += `sdl3-config --cflags` + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) #APPLE + ECHO_MESSAGE = "Mac OS X" + LIBS += -framework OpenGL -framework Cocoa -framework IOKit -framework CoreVideo `sdl3-config --libs` + LIBS += -L/usr/local/lib -L/opt/local/lib + + CXXFLAGS += `sdl3-config --cflags` + CXXFLAGS += -I/usr/local/include -I/opt/local/include + CFLAGS = $(CXXFLAGS) +endif + +ifeq ($(OS), Windows_NT) + ECHO_MESSAGE = "MinGW" + LIBS += -lgdi32 -lopengl32 -limm32 `pkg-config --static --libs sdl3` + + CXXFLAGS += `pkg-config --cflags sdl3` + CFLAGS = $(CXXFLAGS) +endif + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(ECHO_MESSAGE) + +$(EXE): $(OBJS) + $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS) + +clean: + rm -f $(EXE) $(OBJS) diff --git a/ImGui/examples/example_sdl3_opengl3/Makefile.emscripten b/ImGui/examples/example_sdl3_opengl3/Makefile.emscripten new file mode 100644 index 0000000..b8c3570 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/Makefile.emscripten @@ -0,0 +1,92 @@ +# +# Makefile to use with SDL+emscripten +# See https://emscripten.org/docs/getting_started/downloads.html +# for installation instructions. +# +# This Makefile assumes you have loaded emscripten's environment. +# (On Windows, you may need to execute emsdk_env.bat or encmdprompt.bat ahead) +# +# Running `make -f Makefile.emscripten` will produce three files: +# - web/index.html +# - web/index.js +# - web/index.wasm +# +# All three are needed to run the demo. + +CC = emcc +CXX = em++ +WEB_DIR = web +EXE = $(WEB_DIR)/index.html +IMGUI_DIR = ../.. +SOURCES = main.cpp +SOURCES += $(IMGUI_DIR)/imgui.cpp $(IMGUI_DIR)/imgui_demo.cpp $(IMGUI_DIR)/imgui_draw.cpp $(IMGUI_DIR)/imgui_tables.cpp $(IMGUI_DIR)/imgui_widgets.cpp +SOURCES += $(IMGUI_DIR)/backends/imgui_impl_sdl3.cpp $(IMGUI_DIR)/backends/imgui_impl_opengl3.cpp +OBJS = $(addsuffix .o, $(basename $(notdir $(SOURCES)))) +UNAME_S := $(shell uname -s) +CPPFLAGS = +LDFLAGS = +EMS = + +##--------------------------------------------------------------------- +## EMSCRIPTEN OPTIONS +##--------------------------------------------------------------------- + +# ("EMS" options gets added to both CPPFLAGS and LDFLAGS, whereas some options are for linker only) +EMS += -s USE_SDL=2 +EMS += -s DISABLE_EXCEPTION_CATCHING=1 +LDFLAGS += -s WASM=1 -s ALLOW_MEMORY_GROWTH=1 -s NO_EXIT_RUNTIME=0 -s ASSERTIONS=1 + +# Uncomment next line to fix possible rendering bugs with Emscripten version older then 1.39.0 (https://github.com/ocornut/imgui/issues/2877) +#EMS += -s BINARYEN_TRAP_MODE=clamp +#EMS += -s SAFE_HEAP=1 ## Adds overhead + +# Emscripten allows preloading a file or folder to be accessible at runtime. +# The Makefile for this example project suggests embedding the misc/fonts/ folder into our application, it will then be accessible as "/fonts" +# See documentation for more details: https://emscripten.org/docs/porting/files/packaging_files.html +# (Default value is 0. Set to 1 to enable file-system and include the misc/fonts/ folder as part of the build.) +USE_FILE_SYSTEM ?= 0 +ifeq ($(USE_FILE_SYSTEM), 0) +LDFLAGS += -s NO_FILESYSTEM=1 +CPPFLAGS += -DIMGUI_DISABLE_FILE_FUNCTIONS +endif +ifeq ($(USE_FILE_SYSTEM), 1) +LDFLAGS += --no-heap-copy --preload-file ../../misc/fonts@/fonts +endif + +##--------------------------------------------------------------------- +## FINAL BUILD FLAGS +##--------------------------------------------------------------------- + +CPPFLAGS += -I$(IMGUI_DIR) -I$(IMGUI_DIR)/backends +#CPPFLAGS += -g +CPPFLAGS += -Wall -Wformat -Os $(EMS) +LDFLAGS += --shell-file ../libs/emscripten/shell_minimal.html +LDFLAGS += $(EMS) + +##--------------------------------------------------------------------- +## BUILD RULES +##--------------------------------------------------------------------- + +%.o:%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +%.o:$(IMGUI_DIR)/backends/%.cpp + $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $< + +all: $(EXE) + @echo Build complete for $(EXE) + +$(WEB_DIR): + mkdir $@ + +serve: all + python3 -m http.server -d $(WEB_DIR) + +$(EXE): $(OBJS) $(WEB_DIR) + $(CXX) -o $@ $(OBJS) $(LDFLAGS) + +clean: + rm -rf $(OBJS) $(WEB_DIR) diff --git a/ImGui/examples/example_sdl3_opengl3/README.md b/ImGui/examples/example_sdl3_opengl3/README.md new file mode 100644 index 0000000..8b137b1 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/README.md @@ -0,0 +1,57 @@ + +# How to Build + +## Windows with Visual Studio's IDE + +Use the provided project file (.vcxproj). Add to solution (imgui_examples.sln) if necessary. + +## Windows with Visual Studio's CLI + +Use build_win32.bat or directly: +``` +set SDL2_DIR=path_to_your_sdl3_folder +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x86 SDL3.lib opengl32.lib /subsystem:console +# ^^ include paths ^^ source files ^^ output exe ^^ output dir ^^ libraries +# or for 64-bit: +cl /Zi /MD /I.. /I..\.. /I%SDL2_DIR%\include main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp /FeDebug/example_sdl3_opengl3.exe /FoDebug/ /link /libpath:%SDL2_DIR%\lib\x64 SDL3.lib SDL2mainopengl32.lib /subsystem:console +``` + +## Linux and similar Unixes + +Use our Makefile or directly: +``` +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl3-config --libs` -lGL -ldl +``` + +## macOS + +Use our Makefile or directly: +``` +brew install sdl3 +c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends + main.cpp ../../backends/imgui_impl_sdl3.cpp ../../backends/imgui_impl_opengl3.cpp ../../imgui*.cpp + `sdl3-config --libs` -framework OpenGl -framework CoreFoundation +``` + +## Emscripten + +**Building** + +You need to install Emscripten from https://emscripten.org/docs/getting_started/downloads.html, and have the environment variables set, as described in https://emscripten.org/docs/getting_started/downloads.html#installation-instructions + +- Depending on your configuration, in Windows you may need to run `emsdk/emsdk_env.bat` in your console to access the Emscripten command-line tools. +- You may also refer to our [Continuous Integration setup](https://github.com/ocornut/imgui/tree/master/.github/workflows) for Emscripten setup. +- Then build using `make -f Makefile.emscripten` while in the current directory. + +**Running an Emscripten project** + +To run on a local machine: +- `make -f Makefile.emscripten serve` will use Python3 to spawn a local webserver, you can then browse http://localhost:8000 to access your build. +- Otherwise, generally you will need a local webserver. Quoting [https://emscripten.org/docs/getting_started](https://emscripten.org/docs/getting_started/Tutorial.html#generating-html):
+_"Unfortunately several browsers (including Chrome, Safari, and Internet Explorer) do not support file:// [XHR](https://emscripten.org/docs/site/glossary.html#term-xhr) requests, and can’t load extra files needed by the HTML (like a .wasm file, or packaged file data as mentioned lower down). For these browsers you’ll need to serve the files using a [local webserver](https://emscripten.org/docs/getting_started/FAQ.html#faq-local-webserver) and then open http://localhost:8000/hello.html."_ +- Emscripten SDK has a handy `emrun` command: `emrun web/index.html --browser firefox` which will spawn a temporary local webserver (in Firefox). See https://emscripten.org/docs/compiling/Running-html-files-with-emrun.html for details. +- You may use Python 3 builtin webserver: `python -m http.server -d web` (this is what `make serve` uses). +- You may use Python 2 builtin webserver: `cd web && python -m SimpleHTTPServer`. +- If you are accessing the files over a network, certain browsers, such as Firefox, will restrict Gamepad API access to secure contexts only (e.g. https only). diff --git a/ImGui/examples/example_sdl3_opengl3/build_win32.bat b/ImGui/examples/example_sdl3_opengl3/build_win32.bat new file mode 100644 index 0000000..ba7d25b --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_sdl3_opengl3 +@set INCLUDES=/I..\.. /I..\..\backends /I%SDL3_DIR%\include +@set SOURCES=main.cpp ..\..\backends\imgui_impl_sdl3.cpp ..\..\backends\imgui_impl_opengl3.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:%SDL3_DIR%\lib\x86 SDL3.lib opengl32.lib shell32.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% /subsystem:console diff --git a/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj b/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj new file mode 100644 index 0000000..60c9964 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {84AAA301-84FE-428B-9E3E-817BC8123C0C} + example_sdl3_opengl3 + 8.1 + + + + Application + true + MultiByte + v140 + + + Application + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + Application + false + true + MultiByte + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + $(IncludePath) + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + + + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + Disabled + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + + + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + msvcrt.lib + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL3_DIR%\lib\x86;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%SDL3_DIR%\include;$(VcpkgCurrentInstalledDir)include\SDL3;%(AdditionalIncludeDirectories) + false + + + true + true + true + %SDL3_DIR%\lib\x64;%(AdditionalLibraryDirectories) + opengl32.lib;SDL3.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters b/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters new file mode 100644 index 0000000..f590e32 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/example_sdl3_opengl3.vcxproj.filters @@ -0,0 +1,64 @@ + + + + + {20b90ce4-7fcb-4731-b9a0-075f875de82d} + + + {f18ab499-84e1-499f-8eff-9754361e0e52} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + sources + + + + + + imgui + + + diff --git a/ImGui/examples/example_sdl3_opengl3/main.cpp b/ImGui/examples/example_sdl3_opengl3/main.cpp new file mode 100644 index 0000000..26d9546 --- /dev/null +++ b/ImGui/examples/example_sdl3_opengl3/main.cpp @@ -0,0 +1,196 @@ +// Dear ImGui: standalone example application for SDL3 + OpenGL +// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_sdl3.h" +#include "imgui_impl_opengl3.h" +#include +#include +#if defined(IMGUI_IMPL_OPENGL_ES2) +#include +#else +#include +#endif + +// This example can also compile and run with Emscripten! See 'Makefile.emscripten' for details. +#ifdef __EMSCRIPTEN__ +#include "../libs/emscripten/emscripten_mainloop_stub.h" +#endif + +// Main code +int main(int, char**) +{ + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_GAMEPAD) != 0) + { + printf("Error: %s\n", SDL_GetError()); + return -1; + } + + // Decide GL+GLSL versions +#if defined(IMGUI_IMPL_OPENGL_ES2) + // GL ES 2.0 + GLSL 100 + const char* glsl_version = "#version 100"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#elif defined(__APPLE__) + // GL 3.2 Core + GLSL 150 + const char* glsl_version = "#version 150"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG); // Always required on Mac + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); +#else + // GL 3.0 + GLSL 130 + const char* glsl_version = "#version 130"; + SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0); +#endif + + // Enable native IME. + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + + // Create window with graphics context + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24); + SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); + SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE); + SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+OpenGL3 example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1280, 720, window_flags); + SDL_GLContext gl_context = SDL_GL_CreateContext(window); + SDL_GL_MakeCurrent(window, gl_context); + SDL_GL_SetSwapInterval(1); // Enable vsync + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL3_InitForOpenGL(window, gl_context); + ImGui_ImplOpenGL3_Init(glsl_version); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; +#ifdef __EMSCRIPTEN__ + // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. + // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. + io.IniFilename = NULL; + EMSCRIPTEN_MAINLOOP_BEGIN +#else + while (!done) +#endif + { + // Poll and handle events (inputs, window resize, etc.) + // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. + // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. + // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. + // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. + SDL_Event event; + while (SDL_PollEvent(&event)) + { + ImGui_ImplSDL3_ProcessEvent(&event); + if (event.type == SDL_EVENT_QUIT) + done = true; + if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) + done = true; + } + + // Start the Dear ImGui frame + ImGui_ImplOpenGL3_NewFrame(); + ImGui_ImplSDL3_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + glViewport(0, 0, (int)io.DisplaySize.x, (int)io.DisplaySize.y); + glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w); + glClear(GL_COLOR_BUFFER_BIT); + ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); + SDL_GL_SwapWindow(window); + } +#ifdef __EMSCRIPTEN__ + EMSCRIPTEN_MAINLOOP_END; +#endif + + // Cleanup + ImGui_ImplOpenGL3_Shutdown(); + ImGui_ImplSDL3_Shutdown(); + ImGui::DestroyContext(); + + SDL_GL_DeleteContext(gl_context); + SDL_DestroyWindow(window); + SDL_Quit(); + + return 0; +} diff --git a/ImGui/examples/example_win32_directx10/build_win32.bat b/ImGui/examples/example_win32_directx10/build_win32.bat new file mode 100644 index 0000000..fd74223 --- /dev/null +++ b/ImGui/examples/example_win32_directx10/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx10 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\backends\imgui_impl_dx10.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d10.lib d3dcompiler.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj b/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj new file mode 100644 index 0000000..e71cb0a --- /dev/null +++ b/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {345A953E-A004-4648-B442-DC5F9F11068C} + example_win32_directx10 + 8.1 + + + + Application + true + Unicode + v140 + + + Application + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + + + true + d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + + + true + d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + false + + + true + true + true + d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + false + + + true + true + true + d3d10.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters b/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters new file mode 100644 index 0000000..4d8300f --- /dev/null +++ b/ImGui/examples/example_win32_directx10/example_win32_directx10.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6} + + + {08e36723-ce4f-4cff-9662-c40801cf1acf} + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + imgui + + + imgui + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx10/main.cpp b/ImGui/examples/example_win32_directx10/main.cpp new file mode 100644 index 0000000..fd5aa01 --- /dev/null +++ b/ImGui/examples/example_win32_directx10/main.cpp @@ -0,0 +1,247 @@ +// Dear ImGui: standalone example application for DirectX 10 +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_win32.h" +#include "imgui_impl_dx10.h" +#include +#include +#include + +// Data +static ID3D10Device* g_pd3dDevice = NULL; +static IDXGISwapChain* g_pSwapChain = NULL; +static ID3D10RenderTargetView* g_mainRenderTargetView = NULL; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX10 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX10_Init(g_pd3dDevice); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Start the Dear ImGui frame + ImGui_ImplDX10_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + g_pd3dDevice->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL); + g_pd3dDevice->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); + ImGui_ImplDX10_RenderDrawData(ImGui::GetDrawData()); + + g_pSwapChain->Present(1, 0); // Present with vsync + //g_pSwapChain->Present(0, 0); // Present without vsync + } + + ImGui_ImplDX10_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ + // Setup swap chain + DXGI_SWAP_CHAIN_DESC sd; + ZeroMemory(&sd, sizeof(sd)); + sd.BufferCount = 2; + sd.BufferDesc.Width = 0; + sd.BufferDesc.Height = 0; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; + sd.BufferDesc.RefreshRate.Denominator = 1; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = hWnd; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + + UINT createDeviceFlags = 0; + //createDeviceFlags |= D3D10_CREATE_DEVICE_DEBUG; + HRESULT res = D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); + if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. + res = D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_WARP, NULL, createDeviceFlags, D3D10_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice); + if (res != S_OK) + return false; + + CreateRenderTarget(); + return true; +} + +void CleanupDeviceD3D() +{ + CleanupRenderTarget(); + if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } +} + +void CreateRenderTarget() +{ + ID3D10Texture2D* pBackBuffer; + g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); + pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ + if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) + { + CleanupRenderTarget(); + g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); + CreateRenderTarget(); + } + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/ImGui/examples/example_win32_directx11/build_win32.bat b/ImGui/examples/example_win32_directx11/build_win32.bat new file mode 100644 index 0000000..b1cf7d1 --- /dev/null +++ b/ImGui/examples/example_win32_directx11/build_win32.bat @@ -0,0 +1,9 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx11 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" /I "%DXSDK_DIR%Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx11.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d11.lib d3dcompiler.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% + diff --git a/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj b/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj new file mode 100644 index 0000000..273d351 --- /dev/null +++ b/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj @@ -0,0 +1,170 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {9F316E83-5AE5-4939-A723-305A94F48005} + example_win32_directx11 + + + + Application + true + Unicode + v140 + + + Application + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + + + true + d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + + + true + d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + false + + + true + true + true + d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories); + false + + + true + true + true + d3d11.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters b/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters new file mode 100644 index 0000000..7295997 --- /dev/null +++ b/ImGui/examples/example_win32_directx11/example_win32_directx11.vcxproj.filters @@ -0,0 +1,60 @@ + + + + + {0587d7a3-f2ce-4d56-b84f-a0005d3bfce6} + + + {08e36723-ce4f-4cff-9662-c40801cf1acf} + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + sources + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + imgui + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx11/main.cpp b/ImGui/examples/example_win32_directx11/main.cpp new file mode 100644 index 0000000..2cf890f --- /dev/null +++ b/ImGui/examples/example_win32_directx11/main.cpp @@ -0,0 +1,251 @@ +// Dear ImGui: standalone example application for DirectX 11 +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_win32.h" +#include "imgui_impl_dx11.h" +#include +#include + +// Data +static ID3D11Device* g_pd3dDevice = NULL; +static ID3D11DeviceContext* g_pd3dDeviceContext = NULL; +static IDXGISwapChain* g_pSwapChain = NULL; +static ID3D11RenderTargetView* g_mainRenderTargetView = NULL; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX11 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Start the Dear ImGui frame + ImGui_ImplDX11_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL); + g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color_with_alpha); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + + g_pSwapChain->Present(1, 0); // Present with vsync + //g_pSwapChain->Present(0, 0); // Present without vsync + } + + // Cleanup + ImGui_ImplDX11_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ + // Setup swap chain + DXGI_SWAP_CHAIN_DESC sd; + ZeroMemory(&sd, sizeof(sd)); + sd.BufferCount = 2; + sd.BufferDesc.Width = 0; + sd.BufferDesc.Height = 0; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; + sd.BufferDesc.RefreshRate.Denominator = 1; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = hWnd; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.Windowed = TRUE; + sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD; + + UINT createDeviceFlags = 0; + //createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; + D3D_FEATURE_LEVEL featureLevel; + const D3D_FEATURE_LEVEL featureLevelArray[2] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_0, }; + HRESULT res = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); + if (res == DXGI_ERROR_UNSUPPORTED) // Try high-performance WARP software driver if hardware is not available. + res = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_WARP, NULL, createDeviceFlags, featureLevelArray, 2, D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, &featureLevel, &g_pd3dDeviceContext); + if (res != S_OK) + return false; + + CreateRenderTarget(); + return true; +} + +void CleanupDeviceD3D() +{ + CleanupRenderTarget(); + if (g_pSwapChain) { g_pSwapChain->Release(); g_pSwapChain = NULL; } + if (g_pd3dDeviceContext) { g_pd3dDeviceContext->Release(); g_pd3dDeviceContext = NULL; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } +} + +void CreateRenderTarget() +{ + ID3D11Texture2D* pBackBuffer; + g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_mainRenderTargetView); + pBackBuffer->Release(); +} + +void CleanupRenderTarget() +{ + if (g_mainRenderTargetView) { g_mainRenderTargetView->Release(); g_mainRenderTargetView = NULL; } +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) + { + CleanupRenderTarget(); + g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, 0); + CreateRenderTarget(); + } + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/ImGui/examples/example_win32_directx12/build_win32.bat b/ImGui/examples/example_win32_directx12/build_win32.bat new file mode 100644 index 0000000..48dadb2 --- /dev/null +++ b/ImGui/examples/example_win32_directx12/build_win32.bat @@ -0,0 +1,9 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@REM Important: to build on 32-bit systems, the DX12 backends needs '#define ImTextureID ImU64', so we pass it here. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx12 +@set INCLUDES=/I..\.. /I..\..\backends /I "%WindowsSdkDir%Include\um" /I "%WindowsSdkDir%Include\shared" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx12.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=d3d12.lib d3dcompiler.lib dxgi.lib +mkdir Debug +cl /nologo /Zi /MD %INCLUDES% /D ImTextureID=ImU64 /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj b/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj new file mode 100644 index 0000000..e12fa40 --- /dev/null +++ b/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj @@ -0,0 +1,175 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {b4cf9797-519d-4afe-a8f4-5141a6b521d3} + example_win32_directx12 + 10.0.18362.0 + + + + Application + true + Unicode + v140 + + + Application + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + true + d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + %(AdditionalLibraryDirectories) + Console + + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + true + d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + %(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + true + true + true + d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + %(AdditionalLibraryDirectories) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories) + ImTextureID=ImU64;_UNICODE;UNICODE;%(PreprocessorDefinitions) + + + true + true + true + d3d12.lib;d3dcompiler.lib;dxgi.lib;%(AdditionalDependencies) + %(AdditionalLibraryDirectories) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters b/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters new file mode 100644 index 0000000..85831ef --- /dev/null +++ b/ImGui/examples/example_win32_directx12/example_win32_directx12.vcxproj.filters @@ -0,0 +1,62 @@ + + + + + {fb3d294f-51ec-478e-a627-25831c80fefd} + + + {4f33ddea-9910-456d-b868-4267eb3c2b19} + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + imgui + + + sources + + + imgui + + + imgui + + + sources + + + sources + + + imgui + + + imgui + + + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx12/main.cpp b/ImGui/examples/example_win32_directx12/main.cpp new file mode 100644 index 0000000..24b2d95 --- /dev/null +++ b/ImGui/examples/example_win32_directx12/main.cpp @@ -0,0 +1,466 @@ +// Dear ImGui: standalone example application for DirectX 12 +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// Important: to compile on 32-bit systems, the DirectX12 backend requires code to be compiled with '#define ImTextureID ImU64'. +// This is because we need ImTextureID to carry a 64-bit value and by default ImTextureID is defined as void*. +// This define is set in the example .vcxproj file and need to be replicated in your app or by adding it to your imconfig.h file. + +#include "imgui.h" +#include "imgui_impl_win32.h" +#include "imgui_impl_dx12.h" +#include +#include +#include + +#ifdef _DEBUG +#define DX12_ENABLE_DEBUG_LAYER +#endif + +#ifdef DX12_ENABLE_DEBUG_LAYER +#include +#pragma comment(lib, "dxguid.lib") +#endif + +struct FrameContext +{ + ID3D12CommandAllocator* CommandAllocator; + UINT64 FenceValue; +}; + +// Data +static int const NUM_FRAMES_IN_FLIGHT = 3; +static FrameContext g_frameContext[NUM_FRAMES_IN_FLIGHT] = {}; +static UINT g_frameIndex = 0; + +static int const NUM_BACK_BUFFERS = 3; +static ID3D12Device* g_pd3dDevice = NULL; +static ID3D12DescriptorHeap* g_pd3dRtvDescHeap = NULL; +static ID3D12DescriptorHeap* g_pd3dSrvDescHeap = NULL; +static ID3D12CommandQueue* g_pd3dCommandQueue = NULL; +static ID3D12GraphicsCommandList* g_pd3dCommandList = NULL; +static ID3D12Fence* g_fence = NULL; +static HANDLE g_fenceEvent = NULL; +static UINT64 g_fenceLastSignaledValue = 0; +static IDXGISwapChain3* g_pSwapChain = NULL; +static HANDLE g_hSwapChainWaitableObject = NULL; +static ID3D12Resource* g_mainRenderTargetResource[NUM_BACK_BUFFERS] = {}; +static D3D12_CPU_DESCRIPTOR_HANDLE g_mainRenderTargetDescriptor[NUM_BACK_BUFFERS] = {}; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void CreateRenderTarget(); +void CleanupRenderTarget(); +void WaitForLastSubmittedFrame(); +FrameContext* WaitForNextFrameResources(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX12 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX12_Init(g_pd3dDevice, NUM_FRAMES_IN_FLIGHT, + DXGI_FORMAT_R8G8B8A8_UNORM, g_pd3dSrvDescHeap, + g_pd3dSrvDescHeap->GetCPUDescriptorHandleForHeapStart(), + g_pd3dSrvDescHeap->GetGPUDescriptorHandleForHeapStart()); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Start the Dear ImGui frame + ImGui_ImplDX12_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::Render(); + + FrameContext* frameCtx = WaitForNextFrameResources(); + UINT backBufferIdx = g_pSwapChain->GetCurrentBackBufferIndex(); + frameCtx->CommandAllocator->Reset(); + + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = g_mainRenderTargetResource[backBufferIdx]; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_PRESENT; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_RENDER_TARGET; + g_pd3dCommandList->Reset(frameCtx->CommandAllocator, NULL); + g_pd3dCommandList->ResourceBarrier(1, &barrier); + + // Render Dear ImGui graphics + const float clear_color_with_alpha[4] = { clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w }; + g_pd3dCommandList->ClearRenderTargetView(g_mainRenderTargetDescriptor[backBufferIdx], clear_color_with_alpha, 0, NULL); + g_pd3dCommandList->OMSetRenderTargets(1, &g_mainRenderTargetDescriptor[backBufferIdx], FALSE, NULL); + g_pd3dCommandList->SetDescriptorHeaps(1, &g_pd3dSrvDescHeap); + ImGui_ImplDX12_RenderDrawData(ImGui::GetDrawData(), g_pd3dCommandList); + barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_RENDER_TARGET; + barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PRESENT; + g_pd3dCommandList->ResourceBarrier(1, &barrier); + g_pd3dCommandList->Close(); + + g_pd3dCommandQueue->ExecuteCommandLists(1, (ID3D12CommandList* const*)&g_pd3dCommandList); + + g_pSwapChain->Present(1, 0); // Present with vsync + //g_pSwapChain->Present(0, 0); // Present without vsync + + UINT64 fenceValue = g_fenceLastSignaledValue + 1; + g_pd3dCommandQueue->Signal(g_fence, fenceValue); + g_fenceLastSignaledValue = fenceValue; + frameCtx->FenceValue = fenceValue; + } + + WaitForLastSubmittedFrame(); + + // Cleanup + ImGui_ImplDX12_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ + // Setup swap chain + DXGI_SWAP_CHAIN_DESC1 sd; + { + ZeroMemory(&sd, sizeof(sd)); + sd.BufferCount = NUM_BACK_BUFFERS; + sd.Width = 0; + sd.Height = 0; + sd.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.Flags = DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.SampleDesc.Count = 1; + sd.SampleDesc.Quality = 0; + sd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD; + sd.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED; + sd.Scaling = DXGI_SCALING_STRETCH; + sd.Stereo = FALSE; + } + + // [DEBUG] Enable debug interface +#ifdef DX12_ENABLE_DEBUG_LAYER + ID3D12Debug* pdx12Debug = NULL; + if (SUCCEEDED(D3D12GetDebugInterface(IID_PPV_ARGS(&pdx12Debug)))) + pdx12Debug->EnableDebugLayer(); +#endif + + // Create device + D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0; + if (D3D12CreateDevice(NULL, featureLevel, IID_PPV_ARGS(&g_pd3dDevice)) != S_OK) + return false; + + // [DEBUG] Setup debug interface to break on any warnings/errors +#ifdef DX12_ENABLE_DEBUG_LAYER + if (pdx12Debug != NULL) + { + ID3D12InfoQueue* pInfoQueue = NULL; + g_pd3dDevice->QueryInterface(IID_PPV_ARGS(&pInfoQueue)); + pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_ERROR, true); + pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_CORRUPTION, true); + pInfoQueue->SetBreakOnSeverity(D3D12_MESSAGE_SEVERITY_WARNING, true); + pInfoQueue->Release(); + pdx12Debug->Release(); + } +#endif + + { + D3D12_DESCRIPTOR_HEAP_DESC desc = {}; + desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV; + desc.NumDescriptors = NUM_BACK_BUFFERS; + desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + desc.NodeMask = 1; + if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dRtvDescHeap)) != S_OK) + return false; + + SIZE_T rtvDescriptorSize = g_pd3dDevice->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV); + D3D12_CPU_DESCRIPTOR_HANDLE rtvHandle = g_pd3dRtvDescHeap->GetCPUDescriptorHandleForHeapStart(); + for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) + { + g_mainRenderTargetDescriptor[i] = rtvHandle; + rtvHandle.ptr += rtvDescriptorSize; + } + } + + { + D3D12_DESCRIPTOR_HEAP_DESC desc = {}; + desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV; + desc.NumDescriptors = 1; + desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE; + if (g_pd3dDevice->CreateDescriptorHeap(&desc, IID_PPV_ARGS(&g_pd3dSrvDescHeap)) != S_OK) + return false; + } + + { + D3D12_COMMAND_QUEUE_DESC desc = {}; + desc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT; + desc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE; + desc.NodeMask = 1; + if (g_pd3dDevice->CreateCommandQueue(&desc, IID_PPV_ARGS(&g_pd3dCommandQueue)) != S_OK) + return false; + } + + for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) + if (g_pd3dDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&g_frameContext[i].CommandAllocator)) != S_OK) + return false; + + if (g_pd3dDevice->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, g_frameContext[0].CommandAllocator, NULL, IID_PPV_ARGS(&g_pd3dCommandList)) != S_OK || + g_pd3dCommandList->Close() != S_OK) + return false; + + if (g_pd3dDevice->CreateFence(0, D3D12_FENCE_FLAG_NONE, IID_PPV_ARGS(&g_fence)) != S_OK) + return false; + + g_fenceEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (g_fenceEvent == NULL) + return false; + + { + IDXGIFactory4* dxgiFactory = NULL; + IDXGISwapChain1* swapChain1 = NULL; + if (CreateDXGIFactory1(IID_PPV_ARGS(&dxgiFactory)) != S_OK) + return false; + if (dxgiFactory->CreateSwapChainForHwnd(g_pd3dCommandQueue, hWnd, &sd, NULL, NULL, &swapChain1) != S_OK) + return false; + if (swapChain1->QueryInterface(IID_PPV_ARGS(&g_pSwapChain)) != S_OK) + return false; + swapChain1->Release(); + dxgiFactory->Release(); + g_pSwapChain->SetMaximumFrameLatency(NUM_BACK_BUFFERS); + g_hSwapChainWaitableObject = g_pSwapChain->GetFrameLatencyWaitableObject(); + } + + CreateRenderTarget(); + return true; +} + +void CleanupDeviceD3D() +{ + CleanupRenderTarget(); + if (g_pSwapChain) { g_pSwapChain->SetFullscreenState(false, NULL); g_pSwapChain->Release(); g_pSwapChain = NULL; } + if (g_hSwapChainWaitableObject != NULL) { CloseHandle(g_hSwapChainWaitableObject); } + for (UINT i = 0; i < NUM_FRAMES_IN_FLIGHT; i++) + if (g_frameContext[i].CommandAllocator) { g_frameContext[i].CommandAllocator->Release(); g_frameContext[i].CommandAllocator = NULL; } + if (g_pd3dCommandQueue) { g_pd3dCommandQueue->Release(); g_pd3dCommandQueue = NULL; } + if (g_pd3dCommandList) { g_pd3dCommandList->Release(); g_pd3dCommandList = NULL; } + if (g_pd3dRtvDescHeap) { g_pd3dRtvDescHeap->Release(); g_pd3dRtvDescHeap = NULL; } + if (g_pd3dSrvDescHeap) { g_pd3dSrvDescHeap->Release(); g_pd3dSrvDescHeap = NULL; } + if (g_fence) { g_fence->Release(); g_fence = NULL; } + if (g_fenceEvent) { CloseHandle(g_fenceEvent); g_fenceEvent = NULL; } + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } + +#ifdef DX12_ENABLE_DEBUG_LAYER + IDXGIDebug1* pDebug = NULL; + if (SUCCEEDED(DXGIGetDebugInterface1(0, IID_PPV_ARGS(&pDebug)))) + { + pDebug->ReportLiveObjects(DXGI_DEBUG_ALL, DXGI_DEBUG_RLO_SUMMARY); + pDebug->Release(); + } +#endif +} + +void CreateRenderTarget() +{ + for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) + { + ID3D12Resource* pBackBuffer = NULL; + g_pSwapChain->GetBuffer(i, IID_PPV_ARGS(&pBackBuffer)); + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, g_mainRenderTargetDescriptor[i]); + g_mainRenderTargetResource[i] = pBackBuffer; + } +} + +void CleanupRenderTarget() +{ + WaitForLastSubmittedFrame(); + + for (UINT i = 0; i < NUM_BACK_BUFFERS; i++) + if (g_mainRenderTargetResource[i]) { g_mainRenderTargetResource[i]->Release(); g_mainRenderTargetResource[i] = NULL; } +} + +void WaitForLastSubmittedFrame() +{ + FrameContext* frameCtx = &g_frameContext[g_frameIndex % NUM_FRAMES_IN_FLIGHT]; + + UINT64 fenceValue = frameCtx->FenceValue; + if (fenceValue == 0) + return; // No fence was signaled + + frameCtx->FenceValue = 0; + if (g_fence->GetCompletedValue() >= fenceValue) + return; + + g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent); + WaitForSingleObject(g_fenceEvent, INFINITE); +} + +FrameContext* WaitForNextFrameResources() +{ + UINT nextFrameIndex = g_frameIndex + 1; + g_frameIndex = nextFrameIndex; + + HANDLE waitableObjects[] = { g_hSwapChainWaitableObject, NULL }; + DWORD numWaitableObjects = 1; + + FrameContext* frameCtx = &g_frameContext[nextFrameIndex % NUM_FRAMES_IN_FLIGHT]; + UINT64 fenceValue = frameCtx->FenceValue; + if (fenceValue != 0) // means no fence was signaled + { + frameCtx->FenceValue = 0; + g_fence->SetEventOnCompletion(fenceValue, g_fenceEvent); + waitableObjects[1] = g_fenceEvent; + numWaitableObjects = 2; + } + + WaitForMultipleObjects(numWaitableObjects, waitableObjects, TRUE, INFINITE); + + return frameCtx; +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) + { + WaitForLastSubmittedFrame(); + CleanupRenderTarget(); + HRESULT result = g_pSwapChain->ResizeBuffers(0, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam), DXGI_FORMAT_UNKNOWN, DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT); + assert(SUCCEEDED(result) && "Failed to resize swapchain."); + CreateRenderTarget(); + } + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/ImGui/examples/example_win32_directx9/build_win32.bat b/ImGui/examples/example_win32_directx9/build_win32.bat new file mode 100644 index 0000000..bbd4b13 --- /dev/null +++ b/ImGui/examples/example_win32_directx9/build_win32.bat @@ -0,0 +1,8 @@ +@REM Build for Visual Studio compiler. Run your copy of vcvars32.bat or vcvarsall.bat to setup command-line compiler. +@set OUT_DIR=Debug +@set OUT_EXE=example_win32_directx9 +@set INCLUDES=/I..\.. /I..\..\backends /I "%DXSDK_DIR%/Include" +@set SOURCES=main.cpp ..\..\backends\imgui_impl_dx9.cpp ..\..\backends\imgui_impl_win32.cpp ..\..\imgui*.cpp +@set LIBS=/LIBPATH:"%DXSDK_DIR%/Lib/x86" d3d9.lib +mkdir %OUT_DIR% +cl /nologo /Zi /MD %INCLUDES% /D UNICODE /D _UNICODE %SOURCES% /Fe%OUT_DIR%/%OUT_EXE%.exe /Fo%OUT_DIR%/ /link %LIBS% diff --git a/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj b/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj new file mode 100644 index 0000000..e01eca1 --- /dev/null +++ b/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj @@ -0,0 +1,171 @@ + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {4165A294-21F2-44CA-9B38-E3F935ABADF5} + example_win32_directx9 + 8.1 + + + + Application + true + Unicode + v140 + + + Application + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + Application + false + true + Unicode + v140 + + + + + + + + + + + + + + + + + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + $(ProjectDir)$(Configuration)\ + $(ProjectDir)$(Configuration)\ + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + + + true + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + d3d9.lib;%(AdditionalDependencies) + Console + + + + + Level4 + Disabled + ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + + + true + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + d3d9.lib;%(AdditionalDependencies) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + false + + + true + true + true + $(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories) + d3d9.lib;%(AdditionalDependencies) + Console + + + + + Level4 + MaxSpeed + true + true + ..\..;..\..\backends;%(AdditionalIncludeDirectories);$(DXSDK_DIR)Include; + false + + + true + true + true + $(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories) + d3d9.lib;%(AdditionalDependencies) + Console + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters b/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters new file mode 100644 index 0000000..25b787b --- /dev/null +++ b/ImGui/examples/example_win32_directx9/example_win32_directx9.vcxproj.filters @@ -0,0 +1,61 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {a82cba23-9de0-45c2-b1e3-2eb1666702de} + + + + + sources + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + imgui + + + imgui + + + + + imgui + + + imgui + + + imgui + + + sources + + + sources + + + + + + imgui + + + \ No newline at end of file diff --git a/ImGui/examples/example_win32_directx9/main.cpp b/ImGui/examples/example_win32_directx9/main.cpp new file mode 100644 index 0000000..1936deb --- /dev/null +++ b/ImGui/examples/example_win32_directx9/main.cpp @@ -0,0 +1,238 @@ +// Dear ImGui: standalone example application for DirectX 9 +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#include "imgui.h" +#include "imgui_impl_dx9.h" +#include "imgui_impl_win32.h" +#include +#include + +// Data +static LPDIRECT3D9 g_pD3D = NULL; +static LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; +static D3DPRESENT_PARAMETERS g_d3dpp = {}; + +// Forward declarations of helper functions +bool CreateDeviceD3D(HWND hWnd); +void CleanupDeviceD3D(); +void ResetDevice(); +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Main code +int main(int, char**) +{ + // Create application window + //ImGui_ImplWin32_EnableDpiAwareness(); + WNDCLASSEXW wc = { sizeof(wc), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"ImGui Example", NULL }; + ::RegisterClassExW(&wc); + HWND hwnd = ::CreateWindowW(wc.lpszClassName, L"Dear ImGui DirectX9 Example", WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL); + + // Initialize Direct3D + if (!CreateDeviceD3D(hwnd)) + { + CleanupDeviceD3D(); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + return 1; + } + + // Show the window + ::ShowWindow(hwnd, SW_SHOWDEFAULT); + ::UpdateWindow(hwnd); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); (void)io; + io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + //ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX9_Init(g_pd3dDevice); + + // Load Fonts + // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. + // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. + // - If the file cannot be loaded, the function will return NULL. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). + // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. + // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. + // - Read 'docs/FONTS.md' for more instructions and details. + // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! + //io.Fonts->AddFontDefault(); + //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); + //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); + //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, NULL, io.Fonts->GetGlyphRangesJapanese()); + //IM_ASSERT(font != NULL); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + // Main loop + bool done = false; + while (!done) + { + // Poll and handle messages (inputs, window resize, etc.) + // See the WndProc() function below for our to dispatch events to the Win32 backend. + MSG msg; + while (::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) + { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + if (msg.message == WM_QUIT) + done = true; + } + if (done) + break; + + // Start the Dear ImGui frame + ImGui_ImplDX9_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). + if (show_demo_window) + ImGui::ShowDemoWindow(&show_demo_window); + + // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. + { + static float f = 0.0f; + static int counter = 0; + + ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. + + ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) + ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state + ImGui::Checkbox("Another Window", &show_another_window); + + ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color + + if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) + counter++; + ImGui::SameLine(); + ImGui::Text("counter = %d", counter); + + ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + ImGui::End(); + } + + // 3. Show another simple window. + if (show_another_window) + { + ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) + ImGui::Text("Hello from another window!"); + if (ImGui::Button("Close Me")) + show_another_window = false; + ImGui::End(); + } + + // Rendering + ImGui::EndFrame(); + g_pd3dDevice->SetRenderState(D3DRS_ZENABLE, FALSE); + g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); + g_pd3dDevice->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + D3DCOLOR clear_col_dx = D3DCOLOR_RGBA((int)(clear_color.x*clear_color.w*255.0f), (int)(clear_color.y*clear_color.w*255.0f), (int)(clear_color.z*clear_color.w*255.0f), (int)(clear_color.w*255.0f)); + g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, clear_col_dx, 1.0f, 0); + if (g_pd3dDevice->BeginScene() >= 0) + { + ImGui::Render(); + ImGui_ImplDX9_RenderDrawData(ImGui::GetDrawData()); + g_pd3dDevice->EndScene(); + } + HRESULT result = g_pd3dDevice->Present(NULL, NULL, NULL, NULL); + + // Handle loss of D3D9 device + if (result == D3DERR_DEVICELOST && g_pd3dDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET) + ResetDevice(); + } + + ImGui_ImplDX9_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + CleanupDeviceD3D(); + ::DestroyWindow(hwnd); + ::UnregisterClassW(wc.lpszClassName, wc.hInstance); + + return 0; +} + +// Helper functions + +bool CreateDeviceD3D(HWND hWnd) +{ + if ((g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)) == NULL) + return false; + + // Create the D3DDevice + ZeroMemory(&g_d3dpp, sizeof(g_d3dpp)); + g_d3dpp.Windowed = TRUE; + g_d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + g_d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; // Need to use an explicit format with alpha if needing per-pixel alpha composition. + g_d3dpp.EnableAutoDepthStencil = TRUE; + g_d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; // Present with vsync + //g_d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // Present without vsync, maximum unthrottled framerate + if (g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &g_d3dpp, &g_pd3dDevice) < 0) + return false; + + return true; +} + +void CleanupDeviceD3D() +{ + if (g_pd3dDevice) { g_pd3dDevice->Release(); g_pd3dDevice = NULL; } + if (g_pD3D) { g_pD3D->Release(); g_pD3D = NULL; } +} + +void ResetDevice() +{ + ImGui_ImplDX9_InvalidateDeviceObjects(); + HRESULT hr = g_pd3dDevice->Reset(&g_d3dpp); + if (hr == D3DERR_INVALIDCALL) + IM_ASSERT(0); + ImGui_ImplDX9_CreateDeviceObjects(); +} + +// Forward declare message handler from imgui_impl_win32.cpp +extern IMGUI_IMPL_API LRESULT ImGui_ImplWin32_WndProcHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + +// Win32 message handler +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam)) + return true; + + switch (msg) + { + case WM_SIZE: + if (g_pd3dDevice != NULL && wParam != SIZE_MINIMIZED) + { + g_d3dpp.BackBufferWidth = LOWORD(lParam); + g_d3dpp.BackBufferHeight = HIWORD(lParam); + ResetDevice(); + } + return 0; + case WM_SYSCOMMAND: + if ((wParam & 0xfff0) == SC_KEYMENU) // Disable ALT application menu + return 0; + break; + case WM_DESTROY: + ::PostQuitMessage(0); + return 0; + } + return ::DefWindowProcW(hWnd, msg, wParam, lParam); +} diff --git a/ImGui/examples/imgui_examples.sln b/ImGui/examples/imgui_examples.sln new file mode 100644 index 0000000..9b442b2 --- /dev/null +++ b/ImGui/examples/imgui_examples.sln @@ -0,0 +1,141 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32616.157 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx9", "example_win32_directx9\example_win32_directx9.vcxproj", "{4165A294-21F2-44CA-9B38-E3F935ABADF5}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx10", "example_win32_directx10\example_win32_directx10.vcxproj", "{345A953E-A004-4648-B442-DC5F9F11068C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx11", "example_win32_directx11\example_win32_directx11.vcxproj", "{9F316E83-5AE5-4939-A723-305A94F48005}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_win32_directx12", "example_win32_directx12\example_win32_directx12.vcxproj", "{B4CF9797-519D-4AFE-A8F4-5141A6B521D3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_opengl2", "example_glfw_opengl2\example_glfw_opengl2.vcxproj", "{9CDA7840-B7A5-496D-A527-E95571496D18}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_opengl3", "example_glfw_opengl3\example_glfw_opengl3.vcxproj", "{4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_glfw_vulkan", "example_glfw_vulkan\example_glfw_vulkan.vcxproj", "{57E2DF5A-6FC8-45BB-99DD-91A18C646E80}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_directx11", "example_sdl2_directx11\example_sdl2_directx11.vcxproj", "{9E1987E3-1F19-45CA-B9C9-D31E791836D8}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl2", "example_sdl2_opengl2\example_sdl2_opengl2.vcxproj", "{2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_opengl3", "example_sdl2_opengl3\example_sdl2_opengl3.vcxproj", "{BBAEB705-1669-40F3-8567-04CF6A991F4C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_sdlrenderer", "example_sdl2_sdlrenderer\example_sdl2_sdlrenderer.vcxproj", "{0C0B2BEA-311F-473C-9652-87923EF639E3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_sdl2_vulkan", "example_sdl2_vulkan\example_sdl2_vulkan.vcxproj", "{BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|Win32.Build.0 = Debug|Win32 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.ActiveCfg = Debug|x64 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Debug|x64.Build.0 = Debug|x64 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.ActiveCfg = Release|Win32 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|Win32.Build.0 = Release|Win32 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.ActiveCfg = Release|x64 + {4165A294-21F2-44CA-9B38-E3F935ABADF5}.Release|x64.Build.0 = Release|x64 + {345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.ActiveCfg = Debug|Win32 + {345A953E-A004-4648-B442-DC5F9F11068C}.Debug|Win32.Build.0 = Debug|Win32 + {345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.ActiveCfg = Debug|x64 + {345A953E-A004-4648-B442-DC5F9F11068C}.Debug|x64.Build.0 = Debug|x64 + {345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.ActiveCfg = Release|Win32 + {345A953E-A004-4648-B442-DC5F9F11068C}.Release|Win32.Build.0 = Release|Win32 + {345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.ActiveCfg = Release|x64 + {345A953E-A004-4648-B442-DC5F9F11068C}.Release|x64.Build.0 = Release|x64 + {9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.ActiveCfg = Debug|Win32 + {9F316E83-5AE5-4939-A723-305A94F48005}.Debug|Win32.Build.0 = Debug|Win32 + {9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.ActiveCfg = Debug|x64 + {9F316E83-5AE5-4939-A723-305A94F48005}.Debug|x64.Build.0 = Debug|x64 + {9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.ActiveCfg = Release|Win32 + {9F316E83-5AE5-4939-A723-305A94F48005}.Release|Win32.Build.0 = Release|Win32 + {9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.ActiveCfg = Release|x64 + {9F316E83-5AE5-4939-A723-305A94F48005}.Release|x64.Build.0 = Release|x64 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|Win32.ActiveCfg = Debug|Win32 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|Win32.Build.0 = Debug|Win32 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|x64.ActiveCfg = Debug|x64 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Debug|x64.Build.0 = Debug|x64 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|Win32.ActiveCfg = Release|Win32 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|Win32.Build.0 = Release|Win32 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|x64.ActiveCfg = Release|x64 + {B4CF9797-519D-4AFE-A8F4-5141A6B521D3}.Release|x64.Build.0 = Release|x64 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.ActiveCfg = Debug|Win32 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|Win32.Build.0 = Debug|Win32 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.ActiveCfg = Debug|x64 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Debug|x64.Build.0 = Debug|x64 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.ActiveCfg = Release|Win32 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Release|Win32.Build.0 = Release|Win32 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.ActiveCfg = Release|x64 + {9CDA7840-B7A5-496D-A527-E95571496D18}.Release|x64.Build.0 = Release|x64 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.ActiveCfg = Debug|Win32 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|Win32.Build.0 = Debug|Win32 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.ActiveCfg = Debug|x64 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Debug|x64.Build.0 = Debug|x64 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.ActiveCfg = Release|Win32 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|Win32.Build.0 = Release|Win32 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.ActiveCfg = Release|x64 + {4A1FB5EA-22F5-42A8-AB92-1D2DF5D47FB9}.Release|x64.Build.0 = Release|x64 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|Win32.ActiveCfg = Debug|Win32 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|Win32.Build.0 = Debug|Win32 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|x64.ActiveCfg = Debug|x64 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Debug|x64.Build.0 = Debug|x64 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|Win32.ActiveCfg = Release|Win32 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|Win32.Build.0 = Release|Win32 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.ActiveCfg = Release|x64 + {57E2DF5A-6FC8-45BB-99DD-91A18C646E80}.Release|x64.Build.0 = Release|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.ActiveCfg = Debug|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|Win32.Build.0 = Debug|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.ActiveCfg = Debug|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Debug|x64.Build.0 = Debug|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.ActiveCfg = Release|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|Win32.Build.0 = Release|Win32 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.ActiveCfg = Release|x64 + {9E1987E3-1F19-45CA-B9C9-D31E791836D8}.Release|x64.Build.0 = Release|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.ActiveCfg = Debug|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|Win32.Build.0 = Debug|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.ActiveCfg = Debug|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Debug|x64.Build.0 = Debug|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.ActiveCfg = Release|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|Win32.Build.0 = Release|Win32 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.ActiveCfg = Release|x64 + {2AE17FDE-F7F3-4CAC-ADAB-0710EDA4F741}.Release|x64.Build.0 = Release|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.ActiveCfg = Debug|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|Win32.Build.0 = Debug|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.ActiveCfg = Debug|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Debug|x64.Build.0 = Debug|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.ActiveCfg = Release|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|Win32.Build.0 = Release|Win32 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.ActiveCfg = Release|x64 + {BBAEB705-1669-40F3-8567-04CF6A991F4C}.Release|x64.Build.0 = Release|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|Win32.Build.0 = Debug|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.ActiveCfg = Debug|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Debug|x64.Build.0 = Debug|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.ActiveCfg = Release|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|Win32.Build.0 = Release|Win32 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.ActiveCfg = Release|x64 + {0C0B2BEA-311F-473C-9652-87923EF639E3}.Release|x64.Build.0 = Release|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.ActiveCfg = Debug|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|Win32.Build.0 = Debug|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.ActiveCfg = Debug|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Debug|x64.Build.0 = Debug|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.ActiveCfg = Release|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|Win32.Build.0 = Release|Win32 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.ActiveCfg = Release|x64 + {BAE3D0B5-9695-4EB1-AD0F-75890EB4A3B3}.Release|x64.Build.0 = Release|x64 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {B1ACFD20-A0A9-4A4C-ADBA-E7608F0E2BEE} + EndGlobalSection +EndGlobal diff --git a/ImGui/examples/libs/emscripten/emscripten_mainloop_stub.h b/ImGui/examples/libs/emscripten/emscripten_mainloop_stub.h new file mode 100644 index 0000000..05cf60f --- /dev/null +++ b/ImGui/examples/libs/emscripten/emscripten_mainloop_stub.h @@ -0,0 +1,37 @@ +// What does this file solves? +// - Since Dear ImGui 1.00 we took pride that most of our examples applications had their entire +// main-loop inside the main() function. That's because: +// - It makes the examples easier to read, keeping the code sequential. +// - It permit the use of local variables, making it easier to try things and perform quick +// changes when someone needs to quickly test something (vs having to structure the example +// in order to pass data around). This is very important because people use those examples +// to craft easy-to-past repro when they want to discuss features or report issues. +// - It conveys at a glance that this is a no-BS framework, it won't take your main loop away from you. +// - It is generally nice and elegant. +// - However, comes Emscripten... it is a wonderful and magical tech but it requires a "main loop" function. +// - Only some of our examples would run on Emscripten. Typically the ones rendering with GL or WGPU ones. +// - I tried to refactor those examples but felt it was problematic that other examples didn't follow the +// same layout. Why would the SDL+GL example be structured one way and the SGL+DX11 be structured differently? +// Especially as we are trying hard to convey that using a Dear ImGui backend in an *existing application* +// should requires only a few dozens lines of code, and this should be consistent and symmetrical for all backends. +// - So the next logical step was to refactor all examples to follow that layout of using a "main loop" function. +// This worked, but it made us lose all the nice things we had... + +// Since only about 3 examples really need to run with Emscripten, here's our solution: +// - Use some weird macros and capturing lambda to turn a loop in main() into a function. +// - Hide all that crap in this file so it doesn't make our examples unusually ugly. +// As a stance and principle of Dear ImGui development we don't use C++ headers and we don't +// want to suggest to the newcomer that we would ever use C++ headers as this would affect +// the initial judgment of many of our target audience. +// - Technique is based on this idea: https://github.com/ocornut/imgui/pull/2492/ +#ifdef __EMSCRIPTEN__ +#include +#include +static std::function MainLoopForEmscriptenP; +static void MainLoopForEmscripten() { MainLoopForEmscriptenP(); } +#define EMSCRIPTEN_MAINLOOP_BEGIN MainLoopForEmscriptenP = [&]() +#define EMSCRIPTEN_MAINLOOP_END ; emscripten_set_main_loop(MainLoopForEmscripten, 0, true) +#else +#define EMSCRIPTEN_MAINLOOP_BEGIN +#define EMSCRIPTEN_MAINLOOP_END +#endif diff --git a/ImGui/examples/libs/emscripten/shell_minimal.html b/ImGui/examples/libs/emscripten/shell_minimal.html new file mode 100644 index 0000000..bcf6262 --- /dev/null +++ b/ImGui/examples/libs/emscripten/shell_minimal.html @@ -0,0 +1,65 @@ + + + + + + Dear ImGui Emscripten example + + + + + + {{{ SCRIPT }}} + + diff --git a/ImGui/examples/libs/glfw/COPYING.txt b/ImGui/examples/libs/glfw/COPYING.txt new file mode 100644 index 0000000..b30c701 --- /dev/null +++ b/ImGui/examples/libs/glfw/COPYING.txt @@ -0,0 +1,22 @@ +Copyright (c) 2002-2006 Marcus Geelnard +Copyright (c) 2006-2010 Camilla Berglund + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would + be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not + be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source + distribution. + diff --git a/ImGui/examples/libs/glfw/include/GLFW/glfw3.h b/ImGui/examples/libs/glfw/include/GLFW/glfw3.h new file mode 100644 index 0000000..f8ca3d6 --- /dev/null +++ b/ImGui/examples/libs/glfw/include/GLFW/glfw3.h @@ -0,0 +1,4227 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_h_ +#define _glfw3_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @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 + * + * 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 reference + * + * 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 + * + * 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 + * + * 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 + * + * 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 + * + * 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 */ + +/* It is customary to use APIENTRY for OpenGL function pointer declarations on + * all platforms. Additionally, the Windows OpenGL header needs APIENTRY. + */ +#ifndef APIENTRY + #ifdef _WIN32 + #define APIENTRY __stdcall + #else + #define APIENTRY + #endif +#endif /* APIENTRY */ + +/* Some Windows OpenGL headers need this. + */ +#if !defined(WINGDIAPI) && defined(_WIN32) + #define WINGDIAPI __declspec(dllimport) + #define GLFW_WINGDIAPI_DEFINED +#endif /* WINGDIAPI */ + +/* Some Windows GLU headers need this. + */ +#if !defined(CALLBACK) && defined(_WIN32) + #define CALLBACK __stdcall + #define GLFW_CALLBACK_DEFINED +#endif /* CALLBACK */ + +/* Most Windows GLU headers need wchar_t. + * The OS X OpenGL header blocks the definition of ptrdiff_t by glext.h. + * Include it unconditionally to avoid surprising side-effects. + */ +#include +#include + +/* Include the chosen client API headers. + */ +#if defined(__APPLE__) + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif !defined(GLFW_INCLUDE_NONE) + #if !defined(GLFW_INCLUDE_GLEXT) + #define GL_GLEXT_LEGACY + #endif + #include + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#else + #if defined(GLFW_INCLUDE_GLCOREARB) + #include + #elif defined(GLFW_INCLUDE_ES1) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES2) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES3) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_ES31) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #elif defined(GLFW_INCLUDE_VULKAN) + #include + #elif !defined(GLFW_INCLUDE_NONE) + #include + #if defined(GLFW_INCLUDE_GLEXT) + #include + #endif + #endif + #if defined(GLFW_INCLUDE_GLU) + #include + #endif +#endif + +#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) + /* GLFW_DLL must be defined by applications that are linking against the DLL + * version of the GLFW library. _GLFW_BUILD_DLL is defined by the GLFW + * configuration header when compiling the DLL version of the library. + */ + #error "You 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 GLFW as a Win32 DLL */ + #define GLFWAPI __declspec(dllimport) +#elif defined(__GNUC__) && defined(_GLFW_BUILD_DLL) + /* We are building GLFW as a shared / dynamic library */ + #define GLFWAPI __attribute__((visibility("default"))) +#else + /* We are building or calling GLFW as a static library */ + #define GLFWAPI +#endif + + +/************************************************************************* + * GLFW API tokens + *************************************************************************/ + +/*! @name GLFW version macros + * @{ */ +/*! @brief The major version number of the GLFW library. + * + * This is incremented when the API is changed in non-compatible ways. + * @ingroup init + */ +#define GLFW_VERSION_MAJOR 3 +/*! @brief The minor version number of the GLFW library. + * + * This is incremented when features are added to the API but it remains + * backward-compatible. + * @ingroup init + */ +#define GLFW_VERSION_MINOR 2 +/*! @brief The revision number of the GLFW library. + * + * This is incremented when a bug fix release is made that does not contain any + * API changes. + * @ingroup init + */ +#define GLFW_VERSION_REVISION 0 +/*! @} */ + +/*! @name Boolean values + * @{ */ +/*! @brief One. + * + * One. Seriously. You don't _need_ to use this symbol in your code. It's + * just semantic sugar for the number 1. You can use `1` or `true` or `_True` + * or `GL_TRUE` or whatever you want. + */ +#define GLFW_TRUE 1 +/*! @brief Zero. + * + * Zero. Seriously. You don't _need_ to use this symbol in your code. It's + * just just semantic sugar for the number 0. You can use `0` or `false` or + * `_False` or `GL_FALSE` or whatever you want. + */ +#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 keys Keyboard keys + * + * See [key input](@ref input_key) for how these are used. + * + * These key codes are inspired by the _USB HID Usage Tables v1.12_ (p. 53-60), + * but re-arranged to map to 7-bit ASCII for printable keys (function keys are + * put in the 256+ range). + * + * The naming of the key codes follow these rules: + * - The US keyboard layout is used + * - Names of printable alpha-numeric characters are used (e.g. "A", "R", + * "3", etc.) + * - For non-alphanumeric characters, Unicode:ish names are used (e.g. + * "COMMA", "LEFT_SQUARE_BRACKET", etc.). Note that some names do not + * correspond to the Unicode standard (usually for brevity) + * - Keys that lack a clear US mapping are named "WORLD_x" + * - For non-printable keys, custom names are used (e.g. "F4", + * "BACKSPACE", etc.) + * + * @ingroup input + * @{ + */ + +/* The unknown key */ +#define GLFW_KEY_UNKNOWN -1 + +/* Printable keys */ +#define GLFW_KEY_SPACE 32 +#define GLFW_KEY_APOSTROPHE 39 /* ' */ +#define GLFW_KEY_COMMA 44 /* , */ +#define GLFW_KEY_MINUS 45 /* - */ +#define GLFW_KEY_PERIOD 46 /* . */ +#define GLFW_KEY_SLASH 47 /* / */ +#define GLFW_KEY_0 48 +#define GLFW_KEY_1 49 +#define GLFW_KEY_2 50 +#define GLFW_KEY_3 51 +#define GLFW_KEY_4 52 +#define GLFW_KEY_5 53 +#define GLFW_KEY_6 54 +#define GLFW_KEY_7 55 +#define GLFW_KEY_8 56 +#define GLFW_KEY_9 57 +#define GLFW_KEY_SEMICOLON 59 /* ; */ +#define GLFW_KEY_EQUAL 61 /* = */ +#define GLFW_KEY_A 65 +#define GLFW_KEY_B 66 +#define GLFW_KEY_C 67 +#define GLFW_KEY_D 68 +#define GLFW_KEY_E 69 +#define GLFW_KEY_F 70 +#define GLFW_KEY_G 71 +#define GLFW_KEY_H 72 +#define GLFW_KEY_I 73 +#define GLFW_KEY_J 74 +#define GLFW_KEY_K 75 +#define GLFW_KEY_L 76 +#define GLFW_KEY_M 77 +#define GLFW_KEY_N 78 +#define GLFW_KEY_O 79 +#define GLFW_KEY_P 80 +#define GLFW_KEY_Q 81 +#define GLFW_KEY_R 82 +#define GLFW_KEY_S 83 +#define GLFW_KEY_T 84 +#define GLFW_KEY_U 85 +#define GLFW_KEY_V 86 +#define GLFW_KEY_W 87 +#define GLFW_KEY_X 88 +#define GLFW_KEY_Y 89 +#define GLFW_KEY_Z 90 +#define GLFW_KEY_LEFT_BRACKET 91 /* [ */ +#define GLFW_KEY_BACKSLASH 92 /* \ */ +#define GLFW_KEY_RIGHT_BRACKET 93 /* ] */ +#define GLFW_KEY_GRAVE_ACCENT 96 /* ` */ +#define GLFW_KEY_WORLD_1 161 /* non-US #1 */ +#define GLFW_KEY_WORLD_2 162 /* non-US #2 */ + +/* Function keys */ +#define GLFW_KEY_ESCAPE 256 +#define GLFW_KEY_ENTER 257 +#define GLFW_KEY_TAB 258 +#define GLFW_KEY_BACKSPACE 259 +#define GLFW_KEY_INSERT 260 +#define GLFW_KEY_DELETE 261 +#define GLFW_KEY_RIGHT 262 +#define GLFW_KEY_LEFT 263 +#define GLFW_KEY_DOWN 264 +#define GLFW_KEY_UP 265 +#define GLFW_KEY_PAGE_UP 266 +#define GLFW_KEY_PAGE_DOWN 267 +#define GLFW_KEY_HOME 268 +#define GLFW_KEY_END 269 +#define GLFW_KEY_CAPS_LOCK 280 +#define GLFW_KEY_SCROLL_LOCK 281 +#define GLFW_KEY_NUM_LOCK 282 +#define GLFW_KEY_PRINT_SCREEN 283 +#define GLFW_KEY_PAUSE 284 +#define GLFW_KEY_F1 290 +#define GLFW_KEY_F2 291 +#define GLFW_KEY_F3 292 +#define GLFW_KEY_F4 293 +#define GLFW_KEY_F5 294 +#define GLFW_KEY_F6 295 +#define GLFW_KEY_F7 296 +#define GLFW_KEY_F8 297 +#define GLFW_KEY_F9 298 +#define GLFW_KEY_F10 299 +#define GLFW_KEY_F11 300 +#define GLFW_KEY_F12 301 +#define GLFW_KEY_F13 302 +#define GLFW_KEY_F14 303 +#define GLFW_KEY_F15 304 +#define GLFW_KEY_F16 305 +#define GLFW_KEY_F17 306 +#define GLFW_KEY_F18 307 +#define GLFW_KEY_F19 308 +#define GLFW_KEY_F20 309 +#define GLFW_KEY_F21 310 +#define GLFW_KEY_F22 311 +#define GLFW_KEY_F23 312 +#define GLFW_KEY_F24 313 +#define GLFW_KEY_F25 314 +#define GLFW_KEY_KP_0 320 +#define GLFW_KEY_KP_1 321 +#define GLFW_KEY_KP_2 322 +#define GLFW_KEY_KP_3 323 +#define GLFW_KEY_KP_4 324 +#define GLFW_KEY_KP_5 325 +#define GLFW_KEY_KP_6 326 +#define GLFW_KEY_KP_7 327 +#define GLFW_KEY_KP_8 328 +#define GLFW_KEY_KP_9 329 +#define GLFW_KEY_KP_DECIMAL 330 +#define GLFW_KEY_KP_DIVIDE 331 +#define GLFW_KEY_KP_MULTIPLY 332 +#define GLFW_KEY_KP_SUBTRACT 333 +#define GLFW_KEY_KP_ADD 334 +#define GLFW_KEY_KP_ENTER 335 +#define GLFW_KEY_KP_EQUAL 336 +#define GLFW_KEY_LEFT_SHIFT 340 +#define GLFW_KEY_LEFT_CONTROL 341 +#define GLFW_KEY_LEFT_ALT 342 +#define GLFW_KEY_LEFT_SUPER 343 +#define GLFW_KEY_RIGHT_SHIFT 344 +#define GLFW_KEY_RIGHT_CONTROL 345 +#define GLFW_KEY_RIGHT_ALT 346 +#define GLFW_KEY_RIGHT_SUPER 347 +#define GLFW_KEY_MENU 348 + +#define GLFW_KEY_LAST GLFW_KEY_MENU + +/*! @} */ + +/*! @defgroup mods Modifier key flags + * + * See [key input](@ref input_key) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief If this bit is set one or more Shift keys were held down. + */ +#define GLFW_MOD_SHIFT 0x0001 +/*! @brief If this bit is set one or more Control keys were held down. + */ +#define GLFW_MOD_CONTROL 0x0002 +/*! @brief If this bit is set one or more Alt keys were held down. + */ +#define GLFW_MOD_ALT 0x0004 +/*! @brief If this bit is set one or more Super keys were held down. + */ +#define GLFW_MOD_SUPER 0x0008 + +/*! @} */ + +/*! @defgroup buttons Mouse buttons + * + * See [mouse button input](@ref input_mouse_button) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_MOUSE_BUTTON_1 0 +#define GLFW_MOUSE_BUTTON_2 1 +#define GLFW_MOUSE_BUTTON_3 2 +#define GLFW_MOUSE_BUTTON_4 3 +#define GLFW_MOUSE_BUTTON_5 4 +#define GLFW_MOUSE_BUTTON_6 5 +#define GLFW_MOUSE_BUTTON_7 6 +#define GLFW_MOUSE_BUTTON_8 7 +#define GLFW_MOUSE_BUTTON_LAST GLFW_MOUSE_BUTTON_8 +#define GLFW_MOUSE_BUTTON_LEFT GLFW_MOUSE_BUTTON_1 +#define GLFW_MOUSE_BUTTON_RIGHT GLFW_MOUSE_BUTTON_2 +#define GLFW_MOUSE_BUTTON_MIDDLE GLFW_MOUSE_BUTTON_3 +/*! @} */ + +/*! @defgroup joysticks Joysticks + * + * See [joystick input](@ref joystick) for how these are used. + * + * @ingroup input + * @{ */ +#define GLFW_JOYSTICK_1 0 +#define GLFW_JOYSTICK_2 1 +#define GLFW_JOYSTICK_3 2 +#define GLFW_JOYSTICK_4 3 +#define GLFW_JOYSTICK_5 4 +#define GLFW_JOYSTICK_6 5 +#define GLFW_JOYSTICK_7 6 +#define GLFW_JOYSTICK_8 7 +#define GLFW_JOYSTICK_9 8 +#define GLFW_JOYSTICK_10 9 +#define GLFW_JOYSTICK_11 10 +#define GLFW_JOYSTICK_12 11 +#define GLFW_JOYSTICK_13 12 +#define GLFW_JOYSTICK_14 13 +#define GLFW_JOYSTICK_15 14 +#define GLFW_JOYSTICK_16 15 +#define GLFW_JOYSTICK_LAST GLFW_JOYSTICK_16 +/*! @} */ + +/*! @defgroup errors Error codes + * + * See [error handling](@ref error_handling) for how these are used. + * + * @ingroup init + * @{ */ +/*! @brief GLFW has not been initialized. + * + * This occurs if a GLFW function was called that 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 [GLFW_RED_BITS](@ref window_hints_fb) 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 backend. + * Below are a few examples. + * + * @par + * Some pre-installed Windows graphics drivers do not support OpenGL. AMD only + * supports OpenGL ES via EGL, while Nvidia and Intel only support it via + * a WGL or GLX extension. OS X does not provide OpenGL ES at all. The Mesa + * EGL, OpenGL and OpenGL ES libraries do not interface with the Nvidia binary + * driver. 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 +/*! @} */ + +#define GLFW_FOCUSED 0x00020001 +#define GLFW_ICONIFIED 0x00020002 +#define GLFW_RESIZABLE 0x00020003 +#define GLFW_VISIBLE 0x00020004 +#define GLFW_DECORATED 0x00020005 +#define GLFW_AUTO_ICONIFY 0x00020006 +#define GLFW_FLOATING 0x00020007 +#define GLFW_MAXIMIZED 0x00020008 + +#define GLFW_RED_BITS 0x00021001 +#define GLFW_GREEN_BITS 0x00021002 +#define GLFW_BLUE_BITS 0x00021003 +#define GLFW_ALPHA_BITS 0x00021004 +#define GLFW_DEPTH_BITS 0x00021005 +#define GLFW_STENCIL_BITS 0x00021006 +#define GLFW_ACCUM_RED_BITS 0x00021007 +#define GLFW_ACCUM_GREEN_BITS 0x00021008 +#define GLFW_ACCUM_BLUE_BITS 0x00021009 +#define GLFW_ACCUM_ALPHA_BITS 0x0002100A +#define GLFW_AUX_BUFFERS 0x0002100B +#define GLFW_STEREO 0x0002100C +#define GLFW_SAMPLES 0x0002100D +#define GLFW_SRGB_CAPABLE 0x0002100E +#define GLFW_REFRESH_RATE 0x0002100F +#define GLFW_DOUBLEBUFFER 0x00021010 + +#define GLFW_CLIENT_API 0x00022001 +#define GLFW_CONTEXT_VERSION_MAJOR 0x00022002 +#define GLFW_CONTEXT_VERSION_MINOR 0x00022003 +#define GLFW_CONTEXT_REVISION 0x00022004 +#define GLFW_CONTEXT_ROBUSTNESS 0x00022005 +#define GLFW_OPENGL_FORWARD_COMPAT 0x00022006 +#define GLFW_OPENGL_DEBUG_CONTEXT 0x00022007 +#define GLFW_OPENGL_PROFILE 0x00022008 +#define GLFW_CONTEXT_RELEASE_BEHAVIOR 0x00022009 +#define GLFW_CONTEXT_NO_ERROR 0x0002200A + +#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_CURSOR_NORMAL 0x00034001 +#define GLFW_CURSOR_HIDDEN 0x00034002 +#define GLFW_CURSOR_DISABLED 0x00034003 + +#define GLFW_ANY_RELEASE_BEHAVIOR 0 +#define GLFW_RELEASE_BEHAVIOR_FLUSH 0x00035001 +#define GLFW_RELEASE_BEHAVIOR_NONE 0x00035002 + +/*! @defgroup shapes Standard cursor shapes + * + * See [standard cursor creation](@ref cursor_standard) for how these are used. + * + * @ingroup input + * @{ */ + +/*! @brief The regular arrow cursor shape. + * + * The regular arrow cursor. + */ +#define GLFW_ARROW_CURSOR 0x00036001 +/*! @brief The text input I-beam cursor shape. + * + * The text input I-beam cursor shape. + */ +#define GLFW_IBEAM_CURSOR 0x00036002 +/*! @brief The crosshair shape. + * + * The crosshair shape. + */ +#define GLFW_CROSSHAIR_CURSOR 0x00036003 +/*! @brief The hand shape. + * + * The hand shape. + */ +#define GLFW_HAND_CURSOR 0x00036004 +/*! @brief The horizontal resize arrow shape. + * + * The horizontal resize arrow shape. + */ +#define GLFW_HRESIZE_CURSOR 0x00036005 +/*! @brief The vertical resize arrow shape. + * + * The vertical resize arrow shape. + */ +#define GLFW_VRESIZE_CURSOR 0x00036006 +/*! @} */ + +#define GLFW_CONNECTED 0x00040001 +#define GLFW_DISCONNECTED 0x00040002 + +#define GLFW_DONT_CARE -1 + + +/************************************************************************* + * GLFW API types + *************************************************************************/ + +/*! @brief Client API function pointer type. + * + * Generic function pointer used for returning client API function pointers + * without forcing a cast from a regular pointer. + * + * @sa @ref context_glext + * @sa 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 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 cursor + */ +typedef struct GLFWcursor GLFWcursor; + +/*! @brief The function signature for error callbacks. + * + * This is the function signature for error callback functions. + * + * @param[in] error An [error code](@ref errors). + * @param[in] description A UTF-8 encoded string describing the error. + * + * @sa @ref error_handling + * @sa glfwSetErrorCallback + * + * @since Added in version 3.0. + * + * @ingroup init + */ +typedef void (* GLFWerrorfun)(int,const char*); + +/*! @brief The function signature for window position callbacks. + * + * This is the function signature for window position callback functions. + * + * @param[in] window The window that was moved. + * @param[in] xpos The new x-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * @param[in] ypos The new y-coordinate, in screen coordinates, of the + * upper-left corner of the client area of the window. + * + * @sa @ref window_pos + * @sa glfwSetWindowPosCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowposfun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window resize callbacks. + * + * This is the function signature for window size callback functions. + * + * @param[in] window The window that was resized. + * @param[in] width The new width, in screen coordinates, of the window. + * @param[in] height The new height, in screen coordinates, of the window. + * + * @sa @ref window_size + * @sa glfwSetWindowSizeCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowsizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for window close callbacks. + * + * This is the function signature for window close callback functions. + * + * @param[in] window The window that the user attempted to close. + * + * @sa @ref window_close + * @sa glfwSetWindowCloseCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowclosefun)(GLFWwindow*); + +/*! @brief The function signature for window content refresh callbacks. + * + * This is the function signature for window refresh callback functions. + * + * @param[in] window The window whose content needs to be refreshed. + * + * @sa @ref window_refresh + * @sa glfwSetWindowRefreshCallback + * + * @since Added in version 2.5. + * @glfw3 Added window handle parameter. + * + * @ingroup window + */ +typedef void (* GLFWwindowrefreshfun)(GLFWwindow*); + +/*! @brief The function signature for window focus/defocus callbacks. + * + * This is the function signature for window focus callback functions. + * + * @param[in] window The window that gained or lost input focus. + * @param[in] focused `GLFW_TRUE` if the window was given input focus, or + * `GLFW_FALSE` if it lost it. + * + * @sa @ref window_focus + * @sa glfwSetWindowFocusCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowfocusfun)(GLFWwindow*,int); + +/*! @brief The function signature for window iconify/restore callbacks. + * + * This is the function signature for window iconify/restore callback + * functions. + * + * @param[in] window The window that was iconified or restored. + * @param[in] iconified `GLFW_TRUE` if the window was iconified, or + * `GLFW_FALSE` if it was restored. + * + * @sa @ref window_iconify + * @sa glfwSetWindowIconifyCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWwindowiconifyfun)(GLFWwindow*,int); + +/*! @brief The function signature for framebuffer resize callbacks. + * + * This is the function signature for framebuffer resize callback + * functions. + * + * @param[in] window The window whose framebuffer was resized. + * @param[in] width The new width, in pixels, of the framebuffer. + * @param[in] height The new height, in pixels, of the framebuffer. + * + * @sa @ref window_fbsize + * @sa glfwSetFramebufferSizeCallback + * + * @since Added in version 3.0. + * + * @ingroup window + */ +typedef void (* GLFWframebuffersizefun)(GLFWwindow*,int,int); + +/*! @brief The function signature for mouse button callbacks. + * + * This is the function signature for mouse button callback functions. + * + * @param[in] window The window that received the event. + * @param[in] button The [mouse button](@ref buttons) that was pressed or + * released. + * @param[in] action One of `GLFW_PRESS` or `GLFW_RELEASE`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_mouse_button + * @sa glfwSetMouseButtonCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWmousebuttonfun)(GLFWwindow*,int,int,int); + +/*! @brief The function signature for cursor position callbacks. + * + * This is the function signature for cursor position callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xpos The new cursor x-coordinate, relative to the left edge of + * the client area. + * @param[in] ypos The new cursor y-coordinate, relative to the top edge of the + * client area. + * + * @sa @ref cursor_pos + * @sa glfwSetCursorPosCallback + * + * @since Added in version 3.0. Replaces `GLFWmouseposfun`. + * + * @ingroup input + */ +typedef void (* GLFWcursorposfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for cursor enter/leave callbacks. + * + * This is the function signature for cursor enter/leave callback functions. + * + * @param[in] window The window that received the event. + * @param[in] entered `GLFW_TRUE` if the cursor entered the window's client + * area, or `GLFW_FALSE` if it left it. + * + * @sa @ref cursor_enter + * @sa glfwSetCursorEnterCallback + * + * @since Added in version 3.0. + * + * @ingroup input + */ +typedef void (* GLFWcursorenterfun)(GLFWwindow*,int); + +/*! @brief The function signature for scroll callbacks. + * + * This is the function signature for scroll callback functions. + * + * @param[in] window The window that received the event. + * @param[in] xoffset The scroll offset along the x-axis. + * @param[in] yoffset The scroll offset along the y-axis. + * + * @sa @ref scrolling + * @sa glfwSetScrollCallback + * + * @since Added in version 3.0. Replaces `GLFWmousewheelfun`. + * + * @ingroup input + */ +typedef void (* GLFWscrollfun)(GLFWwindow*,double,double); + +/*! @brief The function signature for keyboard key callbacks. + * + * This is the function signature for keyboard key callback functions. + * + * @param[in] window The window that received the event. + * @param[in] key The [keyboard key](@ref keys) that was pressed or released. + * @param[in] scancode The system-specific scancode of the key. + * @param[in] action `GLFW_PRESS`, `GLFW_RELEASE` or `GLFW_REPEAT`. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_key + * @sa glfwSetKeyCallback + * + * @since Added in version 1.0. + * @glfw3 Added window handle, scancode and modifier mask parameters. + * + * @ingroup input + */ +typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int); + +/*! @brief The function signature for Unicode character callbacks. + * + * This is the function signature for Unicode character callback functions. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * + * @sa @ref input_char + * @sa glfwSetCharCallback + * + * @since Added in version 2.4. + * @glfw3 Added window handle parameter. + * + * @ingroup input + */ +typedef void (* GLFWcharfun)(GLFWwindow*,unsigned int); + +/*! @brief The function signature for Unicode character with modifiers + * callbacks. + * + * This is the function signature for Unicode character with modifiers callback + * functions. It is called for each input character, regardless of what + * modifier keys are held down. + * + * @param[in] window The window that received the event. + * @param[in] codepoint The Unicode code point of the character. + * @param[in] mods Bit field describing which [modifier keys](@ref mods) were + * held down. + * + * @sa @ref input_char + * @sa glfwSetCharModsCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWcharmodsfun)(GLFWwindow*,unsigned int,int); + +/*! @brief The function signature for file drop callbacks. + * + * This is the function signature for file drop callbacks. + * + * @param[in] window The window that received the event. + * @param[in] count The number of dropped files. + * @param[in] paths The UTF-8 encoded file and/or directory path names. + * + * @sa @ref path_drop + * @sa glfwSetDropCallback + * + * @since Added in version 3.1. + * + * @ingroup input + */ +typedef void (* GLFWdropfun)(GLFWwindow*,int,const char**); + +/*! @brief The function signature for monitor configuration callbacks. + * + * This is the function signature for monitor configuration callback functions. + * + * @param[in] monitor The monitor that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa @ref monitor_event + * @sa glfwSetMonitorCallback + * + * @since Added in version 3.0. + * + * @ingroup monitor + */ +typedef void (* GLFWmonitorfun)(GLFWmonitor*,int); + +/*! @brief The function signature for joystick configuration callbacks. + * + * This is the function signature for joystick configuration callback + * functions. + * + * @param[in] joy The joystick that was connected or disconnected. + * @param[in] event One of `GLFW_CONNECTED` or `GLFW_DISCONNECTED`. + * + * @sa @ref joystick_event + * @sa glfwSetJoystickCallback + * + * @since Added in version 3.2. + * + * @ingroup input + */ +typedef void (* GLFWjoystickfun)(int,int); + +/*! @brief Video mode type. + * + * This describes a single video mode. + * + * @sa @ref monitor_modes + * @sa glfwGetVideoMode 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 glfwGetGammaRamp 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. + * + * @sa @ref cursor_custom + * + * @since Added in version 2.1. + * @glfw3 Removed format and bytes-per-pixel members. + */ +typedef struct GLFWimage +{ + /*! The width, in pixels, of this image. + */ + int width; + /*! The height, in pixels, of this image. + */ + int height; + /*! The pixel data of this image, arranged left-to-right, top-to-bottom. + */ + unsigned char* pixels; +} GLFWimage; + + +/************************************************************************* + * GLFW API functions + *************************************************************************/ + +/*! @brief Initializes the GLFW library. + * + * This function initializes the GLFW library. Before most GLFW functions can + * be used, GLFW must be initialized, and before an application terminates GLFW + * should be terminated in order to free any resources allocated during or + * after initialization. + * + * If this function fails, it calls @ref glfwTerminate before returning. If it + * succeeds, you should call @ref glfwTerminate before the application exits. + * + * Additional calls to this function after successful initialization but before + * termination will return `GLFW_TRUE` immediately. + * + * @return `GLFW_TRUE` if successful, or `GLFW_FALSE` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_PLATFORM_ERROR. + * + * @remark @osx This function will change the current directory of the + * application to the `Contents/Resources` subdirectory of the application's + * bundle, if present. This can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref intro_init + * @sa 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. + * + * @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 glfwInit + * + * @since Added in version 1.0. + * + * @ingroup init + */ +GLFWAPI void glfwTerminate(void); + +/*! @brief Retrieves the version of the GLFW library. + * + * This function retrieves the major, minor and revision numbers of the GLFW + * library. It is intended for when you are using GLFW as a shared library and + * want to ensure that you are using the minimum required version. + * + * Any or all of the version arguments may be `NULL`. + * + * @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 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, platform, compiler and any platform-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. + * + * @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 glfwGetVersion + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI const char* glfwGetVersionString(void); + +/*! @brief Sets the error callback. + * + * This function sets the error callback, which is called with an error code + * and a human-readable description each time a GLFW error occurs. + * + * The error callback is called on the thread where the error occurred. If you + * are using GLFW from multiple threads, your error callback needs to be + * written accordingly. + * + * Because the description string may have been generated specifically for that + * error, it is not guaranteed to be valid after the callback has returned. If + * you wish to use it after the callback returns, you need to make a copy. + * + * Once set, the error callback remains set even after the library has been + * terminated. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set. + * + * @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 + * + * @since Added in version 3.0. + * + * @ingroup init + */ +GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cbfun); + +/*! @brief Returns the currently connected monitors. + * + * This function returns an array of handles for all currently connected + * monitors. 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 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 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 Returns the physical size of the monitor. + * + * This function returns the size, in millimetres, of the display area of the + * specified monitor. + * + * Some systems do not provide accurate monitor size information, either + * because the monitor + * [EDID](https://en.wikipedia.org/wiki/Extended_display_identification_data) + * data is incorrect or because the driver does not report it accurately. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] monitor The monitor to query. + * @param[out] widthMM Where to store the width, in millimetres, of the + * monitor's display area, or `NULL`. + * @param[out] heightMM Where to store the height, in millimetres, of the + * monitor's display area, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @win32 calculates the returned physical size 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 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 monitor configuration callback. + * + * This function sets the monitor configuration callback, or removes the + * currently set callback. This is called when a monitor is connected to or + * disconnected from the system. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Returns the available video modes for the specified monitor. + * + * This function returns an array of all video modes supported by the specified + * monitor. The returned array is sorted in ascending order, first by color + * bit depth (the sum of all channel depths) and then by resolution area (the + * product of width and height). + * + * @param[in] monitor The monitor to query. + * @param[out] count Where to store the number of video modes in the returned + * array. This is set to zero if an error occurred. + * @return An array of video modes, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @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 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 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 a 256-element gamma ramp from the specified exponent + * and then calls @ref glfwSetGammaRamp with it. The value must be a finite + * number greater than zero. + * + * @param[in] monitor The monitor whose gamma ramp to set. + * @param[in] gamma The desired exponent. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_VALUE and @ref GLFW_PLATFORM_ERROR. + * + * @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 and @ref + * GLFW_PLATFORM_ERROR. + * + * @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. + * + * @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 and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark Gamma ramp sizes other than 256 are not supported by all platforms + * or graphics hardware. + * + * @remark @win32 The gamma ramp size must be 256. + * + * @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 glfwWindowHint + * + * @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 @ref + * glfwWindowHint or @ref glfwDefaultWindowHints, or until the library is + * terminated. + * + * 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. + * + * @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 glfwDefaultWindowHints + * + * @since Added in version 3.0. Replaces `glfwOpenWindowHint`. + * + * @ingroup window + */ +GLFWAPI void glfwWindowHint(int hint, int 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. + * + * By default, newly created windows use the placement recommended by the + * window system. To create the window at a specific position, make it + * initially invisible using the [GLFW_VISIBLE](@ref window_hints_wnd) window + * hint, set its [position](@ref window_pos) and then [show](@ref window_hide) + * it. + * + * 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 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 icon for the window. If no such icon is present, the + * `IDI_WINLOGO` icon will be used instead. + * + * @remark @win32 The context to share resources with must not be current on + * any other thread. + * + * @remark @osx The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @remark @osx The first time a window is created the menu bar is populated + * with common commands like Hide, Quit and About. The About entry opens + * a minimal about dialog with information from the application's bundle. The + * menu bar can be disabled with a + * [compile-time option](@ref compile_options_osx). + * + * @remark @osx On OS X 10.10 and later the window frame will not be rendered + * at full resolution on Retina displays unless the `NSHighResolutionCapable` + * key is enabled in the application bundle's `Info.plist`. For more + * information, see + * [High Resolution Guidelines for OS X](https://developer.apple.com/library/mac/documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Explained/Explained.html) + * in the Mac Developer Library. The GLFW test and example programs use + * a custom `Info.plist` template for this, which can be found as + * `CMake/MacOSXBundleInfo.plist.in` in the source tree. + * + * @remark @x11 There is no mechanism for setting the window icon yet. + * + * @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. + * + * @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 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 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 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 @osx 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 + * + * @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 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 and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @remark @osx The GLFW window has no icon, as it is not a document + * window, but the dock icon will be the same as the application bundle's icon. + * For more information on bundles, see the + * [Bundle Programming Guide](https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFBundles/) + * in the Mac Developer Library. + * + * @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 client area of the specified window. + * + * This function retrieves the position, in screen coordinates, of the + * upper-left corner of the client area of the specified window. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The window to query. + * @param[out] xpos Where to store the x-coordinate of the upper-left corner of + * the client area, or `NULL`. + * @param[out] ypos Where to store the y-coordinate of the upper-left corner of + * the client area, or `NULL`. + * + * @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_pos + * @sa glfwSetWindowPos + * + * @since Added in version 3.0. + * + * @ingroup window + */ +GLFWAPI void glfwGetWindowPos(GLFWwindow* window, int* xpos, int* ypos); + +/*! @brief Sets the position of the client area of the specified window. + * + * This function sets the position, in screen coordinates, of the upper-left + * corner of the client area of the specified windowed mode window. If the + * window is a full screen window, this function does nothing. + * + * __Do not use this function__ to move an already visible window unless you + * have very good reasons for doing so, as it will confuse and annoy the user. + * + * The window manager may put limits on what positions are allowed. GLFW + * cannot and should not override these limits. + * + * @param[in] window The window to query. + * @param[in] xpos The x-coordinate of the upper-left corner of the client area. + * @param[in] ypos The y-coordinate of the upper-left corner of the client area. + * + * @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_pos + * @sa 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 client area of the specified window. + * + * This function retrieves the size, in screen coordinates, of the client area + * of the specified window. If you wish to retrieve the size of the + * framebuffer of the window in pixels, see @ref glfwGetFramebufferSize. + * + * Any or all of the size arguments may be `NULL`. If an error occurs, all + * non-`NULL` size arguments will be set to zero. + * + * @param[in] window The window whose size to retrieve. + * @param[out] width Where to store the width, in screen coordinates, of the + * client area, or `NULL`. + * @param[out] height Where to store the height, in screen coordinates, of the + * client area, or `NULL`. + * + * @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 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 client area of the specified + * window. If the window is full screen, the size limits only take effect if + * 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. + * + * @param[in] window The window to set limits for. + * @param[in] minwidth The minimum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] minheight The minimum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * @param[in] maxwidth The maximum width, in screen coordinates, of the client + * area, or `GLFW_DONT_CARE`. + * @param[in] maxheight The maximum height, in screen coordinates, of the + * client area, or `GLFW_DONT_CARE`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark If you set size limits and an aspect ratio that conflict, the + * results are undefined. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa 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 client 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. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_sizelimits + * @sa glfwSetWindowSizeLimits + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwSetWindowAspectRatio(GLFWwindow* window, int numer, int denom); + +/*! @brief Sets the size of the client area of the specified window. + * + * This function sets the size, in screen coordinates, of the client area of + * the specified window. + * + * For full screen windows, this function 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 + * client area. + * @param[in] height The desired height, in screen coordinates, of the window + * client 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 glfwGetWindowSize + * @sa 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 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 Iconifies the specified window. + * + * This function iconifies (minimizes) the specified window if it was + * previously restored. If the window is already iconified, this function does + * nothing. + * + * If the specified window is a full screen window, the original monitor + * resolution is restored until the window is restored. + * + * @param[in] window The window to iconify. + * + * @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 glfwRestoreWindow + * @sa 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 a full screen window, the resolution chosen for + * the window is restored on the selected monitor. + * + * @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 glfwIconifyWindow + * @sa 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. + * + * @par Thread Safety + * This function may only be called from the main thread. + * + * @sa @ref window_iconify + * @sa glfwIconifyWindow + * @sa 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. + * + * @param[in] window The window to make visible. + * + * @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 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 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 window_hints_wnd) 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. + * + * @param[in] window The window to give input focus. + * + * @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_focus + * + * @since Added in version 3.2. + * + * @ingroup window + */ +GLFWAPI void glfwFocusWindow(GLFWwindow* window); + +/*! @brief Returns the monitor that the window uses for full screen mode. + * + * This function returns the handle of the monitor that the specified window is + * in full screen on. + * + * @param[in] window The window to query. + * @return The monitor, or `NULL` if the window is in windowed mode or an error + * occurred. + * + * @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 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 client 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 + * client area. + * @param[in] ypos The desired y-coordinate of the upper-left corner of the + * client area. + * @param[in] width The desired with, in screen coordinates, of the client area + * or video mode. + * @param[in] height The desired height, in screen coordinates, of the client + * area or video mode. + * @param[in] refreshRate The desired refresh rate, in Hz, of the video mode. + * + * @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_monitor + * @sa @ref window_full_screen + * @sa glfwGetWindowMonitor + * @sa 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). + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref window_attribs + * + * @since Added in version 3.0. Replaces `glfwGetWindowParam` and + * `glfwGetGLVersion`. + * + * @ingroup window + */ +GLFWAPI int glfwGetWindowAttrib(GLFWwindow* window, int attrib); + +/*! @brief Sets the user pointer of the specified window. + * + * This function sets the user-defined pointer of the specified window. The + * current value is retained until the window is destroyed. The initial value + * is `NULL`. + * + * @param[in] window The window whose pointer to set. + * @param[in] pointer The new value. + * + * @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 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 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 screen + * position of the upper-left corner of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @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 cbfun); + +/*! @brief Sets the size callback for the specified window. + * + * This function sets the size callback of the specified window, which is + * called when the window is resized. The callback is provided with the size, + * in screen coordinates, of the client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the close callback for the specified window. + * + * This function sets the close callback of the specified window, which is + * called when the user attempts to close the window, for example by clicking + * the close widget in the title bar. + * + * The close flag is set before this callback is called, but you can modify it + * at any time with @ref glfwSetWindowShouldClose. + * + * The close callback is not triggered by @ref glfwDestroyWindow. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @remark @osx 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 cbfun); + +/*! @brief Sets the refresh callback for the specified window. + * + * This function sets the refresh callback of the specified window, which is + * called when the client area of the window needs to be redrawn, for example + * if the window has been exposed after having been covered by another window. + * + * On compositing window systems such as Aero, Compiz or Aqua, where the window + * contents are saved off-screen, this callback may be called only very + * infrequently or never at all. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the focus callback for the specified window. + * + * This function sets the focus callback of the specified window, which is + * called when the window gains or loses input focus. + * + * After the focus callback is called for a window that lost input focus, + * synthetic key and mouse button release events will be generated for all such + * that had been pressed. For more information, see @ref glfwSetKeyCallback + * and @ref glfwSetMouseButtonCallback. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the iconify callback for the specified window. + * + * This function sets the iconification callback of the specified window, which + * is called when the window is iconified or restored. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the framebuffer resize callback for the specified window. + * + * This function sets the framebuffer resize callback of the specified window, + * which is called when the framebuffer of the specified window is resized. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Processes all pending events. + * + * This function processes only those events that are already in the event + * queue and then returns immediately. Processing events will cause the window + * and input callbacks associated with those events to be called. + * + * On some platforms, a window move, resize or menu operation will cause event + * processing to block. This is due to how event processing is designed on + * those platforms. You can use the + * [window refresh callback](@ref window_refresh) to redraw the contents of + * your window when necessary during such operations. + * + * On some platforms, certain events are sent directly to the application + * without going through the event queue, causing callbacks to be called + * outside of a call to one of the event processing functions. + * + * Event processing is not required for joystick input to work. + * + * @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 glfwWaitEvents + * @sa 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. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @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 glfwPollEvents + * @sa 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. + * + * On some platforms, certain callbacks may be called outside of a call to one + * of the event processing functions. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * Event processing is not required for joystick input to work. + * + * @param[in] timeout The maximum amount of time, in seconds, to wait. + * + * @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 glfwPollEvents + * @sa 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 to return. + * + * If no windows exist, this function returns immediately. For synchronization + * of threads in applications that do not create windows, use your threading + * library of choice. + * + * @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 glfwWaitEvents + * + * @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 `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @param[in] window The window to query. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * @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 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 `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * + * If the mode is `GLFW_CURSOR`, the value must be one of the following cursor + * modes: + * - `GLFW_CURSOR_NORMAL` makes the cursor visible and behaving normally. + * - `GLFW_CURSOR_HIDDEN` makes the cursor invisible when it is over the client + * area of the window but does not restrict the cursor from leaving. + * - `GLFW_CURSOR_DISABLED` hides and grabs the cursor, providing virtual + * and unlimited cursor movement. This is useful for implementing for + * example 3D camera controls. + * + * If the mode is `GLFW_STICKY_KEYS`, the value must be either `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. + * + * @param[in] window The window whose input mode to set. + * @param[in] mode One of `GLFW_CURSOR`, `GLFW_STICKY_KEYS` or + * `GLFW_STICKY_MOUSE_BUTTONS`. + * @param[in] value The new value of the specified input mode. + * + * @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 glfwGetInputMode + * + * @since Added in version 3.0. Replaces `glfwEnable` and `glfwDisable`. + * + * @ingroup input + */ +GLFWAPI void glfwSetInputMode(GLFWwindow* window, int mode, int value); + +/*! @brief Returns the localized name of the specified printable key. + * + * This function returns the localized name of the specified printable key. + * This is intended for displaying key bindings to the user. + * + * If the key is `GLFW_KEY_UNKNOWN`, the scancode is used instead, otherwise + * the scancode is ignored. If a non-printable key or (if the key is + * `GLFW_KEY_UNKNOWN`) a scancode that maps to a non-printable key is + * specified, this function returns `NULL`. + * + * This behavior allows you to pass in the arguments passed to 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` + * + * @param[in] key The key to query, or `GLFW_KEY_UNKNOWN`. + * @param[in] scancode The scancode of the key to query. + * @return The localized name of the key, or `NULL`. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED 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 + * glfwGetKeyName, or 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 last reported state of a keyboard key for the specified + * window. + * + * This function returns the last state reported for the specified key to the + * specified window. The returned state is one of `GLFW_PRESS` or + * `GLFW_RELEASE`. The higher-level action `GLFW_REPEAT` is only reported to + * the key callback. + * + * If the `GLFW_STICKY_KEYS` input mode is enabled, this function returns + * `GLFW_PRESS` the first time you call it for a key that was pressed, even if + * that key has already been released. + * + * The key functions deal with physical keys, with [key tokens](@ref keys) + * named after their use on the standard US keyboard layout. If you want to + * input text, use the Unicode character callback instead. + * + * The [modifier key bit masks](@ref mods) are not key tokens and cannot be + * used with this function. + * + * __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 `GLFW_STICKY_MOUSE_BUTTONS` input mode is enabled, this function + * `GLFW_PRESS` the first time you call it for a mouse button that was pressed, + * even if that mouse button has already been released. + * + * @param[in] window The desired window. + * @param[in] button The desired [mouse button](@ref buttons). + * @return One of `GLFW_PRESS` or `GLFW_RELEASE`. + * + * @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 client area of + * the window. + * + * This function returns the position of the cursor, in screen coordinates, + * relative to the upper-left corner of the client area of the specified + * window. + * + * If the cursor is disabled (with `GLFW_CURSOR_DISABLED`) then the cursor + * position is unbounded and limited only by the minimum and maximum values of + * a `double`. + * + * The coordinate can be converted to their integer equivalents with the + * `floor` function. Casting directly to an integer type works for positive + * coordinates, but fails for negative ones. + * + * Any or all of the position arguments may be `NULL`. If an error occurs, all + * non-`NULL` position arguments will be set to zero. + * + * @param[in] window The desired window. + * @param[out] xpos Where to store the cursor x-coordinate, relative to the + * left edge of the client area, or `NULL`. + * @param[out] ypos Where to store the cursor y-coordinate, relative to the to + * top edge of the client area, or `NULL`. + * + * @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 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 client area of the + * window. + * + * This function sets the position, in screen coordinates, of the cursor + * relative to the upper-left corner of the client area of the specified + * window. The window must have input focus. If the window does not have + * input focus when this function is called, it fails silently. + * + * __Do not use this function__ to implement things like camera controls. GLFW + * already provides the `GLFW_CURSOR_DISABLED` cursor mode that hides the + * cursor, transparently re-centers it and provides unconstrained cursor + * motion. See @ref glfwSetInputMode for more information. + * + * If the cursor mode is `GLFW_CURSOR_DISABLED` then the cursor position is + * unconstrained and limited only by the minimum and maximum values of + * a `double`. + * + * @param[in] window The desired window. + * @param[in] xpos The desired x-coordinate, relative to the left edge of the + * client area. + * @param[in] ypos The desired y-coordinate, relative to the top edge of the + * client area. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_PLATFORM_ERROR. + * + * @remark @x11 Due to the asynchronous nature of X11, it may take a moment for + * the window focus event to arrive. This means you may not be able to set the + * cursor position directly after window creation. + * + * @thread_safety This function must only be called from the main thread. + * + * @sa @ref cursor_pos + * @sa 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. 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 and @ref + * GLFW_PLATFORM_ERROR. + * + * @pointer_lifetime The specified image data is copied before this function + * returns. + * + * @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 glfwDestroyCursor + * @sa 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](@ref shapes), that can be set for + * a window with @ref glfwSetCursor. + * + * @param[in] shape One of the [standard shapes](@ref shapes). + * @return A new cursor ready to use or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED, @ref + * GLFW_INVALID_ENUM 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 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. + * + * @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 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 + * client area of the specified window. The set cursor will only be visible + * when the [cursor mode](@ref cursor_mode) of the window is + * `GLFW_CURSOR_NORMAL`. + * + * On some platforms, the set cursor may not be visible unless the window also + * has input focus. + * + * @param[in] window The window to set the cursor for. + * @param[in] cursor The cursor to set, or `NULL` to switch back to the default + * arrow cursor. + * + * @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. You can tell these events from user-generated + * events by the fact that the synthetic ones are generated after the focus + * loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * The scancode of a key is specific to that platform or sometimes even to that + * machine. Scancodes are intended to allow users to bind keys that don't have + * a GLFW key token. Such keys have `key` set to `GLFW_KEY_UNKNOWN`, their + * state is not saved and so it cannot be queried with @ref glfwGetKey. + * + * Sometimes GLFW needs to generate synthetic key events, in which case the + * scancode may be zero. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new key callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the Unicode character callback. + * + * This function sets the character callback of the specified window, which is + * called when a Unicode character is input. + * + * The character callback is intended for Unicode text input. As it deals with + * characters, it is keyboard layout dependent, whereas the + * [key callback](@ref glfwSetKeyCallback) is not. Characters do not map 1:1 + * to physical keys, as a key may produce zero, one or more characters. If you + * want to know whether a specific physical key was pressed or released, see + * the key callback instead. + * + * The character callback behaves as system text input normally does and will + * not be called if modifier keys are held down that would prevent normal text + * input on that platform, for example a Super (Command) key on OS X or Alt key + * on Windows. There is a + * [character with modifiers callback](@ref glfwSetCharModsCallback) that + * receives these events. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the Unicode character with modifiers callback. + * + * This function sets the character with modifiers callback of the specified + * window, which is called when a Unicode character is input regardless of what + * modifier keys are used. + * + * The character with modifiers callback is intended for implementing custom + * Unicode character input. For regular Unicode text input, see the + * [character callback](@ref glfwSetCharCallback). Like the character + * callback, the character with modifiers callback deals with characters and is + * keyboard layout dependent. Characters do not map 1:1 to physical keys, as + * a key may produce zero, one or more characters. If you want to know whether + * a specific physical key was pressed or released, see the + * [key callback](@ref glfwSetKeyCallback) instead. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or an + * error occurred. + * + * @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 cbfun); + +/*! @brief Sets the mouse button callback. + * + * This function sets the mouse button callback of the specified window, which + * is called when a mouse button is pressed or released. + * + * When a window loses input focus, it will generate synthetic mouse button + * release events for all pressed mouse buttons. You can tell these events + * from user-generated events by the fact that the synthetic ones are generated + * after the focus loss event has been processed, i.e. after the + * [window focus callback](@ref glfwSetWindowFocusCallback) has been called. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the cursor position callback. + * + * This function sets the cursor position callback of the specified window, + * which is called when the cursor is moved. The callback is provided with the + * position, in screen coordinates, relative to the upper-left corner of the + * client area of the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the cursor enter/exit callback. + * + * This function sets the cursor boundary crossing callback of the specified + * window, which is called when the cursor enters or leaves the client area of + * the window. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the scroll callback. + * + * This function sets the scroll callback of the specified window, which is + * called when a scrolling device is used, such as a mouse wheel or scrolling + * area of a touchpad. + * + * The scroll callback receives all scrolling input, like that from a mouse + * wheel or a touchpad scrolling area. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new scroll callback, or `NULL` to remove the currently + * set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the file drop callback. + * + * This function sets the file drop callback of the specified window, which is + * called when one or more dragged files are dropped on the window. + * + * Because the path array and its strings may have been generated specifically + * for that event, they are not guaranteed to be valid after the callback has + * returned. If you wish to use them after the callback returns, you need to + * make a deep copy. + * + * @param[in] window The window whose callback to set. + * @param[in] cbfun The new file drop callback, or `NULL` to remove the + * currently set callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Returns whether the specified joystick is present. + * + * This function returns whether the specified joystick is present. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return `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 joy); + +/*! @brief Returns the values of all axes of the specified joystick. + * + * This function returns the values of all axes of the specified joystick. + * Each element in the array is a value between -1.0 and 1.0. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of axis values in the returned + * array. This is set to zero if an error occurred. + * @return An array of axis values, or `NULL` if the joystick is not present. + * + * @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_axis + * + * @since Added in version 3.0. Replaces `glfwGetJoystickPos`. + * + * @ingroup input + */ +GLFWAPI const float* glfwGetJoystickAxes(int joy, int* count); + +/*! @brief Returns the state of all buttons of the specified joystick. + * + * This function returns the state of all buttons of the specified joystick. + * Each element in the array is either `GLFW_PRESS` or `GLFW_RELEASE`. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @param[out] count Where to store the number of button states in the returned + * array. This is set to zero if an error occurred. + * @return An array of button states, or `NULL` if the joystick is not present. + * + * @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_button + * + * @since Added in version 2.2. + * @glfw3 Changed to return a dynamic array. + * + * @ingroup input + */ +GLFWAPI const unsigned char* glfwGetJoystickButtons(int joy, int* count); + +/*! @brief Returns the name of the specified joystick. + * + * This function returns the name, encoded as UTF-8, of the specified joystick. + * The returned string is allocated and freed by GLFW. You should not free it + * yourself. + * + * Querying a joystick slot with no device present is not an error, but will + * cause this function to return `NULL`. Call @ref glfwJoystickPresent to + * check device presence. + * + * @param[in] joy The [joystick](@ref joysticks) to query. + * @return The UTF-8 encoded name of the joystick, or `NULL` if the joystick + * is not present. + * + * @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, 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_name + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetJoystickName(int joy); + +/*! @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. + * + * @param[in] cbfun The new callback, or `NULL` to remove the currently set + * callback. + * @return The previously set callback, or `NULL` if no callback was set or the + * library had not been [initialized](@ref intro_init). + * + * @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 cbfun); + +/*! @brief Sets the clipboard to the specified string. + * + * This function sets the system clipboard to the specified, UTF-8 encoded + * string. + * + * @param[in] window The window that will own the clipboard contents. + * @param[in] string A UTF-8 encoded string. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED 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 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 The window that will request the clipboard contents. + * @return The contents of the clipboard as a UTF-8 encoded string, or `NULL` + * if an [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED 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 + * 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 glfwSetClipboardString + * + * @since Added in version 3.0. + * + * @ingroup input + */ +GLFWAPI const char* glfwGetClipboardString(GLFWwindow* window); + +/*! @brief Returns the value of the GLFW timer. + * + * This function returns the value of the GLFW timer. Unless the timer has + * been set using @ref glfwSetTime, the timer measures time elapsed since GLFW + * was initialized. + * + * The resolution of the timer is system dependent, but is usually on the order + * of a few micro- or nanoseconds. It uses the highest-resolution monotonic + * time source on each supported platform. + * + * @return The current value, in seconds, or zero if an + * [error](@ref error_handling) occurred. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED. + * + * @thread_safety This function may be called from any thread. Reading of the + * internal timer offset is not atomic. + * + * @sa @ref time + * + * @since Added in version 1.0. + * + * @ingroup input + */ +GLFWAPI double glfwGetTime(void); + +/*! @brief Sets the GLFW timer. + * + * This function sets the value of the GLFW timer. It then continues to count + * up from that value. The value must be a positive finite number less than + * or equal to 18446744073.0, which is approximately 584.5 years. + * + * @param[in] time The new value, in seconds. + * + * @errors Possible errors include @ref GLFW_NOT_INITIALIZED and @ref + * GLFW_INVALID_VALUE. + * + * @remark The upper limit of the timer is calculated as + * floor((264 - 1) / 109) and is due to implementations + * storing nanoseconds in 64 bits. The limit may be increased in the future. + * + * @thread_safety This function may be called from any thread. Writing of the + * internal timer offset is not atomic. + * + * @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 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 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. A context can only be made current on + * a single thread at a time and each thread can have only a single current + * context at a time. + * + * By default, making a context non-current implicitly forces a pipeline flush. + * On machines that support `GL_KHR_context_flush_control`, you can control + * whether a context performs this flush by setting the + * [GLFW_CONTEXT_RELEASE_BEHAVIOR](@ref window_hints_ctx) window hint. + * + * 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. + * + * @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 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 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 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_. + * + * Contexts that support either of the `WGL_EXT_swap_control_tear` and + * `GLX_EXT_swap_control_tear` extensions also accept negative swap intervals, + * which allow the driver to swap even if a frame arrives a little bit late. + * You can check for the presence of these extensions using @ref + * glfwExtensionSupported. For more information about swap tearing, see the + * extension specifications. + * + * A context must be current on the calling thread. Calling this function + * without a current context will cause a @ref GLFW_NO_CURRENT_CONTEXT error. + * + * 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 on that platform. This is done + * because some swap interval extensions used by GLFW do not allow the swap + * interval to be reset to zero once it has been set to a non-zero value. + * + * @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 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 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 glfwExtensionSupported + * + * @since Added in version 1.0. + * + * @ingroup context + */ +GLFWAPI GLFWglproc glfwGetProcAddress(const char* procname); + +/*! @brief Returns whether the Vulkan loader has been found. + * + * This function returns whether the Vulkan loader has been found. This check + * is performed by @ref glfwInit. + * + * The availability of a Vulkan loader does not by itself guarantee that window + * surface creation or even device 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 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 contains `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 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. + * + * @remarks 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 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 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 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. + * + * @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 was not found at initialization, this function returns + * `VK_ERROR_INITIALIZATION_FAILED` and generates a @ref GLFW_API_UNAVAILABLE + * error. Call @ref glfwVulkanSupported to check whether the Vulkan loader was + * found. + * + * 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 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 and @ref GLFW_PLATFORM_ERROR. + * + * @remarks 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. + * + * @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 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 + +/* -------------------- END SYSTEM/COMPILER SPECIFIC --------------------- */ + + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_h_ */ + diff --git a/ImGui/examples/libs/glfw/include/GLFW/glfw3native.h b/ImGui/examples/libs/glfw/include/GLFW/glfw3native.h new file mode 100644 index 0000000..9fa955e --- /dev/null +++ b/ImGui/examples/libs/glfw/include/GLFW/glfw3native.h @@ -0,0 +1,456 @@ +/************************************************************************* + * GLFW 3.2 - www.glfw.org + * A library for OpenGL, window and input + *------------------------------------------------------------------------ + * Copyright (c) 2002-2006 Marcus Geelnard + * Copyright (c) 2006-2010 Camilla Berglund + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would + * be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not + * be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + *************************************************************************/ + +#ifndef _glfw3_native_h_ +#define _glfw3_native_h_ + +#ifdef __cplusplus +extern "C" { +#endif + + +/************************************************************************* + * Doxygen documentation + *************************************************************************/ + +/*! @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 + * + * **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 exactly one + * 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` + * * `GLFW_EXPOSE_NATIVE_MIR` + * + * The available context API macros are: + * * `GLFW_EXPOSE_NATIVE_WGL` + * * `GLFW_EXPOSE_NATIVE_NSGL` + * * `GLFW_EXPOSE_NATIVE_GLX` + * * `GLFW_EXPOSE_NATIVE_EGL` + * + * These macros select which of the native access functions that are declared + * and which platform-specific headers to include. It is then up your (by + * definition platform-specific) code to handle which of these should be + * defined. + */ + + +/************************************************************************* + * System headers and types + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) + // This is a workaround for the fact that glfw3.h needs to export APIENTRY (for + // example to allow applications to correctly declare a GL_ARB_debug_output + // callback) but windows.h assumes no one will define APIENTRY before it does + #undef APIENTRY + #include +#elif defined(GLFW_EXPOSE_NATIVE_COCOA) + #include + #if defined(__OBJC__) + #import + #else + typedef void* id; + #endif +#elif defined(GLFW_EXPOSE_NATIVE_X11) + #include + #include +#elif defined(GLFW_EXPOSE_NATIVE_WAYLAND) + #include +#elif defined(GLFW_EXPOSE_NATIVE_MIR) + #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) + #include +#endif +#if defined(GLFW_EXPOSE_NATIVE_EGL) + #include +#endif + + +/************************************************************************* + * Functions + *************************************************************************/ + +#if defined(GLFW_EXPOSE_NATIVE_WIN32) +/*! @brief Returns the adapter device name of the specified monitor. + * + * @return The UTF-8 encoded adapter device name (for example `\\.\DISPLAY1`) + * of the specified monitor, or `NULL` if an [error](@ref error_handling) + * occurred. + * + * @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. + * + * @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. + * + * @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. + * + * @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. + * + * @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. + * + * @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); +#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. + * + * @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. + * + * @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. + * + * @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. + * + * @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. + * + * @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); +#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. + * + * @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. + * + * @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. + * + * @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. + * + * @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. + * + * @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_MIR) +/*! @brief Returns the `MirConnection*` used by GLFW. + * + * @return The `MirConnection*` used by GLFW, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirConnection* glfwGetMirDisplay(void); + +/*! @brief Returns the Mir output ID of the specified monitor. + * + * @return The Mir output ID of the specified monitor, or zero if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI int glfwGetMirMonitor(GLFWmonitor* monitor); + +/*! @brief Returns the `MirSurface*` of the specified window. + * + * @return The `MirSurface*` of the specified window, or `NULL` if an + * [error](@ref error_handling) occurred. + * + * @thread_safety This function may be called from any thread. Access is not + * synchronized. + * + * @since Added in version 3.2. + * + * @ingroup native + */ +GLFWAPI MirSurface* glfwGetMirWindow(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. + * + * @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. + * + * @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. + * + * @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 + +#ifdef __cplusplus +} +#endif + +#endif /* _glfw3_native_h_ */ + diff --git a/ImGui/examples/libs/glfw/lib-vc2010-32/glfw3.lib b/ImGui/examples/libs/glfw/lib-vc2010-32/glfw3.lib new file mode 100644 index 0000000000000000000000000000000000000000..348abecfa98d6cfad9db67127eab8d5c72473539 GIT binary patch literal 187376 zcmeFa3t(Jzl|OzblT6c+k^lh;6bMjW7E0PArJ>YJ<~@^nHE9wMN=Wl)Cgepj(+5(Z zJ1sB{K}CG6_^9l<_*x&hi0f)w%346sst9#?h%T;W+tn_zQk5nD&pF@k{oZ@$5zssQo^!tM^F80^J?F~q@t%Qq&bzF}dM&MQXk6ad(0F-+6<;e~mtJ1Kd>O;n z&(k#9gPL~7d;U7_-8Gu_|8A8Awx;iCdAEO)X4CKR)0%CzcVf9_`)j%%xKp#e9rurS zX}13#-6f|!p#9a|!CI~4Pkkru(n|gs?~jGGl0Vk{)fcsrzpT5dsmtx`s&%=X{y@YP zjRoV*jq8Wp<9*%9KKJNIvTsweX;E{tQ!@x-{^npP8jTU5r*EjQ2%+2Q^R+};y#5Fg z`umdc@zI{<-rn)Pi3zJnk24sI#^NrIhbY@Nc8>+&@%V=BA@5adtfXG2D-sI@qMo3$ z(;x0?Zgq7Hr-qV=iSFUCp*}0E&l!z-TH?VLFVjL+*92sD^&nc~qeHpGF~8pv3;3c+ z@K|C~-%wZo==gAVP8tN9QFq7_2}k^jxQA1WW#=VX$mtG7La{(gSdsUScMtciOZE5n zjdxA7`d!w*gq$%?I2`bJ0xIOwGqgAZevd2YmnrStl-EiEdoD8G=VUHwC;iGjko7k7r5V=fOOWN=wBq-$(^v_FwkLfkH=FYNb5 zTOu)HYpQE%@O6Wzx2YjH+SD*K+6`!QtZ!ufP~Ebo`re@-RSn#3r_1LL#3E56Ppw6u zYkYKFY9cw(H(@Y&oW5AZ7jXpz6P3suroM?~BB%zF*Xi^6`YS?J-hMa+Be=Hb)aw(7@6MYEf1T;=hlJbb^ zr@9l456usk#4Sfh; z?`YpdQ^Uw8eD59`<3uy_2HkS$ZfIsf{D^@)ly=_em<9#=#`X)Gi*QF3) zWP@V$H9KPg_!;nV<)p0DS@r5=m`GZinYh#Ca`~bjKWoVd>Wv$f zg-SlRZ(UvMhx#`*k8}@hzDaNS5P41DEeg*-dyrJ)qnq7ALmBwsNFr&x#fQ3+)Ql*# z+?E;}8y!a?OX)g+wUNwmsNr;RlQL1jMQ>82)0)2V;lv0Uc@8E;9i9W0 zQBlpk&*_f2BVLa$=Im(cY6-MA0$6?kCtM53n~mhpx}PajK*!{mjY=~n)Enw@S>(1#={7D>ZDF26?lc>GSc-xGHE zs7)^v)b637(H_+6riS%HqwBg2lf@Hr#{J%Ax62(eIQ3Laj8G<`J~s>}CMLMe=up9p zJA>Y+I~H+!bRAHj_AhM=x#BHBH=;zP-cOG(J$&@&qzB!)(4{UfN|!IFGIS9~ zkREP&#OM*F2i;0i%o%h=!){m1T~tsVG1MBILaFO&S1Na|?m3!MIJL=+9 z0Yx*7lhlDZ6nXafs(~yJFcDb}Ug3ZVf`X9}P6gNk zsLlmbF$fKn=-*t>Ez-RyF^se+=olXz8uD&HZO@GY0+#d+k0m#=Yff6U!j2dnFD$X` ztumAd3Y8y)kBs)_=9hBIPcJx$m^Dv~!P0JpVK$l*Tt!03RLm`c6hx$oIZxwpfs9f< zl3N(bpO?OhVof4Blo#EB(TxSOtFt?iESOz}!y}C9_7S}aFF=5v+K{t0=K>?+>uVeO%uWV= zMSs1?L1Wt(+JU_lzUUSrOp}N==xqrF-A1!w?#CDn(wZx9j7EAk z=lG4Vv3p1NP^wQQ3L5w*hN=8y8+q<;|#;7p5_Lv7VWIp@AbxgW|Pg| zJv@y5E7bEC3=q@;Fk*ZG#vY($dSh6N#@*`+`l7K=k?bgHdM$M|JL5sO-|G*#xFPjW zpt$vIBPdP}Zqd2*0a-;U>w#~gfu^`q*lnU{YXdYma948(m^RzK#iH5a@m3t zZD^;8YN6aPN)@bpGM5FEuUx#|W1`G$?(H6f0d1`%y2obH$>;7H81UW{t`* zBzxE$Y4Q7E2wfE%8KYjeXFN6B)X6uzwj~oiH{?N zuWf3es)=FMA@n3HA@S3|OxPDiZ?ApihLO>YFxpk<*+{n1N1V}SzsDa#x_E-c`gOep z7^6;%9JMq@$-EuMC=rI48)gtbj2&Vy1cTogK`QEBf(E4XI=rZ;E}yG8oBZ=2;d_!? zh*v1Ss59h^`eJ@xP!+DufxbTL06dI%pT{5d28{CRr=dDon7aJ!K~I+}l}wVs!7uSx zhlE-;H6wNPm(Avvn@lflL(n3qrObVm$>C}f{4N0p;akugn@*|9Jecn2Nrpx@Pf#sF znIFL`Y+SRtu+n%E6VSN@$f()T1z8$&lP1;On>Y34>Nn^<-BqN^Gz0}KcAZxm>N0w& z#nhcuz$}IYsQJCF-(o-18u)&b`B1CyFgPq6I(>cZy1wp4gT=u2)b_7fp&Sf+Z-0M( zPZ7KkCY^p=zmTD~&nx2INYoXKc$}V%!#3xz=AnNJ0d$i; z;BOB5F^04$K{~s!YiU<)0YWt8(V#mT4@aD6MQ92PddU+HHe=+|+UmP74Hj~{n zd>-Vh-#IbRgDzfv5ecKEcE>_3@sP83<8b#_q7VtDRFHvaW=!F;Bn}!cZyX~qac2_N zDvARcr8yL_Xv~YS#GJicWLM;Sgn{&Mv)k)JL`AV)+9f8wERtf*mS!IeObq7hR46Ez z9?PK$M}6TIDs?(leIcq?G~~zBqF+%h&8Na3o7?RT1u*TV$~y*Skmja>z7&a!X0auP z+EsKUsHuTixVkelhk1-}{L0OZpy5&D1iA3oGnd~{dSwR!VEJ-e;_-F_qieja$VYEi zAn1YCA@fjF-1arT6~6J&;Z8I@Vm!v&R0tZwjVOu3Ok-*eI{L?{aPnD1=#mP~%jQ4(&4FYoU|duUvuE20-Jiif~> z`ue-ETtY-GfGmW~Kt(lYsF6^X5k}eD$xAJX7xKiMzPT3!e@z2+7Gk}7WExojHAmD! zCt_(qwL?Y6N7*75o|#ASh%#sJj!^n=iwLP;GY{1f4LrAu&=D?YV2)5|#&goajUkS8 z-90x5v2d5^VIDt|oWg|*RS_;u_abg$xXmI;#MI^NL^<(y8ponYR zz-Vfym!p#tc_ZJHCxj{{$26*EiJlzHv*7abAE8jAdqioB-HAXM@6;&rSRRvc1*cjd z$@twIC8-E6k7LCKn!K>HE!9Kzn^kSWh(zO!{-a-?9@*5huJ8n@2kk4GV7FJ14kxex zsL))h7vnfFR{)lnk~)+qA{Hy1$es;*T~0Js4Om`5%9%Qx6N&Yh(Z*^CZmx92?so>D z*ganKUwO_-AAi?ZXj!QPPM@c_B@hXO^^k1r-aLdUzrq0zI3v*DE}u7=8<-THewr3%^uyvz!JL!e01mLh3gbT-Ks+N}6fCbk4xtw>HNAs!W~{!! zV20lnaAR`YO>yk+<7r50_vL5=d&0$FGmV;Jv548jD27U19?nct@?gD~SOI5EAcHaD z^tWKND1;>=oUlktWLx+6csKH7BSkAYisCRajQpXTHLa?GVG{`XBQ6ZS@G_yH(e*Up zi=|=+^O&6eH3m@zl&6^X4P#(|hGva&ZXQXI5!NST4MvYM7Hjc@-Cj>_F%YX0b4q~` zSdR~ub1>lb1u%CjX3SAfL@Q(}{XNuy;UZ}G2~I3e!ont0d&Q~OO4E|4zD=~21r@@~ z+S2Ta`rH`tF<565(Et`Fc>@tI`qgVF{fE0pkRPJBAy23nCTVF_a`PCT1KlQ1gHAtY zftv$ZB4Mp6vUZX>M%CJ)9VE#aWxl+BK)#qb824_=dJ z6RDm74uIh+)VkZ#5{1HrnT>uu`VKeA1Y+d?E?q11z$h>nBUpD8i$dQxUI%#=$htyF;?OCz7L?){XF_NHZxxeK3*H%8V5K z+JRB@iPVIMOd%TZ!H||h>jE%u)|W4quvV!ijLyoP9Z8knHIfd}qUO>ogVHvJQ7{aJ z;FWtv^|i~3j5<=UDSx!E{&LZq(p^->ndXdS2FXB(@l`8M&t=0BM%GJuWq}(gQ}Gy2 z40n%jmZZvam9qI5$qP%HLnsLJH!%-KVFN}ARc5$eU@(d6iN(SJFO-Yki5`@L+?Kwx z&OpnMLd{sg(`+y##N-vvXPW!lIuF#3*BkSN!fu17hgUAp%m__QnL6n@Q_vZYg`(jQ zmM^K04Ua-gLP_#;KtZms6GLt>OsTmHE`6CAObF>|zISn~vuk#>#KS&=?}k3;789vy z_yDC+U*N!n6|>M-AmpXVB3Twq=*TFwCuY0{c98j9A9T+z>{xYUCX7%5V3`l~Ik`@< zH*GyM|E6Om;#m93Yn_1+^3B{Jb6MwLig{c~qeodxaO5D>yhaY*Qr$RdB!OC-B;Prm^jRZ`qduUjLiA#u+BeaR ziy3`RUOkj*vV`bRohbiRU1Ca!L>wpb9dg%Y=~6hIRIN1?qI?n7BqiT;Odc(jt~_K; z4nTk&w>(lLW**Lzpm}bh_~oHFz4hAM;*3Wk&4EyJpPMx^?IL2WI?MpD!G170ORNBRnrrk+Sb8c@n$!6KR#kE_KO zHtXN+@%5O5v8Dk+|C=$kUS++Z6w)$qMnn<>ZK*c?yxr! z4oeHvWL?o>b?kZKUPWp|bcGEsVQ71Tv0w}KjOChTSXj#ehVfx=D^B!(q7gsV#WZ`T z=ahD#VvJ!)Kp5MzLg)_D@(40GWmi-T!*kWs6`yXMs+Ct<=Dp~V8%s3gK)TWcIRood zF~xYgtfI_qE!xT?)Cbou55nk*qi{R1L5la*mU;fhguv2!CB4+J71ow66(&(?QgFpL(Q zSiHxQe=Ok-MqJp*BcxKl2ev-XE^f9G!w&GqqA(tenrSHnrgqcN0YPtws+Xy4&f7;) zfDciTM4#W^61| zqZjB#LfeS)-A5}r(O(kF*v-iZZ^9ldSB?iGP8bAK|Ho+1nnrPW3lxnQQ1@ls_~;GT zG?2^d3wr!imhz%XyL8?=+rrAOp@C*^UwremI6KQ#=x(2-v2>3BLh)SybHW;z4 zrkicAK6Jhl=3x=6XNg3xb1M=wCzVW@{74%fV*QKDgAHz|8n7e`{h=ahm0@9w2K{JG zu)7Fj1&Usd!%;`pQWi~v1sDOvHl~;-;B`_TOYV5GQtO>lS)`P|7=-b8n_aOOa@H-| zkA^X^zmU44)X^lK7(w&~oNkPbhJ#*gBN-j%y-$tSy2T|zXI4JKnhpB` zm@vl%EV<>5N`a-!U_3M)bNM_N;N;!5qCaaPL4O(}2UsZYF_T!U2{I#qEjex&z$_++ z_7MZ38!UoiPH&{e7mvm;;cA4Z(T&9cxpYxKw)jL{R=S8zCyZA&cPM=>BxZkNy{^V5 zV1FfgWdd8A^f?KU_Hz5FWE0U2j;Puy5JJ%#NMi#QDR}h4U`AQik4ki2_r1_AEN&yr zo3C^PB_3^K){gqbk>$(lSI84b=4+bvo;x(HX1At&ugRuu^4qkh!!~Vs!lvE%fKA)= zW1IHCsU=!%utd8nQKE%ER-(Q5)e`MNo2EIm`Py9EbNH_u?>4^Y180NF9NacM33l+` zad4Thl`!50=r~}BY92q2)5;}B3EqzbA8`_$4K5XopT_Q5Yzeb0C{ikYaQk?lRm2lbc9W^RogeIgfo8zr;`B zb})V({B|JDrTDc$?s4*uQj}ogq2F@LALSXvQvajWD}fYxmdP*>L?I)$QvA)4?>Y~? zi#*aXf?vc($BAD`Ns6KIC-Srmp`$#qbLc4r=oZg;5*9I~m{1uJahc1pD+e#dlFD2; z$8#>bi!`8^i`Y|Hq`VV&DjkHk$@o}PMwCgCEB*wJ@uYMWQVA#0HaB&3UgMYYzXBo9 zG19OpzQlKW%W(SX#hKfUf4)U+N41LNXqGq6_za2}uY*R*Gt=WL{^&;c(VT#B6jR7Y zv7m6qv&~0w1jkVeIGN3~J=Xcr9p>5fvFMgMU&L(fOM z3E}7#*dFbAildmE(L2pYxrXM|W_+(XMu$-6Y1J z{@kEht-Lw8JVA~5jHYG%Oob__wz>KLurpR6*=U39ZOx9eDrahc7TU#?@=?g!r4js}DESPq>z zmd(V+wrl2?4!n7rhrnmQ)bkh)hC7CBMzcCoZuYBEk7e`fvFuQv)hT$hp3Zn%CUa+f zV&5?x5jDGco7pc;K88u_qdqc1nirUz`m@h>AH&&OZ_5FUvz~}MmL2JTWee4h<&etR z?*_$E_t~wFpXC8=Z_CR1x94nvSuaX)&;FFVSs%4Rr?kxapwn5N!r*>;&g46WV_9ic z%k1}P%=Re2S?}&}zYXgc;OAe>!G*Kl{4(2BV{g~7zW--7>(D^_?2e*5mXnWG4{hC=<$2%u{=zIbef`;v zTAA5uyg$ZqEHhfuH-q!h-(o+U>|4+1oUXsTHH0$sGdcr)rsvyCdls4U@Q-;4&h!i1 zm6tO+EN9w-?xn059jQ}0qobce_13$lgtte1O7v{cq?F#d{%EI6|M?FWl2Mq=@z(jL z<>jAI^fn%%C)euEe9LLk&oUHRIV_eFo3=~x?vP^pQ|0zIv6k5QW`jT<`{7Ocj=5a< z)-wXJyt%*ufmWKL=LjCd4qGgIo^}tkzBf#r0!S;HX=BVR4%E%tQ%wjX!Rd`Rm0P#% z{E>H9%3VNQB6wR+&QU)4;&a-`sz-hXyD<^=(eZpbx!bnD7G=2&@2z)nQa~jCU;0T@ zTsADbP6ejuI)43_GV2ah&Ks*!?pD+SBqEJu_F1`wliHwfVb-gs+<{rht)S#WI|(ez zmgBQ5F0|PocOz&XLC$W30`Ayn%sXpyoeCFdJw@QTX%l-cuU_K+_@|A+U$r+k*H`nN z_#$rli2$Z(=-cZ(d{*s@J~v?5%#rKUbVn`Z(&p|OF6fS8j|0KQ4i{6nJEl3pkJRxj zPPzu0D5R#t)^dX+2nv=MSwCSk1?Ei(&I2_fduk^}jY~Zz4QscO| zoJ=wtNCCXv--PJrbNLGGfqRSZMc}*}`q+rlG$(oZ_ck7dwY0 z_j4Qixix>j&qRvwiifyp)Q3>Trl#MVtg zE1N2DaFuX)iz7|N@fbQOb`p=OkNS{Dh3q)OTg*2?ppDJ5+H`!5v1Xuk8%<*JOf!i$ zsc?zOIi&-hPj{Y_Ud{egXQ*)R#&YJ0ZnDY4?vDD1BhxV=B5M%C85ndjb#Smvp#zdE z=A9&+&Z?6nd_D=6Py`~^vNO?`&w~M_wBuCpbL=|FsFbNeryF?2fltt7a+|ZFVx2tg zcSZCNGo`tvAZ+6GFZn!P>g|ij>V;PsfRu8D>^_0FntOzs{V~3OeW&*nIEDl*c8*@L z9#f*5h$6N1H_M@5Iobv^dZy%wDtso882-RXnU+(KO_e-P&U9x5amhv?WGViCrzle? zSLyL*J4M-IQ*#h-#DO}|fHO(iXrgfCo<_(thS4mDjCW;3lW>vQ(;dcqSXu2 zI*R1b#I(-nC`{)*EIyJq9m$|PhHpBW1ZrSW_o6Y_z{g(}=9@NP2^y6w%vU@lJ)*0^ zY?tX-BXg)&UM{VzUA}yIP0iB!gE$OB24sGZY zZ<;m%;0xvYoBW+u1v)zQXi=N)auT%wa#35mz8Q-2y~l|7qpk)r;t3tFRcY-r0>;k?CG@p=kWku+q8nu0(c~#OC^Op*26$(iQ z6%<^>=w5?c5;Ow~nM_-PpF-((7V!1-FkOYx?_{{Q&X8{X4CpAnH_w3XJkWh&26ShG zZubo6sEEEa13Jq7*JnsqMV_0kLg`2P_~IGRoe8>CGoU*Obnlu09Tk(|8PHL&yK{zg zpDsjKK>z&<=$@3c#q_BM4$pw*^m7mZT%;}wl~ZcZzb9#kjxJ}F)0x|z$ALeS3YY0B zM7I|1!v*MIvRvlDG2HFpHQ}J^igSl2HuQ{*C(pHFQ>jGn5}Xn`Gjyb_!`-?jhc<>U zsWnHuZRggI>iBQmx8iQrY}|l*uDEv1rJbYWH(cvaBm=2+*OIw=?ZkKw1JfGDS7=wB zpdn^+G-}gEH`vr~B!T0GCr0~|H5avBToW5h(nqoJv4|R4X_3HZKsBvBdua8f_lb>4KAWxe*c>reG_Fbuk+4hRo0YU*`(+&`nezc-)SN0cc z_hh|q&<|-{YJnZvQamddT8SrV^J)#FC|A^oj||i#M{D$x_iM%yoBD=o#F3^o>Vr@< z=O-w5=|h1X;MVH?H3L7qlwOpsdztEe=isB=jrbi;{7cBy-K{F zt-n|Ed-_r5K#h)CAV|*9-xrGaMf!V$Z&!c{tz3#WQ= zO0T-P96!mE23%H}jQ^7Ks@updH9x&-8v&Ku9>H_qvsS|GyDGPR4*0$PS`zrmC-9J& z<$XFncu|Ked__ z&Nl%5JX496mouHEcsZDfmE-MDrn3TXzs$s{@OB{6S&g?>GO-1C`_D}0LcIM~CRUT_ zT=YPRN`nV%1ah3GypLrzu1N27`lcd}R&GD@f2XFh-p8N}mJA?J+5nwLcYvU*cUN4m zDivLIyROSd-l%&@IFWit?aD?Tj(4nP473JBEEXc@7(K>zOvfL;GVA@9j!c!Hf$;RB zrCoJTJxu9%o$_W5-lzd|Xk;b|MdVdbDp# zGvSfIU9F&gKtkRaAR+G_K;_`7*1o8qZzbT=Ro=1(Zx=M?Ti1?^R?uL2UO@iFK)vcw(Q-vbhH`w}2hjt*@XAhI*7wI2c^ zQ>R*c5fB+E4($LS!SQQAf&=FnN{*8N3EYJWm(wudNY>t(?wSeux-h=)WN9BnBZ5<{ zYkJ2MI8U~QzH?K9Z@<*wLr8tyWH;WA)U& z*Y}^X>-Bx-iH3{JbdgpAfS{P^d4E7Koy@oaQ>#~Aw`)&Fwt8MIgqs|!}rKyLNLP>#e zXk>MXG`|GUGR9F8Ot*t2h}gXo?*eiIqE3QC3oG1eK#LjIsc>Bi>IHNWyACScjSAYJ zpmzhJ`sdKn3Ww3WHk`!Y7fwvzi-vgP`2#U6N3S%ygfH(l_hOg`-(dm9gK@xQpFZmX zgq)oeV^q1e1brH|W)%6oeyDEQ5`5@Xv%DZ2+THXpUFQOxBT}BUyi{MD;v$78ottnw znCS$58V^dzIaIc`9(o$!4su}|r7gR*sw11KsC&FKyQMrcdCAn&RA#ak&&J~`xBVJb zEbCjea(A*Kds{VLGTX^1``)Vn>&C|&)cB*coR#5=>ejK zVnlTIXFpEUD(vcjlPPceKKB>jV{>wJ6jD{e-R2S53d=+33RUk0+gtWgmh3Ql^!Jj}y-W|0 zD_>L&7rY-1_vsGV_fpnmzQ#eF{2)aOFO&dTE>W#H{0}^cwRbW^^Xltm27VXqG0TI7L`&T>#$FqP0$6-KGcKscm5r*t2 zW`gcyK!WaUK%&mys-W*E=#xl3;rfq&LM(*}laTTRAR*;BMfbXbP}ns;bIb!II2HmD z9Lp4x(*pMK2f1q|pfahywlR?$s8QdIknLKH9Inq*g*{k7lk9s7qKUp_%>*=TPqMGK zK>J#tlNR@RsEc-#Tpl+wiCG%bme7pl+1sf^qEwv#eMAl8UPd69wCmRHA#*|`wG z+oV&lWbdXjPX&+~O$eyy;PM2W2gU&sU?|H$y_8qLZBQFTqb|5oC+1M1A}C@KL?)yN z0X1Xma93-!cy{AOsnfG}EI?{~v?F`C?$yPw zCg)C_d?ivXntJ^@RmTx9t!wQb(y=1=WMK%1N^L)G2j^NRr!zdu9?pE5#7cuId5ZG6 zf_$FS=&Mha)J>&VZGvA~at=Dsy@0xqtkjNDy{^_y!86xCr@~RToBZ1`1b)QvOp0If z)VOd$p5bk7m#~x8?%6RWsLl{&gcBoqyqP%lBkGr!gF(tf1mhe)luOlYVhJ264uO;9 z5FHdU*^tQd*YW7X9@3X$%Ykj3Q+(b;}#`Jop{+fRDqWkZ|%igl< z@ubvZQ|<2o2;*3!IvH)BX50yQ3LK3A3y9S2C)t&9T;MKL5Sh;RvFlQWyIet60{SSs zHY*%e5+Q|*=nt{0p$j_jK8(9sy9Un>ulBsR(Abo<+@Y3J_?A! zMxSu|CwJwG47UILvt$vphSJYt` zU$;z5bknCx_0A9tiTd~>Phyc+Vgpi#9BI*qzQzNwCzPdUBtNzxsnM@e3n(YVhc=44 zkT|+tx6+b|9Xn^@Q>#f+jf-L;(e9{4_^^Ic{$@8{9 zo;rPi$Sk%e+vCukJdT>)v_MNZfc{ZI|Dm8?Dac{d=_(bp7|<6%;m{fY34hsU5ko08 z-ZqTd%a8HY;Ny-pdc`bWnQ9UfHToCIFqlJ?;R@Y2l@)4cGIioY@|wxYq_6eBP!b=) z!myDHvow=uo}sdRT2xXTP|yCG`RjrauJP{s{$Ci z?L=b1_2RvOrwp#=Bp1pTSiogGw}3E{c)C_0+x}z--dvwL}6$ zBfw7GDNhc?(QZ2jPrCl)>|eg9^I$GiauJOHY4}^etl_Bw+HRw8(p7%p;_vA^nzl=F z5e>LZGv8!m+HHiF$pf89b;X?Tl%67{BxYf2*^dqCUr5O(YBe&1N30<<`E?S@G5d95 zo?le5>^53sM7@uDd;isE_%)wY2`*}JtZ_dXSi6nvTe`0P=u>YRabG04h{noAojAMg zd}6_M#y7@c;OT+CPI3{Am5Xd~yX|6P!IeF-@Mi|sMALat_Mve$|bqZ zVlFsq*D5(29#h=UCJD9xp5%GsN$)qs{YJ@kwvuy~l9L;r8kW* zlB-6^d8(+Kb3kvmol8&LAHC%Gmkl`wCD%DD$DHp>Z$lC=*CSuq#a8Fb3DYM|O7`T%VF$L}TT;khv(8=sNz^S3YlW zJtet_#>#aOFm@ZI30>~QBM%r{C36IpXsleML+myxS9F~_cq-)Usd2gFA{r~#JAkp< zNW;*zrRqr(C7o+TauJP{YcVi(8)*i*{C|`EAA{@Tl8b1pTx9teT+f~IyLTE~-;-QK zW97P(xk!`K6*_ItA%km5auJP{i^`GRMm3tQr|+rwu)(#sTwsaD%5@nqb{n-Ublt!A z;x8Ip)X$@fXsledz}Ri1&FH##-B+RJ^)$>%E~2q=Ed|DIBh5+Ina`Gg&*1vD}AVPW_tRV%Bs~&aG z8lDDVg=J3e@93|-&Vj`Q zX>ff}auH35_Dj5Vt;ZZ{?y!Nh>v{i>I9Wv=E`_5vgYH0c2#2sb(IsoDYibaK{!I-@ ze5qAmn}tu}l1Tc%wNvZr;lq4Pp6DM|#zC+if2hSD^Lq+OqX~U{b`@XYl~ei<3vs;r zB=6IriQ%!XE^M9d(}g3b0bigw90b(yaK#D$eDQY_AMO=v0Gb*|ILqn5 zmZ#Ak{S9Y{^o%Fg^_gPeT)G^tT@!s6g-;|mW58(ihD4v{G@}OkdTx*o&U&pYF+uC+ zMkjC@&gh7jXKH#OgI4U(ra7dh9`YHTcouiMTrT?XvEPZY9MinGdhNa{YiQPiB8&r`zZB`y!rDuwac5BOpx;V$^{@<*vRC zJe$L$Wz?{%%u-sH>1pLTh7($GQkp*!_r{|wVZBBbuKXUi{IvZ>RijWCP$BhH)=%fj zJv>W4!J)u5QJL3BO>axE*%SAvT5S#kPmLiJ#oSm}#X$?R$p zA2+R=VK;b*@~*F(F%*+JyNedfD1RsP0_B?B2ZHcf0l(jaD$9A1H%f0+Vn_3pLiemb zwlbSfm$>l7q2`#&6Y?8z$QjU-gOAqO9OZZKLe7{c91eJJ#4+-xi>5AeX9TSBkNWF! zNAoq$S$(wXC_X|ui|?n+=5ulZzsD8imJ`L^DAc0%Ac@UQNB$XwQWqV=DaF3oA2l3x z9_Fxl$lL?qYYF(PTn4llGD?^NJ7%}^fgqWt7r$csSUXA8+Q zja-04I}P2N--51Ec9rO-(5@BgjXou5h>xy9yMw5oc4!84)SI8HcLhlpu0ryN?$SbZ zIq`^rZZ+sWC248wgX57yw*(pRZO|M#83eefqg9CR8sM))@9)F7>7s#?LUeK99|z58 zl!3UY8_RSB%0U-s^c{`G$^nY7wi$GLq&%W4ChsZGykMd$RIW(gFF~`Eh755{CvPQa zT1<3>hXzr7A#nOd}`)5G&%^Ar1320t<3wc?{`weJrk%M-{@;3;& zM?o`R4rdjsN52ML6KIyy0Ki50!}*qzE*{|Tsli+rZn{)?&Y`1n`cjRiZ8(Rh#Mo>h zc~Q810yKvtol55%d5?f@-nrNXh?_1N@+%~71o-mv;4f~vN^uvWdjCzXctQr@aW8N{mv`RV-a@g+jR$G+($_(5dzBwj z%~z?w;v(~;Q21(qzlnx>O;@4zV>#Uab_R4PD%!q6bUE?e0lMFV?qhYr;}h{yD14N> zv3fzHKMRGAvUN)#x&r0&bD;ZYNn5O(wnE;cpgE;M_^R5EocyJF8IUxBvamf_3CFdC z=yK9!1?YxA_ji(3mHQljG4Y{2Sx80B#m z1SORhrxX3{x9gOE+Yk=dEKUi?Jss;V!{vBkhEq+%1X8i#g{G^qd2T1RGToYq zys>@PEp^#Qd0R*J)yglWDzf{t&83xJvMv73N9!J0{K(3^TgpI`J(AvC(UN)@=MY?X zO&6a?u$zCd_I~T3PeJYu+;W3nM`!lGv%d1dnnqKk zf{n_r?;pf&{o8IP*Y<50@11+SciFTW;NC}tXs`DHEStyA7x2W-mr2fE@7M6061(MS z=SlX+B>NE`)Zpc6d8j}q9QMmCbIAmYLjy2w)}ZB?Iu+ zv;_t$PuqkCg*JMfQu(Eh(z>bbKfI+g%Mo`@2DQqE0=Dc2DM9X>SNTx61Vc99r}UQ+ zyp-rK_U!SMU&6jOj$o-DyV+L$?&fb~IY`;|^6ZwXx?P#=V-T3(oo|`#wCOFgeTbh) zJh5mvGf4!Kle9H%b>>_2llh>D?&Cx!V$zo7K3Dee)Q_?sq7dQ)h0UO3vZv zA1upH1=@m^{SG#vU2}j^NZ)^UF<^&AZ7Vet)!G(3FJjz>@gybb&_0bPENDQV$MbxK z{t3@>aaU`5@uWrp`=9YV2e(7}HJ&vL{SHq-XSbol%{W?&C^()1M15w5_Ox>S6(BOQ z9oqi@TENg0AR*<15}g-^@zpIeAEqJ3t7(4_jk`S~?y;gY zSkB(8)6lk-L)AMFMp3Vj&ym-%I7K9$X+MIj&v*}IyoYfp$05C>MqXPSIh1Wbvbg+(Q|JsQopB zTNJYFme;atkDy>K-g0R1+QaE1w&bnpBXg2BrH_;(Q|Tk+$+7g2(&UxtBW20U(?{&d zvh)#0YI8PPu{c_~_`8|Nf#`l+(udssgOm-E-Xp`-Spq!q~euz+$k=ItYPCaWb1vnX^t3bBX7|9j5 z9qef%LjgQjFw};p2u#`3C*PPt%5PjewP-uAXkBiF3GlFupLTv`__>Xr+v$l7`$Ssk zqE?4&D+l}JX6Q;hT?{$#Y-WgP=*^)~sG1lG<4MM?12;@aei{!-jX4@xE;fA!tLmPc zdgdeBcWo}?z0QLtOg+<&H+%ZKC4(m_xU_Td+Noy-uc_R51k}gv?IMEm>#}>U;eC1` z$P~U2B(4&qv&LHm{@A`zj0*b}gA2FS=|c4Xf@u<}3;Y5>vF z9Y)*deOYP(Y~5Rx^&VKIfi!vYs#5wnewB@W=Bz5iPwK4nmP03|7QF5~%u*{GQ?I4w zJ&a8jQ`eE~hucBK(C!0O=aYu4+*#@kRZLm7C@7c=WzWiemT~XKQ&a@_ zf&De9>OoC~Ro{+Nv8O^YP=ES$%aa^NcxQTHKcfFCUOL4DIHp!*>Whe<*->* z3q74}-=B3ETaq%~{j?)?0Me{R5jKM6XjdwtQeNa~9PWezv7RSf8#dVP=NyiAvK*=I zIy0>ABn!iQ@WRY|>tIo`F6^i+=l!iKL>Ypwwt+fS=+>!yLa7pFFa&BM6q=V&L4<`- ztY={m>Jgx}fcGL9){fC2P>~XaYXp!ea1Q|z4es{V$gbxD+Q85yfF>Af1T@Z23!obrq6#ad^aB!7=-eC%1vWAPq9X3lZU!Xk>EA1e zA|r5n0Sz+Uen3KsA19djxRw_)d*t?Wov@B~bLSI}j^IF>x8oMtnRO1{^o!a>v1O0;+xzM}5$@B9DvR{DdHZp4uG&stB(mJ> z%PL?*HhcTED6gXJhd*{|`yaXoa|CT=NEKte=d2gi0)v;)U)xy;}GFURd(O%?4AQ) zqmA8z%QD__a$5?w_NvzGKIw*V(UEM__hVZ5^4;ta$y#&pERp)6qciww96cRQ_`w%f zXOG~8>w72E#BK1aRqsOzrZ#LaC$ub)B5RN-`uR55+c{$lM0!hwmaNEpo3b$T33BYZ z?wYlGsMLNKw}U%G^j6JAl7QCWor+wwM$LzSl7K#h+o63N&kr*6RR!$`3;hQDNR8&jd11-2Y~)C$92+$mZhs?FMNR!8Pzh6!rJ1@TC@9Dj z$}jGSyoOqki5x}~@(pUO&@hzIu`*@fptcHcr#AY^lP9Kc(MLBb9u^%1{AjnYMiXnc zU=L^84~g_1Jel%xbt?#z`mKA)dL)_X)$~JpcWAWE2@_I4|)vPF9(od;re0iHRLIEV5rQk6R7*WeZ>bcnRf;9aEjmjH>B{%1giQ#$?F6eU2Tw<1~A=&ef4YxGtp z8ymd~lJ%n6nR_`1Df+gNLxZ-(`&zT@uPy#TYg`nB)o+#mq*NZj?cnhK14C3MOrg4D z2i}EIicrzn9tc(CHVQjJR=Mpf0K`dAliug`p4W5!aMoX6_xQhUjDwIm!TVS4M&XX3 zaQ`zKV!L6%#bCjqD5Db`g9T?U+ie}KtK-yV%iy>`svxf+clEqEv>2Ax+UK*WmlyA` ze+LHIbKa--r-bI>YJu+ys@6LD+EZ!Yo{F{!|B7kkOmAFnAT7~+1%MlxqAf#)J z3=^GCQWGMPeg?>tNR}%8C$1!>49R+{vylbzaIbRYO~qvU^GFbp`>pXzM2_WUxr0C& zfqFb@?88?-TfKvdFS3J%xS)7m|F_JkXo2Qry@y}lpRs4XPeWs)@`0g(Ol7zh7MJohq0@%;`%td32? zO?uN$rqs$kmD}$F74qQh#tG=lRY(}tm&gZeVw1LPuSUhPM;2g+$=<$@s#p80n;?_c zgv!Jq+iL^WHjG|AhAzq>(nZjkuj~K@`JZF%Me9Ys3uD@Cx|vr#czFABmD@gz$XJqx z)c4Lf#3UQfpPH(jO5cLR59Xl!YPTP(q9zg`CIDySI!eN*4LSX$zk-YRG)dt@P6bh~!}^pw!htI_<3 zD#9VBUO9(+>egvPE<8T&vDJfzWx3c{3)ZZ!DjTh@dv5!#$`9^gm73o3CPvpwk*GqW z;^maasM4s>9F0oGfT`wF>qc4CY09QHk!E^96(^(>>aHzAqKo#e36Q9eRQNBleGhlF_Io^u0tY}MT2C?*03}uK zgcLtYya>S{Ai=v4kWv`3{b(<*d%W>)NO4r&yF0sE9AflC4v1N4s0v>RCyEIlI;C`q z#rfZ+cYcwbcYFaqQe&|hAw}?!K^;s|jpxr9!h<*c(yxB~41gRJDJQ#BD&SqoOK47m zV>B5#qS}06pg!k4^1=dXpg!k)127EK3P^edw?iXSm5Me;?geyXxSYR$cI9v;CC)pB zEu7gphUCh4t0rM)ePsx6HbV)hH}~jFzyQ-Hf1t?9AyPD%WQPlgY>h_timbl>VyKu( z+xiE))2^kOL{*yIm~PiWoS-Jsi0ZvcEqAv4K-T-R9@>?xol}=?{ez9XJTtpt1#DRd zj!j&B5Qnm%x2H>qA1u*9XjIF@jnRNDLA*o*Mo$sns{m2#9o#b!&@kRb7EpikH|+XZ zJYQw#Yk2-QL%Z-)B{+S^JVc0d$6<%3k4z=YD|gm=!(}|+n4$qkeaH>!A$3CD$;X2* z+@D{)`#-8=_Y*qgIks$_0~KH%oPrereKGLL|Ek_j8TQhiP2?;M|94VE$l9-7ZXv ziV~yLVR@#RlJk@Scw-&9qXW};Yzsa7DRM1zodo1OB%T!w<@S5=+#u)^BNQkMk+*grOu|R#Am_Kab(*{TMr&@t)qgXt9S)H z9f1_Z?s7n)3dRA6D%b@`R9_nT6V;b`0w-{)k_Hz!_aLAG6%<;qO^$o-r-7j73JnBd zB!fy@zS#qj8ugq2OfJkSXtigJH zuaNKA`8126k}Gw-#7{3yc-%2KUjX7MSr8lcaxNln3{ufRt3x{nI8kIn1Tn4?&^T@f z+XCk>j(V1YZX=+x7`Fuw&FNM1nQ(NZxr4{wL>5u;TFAIh0y=}C&j1pVKM&}1#{Cl@ zA(_T>PG#JafKFlPhk#CI=qG>#Z{A2NZSJh;8A^<;8%6!duRy$Mmku#qKQy|od#Gjr z6$xXpbo}TvT$tPD@mqXCmJUrdMs9ad2B{{zP%)w7y!EW$!mvkjMnmup+_F03;Hel=M;%JNTGN zk<2TBBdgWHgQ$Y86*!TpR|686Km&E67$g8)3XW=aF`5NYAZQp`NTy*b;Y#|6M)w^& zz$g63%Tzu2H{$cDHP$>>k)OpnwaQOExSewjp2_7p_=T^0T?~K?GW5jC_u2`UUiC8l zq;M7;s(DA}V5zFltH^=V8tX)!Wgz32dN%!NRmN9JD?#?!OF#iOvN%N~&ja*Mj^xFF zRxw1a>Xi(U0wXKhp>?!$wFFw}!-M$z;Dr3pu|(>xLe;asD0k0;*J#buHxsxt(Lgo& zh!s%S`_}Fu+s4nn91lo@>r_B=N`blV%fuI-bF4{>P*c;>S2LWLn4qFxD2O%K4BIy{ zfi3IWh8wU~&iXN57AQaP+D-e~<#trWl+J&}Iu9(G+EUIjLR&&H;(BrhV~p=WAWmJA zzTff8EY^e2;tKC!^v*KgBlvs^#tbj|ufJU>Y6f+Ty|l(c*y*sFF#`1l&+m2Oq|fCsnWLoLAwp^=OZCk zpwnKKTE;}^V|282O6^4>7LvG>h$}&S921vKLkv?myQMn)W@Y6aHz53#+dA=_^!+au zWmMj=1(j18fm`1_#(j(92k1xi|7mW-ra-YSO@u%ZlZB%w((lIDLuLBin5CGjBTF$c z%fX}Kb{$RTvV_Jn$xupF>E6!C{zgP1J%EHlJwqj|p#$1aC83!tVKIy*hz4y3FMwgT zm`;dH|E?r;F462|P6##88D5jAe7N%KM|S_Js-sf`NdHYgx?m;&gMfXz|Ff!c=M$AX z_pNT#BL#~?MM}q&zOo3x-TJ16XXPDqa(LyowT!V*7Thr(Pq-4CzK62|%a*Du@1PZB zl@B3rRjw$BCSNGBmD?WyZT7pIX2QyePh#Q$pECGi-Qyx9Tksv0>TIeCg)sfZ6q0}C z6Uh@B+nmYy_U~r`3$iUv`}Z<|h1nL5a0m#8nrvIZ{!Avm$mFHSt;+3G1^d%ew#w~p z^4>kRss#C;e8(y(Gs*L^*Q}s1stehzRMrM-LD#zvR_x^MZ(_Mf`bbsf9sh~QS3Y#7 zNCT?u_+Cxb`G?VexRfl*%55op*d~3znVg$GP+PhEn;_r>;Q@D3kn47BeUthDl^+B^ z-36pXs$wg=AtATCF*PNVtwT@aDib&L+_zM>X7`Gue0}%S*}LDYdL6A&DHP$>|DaVY z>0jE|HNEA?n^2g^OSey@0_iPPRVi2Y2o{WX46Ff_kj}4HsaG73Eb1kX5R`Ye>gQ9d zIu1FPq!whi9HEb7$pQ=G9b<+aod^FJGnC#Vt(_fmoQ_szd@1`ZN~f$&l{>#*x$}`s z1X{ZywM5pn4?v4&A6uNIF^lw}s>L6m0gFte>N$+mwO74x?V@r(2j@TMt$?d|t$tzQ zA`t=ZYF5Cb^f!CKre)I1&B7|T|LhM~8u|g!l-!W0c7(b!Xh>-M7L!lR*Dgo@pjh^% zNfZ)AjL2FQ#N_Q$$mmr+g=^&&N~ostqSl#DOv z=5ZvUa<7-7Ax*`DCtz#|6QDGFDN$S&uok5%F0%_wpWv+Pz zY-#S+s%h3&P9ZTV3{>E6O7Dst87%G0Y^e|i2J)U3A9iHC)dGR>IaLZ@GY7Zsx7(*~ zX+3Di`e%fUMCywMoP#B>V9EtQk_|GkIt<4icj_PO>J+uPy}C0~`c*;aBfXfaxcNaU z;9Dy6yc6^J7)W97PM!Q1C3!Ydovr=~)-Z#qbmi+e{~A0r;ZI(bszzG12Ja)D8DFKP zr8eC9RRVzGn0MLHgxKx)7gtFknmi`hs`QV-I;Ug~U3PvJeUuh;`O`R*9gA4Ue8hJI zx3JCLk64P&D7_C*H4h=(%@7S;OtNbh&|QrCh{8P%h(^*KyqxMV-m1AiW|)qKs08k8 zK-90U*4_a~xKdw47_@Of)c>f~Qh<6G`Z%C#7@}oTx8ttXXjSQUhG?978$-|HDWtpt zNJycE=5N^bBxsMV3{ma64Uj{lPl?^iP#>Tz?79sQrAW2*9zf*`{VgEsA609I00}?N zg;^qoYE~%dT0l3kydFR_*Wl201EO+RtvwD1pR5G*3qb9RvzO|w^og(}yDnEy43J3i zA%)wnpw9skVL1S3f_WP;T074Ewg9@3adhV77~?hp8fEBpK*J2pb6{T^LzRF;Na-|3 zvUaPrHb6qkWcPF5A?D{o@+o^EB2DFUhwg`1*Eg+O8f|%D2Nc23f0(33o=qy4J z`mCb+h@$(V!aWG+QucQjAko!-7SJ_}dqLr(GV(ZDQP*qPr8& z2;=DB_yj}m1JupXy@0M~=p%rxW9U9WgA9ENP!~gg2T1sfBsN{wIk^*C+c8)>>D`A$ z`^kOk89CmW@xClH`+)N{nxnv+Q$!z@ zf=Y&;g9rOx#hXKG#q&PK(WKr6#`WX*QO4a3=pzh$6wrqmx*yQFxbb1u+}$MOee3a| zHhf)gBTnuc-H1`QZhVzZUq9J}8sXMr{AnfXueS55I8IVT$&NWGS~gpiZqkz1WY<== zb?WoYSjJVk?LF|)gi2#a1-4b#Qnm6MJUX%XA}EAQ!O1lyF7(vAJh$r;6RCq`dOx}7 zoWEtpRS)c(u50*923^;1f+Oh1A$SQ+l?(CwG*YUXN2zx(6b0^646Ok~U5RQQbfrozR9Ec4yPOBW&&u|yICrAe{n$rDp&WE*J69R2rmL<(k?!-BxL_J1G56x3s@r+zev@861|mn$gs zt?a5V6Z2H%HX6$1)Df}=K81Ib=cyl6e*N$O1#0)ND(Pka?t>UCNS%4x&V5J^8%87| z2Ud58{z)ebfcc0)c@R7;3EB^|wzUmV!BqrXZynqiypGwe#$O1P#0(UelPmccWQ+o3&*r)aHyp`a4*iAfGWphLi; zx&fl0+-hm%zXF)L_1fpz6ABeYnSs63jl&%s5XnSQ}rKClzb-1F2nYd_g?eC5}@ z$Iqt^M56Ebli@dhx&^i>dVAVWhL0z$C30Wnu2d~wV=q^L{VNPnK{GtpobPoy-_~y+ zkUFNTbnvtnjL~4knJ>Fmqv4EX)2?80v7Y>D=Tkn+r#PdT2hFKMg!XCQmwkq0k?3@i zQLbc1p5(GT$&__=TSQ9!@>f=^HzZ#mv2%oE)6VE}=Aywo8pQ0Hn*Uvct4?y23og@s z<+;ptwsc?k&=+nLg@_PM5=%7JGiB!iW1JJbp=$r6!S!y*MKn|#g-yx;9s=_N{gpB1 z)2XSTimxIN$u-}-a8&2P*-C`MMKnUrxi&`dLtq*erY0xMD9fQc0%XfPM*()USRCkopArWsOA@(BiaXst?!RNT)L)N_>4xa#gWk zi^9>RguVnk!|C#p33mNk7$I*Mw!)vsb-awzQA52fU4<=4L# z^^4j#t6$Z5@j8WRK15I4|FiSgh#tj|uK$&iPhr2rVWPr?p2G1sQLGs)Fw_s!FKgML z9J1Tecv9Ku?b`RRhF|pE3c5~J@d_z9RG#TdD2(p=Z3?5)+?R*>x&>pdaSI?*=tGh} z{PO*NBRt=iTnkiqerlCt%G1+W4wWlC0v z1FgP3L9kUa)l9pMv>9Fh_79)@k}d`2u9QPGLNX^5Q|8K{sXV)_R=U0V=&MTpZ5(;z{*u^RE^>XvFl_Qu2Aq zuj9z5k(Wrr8imPC!$qL8+k$wKn3Z2R6FS%?c~?lTMM`qJl0#`|u5stHoL}Qf<@GaP zX@EM^%+vfJ24K$m^|SQw0t)YbHIWzrv@2jb{m~1NLJ41 zt(07iO3qbQIVRhN#xJZkWMf{tvyy2@(~@70{7B$5TM)_>5D^NQqJrR0=RS5;o3WG=|V zTx!9X!~9Ng+HLpZNrK<;`z^mR{PIbzcPhWSEON-xEqRy^D@;vJE>mA$d{NB?=;yW9 zf5Y(Wvy!Wc{W6Ep$y^jdB02vT@w*MKMr;Jv&kkJR0W2FZcDR3iBZy3PY8VzcQ&XRIT{nC5531!gim+P*F#}LDLjw zDS39Y#GtQd>aDwgwcE%Bx8XkJ^fT`_;$A1i>=JP|ak-gGFF(Kh+|?O_D<-+z%mqSi zy(R8u->Ht+ZNI>?8ut&cX#*vNgRYw-mq*F@m_-iJJeY@h%7QWX3%sDW+iLKn>*;Ur z`=*{Zn)VCHMKmJ6&YjO>{1BMsd6-BZrpJOY`|g7z;~RZ#cdS38`-C|m$wf56udfu9 z<7YYV;Bevm%6X@ybsqF4Bp1<$QJS8y&62VP7<0-8Sk4YSsV9Hoju1Niddlmal>n!_ zITk_YA{&FQ7k~LlRBjPsOrIPtutXzpYb8d@lM@1s-FB&9(2{?+74JLp2jV;ha**MKsn}tOmwzyNp?Y{*B$=o_zioSu6 zOn#AsQZr^5S-{laQ#5tUf%#j7Ar7CCOum~-cqd%#wsIm;m!4l&NiL$Xa$Nd6+L+FpyJ6M$(l^4ltKf zn17Gkko=uot`$fy-nT1gC|*m!M!jFcAaQZMVBsQ6DRtZAB}(g=3M2D$=~84ES<{B^ z%@!JBf0x4if7HDRe3aGIKmH68hKRvL8x$?-sHiB22_XmqX0ps=Aei!EEJm;Qs?!G+tIrkp67U!sb5kkG5N8wMz&*S-EvpsHfXs(N-{W$yJCxq)v z_;g==|4nS^sq{gQLvxWv;lA&RogBY*VVsgLMyS_=NkZJXsIHEV{t#PSh3yACv>qi7iq>BoA5-d zm{4zl63f!qhK`8iIk;Y9lvT^h&Zf%{tnN{*(^1*g(%utkjs<9QPr}L~9g$e1 zZuJ_4H4W+o17TR;tSql6IdojS=e4L17rh2dfhw{Rx%xGL(a*FQ*WDL$84WEB2FgoI zf|b>@8+fRq;5D)CDC&{srrtUru3iUW&eHihyTw*64&cGUnE>546jE=8k=blG`DhExy*5FP7j>gw&FRFSZ> zt*Kiz&c%@pHPMz{GZHWYvor=u#)2Fc_ipHFPNg!@7O52jXiaJ1NaXUGNN+EidZVgn zX;6qnW0$peMgnL6P0gR|L#wNa!k{Vc6LvHRjZ$S?ij$e_HQGd?+10|)-oR|uGi{``sVov8XqFH#surd6F%rP54aSx?ht#m&u; z?pUb3BhqWv4vlQ~M7tXU`KEcz{P|TS;l-7uRh0pD%W`_v^g{F+>G5Y-_{1Pl5~?V# zsH?0ybkA5PW0B(3#U{3HHLQA~N_KF4V_=SHY&E|wP+3x2U0PCCI%PT%-p-y%ohYZ$^na-Aova}cKiFV?i z#CamcSlNO~>4|Po`LK%LiL|>+eWWwGHloVkY%|NdObtXOqLliFTDEFyHiZh4%5*k2 zZJ9J}5;&|%0?2SU6Q*b!O2{%^2x(@<#^PLMV@m8+u*@V@|LAJ5dY{-GHhZ7sp*q@i znUZ9pmu`R(W@k+V$6}j%tpqzdluB4?f3l)a4MJ;BTuasX=qxjf?Qmh$?Vas0YmBNv z{VAF5Azb0i5zjRkSTVUrUuR;F&`?iPXJmC>Yipz@O^U3X2$?33qJwma)tbu8B4cf| zwEv}Gm*RA87(D=rjm?qd_jO2yH} z1Z(#dWGsZi?y{a}UssDxvo&d!@YuUTE{iUUcBeELtI+Kc)GRK=rdl8dL3`wI2AHKI z*2GnSmSoKX&I(i%k^`Ag%~oBE+1_d}=3>JvRmG(0soiF)>=jgVN}d#bLwj%gYP)k* z>VnkhQJBmMnoU|#Cqt;RdIdJL59>t(%Q?rg0QsfJYHnVEDO~I(p?Rq z+Ja7OI8Yg^Ev>65Ei-BLr3bDSvl4~e(${Ua*Ji29)U>%TnMiZLgqg&$xGqt-MjDp}LZ)+S2Ocz~L^oFl)_h5#}mZwg>c09%h|Y z2db-TgTckY(U!(?`2$kY*Kv6hdRDI~995!lSUg}rbhosU%0OjpO-WTvWff9u#a}Sn zzCc2kGiw>5q#>z6Sr>05Udb#|?(1a1KojutLaRm(zUPG6yV`r(tPxG7>@vLLm^DV4 zC4G^e4fZfElY)ikD-vFa=3230GXQV3(T)yakoS&2UXnBMbMgu!&LF3Rnke3`(F>a| z2iBUHn!00sJ&v(QZx)nlytzh@OsGLW*oD(crif)dP0g2!WSO7cnO5{QQSLA}Q=;CA zS;|T*W-w>4Dsma0*}?GYk{Vjpr1p%YM>-Zo_M+Q?bSz*6n|^KUV9;yT)M#ZzrO{>B z2x^X1Me(A5GA(QG#VFVX3^FS%2V|;RBdsb&Y$}dwb@P{|Fk9u5ywDS=XrJ!)wt9VT z%q%_YtB4l^-P!pP3OHpAgT2yGh_L*;-)<|edmNzANGd8ovWsGdz zVMoJ!v&}CFVlfb^DXpt09`$v3C3{*Wy;6F0^lItxXZGfFLxnDTGpMHN@(4f=jhG?|gaIERE&WN%F$zW73eV7cA6kcT=pn&01|*(=nR9+D6hrR@*ld*Vxn^ za|<&1;?G==jFDbI|g3exg{be-|GrPSJb4>8#b?>(PPcpHZyUA7_3n&~yPKr^LAvPBgz3 z4T0_jP0MfR>8v(R1AaWx<#b{_(V;WNFz$z+1-ki~mPt)#W%gL$OF?syrsE%pH;ue? z2)t3#9ZKG9pt(=eF+1t3G4jjBcR}+^GF_T@UjfYlO=rf7y82I9MZ6kGFZyS#BE~v; zXGK@9fhN+zqj>^$g49%Wt;hOX(~g<0H`*HWPp?1AU)LSun?7&WDvfq_W3=i)^!ha2 z&>ZN|;9}5Gu9e%y!Wzm0%`R30Kj8R8HJgR+ljA7}1N3qD_?8Z(ASwo^P#MCVR^H4d zvwvCjQe6Ah5?K#g)o=yS9zTx2@Zusy3*!!3m_&U(R#Ks)^YfdX3V!Xu*Je02N2lXA zFgbC^3wbArEPaGoT|TR1u(6+jpU-eb$LuQtCh8<1fG0TqHQk8-CK&(Ovxe;d?DMsG z!RPI7Q&3tE$FqiNU^qi#(5rxPeoG{+eFkpp>pxjyf1BbLemc@XQ%M#Lf)GzhmUg9) zknHG(OqW{+Gxb~}t54~*v7=UdzW8@L7uRd4J}Vbr(-{77#|71iq_})3U-MX-DlVqH zDD#}fc3h7EL&r0VDqr|uX*u_IR5p39hb@GZ*|$B14}=~~`1S^A!t13&=uUE_tSyYG~ z$u|{i!LqEQSG~cSbL_H6PiK17@3@fz=G!qlS+x83W1uYPq%Pen8<{reHSyMC^=3l2mnvryWG)u`cKbj>?cg+ zJKnEhax*)Ydqzt?6CLl!i+jXYa~yjXJ3-m<%yVqX3pH1UVUGM4jw(mZXe>4MwpS)x zfE9$9!VQ{>r|{i#lbYkW*f43;Dg4g?V~*k&=h3cv%%NRIRkha<>A@YsoxCd*LoD9v zyP7woyfI-|6m}UK%`rBay%Zl{umdqFvnAe`cy4|{o^xT%1YO*gilhJyVA=q9p);Mf&qEOhAL5YIa3(lmUgOJ_s= zEZ{e$qjTuilb0>(KG40WX<5JN#%i9c-UFJu*=6CFj&yXpfM3M!>2T@ju3!2i?iNkUCXp^)(hY&;$A_WILGSJ#idK%DkNwv z=w9T&2uBvm`wz~Y*CGj}|Lok^sdQuh4bvxYSYCpQka>9$-m&_3l&SlvkJDjm4_&cu|-4!04{8VdRDI8eCD1D+NE$rdM&}RfAj7)(>LnBB^P1^1{2SM5*BdH z+lsVNi(g94Vugd<8H1nUAe4A|#*67Cd?p8x)#Exx(;x;+N5bwg=V!iz^2Ib)uB_r5 z?UPeN7#M-8fX`;-lTlL5-plaJCa!GfvXkY?70_(QKI2;W?C?J0Ir!{*KG-*`G?wBn zpK7C6tWT!AemAGRVSXO#kH)9^zqgEq6`P6z!4<{0s3{cIuie8pNDxAC#T4Iy)vGcX zuRX98bJ`Z5v^C;j=F*0OcN^O(Fb2m5E_{DvB%U`o@GvfyZ3q|qD*o*jV!nNe_-*j_ zl2u(0#flvqBq?rU8WtW(;aySL*C#;s?!ZA@o9T(o6X}C@bbuc=_C$o-gElxo6mAR} z9Nb1R!}4qj=?jbuFiOqMh)nLpAOo}v2GA6hI|+T)?w>e3z=X4u+%n>KTUl|+U?IAN zWM9u)?97JvDap@PPxkfWfZduA^TqFG`Sd@|XmBy=_pF!(RbG*!RSbf2>W>^LX znCq}R*V)&98Psw+XzAd>yUE(9FB}~dsY?d$V2cn4#xcf=}ctmyc+>_0O(%EX(hF_@Rw@lJb2$ThIxtR86xFik1(C8XX| z(W=Cvj+07u;G4J+H!;ZaOXS|1@WqdfXWX2S7KpJUK81I#J1^2=_wnQBv^=mF&(O>U zZZrH-@ynI_%@oA$tsq_^sG!FHscoU>0A&itU#(DHilpS73rNuw0aA3;Rw%EkJXLtV z4d@hsbgvxztPDC&HV&>I=P&~T>ozlnpF0?rhwhWU*9toe*tHq%65Fa|35hB`YJr$dsO*Jc1x^V$MH1^B7U zACDBM2L5dPa>YQ=A##>=?fNXH6*o=C{B7WHTUSC-3Vx!pfjPG!k%ux+X?;^j@9olSn|6L$N1p|t1kgg&@`b;LiraIP4*SOf-KF!(X7JUl2M zDFaj#%}rrpG@eTvWw7A_Kt2?-Iz*Z~7G@56qcUH6;2>me!Oxuk(elu@!|Db@G`QgF z8ir}L2GfY+6wD5jSIXCgBrCmYP`D!#UD}+ShX=xVqN%`b91vRL1J!s=92Kv5IMI+1 zU%m|{54|DW#Gd61!CLYIiCWmK+|hq9yJvj=!6`ixhJz3I!KaorgCe?qu-shR;3CRt zsZD8RiYYYIxuiFKBiBNsR6mFKO8jsWGW?kW&4FJb5c{&K)@DGefA0jOR#QI&RF0p| z_&I#lbbb#=aj@AdC}myO8;SYXLU$+X@1z2{jJjDM-vVZ9)D;VGjRhlm&}I2HhU0gC zfJrm{xPhnm;~DfX&}}D67gVDfgm;CPVi0Dz>p>VxvZaV4{`f&oyTJ#_{h(|=L)08`z+jmvu@_HoqfIIc#Rr6nBj%oO%@CXQWj z2lLi=m{PK<$6nweit`o~; z-pyH)?7cnbP9^Eotug|@L(<{$#aEufsIlCMsk3OzeaY1p#*}03IWhoyj*eXzwd0wi zITrk7^?s8_T>;Dh(x}*fqUj97pCo5ILexziBpKfF9)>B!gL?%u7ikpkc$A28BFC}Y zgVhS;oC}{M4;=qLFWV)yNORfW`7W~LP_nb+xijVUa6gTCo7ok^+-4GAr2*bns?zgW zGYGT_^W_wbY>p$GPSLz*(NNBzZ_&&Im)EmPxN)D)l;Rb3dfw7<)Hg+EF8J<_8;9Vt z4nD}7muGWLQi;I(y_pO40n@olgRRf&iNj|dhH>qtxTH!V4)Ugr3;?5VBU#dNm_O>&;s6dbATBf;pTd9)dzPZs^ zKHLek<=k;}Vwx@IN-ZZ_+Q8v4Q`dZ(X^~pe50HLRO)N$dSd@rxoJR{Vxjy%Y(si$f-6ebkG<@iqK;4P6zdHywu^?F`(IKhD<*aBdh)57U&X- z#;|Ie4i#!AnY#**B&+m9im9z$igS~-RTZ`6;b3~TklqN=A#W5&6kaKu9fK-lO^ySr zEI6j2v@MFmAXbE_6<`HfMXlBD&&{7(=y$loePPU>n?Gm1&{NNHk$honn2rnNIT*pE z`@(n^Cm5$2T;@E*HsR(oEFVM z9}ZJ5=umHtwJGu4_4 zc~Wml^-DWbUjp3Hfd?GJRK6*jZujxk1 z2iMetpz&)>R(64O`FIU|4&|#=Go*Dz) z>7Y9>2D+)BJDQ1ixOC;b6$N$<=zc*4I6r^*0-xLtu15t-#wNq(P9>FLuz1py3zqxF zXP9Y+3*-b+#&ObpVGMMv_n{QJ)OmsO?n|LdAMgERpkut>Nuf(0?{`z^(#N}NjC4Or zN0-#!ZbSNB0A0&80C0T&m-dsJrsxbM&5AcEzfAs>p!uSvLpM#^PUiyu5NP&|f$l@l6tE-1 zjV5mv!pcF@cNn@d(8WRX6HUkVn67{D!{v$7;W^xB<+l)Y)tc5UKP=JyQ|BwLLz2t> zStdNym;i%oHZ^#+%LpYxf`!}%zG&u?|k z=Xpub^OK&>PkLUE^t>?XncKfk`PkKTJr^ZC2a=wPlb%bGo=cOSIUG3S3no2>lAgOO0Q}IT8G-EJm%f&QP;*-}EmYL6BDp~qI`Q*ZS#HH2n*&=-Mfs$>@ zCkF@FN__^~BHO$AIM1HqlTSE#0#UyDQoRfi>%nJS2%k0T6FY)z8>(d4%6wu`knI)b zGvS{jPzQYW0iUtF>+-JXx-S2Pvf1WW`zOYQtE21v1#|OoSgi}UFm>>_S|cv=!j)IO z{&ayRdrx1de{p-v(9h+4?J*pRHbbd3?GHD#n21nE`(=YB^gv1Nz`U6*clr?V<*()660q0@JGJJ=3#8zLN?KXX;79n z*JKXL7f4ZMdJ`Z1NHFpuzIYy;`tf;?pD!ENWa^`9_)rPb;C{*#j>k?nLf;uvI?rEU4lGKNtTc@m~>t zkNB^PzgPSN@VEKFX)^H(@ZbRb@ZccjENMgc^us}hJWq)UoaudrlckanK za_53^eHV)c3UpI|w!WQayvI+bgOmmpH3rqUO@K7$w-LwrO39r&ILJ^oF=NTo!M|%I zQu%t^mmON5@_pSg_|8ieJ{C22jf-`0;lqAHkWy|xxpXh(P-&BU9!>c9M0InOKwHWBhCG80Su;gRPxm?_{?r85UpnrL-P;5TH|!w7&rCFC49yHLM^wVU_OYENU()Jt##8otCF?+l|=5i1v%LR#P{!$WW0}L zNG9S98J@l+mJdyUxFhB>ZUe-$!`?R_wS3@r zT(x|dg;cFZC@iR25XSoc18rM?b*SA8mS${!33URc==h3)dtMGpZ+s0Uup^~>%lBvY50BgL?H~5`k7RG0oR(;?G}lxs$v__%co#WMOqznY z6Gt};2DgQg!5^>5^ah`a_uU!BOatAZ;9ZGh6ID5DP96;2sq`uvq&Ut^lgAupFj0~@@@%5! zE^FG(*mpNGwfvq$@GfCmgZ!y!TPf@e&iN1o#*Fs{=lqpJcf8i02xr6_rY9;ghZ@j5@lX~b z?0<54eLR#Kubr}&akP0b1vJJ(Q&`v-X;+JbY4_|Q{0CXLGKI2{Z7=#hZ@8R6H@fpVf+9=Q|fK+GzkeZlQ1G-W| zhXAb?=s`d$1^P3fPJ#Xos868r=w?dFiGb8Zmj`IMgq{zmN1!kumAAcw>g0HHP9-NN$x5)QtKQ3s%JvP0Dn+zY;OaffL*sJvQ+$1>G*R#PS zYHsRoTHTH>p6!uCh~oDUznlz=CB@f_kH1!$MA!4clr2cU8lJX2n~AYw{T?GWsehi) zhY>V$enm#Cu7Ah8MN=>4=t+F7lKvlD36IalX75cD+djil({CtjXI1yds7Qtl$Qg4pO0#a{|Cj!!Mj(|#p zZU&$W1ey&KYeFw`lX|971Dxft>DZL1s6%@0kb6Nw}rY}9I1ibXt?z>~a?j8{TlAI6r{TRgW z8k=HSiBQ(l852DFwgZu<1)Oc{`zBxvuVkl6<2)A;lL^rMLj4c+=0Y&U|(Et1l_t@}z=K)J_`= zJ`-MoJYf6Ak31LwV-xa#vK)sz_<_ai0dV;9jt9qd@Or@aq>;(fGG$;odC@J%Z{Gx6 zx9O{PH;OC!iJE7#p9nr5m%}O9_x~XK{vFpi>QP&Kan zcb_WmD|z+hUr7dE+WFF7Ty=SZh!!z;`BU;<+xeQi!Y|6$pT(lseM};hvHQXdBc4;6{XC zeQ z)t6H_UwiAdB+gvnlv4RbZov+OiOvq=8zSs5^lO`LX& zO$T=XHjEu3zm~s*jjw!9;5`;@PZ75a7BQ^gSKs3TCE>$@;23KQ#3wHgGVFdJdmpdM z-p2vi`*=t8J_c*|md#>al|3*7in!PXKxiXolwc%PT^lA$NVBAJeoEODv7?0q`>#e3DE+cjv zPRsJ;S#8&Zum{!uQAW>Omr7EQjN3%s82gtYdaLMxI^!|9?FBJ*55>2=?*i1@ zKP_xZYR+wFl=|!6hy~_4sl_n!(!#n!Ee_j=Om(ls#1S z2dpx%a>au5`#>2p-qg#{M?H9wxUuXh~WBpd>3VR+^@cBB6g#P9`!Cn~QeJPSl16c!1XE?N}_9bMctI?d~JF-G1$k zb~NzdLcN>>|3!gLhfn!FIX3bOf#$(iEja*)4Kg?VyAUqz#x*KU%@L6BBeB~(kH`PZ zTW{E;+|H?`#^FKT0!EtqdY?i|W1-Mtd=*EUafdkH@!G4K3T&<^nv2|SuJORwan)7t zz1!xRrnyMt=Hi;q=6d{~AMX}s3c1v$BaNGj-OT11zW=jmS0)$t<>*M`=3=$mTn!g| zbid8T@t2M?ZmuJMvAJfpS75u&jH`hxaHMf_ak{p-F1qc(KiFIx=jlk}<~kA>n=A0U z`_LB6xH#0(k;cu%#%*(*_Vk2$n~Q@F9cjSj&~%&xjMuXR;u&_^Et-Aos=s&ITb#j>w&i?H%OQ=(nM<0}@Jp3*EUInXLogo%Q-x zSK2MSQOACQ;YSO1a(x`MUe9+SmVNLx&k;YexuTluuf(yX))3l=?bZXs8*>@wDlsax@Jy zcJtohlO=X%effopda|s!w*JenwYfg2Q|PzS-0w;=7_1wJ3A=0X6kxobGZ_GP->lz% z!K^Ku{L^ws5~a?p^2v$db4jx)G7a%{2`e zujh0{W=#ItMQd%YR?S5kCFx5VW1uwLawx&;VQZxG{qKSMO&+{dYA(`%%b^E(1~6XF zRuAQ&=WV>D*e>}4n(GXNsTl+d7Tou0s?OlS_{d5RC9}VCh@5B95W~Ta-|ZNeSYyxU zuywWz!vW|t7luR0R3`>!sGu+G!sG*UloKQNZMjV;`EuoyZNTfH&N0WGdDs2suXau+ zaoB-7(_l`WGb3x$wywMB$1i`$E>*wgB8|H)&T?^m?b#E5Yje%hT%>Vxoh@8ufi}!t zvC8HOYcA5bxn>9#*H?6dVxog-Xk3h@AE zw(wgu7irvFvw*SVs=T-0Wt;0B%|#k%KVn090cw!-C9Os5+n(gYu>HJ+pGA|OhvveK z528`LP=MV)~pd>riew?4})8dJY-~86hm0`@$T%>WQhrQgLo`RJ0u-|(<55cFH z2m8yn+v(}hlIN=QILe20tM0aD+1|8c(+_N}&uFgmQn)yNcs-1fTyMK?{^lK(KMv^x**ZC=23xul-KKtrW`EBS09zb+Q zO;CRqC@x3sEJT3U!&#MX>AANaVb{)?nu|259X4wWY2Ed;2pD&LEs*-U8XPMtE6Y|^ zIyaFTjg{rgfxNI7A3rsGkpupO1Fm21eAwW8xWe(Uv;!BP!1Rg8E$NHJXeLD-!gUS$ z5TY_QO9MnO0MXebmj8HU(Z+~nQl)43$)nO_ zQ6aP@-K4=lMM-UKd38nDB30^?MTMeInM@rjE-9<7T5QL!6fM(H*9NMBwV}H5P^BeW zG%%IOmCfq(scA7r)hwD)Z(nzJv?tc9QjU6;TXSLM3IEMwuLTvwp_01V%EbXF*lBr+ z4##Zko79nSRh^Yxt-463wasc@sI#AtAQ)*_mbi0+ER}*L2 zC{+3dD&wU%*}WRZgLpz&;hh+DELSuDMn8Kl<@8Ay0gjo)R9X?J3)WSZhAJupWtGV$ zRju9OqCyp8QDHP-v6jJ%Y)NrdS!Fs_IaO>jHDLtc;bNP&GEh=g8Lq1hp|_<(D_RkD zl%f}5vxWkTYbz>Bt6{x1mDLq3H&luWTM_MO$NWob0=32EW#x4x#c6~og$gSn>cRlp zrn|7c3%Bo=iSmcp{46VD-Oyq->ro6GgM!EM0|l+E4vRB+4qG&Ztxh9UCjIKxc|vbK z&&g}fYn`WX46yMnt*x!imTVJmBFyJGd8;E$^G$3rznub;zQC0#p|>qgb4azU1en>i z%-+g?>oWI*@z7=K$uzQ56{skyDyyijtqVA9D>+)8b51d9(rpSVttlxc!Ms|)OrJLD zh73AG(W^~@;`LCy88uYRIENt6rY0$z7932ex>(E!BOIs-VK*Gh@^)ik^APAx!)k?&?;q(-u5thAId0cFT)GplM~ z(b?(flKR^c(D9D`Wi40M#2NJp1ce$AkJ5Old5kl?t( zA?Zt^yBzq1ptzomX!6Q2 zA2i}eH<~<72~D86%t4o~KA5aeY8uL;llpM%Oc2NMB@VjJIpqDnY_A4JO=JItQ^ns} zeo{^Jt)Cse`A5dlsIojcb}&VsDr;h9f1YIeJ2RUr79xF!=Q|+wQ7X` zy5jP8h*o7rUL2Z^Kj8kjAYI%So9q$+As0Xl( z$%Gm|)b0pD?N0r9NBud-Kk=(SplVDQGN>#AC4?grWse^y2e5y?-xQaa#6WpkGUNw{ z1W_GCFkqbn7>YDD{bXV!w0>wFK+rEVF`y3s2ECo!G9WHCFRMkVaXC;Lj9j82(uT{S^Kg z0{sF$KQ-WjPWXzKHRTta2jham`2g{Qk#bg>PMZS7)ar!-lr7BkFMo zJ;;lWyM>+Kgfks5M++0Ld#KRs-beV-U8qFedO$5FF4f)Ds(tvaP_|fwV-HXedzpd& z7)$7hW7|~E6EFy1N?tS4#*a^XiEg9*BoWvI7sNL1#$VQDWo;`Jkl(i+ zEhZSB#IHl!*}Gd|B#a~+16qf!Ajwii@+p#V7yt=hWwuod$(FOh_00x91j3CEw-p;nTtQY1Wgy8U9n+s+Zh z zaT0xaJWm5u;l%my_-_KL#ppXc{whFqPzD$t-vg-LSO$ov0X|_|$YlQ!@wN_K55%Je zJfx%+f3{5|JoFj@x1Av1iv;HhI32CvQ6>b$J~WZ-SprXf86=NR1)O*eAuj^hwwxhD zH>mKJD1upO9oh!}(Q$&Fv<82+O%U{NDdBj9ehGiJHwZlWG5pyUAUyOY{72^tdeS^3 zWP78)lgA+;+c^HU4!uDV79LV@5B_YwNZ`pgF#ZtXq5p;d=*0}nl(0z|U`J`t3huT_ z2KpFy1Ota&QzZY3FpyBsf7@b`u%NbA3CSZw@@<>0%$nuwu2@Q260 z0m36a8J^+s-@~)tm;&fYK&N_61N1bYX`a&o{SeR@o-+ac6wq|fS%97gbhc*(puYi{ z={W~bE{b55=UhNj0Ofh|0Zj!o+fx9@4``035YRM0b3Nw)+Kv=_-17-Qe}t4`PYIyk z0xI(a0lf^U+*9E}KCTBL^1B@v=z?RVk^P;lpyXxX2OE#fe&PqM@r)V{1%X8dq+hjX z7l$D=s7wNMA%3~?-B;nL$)IqYI2CS=1r=G)VhdtFR&=W^sLO&l;j7RA3%bpM?zW(< z7WA+M?XaL9S_bg}}s#MYOo@E8G zi7AN9NkKd%sGtihsM3OXUQmTzY(bY

%&|w4hH}&>a@E#e%5HujFmBprG5L?iA5~t_-e%3h_rFpWj^_l z;)v0K(+d$C()Gh~PrK2DyJezc!v}A_Fe;P@qigs#vK0E~`#yA4NyeoYuh`YNW}G&5 zgJanZiGz*FqP*(Z^*q*Rg?TR5&JRg(4s!aBRpTd)HLarjn<$l5YI@&{#!_j6j$0L~*1 zLVqb1=06i?3*UY5K)~$@2%elZ+6*XHdbuhqz7nX?|P9YyPNU&e|bFPCUmwa$++3U|yq+T%2>0o?7yQZQVo#zYjhibI7ZbNz@caHMf_O$5g4$z~wj`Il#+Gh?kIjtf{i(zv-;4)*bb?3^EA z&@{PnQ6F@qadWX}c`e2L+HXI<%jPQ4T%>Vx@pZuF+A|yq+FWg#i!^Soql7C5KHdA{ zrp0Won>80{+*~XNJFZ~v3FsDPzP_WmNaN;WEH>AN(@y@3&GoA0B8{8tXyN)8e7gTV z{}*4kxx6}3(zv;f0mkcLDbXF}`6-4CGljf3hmJIEF2-W38b7sQ&)qgxz2+i~n=4ni z%oNVt*Vkrq-JrQhGd?jr(oZ)&#tyh>}Jh%DoRXA{+1=jjQx8lm>;_^&bUsKxGvXmo&WUb zKW)eLN6mGb71vRm0JU?cc^a@@4+c}I<*U87J8F5R=9*^7DYE34xwtR|)0u*~G6i#c z3g#gTW0uAX7KU*-d&=pOW{%q){OG2owB9p-^?JA(<4FC*2ky$ZssE}apJC-|61%QA zGhcI3F!d>zNDAf#3&UJE(|jhRyLg|Ri)(t^);$!4n9Y@Nalru zHMJ#`HDv+wBb6(-q%yF$DqLMv0^QzGK3=)#s{_bEUDe`nRX}~yN{ulb2$hxwt13!M zwF0jBt;;2-q&yI;E`g$MiK%@IGUqoi7j<2ruC}VYtgNCuV15kCPmQ@QP+pDlEvc=v zsAi{9A;R*C^5W|9P?;u^Z)vH7b%DjjAsB0_sI|luq@${?4OK5@jhRWClS)-m7C<$X z7S|vLsUPKBd96WS>w>7&x`6&xmqr|jO3TC5WwoV&Lwv+@$wd-^wUwo{;p!S^+tMHR zT%@HXfr^T%%JQm;#ZW2lDwv(D#LLE8RH#1pN$M^tXmfE(OAo%ZQaM=`AEM6eHmOw{2$n(LyR2*!LqsZ}*c|HYOfALv zr6m=MLyOBx0?7nA9o1GJ-B28uW2~eWx7}woQOH7WAdT9VS{&K1jGum?*r^Z|vQ34; za68~>awcJs>Nv5X)8lTP*kXP!ioyl zQKMDVvP(sGTSZE1UvuW^fhHd+{Ux>4r6qNxV%w~o#V^LpLWCOW70}D0$Ddij`50@U z-MzRD?PgTgqC&E?(G$~8G9-0dk3EDG%{qeZ^t$NDF@Y!{2_Rr)2IE7rp6be#|B#Bj zL!X^y<(9^JUZ8fn|U*1S=NTu)lwbBafYR_Xiw8+5obEgm@R#7og(Y` z(CijjlD@ObxfN>Xba_{g?oFd*3FmTf8~6ql%$_P$W~LLZs{#2$-&4)Pnvro3p{}^3 zs%CL%0HZ(V6CA{mjN(suby1<-ZBkA3+}Q;Meuq1(-t^pg`T0Umz3By_H+?=4qJq9|y8r?AlI=-YmJO;WgpnDQ@&3dPT+XRwd$Lk?b zqK7yGyEhBCg9FFvO{d@bb*wdmpm|I0RF#8Hk)JR7-{Jm;!-@W5QoVf&;Xei4 zg?e{`SxQ$QX9E8;X#S+>xa3Vo$3?XVnLLXbg&U2IFI0;_vr5x>@tjT`={AC9%VFqP z4o`r_#~l^8(d5lX*fh|rI1C--T?v{e4?{U*@9$ba!jo(c*0d-FHEAihi>hjqWti6@g~;80a>E zW@rp_J3;gMVdz-S<$q~~zy>Vy3#4!Q?4?P&d@7IaU6<{0iB!Ht#=_P0FHT&U?rlgD^FK=YZy&=r90 zKG3{82D&#ua|-vZ;6{s=@(MxIHU_$@Ky&{X=yrkT-7(Nj#9+RN13KKH(zgUO*B^$C z(cKA}M>L&PA8E$%pM&OgO*h&&&iZ%*G?V=R;H>tXM&2SnRDkiL8%^FP5!UE8jA!tp zj8jNqJ87p$^G7Cvb5rO70q0f-C6I1vI=ZBJhWVWay2YCIQ2FfzO~0n| zfG^!VNd1>V(7eL|36AxXF2CF^_Hzfz;h0}6ss2-z!|-7VR&dmPOJ(O@vh1A3XwT)B zl()w!`c_}UweuytJx>cp!=W7^}c=WM^w++xToMRMowPHJOQPshfw7-7w6NQ;)3FFJY3h#1IZH7*Aa5KTJ5)t-wFg z;?1;q=NyKYdYj<&Nt_vqFPNFwOl7X&fPC{C_(9Akg=hw6Ayx6>IV*PcFG4<`Re{pN z7dwyA|3zu;YP%h1AQ>tpD9Q|vvUee8!{Zs?!6Y!$0bqE1H+;IGYIW;|$p6o3?*~gs*NZs$L>f{VO z^OtMPhp%uY7F1zDODw3tf-bh8RTdPnpvx_Y1DTS%&VsJCpneM)v>?8sD2_WV2mo{} z+>RrKQo_=;aCA~FKp7{PxyX|<&d9#yGa$~s{yO-Bn@2`I#C_NkvTyta+VhCI54&K; z{2=b_-61uwVpqWr=GX8V-}off1D>CsznmBS#wW8%@NAN^a-8I=G&$^Hkh;Z9&6-83 za7U-q=Zam6JZRh5x4Z~^_VwR~Ke+j$KQnblW#4$7ojNq^_+$>T%u?16>tBmuBLK*7 zwgeT1^u@LeZzvbS{jmZ%em z>hqNXEd<16J8S_0surjW&|-lq096T84X9k8Frbh?%K!xhx)4yAK$iewZR4a7pb~*v z02K?=1}Gp<2cRN>x&d7vPz(@9IiIl}&;o(30(8DWn*ebH_Zim%S}4$FK<5c`6QH>Q z-3mzM_jW*qg1ZwCJFw5V3lNw0KI0xh`2yVwC{LiRfMyF+*|oL_SLkR3On)0L8StOp zE~Y|89f)D+E_2}B*y=S42XB}PNv6d%Oon?Q)L8Il-^4ZM^qDbV)+l`whsQs_KscpO zhnudqeH~Bp3+cyv31fa<-`^5PHN-QOJ}U^Y{7Bc$m>qknYs3>S`-RU5EmxX@YC6mD zte};E_@wUZR=7?pbQ7Ru_`xJ0K8ovne=KPND%gQh2aAb7Zu&$ySkuj2YMJrR@UGa0 zq{&`G@^Eu9@J;y1;>%2TYUGC&5HST{Cgb907<~{+&R`A~Qp1FCSGoM@OBEePi7YYg zMqyZHic~6R0a9I*jlLbf!=w_D`q$4f`i@T2$vkLXf^ZzdGT=X0+ z?aO(?HgZtEBpk1p8V~!WBgndUw6yn)L98kgie8?BUYCnC|CD&e!gx3k?=Fk4uju<& zKQ7~sO=@gF#5&5{m80|;4tg8L9_ezl*qnH{I$ja(J4>QDZQuuexowaD1!8+L#`65I zb;b6x2|u5Vt*TkD!(ELZx^AQ^+S%UKgwGKE=BBQ$Xw1Jl;=dx&6J>w=zigJ*OZ=si}yTvg{BL&J|`bE7qX@(arpg6j#uE7~el>rx= zoAEnL^Ez|~zUf~TaO=M+;P%4{;GEIF5#2jmjsE5wz*pIHJ>)Ei{G5p8jDP3hBQS@L zBg}q)_q%k0r$f};hZlF~B2P(A`pF_|5#I=|>5a8I-cx>w$gS0LrX#g@4>j#^BJHq_ zTCaOFpMpu0iDE?q19N&>%E4d0U%!I!8)l}grTQ8(GFYj-ZjS^)T4K}d3M9*31(M(c zo8W*=z$1y0q{MXxZ2|-RLr40KVAHJBIcp-r|FTP0l^j(b$ImD0wC@7Sm1+D@fmXx+ zjzHb;zb(*L;XjC<&){kF`vl^_Hq{%a1A0twGXZTEC=bxX0&&I6^|(*2p?yf8g}~h_ zPyo=k1S$jch(Hy9xaRT6<+k?=6b9~_0xbi?l|F1J1L7J8Hk1KbWE6~F%VKNiTrzUD}(L|pg^9|-X42?@L zJY%}!W)G&m?mXROX(l3F3}wj3Q}`Wbz{6{$?8;0@FU670QM33@vZ6a+;*(9R_-$O= z{&OkNV$l1I_-*w6B{9=P4E=ve%ybb$|6dZrSFZSN^#3I>d|!*-M*m+D!QN zG1smsyL$W33^{`7N%?3%Y8W^H(C_fe#ZT>B3!uH<;xDcD$YbhWVgDlbWFz+OsN(sN zO1*%b28d)TqB8+G9edJYcEnx{X71jxd*{phXsWC1inDjW@zQRw+7&xlnbcB`hNV#ZLl$P@(TSIK)G_j?=8VmiYhsCSfXN>|MXVb zwHz7w^EDt4_irn;4ZiVPFl4ko2kS& zz;lHIzskP(&lq?Ip3lDd5BS^AC-0)&{K9WuB;j4c}sJ^--~Yq7A3 z`?(oUJ_jqm+Y-SCeihs%Pp>wt0%8dsUu|f6^^$39-DWa!S081&33_zBL1?nN0|2I6^E-e*h(=5+jg#yRj+Z{XHV7DClA zMb+hdfK$-*7Q_XK;^0b2al8PCTY0(09{}-^2A|wau6W-EPC+LiL_yrLQ#&EufHLvR zHEw{f_C!7nh!;@g8efFJ6#Tiym#xqTEQl}vpOjFZllS45YaD^rrc!l0AhjsxB%&6< zw4AF#gMh}9%cujSa#<-7@KWDd?Jd!@U&V;QujzqSn5~_a z$F-NnI5nw=^?G{YyPZ}sXXa#F_j)$F3Gn1RHsHmx*Yj!k8Tfs;E3;mG!Nr4M_}6Rr zMV8VnAjYsT`RY+)ls=k;0+%x`#^Ck%b#Qf45!w**K^G98aWXC^7sq0o>yIVz=WVX# znrnOtmruB+>hNRV4c=vQU9Pdd6s`%v<=5exhhBfm=DJ>EC!}y?3fB}J{>pl;R6Y9X zi~4V73fB?B#l0fBmv6s#rOm}9JKYf}TpVZZLoeHZ*N#qS#`O!~;YZ2jGGy=YdbYsl zgpsxRz1wZBcQn_L!o>%+WaZ3y=j(y#(%MLI=mcbe(0!2LNZGe@*6Adn`8xVVIiQor zt-H!j&$&9TNs=DgxM0kaK}#;TZKb1tu@8u@A6kdu2880crB6p1v3^j%r-_yvNS;Fs z8I)vT3W<0VoEC=r%*Gxk<~(Aab7JNZ^RyE)pBR3Dw&djJ0rQ{}GlvPzE(`^QT^Pm{bYYnJ^IaHbp2LlmX0Z-&x(mb1bG)@_nE4zR zhH2&)Xweif?|;M3#xTuqx-d-h@12-A#8f-W2RDkVS4~S!KJ#^llS^zO4Y)AO*IE~b zmD=jUFkhS{Y{|?QTc?GY!!&cnPmI?!Mr9L2V?Z(wef^2c5giIZ96uS+WgBL1y3q^* z7UJMOV_{61`%^H_x-ib(lmiLM4iBZBy6DPZ*s;H#b=Y{?+E1 zppu18?8#im2-j)!@oV^>HWZwhFn*AtJ4Uz&6>5x;BIjcWRaSsf<=Dqu&C-aBDkoRu zu%0OA@n7enYR&XqtGRNm^w4&aa>@Cc47At7mPWg zRnmJs=}Ywwn(O0M?7Rm@x#U{rdcf;p&nL;^Pc3@H&V`@L6S%3CoOv3PTB;|4ZnV~W zk>)zllG8D&oRbbAXS3$wky=$kUl>&mR}rJ7=R2C~WJ}JEMwR0iIqU@_`Rt|}9OWZ6 z&Vlt?at^xWAjmj|jYC{=$)5r&4l2{f@AC1t)Y~OLLvx*CNnS9joKr>4XJt#Sl%<0ScJAM|1)0fPH7Dm=2zjxAb`Z8X2Vlc+x4rC{W)0gZiT5^~P z-1X;(i`6RIt`?2V@7$mzMp+?a4aM=ZXk^a4)`elBH&_?|#=|=As;96FnGLS9l^oJM zpF+coaYV6c-bkTgR_k0eSzOwSV;f^!%zQC^R+?v1@^mX-&X#aGLhQNn$t&mn$!-bL zwdB){FqR!o@#o<<{H#o(^I(45-!#iTj;Md61Uh~_i3)PQn=1`aow~n$5B2zHP_iGTr*r; zzu$RdpB>jLnrlW1*Gw1J$<=ieY_5ZvYi0`9IWDfXg)iY1%L5$Uv5-J_P72p7V7(r* zH1;>X_FJ24w&t3Z!ga2T>$+K$SJ+%(&2?@HSDtXm*beCJga31^&DE{B@`MY)#wLwX zeaCr3Tt-U|S9cx~!sVsBNpVO~ZG(gH=dWJ#XPf$STJmfwuCI(57fZ(d);2pOF7|1! z=acYRIT_RA*V=JCsU^>mxSTrJ?2Ae=0OQ@3)1FW*l25xe7irWu>f_6_IO&6ql>zJU3q`63=VsEfw7dZ|MaSo@WmGdgiHP0&N zm?g*0^f=y*IS9MUd0t96pD#4jA7>k?z4fsh>~g+MOFloPoEHe!3GnG2xaE`Yo4JA# zt>z+)%IRya6q4ip6wG99QHWzM=<+O#Ddz$UW71q?VN9A13qzV4@njzUgtZ`bmN67< z?lTR@$Pww9D2`s2cCcqLwR9U4oR#hK?QKnw|n5&hc8bkzD4t1~{mers%UlwU?!pU2ez6$7=xst8U zgqsC}o428nc15H`vD!S=na+wpbxCPu1#d;ryNWn9EeiNJMGfIRn_L=_W63yvtm1bZ z9z}lSkgPr>%y9D({y=+Cfp+HW2JpPxJBH|x=Fwr5LAFBb7o*^TePpE zMG8)#aX*Bvu2DmlwZ}Tl(l;Zq*mNLMZ{b+SNvTc>BRSHkVzyh4Dcv39lATIyiIyOj zWJhyK5v{^pveS@T!bc&mZtrZjT9Fxti^-&L#Z=te9chNKH=NQRt)QGF=Di-(fp91c zBX*^@{=rsODk@akN=1dMVI`0HO8UgRE{pX2%SdB1s9cB%ybkRt1xiz_vL` zkPLLAgw;nd^7gik5-MddN|y`zR&>7$+q_ii{{y7aNhuO94VR05=pgCKjPw zaDMOS@Yf!<=vF7E}s|U6(S{=~w}b40Ky{`GshL@?^-tzg}}uEW9XpcI2sR z&WiaLO*k_0RP2~Vx+Yw+37d~&{GzCe${XD3(o3iAaT zhR+3;&-f{PrrT%y0zMasJ_Fy4WIFVTYWInP`y+ggI!d*YgMrUD2%qf_Z3?p>`@GM{ z0L1NRpQu%yDi9UL&JZXE(Afgz0-7bz6hN~DnhI#HKz=~y3p5ST1p@IyU4uX~0o4nX z2dGw{Ie@AJng=K(&_X~QE`3I@zP_&heE;&=#kF;fwf=_X)r*U3{em@${k`j&x|`dY z+PnN+QGZ9Y>oOQw>1>KMw?%sWv9^f6x38zQsX5~B?t%6Co)|8%^+(n>HOD$O%=F_V z3D4pAdt>b#9XyJM{pc2BSu_d>T^sz-)oZYa*6WY9ilo?v?ufswX>G*c)WItSH-ID3 zsD}G8FmSdy&Ez($n1??TLY8^#&2!($fxNKaK=~B8nvU ztZVO$_}javEsFg+?ywX)BvWOyuLlH4@?1pNyNz`5mcT=kbu?{2)LK$EHY>2%%ak;8 z4_A_lLgC${D3+S0?rz*e$s9HLJ0qRZ9bYVr|TZ&WS0)?kqUrA8S)(XATVzD~JD8S*u3h8tv<9@uTxc zdU~QglI@oE-fjfSD8Sy?&=?|=aC}n2pdwv{Nk^;1CnP`kxld*u07*VE z3*$svp24UlSKM^T@Wxk+PW*DAm1Iu+0Avv7U(8svk8qe2_b=j7aMZ%LkKF!aNe)1!D)S0J*W%|hIF+gl zLA6{=A>|roJ*Yi=tIPd=#eE5Ul-0TSJDD&93?yLCxU>!mil!ovM8U|-WVTF}NhSmW zY9VaFAedm7VW}96A=WU)t+nc{ORa5PT9AxXVH{QnHDiklw^h3|S7DFb)eI;>LdtE|KTQ8uZm4+|8PR*k##phezhG1U{L2 zwnAB*oGQprPA+8VBKTz4FkLcqGklz-irbhCBE9lb(S2-3JzMiOe82RMy1k~{jUj4k=+k4v1m zc~^Y=mYD1O23KNi_tvcLZCRUlCEh9Cx_`t;Tf27;B0tb#vKKVqAOy@v{7v}(8TxlV zBmKV5NPpln(jWYc^oJCE*AC9B>+^cneKI)MyvVGp?C#lnfdXx4&ne9K_*M?f%s3a2 z_p$eg3LOE@#uf{!T!KlEh955DUqKNHpi zpG?6GCXCieCB?T)-*@5b1#N*rJEbzTsiqmToaW0`b~LMLjG;i7maJaVwmcQQVcF6& z(CU?GFif(FXQU#UF^JW}`QEUYUvqjTCw?p2*2b4`Drk-7=X)owH3$Er<8zAL79WBL z^IjPIz*=YBs!&_vGR{+5s#KIAy|{q!1GT0yhKZ&>O=^l@&Z=5Aa8ZQFa89eE(WVu^ zJ0nyS%-PcPypQw0&+Td*yVFSgF8KbR&auR}vH_v9uGXC>0pgj-QWXQhz;sy-u`=>= zij}$3#L75OxLrPU1`Ys6R^9fIl^zO)(Ty-DqGdmd@&IayJl|RP{MWQtm)zGN6>*$Y z%(2@wmw|8(ox=eIeMLBSMLOa*sd4~uySTGL_vgdi-?6Bkmq3F!LhN@I0q^0*d^yFm zM*-q?eHl->-~IIdFIjvz-qI0AiVshN?`{0j`LJudU6b*oJN3b{v0t^ zz`TK9Iv)-yQg{#^eKn;0_t|n#FK94!k!9?53iQd5l8aj zeD+2B()o-5)Uv?Ud`qj(;=^H+jyRG}34A;7OXo8dP`B%BJn2q*@V%c~d`?#dMI6be z6h6p)X5f&)B#V)1!Z@ga`n!}@p#zjQw10d>33_=MX%?aRkme8#vXlsJ+P z8}xnnrSmx!Q0toGhriiaXYq+BKEx4x#09}SGx8}Ae8e0UzS4>3UTX3AisC~Y$%pNk zpV##Ckb}IO1ds7!@AhjfJ`X8A#F2d1o^QY}oezowe9pj=?q`3z>WdbicN8DuNIq=O zU&Sw-&+&j-LcT9v-L%T$WJeU$4(Gb3l&v%An+%P3aZM4BaV}bUjVmjq6{{s7VrACMfJF%B94>l zBtbP_QH{vG(l$mNP*lWmQk^WQPE}N69=Zqvh0fO$76Tk{oK&1lx?S}QgnQ__|Gn9w zTB@js11j4gA}UqoOH^r1*k^rr?ow3NB`3=Yo>!$vXyX76I&ij$dz=D@^Q-qoQHS=} zy#l8RPkwKH@cRkqC~Al^ey3vh8jQ43Uj zJU%`Hz8kLI@~*|FSW#J*W`a&WwmwK|w~ON&-S3}x!Z!Np>lDOs*5DLCtTA)z{qx?k z^8QT~7jc|aX9_AESJU6eqKWBx|COR5j+5#vLB)}iZtaOLJZVw=O;HiYNmT@h+r@E` z?yQZk-DFWsWCMaDj+2UC6Uz#4S^g(Ku&C-36>*$Y{6@Q7oaxXFbPS^Qb-wgv1>#89 z!-@}aoqVPO;&$m4_2BE5g*6SXyDKWKryrIN~^|_|>vf`0rnM_;HJBxuPPDlZsye%S!SEU-<-$SI2daq9Trjy{I4n zr10UF!tENv0Jw>7mu%29nD;3v;$#`4M(b-3rX?u30D>H!kjzi9$(AOrk9ChEm?O>@ zQcOOe^sUAn1d6GxGqg zytJ*oyi^{cm6xhBG>CP!YMW})f)QV+CKQQ=V3H80WJGG)SYE2m$>3Q*bcjsys0>#W zmaH>LAt>ti*VjQJxz2|(qViJnsI0tHos~&?ncwnKlQIzY)rTvBf$G|7Cf7!%PQuDd zSFUB+aUDXOYFLyJUtOp&^3@uyIVvjZEIIsh;!AvYh0 zRMy8T{Xw5PFq7F@g2EDKX1cgoJV^EmixdK=k?P8*KT;)2NFAerprgE0AEcF+%5xf! zo0Q>*FB%Be)S)FnhSh$grs8h1BIU`RNhneqs*l!GilWt=bwaH(vGl}-e36EIHSJGnyN@mb+A^JEzj4=OT_^jZnv;ZaKwhHU^-nS1OL%WMxY-!flRrtd-OdJpC zP;~l~PL+aaY3iWPOj{u0tMo?#^;MMtQi@YLS#x5$#!iZ(I$Wq|zs#gPFXpepnRd9= zr_Sx1X$t!4>uZ9wfsp8~_VzDM^lYtB9_pEV!*xE`uMAX!ds?5S)j2=ls4< zb=V(6cV%wWUX+f>8YIkvJ1fqJFI*Li*3?$X!9^Yps_d)tJn%tX@I()B+hYy*BEdQs z%7g_;#A+ScAwnKhvo+w*4n(X<9NU?(hGM?@>Z(vMTwgD9s*du6?N1Oa#VCcCY(t&8 zFC|BtMtvr)MX%d%$LmusYhhrXgR}mX9WBfCc9pp+W?9Lt_Qfh=(Q0-tHLMkvm&&a# zHDJjMN%N5uQO~f^#dBQsxj?Ai6jSy_6-`VXvj@c~drX~5(n6=on#!0KJ}0B2lBhlu z48u@vRU{OS1Z}yHXG^xGp--1spF%#~F5uoMn?Xt{hQ{D1CQB@ZWO(Hsgn?aHrVWHD zed&9)j?RT4B^<1%i9{o{8Z~7v*NG1E#IPwG^+!$4wmn`aYRDIY)!+z>GHT8nY z+^{cDABeL3YFx*jumd^fs|wWx>M`PLT-`nGANgQ~uePcx2(!SpN|SrS9AL{!)v%5v&Ub!d1iNqbNfGe3U9`YbxrrS8Rl$A_ciV_s~#tJnh~c->aX-gaLqCpLWySFYL>;X z%7-kaZCzn&SLGJp?yA~YxEAB(IvM*cyW!_^X3U%g8A{U~?HGGVftb6!$P5 z!HQ*_m~v*mhjD>gvMLlDTIB16bfbn{2hXD^cs?WFZ(mFkH;UhRSU%WYCVAyWK-dht zw-s(S-ZSBi1$?wxBx#0V4F;5ERxMd5MNCR6%ifImi@WAK9;sy?uiG75lm{!#F_0IUO!wt;Hq z!?vZsc$mKL0`Gw0H&pt#NFAMP80GlU4TZ;cx)3-&QFuee8wB1Tfpdmh-3^6z3GnKH z^OV9Hs=ZtTysg0Tvje~lg-7!;wZM5jPvY^Ps1Mr~2}6#@Zw)Ki<}%5Jvx$B+4bPW$ z|A=@u4ioRTVdC90OuYMtfyeTHGz~BPo&z-p{s-`$8!ron<;3#C82Wk1tzUs8%>L)? z>s=;w3Ve3KbsCg_o_l}3+n?L$_6rfJWL>_yE;qR-+g+EF_vjbrC%=-N_vra$+u|de z7Zq*0c;WW4kK?0~JMpp|FG+tvQ5Z%x;03dW?#_Iul6{&@m@+2wDVZV_%O(dPtI{)= z7||?*PohU!SqqmIHq4h|DaodMCDW1&9f6IA-p>5qaDm_?D7fLx4pJbtde|mCLV%c^ z%OmXFu-giuEUhnHn%Qe=U4Z163W5*Pcz}vhSQ6>=z%U7P|5EYq4oHcSAR8 za)N1Nk{j9vh0Nw(n$up%pJ*r;*W|xO3r&n!EymBex~Rd_ds&qUIojy zU=7(t^WIFlibA{d9^IAq=vFs494!8z=!5Q$1?Sg#22YD!}C`isbRQ6Fve&R%k zGL?PMF)}f(EHtndi9FDo5ShF3Q1`aN!RW!fo~4lfYQ8ubIv{e#(*ut5LOknVYqdom zv)!h(S}51=KI~15_%RP~o^F~qZ{FYEOFpx0-zn~AlJg3Bv!uD1+}^BSPhYmL=(+C0 zu1#5kS>1=T5?O;D)E2u@C}$_AEqS<1@|MXlPXhx2l~3TG6sRnM&ttG@orPb4c%CU> z+?$lXPmvSto=uKM{E%Rolp>>&=QzM6PjZ)>xT7z9@CbWZ{IA_qc%<;?|0UZ;G9hFu z6Y_8HaaJa)Fq8{%H;*he7}v4P%IN&28(2cM^SVq^vLm~9+9FVlfW?nqm$bB$8XIaw zbIMp5F#DmjOce3%9ec>%N`62!Ld`pm$_4oKHW$`!YIq30bn7GaZAU!;-`hxo+xPQ)t@akz*cb z`>8o#nmN@uDog5xPhthxx7L?=fK#Je6Na}&3~wT17~zGU@yw-nHsY1TUktuTYAVtj z1`Dja^8zC=rY}5AeQ_uo8O=5Iv1{8psrh7FGKTZvtJQIlBWxgDm<&&|=c+^u+cPn2 zBUj;RR30Cm3Dxk)uulx@K@lEN;g-61)E&deBDje|{v_I^Viz?>`NrZm^c}K=xt+_J zFrp+&ZbuRtl6BJr*Aj3|hG&9LO5Alm5grub5fyHWyDp#M$01n89VlCvyXl@q;!B9M zWH)0-9A!^S*8v*)xECOYxd0m3O?)w>!8St|eDRB-Quz_u6Uv1ZhONp9L*AAN`1oo| z46eM*9=yIOj=F?thP=&xLmYedHNExM;tzYD9DvYp|6K?0+&`-CJChiHa`25Fg5Tsc z-staPpomP`ba?amJ7OT5o5gZfQ{k!*P_3zp9vyXro&ihdh|Bqog_x2ouchAFo zzHt|yE0O}VqIYwGSbHAkQzoP96Hdf8UDJKl1x8=r5x|qLB)9eUy+e#!_wgyxva{zP z{KQ>^##cYBLF@0&>ARJSZSXA+cpKo8v0ZD1 zYW?+>EV=BmCA>G05GF2w54X2mJO}^c<9}msyZmn)Bz!MSU{n&!LH0lard9lcK>~R; zKZ>n<>0NlF_sRiT0uu-*{*Z#M4DU@G;uPm4c;$V|{W+?g+*JI=tc6GNZlJ)+em8`e zlc9lR?(NA5Bui#LZd!z+)rB1NfFqmw_je@6h~SbRihkBKP4u7=(UWJQ&!qITCZ7lo zitvaExAiklVP8wapt9;`$>>0`;ErVIkc_6cpeuPWDRLA>M#?_OyS@@roaDkI$twqF zS>v0`;le{wh`M-d&#q2yGH<^}z9&nW)Uw=b<0E}#&ululKO4{aNnzvysV_-3m6RQy zIHNCg5cVPtXnPTu--QlbYRrLrxG-uhO11mhDamttK1}>te8%ua9h1y!&BBI(uoRuc z1c_93@5~;I9?I*voT0Gn)`TJ?pK+h?VCQ_f6UJ8uOf*CUcR6? z7pM|0_+hIH5zG-5xx;0ptkz9WG+LblHYzZBa1`Q)M;djOK2D;gZz6mN{0f91frMGp zBtJsrXxeI0bifxE6ik_npBK4EC(HRvg<}XDhS2VScFvYC z24E>N$+-NFy!W;hSFNIwmLcqdU}FUpH-j|eF=>KeoIekxLwuPcvvl;Y(~OMNw#r!C zE>2LHyP46En2u{?-m0O?Poo+Ks1!{l)l}D?7Ftw~D5`O3RO1B|XZb9Rr;4Am^}%Np z)%Y~3V+9qzw%qgl^;H`&^eJTHb>%rWjjBLUak@pSA8n6g>qS%jS$PTs6@raH9V8(3 zzB7Rw%yHxWf84R#;&Y;G5U>=)Ql+Ck1?f`D8J!1w*jAbMJAS-0Wbvs~RF)?F3y0*x zvC8eb1WzXU-Pg~6RG&^fjZo7`P5Sm+6awmYU4tia%eNeN$fCMdQ5A|@*r_Nm=yq|( zmaXmBHLt#CQE35WsU_boY{)$>OH}Qrci(@PY+C>u_p7*w;}lssNl_iZ}XqT2zM=)lh<;nrgv+Up(8Q%4Ktb<935HE_4j!OH*C_>({?+ zQB6`*#Boxc;-GrpR@J)ku43Qe~1P+#k_ z6{q+W)JSLQSd`H;L&xm$#F~^7WBFYW_?28bRPf5Y)_O-lw{&QrwH^9(%_OO_{s8qJ zICCtL(zs^z%D6ukGZi|jWa&6WPL3wE5$nJ`?T(FRj+6j}dbd>g*(4?GVJYZJhQd5^qocdYoBSw|jHL8>%t2{ExvWKpDZmR!cVAiWLQ7Q_%} zxwJtX$QgoIT`J9rvkjuss>w`EiV>e5cl<-)iio92@e;NKA?r5?F z(`TG}Ua7#QY{4ucTks)12fyGT1!uQF$9Jxij_3iN0J*gF~HlUU-Z^F(2Zr)3&By0LSGuDR_ckhO_aTfp@RM<=CC+Y}^a@_lL>v1>n7L z6n>nQyqk$%NWfwyfKcCA{WIYGM&YvFGVz-Mc&bjzOn8fdHyVqHOSzzc<0m&$emOV2 zMd1*SE>rt^4Dbhlw}8_@IIeRu#XA}BEx>tH;ql|22@i_~<3-?{#YG6*Q0XI^ISNN0 z;*lwR7X!Woct1S~KhB2V83wD{!6uby{Yyr+Lg=eR82nDa()CO(U*U%0cN@Zrf%7YcXO>G!duajQR4i)0 z#)U21Nc=LD^83{j*C3 ziSwCc-J0$LxwC2gIzD-J7XN*5wwwQsSNdt(sL6dSEC{i1|Gw^G7y?B7ixx{doNFBF zU(~9PHbO^~DeM89u)Gl(xB~~i(l+)0*#lxXgPm+zGe?`a&S6r$h>2evkJz&2H@raT z666fRV>1D|4DS+lx#?SH`ZmGG`BQ;$jS0KK^xX*`XLSX}b9k~b7YHqkY=#BUY$t9n zc$W#y@ZQU?aEB3SV^+u9_(?dODd_WW`td^al&fdD6Yd>okX4C8y&ZG6gIG*x`CmJZ znlnf;ruy} zote`R8~i=b`=z7|MIgEdy&eD7J=nP}r)%(Apz4^;@|UnLtc^@no1Hm(sZ zxg2NQ@9){#|EE9f?calVKYTX$m1FfgUvdE6y>L686^q|`X3z8e4U79LTBWabzZ)dU zt_x(k$LmB}Dem7*Vib&UI-fp?KRP)tcaA)%v&vwu3>(YxHp8U=+`UJ@1x4pxIJkG= zc76$Eb0%9VgFR!@$l2cpwDW}7K2$s2>hQ1gnAtJ>i)T|4+|%$u(1k~~v*E)jTt?Xv z$kS~*+cgd2!`YGesgd~cQj1oreUuQ2<*RCgRP)|vgrmb!ES5$X_=X={pah{QvY_;DE$hZc%WWqe;a-dCOD=uAxuQgP?Ti-3DvUs!h9fcPimoa*59g@jU4c76_>GDg>t(GMy^*Wit7}`|J4+Qk(#+8MKL^` zDY}f-#;Ec&4i$JZX(*CC@1y%<_2)||we0>AAYigv_k;{>ZC*~-SL8TR0KyUd{>A-; z7+1#k`&;`@Sh&3*rnT6igMI;Nkk$1iGc^~&CqF8-qR9|XC}-9Peq zU$7X%OaFpa3_mF&qErlru{d*GoeExZY-oT_ey%<>1sql>6x3v%O}#hs`I*@88`FC;pPz{h zza70d^ZA+B@RQPeGoPP{4Zpy>H}mtd6 zcMRu1nH$w<2$6#xn}9hr(iuu0c8C7V@-&jmouiI$L$jC&@~@jL4&>`(Ot4E`?s=cG ztysf|hF&ycD+o@S@GPFV9guvc>utzuUDZ49$R92nm<-_6xHhmeGytCg$ez7#ZR=ln zP>>E2{mm;6GPWErkgb!uAhP|D{~h=h2>D@IdeiYPeT(7aicS{DfgGKi)K)_7{h=I8 zs<$b@(XXu0LZcP&7Afkvdk+OXM_kd=)W2JPZ-$%vsGM^_`0gWFVmnTHt@*yKNLa5Z zHF3WnqdX?&|3l@x9OU1|&m%PW%UoWK_xtcG5NaW1xqJ=pvNZTEeVo#9nJmRIWl8Eu zEme4XC$B*0qyleY=Kr=92s(RsiR&wKUx{Mzl=o)gm@8NZ%IcWX! zoMmpwGnMoA1!r5gOz%IOF!T(@+nY?;#Tm0YXC}^28NJj<`7b_33k@5yW+pyL=FRWT(MoT#v0xkl9NB=a^~DsxWTl*E zhH{1|i?I$qIcHf8-{bfd7_0G=6l+aiAACQ=@2E%n4d zPOPc7l&|~nLuLyht2$QiT3{u{H3aV{Wy;9up!gAf9)km=OrYQNRl@faeg$Ic%Sq!= z2PxK5*Pv@LmUF(Y!7Tot*){0q|7l%=+5A7HYj6brd%Ffb{9ib~6`YNf4=zgHo^6@o z`Mn-zUh|RHJTtG0#61XPc8F@5hiJHo>M@$}l$F&1pDclm@W~SBHhtH@_Y?dIgf2T- z0=mypOX~6^9n1Ar3}*hHuZ-qimF&0PJso4M3vYB>yVFS-P5O@ILpaKU&~fKmIt{7T z07FAKxJXAxW?8*1jUuS*Qc6sPC8ad#nsIv!6}Qy5OG4tv^gyi0bWT|rHeyT7U8p-0 zvvT^1qM@uOq)~0V(;h*UkEhGTAt$>O4tImyE-#*RH`L9VYGLmcFb;pIoO2N3R3bMr zO?GgUz_~>6sNY?Dk;VD%3VJjd&EpqL!17b4o);qMhLX{oB7=?IDPKW0HPvy-Gn9-b zJ3ie%rgrvPR8tg{l+m=87(0vG#cfTxEm<#|XHjVdr%Kw=cJjb(XUTO5QnMvAskn&a ztaqMCT8d<+KK#{2D=ywTpp){K_7t+ltvao||NWCKDoSP33kZ- zVnsz9XHHKLR2SpPxN;x93!h;fS5i?8C0j{ubpLhzec!g?x<^rQE8H0u&xNESN0v|P z?7RD|xPGUoPBOeHRA`!@!q6a6xZ#mkp0lX_M^T-eM#Uwc+jTCV__aO$%p8mAu%h~c zphB>bLnPr+W9QV*l7^3-^WGU2AFra4YBudH;S>keq^8baSX3p7>XfuJdmU6iF4^#m zMOCG!ylGSu9aJ0c>%!3M0*r2{qMDdSbt*!we2shkI9spmR8*&?QJvV|w+5*UxybI)#NlPPTbtC2%hY@ z-~PwJORc!}Dyq{Zm96ifQbEO$f$rQ_pT(?CH4@`*ii$WAMk!J0Qd+u)`J5&AWG;=z6xCTKpI;8ir%3SOY=|g- zsBS)Fs+Ds6d&Sb8K)o%kg<(RBk2@jSIZJD1PdA2qlaab%pOv9 z7IL+zHrZ{`;Yw$hAG+T{q55!jZNL&(mIwCGWr=hu)9+gSmuY++nQ7!s@y41K3b>oE zQJygQ#Q~E;CLL&Yd0_|&ci7(>mvywSUTud6MuF9c!VcAiM74f^3pr^m$E^RSVf zEsp4dFxp{9t5*Bo4*BJ(wGfntfj!z}(~{{**ctVw3lPdqp?PfRyL(te-Utb#uLFcd(i77AD z2QAJ5byRgKJKZoeykZ0I!8l0J8l0i3t~JovFLgE8s7!h zT(h(tyHHAlvoqIg|8-B8L6v)nnSZX!!SO)GFQB_&%acqEmIMNLYAbS6`R1k+`>meamWrcZ`9s!hXBVUdEOOQ_aY z9jL6Yj8yoo64G0c(E2OH!5j^L^f|>P@;U|t66ub1f1`BPc_k8)_cu-u_cy2~kFy23 zjQ2Mj~W zgvXtRbBBS)a+xy>Jn~yN3_S9?B@>=)-VGF?Yw{`J?NGQbz%t#ZSqC`vZ-!OFA$lfx z-b(?$9ylK=JeHHd%MkB1n7rP?2`t=D@%|QJcLHY(C+Bd-<2Mw)CiI^b_|Xl;kL$;b z_l#_-7}B%3-w9s!dqzXW%X>yYIZC|8g5NKJvs>YD?LdAQ13oYLt9ZXW@B<@NpR7kmC_bGq@!u1p&E)@(AflEa#F3^~_}1XbLBJ!_rZC+eV*{QA!k1!Yy|Oku zU)flPxdxjVYAB{&-o9ShorVcPEH5_14dR%Z>1i2TnVL?tnJVIq3h$cLOX3W(Om++7 z%ii{7_%K41dJ3Cmt5?#VHZGN#=G294ZHuKdS{r@}UVQ?_wpS=y--bRKl)8auk%!~gJ|}G5M>8l-yOJUtnF>D)OHz=OS(b$kwyyqtIdLW@0H<7f3jjyl$N>ybYU4z?N~F|Eep zuytehj?l+OUk?NKk4)~^M^3ROeO?aTX;AC6NI)q9!GY9|Ux7Gm^}#05)J`#3 z;1Ddp_icqw3UY{dA*d>BXEV)GlMp}69-)r27QO<}4Qqst9j{vW*e$DsPj((sup>tV zjOmwLD&doyWAO0}N9krL&m|<@V)(-NvFk9eP8Y(fDT0x=c?VvLx865^fA<~1O^UcsDrY{cPT!GhV!g}Cq6tJWTyUFz32HzYJiUT?o z+x@2RG5BPA_^Aoo2A^yw5YjA^ z@;hwF&G^ZNA{sYCm0N`W>V8Jfy@d6$dx3T&o}=;ei2f#h|L>$0HZxL(({cms$#mF5 zw5YjXdg|!!X79ey|`;>jhnT6{PYK`3@Jr{z7Hb*(YJ20v zS1dj!v-QCdNAO`66#X!r58IgAHH8Rp&5^qj7N2>F4{-#abBV(-HJuM9sg{#clkQgK;YwUUn5L15gS2GQrxGCjn3DGlds2gIJ{3BY%zxgagg9C0nP zwO_sPxr0`k^%=924zbrD^XGQ4Rk77P^4(`ATT~<1B;lki2z@6hNP4LjBGj3}wLvo%7Vo3Ccjvw^)ntXi0xsa56HG3+am2crC8Fd@x`Liib!=u zCQEvp&S$ct7YM=VRJb}?8&U?_)~;z;wsOVF78sn8t0dFv7wvtu#Z8Mdpo|4-L($q= zWvX1KFSu3n->Gf3kEEV-KX%`EYvgDG=B!oGjx@cux zb)+IB4P@D3l*^{_QmnI}si&o5EzXxr!T?O+1*__-YW)6BC!`@UuJ%mIdS6{dZDnP! z8ut4VG@}ONfXcF*-B6Jqh5=#SuP#<^+fx=RGf@_>e5coD4l76~!kVDJCR}SjS{3cE| z?JmQP{B;QbOA1~ljY@9;Z#_Qf^EhFIB$iI3EUz#Gd1z;SMrsaz%j{)oaM9$ltaz_qSo-Q7Ui(E6e6G#aoH+8EJUFG;2Nq;B6cR9@kDkO~Zp#os{;%Il}KV;iZ)G zFHz11Qt(7Mr{JvszaOHKkLLszj^Fi6cvXNG0Vl5T__5D~=LP&u;QUnKaY7{UZ1XpO zM7`6p(w`I_=PsE}DnfuC0?sTp6u6<{y#Qg|M4VAt_sDSa9V0l>4a1-&%l)iHTk8$c} zbD7e|A>-O%;IZA`Fbq5<|NFzl``Iw?I4^!_71?MTXTRTFmN5Mxp=G4T>oQ+G$pt7t#NJ1 z_if&lI9#+Nd9X>Fw}K`U?E4*)ti9_{py&C-Yx|FZf(7>{JF~J7TN2tp#AUEp!yFNV zvWbO@`irpR`zf(Di_LD40FE!=Mz7^PJ5cL*i+ZU^g31G2 zO(^TrXR{*XXU%2_#|ty6tiV+|ftA@YLW58>|{eW)b(sS z0oJ{Gwr&_t)jhBran-2qkFpZpo~@lHBOs>InZ_eoadM9+%6#PJl-XJQH)K&JtGv*1 zF{SHpRt#v~uEQ?=FU+84MWjzOU6ch!dTy$D#386`RA0k8zbGDqd-M{<9#$-1+fCRT z@J$o2cTL#e;X7NvT==$1+A{dg60nd7!zEJ@qsQnlVYk7@nV!eE*M#ZQJ~a-ZeXed< zLMkS=*U6s%g7;@Qs4@wz5woxb& z>E1D=cisWmak=nIoug(g%Ff$-IfEN!mNn()^|Zj>yD)#&g}I%1vlhLR7%kdQZzzBN z2;rM`VSZ=MtVR10ZdV9c1$;RmUXl${%3kd}Ci!n=A6+@3=rz|o1W#jdjtm~x{nB9B zYw?_-rrpWc^B#SD*2Zj%)G%z<^d@ZDx$&OEcZBa1@6ZplF&8!v8*+=9-T`FR#{Br$ z&V6~04!U0hyIC6x2r4M*JYaze2`Vh=JZOPVCg|j%&O;W+OOUsybHD;kB4|=k z=Mf7u4Jq0VqfR(vVlY{2w-vtwr5}vuzQDZFnS=bXYD62zbDPIU|gk@FHuX4))8^f z*7*6-*3Juk8(mw*Rfx~tOYY~&cEmkbZy59@MsIOl;EkWWd276|u_5_a^KcnowHKOk z#}|gDnit7$*uw4n?)XIKt2TZ7X3xeOl-#7>B&Q~?t??7PpMDc3!G`_zp5%bA!C_A(h*K@O}kwwdtF z(Xln?ygBq#h+?DgfV{1r9Dx1L3C>t?&6@~pU00VGda7gl4&_{|P`ZDy7q#qe+O#%# zV-DtJG%ectg=;uB!;yF5NN0^{De1Osgg3RiIdR*C7BVOK!j}B=$0bhOyemF_OU!kC zgDWw%duvwrwk)*RcZ#>}A92#w?%jhxjfKk+M>hSeQ8%1L7fXAkUlmh9!SQ93-AS#; zxpN}8NGCL=iP<=xT6D2!-hvCaX=Kr|Fl90FYa@%c)PzOh`!aqWW4;Od9efw!S77`N z&jt8-j6pmlm+>f?auFKZ5N~PY?yQ<|Wt>h~NNo^l;XJG5vNiais7acw)1_+apqek; zfX1g*<-+YlHz6-lC-ZrZnQAuJ#rSFUAdOm&l#;46`a)9Pj6CE(BiEO}mIS z*=5`EuKyE|641?eBsspUF(>bO8ehTeZ_|vF1hd^{Ze3!qWKZcT=d?Dj=MN~i?w^Y; z0V`lP$R05eYyILi>=9c+0}r_3qjz3=05RducpxhwXPLTm&^GhCuYk2)ARSalABF~U z_?F1b!J2`b z8apzMw0t=!YO8PFz?{}5X5r=ir>5e}OnyUTGdj>9adzQTH+v4S6NvT*Ib(jhf86XP z1R*klTmYpqDz#>YKFN6n zd|V=Wj8*W>6L_z|mk==a1qu5Az77HVy9qlE<=8G@C&4H2n&De5V9QO|ci~$pU=P73 z)50@l`DuF{KJF2EjCbIZshY#P3Txw-0cTivirMv-yqC1c&2_4ra9^@IfQfvEQCZtu z6PW|64MIw>dBy6)+E($_(Y~62p#^iBJIwh!Ar*7{86b|ixkeMajLq$dIL>zr+@FE4 z-khzV-*_VEaU; zFdN-~jyTTP*#RwKn76L@uca2%6h%cGCl$-VqIz%KY0E6Cn4%&MsB9a*9CF+)9(i!c z`S8mB`X8$XHz+Elh{RTd%#kG?Gj-#{x2?Forl^SHOd;EdCA{?bEq&jxs9sQ1#BoxM z5ma70>56`}4h_OAL**fklWHs=ZWlKa=mt;E+ip>56Jf-0QlWZ4g=Qq&%MI^hnycf| zroD*cq+-drT>(jCy!4H$AGD}`p~#8jq~btj38ZZrc?~2%bX)_TLGQ%!Rt5RN#YveojjfVf>eaG@JHVc9;bmX|3irHI5v#SLw@i$g18SnzU7(4yL) zs4M}MZzu>*Q(~V0h}%_#Cwuj~W3T_7#pgSUYJ%Za`S_{HM??BeNGfNRgWKih6TirR zobR_d|3y(LaTMF(&hf-|h&&yaCPu<>2-^mDGR;rj{nSeqXAePeg=U(MR}e!$>?MB! z@Z2tbusIT)cwoe>7N6;gN{XW(*a!^Chlg)&7mtS6W19~Ac8SGjk)k?L#%}AU-1C)6 z2jDRp7rlphfNm}86cuqK>``azHa;f{KBtfg+^O!HF48o(q@$>a<7{>8eQuWzPv*Vp z2NW7c2826?AUI2X$tenwUWVv|;KO65iKLkRjcpd63lx=7Ut&u$Q!ACHz+R(>oh2qgAcB`Tyj+2V%vPPT3ci&|j0scc#5ywe&s-R+TrCZW6 zA0H$g*FHr>94FOjfVf?n>hAkK`MpIojvpmB;y9@$0Rl6041`wlV7Kii$W+sxts_yEu~5-F^EEeByLm z`XU{1oK#Z)al81{p!?yaFRZet4ym|^U2wsidjOp-qs3)Fy@JW|n7%M6s4 z$~Ap?sXSI;f+)|T<#RCM49MFlYHwI45qDH;!;$(xWra^}DMPxgk(W{{Doin{dS577 z6OPr@SK4uA1!~jr>MA4EkvhKF5V`^$Mc-Nu!Qozp7+e|FW}HwVAt9s`pu40c}~za7CA_YSHaPHs6$X zJtTrd`jb5&y$6UCHm+Z?#-D(B!H!gkIY)?)4Ff6{XB{}ROi2cDtso*>nMxg8{V`uOT3H#csI0Sd=H8!VCU*bK zsO0#g$|ly)zN}*T@(vtjrQ{6-mmWArnjKYjQxV5e?$Wh7hrvo;q$U!s4@N>hbIqPQ zWa@ECwwV&Mah_M@uZYFi9o53!F%53qUam2ub5y=cgiu z>isp=NYf0>rD+n9n+_;Q zO)KPG>pVUcdCF59@uxm4eJGuv%$ACb4v2_gQ4y8-ng4gKz0Y{h32EvB{r`SDpL4SA z-ru$My!LqZo_S$QUu)+@6VDCW&767l4f7k$YdCL#-M&`-oO9mX`R6gcYNDd}ZdH^I zD*u|#&+k%{|MwVa;M?(-Quge5LGkI&eJ3csF+SsbTaV`F4 zk-qkpVtb^gyV$<5*jN(^sfr2AB|^zmHk%`0w7sj{0~k@`@uo~uERi8#qP>{!>uC+O zwe_|4_uEBA)nqc8%ZH;;LN4CW(wl_Ged}AgVk?%|p)oa_$)&VxG^s96q?<#F!p-Xj zx{8JVmUX>d?RIQj&E}&``D9a!v5?i=582JFh*n=umlK>zB%(Pjo;3vb7B;qbHFxy% zt!r_lfu?37sc0shNf_W(PBE5UmSib4lFX!XT2tD9cl5QaYhOLk(b3-5+`lLhwg)Dq z=A!Ae7L95~$VX;qQnf@hoJ`1+j%_TqclQ^1y89Ow`wHD_%9623P36MrR3aPl;6TFK zgOpbD2u>!Sh!cmce1wYdWOaWTOIA%po3y56C@Ve5Q-a1hJq1r;eHl|ujfcXBdsCB< zR+L{z)8>w@f&NbS+{>$}P%a!rgiJ15hBWu~^>h>*B_tA7TVq{geY^#r zw#NEmPh)*oPYbA?-uCV_U3GIC=e2cp8Py;XQN!_smdj+#Jhc~r=DwcQ1O3JB_I{Ho zs>XAfcqW__OjIHrOzr)1MNmzqm>Q2I@{y)I$IThYbuDY#8|!5fff(rPGg;$m49OqO z$HQ*%Ywc=p=@TsN-9;8+Wlh90(Nr?z%E@WlSf4}MAl=A&lQW?vGWl3OD@waFynXE` zEbZ$N=4hm`9+j)HeuK%IQngSbm(-wKTr#A;9ii-p#%V259#Q=?Su<)hk!nih5>YqS zjzTv$TEIR~D7LIdL8$LFc%uFwo2 zv+^b*S|}AyxTcgDUDhTPW0N(ZBAN23RNC;?TKr7bd^{?X%H++c@kl6_Z*onj_HGfy z{>~Pv{z&42!5Pb=P-uyKB4M!V*%({gSl`!vSp%u*O4bPJ^FXoGT|~ ztqe!Q|o=p*k8dy+9`k(VfYJDM!{&~<7y-q$;6`ZoVu*3 zxk+2pyrIxtH@CTeps%B))zQo*)nqmkPGyoQb^ThAQp*XwSb)K8%d2o!)lynC($th! z8RygxLL)ZT7ob(_oXEkr2Bn)s$t54WI1$*ko()c36rrYEJP!3R5-${JKa`TS%M%Hy z@oXd>j-h>Z<)wm&Lflp8UEM?F*~T10*#v8v)Zs`TqZ5ECvAR$+ihd-f=AqD%2@U#T zB-V8;{c9bpnwkhfw?t5FTv_|t*Pw!sa@)X(WqO)a)6tlQ&e&Uc+FxwxZbNKMPIM}g z)G>@@-2Fs;LYj%*(u*ELQcg{Vv*}1U z7x5HSM+~(lXLB=E6jjZ(uZi{yps`Vv=4SL{y3~2K_3gD5W7;q1m}j#movG_=*($KY zuq$5SvRKv-C~c?|Hw5w$iptwXs!%&XZ+2XyN+&n5@t)R!em4h{-iWTb#Aw0p9l5ht z`5s5}0++Zsj9FZ`s=bV}seMxx1D!H^dwtQXN)aO#**=zWEJDAe(AVCUlx5avP|E`) zV#z^s4U}+qi;i$9XVRbm+|n)yl~(B3;U|;Z&ALa1k*I_4lG1z6iax9(zCy1SO7# zQwGU~*m$^lds?0|hHvDQMv6Pr)Br3g6uX?!?Cja#mOsl|3Prd4G3}QW*0uKx6zvfZ zqPU_tyLZA#6qka#qh4Sf9Yevntk6%rW8vQ-*>(%3NLNcgRqVRC!gXo4-nN&y>m5D< z3rD@jhpt8@mW(x}k`c3+untDd24+bbql5y+d)zao&hC;dwnrx(3>f z)Idv}#UxWAkC`L4=C+>(qU)g)FiWrwwa3~r)uO?SC1SCB+}ig_w5(f)(I?bpFM1Lv zt6;?J0D5hp=IX6lEn4YVJQ>gCQXcu>*@v1F4ypNMBoRxb!rUT8DNx*uE+#5ZFK(K- z9leBp(j)WHl3X0rMF?nFO37+lRzH!5(#fIF;INERsa(TYT^vlw{>5lAyi|lEbW$xE zzF0~Cij>3JTK+?AExqXf8iOFpX5CLY)mf*7;^AC2*`y{D+$k}#32B{slvT3um*5w3au}@vg#}P6WjjjgEO3GlXGv#p<4ojrDc&Ya8pSDq<$I3*!J= zND?%cl8$FFR$JP=w!3Eoy4*(Sxr=MZXVh#c5l!TfF43gdsI1L}F{@&-rzw=B&S@Ve zb}%zsKZ@{Sx)1Xgn6Jj9kEeeHnnNxduA+8^bSbtw#%v;H)zzY$9>B zDXVFbGzOsM{@QrkT8gOdmdT!orsiU~WF)S+`P<$-03F30c-?o4w@EdeO6GIfIP#?| zx|pu%+k`nPk-GJ*Exj$Pje-h&qD50tEsY5^t2(#%7e&Ii7P$~FF!-`+Dwd7s67i%_ zxR!Uex7+8;(FKo36WN$%me&N$uF1lbSelGBhX;y9bOV^q=ava#(Z&#xR??d+^i?Lk zxC@G-PheJ<)|Z&%dzehZlcY5c%k|ECU5Dtoo4*&Zh5mb9?dtZH2D5i>+PBtrED%_7 zHSFhhutekc{0>atTioe45JGK6u`JSBO!aK)r>cvJ){UR&-&z!u9TF|{L%ElusBzQ9 zSlfAv#@3xf8`~Ya6lzv?6glDTUfxgFIc4`;#LH-rbypcCsl*oKW0`C?nTe{=4eR1G zVQX&^)KP)&+=GHk*uO^XZHV zO;2k}&>qozGK48bdxIRt`cf(q31u|YA4_Q$qcpqsn37G0QSuQEq41D`5vo#!u0pYZ zX<(b4)SxHh=}06Kw}zp&z+u45zXOh%p9^88tSO?_HO|9|0#vZ*U(hsbV?BC#11()V z>NRR&IH@+J^669FJK~G_Ru-$*8$VBA+SNSCx4&BUX~*M!>N*@}@-c@asYJ&oj2P5G4CwqadMZ@~?M zwF+b)8UsuCY>9&=CYHx6M_w(WABo~X-AM-`m(9fxmYmwgMRq~CN0^~bha#~sA}WgY zoMy42WRsLrn?iB){V+?eqfk(=?&LtFv+;Bjl{y_Y&kdE!rV?1QOBkp*Sahs_ zm`(&F1`EWZNSC$u(Ws z#7yt)X=*wgNou4j4KQjLOA8vv&NJKI@6p%6|F{&V+3aH+A+x^1= zZak0vCGs-b-rd8?0JQqn+S1J{TQm^4s=bdh!t@X^iAS&!7{V;S9wj}LExhhKK(me( z|Kya~c^&Q492!QX9d|QaCym$zxq|pdx_bKCX}$+j9u_v?7;RYxHCATLqwX?WIX_co zFFX1|KbE-~;~Ptuc;GN1qxZPU{Su9Emtn z!W^JLx>zE&3{YTaPHNep`oP6zNzt%b7;%6S6Tw{yot*FCjxs|n^IXJfpWY%HeUd`3 zGmm95ixBYDI)_D8_NgnfL4)mxdIS>;t6N&vvPd`!53G|+l215r5pn0?WOjGr87Z3_ z8AErtHC2ru>8Wb9aA#lC-hm~6PIt$}ojn6xZ5$1Il#NU>JRlnnA?BQyEmmTx%Vy=w zY51>CeG$%_+2YWcKdG^!i7p0l?W7`Z`Du-aRBh+wvB3ciSz28@&`P~ByCOo@5KS`1 zZV7#1VPorR_oc-sT1_;pk(dEpSHON5w^hg(CQfo;4gD)aYFEKSEH(yFFEt$tt7wAi zu^WNZEe-bi3u~|fjLiky2#yxODBLF*fu>}XAmM?+0oMoa4<+0e47 z3yWp$0oT+FbaFTz%Q^!yfGs?3!AW6BC!fJyhmdh{bW=uPwGj}iPg<} zWYEKew=L_jafUV>7)=Ly6k0TkekHm*;N<3zW{Z*FT`il4M})GT*7Mr?`Yhw!n5s2p z!--g)IXj_IFbr>B*F)o6IT6WnI$Mxs9WCbG1`N=1@lZ69N~g$A%U*^K>}MN5Cs76* z0{dwp-V7~P*tA#a;8Eg;XWwf3S-fW_?_pH7Gqd&Ck9AJ|b zUHYtscxGZKSTTJLKrdd#5(mnexmg7h35l>4!Lo3K;@Hv73wYF$%b5W7gp0u@nx@3w z3af`%%uR-)oSBy7!S*V#Va%RDCSyiTG-0MDg&h{0ut-c~TT5SG3-V+GMXT6@;?Tbi z`9nEt*@T3yik3=b!kGBrT{T@jYiOwyJF5`pUb%2;PGEEzo?^i?jp04bg_`BuI*TDA ztS@7lj8Qe0Yl@~Lv8b~ch|PSCQeXx)8b^OPsm0!>2CVJ}Zi%fv8RUP9@=uB99K zA&MLFgos46h%sO=gEJPvihC&Clt58%kEprliR**OnOAeEByC8^i9*y? z=M3FC8AjsN{Aw&HAb~ z*+Z1%Mfks;5CmB=~_8` z$F_R+RP0de?7^VPSnm+bG*yJjFvC`IV=1h?Oe9&_Bw8#a9}kBlrfldW?Pd3zD~AZg z;$F<0VfsYRQ*!}F=AGo^`A55zp8ZCj7)3&&^=`OnV-}je!n&5eO%kYkYa~LMgk99Fi%CYQd~3%v>HX}NcKY*q_}oAT+n$+xy0YQ_T9x7*B}GiPo)rr#IL<=r)U z(VtgmRtKs_roEiXmz7HtEG~{HhjKDV{N&)pXywNWV%tm)wNDo7D7saapZbJ$S<%KO z77HvxDTp027^}(^a7*1EWx3sg z=o72#WTOX8Ut1tMR5Hp=qlQ`Ruz=iOX7AXwq{GdGCV~8m3q%>eEd>oMlGKT$g5tEZ zCpWnD7&(DRJg1c<0i8~wAUSP0dG%`Dq~>~9iOFqnVoa3HB(OOp z6dRdS_7x4r9G2+Q_`)fLAu?@OpiZb9p7MB~b(yZwWPerPsKjMGh9SDKT|!Qj>s8)9 zZ%!4Fr^{uHWKLU=HhPHq)cJWybj0!~)GEF$;?Gj7lMoBACenm8CR%)m#M>I@+5TCP zVJv!~WyLOk%p5h-_cg{>IF4DUh#JdH|Z!g{pOPy6{?%+eJ{;Y(~J&(Jw&qyG?ZE0 z*RvK|@14ByWHdo#sVu7Wfy-M*7s?A?I5yF@Yo-WY%hg+oiR^kAbqxAI(-N2{MCCO6 zHW{(MrG-0R?HGs`tWzY|SCYx#qo+*Lnp84n$|G%hhM_qcFB*0>}Y+UDvOliFD7K-u~0ad zL(WEIyHVdOKFy<{DK#)X-CfA=wsw57WzHtXG&O>G(sVM0k1=}s__Lt~d)?v^p)(sk zqC1<8YgiJ;w@dPCH7W(RGK0C%d@dZ1VzQGzR273;8w6u(%pzdBdDIHAR}*B0h7VgJ z=mE2sB-%wxj;^-}%BitTQ#_x|VM)~tPeTOD|4v*sfe&S}VLL9P<1E9zco=EfQCOq* zKhe!9w8`YPy67tsBH`s{n}SJ1IoWO0RAHfz3ODVHZY(E~?)tf+JhsE9ys*cooN%8{+2R|gEa@7j z^nP=k^5zMC<)T)<@{O8N8p*jf0g*{<7W!&d~lh7$A>r3 z8V)O35(}zbAo@I0@&2%Vf5p|Kt;KO=f96$RnS};h_+X zQ!3y(j@_*OSFohX;36!Ae6r%lGnqNbm+`QpKML~^uqB$pO$g#1kN@P0a1${h8D1L%-BEmQxX%oPIAF#wpf0Xj{pLpnhrR|UMmQq9i zqf{OTDfF&j*_3`290PI-;BSKbt@F@tk(auS;1}`M?Zkgdaf+|`C-S}mp`*O?bLc76 zM7g4{SHgwD48Tz{OQv4|CDM%D%psX zbEcinYyPKFFc~4xZDg;;d!Oyd-NKRA8Asn~eEasS9nuDoL)l|I>a!b0y%`zJ&S;N$ z_=oqn59Q>DLs&~bg#Ch}UUoi&qbm+!7viCua&agN-~T*2%ny0i^nYy>c1YhkAL`D5 z|Ggtf#xQss%f$1cehF}B`)3bzW5pq?*61VVL)@Z!$eTCDFfTu*oqvbEP2>;{sTt$u zS#)^h0{aHraFNhx;7Hw$ic9MvrxoDLjT_h{n3{b&T`n zhq_-@S5#yEhH4BO{;?V`rrluR8`E+?_??)49MkbrV?Uf^jGwZN^}MUYISFMfXJv&C zw@fFdS&SD$;_SD1qg7k2{ z4Ik6#absS~ct=)n$9&S=VV$xxwndwz;GH|DQk#=2GPojMNp|C+CM zXd-@Wr#T+ZiNS}nZwCjF|0{iHgzwwNcslaf&&xcFkDK21O;Lw&1~gd5{3X`dkB|Pp z=o_vvo|BDx3&!~M*V}fI%ILP@{Uc6W8P$fqQJgFO79YmRvGu49%lhZrKqx~$s^cqwaCC+5_S>hxrw-ujy<;q4(Gv^>_+AfO3M_KT`V; zPuHt;{~UIn*SCVs)A&aH?Vt>w=jnaI-TVw!|Lu03k=Q&v+K+U-ZkOP1ckP?FBZu%k zul&GJ?CLgdo)ET&dpMTgMDo*5y+T8>{sUGMfW^%;ET+w#?oBv4@K@K5(WFlASKDrB+V}cx;{s z;N;Xx^*{JvQ~0TW((Lrna=d_tQ+fRKV+x{t1n+1rGq8Rk;;1v@ce0HJB zmx3eTK7rGL=$aBkgCKkKiz$#JuGaebFq}SK-yyQ2k(PSRwRZ0e#}WH@2FmroBBN*b z7MEz)`ULdtqOfpu1xyD~Ncm$*ft00IoG8WiBOfDbIX%RF#}E18(&&@5wXLV$(9zB& zUbnWl?53@3(4~d59hcUoLXZ~rqcPy^2q!%0Ir+bEND23JttXo3ZM!^j?$AyZvYgq$ z`Gsh`b-OPU1n0rHoJeHt1W4crZNEhDNgx*bEe~2jIAvq62ixBEOIb$EG*EgUz&KY4 zl|z10tYf%xk93iS6wWwH9YC1GuYblPZfQ`*5!8#O-aVkmxbzBywXHKiR%1LC_h07# zobppWpx_-U!glBfoJT%k%dR&7*K@!r#`Q=YF|ft)lh$K|Ew$DuWQ3D;DF5KSETfi- zu51qf?+ju(1KZNQvZc3>ZhfggA*S) zV0Hj?k?4X|q~=J7Vpso&&gd_WvAEpMt* zl-W2Ng3LL%zrMA&zFquMlztF3N9w=i|B2PW(IG)Ki*=U|f%uFArz+LqbLi|W9fbcR z_|z&zxgHN0Kb~N9e$_d>bfpkm@oO^PUj^oS7MxmLtDdvbj;jQ2zr^U=jO(-G=ECu@ zGMuV9!}q;_q9A(8?Z*mfv+&O=eCgv9Wd$BG6c4xXL6ou{m=8K}F7dqynD07qj`*Gk zc@F~fdne9CUghzMax5M)Ug0BobAic992Env^jje@B#(?*jr4P*^I5R}H#eN49GnB( zt-w8F@z*Pz{|L);PRDaupgfNX;zO8}tx}c&wjEBqwJYN2ufWmq@6d~9a6bmPOC^@#;pOipV76LtUjBYXVsx+F{CzW^DBlF` zYZP&qRyk z6u47?n|Ur?7UR|~kZO*O0!Q7Y)=}W7>vGj7ai16kj`YU2MuDSdcjqW@#{l<>QQ)W_ z@!}|O)HRq?i{XtpVh}Qu1|l$C<(c>!C5C}` zxs~S}>~m$fd|7`y58Mr-z+DF1A6;-5DxMp~4FXHkOVY{k`KPSwU*Fo>S3JdTJ1|ga zI|qjtkIp)?cv)o85(hSiD;-0b*y2-y&=AU>@w^{TNbyk*R*9a!a>?1td-~R{OcaXR z!0MGW53#bpuayb=e1l^`;(X=8qmtx-d_A=4ENPP6EDK32DregyZy4Gzli z)Zh`&m^%k%L`!hiwvkd%ZmU#$%5y{kKDc+m9=NGYoCmw3@dT6v-W1<}axvaVGKCk9 zn(03o>haJye>z1Pkb2vG#dieGDnv{%lYM?r+^-TW_5}4yM}obDjqP1QadLCexZN&z zT0v2lE({lX9WJ(}eVvmMO5ABORsst5fU+h;bh|7j4cT#NtOwiSVB=}%QB(+|an%!escOOIAgKB-oej3Ctu^=&+U^HkdQ>Yt$R%>&Y2>u!2zHuka|&%gUjIE5d6Uth z?b8h_zqEOmVG{{Rt5Zy?N@;bfX*F3|on%^7ORJMjt7D~A(6pK+t!A25CrYat(<&&f zjyA1o*lO#};)H#XSyVPc+mF&+El%^uX>ehbN_+8`(DtwmGZZ;%aG^$S15*YUrirN9 zau?pA?O(S6x9+Uk@*UXki`0_9=f8|sdRyj|(DqrNL;)tur|_$kdE@0>fvPP-pkLk< ztlDxdh^igGp4?aQ@-B5?;M%K)m4TkBTVpC{^3cl5 zFWW=&Hg$Lc3UxY3dsZl2k_ssA1ts+8R!~BZ{s*YJcmm4z@SeleOLz<3IS39>;5DdS z2DKlQkoN>AA@5C4q>BT}@u)U}I@6#oG^m_Gtv09ugSy_JK5tOpF{oVz^{_$x&Y;FY z=?Q<20VU#bx?y*&VYk4ba)xU^sJR^a6q=G+rj~)CE>uA20d*ErSA&|()ODal%s*8DOmruvRnj(BmxQx!Y? ztH$LCuP7VwkmOl-{G$EEy$8Xzz5-4j57O;uLEIP?#PxaYEq&A`^X+_nMRYpayAx?= zi;bhf+k!0s;kJ3)IcRIR74$}Cp=sWU6s3w*fiA?XJ=(T(P3`dh65e$OpjKk{mUgiN zl@C#_K`7_YOB(8Rh#V3W<Cf`NPVRZRXioVou*e@d#{EM&q0ER(~I6tuX;P-#9dwBP(>wvuxc@4Pd(cJ_mF6AA;9@0QY47q zm#`fTMn&0P0BRZAh47~3jew%zEjXyxy@>4yBkWd!61Y~w?g~(Z4JcO{b{jwm+%<+B zX{R)vfbt>3?&F{Y?sJCSji8cv0?OA6yKjRMxE~mHAe7zolIC*!7kMlwB%%^$J3WuF ze76{v(qIc&KW_HLFWv$mHq6jZ+6RKW=R<8+7sAD5u!&;fuh_0{m4JoZEhHADoJE-~ zM-TR(l&|Tkn|ltf`c`Z|L}3;sWa~Y}@v>l0kv2;%rE@19p$0_F#!r|69uYr5QT*1h zogP1JXk|@s>9XbM-Y(TUw`gimJ}ZEeo!fWE>i&={y{MI*h?Rb;m0pVub=3r;4X0FX zxe>}%D}`sFrWGfoOE)gy-$Og`PX=}9Ivy9GCc0IL=i7ixV~`NkN{?uzpFBsNLe_6f zMY8$`@upFCXO$kYcMRO69mn2FE(||PkBCrs`Ti_o8f`dx2`WX^mXG1b<_mmCuu$n| zvC;#v(w(DIQlUuTDs@p_|R>X`VEV# zi-FMK-M)s!$1+h_ikyh()HO_91wV?j7y7Efa>Tw^spSJ`-j7^3j(%6;_agkJ5y5rK zKtM#G6bXV;L-5*&wQ=FNJfO#Gt-FVJ?~87|?lVCoed})I#n$T%p1jaUt|vHM3HVt6 zhj*8n0)wyl5cGz%mBn)n+{c8J;oU>&t=Ad0ABSxzQmM7xI~3h^-SF-hLSp*-Nu4J; z1o1JHOVjQ2k8!Am5iSxaau9OU+hW&oP?M#H>3?Z>>HsT`BW!qpyU%nMP%N z^Ij_Iq02%mo6%*Wic^OtppeQMWU2>m=VbyrqjK2uPG(58y z=@>@0cXM0Z4{b?v1RDy)&Y*FXl5EI>a%tYF1zYJt)%Ldl^|u#;{ZOv0#r8IPlkW(L zF`&=Kqcog9M6PIrnZ%9^MO_RX3{~_vhV`PT-cvkkcq%o;+P*=uA%oU5clo%KA;uNiPAA9vY36`b( z;MBSUb@%9)fuqVR!96C=N#GMfq@L^zcmm3NyuZj)7;oX40rl@}w;XR#?5O<~93Z$I zq5ovQghxbAP!zq-u$>+~M;5ixB~L-R`U{uVc$JEEEo<9#Hyx{}%SC>O4qoXsYI!b@ z-8-m&+J+o`6Difl@*@w}KFH7Zk<)X11FtA*58uPzzyV1Vuf0>Yw;o z^~idL-#XIH^BqRctiat7^Qiq73XA@euckynRl`omCWIaeqJ_I%wm{1K>ZLTR=Ak>^JOOSW%xZQY+okXpcAcPv9SG%WdP#FX{)AN}E}y5pF!JpTbkYDJ9ekO*se(1P?0c zKbc?S5#bUPh3i*rr*~szis*weP8IP3V=~HqnNo%w<*w6?IwVdzD!kHes3M3T93v#Q zC{vGV(AG1DAEKghf*cE?gfIwJ6T~ded`oe{*tA5w+F>qE-aO;#b`Dk0B-`8Sq4sur zNHc_QYYeHc|F(L#;_dcu<=gGys<+!iYFysdJfx)^7Z2x&ihp)_#Xn(R1&!KB7w)U5 zmK68GtWC>on=Y8)5MzpfexE3QL0*|aNLP-BPXVP0l+gCafjXA$%trQ9!aNTRTK5DrB9Mn!c0p&M_-D{v|92HP}cnf*QfD-b~1|?kU4ObfW3D*oLA#aIc zcLk_%co1g1g}g0>>kWqMR}EKM#S-#<3`)qm)3AFI)G)$`FoP2E{${vVQ7gc%G(j$0 zX@XqHI~SCYH{Y;JgL;!WmVgo*9fs?*hAT~)3s;&n7xHcdCFFh0u=^1xO2dG1Cn&-3 zsNwo&!}T@8b+TWVcN8cgZ<=9u4ycz|-h5C(o@ThNHe9bTT(34k<}$a~$e!##h>i!5&%C?W4mP$Gq*hHKhzZ8lunKnZzk z4ZF>tXlx%)hCm5-(B z4K@d&y?<_Vuej9HOUTI1hTsmmlzR0*M@M^KbN`}5*bwLGux_BMSmv%-3$4mr{nC;AsAh&@@^=4#~)nG%heUgJy4e({~Ew+o4*AylO{RFvbW zx+i%G_4S4s)E-oAeG-|*Z3@3OH`2soX$o~u1{Q6L_!^og7mwe1k2##DX|d<`f~oY_ z;QOa3#S;e?QrALpAigXSL8W;5;6iGIl;Vto)6q?Rf5Qx7C~jz&L0yDm4|h&US^)Ec zgYU0YiWOV$sfxj(+90o~MWCqpyXHuJ%~yi1nWq$w)7N^BkZZlg0D^qh)+YyM=>sE7 zIX0n9O}aS~w5X4QqWTzQJ73j! zrK)X$QZ*0%=T7S7DG;%s6^t#$wi9`IZgBNLF{oEd@2V6m^au5u#Ifi_RpESn#!ObH z(aF@oZt_Aj^+mVqV%|kuT#e;58D=?mH!4q@fmKP|Ifb^K_1{p2(dhYYAJR~A`hER+ zk{bW5AJI@*@%uhxxaoxT0~IKGVA|=8=M$%#{w2``BW!?PFn%RSzFW5Gl8fI*6EVc~ ztM5$ute>~H;)g<|kql!L>&G>;JmU9JZj(9duKJryE-IyD7{k;ee$y+cj8m*1g^Y)t z-#1sfZ$7RP#hKzthDtUW!i*CK1@Le2f*i|cJDLvi`)G-I7O0AN>K-%hUzA)E%HmGp zH{*WMxv$5w@mZyYKzaRVLSO znFpU15ys}%B<4Di?Xe7f{q|=~E@(tHjIsH}xoPC-;$(cT$@MPDC34)Fr!+O?_mN)& z`C;<)pO{>{{R6g)!GC-bB;}OnDQOBbPgl*W{FIre&60~SBA-8R$RQhR*`WTs-**wWWuYNL#;lw6FlSvCO4wfRsA8;20x>UzS{qv4wCdbLkp@LTGZ`D!CYA z%TpSe`F)i8Wc;DC(|X>ZKPb5fV=oCbd*}C2UX!`z+=d2|i&lBa5XR0$Y2e3p3}Jrx zN$mlX>o}^qFodylkrO)gb(5k`1hkT$Sz$Tb+DfMK-LoImdGH~UlTeeY%g4A0G2ZvqYUB8=mwmXqwj4c+Yz}D{z;_aiS~ir&gro6 z`{t7a%=ae^Zq<44L965_jPp1$Gn@60lCd8XuIj4hYXWG=m| ze&y!J|7vnIN-oCO>KBF39_HCBXAR!egSm6%>YN$o%cY#zWnrc^(G2sKzkbdWvyCuc zBe@u33p0`fT-Gp~T>mM#7-K7$)ZUq8?A|-R^D#Yd6y*WQMHqW7pUYfS_Q*WC=JZ`A zS0zOihA<+RBhrR)mFx1HT1JS?h4vI97rze`n0sFz9sX(1OtIBcPHkC=QK>OgY{~ze zyt>v%vG+CY$dAB=GWZgKQ`awxT8?vx?xEeU$5v@#xJv)F*d)b&YC5m?)i!jm|UkyF2(?d zEkb&c0WESzZ!jn??72hpsD2+UT$0i%EO_+`X6`JLa?UHuodwLLw--nL>Dj&K8L{Y< zT#T{B0-XREcM!_8Csq8>a9 zG`YSgxfo;9hZI74m{pde(HqZ$2fy)YGt9fB9JMUWA?DJoOnR>7$*9(%1F~A|56Zs#%xE4^gVx!`1k3|GFejl~Kq^Ev->8HPF#^QJ>CxTem zN8(ZD(qnPlX{D7BBNnGiF2>km5o0br7L@WP*M*XcF*dCpXD;f4k$GzUQ@7~47^~xw zi!gSro`8+tN4s3B8;6Y$6VB=kV#G7^Mc7Wl?oaRVeDLa*!X=j$Pwn@k5B%L$rX}Zgt2p73>&|X zMi6AavhR#hB$Aa{Y(oB8;7DF>}%AiOh^gD<3qu9+q5$ zv2!hfjo+tpHTAY55_%erpF)xpg)rc<%q%U14SKmg@tMG@Cv1m&{9rR*axFz&2A8E* zxs16eD5S@-7ys|{PGdqrb zw;8X0lU#(cr^Y3)@%tzr$wbsTXj(lr?vz}Fv2(o#Hh$k_!~*luv>)AXat%u^!mx&% zt2eQfhU1lnBe87`8^)b05=spxT#dWiKsRkgba&))G5O#$aaOpzq#_zolMyYH!ewqM z=7}5Y8tcXPj*a!jp2m88gJfepuL3pJcl4-AD<3&;37a0Ox*8X!*3Onfca5u)h|64W zE>|bP<>Hf!ez{9?b7Ha9(%ps+Q6ru0t!ouC@>*OArL|;Ok32p$X{;Ato8Uh_H)*WL z_a=??;)9dMdR1v|F0AWq#;K?6x|qmVuHfVRh&T@PXVI-Vny#l+`h!C}Tl)&D+pVeH z+}z)e4UvW7CM>n}tS#U)WQz?&P`5Ai(+9Xc{WyKTr#r^mZrk+Ca(9zy=;|nokT};~ z7DT(9w&%F?lr{4#%_6L_)<9o8<$F#+pz_)zdp1QRDHZOj9h8A(;Kc3Oh2a z<`SV~Dx1v_()PiH0E*nSi!l5Ns|hU=&gPPN;Ed9`4jYT`oUT-mo{J>|TMV6|%N?!a%Uty;Hs%Y~B5^el z&qPy6SH;xI`@kFP#fnp7J(iq|@(~%s-Jc>waF(OBqUmusjLY(^+6lxtsO{RUmdpio95B4hM3{>{rZtkuuO)tWWs&RkUVbEjQSDzyq931;t)qoY0sQ!JQ6zt+4#g)5o zB&>JG&^LfaWR0Tgw3YH4*0L6cb80*kPN%h|CQ?Y=`+saLTo|{HClb+|hT8*mF76S^ zeL+reHXm)uC!1mncJ3Flfg=$$98YMuOqLa-2oEdw@_j_6hQ~#ixlBA0P6{USL9_@4 zld-kPU<&8eR45mYrV?fx987YRl!0kb*Zk*_onhGMUZg z!_g=)IW|App=mXbm}c^ccv%<8+!SSJ!8O^ra2mM~l0h;{w6R&r$)P2p;UsqoQK_7G zJ;1h`R6TYU`;7(X>g(4aco1NfL&p8$J%)4H8Sy^*W91c85H-)7VbIe867dp2dU$nWOP|onH0t zv#==x4;e3igK*mm%rg>4(7na)t!Re{ML+vNK1C%evtl z`8EJ~eZc)rVky2}=~8hfHk;!i#o=!Z4jEuRKAXj{JTHI03(V~n zoLf1V1~FJUR9=!eFMqp$dlQ(>vxL92>gVO}O~8Ct;=JNZ6I>4h^Gk{I@^=+*&jF*I z4FaYT5Buv#m#bj^SzwMnhfreC#w&bLVDb{@6~4)k(Je775HGj-LH=F^++QWO0>8cd zJ^fsqsDg*gNdD#}Mj+k&-3iB)z@1ntP$bXG-}8ZqTX1gWfbydan4%NsreA=$!HIL6 zGD+q6c3}29aW3-y2+ZqFoQu3^Se-o!4;dr9c%PoIzhW-11 ztD!YsmUyAQ^ zT5+}*xA-oEM>B!Dyj}n)yk7pEJ|E>74;e3iN$=)?DN39XU&ra26M?%%Vn`ktH$6`6 z!u6xT9SPjmMuDSZ_g`)}hkj9k`z>&%od*Jj;_H`XmuWj_`Kr#GBD$4Js!r(-)gu8 zfvI)kT=Z2InD;nw4!uG0HUe|K6XzoDtH6BEiF3$15%Tr}^MVuSB5&eCY?{ME#w)(0 zC*}d8IdLxXI)LeO;vC_l^#7>DkiTTy>PHIpUjXh|i6#Bwm2WQs^QOdk#e@7kf%Z07 zjGMpTh5PBiJtDCI{Pyzq@4!rK6au~crTm=*%mRrs^rS-%H3Jt0=07Bk7ko}`GLfZW31A{=q}W zOCIIhnZR7+#JR{@2~4LG=csQ~{yqrIrzOrSU7CTr5tw0%Jg@RMBZhK-hs;RvNC0!G z#CiGqKakN5%xc<^0#kv<%im7|bECw0`Ahom$G|)xabEr&1Kcyfykfzzzm9rII3M=C z9E*nx$@9XU1k9XK;4T0r`xZFLw-vy2z6FlDIDNp}EOC@BUg>uiFb6C+H@!ja`HK<* zl8syaeRUjeFaYjFQq(X<6ADW3)lM51N-*@bI^%%$&X=RCS}0@ z9)_oNJxm-EM zwX@(fsSKy8*6n4)O?smaxF(4;>ZMEhTMA5z#Elfb_e%`PC*xM`{{;K%fLp(WA<88D z^GcUzfO%2ky!@qda3uD6orH&sfpdw+g}`V|oI{_Ie(nI~DksiG-e-Zi$%%83w;Py8 zB+jdxo(PAhfO&HnM}yCV^-7n$%Q2S1L&k`&!(YnZKLRs;1;b37OFU|TsdeI9c7k% z1rAf=N|zhX(OA`m&$1aFc~M#CH>X{v%!gTq#w!q z6fj?R;#}nI1LmhroI@Vv$DbtzBpbKy;W(!ZS00Zl;NosLM?9!GSPIaxcD#MlM2g#eX3NMRsD_3X1{nS;MXT?Kir2bm#D%|RV zhm2P|C>^$~B7|u;9**?ehz9agtFY$SC2*95Ug>vBkD~lH9x`732I2NNFt0grF7^EQ zUc?y>883O%{)T|L*okwI*8|LZoj8Zy2twZHfVs_ybCLHbFu!r)9P%iCeOF>F0uLFZ z{dLseYPg*$F$}~@tuDX4i1Mwj42N>%$hW@&cL8wc_6cc|@y{#Yz6Q+qCC)3I$=`=0 zMo4ro_wR<|<7K$=a!>l6uhP|p;lEqC_aVWK?Z@%UMFE_Ge_rwU3@~4jIInn+zq=$x zNR;t#q~DY9_h-O;cfCLzHG;qI*?@it9x`73QvPlM=95mGOS$?UFh6$U9Oa7S{T!GV zoH!SG6E~vIfrpG&_$XcG0i!u_F7i5n>2u;7;Ujq;1?DCv&PCpCU>^!TzYEOm797iS z#FzYiLSo2IGH&e*;hrwTsVcSty;HZ8U5g-v$8bxT^H%i3xu#4T+@vZ4(*`$9R*FXt zZo)xV!>HpePrqboji9p>w zuRMk;2i^y(=(Y~uzSt*xN)Q)teTFK)zSu2vK;cmABl}|Cr;`fz#eRr4{{1)J!{V4> zx}2d_+qU#Nx)Q8(H+;YWw~vueL3s{w>8Eu_r02x1%+^1+-`qeW&eHNgsVY{wKUTtx zYKDMx=_w5dV9qQ%);w8yKnShd`TQ>sqSAz_TM~h-JFmG!qkCSG+m`#PPTm3soVIpr z*hjZE?G9Y;tGYGyriQ!aYOmLbenZmZK>uCReik6)X@k20+7RSj@Z$TnBaVo#N>`Kd zOCu^zuN9EEAc|0{_(9j&U6>wftI6Ysmd0%vD?~^UWTcKx@gD1fErPML?X}oKh`XSz=lW@=@ z-ZaVyC=cOH(3CNFGOwmE1!u14Dr?K5$P&G`^%}>JaafA9j zs8iXM4j>9L^#&**Wg?XDT(-kYp&fR*ISz!V2ZEw{K=JY`)89Q&nU2p>r@T1nsU!AJ z*jdpVSmm!3w+lT5#56oJ7`dGEhV^zov8k7ikMHm4Q@orD_|nAFaa~LQ+TiL!aa~KV zCkBTThIEX&m<}Mv)fE*8lDI+z#f@$RyOw^-8^UlwM$K8#(!HgJ>UL6<#Z^M-nxMQ{ zPgb5NRK~36Y+TWT5_Q(>XiZIY=v_k-xOf_+VQ{b3eCeKv5G@J-t<@~V6HuK z{L;;Q5F)7sMM-@j+fB#8KodUT?;S@a2ZsJpcTprS>q3fMzUmB=bw?CCs=BXSg;%Ie zD}~f#>DAH`q1z}RRhPb8b?MH(R9*feRpp9?(6L3_m_q86ejnEmnp`|;2kGL5P-Ss4 zsGp2KSb=}a2StrDl7*_8aor)(rnCfUNa-_sNlne*8@}S2!8axpR}a21u6Wtt8!nJ@Kwa>bWn@&1e67MFJdZXP?%Qa z)=wPVXvSF%Dd8$UP#19~K0lAs^Gr>jit94^MB${ONvR>?x_Q^|m);y6e63=``BHak zt-DGe`Tzim=D&CN*W2lamOa~j{Py#Eh~HcIy_Mc|JGpfx9;Z1H7Bs~WU~O|5C_f)k zzmlmm-ZXLK=ldaOTFuX&QeVQ<3cTs@^VKrTnKG(Uux@x;u3DsP)g5>9shqFu0_NIn zT6I}Ak;7`WgMy1DQ6}XLpAgpeqFjUWP_CkvG%ffq@<&jV3v1ZUdQHJQ8^b*qj;h-FS-5FcJD#4_KXLmdsJ*D^o!oO=B{GI@%D|Pa z(C>8zN{`_x+#on)uHmMDG%D1B&9Bi&rZ{c$Yq()fDOPWOjRw5M%FVA;;QzoZZSZ|H z>d^y1?GaU(1@KRt|h)g6I6 z1F5Ed6i+~j;QbM%zK!>XnffZ;JMrj-8W52tf}%8eFWb$Okdx(qnjbVVf}%!b8y-L3 z3`4SY<0f}A9O*7ZXenqnGP-Q?)s!eG(s)8Pp+190H*T^?>q0j7tq(;u$<#wZw3}=Z z3ci+NH}XKgMWxr?Qm#VxT-$ary2?rQITEFnaw=(K^bU>RbS+wxECmDwBpt;oO1(=J z1*oELdvV;Jw43gSf1O^tdc^BvoEIN?ph_%7=bmD0(B;lgER5d&QkBbMQ;t z7J36y^>}}gDGl#0Fh#ljd8Q~0|DCB%<2{!ty!hrD`cLK)ctm*-R3(0Yj_syTr&jAI zW#R$RYOR7T<%FfxLQF7XN~&7JCDjAfbq8d!G|BWDr2CernW=;DtMv`%LHEk zfky;FP!x!-v7LTiwz`<^zgy;VtMitcYk{P^qJWfM!et-mtmM#H`ETy5B9J+*g=%$+eaHqSLA0vS{jQI@8-8RbIRWfFx0Ce)NXsNBH zGg|7Z={mR=IlT%@*W!O0{f{>E%_;_}b{w2m8b?|MxChWH>ct=w%BA$vGzKA^uqcW$ zK%#m{R53c6gwBRgt&|lv4r{p74;?VqoB93<&-hv?{3n_E{cJqsK@n^tOAKz%t-*zE zH27(&sip22+*UM))#Ji=_X&wrF2Q;npXNy&9(S# z)Es%!?&Y{M?$SL+!9~=Z&7edrAw4Q;&J&;(;t43P;7whNfHEHbK{bG)`gf1Us183OjVDVfPVGg7@D+-O6@f0rh>Rz5z<;@ShvhUkwU3j`1D8 zXdOYBb(eO(>*kvvM70qVRh$3AcGIt%q+I#%yOhG-6L3w$(aMCUcr=#R2MpH&bs`>7 zmlGI|#ue)Ecn!ViaFd=5xY}I+>$nSB4({p3Rk1}}D@W*Hu~5Xp)VL^i>5}-_bLQJ_ zY2$t@s@Q3=1nI?xJGk=4zCl8ffdYgknFdNE;z^($#3Q;64={z7qS8y6yYOEmj-V)U z?q@q)r_en~dgU>%^?+Zq0U=0-=18Uef#)|3#_@ic;liwllJUj^LNKfkBDi z`y6r7{1lYlyJYbYGcV{niL1Y!7Z9PGO8fP~bD!CNmN`f@U)1OzsNHx1eA%L?l~Mfu z6Wgu8Thv|<-2bQlWM0H0!Y?Qa{~y`T+Q(Ee^@rjV)SzTBrhW{~QR(+v4^(aOBO_^& zNxO}jPMT%Pvz`_~zHJgLqot?BFI?dIW16>&mL7|h{uV7gvh@$wTokLi<>zVY7u<&? zq(h%83zbxw%~UY>mD8EKuO6Q+{W*#o(|9^_XLS z>j>%`Bne$XfZn-5(edF&v)u-R8UiKi%I6L0W>EB1hi;~V7G+IPRMuX@W8ODTHe^Wq zm>5A(0i$_9KVNM?vUTGocNmUBF3BXVM#f7nT_)sbRPZh2(jW+Oj~%ZZixc0f9-gRF z>^;Jm0U$qU93VnOD^7wU)h_(7h6a|>-5xH1 zmo1RK%79WiH_+=}HLlheAE39(rC2MyPBUIhFnvw4=;-9jlDKuaI369VT1@_JeUiy} zLzt$f3oNOm?Kus8F2X}Tiun^J@S?tj$az6gC~1E`Ru?SyCh|P6Naz&ohd!!%~u^^wcq z-c{Dwrfx8ZKGx?zeI8Fhq0yz;ulX*1>4vTh5vd_4N{v};$1_Xc6TO%`Y{^CRVJMe^ zq=S(d6(mTj!vY1uYGxW`SrA!f&#hTzZkP+1D73>*i29z~+h(kDztSrpDf zxM`>vP#W+S=~n_JiU&2;qIm2#TtO&L&`X+yM(PTRQuo5QC>~sOP*;t)Rs#dpF+nAm+6>ApRFp8fNy1&!3PDk{<7~&Z;^U%LsIVm$ zQ7aI=sx8z!(FMu9_UI!u9;cXBZFvfKOKeqIHdv+C>WC~!m}Kv#b%RKobD<#OSSW}X z3k4C^g@RhB7g04)WEKd2kd`VXsz$3RwN%~~P(nv#`bK9zp(k$4|2UGmBUIJBM=V!} zIe%n|9}9XR|4s-^hi211nFlnhzsgxvdN2KpWn4&wPvpdZf)YiMru9UgPy&iPnFxyX zvTmrQ7kMHmO8G@>H&a69%m1YFO^l$Z;$O~aLXm9UxXE21;M-uHOTOg<7o{=LDOspl;Ke2W#a6(Xm3W}oN$#!DO%3HhA9MY1|Qq+acvbu14 z%}&VS2`#So>C)3Yua_+SIjOIV(-aNQ?`fncsT|iGpm`Oevg?&aw7R3O7`ix788Ta+ zDNaP`uYKjQ&`_X8+xmy%5u|lqd2A?#G2P4TxL`IE^U!z=oepxmFf{v4vFK=R5IRG= z_KZ0YDi2}~x32E2 z6A*ILjlSEZlK*J%f0P4!GANqg32DFN)*liUS7jfoHKfoZ_&6Hl=U}Bge?6#D zEDzxQ(V?Yxhqg@~SBk9|%IpW_6McfA%)=S<3dctq%mPXl(_k^Vc=R3AEdUAK4U*n~ExjLEfV^Pu zkpWT|O$clh3CdBTgbw|v8UjSniw#vfUOZXEt^%PxcqGLww4EXst1`kAowU=EIH4ca zQV1f)Qli$qymhC@cD3qLchO940O@Zm?B6qRbVJkR;uKDVGdCKVfY~FhOEt0^ zZrcCI!+w{vpK>>t#i&Fw8~UGGkPqWQDZ=|s!9eqmw3n?~PD1{fT4Rl8@m?2kMU7dY zl|D>USkx!bge^6_N1{iJcK9z<&+dGw>L?!f3#+uW;_*L*3C0bZC&T0Y>@h9g{e&qH zN)NrHc?hp`}2-dBmP%&eEH&Uy&X?xBx8g#Zq1eujc6QVk3VR&iGbZzv@>8COk*n2P@5qcFZprsoF~2a`{ucfQ!>WZu78@I2)n9G@8Mlij}=e8C)72 zP+4oQg{N&DR^JZ6piOaeq0FZIgb1)P`_hpBdBMY+HBZ; z(x5;nU!j*Y&jTqENl=tXzhyi7WO4amY*pzAIn_<0&`H=8Q+3A|!Z)H*qqXj-y5mD( z(g2*4XsD-R{DgE{W$0F{4_~@x*Ke?a0K=%zcB-?b`;0`!-ZgF8j8zao>zOJIy%zBJ zD>Qh|aNU91p8p^07sb$31shMJ7@VKsO^szfnY)Ni0E?(k=Y#qiya*_y(S^n=fch)j ztv7I#Tz_FZ>cR*d2xS+&q@f*&A{hlm$@mi6@ksZ880oHpExA~=Q>e5HeWo-Lv-CJL z0Cx9=O6X(U$0=8L54z>rP^7ZzQ@cvLgvO%UcpM&4;LihP7}O#W2vW6Td($unLf2SA zA#UDHTbkhC;Oi9|RDB((b$98Ln@N=Be`xq=E~^Jm+djzVue?5+%(?iov?ZMaqnt$KT))IZ8EN zHzyl@3yS&HFEYAn>o-AfzU^APNmEsArLF=s8gd-Cb!XL< z>&Xh0G)OJWDy{T=YCNQly5O#XHB?m*{s(on#eGY*EVI#7H8gjSe3@m`&zaN&jmN%} zN|YlHeJJNX78uF`Dzt1;^F)MJ)Z+*!p$=Dr66$aOlo&D6juO#Q&^)f7z7DD$krVrt zMS*${c0z$Z1xnQNM?w7wk8b93(o;4Gin3!C+fflEvqb#ktTZu#qW;r7MiYu;>&8v) zIYKV=pW2Ailuf>x5(P#2Q^>X=iFT7Mkj|-x1wfNeR_)|i+&s=&p}G1#Pkv~mm7%AK zXz4K6K*!^aj+buHUU^8{Ht&dS+BmKBh+afqCB1M41|HHvUfx})_)zwUzeN1hH4~Ec zRubDjw9-%UDZq2=Vd*Ejz$qFuoL;;J=4z(PD80}HJ$l;|h!($eJ1o!I!X(Gk)YaRA zNA$^7Bc}qqt6eA`YNVUlZZ)VKjH7nta<=;bD1oDy(o5NnN@golUk3Farl^dH@_h@a zOW5vqP%D_a6O@pAKd9ww_ghdxGL1%-u-$8*7Be*rY7tY@kYIwBlK4dY(oGxOMFS!z zDrt>uHt&ex3m=7gKN5aR=0Eo zJNf1rx-NYrE__zN+gAFEeTD8dmJKVSiLuuSw{2LcVYBvdfwy#@RPs2Vc^z+5>@F+P@?Ex1xi%D5Bz`Jy$gI))ww>r zCo@2}=tKksMHw&(ieeyuAR;ql5+;y9gmAH<5Rw3qK+O3D0mVjXy6X_Gnv$Z}l$HrkJ$$Oh zdb4sdRN>g56vYO$N+gJ)e$#pBu2;G_T#Wj6bW^8k1!*tc$_n$5pw!up^$b--CFVTN z8aXz#!kbmsY7?xzO3Db!a<*N1q^1ek{Ex>{8ZxEQaRJ4AVuj6Voub#d=IqtFN7~9d z1CU=;x_0iG;3p=ed?dwMR~-v3>qHlMf$0{20)XRx*AeT$I>`u8*v6$18X`sV#o8*#SDHHARWGeKbu~ zKg_GEF`31*0{1qr#)cza-HFWG5(3~6s0>JTRK>)*9;%pPpj0uf1holQKpr;!FOhf< zzaJ9nj}{Ju@diEZ9!0pSqKaa1{-^MKC-pE+iU*C8DvmWyDm}(H3D3o!bn^*qsm)w1 zYIIra8hd`|^m>$Io`i|WOjWa`z_8wFnjjW%;~bk~dL*$1kw#{t^!c1tY{HK&2FuZ| zlV^*#@(5OmP!tpKv`U0t4e_BiREfra-iILPjfrUXN^85KF!5C}UjD>m?J;v;I>bU; zzy`Ls@koEDY?xfw^i8*hWA-uT)&k%DL0wR}8ox2tAgnjnFlRJf8|cyy62O7}2nsML zi$OglsEY(~K@}@X>?%%dO}wO{+rJkbbPNw|-({c<;XlWiqLxRpH^~2|ve)5%(~)5C zhD=xzY~~(CVoTFLf3W!>kWKqCg3X5rA;Fby$By9IY0%mD^cwt0vT21?Sz-EBS<`CVuISgaIt%YQ>y5=HS!gOv*sj#KBk{{|9+0z3}|=W93z ziNeE0za^8)Z9KO6L+A7U)520Z63u}j$eCfhgV`0b84aP_gDnq=;JD>sKGCYJu#y-{ zvclm&HJ(vuLK`|HJaEW`tU#TiY3st|IduRGqb5`6D6oB8r-D13MBZ)l+?Y+ z{vYB;;}HXX@P_|JP6V6Z6HW$lDR=`vp&4xc8T{6~LlZth76otMtX+4B!N;2M1664K zb^IsqtT{~N`ZdPF4X))Yv`wq=o;qJJPO?^apN?2CtTej<4{yZ#Hmxr0hzI4Z$bN}}Qru%|nLZ#CXR?8jtj5*jlb-3KLsT zKZM0p>>LAG9c(_x#@w_o9PbfpI-C<+%SoWh&t}dvVfl9cJE(Nxj@CA%wc!}_868j* zY+i;U)z#bZnm8Q!a&P1N+~tcj zz3+ezKdU&zxH5oEejphI;-Jo*35GQveMeMY211r!sPbZ7RDA$Y>PN|!t}O*DlGrxvdbSDN+t^L|Ek*A*(4CLn z>;?OI+}+rNYp0pMrl(&8$Y^-Tn+OMZxWTYxnRDf-Gjjpw+6Xq1CEeb-0&~W~nkrmL^5zhfy7HAI{vJ;>`^}itH!CUqE6@ zv!n1a7MfL3S$`1qsib&q$LfXA)@2!qe+38XTY`zbRy2i)y{&V7=I$9@hf3_l{1U;j z#9?I!7676S{|j3JUub5>_Kt0ZP+9QR9j<<$u(ZM7K=>U%_>HqceG4jJtOLbmRKR!#l+rv1(+-u6KY}Wg z(C0vXEfRkR)gU|{)-5VD2h?E+jak$spj6(k1I2xyfbp;u`VlA<+fdB(zZBV3puQ05 zCQ$zp>OoK{9gl(f96Z1ACs3aWm4|x&iQr~|IwaH&Kq;%1g8Eo^cY;#-o&ohw;kAR> zFVsPc_b*T%3h!$x^t4RF2#fXeL8-@JR)FHr9xxK1)DF*`pxzW7=D0dVf3t80EL?}h z>(<@e9qa>&GdeuP1B#Eo1dIZUH^-tDfcl$+R)hKul;5ZY^{!BHP)CGX3F;f6t_Jm$ zP-{SO<>5D0_P`Bf6$74G^xc87X+!%l zuXuLpcofFeiz=(N(H14g-B6{MDC#zym)^ZfZz$6U!Tx@*KMVF}{#*7_ziAO^uXvP2 z{Reb4j`8(1y0)p8Zirrqi+!QGg+>nC8u6|FmxZxEu?{>;jxg2C!7F1W`v}2V3jCKV zlaLZnn2d}%jRBZc=!eerEmLyz=7rkA!duiLEb~+~U}KJ==a_sq8EZ+X8ya3CYD3Vf zSMHQ3;m*hD(bljJLOKc)jo^@;5(ttetKW+tc1^&3n=!V0b>`a6NP#W z)LFP#r%;*2SKcWISM^>|nPB%3o)1&%ZocDEcdY9w7gyECE9=acgv+bT>g%l+i{~4K zMxHUZP-==c9HZ3{L}!fHzu ztn8&@GZS}v<8lNMHs}XIHSdn79rQD$EI6VM6>1@OH~L!QU>_HSm?}O`w!4 z7Zz%Ke*)A7RH%TU)nm*rfu|m0ejU^;xKw%bH3-w4C1p##qFCN%2+!9i)96!ytF)WZ z2Yd8=MrPHr0Q=4Hc(9qPKh}IT@z33Z))8VXD(jHR^MeDUC{WzI?u||Q#3?%v$XDvH zicpysOPtIT*$y4RX0+9WlF4-H8-5#0OxP_d_1iJrKiohD_6@ldmzwd!U7*Y-|DX63 zeqe8E^MRnUGWhtR%^w9}Lukz=PI-I{C#v}LmcTBoKh&1M+Am^Q=~FGS@42vZ@e6AU z3){G94RG9a;cfs;YFMFPisiE*3sl^A+)!Ng|ajJtuO zS$qPXaZ;x$MA6qQxFgykuwl=LrWd)ms%R0Y)`}e^Xw`9W&01^iKHwmdyI>6ZpEdY5 z-|;p9yCGJwfK1KQ1c%*@nryMNDV9ol1*jsSZU&_!egR5JaIc*=fdU4Ln$gmPpphgOBvgYB3xM@}uRurpnuJ8tFggIcbn%fvf zaR{9%XucCf-KO)>JI>NeoeyhhI=%UVCW^XE=cRX|(u>`S%!=b>fHie9HMXUS$^uX6 zc3MIGUb+=>5OtUKCdeAV)9F_E;Y5=5(yfsF2Ly~`M)fg{`Bc3ESqn7tRSomJ=dS7_ z?_}(!DolQjxkxgOr~`G5P~;y^PrHjHOPIBaqOo&?XWnUr;<29wFP4E_UfhwXL1+_X zJ}nBKy~B!htVBu$izKSSpvr|B2Fi~9T>LWKVk>$@QF@^rJ^O09@J-=xdCjug;Z+qi zD}IOLIXQefzw^w3_xtJv?DU-9ct+a>X1z05XyyB+Nqf`&jO@ zb?#^DG0&BL4JI>j~8U<3!UAkj3zWuu`m8Y288AwVO@qXW6WE^YskGmgt z#I}%q6&OEKVrN=3@c0H8*a*^h;9k5060-mUfYO|hAeZ`(G1{%G`u zzLw40o}d$q%VwyC6!V`pKUzQaLR*R(Cv<`lsuwd+I~B+UkLeU=q>JM$3+9a9w*WqS zqK#KRhDi@&r7O@<{Ulx4Mbk!*I}sP9x*Fh&BxjtHlS>Xg3p0wGbDW&f2WI4<~oSHfq1)?>-*<#sAK>e2O=R5*K4E>P{#ncKQyLVv4t>a>(# zT%~ieB}J{LKY#J*wp6p05)6Y4ISE^+gp{3Mp z#W^;eDsiy~rlZZa)NU;$7zy8}IsD;n1?=9n?uA~Ht(9f z?BGDl=3W5=!i8|5k8+HsgUFFqK*dXUJ~zOY8my%R;~E(UikL<1H=OqKdu*u6&J7OiWb@r^&@}_M)79`+c;N`WG}C z*z}=gbU)Kl!&1_IHbU+CbIq!89}Kh7e!rFyj4SQzN$oQI&3&(ZZcA;_Qi5UR#$VFf zJY4ilfWgeihwr)z6GqeKPqftV6q~uSux(yDXHLs-%jWO2lwe#obJncpQH){f!&g3I zOZDb}3MUw$hG-6dsPdZN;yCAi93}id&RXe?>w8nHDT6h=mLdjq)$xrS4qNsNcJn!F znrx}7v=lKa_QzeZgKa$H;y5*P!&C#C4((9Ek%stRakmL;5ch0hg!ccOdr=dr@RK0W+~sGrADWeGKXWkln*}h zi!(=CrTh~uB^XyJpC?kBN6@im+ETyMQi752Hp^x+6)(Fu&Qy$rgx@!aKCa>MWA3z5 z@qv~ai&P-(j#U!pC3Y%yEPP}1SSuA>wV8r(rQ&>%GE?#5xNSjO>Kx4$3~>0WnF$1) z!5NXve;7iWySmC^JUD*et?((-zy7!>b}Fj1p7ANExIm=L9^Q7aV!g4>VC}@3~)Gn(gcE5HR|schq=nRpP4YG!kw-Q!SVa%!Dk21)a{hV?R5Q1 z>$xx`U7SbSrPK03OU8v(x{gC%L?;+my29WpDTZ?j~EGnnPMr!6qY) zHoH?10mtuq+NXAW#(voNUv?^%X+4pYR7?^nvvj)cx%RISD;4Xslwe$`$P=k7`nWFs zEm*OvNRO9{pmSAi?8Lu(&< z-j?d8yIaAy;+iZ{1L)&=;QFn5ZK(^ilwe$O#awX(W<311Eww;P3C0yyp-A=7aXs|% zHb>6$wke%pTyaeS*RFMsp8Wnxc3k&qDZ#knnrcZ=>%C)su+NryR!a$n!Nx(&A+1`I zY=`hCoZ_6w4HE67W{#9a5jd=e?wVNyj^9VCP&tjSb~N8-*UaHsPf<$EEEXxVW}g1{ zOE(r-H8ZBA1mjBSG)oGEvF6k+AK6k>T1qhN6HJrkn=x*ir;DD4;ByjpW?}hY+vbGU zGd;!T5|J`(zV|O*{AIdj^F3NhFfN-f5-GMO=Fj%~w%%<^ZP!wQk$%kV0%)Pz<{6@A zK7Cvr?~FTW+q_TfnUP}iOp!8ezWnX3>t|Rt`^knAjLYUyaP7U6dw%%f&uppFwUl67 z`AiGlHqR10e-%FV58HYnD&_)ROzWAIV)JZ-+O6Q_%l~%UEX(F{EhQM2&2vP`na{S= zS}i3Q$!CuAbhOZI^IUNJz65;MjS+*|pR{ehPwSbRV)Ml!#bB1s`a3QFu)ncNyo@P@l-n<=Hj5vbJ`=0sc@(35^(&!Q<41~2UpMA z`fgSH%Vx_B0O9{r6u1iIV>0)l2@X)`$wx!l4 z-QN70=WMCRwUl67aY>7ieLu!EWyjP^Tk0JxrCN=1_O-wj*VjMzb)GGCjGiD1#uZnY zNSWnTzje}ZTWXA!5)A9uNY38qnDg$kSO|{a=iQbUXgv#4%A#DP%sR%lywEC(HCjqA zE}JVviX)K^7u&Keb+48Z3~e@>g+UA5Hdl(CZ{f546#U5lh+ThnX+4!GHZKw>)8?Q1 zmRD3-Hh-+81mm)Ku}E>Grp=lE_|?s})Cobb-~=Pog_^@3YP8A~zG2X2cPf^E)e{~OJJ98Q zTk1_MwMPN%j1S8Zq&EXH#`^8c? z3tb%4XR{(0OqaVR)Pm#p@$PtUP~Wt+J#VLUmDW?6lF}cFl$p}^BZp?!S}DCvO9{r6 z(mIi1F#D)&M|KRirJmMOf^qeS^{%+KKUeXFE%m;Z5{xUZxJa?RGp;$!|9aGx>UA7g zaDs8g)c~&D&!2hRFK@G@a!7IS=`%Z(;*r)#Fj?e58+^+Rpky3&yManF}M=QU&;tHz--_}xs zaiw&XNIC1OE#+qgf)k8TXJ`(8NRMPD!l2FWR9p#;+LK`__Wz^yOFI=8Xgya-DiCbo z29f35dns3epH9ybEp?Tprzx$Tt2@zihnBk9((_naJ=chyQ{c0#=iGVoY&%`swA3}0 zp10HLSuJ|l4^YpW=N7zR>-k(utrk7b@%>tnGE4cyhyUDtwN=W;9*;mc!MI9!4Y+Do zpW*j5PCsZ%ovWn;!(ihg%^|Jo^CB0=IUi#x+~wW~4(>B**>ftIQGI;)MYl@pX-rAi zbqKZFY0Gohlr>uEx*st|8r=()7NSUQm^VT!j%~mP`?7H9t<4VQ#;HtDUoVzQw)EQbzFbp;d zHHWk+ol8Z2-?te)Q@Y_NpOo1tZPa>hNJ;5Bkup_Q&Ab&oKP4 z@9Y0<=lm$0iXW%s{LLa|=KO!0b=e<&Y~}oPEhQLN&fg+ZX3n!8v!#Bhr3B-uEws>G zTbMS#?_>BqaqS!Z)im4YTeY5BQ*8c;NSQW2c;Mx_TP>S^ucZXzviYYX#kR~kw)@2K zOKhn>Ybn9F=3}?H;#zU)J-N2j0WBpMS6pbQNLL>n*JlGJA7e}PJP~X-!MNhO16;f1 zUhr-8i?-A-EhQLNTt5>j#^u8`<>Hg(+fs#EN-zk;!7-XcTI#da)3PkwrSo%e{63xt zMeX-o%NIZy2i+A~&(96^W6lx(PK4U2xc`LtbAN7?&TU#sFs@YmLZtf9$MyP;AHLg` zYSU7JamDo?uDGUrUU|GNwO>mK#ue8uJBh0|O@I@OE3Ui1wbQjdyI`3e*LW=@7*|}s z5-BrX7hL^fg)LQ~r3B-O>({QhjM9DWwp6Q@5{xS@j{fd@zP8jOT1qg$;YA?LA+7ql zPf|FU{TZqpO4)I5^lmWyzK{wsUVeJ_A5AT|ldh$RQJR0?(nF!8DV%FlI5)dE&e+jq zBla;=1UK`B#s4&8!q}yyh*7csEv=s40^|3w&!vm?=-*_@;59TYMT|UOS6;hHVDLiV zILB_b6nERX7aYHD8+=ZU$G-dtd><~lvoI#o-79*WZRb94?K*bP%zgvzwc5@UEhQLN zx!*5RW^c22;O=*9sd_CX7*`$pohz=N96#WQEp?}s5{xUZ-@D@a^K}1jZK-WqN-(at z9&p9Q`fN*mq@@Joit9f`$~nr|QhiTGAe>-aHSqA!EIFVa)aDs8=;ltpn8pZH_Kj)yqgEac;1U^5Fs?j&99%mO zx!$p*W@#zGxbkqLNTKqHdwkXFXrN}=Z_-l4xO40YaQwb=m5_1%^%JAE)J`o$j6D}6 zl)2%~pC`fb``&=h_S5zL;EQ(te5dt1nUX($6e%-*W|lvE(UVsG3_KNqaDs8=&r{&4 znJ2@`Zfsj%OHI~Nf^p@~pG0aHMc}SK_190^DXrB~#Hc*`z2>C0Q;0cYpM8G^QflV& zb}dDWwm>-4{ow@touL& z!nNUYKef1-9P2Fr&Yx|m)3lUefWx!TnnT)M?zGvRif6#_`}k__rJ$ZU=}PokW-6v@ zJ8v8UNm%e9nXTyb$sw8yw7 zN3PDdrLNObf^o&QU8J&fT=yOK*XwMlpK2+=xZ-Me#r4jimPc)=-)SkqxZ>I&QXw7J zk{36gZA(3^r3B-OYo{x&=#kd(w$vUiB^Xy+&x#Z$UM!^xmtX71!}qk5U}Q`g2~1HJ z^&QZzpz+eW#*kLEJ~Kp`E~GgphUBMs3UjuLgP!(01};HY!TKYs+Ogz}aB@bC0%wSm zGcp&PE*8f*dj1(9_6}Z6)4_ykAD&$ZArOujsn5Bb$?fT8#?G+P5PdqP!m0T=@a(oT zWyE_J1XQYUpD9EM^_g6ynF+hs(u|bmGGRAb9HOrY(WhfvbT^0OpLmM%8y5$9#^fM$ zI||_${FfXXF$%p4U(_c@t=5@kw_6;rjg2AtbY@&Hgyg4qDz5h|j)^(q;xKmR*ed}u zb_#bNM4ygQz{u{wn`oMrg(GS6c@~G*e#uf}#(~QhbS?6CoCPVIh7`_CDV%##IDfJ@hAyu?7RSu7!zrAT2h%D#6O(IksK>dN@;p#}-{v2lI%bWh%rW;!vaI&W6*frth6wUz`hpkDvNJukX?v(BY$M1U`DLoF< z?g@TMaAsS}EYx?5+O}5n4T1qgkxc=&jtJ~Kw-d$~}H?@>tTyg!)71wT~aHB0{oQ^;^!MNi3JGgdS z9N%rJL0U>MuDIS5DW(h6!&sVE+TE54Ybn7X)G!uk4r$d+uW)ft53MHvS?k>O@GWrE zQw@~u`TBF~?0R^k*7H_MJ$zfF%oev}%&1S_vg+Y)wUl67>3T<`%wCH#SX*kFmJ$qb z_=HSyDmZZv_ZED2D&7T0t$mwVroVQt_ThnW^}?c6R7pD-|c4fj~IH zxKi;xxb|FP#I@_rv!yQ3Qi2ira?Rln_nhPdm!6knmtuLL$`4OEYbj#XoP_dpOleo+ z=Llb18OLe46*X7PjIXM$w14KWRE+W^H8u5>h0DqoR~p$eZ_jqI8kS!HaTl*#&fqP? z`P!C*gJTNVtoidN&y2}w^L2SkD$AD|6DQ8k3(wD)R1%&ZE0{XHpdcES6MZM!RfX5wfS5&p|pO(teXB4JB*S~xZ(7R{SFwWM>|DwwGx=g+TNRy$uEAWY*6 zmseEPRhGvM6%ehgu8dbsUwAoL+QPj2aLLrk(+elZCUqXmvae_WtEH3Jy7VEN zr@oP6F>nBQY0XU3wMs|6ArkNjVtz1=HQ&Df4 z$X6r$;DI&DyghoT3lIQkFIHsU86Opv}#$UQC9xL2DIVg zn&nk-v@4x$$y^;n5?fw4lt!t=RkhEAm?|M=Zn$|`rHiT3 z8m%i^94Rlatc@3-2S#$GyM*Z_bv3nfbe}b1+>}WrQw#H^6o%QUPNr8xuYlehdc5pz zx+FZQAT~KRy>NQxUECEiMk!ep^CC1zZA6}V=sSk7{FRn1)5C?6rWNH)nx2=|m|SYi zvCUGdrSK{msw>r~WGc*wM#6c~!h*s=Bu~mIWk6CNpqMyXn>!laJqy@0u%dFNe3hc0 zu4dV+(t@#~#Hc`7)zz%R57=)OOA=F;i<_$p#wD(JGb)$Wtf*8aBNohBZXO<{qRHdY zVJdpvD!vz{P53^XGQf^c#pG@sQJ2Y11I+f5gmA{~4RPg#%ss?VttYQ$InQdDGr7oZ zh}D2gtKyjbcv+GR@iHX|qinI6j5$rb&RNpvY%$qPpCzv_sweIoqx#QLN1>;4jM9^P z6nZ+xn0^2Erz@w^xRjpGv~*f3sygWYYI#NKm?3qvsAl=%l6akCD4Dqmr|m5(u0)$H zPwn4TLt^*tRc+9RH~?Pexe(rIOQ+nb8UpZA?n1bfThY#ROyD|0c&T?QaYvf>ChmLV(m>UMi_wRwLbRtB>bFe%yv_2M!H!5%xm{4zzK;sp zd9(7+nyz)Zpq(``7qHVzbRu0Dgep@|SGKHjVZ)+Dm33(=hZoE%LJwSWbgHN%($1nw zfu)Hq8E5tKsg;2pPSqlFMAyJ2HCHGV?x8@>)VzX<%T}U(Uuo4rP9?0-A&t5irj}m1 z3Tnz5IN&>`7_R(sg?r_I6JRA>nD$h#08`Gzbu|skD@+rl)1AaGaVbt|O=*o@@LDM` zd&;EQZn~ym!8&g-7OeBuV!@QQbS=e#b=FEOkXQa${gH{XGEwCWhabn-<6^SlWhtV# zT0@>*ia4u<0!Xpoq$sa}DGA|asvDy0M0<;1@4)U5Q)5-Nz6$Xwk-~c6l)LM@Qa-z? zzG@+6TqZJ!o2uMw3%2qf)YL3vTuv;;!+8F(+W4yc63LkPuKmM;okke8S0fT+jv#$O5%mfQ>O|dKoMo`Nl`Y18tHy;FqA zE5GSGakTmv>O^xF%bc*G`?M0_uCgQD3mq?@st!j1RMjDAK9*kNQ2;$En3q1U3g&?` z>&NtPao(hoNs;2I-;b;u&9*H!0)=4Bf`z95H^QPw&=SK^s zhrK@1>TFK)Q6DQBYR$YU2^Z#1%bQ-D7d0jIr$C)D<;*KNOi{RK%C!9asrl))(Pcj$DU+}HqRnVy zk^hQ?H8ZAky6-V-Qen7oTJfYQ#f4Llcq{tck@k0BRmEUKfF@~YD#2z-y+U-_Jc6WZ z6ynZORarF_=@rHmvbx5md%3A_bheXcj@C||>XSx!;M_cg%k{vyc?#!@K_|e$QiBZd z=M+>euc}|7T8FGJqqvu&2O)-E)KFQsN>9~gif=J_4~VmT-q;R@r&TVF)-+(|tP4tX z;g)Glbu}<3&Fb)|oY9pz4(EupxCX}>V??pWKMv4kwef~JbHc9gXIo5`hQy)fU-{VF zuhV9i)|Hhn6^(icn1n5^Q8&OXHgA6FqQnjOJS-R-Kj%o1$}EC?8E#vo1V+o`*$7*O zlHrOnnJ2qYHZyrU%nng1^e$408t0}xhLXM@puZ z*Vp2X=N(lWpaP<>e^0M!vC&GS+A*aJ5?&HRcJ8#^1ZgyxyPR^JyV?v>kBgc$V_ys*GuJ37#8|RxdIe_QM<#{)p z$y!l|E^tMq{%O>Mc+O}3(*Jv80f##ji?e5%A?ra*G#{wb%&?I)$@$DS*%4g)$hLXf zeHZ)=WtA*&KBY|@pA)>$kGG|9(eYn6D<|wcS)6=6-?&6$_?u2}jyGY+%f?lkf(wU} z?c-}iw*vRD#`0e}`*`B|8xCAL`@Yr~s1heQ$2U>P`Gc3$uPCpriw|~l8yc!AhF4cDJUVvq%-MM}N|UhDi=xva z#rZP_hiJhkxURu9(ZGk;;G*ZxD?MjUP2JLYldIyfhK2Lk&CaW@D;Huoo)ny?Cn@u; z;21kUUR^)DX5r<=`Njpu@hG+3k`py6eAfTsDol{-YZk>rLuZ^BnqC{{y&l{s3FYA{ zH<(`Gp>@0%Y<<$FrOVYpJkoi%qoJSvn%)zchEIKN3!l2f2Yd9zkilT^MY55KF^FT7II6tJu;ZVFL zWbQ_UN{eQOFomjIDG6zsAm^gRdnJxxTCA@I4c$U38G9G`Op&s(FMhMustQ5MbbRs1 zFMLJOqEm!tS`gT|K{h0nBg=s z^Y*(3*$*A-wt&Qj&~Thx2}A5h!t0+o?|r}Z(6OW#;ev5Jbj%p+hmQH^v@KPPFgn2q zwL*M)61$`0VR5PB(iwW+d(U5_8a97jPY;fm3^l09Z{;zc4P&$VA-+7AJj!ISM{z%t zjrXMx7mJ@^BVH(b+Rh)oWZxbvJZz_8zSh%2Qh{J&wM(0;%Iat-1so3@}<@FYClsnmsZv-t6GkSWRE66-w$@C>U+^@ zaszwR7B7bcbN;3_|2ZSq(`|EkT3wHz*=5xYSlc=Uu%yyc_!I$ddx*ffW1z_%Gd@gP)~#I7&35QZ7jGPxH4a?5c>hCV%(%VcWvBC7;2zXiW)b84 zU!23Nh6&;S<2ejg1pfn*7|vlF-xtL7gAGn_f?U6!CTWhTX1y70r)dJ;n}U94TW z{MwI%u2D?0k}W#vShHM?T;U1V-VvjQ?BS0>@7!MbR=lR>EH6~*ZL3(uanNRqd(0x2E; zHzy%6#LD6S)v`Ww?P29;Cn0lRTZsh$<>@%br2F?KA?C|jY7!zHq*5ck>PDu!ICw8@ zw8>zuxrbdfQDGS{Y*_t_1$Me>z@h7EgfN&oCs%69!I>hZ_(oS(D_uXL2%KPClPi{{ zd-7mQJs>jXl!HHZX%7F%ZFZ+ZrW|r+0~^Z&&mR9<#gbKMxO>$%b#z_$jg5#+^GNH^(_#TBD_V5Vdv?M&yniGfo6JT8=T!#}2}a7%I1` z4E7u?n_1{i=P_DtK=_wQIIq$2Hk92BDC$$$&%v?&r5m+=3e2xHj&;;))M6Lc2F&hc zoNQ_#P&>x+5inmT;~d{QBb2MZegL0M0XQpO4}DXBnVpRD&==PjrBSEDvCtr&=~$P7 z!wyFh?o8lr_rfLZG=zcM44llOL9Ea!Vu!X?EdO2 zBN`(>cwX_|27V!MZ)q$?f^_j_qH^_N1%pc$?*N321ZJAXrAzN4z|94w7dH^#IF_V~ z7ay)Prf6Je@h$w{hyAAQ&2+YhA7_0hHZMt|L2WE@LrHhv%=-a@2rE%%vm3Qt> z#J9X~(Xkn)i#GzMdFXo`m=BY2N%~l< zUC=mBVFQIrS6@O18=^79(RtOEt|+Liaz~?HXt1-~ZyOu@NTa{hzKHm#MdH{|6S1 zMtIij$Sf?$!m-4sMTz~fwR_@SW35x72LiFC&Cz|Z(ugJY#n!ep4Dj9)4@WM&?9wf< zmU-C=Vl7u^FDYuN$gVAJtqjCkWyH?U-C3A;8K1OQd(lsF?j1|)h$Rkd1_!NJVprl- z^*fr_lGq(fJg=kP6*B|CQ;5iyYojbd%=P0v+MCvZ=FeE`Eo<n&{vFHGz%9=1F9ct))0nT$n|mS}H@;3K88wJD4^L^UHy zuRE4Nro|FlVhQG8(^i$Atf)h91&rbF&k$-X{L_TG6#ihLs^JqGkXtEiegQeVT2Vj4 zZ|>R$3@m31wt|512l(u60>&U1sMgchSk$?oI7>F2T7$8O6vdH&#p*W(X$bbE#knyG z&3=X5x!)j)x=rV$my;Oi?UG@1*~*nU`egCdn$Fg!DE8S(w-ZU)OSeM$F3L16iXUSX zjp}7|uj{hgzaXO|iZ8^?G)nOOvWRgpq*Ly+l&k0eLU=Tew~lb{1y2;7Gu8;tM6=0h zdZL-hiX~o)4~;eLUlWn<<)XUh?unr$g%GCi!n8LDlHjJTIhSnV;5h;pGY;Lf_{tlJ ze`*s$QOxul;rY;Wcb$=u!{(M1Yl&y~V+{+=+ z-IKc$NmxLLY6olEg3VV$;f62P-i?30__$bW>q8h!a`z}rT7E5gjG#i)w5#6^H4URA zdQ+@pi!0*9OQ{hztUu6YljJn*&Sx4_lu_hD*cOkKznNrue(rnBu9%&K2&~g72sVES zrRql@8qEJLw)XX4^V7^Ucgk`*jy7$<=DVSCO6!344|jBQpd*SR`?eP*o-gd!8Y}-x ztZ7STZ1X#QWlpU1CuUwPC`#;;IFe%SXrIy&80Hmw;uVjay>)*G(K{n_L{@ya8A(y% z5Ic2`8=bH3-z&*4&91P!@PD)aE=;_jl9I6dZ}3!_zm&>@IFh>WC?ZU}B-JK1Z1*BM zk6wJW>cw~JUYwP+g4G(`cu{r^`&#M6bN6`kxs1Fw=u8I{V-i^$UTo$=BGVjtYXCX5t;tEI)6cMT({)Ix_0blW+w0L_g-ajqg zaVU3%8v{zoHdwr$TD)zbCO|4+yatNBWx)8%!u3JpP_iRIDcpsih6t`0lp2lZfKsE; z<)8*j=n7D3G`a!QslvO>qV5KzMk7{vH5xquN{vRj=pNK)G!IlnWUm0FZ229iu<+m+ zT<4o^5(w2Ad#|y9j*kg<#@dL(?ihmeGM(sC-_}(%49XjEyKD&FjWtC`oBtHc5 z0+C>6npxD^*oI$4iJdVH+--%4!;3!sL+r~JV;wu==f)bJVQ3*n{((j$_;@C+K-RDw z4Vi^aZ5e1$2Xfoi?hM}A#&JD!ORV+DHH5b|@?UJ&;o#$0!N+@z9rj{FW{d(m8x9H* zQhOk^1t_D5o_0m}uac)ICU2_nd>km_KJ@AHFape;!#*FS=GMHFa0QGXz@IJD8u($M;2F2k({2v_s{|{G37#dq z{)4(1!BJ-#LEm5_v$orUu4Wk`My|NbGMvXzF`gajG)H2Iub*~h$M%%$kc^0%8Ifqt z-i=72Na=Ie=U;(2zV7#QS0=qqSnd1Vy$yBTPF93whUAXlX9x46@38=Mqdy@ zUoaH?!2B)P(n!gxQt%ey!c!FR%Y^zl{IF2)j7R8cSC0QG*A&HETOhpt+1-rZ6+?{P zqs}mTBj#f-#Fx>1cVPk6KVy{=mI4WHUjceRWtLJaYf=X58 z&IUCYS3o|?qPnC){9Z1+8Sn=PH6Q*mq3YoCc16Hwv8cN&>LE~JTrdcZ+fb%sZmNt| z6f?eBc>M=B>$Wmlfa+c0SmV%v>rLDKEfjR$Hp|b5uo%sG@;PmzyTmk8kPZO#HzRKvu7PZ=< z)`L<7cRMImaQB0{5?8=@7``gFXF!F82hVtgo_5rw3Pe#XkX6F_{sPf+|H);`mX(EY zl0t2$9u_~3 z*uYitDaqPtI@UI2uA*q}4Z^c-Sbl$uVYFrIX6g6Ec#9RIq8Q`N?ie|uuwIH@S7(sJ zm=dq;10J=eG&=`v9ZPxr8xyct;uZP9r9vA)Esta`fRNSMmP8Yna0zA+!fqudp)l>u z*(`O#m}exqwKQjc12Qo=0E$_fn4aaI-pfBdvt@nuVF~GjkW7R$eHE zkamt=`8mZc<^76VmhLWYxoSsI;u8$~xnH!5jBI)Xma+FN$=#EmXvgvw3&njjmvf<# z!qywtfX>~sDB5z(t!g-9ogM-Gk;I$U$|O;IIMT5VH86PH2f!!tzbS&wFm+sj4Wyg| z76+(;V?mEf{&Rn!1R*pF$+fi$;FfO%hLcQ$Tv1R`4JSvM{<$WWc%iU-Ypk_T*s<(P9O~#6 zEAPfw`J6~g^o4!+KMMcjfoh$K%Ea%- zg*Qk;2J8Q9oi;{My};Xo%P&J9b(_vh@1F!Ys8?5`*XKix%$LtJ0$WFlfEfo{k&^6V zQOs-=2cagCv{xJo*?(|1qYpl$)cvh)wOto<$qAGYk3A_^NX-}E^8b%L%e#T9UC#M* zrXL}GAGau(TVGz+AGVko#XP0sv%Kz4U@*jfR<-Xr{fF9*(exG>))-1UUlQmdQp`oh z`bhuRL$=hJ;Lr)i^=J!6eLJpmmURrWrNR_}6O1b^tV1Ei++`z03IQd|hp3C0x{ z>z5tZ+|SnEVM{F+8S{Y{XS%wJ6yu_s+V|`~*iuc3DYw*UiD7X2!E~ys|F`)Q{}t!y z6wdP&hmZcyy=iewsn1*-=feg)5MqB|V*IBI512CKD=}h}<~*|kpxp78k>e(6PtjwR zRr{~LeA$%2O=K-ajM8(XTaV+R2G%vdFASfM_(%Eo*|qM!v{WxcVt3r4l8tho$U^Gi zGru^qm-Ud7`C^P_$0Zox@RETtU1;|c(u~*rkW&yGzmJ1_>3X1`%^1ysVXfc z7=+?RxRna#A>Gd{j#)bQr*O8UaQ0dp>RDE~46_AM2ag;)$|fH=A&U8A}w7WID@$H{7s7=w586{ zQi73>edG`XM+@CHbMlJ*5I*~_bAJBV&9=?OT2J2;oB6zh-EZvsQ~v3FEt{8UDZ#jE zCP!I(G7>&>Wl+}>?y{wRq@@IdP|SighqU|gJKF3{1xF>n?-BUyPtP57F1jc)=bzPj z`lY0zzet%mf9b1F&FE*P;yo=T7*{Gz5-BqkXP3OxXiIg`Lx^C2!?vg9sQN?BXp5uM z#fiQ+rox>rZf&X$1+urgr~ai{J6$DO&&et2qHT8R%q%Pzd9szR%e9nXTX{SRAGcZ721Uh*nCOE_X`VqxgNVz-NE@^?A`eJEd=E z&8McMlnZ=2rCqLlwb!XuO25!jf^nrZBvQ_l+EOR70>OoFsVXo|bI5g%4ugpCoyGvT zKV6#l5E07F&{D*>`&FjYo%X@t*dG`B#a}<0W~co|t!Hpb+8M8%c79xJu$A^-Ybn9F z(w;3+9QWz?evvKpCoLry34cv<_`{tF+U!on>EPI@_}Ob^8|+m4L+d#`B^76gl-UNE ziqoxBe5a)Z<4VO4k#eTOmg>*R5u9M8$5y}bF>(-Yn>oJteVoB_PBZ$ckrlShqqUx) zDK>LHVCQ`JhkIIwS~eGHDZ#jGK1-ys=;N9;p|ahUs@771am~<%x#D_w@U_3UrPgaH z!MNf&TclL~Zx}D#Ip88&>H#e!7*|~9xZ?WtDdP|Iy7YWmA2GB zw3J|6Gpln&Dg>YIw^uLxv)y*ObD|1IjA~DlHOKBnFLQA)E{_!vcq~(QDd&LW=dEv< z^WXf<%%|*9uGe~UQc9VtJG+$MZhZUf9IKT1i7-0BxN>78xN7FfQf|K~kYP(btfd6w z%6WE-c3gKH``zWX)L*oeU|eyH5-HV_<6(xA2luw6zSdHLam6*-71yxJnSZpUPSs6H zFs``9SaG4T7_are@;+NCtfd5lP&|00Ii#iEz>yZpu`Ie8wFoblBV^2@Hub~kx!Fl< z^Av+5w#<^VM|z`E*b1GbLO2MKKTK&yz$)^X$VcBH@z4yvg~Kr%aN=ETTN1LJqE&NvedN9M3N&S6s}Wyu#)? z1Sv1=O$p~06c$XIJ|)ddd-`#dl%vCxW$6yPk~DgMvB3EnK^lbfH3Dyl$}t@6f-g7V zIF#DzvQ>BqFOCOh>g6bqr1uDPMq9^VhOWK+NLmp3fa zR;d!L=jkN&7g##~CX36s!upvwKGUoy&b%|NOG0=hzzuQfN2SxsJ2^1biSW|zR+5qj zot2FBISbE|RG`=aNE5Yat zESNZ&H>A+)aYqVAli`*WzDERVWY}QiLPBJ#JW_#Uop7*$w$(F8Tj>=hdBs)_(^7rN46??mKRR3uA?d@_=%A07Nh_Z|T*;@i&RL|X%FSZK zXG^9{iA|ealJEVhb$um@YXxsxpzLtp!Z8N$EQ&J6cVzUTR(bMOFe@)oUS+mItWGrP zs32!s1;!kRC7ovVPQsX@a%UK&C+ScjPd%M!aptPGF{-7Mt8TokijGrE@hMsTbyVI%d8n+@Q%0Mnm4MR2SV@&-jx`EnEO6^$W|&Z{0U z2?vh?#|<1GcV8UNOCRgssYii37P#R@f#X)~1xJBnI*N}HXTEI%5piDW;P!Zfmp;el zJcYTXcwG`s$|DK)M-=F7z|CMr!m%C*PP#r}iAVmk!2CtyxEPc-ppxD!VLpEjOn|#W za2C!(-(X;dC*wTy6#+9Z8RwzzN?@)}#(C(w8<E3?aaRtm zv-A!J=KN%whrYSMR43y+?E4Wg=GWk@cs=wz0^E+H(Dwl_pC;py^s&3h3SmuK!4a_IWI1hb6>=vHP z9YeTu>1F*J2h2suI1ha_z+9D#OR|sUb_XzzYMfPWN%eUMaGNv+q&Tns`80%la1=Ne ze|PS4I-Hk2Zt;#d3LMih+Y6V}-|s*I>wr6-`<`%Y?&<1ZEp|Dt=1wPEy7FMWKLh5m zWSmENybR1+$+)EQVEKLr%n95pg|p)I&^HR0a564QAN%LafT>HydFa~!%$>=&Bz>&U zPXhC7GR{NaK43mi#wF=vda=uCoP~?7v-HM*DNV*D>C1wSI$*BTIIBJ<)q`6CxZw@V zK<dlBz#z*Ub0 z0oNT@y865wm^~VouKuy#IHWPuN9Q%3Uk-j?93G^{MaTO?>EitzFpp_mx_H@sUk2vA zWSmF6$~YhG78hMQeN4yMz=V@=9{Mf==JI4*QaxooSf??Jm(HvHak$@*f=gXD9s=$O z;O-w!O`Yf8`@npnap}^_@hEr!&RxPqXSJiG`oeKnz^eHAZRluFn@D@NVGV z(b&%7{Q{T_3c#g{m-Qv2F#?3=mEMcN9|~Nf#)@2;vy5K^=5HF;S-eLy#uaZ;zs7pt zpJ*b~f6l|ORrbGi2Jm&TB5L@!!|?B)0erbWg8zTuD1;GfR&6>z_Uq!`-EnEf!7;ZP zZ)Gg|&1XAz9k;1Hnm-fu^X;VH?HJn8qpl77FN^!vS}--nWZf131L6_)b-9UW_= ztvi?;ioE!&T3&oMO)oyXWG_CuRxf_PH2eW+_#yDKXn&I96vK-@G!6gkG((t2c`1xu01!?$`)9_h3$+10+pACB;89c?eh(Jjs}^<0 zqB1elP@y64*au|bD#68e>2wU^vfgI|AB*@pb~GLCcE!A+)-J@vZjU5xT|=tSzq{j| znBwA%7zzE}|6fEhGU9mM(HqS~b?UeXq{RWTpZV#RqeWQ~0Z9kTJYcZJ=L^NQ!+IRR zh-JPt!t!L>RIfL)7YN9^BkWfK1}Ds169FM`{i+d z9SHY==Ty~IR#(>7hr9w!@w$d(p{Z4IL;s%KP!-2_ddyHBN*O9Ct1uY_)m4j^#6vUr z`5TiLsVgt5sC4t@EUB!lHWHCQG%+a<8Q&HUM259(N%)3k;K-nAymDTOceWOwE;--X zYR=}XJw=JPa}V-ur%<#tKPz{q`3_dRTW;I_xd0@JvO`a1Ausrj;Yu(RLPR1PC4lD) z9a3x_>z{>pq0}#^IEE_l)_bhwsq8hRzvcT~?}@%UvunYLCH~%YRc1zT?ZadydgiwA z-L7mN3^bJQJPm!ar(r-IFHq6L2^4r$ipNfbfXDxA{q)KZJL3e*k4+YkSGq547vD{;UW4NCDMpwHGxvH z_kcNcGUcgrjhB=u6~&otDHvGua+@C(X$fW4RA<${!#H%AS3 z>1Hn38WqLXqI5g00Mj!s6jF4@b6ok6PPfVrXU?V5t&r-aQ?;3BmSH;GYoLnjB2_X% z!1KzJHQ@V={-G|$v85x7V|`~E-P*u{V|`~HG~)6bg_Gy2UNqb@U+`0IWCV6z{Sfmq@qoB>ybL9$8V$$A60ri)?^;h%(t zI`XnMQeO-M{8)PsnujC!64lu&)fsv7FOySKegs?q2Pv8pIrbHtzWR+h7S#l*hwwI7 z6i0MUk^ROdi+UdvGskayYEk`Q2&c_{<8+IPfjU8Wvn-0!4^E~1##)Q=Ahe`4&pu z9caj!k|^qdVlT?>)eyj2*k)S|Hvbx?M>^UfO^1W4ak|`7avDxi%L8&q4w^iBxWo}0 zEYdH?!)~^17}qb}6DJ-mz^r8a=GC7xbp%(l_170-O4Vl{Y&FmYEQlqJS%Z`pwdS`M zV(N#E(1&BVI!gMjZCmAW0!j|5XuCNTV!fRUTuI824uWE^S+TUanAq%=Tq>Su*Rwn2 zI3G-Q?m|#x9uK!fBzVWZb=H@$mV90~H!{B)t{|=xTk;3C=YM&&=s^^;6o&xy#cyN( zDonhTG*UDKXkO>y%5Bdd!m?}6A13Yb(({l~bpL2LYdQP|b6BN0 z`?2y_Z<2*-0}VKihxJm0#}fJNiCG`|XT4ig{^r!y0hh$epN(yPw@ab_Z?TrVa0GME zKnp&Ui~pG|c_sYct0k|L|Fc?VW=U_=k~dc=OB5e?5-kVSI4?7i|8Z-tM&Hy>tbA%n z1+$i*L(4;F##HAGP2|7Xl9wa(268wgX;-_v7>uy7!rgxyte1Xd{{T?z{ZwZ$43rub zIpQhmc8hu%6i3j2vD4yx0O}>-9fHpq6EMDoKUAn=VfHSe*jcDhzLBh&`36wWN$4I> z)EO|kp`6zV)f*I>dqCd5-7eJm;3+NBK&jDvA*h)Wx*XINq5cR;Y5A)~eF5qj3GIb$ zRgL(4K{-F^@*9M!jz&?L_AWP-t4&W^hOtYczBjw=y$+F-HfE4IgkQo68yJ zf|wdea$na2Ni4A~I52ELMh_-iC~&ChNbuU@WeSwLCxK3I1L`!+P#J(#{@2J$^xdwh zMAO#rd~83&aqe#U7By*V9Tje!k`dedL6?~SU+o21T_L7=9_f`@ryLV&DadRu2yxFy z1+;f%B?7x&@Udw2AhofDBQvGvkKLYFe;tC2nE%<1xApm22Z~K1Y7*m3Vx&o&X%e9? zqS=Ep^e?@~6$?gp9Kfk9(idCyq4)bU>=@g!I<`;Z#4(pkr0e4`mvcF5!ocdBOi2zb z+CXq;4uz#VO*CHJRSvSKB8!@3QEM!U-J0qGcYs=lD`32BQQv_o5gt!?;q=jO91p)( zcmqHc3dLDhzEHzKMT9yJ)C8fzpw!meG*F|3$2l2yC9nwx>Rh3gfci$Lt3au4@lH_6 zzWYG2JNFw8fZ{0PHy(nYA=D%AeL_i&3iTBH4v}aBbwsGGpqMJZL47-LneH#bWyh!} zR8Hd!;SJ*b^9mGZDZ0W@J;77Q*ziBQM1^NppePPvtk8a=1^O9}>Ad22N08F_dgy28 ztEAj9DgAdNlyR8OOF!$HKCc;Ra9YF^DhYQi%A%VPO8utu()|$v?T&q-hPw06jzQT> z6m^@H z&pvGPzJdPTE4xI-?_KT30adZ`XCgQyKJk}mqG;`hFri;`?ap}D{B_yJfk0&41x8^< z+l!lH9nUtrd*J*pqJ3{$LrlCo0SG#9hQ=H?Wl?ZBf)Sb-yrk{3;M~oh1uuK%v*2-o zu7&hcBW#C^i0^sc`W40q> z+L1AcA^*oA)-y#>`UFSBK30EXNGLw*7Sydoybie_YLG~rCd z^OH33^g7U^WhJtJ5%mf_mfxCOV}nC=nun@fxZuwiaREUitwnXQf}j(P~*JOz!7Pzkwb8-BLQmL2H@Yxb-ct z=Hu)%Zf~fS(TAYUhhV_?7!-%ufUy#FR;`f|pxC_zjAubzAfbCeDG9DYMhR~ps1ZWt zp*K*t>7Y1(2MiogWegMQSD=Op)r>l+hT^M1@lj3FadM#6DvCla##w>Rp<$GUQpmdhcYT-^-^NSzB>Pa>XDDNqqdz>4VZR zz@kE+R33q_kfgohQponJcfaA73nEI*U8eDxs%E*V0x)>CAK@U*!#js*bM3NdUYeTjXDo-uUPLD``U z^Ox-DVB|Wi=E9(MSk$W)wNFvlg>RkO=GcZGFc60d7N*;ImmUsx(6A=?+v;Y$F~#`1 zn$gbVai`VTqvWyj+^C-~2N9~~G8Ac4)O1j48Go@wm0Q#@i@F-rdRzhHSMYx-)PKQO zT0j_k>1kIW)r!?qQEVFd!t?dXH2PHFD#fvVqq-V>{vYbz1iq@`>>odun;snata?ubWn_Mn$ozE8RgP=`h_2 zDI5AOLU}dd)ALRIkchpQPv91PV@mGiPu5q_-Lj;M7Lv*z#?5#ygYw{Xac%x8a&(JX zS18xi-`t34;Q4}-wt|bl$aX!Y!(Cwq9YKcs{L3) z-D0TwK&g@FkD%1Z0mA!`CmmW%)ln1+ak22!hUmkwoW3_UMBmeFh`tI4_PnccU^%^U zlU(_$eOYtmhTW#uu{!YBJBXLfBD-_x0PaQVtDMRl^wPrWe0>enoqS9O>%D%a_mgQukZH)Tld&vciaw1LuQOCG z<%6=hbRvHF;bP;5qUZ;&S)-o0(W&}K?rr0xO8f^-u<)(!NaRw}eY}?AUiYRi9KHga ztlgnh7TYE62^HMCG)Hb0DVJm55s~9fVysXcIQhYj9N9CguZYPcnox&ftW$g zMpKNjQm?+Us=!L^OA!QOTqzcom8z@Wdaac@lp+YkxKix*t)Rx1AHt(boJ=~_$?1Y%q%j=EOrut#>9siZ3AR3;YG*UhCA zF^~$pqt6wCXe5S$WZZc(_B#&$bV%v{f^q5wM`%dlj4byW`%dDJq63Eo2Elm2Erc8ZvODuDYelrz zU`kz|nPOWyTb|=Gi?4^XM+Rc-W`ULXm8pjVWi;Z?km_c3{nYB|(0YgwJ%u1-?KV>n zd+w-u_8-)NlgIqn>iMqLLyYK=I>GhcOg$_Go2x_f{=M4j*{JmpBYN1+%GPh0df1~_ zJukj8&p|149FY1o(!>_GIC;Sf zR;o!$;c}8vfp>5?+p!zn4Y_5nk^4(O3bxm+r3B+_KF3*%s&!1u;}ds@SScd_W4OZ$VEhQMo)mEtW^2EjPC4hGlS`sal8l~(F`EhQMo zR!pRPTfaN`&ka`UJuM{|#}-T4+FJ5P*$=E#R28<=26w~YLq$s39jM2*%>2HUIzUSa z#<6vnW9x`J`(CnA{NfgaV4QU2gKIYsYAJGQ=k$DZ$5sc&j2!8o>#aBPiw_0$bk>Iy9-7{}IVkz%_;wfAbznthy=x=l+7 z2C<&EQFA=B0#%sL8jiHVz}$wtKs18kOG4{Y@BW+!6<*a+#3X-~pWd`SD!=cZa8(;@}fTN&38u<>+JK=a^w>nG(m@f?7TF+5PyW0aCjaXZIJMKQ} z&7({Yuv$wA#>x3HBE|U(!%gd7{=`asPfH0#;%|3SA^S)PU!C0EkMpu^Lz z<3x&&V6dlt{*iybXFc327c7Kv86J)Y*XHxTA3o{_cEip?wUl5S4=0F}-y;>YuP?Du zQ?-;}oYqv}*cz7eLa&wbH$oPSV~b-{G$JD%sFo#Xud`BTXj_7DY;iJR)Aje;cHhNH zov)Z$>60DEk%qgH4PlQC3gJyec!ZFE436cuG9%4#h#O4#IZlbM8>yu zkCr0FmEzTTG%|`J2*ZE+jb&EqLoG#&(lmyhl!REC9^R8xt&-7$-+uoWz6@?ZXenY~ zJuqvEgAeU}OM&b6(wM@z*sT4k|F`TfSQs`wpo({FrBO9{p)wosR_X>VB^akhl{&Vjom2FtmEvn541#fNCBU_hD@gFpjNqk@Dvx7o2mzjaF)i?(7BQ*s5@B{cXS5)2!5?T1qgEt)xi#J=+OC zz3(k6HBCzi#<9h#7uzbMC*JbDm71%i1moDM5-Gn2`0BI2jandd+dKIBI~6 zMtFN~cTlT`&5GF;_qa|)jTcLsZ`6vEUo-zT`sIgeOpE)ImJ*DUt92sf*On#sKC{6} z{Yy&;#wo#i$JT})4?oXJ?Xfc=5d`DdngOmIn~omQ@dGP0MoS6Cu{Beq{B%_m%(~r5 zRcI-}IJRbqlwUJzrgmIwr50%^!8o>NJGLJEXmZR-ouj1$kHBUb9l) z*HVIUY@r(sw73gTy)a^>eyODduk^eww5Bs9e2I~j-9Lj{*{02YNh_ArHFB*P7*1kq?EB_z@{IWxoW+u!s=O$SA=j;M!cR+Iz|NGfWB2)KY?RQrad`oY&F933IP{ zz)GE`r3AxTH<9BhgQ{J@mVzZB#waVb>rnF4dZnzHPgK9v z=a${lITKOQi0^ZG>8LjA^Ej>N%nYBqL@Ma>na1aOEhQMo=WZiKf9SK7TCSx8Bc($O z13h$oPJt7RoQN|^=an0;IL7*Xz1EY;@VQ5%e4p!zD=teJpMRsJ1mpO;Or-p_!*voX z^_rFvjN>ysbbVefdN_(vSJ_P)(bYvjG30Xkg|Ixs=M~`ER`9{r)~e;k=aE`UFpkeF zMauV??cGXE(^7(Q+WT1|#X8S0>)6XMNHBjHPSH}tDBkxqhq2NF6p~_KN(XztKzt=` zFjWR0q?qT)O{e+AcmqO_->~FKmYlgFK(7qYXIXky8#Zt6Qd&xSQmKx1wIh3-ynd0u zixK4=T}vDAB8DtiS%!DIzuAAHxx2BewKLTUS-o$3Nku$SQB_@DTT&a>`#BU9sy!Eq z3e}DdYNvP~Uly;btt~03tSE_dGl!x=Z1qr7X!m+>(Y5iq%H;Io+A3^HueN}I_8p5A z$E!Up*WJ_E+0m8iR(axox1caTov(Jt&*aM_ zCx2oVd?sJv3$oxd`3gTF3qF&t@Z+=KGx-WXE(<=Bukh))qj&yKV`uq{OLwXZe|~Ez zNEVlu)YVo_kK+Y>zt~!rb}qo@2WB=bm#3#xqp56f=_uA890`2#r!n|Zm<*xn*6!5T z_$*9gTSs@ZUq}4fkjB)Bb-B_(h_k+QseCubQ*U&s>Q)L@7d2pW75yQP@HnkMG*U6s z^-Ro9=d0?P$ydc!kOiN~SNI88@R@vtAD;!E$yfMv@0}bliIptg!55Jhu;!fEjTY_K zuhL|^uB@)Iv^-fEPgE8a6cwsR^@<8p_-u!HSg)v1IZ;&D5jUcVcu9FlaaE!+OjN%9 z;R`ijG~!1zbMop+0o70R3E3Pp8+3 zEt~vqVO9$7dHR_;IX@&yr8YE5xiKlbRA`ivIxf3ZXq1wgm|ZF~N=b#JO6OE&%z_2{ zu2;OEW%4)%bk_2F;)IqK=l8hAaV?V-#^o<+ZkR%j3P%1oyoJ#m(8u4<=*Jg`cK+rk zk7hS_Ep2T_$@s<8?R>|me~eCAzaWWBG^g-Dux|nrymtJ=%+ax>zlpR1tg0jf!>TgT z-%1*g-hpA2-hrenm_z+L;D39mDxOSKC6d*(b@43yb?~A<_kXTxd>pPZJc~nI4g+WR zIs`2`{jVPRMO@$2+}+%c2?*<$ABj1NA78uzZ)S&mfh+?P^d+03Y*y5z%?=G2*bZ#@ zxNPQX@h!a_B}!p-U`Rk>g&!~T^DLxghD8T;hs68WUiI;+dR!FMV4%z#rv35JJXD)D zKdtF#>S=3EHncajHP7>QId;Oh@v%VI(f6#zA2)7Fq2T#Fs}tpWR{zMyhdg-+j1cxc zD{k}Rgplu9T>`))y+Y|@<5|9EwK*M!eS?FmSd{0Q((`FJ*&jTxZbjTqxUByJaIbKI z1Yt6cZ2O20&BI+M91PSi`zfdG(>)CQNx)R3So0B|FKJ7@qn z+C6RnI3}TZ0JwdCs~-T4%Remx#H9v+Bjo%6;Ar>q0pe~L01ivE-p>bsV?Et8036qz zpBey;cHbEQ?hxR<7yyp-VB{V+1wvT;V>(6;02c#p;s9{$T4smg()t&!teytk^BPM( zvh^?1_w>AZI2f|^FKoX(8Y4iQ!uECFlIwZrP#+r<0@ppW+1+C#@(>3@HoNruc#RPt zPGNR;!{TlQaI+3lC@vLev-=`2uWMX3yX^nA1GAT2pyk@J*iGw)4hMgvzlaN(A*>#- z9hD9MM}0HGaB1cHW8jtpcVG+zLJp2>=}pAY$KYV-FTL$C^a(f^3@)Umk-9^4211mND+*#7cm??aJi zI2f|oWjapO7y;rGX7`ui&jc>_Fok0OpRGKu0p?bX%VwAD?O}~k8pG|*N90q$jlx`r zf&Ef8yH@~ny~g!t_kN8Lg*b(!SNsF+DUFTzcGKDiyMaGu=!?fOmHU77y@hj`r2p>s z7Fsd8{$Kdk!d-I?s_FRW(|cU>J8uv4(Bt|xZN?kQ^PP>2lD)YLk zo7y+Suijj~Cg^VFgk7zAxvQP83vXAGG0ref$xo7jy`I^f5a+MCO_xtTq9 zX*BWY(aG(b`Que=Aex>leM1Fm5^`D4X>JXoE%@n179a~ZDD|l@eG+H%Z4ByrEJI&! z?lW3dSjN1BxD9MSc$ag&ygt4NKXPPy&ILlT6FN<(7|y2(brjAg2{jq#ZwOV4^IV~l zIL{HP4re9H-%1}Jol(5Spl0I8@w#wU`c{FWRE~Ek&Pv~RK`DtJf~uC-n+)$ZPzrYk zs7i^w*TmirO4)tL@SXuxjw44d;FRoZCiZWjN+tI1ILC$h0_PKi8j8G{D%3%sCJ8kL zl(JC(N_kofYNEu>1Ep;6g?km-3~Ic@wi#ZR!L2mBRiMTS?pvUgjmu5!b)b%x*jqs< z8$UO(_kbELvD`3A*?rL99yh#aK#daIA3!M^ub9|(Kw)G-UVQ{g+1O@cuK~r2Nk6cq zs2xKTh03Kja6LprF4X^X@ZVw-#bNef98uY@fx7(=rguLTw49j03$<^A0oF|BJ()pvC?Vh{gBXKV3td@j5lwAa13v7@VbY*SmCmsq~Eysf8u zF^S4K8 zL3Nni?8EO9hpNs!$Wg;nkfR2gAV+ngL5}JREoaR`qovnV?St1CZ8+2$;)=)lgW|ER zDc*60$6i74l7?q{J@#ozw!z@|Tk$}6Jv`~qjQ^_jD2nxXiSVQ*mT(X@{< zK3ss7wB`xybF220O0GNMhFtQw|3R|vX+&+M`VH)E9?iWQGE?xrOG|I=%^){S02lNv zqze?y$A>qt>jM8Lqze_z?fEt^;o!5E*}%>Z^c|!*41ne?RvU^H{b$nfnS2kWNY7IAtE6WunlCVH;Lrxllcd=}g8qv1 zJVmq5-N2bL`2Qiz;S%%{q**~ge@6NUMSn<|gCzL>B0WaYgXuG?8~EHDW5Ys4vtQo8 zr&z&%f%Gwo=BU1bg9rFSD0`}+*~@P@UeSLieXOE)A?8L!SCi&mjF9E%u_0H{<)~~M zI0S-!BI$^tUn0g+^o^ucpMUE@YgsM z(?*(mc!AFihc`@6bSG)fFu?C3JyFpq(uIm%M*28KbMvqb+(!)fvq(=?^x34RDEbo8 za}_;|^c+QR!M_c&75xcm&SIcvE_3$)Mek1fBt>JdUQ}#FZ^7l=hWU!#jXFTZKU9aij+;dMfFi6+Mo0T+s>YDOU7}q)QYXCta%O64D7pA4i(6)I59RrEB{Rf;YrJzde*+65hmqF-Wqs};RFF*S;w2s-cHXv+l~ z&mEG?dthTr?`{>_H(_I*L94g1Lp=M9z-BI-g{X1lAW+M2Pkc1V5r*-wZTvi8H#geW#i9=;=rPKpBRdrfa0+WP!wCKqS)pX z#k#JjX@+81C?0E`q81ve%}^^0wboFV8S00IT5qVk4YkowPa5haL;clI?1hyFUl@wL zsN%81Q53rdMX|F{6f2yfSZx)>rmv_|48<-$@z{hFwaQRznu_;*L)~nsI}G(3Lp^4w z7Yy~9q24#t$A;Q&s9jNsm9>2hb(o=!HPrEjsxZ_nLoG1W5<@LF)EYy5+fdgS>Q+Pj z(ohc=>UV~E*-&p8>Ys-C(oj32iK-Ow^=?HSVko}Ot$0%mRc5FehC0&e&w+L%m_~gaHGW>_7g*;)`t^{@|$7zM$D7f!;_|evviz1=bg)#gGr?W4Y zsRXBq839hJFLyUZt?(~luw&LG`K!S6cVWXvE-u5*lQ$E&4o8k$phYL-w0%KP>J`q!Z z3lZEn(Z6EeVy_ujMx8i!c`-a%-s-jE6`T%v$Xsv4x90tED4@Q7R`+c}E{`r=^Z53H z=YI9hm%KE>3ZBmE#?Mg9vb|dh)n&~?gcF5{{0$f6tllY5IA*+}hJm^X2e!_`nfm<@ru$k%`nxTD9o^LFdqFx( zxAH=odehF{E;G6JU2vDtI6f;Vl-=`LoUE_G z1!G6w4hnXtDOj}qs4m6&bSu2VWwXlh8gW+T$%d+USA$aJ2?Bf5*>D#~Ri27s9^WCn zNW&1XVd5@cUej(~-t1kyyslljJLu@G6h?)^*5gRv=*`&ovmWWg4xp%>XbgHaz4%wG z!|0>HjTo*LPHh&Vx^E;Gb!#s8Q)(B17jJ+5z1^{QB^S`SK0avsGrq)kgurSur(TR( zB@7*%x3(R$;pFjFm>)KSP{p9AA^81k z;hFUmwcMmqZx)3l#fd&Cfr94}_%uZzv#~lgANinq1)DcQvFP5R^__4i-}eOdEDn`Z z&j@vpi9HsS$|)|aD2ZvHRJAGw^)!wgS*`xPP|U}tgyIrJvrssByaw>Yb0Ac@6~%Nv zDLj+zbu2+|a}=kSaO8LeV<(Iq7nA-wHm{;OHn+9Ar=hL%e{FNZOK8st!G~(-hk6;4 zkh1qXP=#328FJJ=q=>xWBTtNpM#yJqTK#@NYJbIqbSzDZDUU|DYCRd$*b7cT0Yo%9 zU;odAl)LfHV3A^nOM7p;{sT;{BoFax0uBbjI4@_h9@v*mk8Qc_H7mtsEC#_iFMhJT z?2BM$k9u&Um0Cy<1i?7Ab_UmO8+Flxmws%emWzyf71&J|SI(`i&6j+I>7k!4wmSyF zIJR~L*S=VN<~v8+Vx?{p8Fe!lwgR_gCHErx>iBcF<)AV8rTi<+B?hG&kYfK4jnE=P z;iE^dw^CabQ~DTJYInp$Bg_+q%RfH;11rUaCkA3%sXTDh_8p90fAhniS}CscFc9NP zaqzVszWc)5hpZIWM;M54rS`&~rhk3((cc7KJNlOvq zO6?_5OfN(2Jyq`bZ14S1WqqkOO%UTsjSwlOm*MTHFWzpYF4t1T zxKjIpqgo23c8~nN)k@v3rHFB**bmw5aUMGUwQH@^>spE!SLy(f@;w~$PS0X1<$v{y z7*`5a0k#gonPJH72Yh6u;<}q8#+4cgj;+1dw5|EfO8HyB5u=>FPU`_9O%F#kn?D`v zn=kZbFe+;)Vw9d2jh0ORaHu~K zHDmn#89#w6en{ZD2*VK>K92_1j$fZ2^wK|%Fg|~xr3B;ne56RR@1lh*JtJ3Jsojxl z41!UV=CF3CIyTjCBw#`jdU{udz~p(^AAJ>kBzy(Lr&RXK;EACq`R=c5w_Oqmduu%xr$- z`;Aq$yndvmj*%P-ZecoBr2IOzsZH!L{?K-_B~e(@G_^lwcfN6GX~S*Zh}P{KrbAw3J{R zTLnf6gm?O>Lm#kG*J&xiFxq=ub4aW5^0ySToYx%;HooA6g#?zDyG_AFaH5g>aApZ! z_`+)RhinfFpKCo6GfJ=!v9`r^JaJsbL{owX>8?vKPD<&9-P+ficH^~HDygLeL*rhz z=8%>R2TUsHvzv-Z;6x+8#F=xcwvYE)W>X;_Oa^ySMk+Y>x2Z@xyK?>{lZxxLb-_5P zK-Ui`-#PZrR*KIWFbGDd=X{`8C+pn|&Q}?nUHwU`kvc4cQ*1bXO*qwX*iQXTjA@hk z?m#^#C;LSH;z1R+$#-TF ztczFImRC<_S@=dLhM}exm)BL5CTk6&z5k7J<`aI!O-*_d%8}4dkG5qS|xrj(W>r(E+dVpo3+bT#>$QON>AOSnclo|HXl|r{Z9s4t4rsr-$}W}gOcGL9^He5#W+eF zp)9+Q%xpd#TZ1%rsa+0gJ5sGJt&I)xHnyKj=xeGIRh3oK(aJ*WhH|8+P~C?rDqJ4N z+vVJWq7<*Nr<#@5Wh>@sh2yccPDyQbX-QpaoaJ4?Q#DWJJk8^&fTwXh@$l=~c({UH zET-3?3TG89Dx}C_o|<`*-m%mC>>{Nw%SpEK)XtM^*V92tB1rfNK@E0aa$T^XyScHa zt2MQ9L1Rb9lGbLV*m4#(H!d-J)@45&x?0;$FYoGDI%jtIWXVpyJSXJKCHD@n zYM2@r)*rhDu2;YDz5^eW-hpV<^>F}DRb$wgbmeIbZfH}})0S#2S($2{-7ycFRiOv$ zQVSHyQ|2Y}lyNGDotzDr&x*|SG#gZT>bo(!!}#XD-_EzK{h}2I{P)#WM9`iSBiN8v zwGE#S{dTGJ86IvbxYp~j*GAbgymYTO?eg2XYK*0A4c+<$a+R7{E71uot#9bUOY7(j zy1B{FJf)GY%wCL^+*I9xGMSa?=)!}{0sFr9X7h;9R0m?il5V3VP3C96mJKTHrFd6` z$(uRtUAni+k_*_yEY;PqQpLLYi5_4s@&yl_tNP`4j+jm*>WWLMYNnUQF$=)#1ACT9 z=HOpNby197{9%@Rz!j&Grsj5}4T<$AtuWw=C^lKQ7dF0dsyj zPP!CYP=S~FHvn^cIxbBglkfyEucqTd^nC%$5Uy7vWb==g9ESsQVmdBF-zmT>PRE7# z_bp(qPRE7l+W^c%>9{m~yqF`oipTb@kRXoY+n4ubu+# zcHma>t`7ol@?`UG67KPo@;(njfBDj&F$x)8@A-&nD{!yyUJgPP4zU|p)F7Wta#IYa zK#+IJ)6#J*;$Mp4(Y`|zkV{F~((xuR|IoPp(lPWQq#t!oBrsWHZ^$uX3&^X!+s|Unw1!mA;AP}LF7)Ou=_0z2DayH_4!g@uGY9HaM|o`&=~4t5L{Y& zW7FN3fs1GC?ZbTj6L7hQQ&aZ(G8=J+0kb?E7m|P91?EQqT()#PpfO??C&7i(`$vI$ zJ)kdJz26SZen%*6%)e~7Nx;n50glVJ9l+eKaXG%eko3L)%xeLC+0y%!#wZWN)64cY z7@g5Xc1Q>&9U*pS0&`jbm(A|k8lyCZ+hxD87P#vI`oi+>>hoHSQONN6%m)lE$-rgS=Ockz58SgFYx>iW{Cf+Se`;KR{^jxBW*~&s z({CVtU*I}5w!d<_6qu_6xNPMnujuW-F3W8rbZyc4OnTGW5%cBm!0gNWbqEF*k}pRC zGfCt6%a=JCqcn!sE8b>26}ZbZwm-W!19OMQ^=J3@8nYw2e*kW0HYkMt?2ZKHNR8{y zZiU7ujoH&%2i*A@+n?R<0du3q^=EgZ#_Y)MW59i`vHjW2!#(W-cwZZ#Kf6;jMj^AO zw-~sT#`b6TB4Do6xc=@r{KfmxW23+bQF1?J*(T-rRF>qF~- z`As@5MBf%*-cHA*>7#!+lRa;591JEMA^Ii&b7DF!O&|R`1(?osT!_9)fw?*zm!@w7 z^l`g@XEYAel+bxG+tC({0V#p?3QLXuul8;_3rbr;8l@v$-Z|k zcrJBtvUlh+@F&@~ny-=K-Hp7pSMfLAb~-h={WZQA6XzaBd`YQyWDtrso$C3nM^3?W z+n?$CJh|?kOCXqcu(#^ONYCDQg{%CUhBdfQcg0ebyi+TlW z-TiA3v8pK2GfYc74+(|doZSBCn$LGS_w{5SP5JLfow}KIlkG3ZJKj(|pg7&mk@uH) z@sJ}gX>0=J2hNGq3k`}Ig5N`hcZi1QNfl)M2lt3k=-oi^0xK%-Mg1C-AHwuUyb;iyi}#~~`st_DswlQTr9X(I zg)sdJskX$Sx1Q+d|7^aid~@(fZw_P({4TQ;HNtMe4DkG)0{|P*h8dVfjpNLKJ%@rFA9*hBf;OA9?Nq#rJ;v&W2YZDdDjej>a*>tG7jl4f687eI@9; zwHM;NZuR!PlVxxDXg?3I$-Y}`gBG5W_EmACdLoY$@X>L2uP_q+?a=SR4I zz4CQ-C}B3>A1es{v3B4es|NnDp5Whs>R(L#%UAzcRMw+0&M(#{$c=ND6BTp4`nQ7r z;OSrJ>5%1(*}Obk!B?q&ECg$m^~Cip zN4K#(K&du11=Mvoa%9K6Ye7Z5IXE-R)l0LAV(nGbd4^hNsA~*$o1yM7)XSihjWrrnAs2>Qm8z|PksE1xezka?qDAwetHv-fZLLCU|a-q4~i8u>Wv2VZK1}1Vy_tW#(`pKN4<%lSl^@GWKexVO#^kYP;pQf3B`R=*nwfJ z0rf4RszLP%RS$|SD(cM!wMHlojw-#UfI44z3qh?GstMF8p%#NWSEx2n=LppaiuE$; zRkkl{z^CT)Mg_6O_?|#)RI7*0D%QLo)17Xz@8zC7?0^|NS(;}OyVZ3RJeOR(i5@4` zm8{qbjcVjf9{&z~9 zrMQ08y{~vg+8EB^LZyQ+df*3+p30h{Xzd>1^*b{5&KR*7rIOKog$|=qoMGsFpy7TT zIo{Wo+az*GF)rN(^$x1Rh{H@iXIaP!EfqV3uai-PWv( zdp)_5#c3J4pV2i6)YGC1C)r|@{~1^nRTe9XS^Rt9`C0rwPsIz+mn9c_XN*qt7LUnV z2qPi-l87S{Ci?{u$b`uvnq(&QVTYF98TGxzr$FWGL~rH%p1d_Hhj^)-xmSpvL6bKR zhCbDTYz7sB_lDTPNp6<&KLbZ0l|hPP2E8sk$)H7;VD&q-rf0n~7Q&^bo>Ah?!DYc+ zX>u^)n~AvZw5#j=wKFzho25?H%%U zrH-yxV?%p;M=G|cId)caR|gyG|FG(Eq|Ra9OfEw|31!hl@1D{S%6f;@p! z`kEBw=hv#tW|^&9z{PB~3Z1nkvpX5`-<0E9k~sq!mZUQns;ZH{MQGMxgSXiB71afx z_7Mt%Y<ckBkm32kY`XS1?UQqb@ zg{RUPY_ws+)aw86>gBxlRKvRS%~jRwFdu$BU|MiLL|^d`>7e_Hchmp(R{vLX_cr?t$XwjXB<_pvr`50aYqg2dHA9ZU&`fe-7#d@S)LV%2RH2%1=C+$rZ!yla9rbw0FiEIRoVjsl)Jx&a?L4F23Y;ejg=BbV zgYpBnq*U!dQEUg?OjLJbCCD*%D%+64WBrSIQq7#t?x?OO`-twHgubvA1m&y z8dKT#d}ZGg#l0odqyoadWME9RQ{Q^1;Kf-E{;RF&g}`Znaa2)s^i=EU`B^&tWbcev z=rK2Ft06PSpE&v@Ri1} zqGodUOZL^A zSJU@;-$y-ZlfifX4TTqM&%5+OR7!0qpjV0FJAudl7X5$dB^&D9eM? z1NfbksG0}3cO~x1<+4O%J4=qC_&uM$XXlS${AB!Ih~L!`hf^Gk#b6|R%Ps`jsmO10 zJ?p?Vzv4vHlPuT;HDoJ(;7ahFPY7C9bCvw&o#(f{+P?k1t;h)6Mxv@8=6{I){?3_0 zA0v}{YYxF$7k~7w7~R`BrmyDd-sHHxn&*3y6Z>lZ*qfZ(H*`H>t9uv5dy~^}DLA>e zbO`>%drNogE4#3_bXZ?m-=k|*0TYSyK2&MF+yZ*EbiV$-kpFv2_ZH8p*VQ~-y$*$d zja`v1zf1OgCVX689Fp23YFwDNE1&+CHpGpua#leByTUmXIPg!u< zsoY&upvg7gjC-l+)$0=Z`Lr7Ibs-U?e{l4J&wkdD*ZvrO=gW_e^WJ_OjAu}u(>w9w zIS{kd+97tOeD8uaXXj7zQv3LN)||7(OAYaV0r3t~oalQ(H{?X$qrYNX){ehZg;+M^ zK`5IX`H%}Qlyl|YscN(*;rD19IbMUI78{Ca70X3aMcIY>D-G{@Lve{w;qEik!-jg% zP;VLPQ$yvV_9)qX48^NE#VZ1(eCEdM5lK-8C|=a$c$~c`+!{mu$WZTqQp=!}+m2s3 z-d>>8f+&}?zY^YPP(Omo99gthvD|(viX+E68E3^yfqFr3>p^`fvcCbfuTW2bVhVD+ zKZE*0sCPgq@BaYm6C8fvm6+_{1{(3T zpRuh?9m{@#0gt5?eB%+q*j$9I$PHtgniut)oYTU^d~*{QPvq ziEpd>;P@dN{>L>gbOkqCBGzu%QhHw}_F}sVr05J&0v9%MpcC)2(Zarjzm0B(`JKi93#k@Utw^HBJQmoG? zi@?)oJBzIm!pHkL`(5z|D|L^S5{#3sT||nljAih*2UqT6rPu>72*$CsE4VgY+rNAi zJJL3{nVXZ8&0=A^OGSAG39gM z4Vgp0jYgirnQdm)ZYATb)OWSiAsHz>RHXdUd3)wfuiI@kZ`V?SaZ-AiNCjK2m3l%; z2?jWP-&=F&wJN%8hU0;=w0UWFb4s8%5fkjAm@YSe^1+ElIM1vib>+54ZA$s|A%=Wk z4|2it{t_Wa^aP&K9|exB&ns?Pj)isQAKt;!dWaE!3P5--89ly-+#*Q_-9tX9D%` z15U>J1nP-994eaNaG3a`9S(<(e22rtk90UpJm>n>789T6aG3ZZ4u?KRf*ii8;{6AQ z(NjR5KXy3u`TZbgA~|~p^JhFcHv}=`nXbzn4%4;P;V@mx91hd9*x@i;CpjFZt2)S; zNL!!ibgAlJn*){(n4JdN^5Nh{BiG{0+0wA-*Q~HLoF9l|INW1P3C?Mc0N3_fu^(M< z_u;13YSU7JaoX}|k@DN}P3vFbSDr36Ex-t~^p$d_NO~h8GN7TXgy<;&w)}tMx;1qu|9M@b_tNaRJ)c^ z+r%Q;Tdg@>h92Gpjz+@uT&tzViWK$yBC8%QW=10_m(WM`-n_y3^MsZ<*68_DRy}O5 z(TI2jYR@nKv(oDMR7;IhsR+#QStD!-Hg$gS{y0;DgL!#`AQ-0v*{0nw*Ge6vr354L zlQc)=q2FUOiaxt#%J!NqH)d!(1tvEd9nHbE%pN5gIfQ2%bq5{$H=7&hYN?4v&t+Nl zupf#>WW)n?-WNMPZ1wz9OBH71D*Gy%tD{~$72hoN3r_AuAzm;}uChO~xjO#5izZpA zH?%Fm0Earill;SpJpgi*3MJ5IH&@v&Mk8}@rWdD8{Nf)r6^Cg(lQUAmF~O$d#xEZk zIoYIQnwAoblZvS#6>QyB>J%*{7~t^0qmzo@yL`us9?nr2&iHN5FxAfa>v}CkjHI2} zB7rG&)6V<$*=p2_TF*376W(|I3G^E$h@ROzt9Q3~T-u*warL!{^Q4mT+PjKu` zfNN{`?d6XhRBB3Rgq9MFQ#xfL<-5YM+e(eqQi7pTuS|1PJ0<5dhZF1%nF_bO%E8Ij zt1r`f$}`ecAyR&=W3OIr(shBB5{#3sq)7Sc;<#+3uF+D00nYR8%9;xL?53g;oNTr3 z39YA6r6SPcq}Pq`DU*?qPyV60%a-XDEmf6~_UU5FPy3Q@Uvz4fN&DZmlwh2+SBq3I z?N(~%T@Z;N81}T|*}(RPU-S?u4P4#SfMY+eanK95{m1rNqqH7kq}P(^7-!~64>WVo z^m2k64v5}190tRoOv9Cqg3y+O_d8k?{E zk?S3qL#_#8WQPAuheM~k4F`m`U>BYlVmj^Adu)kiIng2cYblkbyliYO9_TXy(OAsYJ${f#?WUs6|=!n{RVUX zvDDB*Z7O=Tp4loDfqsMY99v%Be`c5GtkjKKYEDMl=ZciyZ?L@Pn6&>|O9{qF`#h2I z)6PEAO8rSo3C1Zedg!Kh!yJ1SNNv^}c2q=axw4V7HK1=zUmC5U7m+U&<_$=?G zL0Z*;;L7Al;M#d6eYR4C%m4(zI6l)u*XNVLu|6NR^N&_ppXX{lCujJ4ib(nSOrK9S zK6h#u(tMJnjCm71-k1mpNj4_%*|M33)t*`1|VS)W&GJxv)tH)r_VWPH9-O9{sDxh2DA zEA?MmN-&Pk^w9PBbjRl}KkOK8eSTT%IX%PY#Th=IZhZcimJ*EPb8CjrR%-v<5s4re z$7g!z`g{gBwhjK|sheN1J{M^{XJq)iM5I^+IXbXzoMC)EO-l*J@wrW;f_1}6t<_S3 zaeStSuFp$F&;C5)a93b{s`V@tpAqfdr#Wi82#(9`)DYn$DhJ28pS*#~!3ZdZ=d@IN zM%p_NYum+}vreyUH)(%eO9{qFd#6YR({82yt)&D*4ak$oVrb!K;s2iWq#{tfei5uNAP_NO0FqQ{ZJQiyO3_R7P3!h?HLsSr#c%7QfU| zf^o`XnMei8!b&}*r352>Zq=O3vY^jySu7XLd=_Rjs7Kb!JI!;GUOPQvK3rdcl3o;>R4?{FwSc8St8}z`mkwHg_Ww*Qi5@8 zadvL+{(nAX(=V)4qm~kkW9w|k)-m@ES!$)u(NcnOY@H)gjLuBgRa#0gj;(VYTfe>X z)@9b#omxsTj;-@VYHw|8{KefbTB+Y@DZx0lRynqo{P^q>t<+muN-&PC)gm&q{;QeSE*!5|iQVD^xIIK|L*f-UZR@YI}^h&#T0<~G~nj?hxXsFu6P(L;%|GdNde zaPBl5U(at1hyF0UWH>(NUBe-U*SS*!iM>1Vf3P=bPh7{D?~JG|-^)81d&~zqCaTXd z$Y)5L=*Gnjt?l_)qh&ohzo38VtkFtZf8HUR?X1yCT7SeLn{?J_C7mTxf}8edXtpvn z9q3j|+gcl!1acQ2KMDL&nOWaqa@tAezIS}wq#br?@k?Gnh8#~%t zTUKUMXri;|^y97Ca(+}{QBO-tb62>h8GsDc=?JS_JDtBRC6F0Locw=EDxjcy&o>Ws)D#($6R2%Qo_WBEED3xA+a2(sKEH zOdOvqsbmS1G<5rk2!2UIf3Qb6=tMZK2V;VtL!q4ik&S*nQBl*dq`9=CooffBJzZV+ z_J?XIz9>JprT7{ZNcpVA9X)MLQc`|d+iYcp3d9By84~Rz zF(jTg^;n_mr(4C{D1v9AAMWVVU(<5IZWO^a4J%Mb&I(1R#SxA+th+#`Yy;dtVgq0& zkurMKIe^X{)ZAkYiH%Bj@)`QGFfo{Ge0f?Dx;xUeWy6E*jEhEx#J0sSyHK)6|tG)xHYjc;3P9{mgh=3#E@d0N- z0gg%Z>ZSP9*rEnZSp%AlpH6&0b11;k%ub|V)h-}Rw}Wt$%UIp7_B2G8dKcp8pV^FW zv2`!**Fpv+%tkuMu_D#CUmIzNFbgik(XYGFel28R!fd32w3W1xB#WJ_DA!Up7;UA0 z&&}^z0(`>eHMFMmXWs&KImiu|46vOh8sNJ+`Q^Eeo|Ks)7ssd9R3vMQ%h5lo4H1e8 z`Fg7A30w3R6vh3vhEz*O*HWw6*R@~)J}uW4pVZRa5)9J%(ezSfOFL65B}u{7nI02J zRa%sjva~pQ=6~ui_+`z4{LC12)gKn)U$SSDnGm8)$&3$)QFg*&{EPc+cE*KhQ!<$n zf&6kZAmb~c{s=f7Uk$D(t*OIDZ%t7z*H=T`=;!p{w<35=M6-T9MQ@3VkM0ii?&gbx zs)JEiENYzAQNB=`Yy6~Wqy8!+bys%J<$iMhHBU!-OY7;*cR2h1GUu@qjvF5fgdKg0 zZ~Wwm1(O8NZ}H8MZ}FWo%JaCF4ny$GH2&sF^C|kC34cq-@-4on({OQbSV{2i0A+cn zVIJ1gAJQxITr`eMM0Nymlgs{-b>VF19wUoGaJVrGH~@7-wv1r z+)>QLKnT;v`_l~>xJ-Sh>fZesxOj%$BY=Bj0JzD(?TovU!4T%(;Q$m50Cx;!0rhW^(`+);}|!U)LCr62kfyJ{R&1aEbjCW+(j1X7^%XzNc}f zKMm>E?$#KkQI8*K{SYC)$-tp~q~#0m{J#j?iM&aU(BHUqDKJ-STz~#;&={pr`&Kiv4D`d>MnvKbZ{xA)8$efpdXrNymkZt80O|EFG6t z|ETZh!2C8H7ozXaz-&#&h3FfMPG%o=GzcagA^Ii)6Hmvb>5DKVdD(T9Y05~x)4FVY5_?U>`aV}%l_&d#df+DecFR-S zKW)dCMjjnf`;-kK70iYc}n&W?Np~h1ZET zc9veUaZ}$V=L;2mV*Bd@)%|}9cNsnVpM>Ke{4E?g@&TMRLY3pZN~l_#`K(xuHy7u# zgyQqj%Y|Btb4sX7aqh+um5)uFDLiH<+g6V3kku;GT{t%jbsx?RLOqBxuWNF=Cvg6T zP|x8!N2o10&k*VjoY|UlymxV~6zU_K%Y^z5&c#9vLT__|P`iL)pOAySoNyg06yF+} zAQacYjumP&DCR@d8v|;pP~$+IDAYtyB|`Ci73PiF9k@!UIC#t@wL9=kp_1S+zoK3> zsFQ@M2h}CiY*6h&@x7iiggOOOi%<(eEfT5;6!SXjmCc-4H*;!iPVMyCx_Py+xpS(g z7uUvw>lMekmp63E3T&*sBi7b|XHvRiOB+&+i<`S+sm0B)?w+oehQ{VtXIDpOb62Vr z?B*2>jj6VkV`A9fxK_rr5IPuI|>3cFN9`u_o5q4G&ZBr?a!8 z3j(o4D@AQnS1Z6VY%vc+2VCx2-rC(9Yi;L7TDW=7dyK^a%`Gt3(*;19J_m#+N}Ain zfqr3a4J%<nj2 zoCfjEt%k_>)MEIo@(d#K$rt68svj*KJ?%{~6istiS4Wpr^rqJCPDDzBVMT5Tw8N$j zv@zO1Yf@>z({yNmQo9;Zol$^z@+t;--kL%a)=iXYK~qK(ZbJ13yKylTFNc}bVtTHf z_glGbANW2^YOylq_XcUrQQi1p(fDl_k0`aHbu(i-U}f%-S;~v)$(duAz2J6tz;9`h zNKX4Px*ZqSR|b5Rw&Q!$undiWDcs@a)P1=hqHi;sQhx_Oay^c?9MROqlxlj1pR!EF z{|uMoP*XHTapLi9;rUYs&Pcfvt=+ymZO2xzy5E=V}qhVcqj9u!}a*DlBB31 z_1LA^JUc&*&*u`2U4~xUM8$O+IKjfhxZ!M?7iN0LUbQ66; zIrUBS4d+}q(Kj+5|B`^$_Z<@xGL=7{m-XYSdzr@tC^NIC5k^uLFg5 z41TNLaH5HggW6AG*?+1A!2VP19^3#*Y2lUCUV`Jbn8IBFiVZDCuEJPPa^%x%Dt04c zh6?X_P)f_Ipp?X0pmvkkk3cDj&q1k`mBSFDB#tuFcti2JNX3>K>SRML1GO`b9PdJ$ z2MhH*oR!2aprXRN%kUlq#hyCH`@P}43hGO+arI|-{{hA8z8nu9A=di1bF4wK|8t|Tj9}a;f)zK(w2qK=uVb_IzrJ?MkEJjhgf%h*# z^RpDx?T0YE&k6DnoSADZF@|h<-$h*1n+l!O?T0YEFA0)*sdL&6^!`=QL{YaN!t}BZ zAs_Z1;_d$srf{jj-ms=!z1-QmICfb7mGlThad=R6f*ygXk#3q5Qr4bc$Z_(9rJ-~) zrxi5}l**f6E`k}VTOs8e-xGHx$n(oHn{HK}L{YyV!t&=sMC$dpucezheJ@Cd=~iCI zV7CZs4$~K4^1fhcYu5sOMd7n>3DMTj-jvQ>(YPps)z+H9!?i=fgmj>>AQ$&jW94%B z%c}-;UDn#(ooe8fnw_6ajg9K|{Hg4Y@w@_VPh}CpWocI{E;nP#mXx*kEahcnbEP&} z=3o2Qnef~P~ z1S>U3O9{rYHCUwBOes})^iO|erRHcU!8oseazM4O>Yn_!=A@PC)>49TY%vdPx(@hw zMqqny&QBQxpd+c7{``aF`JJ3XZNbLR?6>;lqbPWM}~?mrk8=6j##Ntx(gGG#Fqp* zHP!!f+0qYq8J!O^`akhsURRysGg!9ni`~0}6OAl}4pd3+p}T5PaeRdfG_kuUH8XHa zl~YK&nbQwPJdPQTKN_8-rHDa&4oFFzlo$FD<^AN?^@1RcO|!HVF|O1e;6x*S&HZ58 znwzby_q7x;Hl^G+is?d11J?HxJ*VKz@ZxW79b@$zp`9m2z2G|z)J~y#_CicFG74vg zLvK6gM60Jk>mf$z84qeZj!b_z@J1t?2r;}_HNDH~@wdSyM(LRVij$#CJ)F5mBa?Av zc=Xf@ime`hLu+D`o&r$+z>%qEA8@0Q!*OO2oNe;p|IHChibO3!hi{)i(}4|__R zu2DZv#;rfU(RzqcdM1H-8b_ucF0Vu*`8YE?cjWhxjeec~m)1j!(!=t26i23>1Hg?& zQ28XhH0~5+s;_4pyL<##ujrd*7uVS0ew|bt^dWcbaSf6hV)pM}u@!Q4y zZ=MGsKYw=Oz=c4J(!=_EJ&sI&V&K{hJf2!LcZt;nGcUTy zQN`P!rNDqxux~kp7}=zXabri+A{%_4mue|uT&Y7vif4wQKRF2lk}q|umSU_cbr?9& zNF7BGe)8kD*IKF9wG=U~R6aPiHRbMh&WTp)Ko0B(#JEzUz==jqWh6pQY3aLGYQB~t z#+70pqPCc&)YyXOp0rYzYbjzN6?n{!B_53&%`=WuJ6n(y$bJb=YN;c<7^MQ^`)I`5 zxrBG_fj1w4r9Ks2(^7(Q#`hydDmdm^sn4~PU_{ZrJ86Yto%9ig!&IQQu=+?~D%=tF zC~%??uAfopdv}b1SwCHqwVtCg(k1y|<`S3vqk70uCS50KDV0~jxdeL^Tjx2Kuu^NZ zlwh3N%f31qVIRn_-;yU^v*qj zv!hL&|FU-b=XQJMW-Y}Gcdt`8(zELioJWf@B}kv$RB-H#Mz~DG zTDxt_tZgGfI#nmo34q|Fv_T-JbbHEhQMI1gDA=XRWNg3y=7Fr{x_I~t->_2trmBK*Y)x})y|l-mm#oyGyC4!lFpjMgz_sc6>bkM_TB+l;lwcfN z7#<+yrz^3t@p3DL6(k9QacmViwqE{E(JU*qR7(lQu@x7o7|%Es?tJskR_a??DlW0X zp1+tJ(?hPmV&c(O>Uu3D7{^wLNbN1!Faw#h({5I3gO(DElde+7*2K@}G+3!;wUl5S zTM5V39sl~~$yVxJEhQMoR+(e#-R|@1tyFYZL?Q^ru~iPPy<$D^mh}f)sROl?U>sW& zBIWnJmpt{W$E{SMmJ*C(D=AWbXT(jotyHy^5)5#jhc!nX(tE8+@S~BvbnGAQzPr}; zTHn@E#JGK3l}PQYr8eF==T$3ppOzxVm6|S6zOA|c-W^j&bPy8W(Ne^?Qq|z7TqUr3 z|KHtXrS@jFArRwA)qoR?3}+<5Q7iv=nU#ubDPmkHBpyiB2|Jj!=mdi zKEz7-8*mciO3ehvUilu7_$CziwrYk_lP5RjU8z~%S`V)t`LnyM)cIP97*}exNbQ3& z!?d%$I^0U#uce4l_TSSSVqHCRz==lu=tJI^xWbpg1J9aGjEu1I5gY2@NHo~X-(7DH zHoLiNX=^(cMAd4h{}Qs^z$+uxe@$4{bTVRP5}dEM@5+c(ve{yl?0B`WSQgoAu}W5N z{FOyETda}|Pmg|$I5bl2U{v1KjQwU7bv1Nh3$O)zgBNf8>TNEt(5o_arabdB3yaY0 zr<<3{YvOe^WffJ$mDA($bY4+GQK5cnuc%NxwpUcBV)BcNfG!ZW@ zDl`xD6&1F36cwsR`ictmGkthneX)^DB;#e%%aS!^<%u|++9RlaWl^DiZVyBY;ds-T zkM3a)sD@=m6feM+l+@K?hmhJhp4=-cG!IG@73ydAl)OrBQK6A6Esxig7bi-qs;lU3 zKu$lIS5(;AP2aKKlsxQbC6n>mvWl{jL`|BYxkuoN8o@+myrQ0huMw@cG%r?19@YRuu1zC#x!IN|Kc-hxB885a=o@ z^dIaiDpb#nLEK1|C*w7xiRrbd33&B9_=umj-ENKYNkbzj-j>zXOs|lv^)>sB+Gq4K zoh^$er`MKLl+{-F6?|B}gZ>IVveHtBn^!MjroDg<&56R9h*tTe`-+Yg48tq;GprXG#RfbNtV`CR+Lgwo*GmoC-)sF~`yS7W2J zG@eY^nFAR1VCGoPV@{)S=H7p8!=g`j@+rycs2jjAphU$1``Hu_x!x-;8WJCovhe(f; zo?f}NAQ^y@S6=yGdUbCZ92&)h|HHuKv7FyKf3NWVQ)#p^5TYpU4bbw^uJRH*Jg z>Mm4O0~s%vbg1<`^lw1&LD#_6DcKONZ(&N*Xb1VAW^J@yKggVr=a}pD!>oL4S(i|n z3j@Hr4((V#O48qGgI?~?CBK!H$IG!VVp(}I5y)lrKwY3d`j6DH>N3^;r?@wPud2G* z#?R#jhz#DKs92|q1O%hZ2#CtP$xU(t35g7X6=e(%8G;!=EFu`Fq*olP)wWt&?Q3hT zQ(IrhHh_v)2h`eX9ZI!Y6zkYmgVe9k^+ zujBXSpe?$TMqU4mcm25rMM5H!#JF4% zArVSqY%YnA2qodUkqufE5}_nK*Rer~kO(D_v#>%Ul!P86ObWUlgM6$0&;&aeG~6DZ zN|aZYrYcHG%M;lzXjqdSrqi-ia&o#VUFkvtFK*cIR3bIGW>Qsgm8aSFLWd14O_Y{Z z7pJR}#jfTHeJ^_0*s?@Pbx9TH7Z+>20Ahh_5*4LWN~&?S<6_;>-G70bN+v2RDpJ*x zN_^cjQ_4!pDmtr1OO}@4dMsHvxg1w=W|Z|C z;J!|RYhS)k;!S$EibzdKYeC8z1+D19}h|J7T;NFdl^Z<5>*f2xR#G+k+5q`sqQ)A7tmh?~xAUF2->qaEI%a zjXeC$cBON?*o(NK`5|;ocbOE?&VJC`wW;Y z4?+QbTo$7TA%6(-w84i|g9Es*@;e*2lY#rT#&V$|SNVM(7}twXN9FfeAl)$gnC{EK zjpzdcf%2guI6}TNfeYw(o8<>xMxUh6tAF)H2nh9a) z4nw~=0=P20M#yfIE8QAkW@}uoa%O%n0_HnGTu3|p88E*N;sWieAN0Kd%zHsxh`xL@ z>b`8)2)XQI^hk{nAWmWB!hT*Bz)86T`Z*swZ0-b(4?`XU?kkP$XgnB%HPn%M9W_@z zSidzI15!d*KDZP&3%IK^wxe_(0Om1`>nPnfHAW{JT7D-Y@;%`C>NQB}%T<0Ofmxw( zUOx|%^I*td3d|irTu3|kEig}MTu1rXqcI)jV-zAk0&aj_dGDzFCId55<2p*WSz|g% zcLpLa2JQu)zFhs19+E5X^ zZqi}tu14eozzsW6p|GBxa~xU<%xaCxRnE-sbsD2IhWGPni2N~d|J2xy>i1~8=QJ1x zLr3YBX^cXKr+YmjrvkS}WBJT9SN#^_y{IWT7;>e{@nD(82oR^Ra()T?Cg3WLR;V8M zmn+?00`s88<*#3I; zHyBd6aD6+8JGzs&!cO4WuTRRt4bSql1~(!^33{%rL)WHn$pelXLB8Fc4NZ=A%-rjYnVN?b{X6Z)XrY6K7;a~yAVock_DM$ zUMe%GAa-{o6;1X^MJM&D%sdY=KQk#0zw%>u_b8pPwW)h)(bi<9Z9B+l(bnzBOmW|$ z;=bDx)3DDoo^Dyw4;v6)Y3lhv1X;qiN9EoTupLH1jyYCnwi{BZ34vhNoe_2Kap!KiThH(lU{jIG*4ca;G1N5;_viWq0YmZ z!(pEIB)J%r8#oiFJ!Ohwk7n!To-%ZbCTc=okh6N#P2o7xDvD@M1KiS~e4gN+gfQK_ z_|p53zLst(jPs;Jm~Lf-w^O_I%!2LQz?#o3qy_2Lrow(RSwq+yntA1+&8VFRaX87$ z9(SAS?@=)>4ZlyVtMj=NGtpY#i<>dWrCYnFGdoycbGCD2J{d=zylQrmP&kR_82)D% zibIvHqFA;?!i)6Hcls{GF}=IfcXT(W@5q9c+SI1P0?*2Q5Anh{^Q^K-|9};N-{tw1 z(P$n`G`74znaYY+rt+*PUhpXjgk|(N{8mOQibjtWUL@Adi7o8z#9(l2WY3kly=PuY zXAW`=nCzJ{xj^wsN4;9vdQ@fWIr%sWaP(6R{$S`-O_GgWQOA1}2yuMF{|v=AlvRqN zRY~Ew)t#6&8SQSz+$^`b49OnT*a4D>K#oS}O}zW_og?^4wHrX)pBBm6d2d@l>XT7 z?81iXWXr$WoBAX($^2x|_8U`~w$!L?siJMkmVdW5#lY^BEPDLLQQL~PrJ}%orI-cD zq9;6NCX&ol8ScJ*zVNG9P0}S%hrAs?N7xvohw_4VKp}k&#jP#JJ`!O zFJ#z<@|@$)3Ai5MhFKs~Q7ei?&6kBZBB;PuS{U+h7>uGgF3iLcm6uwm+YMoQ&lF_; zL*N_fZ+TAFKTuk|4#WTarKC8Y@J+$c9PZg-H{+TWYr6QtQUP+v;Q;Zlbit^%QqQ5222Qh1&*oKIzb z+R=qly1}F~`!T0BAL)1Qfl?Rei85X8AsDszUZy0@S+oR`6g?|SBo{1IIh_DX)!uke zJ#cW0QC`@D!0G!ql#z;}kv9r2(j(95fyt@I$ZjhSSZc^fJiX=YLO72Q*ty=CUy%GNnNmf%>K&OC>I7wU|#V7HXdRfS7qRN->XK@~2C2{q$R@TgLc zS_tZH94e!$LAl``5GtdJqVBtd7a5l43`5a(8`(u&$k>^c*5SH-F*PrJw`I*Nr}?1t zmNOID{6E3zMF7K@KxKm0Pbw3qf>LHygL(*uGMH;SZg?1kGFVYG_(9=WZDrHW*v1Ul z>H?k@G!+TA)F-Dss>UmST*knU$vJ5pH8|j_WAa=N=2h5aQ(*w1vd%$eor6n>b1sB{ zzNSxSdb*OXyA<9se7gMz7^EtR^RA+pdqt%^inFoe&Gsmcdy03dM=^tn2g2b>lp7ug zp-M?nETzYU7dg0#bMVL>xapY9E9hl~{mw$iijR6Vo%uMu;Jr;R#ICprK=H|v&Ybo} zdQ*GTx^$-6E4^y3^s4=(HwUFR2c%F}vCEg!Bam{Y@+@1^I9|dh*eA|Qw-1ETGV-YcIUTpbda zkGkEXp7*FnK)r;+4X=VwMXe|n^|QirFRt_olQd?7Q53tup9M`6b-N)@MHPUjbQ9rPK{`ygLdqS%^nBbA;I3d~&$)@S(i`5t3KIjpl_8`@J(h0W zSeO9E8}~kL?&F^&-d&ElD>igz>^o@^o4DmWHnS}@Y-_CL6w(d#Xn=SB)6dSBe zj}2B?O1GvsKOtsEs&E|Dkuz90q=q;5N^dzUkWl9R}TMxIGJ$a*?x^2@38y5dX%J zC%&}y3-u7rp9}RS&fHa==g|3%8me1B5s~Ly3F@Ch{TP%=<6cn8HO~rAT%2`7K4{f% z6qS#Nzu_=9C37{DlYqe}iv8vz98qU3&eZLOFum^~5_)I!a%S8x&>69LkTdwg6P$ia z20H~!GoAd=ED1+6@&C~{l$N+h6@pUff$)%|!_rg8Bae#0iOW={%Ut4cxqv#M-5=wK z!bPXNni*d_Z~5|hbPd^D8y~ocIE393)xY|L{C7T*-@DsCOtiOOatX)oxZE1gNOJT} zR4zDqH-MFyfpQtYr8j@2TkkAfkN?snGKcL3Svu-7xE3QOnfYMT3+omqGhfAyb1E`# zly3URx@xzRz*8SF6`8)T(Y>}Pz@2uFbo=&-39ql+z4thc@M851L{;YK*D70&?ygd6 ze_R}Lzqj^B&>p*j&7~sqWku#6$;=Z-{J6>tE*mAK$_bICUhQq^maX{{wyphmZywI8 z(wSqPgh+bRt4&kVfQ~OoG>@%B|5?edff?iXDraD%a4SEYoe9fn7nY9NNylg}0Kgt6 zpmgRa=xKgH83t?R!Wvhv1?fx-t1x*^`z{>^AL8luXJVUX%50;G5XA(8SD>6?$E8q= znI|eT&$7ti+)IkHGSe$sHKEtjO}*3YTa)c=6%(FW`{CXmRjs3+)+ImT@wK=x_0sL9 zbN)~SX`>i>y6LxLHEMhQg#By3pUk{ek$IX!%4QZr%VUY;dC7CR${`n7ylq~BBTsG{ z6?MGFV=wQIUXds6iB&AykfIiN)Jjls!EN$*SAhC0jy#8>fs(k@qn`07nxSIp9fS)5 zdCpLrj}?k8o>Xj!N6qr6D?I9Mk9ydnc6ijw9u-0Fc@in+ITwP*<$X6CkKbw}QB*!6 z`UtPTh78jGIg%KRqSzzpN-Zj`+o{_PVS0~Hdh@$D`O^yo=;~&wMx&yLP`U|qk)*?P zD`cckzSC!PAE!@4@7+Cj9n{u+Ww*HrzJxxsZejhZJDm1*+UkEjiY7-RjZ|xep$qY; z^~Hs9^~~amMmAgV{Ndlh9u-Wn#x(xd_6cU+DNBxlOTtLq_fVfP(a6O(lbW=3;{`^F zOT!F#O3L?WgHyNJ{rHPtz4#~=iv(+KrUhf|-0LP%Z27eHd#nF&zL6@?(t@#e33eAL z)-$E1-?XorkvdOH3C2o`^=Wn_PB@|aP$R{QaR$LyX&nTv$=6x)SM4)W-xV3p%a88? zP7jfyHU{nnH&VY;OuaPEA3HRM|5P`4A&c{d$B6^uudkkniALPAetTH-byHvav{X;j zmn|iw7dad8O!23yFB@m1*e4izDJfqq_XgLL#y|GdP3q;48I`PrJoAF4FYw>b2LAwZm%3wy7144kOsi)~{`&6*#We67}cVvdxCFJJ7} zcD`a>zP4y7!C3j~BT{PAz~0>r)&DS3cW5cW&?AFqGcB}j=Hf~;at6;h?tCh8o3Z&x zt>=&|n-3K!w-;0=%da}bv-x!`B^b+Q>1z>x%QRB^w3O z-1lm6=WtbR@X{PCXO17HoTGmnF#a&l<{~X67|UkfW}Cg=Gmo8qmyxQ_Qi8F1Za*un zTi(C(MI%KAjtqja(mE2{XhiYhVE6f<|1wgWw3J}1w7wxyZe2Y5&*%|G>Q*f!7%Q!# zM2e-&&~(*AybI>`|7^`67``WGxUf)I|#X8;|=U>x$j#hQy8|RM^snfL7 z{M&wUnW@1~wbU_LQpbwasW@|XxbWYL?l4jjHeZBev+Dgga814crn-0EW4)aA(Nco3 z$|o*TZd;`{3L`aGO9>{#%NRtRgvQ{CNRK2n9*1KKN_8}G49u5Zs{O%Heyo_&wQG*w zU~)Q7>*=4B)8j?TZ3$1N2jlBuZk?{yQi8E^IzXiSIW)l!0?&8Gk?ffm{}7lIRw zoX9hd+gopYz}S4B)>9}pBieaPb5!~G=ahle5MkS3Ls(uDMG-_mG5keK4ODsewJ2T> zMI(c8rqs+qkKbdY_G_s@O3F9(o*+_giM_Sv+7kzPCDxlok02PU#F&cht;0y2prr(3 z)iN!#OKgbf;owZ6Ezke_7Gra<)-xo_W+`FM*Tc=zi+c|7Y(85{sao)R!{O4PZL^VD zt)&EG*-Q&9937jA6EO|xtBt6I;nESramlxs8RxM7~n?`tW+ zST>LFq(C^ezd5+Kk;>DZQ80{lj&ZxEr0yRRXtSM*k>ErltA&qOw8k8Z@x#r*BHjKlrJUx?4*L#>!Vxq?j*;&!;~ArjdG5O9_T`F~V&? zEP1;wiouCSxPr-hkG_vBMt8>#32$mW#SX6={9b-a5O3<@^Sj@vE%xf-LoFp3%jT3w zxpgsf(j#?7s%v+ZreLhJO0BfUyp)=3q>j>3g0a#n6Dc+K;cjBtqjwmo5n4(xR$Ap& zS`Xi{cbAbW*HVJ9(n^a|Uz}NTi)&we#z>u`r38amI5gKBN0qAYh1Lqh8sCwR+KcMl8?+QLwhxp^B9%`N!t-zR+he5e*HXmTQj@_keRybs*!oziTiBY^kZUG2q z&Z1>a@@+2sVo;cI9wrXX%6iUVZXky}#hoyU5n=a~YH+Z^09Cy6`Do&AdYhh7qcvA& z^^_Ws@_P5!|30nS>nTgLlwhnDb*4zUJ>~QbQ@(AaTD6p5tkyf#N~^W~*`Y@24lN}Z zD=p4|X4Kj<{a5E2so!fU!B}Zcx6*ok>5&tS)caaWFjiVKytF_#4SV*@G*Ue|fguP+ zs3Of#J%y}_EY89#&LtKHb$SY~au`^H-JBZ`FQ0;Hs6DH0VQqa?{leNtr=b>JYZ{mM zINC+P$ik2)*N;y~lw8vn4$mzW8l|K{)ai}Y*)e`sJF@%tf=0MpSNDLvP5-_O>CM?I zo13cCyU1!se~ElSO9>{IEvsLkW8J;k8cOm5 zX`Ua39FbY+_(esA&WHR=U1{NQesw`XktkVGU*Bk2gLatr>$I8*Hm0nBfc827hhMiR|nd0g<`Nje3IB6^xv zfF;Ttpc21Hexy^FLq%4>ddl6xlg>7E z-tv_J-9Emp+eApi@eNHTMi;1I`0|dj^6`DTtq4nZb_{!apdpHc#n-yCB7zLB$LQYc zQ-Ub%W<)vqu%q0mAw;2)(*8EWq(WqJ*sHpLTLx}5ol@v8WY^3fS6MhF6dU9!tgSVq zdN2!=PfO!#D$8mcN|w~3pSYer(urbx8?m%3nTFRdd23+en8lnM;NgMq4NM#}v9P3U zk?X<%U+Y|!7`3Q&xIaL<@JA0n#fowHqZTdl!-u>4(Zg%;`i#-#^2aV3D_`is@5b5% z%?));YvwGduU}dRhju;=^WpJX1Tr4#7N#du-G+4|2?JP7B@AFSm@t6VY{CFagEXG7 zXnzw5i5EGy$D&243kJ6%S+N*iRIH4&R#ZjfGz_)5q%^vmg-c}Z z738wUtpS|u74$7uGY#T)cLH}2aK~Vg)gN;0J^UVUw`y!h`P~}OC;1K7HwOvs4B&F5 zI~Y%jM)PSALauaqTQyZ<1c*~ux~N)begKy%-8H~%IzYOt-&+Iv!qVju(JunHTI-4%@^=5|04`U$i-Bv@*j(kz{9YZ<7nUx|`NjY)SGxBA_edww{c}KH zu5{lF;BuwA4>;}*XXq%u12jekGkSu=%_y4i(@>%!O&5Dv-h}TuX&(8V$gAPe^KR~WY2t{y_}EOBH*sm*pBRb z6qubF*O7gH*BCe9u=c`f_rok)c6*rzT=(Pg8VnAGj_U2(z+B_Q<*K)PG)8F*Z!a8A z9{?^oK%qJ+mm*-sY8>s$mF^6U=_uV2M4k)WEgBoe?_BNlx4=B*!-b{G#mhY!(^0yk z5cyBwPAF8UF8G%#UHT;`*SIKfVd--IsMQ#yF}$3a?sDL6(b$gC{WUOc8rM;}Z)nVc z(tQWGBL^x}N9mpn%y^CKDBYPFbD(tR0C$bXc9iaa0dt?mb(HQdjX6-dF9X+e(1G)N z956*1*HO9^8grm@&jfCx#&(q78-Te@<2p)ro5ma{-KT*2x5jpqZl4oyZH$AVqjV=| zj6&va&n3XE(%6pD{SGkKYg|X^{#s)?O1A=$j{w(outIgkzg+!yEHEV+*HOCjG{#Cd zFwgM8SzQ(`dmQKT{l&mNt+5^1_Z2WbIAJ4nWZz(oQONN6V7kMByF_CE1+I75&#wUHCqZ0@zBXW<4&nm(Sbpzm z3`hx5Z-Me-K0eFBq5J|kmUFjZN{@TakM~ORR6>J$FC5T58T5V+fn;F4$owZ^mEyc z+Fu1QX9sa1<+mD`mLM+BUf2$P49vYjT!_BsfO$2D3+Q8e-Um!?zFUUiYt) z5PkOpvn_}V=wp5C))gx3xVbQX&bttCCTxps{008E zUcDaY^!VPp@GrLM2Aof)X!9Z1nSIy;_=*3$@4^4Q%aqdQy2>qG83D!Q@4?}4yXH7? zl?M39WPcLtvvehXC}`&Q_+6sBTww3!xErx)vuNA%UtpW|F1kj$kw36k`vowb#Q&Y5 zHFNEHXmU4zit*bym2+JzPd*`ds8DC(e27qsJZgnUUE)#S_NWY~J~;B6n>^kf9`)a# z3MBTgILCzg5a)x1!bzTV@IM1b2emCxQEb(G@__>H*2RHajp6PVU_3sKTc+Jt$%=7qNy6J_~X2s&Re(aeqeX=rh^(~;Q z;FhN+Dt9h-=O)`dx|4v2FRPdc1{|Elm5#lqv=B?=E4+VkdP65Ahdm=*A_mdt!C zKEhh|uUnPBVgD@DhADgyc;;hDT5S6gN6$)(ih&|;6%;y`UX!>Nb?4r0@6ed2a7^3;JaZ02&GU_ zRCucJJkLCId$zy(>Jg>be0^wYd~zAK7cba`(r3j+_x5DDZ&tsM;QEjRCj#h(QV=RZ zMKQsY@capGcyK*=33T5@i#)is zOe~YO2x5sQ)~`pr(A_{>jH9b;b5kQIo90>^$_J(5;itn<)D7!Es9YP%+BTl?M8&=$ZX{1F1GQPP>9?u!O<^}Ll4aX>jgw6W7oBn zqPN60UJ5C8p1~DcTGe1U6%F|~l8&=}d^C1{1Y;<+?8Cj@=45;G`=zZ(RYCz>OPWrl zp8n7yBl1HWk#i_;OLkX9Mom|N(mf7otCD2zRHa+x@!kf-7M6#@aXyf3RnCfH zIbS9`w{`hSG_4+`j4|T0~+tdk>||8*<|T_{Bi?(h02nmn5CZ! zFPNp}^?1uWKEJuCseXl4BZ^{1?iZe$5r1W5*{82lo8vx1W4`%` z^RF?@G@v7qgfcA-N)755uk@uI2yv6i{|sAkC?gd`Bin@M8R_}b^PD5mWodH`KWWM& zxXm)Y(Zpqs8ilcdrj6ru#_w^cu2}-g4NrqmCMk+0JtaKL8yYVpP8XT*aUrvT7iQ^J zxjvKXGi78(2r3vQTGZ)}_@@$A6cc|*cwTuNIAOUEYrR_jv6?!Q@NO?*MKR&O2=8ko zEZ2msSIfW7Cj6e4u%ehSCn_`5`I~8&%T4z>4fj_p@y;gvPcLCbG2u_YZo+bn)_S%4 z>ukbbc?m0u3IF@+CM?%qC3RcV5kv=VObaqWP@aZh=tYa&rkGEFYSrL40ADQyIRlg`(xsqO zkv4+5LSkXs!$9NjQyfF^GB*%X%-F*D07sg9JYVL)PZ$#8!vKOD% zQ0^Jit&O<75$}swWaU>ZGSBUyx#{tzxA7mHhF5MmhICVYRpzLQ@e`WApufk=a}}*o z?E#oJZD%Ib7Jk5jM<3-$a6M=QW95r)XzaZDY4gs z`V|g0JSBz38dMZ*xLbJrHRL4y-^M63y99k1MrA>ay4?___cxwi>O5UTbLrhGXrj2- z=7uo6^sA`724k7puba6smMV%}P3iU{sXt7&LiYD{V@fgP(yhva2p35@Ot(Vnhb35U zus->sXT4_?(#pwAEoBl0u;qEeNlLkbiR|uz!}3QXJYu|jQM(tE*SXk z?;9u*bfR;%Z`c=^i{;|fhJ9W5|FjMJqWnL4!#;dR!)ZEc!@jQkU$|jkH~v35=UoJJ z=|WvwI6PRWc&gHxFQxfKpfnHj`aeB+%aR_yri5>qh-YuHk=ay*X%=YC0q;X8q*_p_ zfY*ak1k@5)2*xsK3i;T!j8gu4GZJ?AtTl`|6h6&-3McP z<7l6H*I?rXf-RasdlU7&CcqfuFJ)e=aCa1aN(ELhgJ3Lg2}Brg8}y%Pq}JQ;}T z;$(Z|@NcK<4oo!S=HRBA)?m90+LVO%_5bd$(Du>FhHIoo-|)?GMryy7%FmKINTe>( z@$*LCJK0DT=tK{K6msgT!5$*T4id#NYs*!qALP{_Jp(fc#;U=d;F=m7amnVfMv6D& z41y8gBO??;JUQ9EM7HB!7RV-Sqx<%t&BHpjp*ZR46}UcbfIyh-bcIl*#fx~8X$9Jg*&%q!>X zwUl72a^^f`%9%bAjnrLQN-(sU7grK!p=~q!Vl*;QMLWkX-u5SBGv{rFL$YkJ8>ug}lwfExTDA(b(6;$7aH0`3VhL9kY`WIie3%*t z4(NmQ;Ws{SGF~@N(o%<0vt{!Uf89s2RLKQcCd zru7`iPbtgUcpQy!_(R~mirqHi$$YQ zDresdx5on;jjX_#^XN&_+W&2&=IPXr&#IjPBISa@)xi0+ zzkAl?eUH{NC@b&0f-t>l+SqSiZ+wUD(^7)5@;+Fk{CPK0eOUAef?+L>a&4xCw#`Gp ziALlM>d*1JD~-)3YCS`;Z00JcvH9XPq*?1Fe)lw%zgWbQ_BkcZV zq<)~K1Y@lvO^U%a9*_0{-DQF6G~zg*9yg0bprq)7Se%Sd%&6Gsq?mD5q+DxcMi|Lf(q{>0?8 zzm_7#&MEU{=aiQR(a1cWar~@xI`p_XovHPV&dMp*icC%i-jY0ew3pK*T1qfhPEQdj ze@>0mdMzaw_NEbTZ=!{^&0|FmuK`#UKYIO^8OG)twVttAHnX~o&AbK}>)CvVmJ*C* z^LUZ++iaw^X(_?bW*R1egl+Sw;6x)OJmYxoi<|y#Y<^YiIW^1X2_of=*ats;$nB?k zHovQ-1Y_BJnkNN9{I43Rue6k4813NAM;+p-wXnb?&}KUqyl065g|^KJ(c{`2{dxCujm?c( zPa@0aq)7Q~PIxw7rlka9*<37A{?=loexjuWW7$j#ZJVW?c;)=?o}#}Pn}4hIlw{eQ z%Cfn{v-yu&N-&nqrCBx`ssGVZg0XC-g|^LQqQ@=g?=0_v-w_-Phw+vdp)AYha&S$r zWZNk7Y#y$q1Y_Bp7Ab!@8>y*UN-&nqw9vM>LiD&czh1NRNn>-f)>DyX^Q0`BD?FR8 z&{Bf2Z02}nw`U`DmzENYWiu_bZLYLzuI=+Sl5)%WIjyHM%jT*qn=3t=-_ufpv231_ zWwVj$rHfxMmd&)#wz=A}dE`k$FEus~(|Qi%O_XiJ_|GiWQZ>|U*?eY}%|>dzmJ*C* zGcB}jo@&|r{!6=YW8s!Fy|Xe*%_`?<;M(nZs#nh6)l!17Y@RMsI$G|Ijnv(mEf~vY zT4>vhi4du?&2X6i>b?y>GB&&3O=o1;e3nSLW8D+4yl~14&*s1A)CFVNJX56nHXEt^ znk^XXx@DF~^~IUtlouaE=i^AhaQH#$KQW3|t~rj_?4MzoQ#wrxlwg3vv!++kqCkjDy})%bwQi$T+9I{S368- zJ#(^hF;}GAT(BL^@p3U;O9{rx#XOPn=fX(UYbn71hsWnRb3vQ!T+9bYUG4BX^Y9R`h&>XB;b^ zyd0e&0*aws>!}r+$vM0y&kVfw^RH1a0x#Dc>nU1lQC8j;iaucizDT*bXuSR} z$JcqexL->N#>&M~PYQ(d_mc-5W2AO!DZwz>d0lgK$@?~EFGH-kPWax(b^mflL&y12 zOA(_+$i6gF0&5VZ!5b(E%)4D0ymOC6-olv;A+~aBF28+)C`Vk2~WKBi+hdKTUv@3TWXahwWcs}hmrc1mLkSp8DQJ6Tgz(E zGlXXx_L|k9y}?3Qoz+?{1lP<&9068)t!1E=5{y-k3N0lVD_>hg%58_YEW2i*k-ADt3C3z0S6FGi{lVUZk-ASy3C2q6N-M2irzPV? z>JM5@ZlWXzW2=7-FHvksP{y+Uy07(cSw=5(xhMDE@noxs*@9u_dNyW_)6}FL`wxFSY z*|KbDm!BoCBa8;gP02E3Gh2&4E=!Xy(r9yQw5hIsMYcXWHcO)w9n@L6qNz5ln4}@< z$Q&9~tWlV1sP{f45aed55U@c_(tB`F4=WaXjX!sMmcD=jCE19tPpoK~H-DM;!3b$R z{{BUe?`YyazE+(T;rhBSPn48TN>--IlBTWK(K|{=Q`Z@&YpR>K44Y%#}m0`KD+oo?gubFy@~-M%JKGdWp2xu&wr zl*H27HCAWWihP|rkc1UuC*_ZFOTQvfQ$1-)<)l=#Npm?zj)`N`-r=y+RS)0*=KC6j zHLwM~qG1GRKg!=Qd>U-N&vq-q(%?71Ls{SOFkGv)3|s3%o#yyli4|j8<&Sdh!Z4Xb z5eG#RWoxqHe5%m58jXzAxG7>sXREa0wOU^@$e}qDVJi=VxMs^(ht`opyI1!n-qxKB zur$j!X=Lp(G2^U3glV^xX#Hx|F@l!rV5F@z5UUk(RL-H!j zf2+@m@~H~Oxt+c=QI)E$u1uGfnofVdo-wTcZgrWUHX4Rb@3NB@;#*<9-kcTXGb|Wq zr4x({q~l)FgeT?2hNtF6=St9x52P6~HMrRh`y!GRmn$j%_mW(J9Bm~#+Lt?wWLfbv zpCjC|x|Q?m@hyJtw8HhEL*$q zf-1>uz?Xq8Xs%tc0GF)#yEmhP-?w2>zS&yD&f@2E+{*}+qU!Y{+-nHMT(D$b-HO5h zQz3_kAp=ZnBvBfD8ADYF&+VVd#N?{-^ps>-mFb^N$fW9<_Gf=ak20U?;rD#J?2jBV zVr1>``L*LljuyVJpc_=K?RupJZiLS^RH-kUjf-M{tp@Y8?TLG zObI^q)KqJiU^d^EkR@PsC_6^JpSS?uajRb-y+p-M(|b(p1XT%#BUHI`gzy(?M>VWsieHRJe@2yUDVxqGjYrUxeT$UQhdW{^q9CW9OxTP zW5Fd;N%-l^Begr!VBKIjK^`D^-iMA z|KN{Nx8Z2%hDRw}2}C#ohxjV>J*Fa`j~RQrt3qTTBnlD<|E3x83UQp!N!;X4;08cn zeJ60kfxD&?xWT|}>jaMLneTN1cQkNcbOOh6>C06~UkEEd>KoSy9Q92P!}(qvXHvK0 z;L8oi@reTht2vi1+FD>P&^RvfhWSk9g6EaM+^TV0HV*TF%f|RiVB-2QCZ8STO7|zg z+@*23(q$1ptuY`agr%DggZ=>AYh2Go@Y=HsE{ex9qqo7RXK5Hhu5{Ut-UsH(ATC7T zH_&JXvEd+eq%Q@`^dK%oUjs1fg1CV1UDn4Bfw?D$3(@y1FnLiBwBOfS7a?Bydw z--*DS62t}cvEHU@49kTftlrq3X9sZ7UIOizL*IJfHfb!|Ul@+jSK@TD#&PMHI1J(c zTfT<*EcDd>6JNu1|GBH-4O`pWziMyUchKrZ+L1+i!Pd;>e7xqQqffQ}HN8b9mF@qx z|HqDF5}gWcnd5Qfi9<_1y^6|o!UsNivip3bP@{1kD%5E>pD0uc=RrbM;(WYN({Vml zsM$Dk0?Tt2;(WMJ%WytKs3x4*O7g_HBOgUXo%J}65^5vP!-U$5bCFP&<9vcpSK&NB zsPE#;yhfcHaOQK5sJJWS02Fm@!TC_3N~cb(o_cD0#+1oZs%K7#msgg}j0?}1zN9wZ zxUzOZ-J-hMh4IyOD;CzTjxU+l7++BzUr>*g=?j|#BezP8O~5RwZ&*IBDPGqYZ(cEP z)x5f8vbdX!uUs~-iE$@ubqnIPd_WPeUw})S1}wZXDWhh=vN|kF#PQA2_^R55My#p_ zRp!J8lCExUiq|iSFRxu*->}AUy?Dq+Pibr%pKrz&Gr7j@#?5P3+`OErGrD#~^Ku^s zsW#No6czvt2h3j(Qg+Mg<~QJL%nF9GSYeiz)2-7B3o7BZxL;*!Wnp~U1HywD1JL0}@uORt0yyo{ow}r%OUi15z!*(Nj)T^6bSa*85b!}mMRJ(R64oQ}3 zI@7Cr%bHnEQ!KsZ%!KGyGVSn2yd!_YpV$78jvC^=m~^JMsgE6^1&W*zg0eEC z=Ee7ms#xOSsYCgH%*T(eGUTapWsNCnh(~b{=j$eU;wVMMR(P?j)pZifS65Z+5|3)} zsOv%Tb%s0{S{3dd{9Y@(`*BvhM?GpAD8A5>Cw?RtoA11+WAmNYKr!t+@vEd{Kf-U- z^8N*idCSL31vs-Y>#!dGRr^pBQS*h@A7=&*_6&JA*5inZCPlHc@#UbXb2rZi(93dw zI~bg)vjGP~F1?)0qJpAsH>?K{w0DK@#1%|ao~4_)Q4+LNQ3arsZod^^>Ui58h4j0b zamyo@ZdD%C=OT0IR!FZOZra(@ZAT;uG)L@iJGyiM$q~GJatBp7pKgDb|5(bG;ehuy zJ@U88*tVUbYN+KcjiUZ;cF)j)O;GI~)48$;xYWq3M zQ>3g{dWnrjZo`?EA3t`w|IEAyGZ-8OPB++2;k(ag`;SJxA+Z<`#=Ur_n-X61&|G5d zmk>F6M59|#-B4W@}kE`!s>9)LcF}=OT9ZdM$dP@{qMy_&+Uj~AV&0z z;;(r)vh_%bL6+W6c93hW$WS1Z#2S-WQJe9{mEBG&*fSV zF``GRD~Vs(df2C?95$FMp@4mX(0gX2AyA$PT7>%%1vPE7|cSB#(zkaNx3Y<8leD}?LL`upZ)O8z9NVYBY*UTUPC)KY?>8fUj>GgD{y*yAu43^G~@<#G;H z83vD1bLK2qvb3>jse+K>-;Tq)+ppbm#8$7~v%ZT~{J2`#$|dXyT#r-Fp;@KD9GTZY z`Re_lUTG9*djw;Z#$h7GKF&Z#9Y$(`mJ*D_S6cZZYe5!gT^8qiS)ALmIKQ<{&p6@x#~Z0$?8FFyvC`t)Vbbbda@$Ep zYJip!jFpz$EPGp;Cck&|!$#^R9 zE!;@`LQ4q-IJo}P9M$T`c`=K#CyUd?Z8p-zDAm{Ea6FWuA2DpJcI)jAju~msy*mF| z(|QMKJ^fYd^^KXwixi_HIPUuCV*`!U7%in7nIPJkq&X^I{;_ueVxti?lEdNuphLG9 zJ+4E70h0Q~&>`1b9E99=&V(WFYkH6C7uPlkLqBJC9}-PY)Kpa^)02{u6S6=van!^y zdf8^;7_L1`9HaP!$z;NP3#_CxQ9Y?_QdMPXMFQ&=6UTTfIupmJC7p?5u%Qx|O&o(op^0Pks*opGQjsW6Ra93@E-vm^ z(6!f-tWHcxR+g8iCY2?yRs@R{;XOfFEmCj8x@BLLC{CtIrqopXo}tS!l9UB9=`JK$ zVkrE{sp83HmHt;_+!ZD*$u%Zd-ZQJX3NP=aYsxB-o~$~lqLw;R3s0)Duml%Ou(-6e zGFeemt_ngm3%w@gDnUNoWvK)v*NWxy7S|TfYpit}C*GEn_UAr4*KO9Y^@GnKf6kop zX=%6%TvppqvZNO8)~YAYs~T6VGuJhp)x2!!ycPC)Ez@fo zme;Mo({P*Z*6NcG-D=umZ%}DCP5(FP}Gc-tv|5%s=~e1IXpZa+X^8 z4g3sy^~ivAEVF`S?Lie!%*T$1`@(^qn2$JR?8woA=M(cvd18KRA-2$QIzR|}V*XFw z@c2W>6Z6f8U(5>`Uyvu}zPX7}MVOX81ddPf7^phe6U)uOd{^Um2^IFFl-J4k0kbWL zlln)b4m52yFz&{iT>5yW(*x7qv7Gu4JY0yr(|~a|&UiTAwG-ue&9_MF;%^4Yhwq-8 zyrDSOW#JN8PyTr?d}k+c)c2cC;8^}|bpprY{h*V$FT-$wc0k95XhzOEycI)WJ?3f$ z-^PvCHN5#k$W_j~lDkJ^1c*~uIismN4`ku8%Xt8BuXO?!2d=#nI9}}@$6FL%2zxW3 z9Py`R;cBwlK?!gzoxt%v;E60;c7A#NxjPIOsJH#7x6cB&T=n)5ZV|uaZ6ZRhdSktR z1BstV0}wo1NPkNMGd+k4^tU*4;I_fJCWs5scMmX+1aSd<95?=~F(4&`Jz2jVG4BAk zmbZooTm#5eE>{8bLyhzD8%USs@{q<*A46EWqrra)xUV#pHzAU4px(HeGYErGH3uXF zrkl&Y<-n}*;UwLFee7@F(-`Vw2(xb(_&);fS&hwQUj=ZV0W*=ey9m57$z|UKz+9|x zxyq0B{Xk==k0H#yDzxWYf%`}=$a0M^SGv=2dpwu7$OyU8Wj5CVbA1pO(*Ax8Oj{5a zC}-+>1DMZ(xDb7PaU&k*%{W3w_MHLDSwUQgz9wMS2XO)WIA7ij%zZ&zh`wFGycWcT z=-Us>!5lCVynKY{I|-O^L0mu|+re2HBMNbnb`Y3<2ZDcI7A||7k%uz8i!Q2$QgsPB|c;MnfdoxsI` zo81W<*L2r*0>}BNwG%jAuU!{{!=?ZK)|*-1f=Q=;{Wr7pyD0zpci{QvKmk9P(eJF} z^yG}>S;?9B!cC2S7c0GG4D7>O0BO9+g0Hi)!#Y)&cdIfVRc7{AX8uZkg5P+-+Xu4? z(>o#&becUxJ=g`KLi<&NG3Tc$oHx?c#T#x^;;}UqX zzq6g+ zJMs#;T^J)9$^AL1M_x{q_jHHUuG zXLoE@@3x+Er__7zfi0?UUa=4_RmDTz5yQ3*Zc7@taH#w_*c%jljZ8uCsu`fQSij?2 zTJsy~m)5Rus#n&oD6fo{PKz7z+>1<$4N9nec%CtR* zZ;q+fuHQuxU~JRd$a^Z2%uBX>5s6*?Fn(o{`J38eo9_WhX7fQUUv!OK`D6973x7sp zS6-ujMw<^xPH2l=*+RK9`{C7s=^OS(;z)YHhW%amzr!zgw|voMT~8zuZ9WF%#a^%D z*TbY|YFk^@^m1YwnFzpLF1gt45mmcq6^wgB_`hiliGeISVH_zjJ2hw}(6x0Oa@pA}D7C#;LGY6!3<)nJQqSz0|3D12S#eJ($&kShz%WARE8=qghWZtSe zyy1w?xnyDL=QlStt*C8m^ggxjLQEfV-^(0WH`J#>$J>!*^$n}BY4GF)^~+bzYpR=H zw+!pQ?0EGnmaT~|tX)*MLcKZ~4~UN%Iy{cmM*36)vY|CuWnhL3e&}X~%ziVIEl;&hAx; z*EC;Um!BFx^>3+I>iJ}5O~I!2bqBRvw8v?VCfm0qGZ*yT^cflNyNu*ubeo=;9uuCt zxNFhYRCHG|Q!#wgPGa(1Or&(wt1Vx&H}y@e%0PyDWCSjn~3s}FMN)Rm6&-P^EzhrbGP$LQCz=q!(tGsrzwg(?VG~u zuOV^$pYyE2D2ns!A{iL5s|A$~L2;gR2unvHBl&qw{zu(*<+XLGVN=d$Q!e1;UOb(_$HzZTXP(Em z_|(NxB|dJpsjaEZedp76S@!w!>Gqu!(cf22colEDt^Zbgyt!xW{>W+ZrV}@|H4Wlr zTjmwNmgcRzqT?H?@>RbUexc9&b_ZoJc{Owajyz|9M=@JmM{+|02vt9dVp**eUL?kk zoS_`~v9pmqSGr$2wLZ~`FBLW&*7D#-teIxU^uV6Mu$DvR1;$8AJDaG!I3L2(QY8H=88?w)RM+qAR!AGpYy*S>uMl&syF z&OEDo2hwNBo+lNcbgCOF1*#)cL|20*Y&jZulJtRmF;872hbl z{%jCU_>DfyKr0wHt}1MSM{!*IZyZs1PRBId5T^e}g8V!waO zhor-FD=T!@om+ZgQ|$`b=F`FbnE|c9mK|O{)-GR(3rT&~XN^^uYQnnzIotQpAa;9x z+mhpzFjUXrS0qEnEYk%}fHbp~Czsi(LG$Kdr|@vH3YE7BszED?#rCA|+%Zc}xL9Z5 ztQ()n%T0`8m=Zr$hP97B9RgS@dAYd&7JJ{v&Ft8Ff*|~3uVNsom)<6$7_BWFjFci7 zr#&tBYG$X^RBp+9iOy8H1vjNIXv?)6`O;f5oHNs{EnLx&f^2dvO?D7;CE&HNt=l`dMA#pvTHXoif`n}7ZvEgAF$-DK~roW*yTOO8C zd+kyV*s~ry_EL<>*RqUKxEz_4{A_!qsmG2MNJmWY;23)5`*BJbjZc@sXf-N{1();LXGI+ zIByGeDyTPwng~k8PWNKZ1@#w+o$tlo0qQm3-RN8=kfZ3dPQUh zfl@Y)1I1FxbI>xJKdRI~9WNA4&IbH)!~cL#gQ=qO@%u&LMf&w{`Yr73^qbzx={Fkm z)V{k8X)9Pcl^%R#TWZK!p{!e+6klB5Fjn zU6@?F3@?CTU^_)>i_9idAS7L6NP`oF@ru*;~RdUB30mRE;jP` z9z!z5yyQHrVckgcecdCplwhovoV$t?FYVY4o}M>og^?Pir37Q8)lH;$(IZk7_17CI zc4G#?SZT2fnwPgP`_8ea8>yut<1SqL^TkGJ@)gfqfR72%B8JPjo`FjMB3yryh>_(Fko|XuNY+ z%$0$A7%fGNov(wzG24;e?K5D3k$O@~5o1e1wNL7eZ~b+?k&@*A#1jK4-(zcOlMyb( zl6q&y>Cc&7z>5)v0w+!>UoYqbu4yfQU-J0pX5-9AEhQMMWga3@Y-tSKU}B`EX(_>2 zwR|YB(Fi9shM{ZvziIN-tfh#tOM^F0(Z~RbAl!G&7R+55?EF#_#Mn|?!-z)WI5QMI zwQ8D?dPhqUV@n+lPBg;B9ftNnvF%1`NK|o&v86a#L?dXj5_X;WHWn0I3zujqVr(fc zk*P1>QS7K-j67%MHo zds|n|n!jqFk$Of;DV_eUEB%>@NP%#Uy!6D&jFh_xMKIh@Hfk(E2rPNKE{+E$8bN13 zt>KH9ZReGky2#T5zS=6{@9zUd%AJW;J^JCh=IgcYcQOTIl~18aaa>`zeM9v>j8v&k zOE40DzB}FEm)c0^wkX^l&pJ*w;Sl_;&g?4ES z5k13jW@$Wh)8t>7(kS2s0>TilG~$}$s9gBwf)jx=-<#Sq@1X5Q&v-3$VpiUZM9R%O zzc+QFm-k6pN-$R5PZB9N@AQRlq~>cW!2pM?#+J=!;bVl26K%Fj<79B65iZB^8lvjQ zm(4c0xK8UiIV%^O>&*zz|IK|hCwsZLQ%ecP$_2|@UH?Qu)qL>NLL>FGmJ*CL0t~m( zI(__CdyUllT1qfhS|d70t5VWUc`<^{=CT zVx%gylwhp1*dI+=2em$SrIA{ur37Q8#i}&dtM5EDY`>AZTuTYYO6wFWt;Ck~D~!~g zT1qfhS{xTmT9dy2W`lc)6IG1WE zV$|Htx@2JAv3t{L;6x*5;>-bQ=&gL02VG0Tqgu~tS-pu%eWoSM`t zT8bF^3atbjQ(_6LOA%vBm4jo_y7|_x{%E8YYbj!EskBJ- z#hKyZLw|aNk-Az-5o1eLfD?_xab|d<`F~~@sYkUGF}BnsaH0|3yD{8+!$`Dhx8(O} zDPnA?$>6AdL8*Js|NT-Ubxcq4uCCN#DB;%$2 z6AMeq7ET;({ga)>TCAyI#R6>c3vLSa*;AaVDVYpS>cu=aUA4~-8FZ@k z7LL5Yh0kf|H@Lhl!zHOid9q@1YI1tA@gZ#FyroL_J19mlnW!wQNR?w}xe@f2rPp*= z^>wNR=#K@t+oPu>Qt8R1#Z@Kc*(we!UYbsnRHaHPD@v0I{kGV|@zzqR+PTcPy(W%X zSnHWyno5+FCX1`9E2p zNrtBAZJv7~@x-OOZErp!dsG->P{_YjsuX4sQV8HNgDG!O%#)gZMJ8kv6mBr1A7Gb!uE%HaWK(5L+;QeBET*&78(xU=TK#J5I z^{g1`F!j*9a%Fu3d~Uiaj2Bn+VezU}<&Ia)W9$LsbH^+BF$a*(9k1loM)=(J=Z;tM zYFB%1`P}hJK3D1b>M2CIJ7$;R6AM-8Db-aK2@e&V(a;>!FgCv-Fu8dm)4W=B$D5i& zRaJR;S+abJUoqc+P`czD2rnfWcbF42@S2AD1<8dA@rjqN@9q;nv2njJuN_EY7F^yG9|bt+w&@E+#{uUp*f2R%D^WBk~P;$%$? zXEpsy&$=cko{}h=k}98ET9Qn3^sLVoDoK>!(_#>$jQt4E29_mCCRJ5bR27#Kne}MU z2A3pCtBWU3N|jW(VDre(M#7m(x}qkXuA1Z`{f`nYEb>*EN+ze&U~ZI0jF=hujM2To z@-;{9f3ReyBx))uCzTXer%-mNdNq36bADB#x~96gELBqM$5?7`37Sr)N=onrGEw6` It5l%>4{5MQ*Z=?k literal 0 HcmV?d00001 diff --git a/ImGui/examples/libs/usynergy/README.txt b/ImGui/examples/libs/usynergy/README.txt new file mode 100644 index 0000000..c86b909 --- /dev/null +++ b/ImGui/examples/libs/usynergy/README.txt @@ -0,0 +1,8 @@ + +uSynergy client -- Implementation for the embedded Synergy client library +version 1.0.0, July 7th, 2012 +Copyright (c) 2012 Alex Evans + +This is a copy of the files once found at: + https://github.com/symless/synergy-core/tree/790d108a56ada9caad8e56ff777d444485a69da9/src/micro + diff --git a/ImGui/examples/libs/usynergy/uSynergy.c b/ImGui/examples/libs/usynergy/uSynergy.c new file mode 100644 index 0000000..8dce47b --- /dev/null +++ b/ImGui/examples/libs/usynergy/uSynergy.c @@ -0,0 +1,636 @@ +/* +uSynergy client -- Implementation for the embedded Synergy client library + version 1.0.0, July 7th, 2012 + +Copyright (c) 2012 Alex Evans + +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. +*/ +#include "uSynergy.h" +#include +#include + + + +//--------------------------------------------------------------------------------------------------------------------- +// Internal helpers +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Read 16 bit integer in network byte order and convert to native byte order +**/ +static int16_t sNetToNative16(const unsigned char *value) +{ +#ifdef USYNERGY_LITTLE_ENDIAN + return value[1] | (value[0] << 8); +#else + return value[0] | (value[1] << 8); +#endif +} + + + +/** +@brief Read 32 bit integer in network byte order and convert to native byte order +**/ +static int32_t sNetToNative32(const unsigned char *value) +{ +#ifdef USYNERGY_LITTLE_ENDIAN + return value[3] | (value[2] << 8) | (value[1] << 16) | (value[0] << 24); +#else + return value[0] | (value[1] << 8) | (value[2] << 16) | (value[3] << 24); +#endif +} + + + +/** +@brief Trace text to client +**/ +static void sTrace(uSynergyContext *context, const char* text) +{ + // Don't trace if we don't have a trace function + if (context->m_traceFunc != 0L) + context->m_traceFunc(context->m_cookie, text); +} + + + +/** +@brief Add string to reply packet +**/ +static void sAddString(uSynergyContext *context, const char *string) +{ + size_t len = strlen(string); + memcpy(context->m_replyCur, string, len); + context->m_replyCur += len; +} + + + +/** +@brief Add uint8 to reply packet +**/ +static void sAddUInt8(uSynergyContext *context, uint8_t value) +{ + *context->m_replyCur++ = value; +} + + + +/** +@brief Add uint16 to reply packet +**/ +static void sAddUInt16(uSynergyContext *context, uint16_t value) +{ + uint8_t *reply = context->m_replyCur; + *reply++ = (uint8_t)(value >> 8); + *reply++ = (uint8_t)value; + context->m_replyCur = reply; +} + + + +/** +@brief Add uint32 to reply packet +**/ +static void sAddUInt32(uSynergyContext *context, uint32_t value) +{ + uint8_t *reply = context->m_replyCur; + *reply++ = (uint8_t)(value >> 24); + *reply++ = (uint8_t)(value >> 16); + *reply++ = (uint8_t)(value >> 8); + *reply++ = (uint8_t)value; + context->m_replyCur = reply; +} + + + +/** +@brief Send reply packet +**/ +static uSynergyBool sSendReply(uSynergyContext *context) +{ + // Set header size + uint8_t *reply_buf = context->m_replyBuffer; + uint32_t reply_len = (uint32_t)(context->m_replyCur - reply_buf); /* Total size of reply */ + uint32_t body_len = reply_len - 4; /* Size of body */ + uSynergyBool ret; + reply_buf[0] = (uint8_t)(body_len >> 24); + reply_buf[1] = (uint8_t)(body_len >> 16); + reply_buf[2] = (uint8_t)(body_len >> 8); + reply_buf[3] = (uint8_t)body_len; + + // Send reply + ret = context->m_sendFunc(context->m_cookie, context->m_replyBuffer, reply_len); + + // Reset reply buffer write pointer + context->m_replyCur = context->m_replyBuffer+4; + return ret; +} + + + +/** +@brief Call mouse callback after a mouse event +**/ +static void sSendMouseCallback(uSynergyContext *context) +{ + // Skip if no callback is installed + if (context->m_mouseCallback == 0L) + return; + + // Send callback + context->m_mouseCallback(context->m_cookie, context->m_mouseX, context->m_mouseY, context->m_mouseWheelX, + context->m_mouseWheelY, context->m_mouseButtonLeft, context->m_mouseButtonRight, context->m_mouseButtonMiddle); +} + + + +/** +@brief Send keyboard callback when a key has been pressed or released +**/ +static void sSendKeyboardCallback(uSynergyContext *context, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat) +{ + // Skip if no callback is installed + if (context->m_keyboardCallback == 0L) + return; + + // Send callback + context->m_keyboardCallback(context->m_cookie, key, modifiers, down, repeat); +} + + + +/** +@brief Send joystick callback +**/ +static void sSendJoystickCallback(uSynergyContext *context, uint8_t joyNum) +{ + int8_t *sticks; + + // Skip if no callback is installed + if (context->m_joystickCallback == 0L) + return; + + // Send callback + sticks = context->m_joystickSticks[joyNum]; + context->m_joystickCallback(context->m_cookie, joyNum, context->m_joystickButtons[joyNum], sticks[0], sticks[1], sticks[2], sticks[3]); +} + + + +/** +@brief Parse a single client message, update state, send callbacks and send replies +**/ +#define USYNERGY_IS_PACKET(pkt_id) memcmp(message+4, pkt_id, 4)==0 +static void sProcessMessage(uSynergyContext *context, const uint8_t *message) +{ + // We have a packet! + if (memcmp(message+4, "Synergy", 7)==0) + { + // Welcome message + // kMsgHello = "Synergy%2i%2i" + // kMsgHelloBack = "Synergy%2i%2i%s" + sAddString(context, "Synergy"); + sAddUInt16(context, USYNERGY_PROTOCOL_MAJOR); + sAddUInt16(context, USYNERGY_PROTOCOL_MINOR); + sAddUInt32(context, (uint32_t)strlen(context->m_clientName)); + sAddString(context, context->m_clientName); + if (!sSendReply(context)) + { + // Send reply failed, let's try to reconnect + sTrace(context, "SendReply failed, trying to reconnect in a second"); + context->m_connected = USYNERGY_FALSE; + context->m_sleepFunc(context->m_cookie, 1000); + } + else + { + // Let's assume we're connected + char buffer[256+1]; + sprintf(buffer, "Connected as client \"%s\"", context->m_clientName); + sTrace(context, buffer); + context->m_hasReceivedHello = USYNERGY_TRUE; + } + return; + } + else if (USYNERGY_IS_PACKET("QINF")) + { + // Screen info. Reply with DINF + // kMsgQInfo = "QINF" + // kMsgDInfo = "DINF%2i%2i%2i%2i%2i%2i%2i" + uint16_t x = 0, y = 0, warp = 0; + sAddString(context, "DINF"); + sAddUInt16(context, x); + sAddUInt16(context, y); + sAddUInt16(context, context->m_clientWidth); + sAddUInt16(context, context->m_clientHeight); + sAddUInt16(context, warp); + sAddUInt16(context, 0); // mx? + sAddUInt16(context, 0); // my? + sSendReply(context); + return; + } + else if (USYNERGY_IS_PACKET("CIAK")) + { + // Do nothing? + // kMsgCInfoAck = "CIAK" + return; + } + else if (USYNERGY_IS_PACKET("CROP")) + { + // Do nothing? + // kMsgCResetOptions = "CROP" + return; + } + else if (USYNERGY_IS_PACKET("CINN")) + { + // Screen enter. Reply with CNOP + // kMsgCEnter = "CINN%2i%2i%4i%2i" + + // Obtain the Synergy sequence number + context->m_sequenceNumber = sNetToNative32(message + 12); + context->m_isCaptured = USYNERGY_TRUE; + + // Call callback + if (context->m_screenActiveCallback != 0L) + context->m_screenActiveCallback(context->m_cookie, USYNERGY_TRUE); + } + else if (USYNERGY_IS_PACKET("COUT")) + { + // Screen leave + // kMsgCLeave = "COUT" + context->m_isCaptured = USYNERGY_FALSE; + + // Call callback + if (context->m_screenActiveCallback != 0L) + context->m_screenActiveCallback(context->m_cookie, USYNERGY_FALSE); + } + else if (USYNERGY_IS_PACKET("DMDN")) + { + // Mouse down + // kMsgDMouseDown = "DMDN%1i" + char btn = message[8]-1; + if (btn==2) + context->m_mouseButtonRight = USYNERGY_TRUE; + else if (btn==1) + context->m_mouseButtonMiddle = USYNERGY_TRUE; + else + context->m_mouseButtonLeft = USYNERGY_TRUE; + sSendMouseCallback(context); + } + else if (USYNERGY_IS_PACKET("DMUP")) + { + // Mouse up + // kMsgDMouseUp = "DMUP%1i" + char btn = message[8]-1; + if (btn==2) + context->m_mouseButtonRight = USYNERGY_FALSE; + else if (btn==1) + context->m_mouseButtonMiddle = USYNERGY_FALSE; + else + context->m_mouseButtonLeft = USYNERGY_FALSE; + sSendMouseCallback(context); + } + else if (USYNERGY_IS_PACKET("DMMV")) + { + // Mouse move. Reply with CNOP + // kMsgDMouseMove = "DMMV%2i%2i" + context->m_mouseX = sNetToNative16(message+8); + context->m_mouseY = sNetToNative16(message+10); + sSendMouseCallback(context); + } + else if (USYNERGY_IS_PACKET("DMWM")) + { + // Mouse wheel + // kMsgDMouseWheel = "DMWM%2i%2i" + // kMsgDMouseWheel1_0 = "DMWM%2i" + context->m_mouseWheelX += sNetToNative16(message+8); + context->m_mouseWheelY += sNetToNative16(message+10); + sSendMouseCallback(context); + } + else if (USYNERGY_IS_PACKET("DKDN")) + { + // Key down + // kMsgDKeyDown = "DKDN%2i%2i%2i" + // kMsgDKeyDown1_0 = "DKDN%2i%2i" + //uint16_t id = sNetToNative16(message+8); + uint16_t mod = sNetToNative16(message+10); + uint16_t key = sNetToNative16(message+12); + sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_FALSE); + } + else if (USYNERGY_IS_PACKET("DKRP")) + { + // Key repeat + // kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i" + // kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i" + uint16_t mod = sNetToNative16(message+10); +// uint16_t count = sNetToNative16(message+12); + uint16_t key = sNetToNative16(message+14); + sSendKeyboardCallback(context, key, mod, USYNERGY_TRUE, USYNERGY_TRUE); + } + else if (USYNERGY_IS_PACKET("DKUP")) + { + // Key up + // kMsgDKeyUp = "DKUP%2i%2i%2i" + // kMsgDKeyUp1_0 = "DKUP%2i%2i" + //uint16 id=Endian::sNetToNative(sbuf[4]); + uint16_t mod = sNetToNative16(message+10); + uint16_t key = sNetToNative16(message+12); + sSendKeyboardCallback(context, key, mod, USYNERGY_FALSE, USYNERGY_FALSE); + } + else if (USYNERGY_IS_PACKET("DGBT")) + { + // Joystick buttons + // kMsgDGameButtons = "DGBT%1i%2i"; + uint8_t joy_num = message[8]; + if (joy_numm_joystickButtons[joy_num] = (message[9] << 8) | message[10]; + sSendJoystickCallback(context, joy_num); + } + } + else if (USYNERGY_IS_PACKET("DGST")) + { + // Joystick sticks + // kMsgDGameSticks = "DGST%1i%1i%1i%1i%1i"; + uint8_t joy_num = message[8]; + if (joy_numm_joystickSticks[joy_num], message+9, 4); + sSendJoystickCallback(context, joy_num); + } + } + else if (USYNERGY_IS_PACKET("DSOP")) + { + // Set options + // kMsgDSetOptions = "DSOP%4I" + } + else if (USYNERGY_IS_PACKET("CALV")) + { + // Keepalive, reply with CALV and then CNOP + // kMsgCKeepAlive = "CALV" + sAddString(context, "CALV"); + sSendReply(context); + // now reply with CNOP + } + else if (USYNERGY_IS_PACKET("DCLP")) + { + // Clipboard message + // kMsgDClipboard = "DCLP%1i%4i%s" + // + // The clipboard message contains: + // 1 uint32: The size of the message + // 4 chars: The identifier ("DCLP") + // 1 uint8: The clipboard index + // 1 uint32: The sequence number. It's zero, because this message is always coming from the server? + // 1 uint32: The total size of the remaining 'string' (as per the Synergy %s string format (which is 1 uint32 for size followed by a char buffer (not necessarily null terminated)). + // 1 uint32: The number of formats present in the message + // And then 'number of formats' times the following: + // 1 uint32: The format of the clipboard data + // 1 uint32: The size n of the clipboard data + // n uint8: The clipboard data + const uint8_t * parse_msg = message+17; + uint32_t num_formats = sNetToNative32(parse_msg); + parse_msg += 4; + for (; num_formats; num_formats--) + { + // Parse clipboard format header + uint32_t format = sNetToNative32(parse_msg); + uint32_t size = sNetToNative32(parse_msg+4); + parse_msg += 8; + + // Call callback + if (context->m_clipboardCallback) + context->m_clipboardCallback(context->m_cookie, format, parse_msg, size); + + parse_msg += size; + } + } + else + { + // Unknown packet, could be any of these + // kMsgCNoop = "CNOP" + // kMsgCClose = "CBYE" + // kMsgCClipboard = "CCLP%1i%4i" + // kMsgCScreenSaver = "CSEC%1i" + // kMsgDKeyRepeat = "DKRP%2i%2i%2i%2i" + // kMsgDKeyRepeat1_0 = "DKRP%2i%2i%2i" + // kMsgDMouseRelMove = "DMRM%2i%2i" + // kMsgEIncompatible = "EICV%2i%2i" + // kMsgEBusy = "EBSY" + // kMsgEUnknown = "EUNK" + // kMsgEBad = "EBAD" + char buffer[64]; + sprintf(buffer, "Unknown packet '%c%c%c%c'", message[4], message[5], message[6], message[7]); + sTrace(context, buffer); + return; + } + + // Reply with CNOP maybe? + sAddString(context, "CNOP"); + sSendReply(context); +} +#undef USYNERGY_IS_PACKET + + + +/** +@brief Mark context as being disconnected +**/ +static void sSetDisconnected(uSynergyContext *context) +{ + context->m_connected = USYNERGY_FALSE; + context->m_hasReceivedHello = USYNERGY_FALSE; + context->m_isCaptured = USYNERGY_FALSE; + context->m_replyCur = context->m_replyBuffer + 4; + context->m_sequenceNumber = 0; +} + + + +/** +@brief Update a connected context +**/ +static void sUpdateContext(uSynergyContext *context) +{ + /* Receive data (blocking) */ + int receive_size = USYNERGY_RECEIVE_BUFFER_SIZE - context->m_receiveOfs; + int num_received = 0; + int packlen = 0; + if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer + context->m_receiveOfs, receive_size, &num_received) == USYNERGY_FALSE) + { + /* Receive failed, let's try to reconnect */ + char buffer[128]; + sprintf(buffer, "Receive failed (%d bytes asked, %d bytes received), trying to reconnect in a second", receive_size, num_received); + sTrace(context, buffer); + sSetDisconnected(context); + context->m_sleepFunc(context->m_cookie, 1000); + return; + } + context->m_receiveOfs += num_received; + + /* If we didn't receive any data then we're probably still polling to get connected and + therefore not getting any data back. To avoid overloading the system with a Synergy + thread that would hammer on polling, we let it rest for a bit if there's no data. */ + if (num_received == 0) + context->m_sleepFunc(context->m_cookie, 500); + + /* Check for timeouts */ + if (context->m_hasReceivedHello) + { + uint32_t cur_time = context->m_getTimeFunc(); + if (num_received == 0) + { + /* Timeout after 2 secs of inactivity (we received no CALV) */ + if ((cur_time - context->m_lastMessageTime) > USYNERGY_IDLE_TIMEOUT) + sSetDisconnected(context); + } + else + context->m_lastMessageTime = cur_time; + } + + /* Eat packets */ + for (;;) + { + /* Grab packet length and bail out if the packet goes beyond the end of the buffer */ + packlen = sNetToNative32(context->m_receiveBuffer); + if (packlen+4 > context->m_receiveOfs) + break; + + /* Process message */ + sProcessMessage(context, context->m_receiveBuffer); + + /* Move packet to front of buffer */ + memmove(context->m_receiveBuffer, context->m_receiveBuffer+packlen+4, context->m_receiveOfs-packlen-4); + context->m_receiveOfs -= packlen+4; + } + + /* Throw away over-sized packets */ + if (packlen > USYNERGY_RECEIVE_BUFFER_SIZE) + { + /* Oversized packet, ditch tail end */ + char buffer[128]; + sprintf(buffer, "Oversized packet: '%c%c%c%c' (length %d)", context->m_receiveBuffer[4], context->m_receiveBuffer[5], context->m_receiveBuffer[6], context->m_receiveBuffer[7], packlen); + sTrace(context, buffer); + num_received = context->m_receiveOfs-4; // 4 bytes for the size field + while (num_received != packlen) + { + int buffer_left = packlen - num_received; + int to_receive = buffer_left < USYNERGY_RECEIVE_BUFFER_SIZE ? buffer_left : USYNERGY_RECEIVE_BUFFER_SIZE; + int ditch_received = 0; + if (context->m_receiveFunc(context->m_cookie, context->m_receiveBuffer, to_receive, &ditch_received) == USYNERGY_FALSE) + { + /* Receive failed, let's try to reconnect */ + sTrace(context, "Receive failed, trying to reconnect in a second"); + sSetDisconnected(context); + context->m_sleepFunc(context->m_cookie, 1000); + break; + } + else + { + num_received += ditch_received; + } + } + context->m_receiveOfs = 0; + } +} + + +//--------------------------------------------------------------------------------------------------------------------- +// Public interface +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Initialize uSynergy context +**/ +void uSynergyInit(uSynergyContext *context) +{ + /* Zero memory */ + memset(context, 0, sizeof(uSynergyContext)); + + /* Initialize to default state */ + sSetDisconnected(context); +} + + +/** +@brief Update uSynergy +**/ +void uSynergyUpdate(uSynergyContext *context) +{ + if (context->m_connected) + { + /* Update context, receive data, call callbacks */ + sUpdateContext(context); + } + else + { + /* Try to connect */ + if (context->m_connectFunc(context->m_cookie)) + context->m_connected = USYNERGY_TRUE; + } +} + + + +/** +@brief Send clipboard data +**/ +void uSynergySendClipboard(uSynergyContext *context, const char *text) +{ + // Calculate maximum size that will fit in a reply packet + uint32_t overhead_size = 4 + /* Message size */ + 4 + /* Message ID */ + 1 + /* Clipboard index */ + 4 + /* Sequence number */ + 4 + /* Rest of message size (because it's a Synergy string from here on) */ + 4 + /* Number of clipboard formats */ + 4 + /* Clipboard format */ + 4; /* Clipboard data length */ + uint32_t max_length = USYNERGY_REPLY_BUFFER_SIZE - overhead_size; + + // Clip text to max length + uint32_t text_length = (uint32_t)strlen(text); + if (text_length > max_length) + { + char buffer[128]; + sprintf(buffer, "Clipboard buffer too small, clipboard truncated at %d characters", max_length); + sTrace(context, buffer); + text_length = max_length; + } + + // Assemble packet + sAddString(context, "DCLP"); + sAddUInt8(context, 0); /* Clipboard index */ + sAddUInt32(context, context->m_sequenceNumber); + sAddUInt32(context, 4+4+4+text_length); /* Rest of message size: numFormats, format, length, data */ + sAddUInt32(context, 1); /* Number of formats (only text for now) */ + sAddUInt32(context, USYNERGY_CLIPBOARD_FORMAT_TEXT); + sAddUInt32(context, text_length); + sAddString(context, text); + sSendReply(context); +} diff --git a/ImGui/examples/libs/usynergy/uSynergy.h b/ImGui/examples/libs/usynergy/uSynergy.h new file mode 100644 index 0000000..cedc387 --- /dev/null +++ b/ImGui/examples/libs/usynergy/uSynergy.h @@ -0,0 +1,420 @@ +/* +uSynergy client -- Interface for the embedded Synergy client library + version 1.0.0, July 7th, 2012 + +Copyright (C) 2012 Synergy Si Ltd. +Copyright (c) 2012 Alex Evans + +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. +*/ +#include + +#ifdef __cplusplus +extern "C" { +#endif + + + +//--------------------------------------------------------------------------------------------------------------------- +// Configuration +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Determine endianness +**/ +#if defined(USYNERGY_LITTLE_ENDIAN) && defined(USYNERGY_BIG_ENDIAN) + /* Ambiguous: both endians specified */ + #error "Can't define both USYNERGY_LITTLE_ENDIAN and USYNERGY_BIG_ENDIAN" +#elif !defined(USYNERGY_LITTLE_ENDIAN) && !defined(USYNERGY_BIG_ENDIAN) + /* Attempt to auto detect */ + #if defined(__LITTLE_ENDIAN__) || defined(LITTLE_ENDIAN) || (_BYTE_ORDER == _LITTLE_ENDIAN) + #define USYNERGY_LITTLE_ENDIAN + #elif defined(__BIG_ENDIAN__) || defined(BIG_ENDIAN) || (_BYTE_ORDER == _BIG_ENDIAN) + #define USYNERGY_BIG_ENDIAN + #else + #error "Can't detect endian-nes, please defined either USYNERGY_LITTLE_ENDIAN or USYNERGY_BIG_ENDIAN"; + #endif +#else + /* User-specified endian-nes, nothing to do for us */ +#endif + + + +//--------------------------------------------------------------------------------------------------------------------- +// Types and Constants +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Boolean type +**/ +typedef int uSynergyBool; +#define USYNERGY_FALSE 0 /* False value */ +#define USYNERGY_TRUE 1 /* True value */ + + +/** +@brief User context type + +The uSynergyCookie type is an opaque type that is used by uSynergy to communicate to the client. It is passed along to +callback functions as context. +**/ +typedef struct { int ignored; } * uSynergyCookie; + + + +/** +@brief Clipboard types +**/ +enum uSynergyClipboardFormat +{ + USYNERGY_CLIPBOARD_FORMAT_TEXT = 0, /* Text format, UTF-8, newline is LF */ + USYNERGY_CLIPBOARD_FORMAT_BITMAP = 1, /* Bitmap format, BMP 24/32bpp, BI_RGB */ + USYNERGY_CLIPBOARD_FORMAT_HTML = 2, /* HTML format, HTML fragment, UTF-8, newline is LF */ +}; + + + +/** +@brief Constants and limits +**/ +#define USYNERGY_NUM_JOYSTICKS 4 /* Maximum number of supported joysticks */ + +#define USYNERGY_PROTOCOL_MAJOR 1 /* Major protocol version */ +#define USYNERGY_PROTOCOL_MINOR 4 /* Minor protocol version */ + +#define USYNERGY_IDLE_TIMEOUT 2000 /* Timeout in milliseconds before reconnecting */ + +#define USYNERGY_TRACE_BUFFER_SIZE 1024 /* Maximum length of traced message */ +#define USYNERGY_REPLY_BUFFER_SIZE 1024 /* Maximum size of a reply packet */ +#define USYNERGY_RECEIVE_BUFFER_SIZE 4096 /* Maximum size of an incoming packet */ + + + +/** +@brief Keyboard constants +**/ +#define USYNERGY_MODIFIER_SHIFT 0x0001 /* Shift key modifier */ +#define USYNERGY_MODIFIER_CTRL 0x0002 /* Ctrl key modifier */ +#define USYNERGY_MODIFIER_ALT 0x0004 /* Alt key modifier */ +#define USYNERGY_MODIFIER_META 0x0008 /* Meta key modifier */ +#define USYNERGY_MODIFIER_WIN 0x0010 /* Windows key modifier */ +#define USYNERGY_MODIFIER_ALT_GR 0x0020 /* AltGr key modifier */ +#define USYNERGY_MODIFIER_LEVEL5LOCK 0x0040 /* Level5Lock key modifier */ +#define USYNERGY_MODIFIER_CAPSLOCK 0x1000 /* CapsLock key modifier */ +#define USYNERGY_MODIFIER_NUMLOCK 0x2000 /* NumLock key modifier */ +#define USYNERGY_MODIFIER_SCROLLOCK 0x4000 /* ScrollLock key modifier */ + + + + +//--------------------------------------------------------------------------------------------------------------------- +// Functions and Callbacks +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Connect function + +This function is called when uSynergy needs to connect to the host. It doesn't imply a network implementation or +destination address, that must all be handled on the user side. The function should return USYNERGY_TRUE if a +connection was established or USYNERGY_FALSE if it could not connect. + +When network errors occur (e.g. uSynergySend or uSynergyReceive fail) then the connect call will be called again +so the implementation of the function must close any old connections and clean up resources before retrying. + +@param cookie Cookie supplied in the Synergy context +**/ +typedef uSynergyBool (*uSynergyConnectFunc)(uSynergyCookie cookie); + + + +/** +@brief Send function + +This function is called when uSynergy needs to send something over the default connection. It should return +USYNERGY_TRUE if sending succeeded and USYNERGY_FALSE otherwise. This function should block until the send +operation is completed. + +@param cookie Cookie supplied in the Synergy context +@param buffer Address of buffer to send +@param length Length of buffer to send +**/ +typedef uSynergyBool (*uSynergySendFunc)(uSynergyCookie cookie, const uint8_t *buffer, int length); + + + +/** +@brief Receive function + +This function is called when uSynergy needs to receive data from the default connection. It should return +USYNERGY_TRUE if receiving data succeeded and USYNERGY_FALSE otherwise. This function should block until data +has been received and wait for data to become available. If @a outLength is set to 0 upon completion it is +assumed that the connection is alive, but still in a connecting state and needs time to settle. + +@param cookie Cookie supplied in the Synergy context +@param buffer Address of buffer to receive data into +@param maxLength Maximum amount of bytes to write into the receive buffer +@param outLength Address of integer that receives the actual amount of bytes written into @a buffer +**/ +typedef uSynergyBool (*uSynergyReceiveFunc)(uSynergyCookie cookie, uint8_t *buffer, int maxLength, int* outLength); + + + +/** +@brief Thread sleep function + +This function is called when uSynergy wants to suspend operation for a while before retrying an operation. It +is mostly used when a socket times out or disconnect occurs to prevent uSynergy from continuously hammering a +network connection in case the network is down. + +@param cookie Cookie supplied in the Synergy context +@param timeMs Time to sleep the current thread (in milliseconds) +**/ +typedef void (*uSynergySleepFunc)(uSynergyCookie cookie, int timeMs); + + + +/** +@brief Get time function + +This function is called when uSynergy needs to know the current time. This is used to determine when timeouts +have occured. The time base should be a cyclic millisecond time value. + +@returns Time value in milliseconds +**/ +typedef uint32_t (*uSynergyGetTimeFunc)(); + + + +/** +@brief Trace function + +This function is called when uSynergy wants to trace something. It is optional to show these messages, but they +are often useful when debugging. uSynergy only traces major events like connecting and disconnecting. Usually +only a single trace is shown when the connection is established and no more trace are called. + +@param cookie Cookie supplied in the Synergy context +@param text Text to be traced +**/ +typedef void (*uSynergyTraceFunc)(uSynergyCookie cookie, const char *text); + + + +/** +@brief Screen active callback + +This callback is called when Synergy makes the screen active or inactive. This +callback is usually sent when the mouse enters or leaves the screen. + +@param cookie Cookie supplied in the Synergy context +@param active Activation flag, 1 if the screen has become active, 0 if the screen has become inactive +**/ +typedef void (*uSynergyScreenActiveCallback)(uSynergyCookie cookie, uSynergyBool active); + + + +/** +@brief Mouse callback + +This callback is called when a mouse events happens. The mouse X and Y position, +wheel and button state is communicated in the message. It's up to the user to +interpret if this is a mouse up, down, double-click or other message. + +@param cookie Cookie supplied in the Synergy context +@param x Mouse X position +@param y Mouse Y position +@param wheelX Mouse wheel X position +@param wheelY Mouse wheel Y position +@param buttonLeft Left button pressed status, 0 for released, 1 for pressed +@param buttonMiddle Middle button pressed status, 0 for released, 1 for pressed +@param buttonRight Right button pressed status, 0 for released, 1 for pressed +**/ +typedef void (*uSynergyMouseCallback)(uSynergyCookie cookie, uint16_t x, uint16_t y, int16_t wheelX, int16_t wheelY, uSynergyBool buttonLeft, uSynergyBool buttonRight, uSynergyBool buttonMiddle); + + + +/** +@brief Key event callback + +This callback is called when a key is pressed or released. + +@param cookie Cookie supplied in the Synergy context +@param key Key code of key that was pressed or released +@param modifiers Status of modifier keys (alt, shift, etc.) +@param down Down or up status, 1 is key is pressed down, 0 if key is released (up) +@param repeat Repeat flag, 1 if the key is down because the key is repeating, 0 if the key is initially pressed by the user +**/ +typedef void (*uSynergyKeyboardCallback)(uSynergyCookie cookie, uint16_t key, uint16_t modifiers, uSynergyBool down, uSynergyBool repeat); + + + +/** +@brief Joystick event callback + +This callback is called when a joystick stick or button changes. It is possible that multiple callbacks are +fired when different sticks or buttons change as these are individual messages in the packet stream. Each +callback will contain all the valid state for the different axes and buttons. The last callback received will +represent the most current joystick state. + +@param cookie Cookie supplied in the Synergy context +@param joyNum Joystick number, always in the range [0 ... USYNERGY_NUM_JOYSTICKS> +@param buttons Button pressed mask +@param leftStickX Left stick X position, in range [-127 ... 127] +@param leftStickY Left stick Y position, in range [-127 ... 127] +@param rightStickX Right stick X position, in range [-127 ... 127] +@param rightStickY Right stick Y position, in range [-127 ... 127] +**/ +typedef void (*uSynergyJoystickCallback)(uSynergyCookie cookie, uint8_t joyNum, uint16_t buttons, int8_t leftStickX, int8_t leftStickY, int8_t rightStickX, int8_t rightStickY); + + + +/** +@brief Clipboard event callback + +This callback is called when something is placed on the clipboard. Multiple callbacks may be fired for +multiple clipboard formats if they are supported. The data provided is read-only and may not be modified +by the application. + +@param cookie Cookie supplied in the Synergy context +@param format Clipboard format +@param data Memory area containing the clipboard raw data +@param size Size of clipboard data +**/ +typedef void (*uSynergyClipboardCallback)(uSynergyCookie cookie, enum uSynergyClipboardFormat format, const uint8_t *data, uint32_t size); + + + +//--------------------------------------------------------------------------------------------------------------------- +// Context +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief uSynergy context +**/ +typedef struct +{ + /* Mandatory configuration data, filled in by client */ + uSynergyConnectFunc m_connectFunc; /* Connect function */ + uSynergySendFunc m_sendFunc; /* Send data function */ + uSynergyReceiveFunc m_receiveFunc; /* Receive data function */ + uSynergySleepFunc m_sleepFunc; /* Thread sleep function */ + uSynergyGetTimeFunc m_getTimeFunc; /* Get current time function */ + const char* m_clientName; /* Name of Synergy Screen / Client */ + uint16_t m_clientWidth; /* Width of screen */ + uint16_t m_clientHeight; /* Height of screen */ + + /* Optional configuration data, filled in by client */ + uSynergyCookie m_cookie; /* Cookie pointer passed to callback functions (can be NULL) */ + uSynergyTraceFunc m_traceFunc; /* Function for tracing status (can be NULL) */ + uSynergyScreenActiveCallback m_screenActiveCallback; /* Callback for entering and leaving screen */ + uSynergyMouseCallback m_mouseCallback; /* Callback for mouse events */ + uSynergyKeyboardCallback m_keyboardCallback; /* Callback for keyboard events */ + uSynergyJoystickCallback m_joystickCallback; /* Callback for joystick events */ + uSynergyClipboardCallback m_clipboardCallback; /* Callback for clipboard events */ + + /* State data, used internall by client, initialized by uSynergyInit() */ + uSynergyBool m_connected; /* Is our socket connected? */ + uSynergyBool m_hasReceivedHello; /* Have we received a 'Hello' from the server? */ + uSynergyBool m_isCaptured; /* Is Synergy active (i.e. this client is receiving input messages?) */ + uint32_t m_lastMessageTime; /* Time at which last message was received */ + uint32_t m_sequenceNumber; /* Packet sequence number */ + uint8_t m_receiveBuffer[USYNERGY_RECEIVE_BUFFER_SIZE]; /* Receive buffer */ + int m_receiveOfs; /* Receive buffer offset */ + uint8_t m_replyBuffer[USYNERGY_REPLY_BUFFER_SIZE]; /* Reply buffer */ + uint8_t* m_replyCur; /* Write offset into reply buffer */ + uint16_t m_mouseX; /* Mouse X position */ + uint16_t m_mouseY; /* Mouse Y position */ + int16_t m_mouseWheelX; /* Mouse wheel X position */ + int16_t m_mouseWheelY; /* Mouse wheel Y position */ + uSynergyBool m_mouseButtonLeft; /* Mouse left button */ + uSynergyBool m_mouseButtonRight; /* Mouse right button */ + uSynergyBool m_mouseButtonMiddle; /* Mouse middle button */ + int8_t m_joystickSticks[USYNERGY_NUM_JOYSTICKS][4]; /* Joystick stick position in 2 axes for 2 sticks */ + uint16_t m_joystickButtons[USYNERGY_NUM_JOYSTICKS]; /* Joystick button state */ +} uSynergyContext; + + + +//--------------------------------------------------------------------------------------------------------------------- +// Interface +//--------------------------------------------------------------------------------------------------------------------- + + + +/** +@brief Initialize uSynergy context + +This function initializes @a context for use. Call this function directly after +creating the context, before filling in any configuration data in it. Not calling +this function will cause undefined behavior. + +@param context Context to be initialized +**/ +extern void uSynergyInit(uSynergyContext *context); + + + +/** +@brief Update uSynergy + +This function updates uSynergy and does the bulk of the work. It does connection management, +receiving data, reconnecting after errors or timeouts and so on. It assumes that networking +operations are blocking and it can suspend the current thread if it needs to wait. It is +best practice to call uSynergyUpdate from a background thread so it is responsive. + +Because uSynergy relies mostly on blocking calls it will mostly stay in thread sleep state +waiting for system mutexes and won't eat much memory. + +uSynergyUpdate doesn't do any memory allocations or have any side effects beyond those of +the callbacks it calls. + +@param context Context to be updated +**/ +extern void uSynergyUpdate(uSynergyContext *context); + + + +/** +@brief Send clipboard data + +This function sets new clipboard data and sends it to the server. Use this function if +your client cuts or copies data onto the clipboard that it needs to share with the +server. + +Currently there is only support for plaintext, but HTML and image data could be +supported with some effort. + +@param context Context to send clipboard data to +@param text Text to set to the clipboard +**/ +extern void uSynergySendClipboard(uSynergyContext *context, const char *text); + + + +#ifdef __cplusplus +}; +#endif diff --git a/ImGui/imconfig.h b/ImGui/imconfig.h new file mode 100644 index 0000000..876cf32 --- /dev/null +++ b/ImGui/imconfig.h @@ -0,0 +1,122 @@ +//----------------------------------------------------------------------------- +// COMPILE-TIME OPTIONS FOR DEAR IMGUI +// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure. +// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions. +//----------------------------------------------------------------------------- +// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/rebased branch with your modifications to it) +// B) or '#define IMGUI_USER_CONFIG "my_imgui_config.h"' in your project and then add directives in your own file without touching this template. +//----------------------------------------------------------------------------- +// You need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include the imgui*.cpp +// files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures. +// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts. +// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using. +//----------------------------------------------------------------------------- + +#pragma once + +//---- Define assertion handler. Defaults to calling assert(). +// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement. +//#define IM_ASSERT(_EXPR) MyAssert(_EXPR) +//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts + +//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows +// Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() +// for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. +//#define IMGUI_API __declspec( dllexport ) +//#define IMGUI_API __declspec( dllimport ) + +//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names. +//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS +//#define IMGUI_DISABLE_OBSOLETE_KEYIO // 1.87: disable legacy io.KeyMap[]+io.KeysDown[] in favor io.AddKeyEvent(). This will be folded into IMGUI_DISABLE_OBSOLETE_FUNCTIONS in a few versions. + +//---- Disable all of Dear ImGui or don't implement standard windows/tools. +// It is very strongly recommended to NOT disable the demo windows and debug tool during development. They are extremely useful in day to day work. Please read comments in imgui_demo.cpp. +//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty. +//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. +//#define IMGUI_DISABLE_DEBUG_TOOLS // Disable metrics/debugger and other debug tools: ShowMetricsWindow(), ShowDebugLogWindow() and ShowStackToolWindow() will be empty (this was called IMGUI_DISABLE_METRICS_WINDOW before 1.88). + +//---- Don't implement some functions to reduce linkage requirements. +//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc. (user32.lib/.a, kernel32.lib/.a) +//#define IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with Visual Studio] Implement default IME handler (require imm32.lib/.a, auto-link for Visual Studio, -limm32 on command-line for MinGW) +//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] [Default with non-Visual Studio compilers] Don't implement default IME handler (won't require imm32.lib/.a) +//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime). +//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default). +//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf) +//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself. +//#define IMGUI_DISABLE_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle at all (replace them with dummies) +//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite and ImFileHandle so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function. +//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions(). +//#define IMGUI_DISABLE_SSE // Disable use of SSE intrinsics even if available + +//---- Include imgui_user.h at the end of imgui.h as a convenience +//#define IMGUI_INCLUDE_IMGUI_USER_H + +//---- Pack colors to BGRA8 instead of RGBA8 (to avoid converting from one to another) +//#define IMGUI_USE_BGRA_PACKED_COLOR + +//---- Use 32-bit for ImWchar (default is 16-bit) to support unicode planes 1-16. (e.g. point beyond 0xFFFF like emoticons, dingbats, symbols, shapes, ancient languages, etc...) +//#define IMGUI_USE_WCHAR32 + +//---- Avoid multiple STB libraries implementations, or redefine path/filenames to prioritize another version +// By default the embedded implementations are declared static and not available outside of Dear ImGui sources files. +//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" +//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" +//#define IMGUI_STB_SPRINTF_FILENAME "my_folder/stb_sprintf.h" // only used if enabled +//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION + +//---- Use stb_sprintf.h for a faster implementation of vsnprintf instead of the one from libc (unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined) +// Compatibility checks of arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by stb_sprintf.h. +//#define IMGUI_USE_STB_SPRINTF + +//---- Use FreeType to build and rasterize the font atlas (instead of stb_truetype which is embedded by default in Dear ImGui) +// Requires FreeType headers to be available in the include path. Requires program to be compiled with 'misc/freetype/imgui_freetype.cpp' (in this repository) + the FreeType library (not provided). +// On Windows you may use vcpkg with 'vcpkg install freetype --triplet=x64-windows' + 'vcpkg integrate install'. +//#define IMGUI_ENABLE_FREETYPE + +//---- Use stb_truetype to build and rasterize the font atlas (default) +// The only purpose of this define is if you want force compilation of the stb_truetype backend ALONG with the FreeType backend. +//#define IMGUI_ENABLE_STB_TRUETYPE + +//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4. +// This will be inlined as part of ImVec2 and ImVec4 class declarations. +/* +#define IM_VEC2_CLASS_EXTRA \ + constexpr ImVec2(const MyVec2& f) : x(f.x), y(f.y) {} \ + operator MyVec2() const { return MyVec2(x,y); } + +#define IM_VEC4_CLASS_EXTRA \ + constexpr ImVec4(const MyVec4& f) : x(f.x), y(f.y), z(f.z), w(f.w) {} \ + operator MyVec4() const { return MyVec4(x,y,z,w); } +*/ +//---- ...Or use Dear ImGui's own very basic math operators. +//#define IMGUI_DEFINE_MATH_OPERATORS + +//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices. +// Your renderer backend will need to support it (most example renderer backends support both 16/32-bit indices). +// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer. +// Read about ImGuiBackendFlags_RendererHasVtxOffset for details. +//#define ImDrawIdx unsigned int + +//---- Override ImDrawCallback signature (will need to modify renderer backends accordingly) +//struct ImDrawList; +//struct ImDrawCmd; +//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data); +//#define ImDrawCallback MyImDrawCallback + +//---- Debug Tools: Macro to break in Debugger +// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.) +//#define IM_DEBUG_BREAK IM_ASSERT(0) +//#define IM_DEBUG_BREAK __debugbreak() + +//---- Debug Tools: Enable slower asserts +//#define IMGUI_DEBUG_PARANOID + +//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files. +/* +namespace ImGui +{ + void MyFunction(const char* name, const MyMatrix44& v); +} +*/ diff --git a/ImGui/imgui.cpp b/ImGui/imgui.cpp new file mode 100644 index 0000000..075addd --- /dev/null +++ b/ImGui/imgui.cpp @@ -0,0 +1,14597 @@ +// dear imgui, v1.89.4 WIP +// (main code and documentation) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/5886 (please post your screenshots/video there!) +// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Issues & support https://github.com/ocornut/imgui/issues + +// Getting Started? +// - For first-time users having issues compiling/linking/running or issues loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. + +// Developed by Omar Cornut and every direct or indirect contributors to the GitHub. +// See LICENSE.txt for copyright and licensing details (standard MIT License). +// This library is free but needs your support to sustain development and maintenance. +// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.com". +// Individuals: you can support continued development via donations. See docs/README or web page. + +// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library. +// Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without +// modifying imgui.h or imgui.cpp. You may include imgui_internal.h to access internal data structures, but it doesn't +// come with any guarantee of forward compatibility. Discussing your changes on the GitHub Issue Tracker may lead you +// to a better solution or official support for them. + +/* + +Index of this file: + +DOCUMENTATION + +- MISSION STATEMENT +- CONTROLS GUIDE +- PROGRAMMER GUIDE + - READ FIRST + - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + - HOW A SIMPLE APPLICATION MAY LOOK LIKE + - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE +- API BREAKING CHANGES (read me when you update!) +- FREQUENTLY ASKED QUESTIONS (FAQ) + - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer) + +CODE +(search for "[SECTION]" in the code to find them) + +// [SECTION] INCLUDES +// [SECTION] FORWARD DECLARATIONS +// [SECTION] CONTEXT AND MEMORY ALLOCATORS +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +// [SECTION] MISC HELPERS/UTILITIES (File functions) +// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) +// [SECTION] MISC HELPERS/UTILITIES (Color functions) +// [SECTION] ImGuiStorage +// [SECTION] ImGuiTextFilter +// [SECTION] ImGuiTextBuffer, ImGuiTextIndex +// [SECTION] ImGuiListClipper +// [SECTION] STYLING +// [SECTION] RENDER HELPERS +// [SECTION] INITIALIZATION, SHUTDOWN +// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +// [SECTION] INPUTS +// [SECTION] ERROR CHECKING +// [SECTION] LAYOUT +// [SECTION] SCROLLING +// [SECTION] TOOLTIPS +// [SECTION] POPUPS +// [SECTION] KEYBOARD/GAMEPAD NAVIGATION +// [SECTION] DRAG AND DROP +// [SECTION] LOGGING/CAPTURING +// [SECTION] SETTINGS +// [SECTION] LOCALIZATION +// [SECTION] VIEWPORTS, PLATFORM WINDOWS +// [SECTION] PLATFORM DEPENDENT HELPERS +// [SECTION] METRICS/DEBUGGER WINDOW +// [SECTION] DEBUG LOG WINDOW +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) + +*/ + +//----------------------------------------------------------------------------- +// DOCUMENTATION +//----------------------------------------------------------------------------- + +/* + + MISSION STATEMENT + ================= + + - Easy to use to create code-driven and data-driven tools. + - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools. + - Easy to hack and improve. + - Minimize setup and maintenance. + - Minimize state storage on user side. + - Minimize state synchronization. + - Portable, minimize dependencies, run on target (consoles, phones, etc.). + - Efficient runtime and memory consumption. + + Designed for developers and content-creators, not the typical end-user! Some of the current weaknesses includes: + + - Doesn't look fancy, doesn't animate. + - Limited layout features, intricate layouts are typically crafted in code. + + + CONTROLS GUIDE + ============== + + - MOUSE CONTROLS + - Mouse wheel: Scroll vertically. + - SHIFT+Mouse wheel: Scroll horizontally. + - Click [X]: Close a window, available when 'bool* p_open' is passed to ImGui::Begin(). + - Click ^, Double-Click title: Collapse window. + - Drag on corner/border: Resize window (double-click to auto fit window to its contents). + - Drag on any empty space: Move window (unless io.ConfigWindowsMoveFromTitleBarOnly = true). + - Left-click outside popup: Close popup stack (right-click over underlying popup: Partially close popup stack). + + - TEXT EDITOR + - Hold SHIFT or Drag Mouse: Select text. + - CTRL+Left/Right: Word jump. + - CTRL+Shift+Left/Right: Select words. + - CTRL+A or Double-Click: Select All. + - CTRL+X, CTRL+C, CTRL+V: Use OS clipboard. + - CTRL+Z, CTRL+Y: Undo, Redo. + - ESCAPE: Revert text to its original value. + - On OSX, controls are automatically adjusted to match standard OSX text editing shortcuts and behaviors. + + - KEYBOARD CONTROLS + - Basic: + - Tab, SHIFT+Tab Cycle through text editable fields. + - CTRL+Tab, CTRL+Shift+Tab Cycle through windows. + - CTRL+Click Input text into a Slider or Drag widget. + - Extended features with `io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard`: + - Tab, SHIFT+Tab: Cycle through every items. + - Arrow keys Move through items using directional navigation. Tweak value. + - Arrow keys + Alt, Shift Tweak slower, tweak faster (when using arrow keys). + - Enter Activate item (prefer text input when possible). + - Space Activate item (prefer tweaking with arrows when possible). + - Escape Deactivate item, leave child window, close popup. + - Page Up, Page Down Previous page, next page. + - Home, End Scroll to top, scroll to bottom. + - Alt Toggle between scrolling layer and menu layer. + - CTRL+Tab then Ctrl+Arrows Move window. Hold SHIFT to resize instead of moving. + - Output when ImGuiConfigFlags_NavEnableKeyboard set, + - io.WantCaptureKeyboard flag is set when keyboard is claimed. + - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set. + - io.NavVisible: true when the navigation cursor is visible (usually goes to back false when mouse is used). + + - GAMEPAD CONTROLS + - Enable with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. + - Particularly useful to use Dear ImGui on a console system (e.g. PlayStation, Switch, Xbox) without a mouse! + - Download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets + - Backend support: backend needs to: + - Set 'io.BackendFlags |= ImGuiBackendFlags_HasGamepad' + call io.AddKeyEvent/AddKeyAnalogEvent() with ImGuiKey_Gamepad_XXX keys. + - For analog values (0.0f to 1.0f), backend is responsible to handling a dead-zone and rescaling inputs accordingly. + Backend code will probably need to transform your raw inputs (such as e.g. remapping your 0.2..0.9 raw input range to 0.0..1.0 imgui range, etc.). + - BEFORE 1.87, BACKENDS USED TO WRITE TO io.NavInputs[]. This is now obsolete. Please call io functions instead! + - If you need to share inputs between your game and the Dear ImGui interface, the easiest approach is to go all-or-nothing, + with a buttons combo to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved. + + - REMOTE INPUTS SHARING & MOUSE EMULATION + - PS4/PS5 users: Consider emulating a mouse cursor with DualShock touch pad or a spare analog stick as a mouse-emulation fallback. + - Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + run examples/libs/synergy/uSynergy.c (on your console/tablet/phone app) + in order to share your PC mouse/keyboard. + - See https://github.com/ocornut/imgui/wiki/Useful-Extensions#remoting for other remoting solutions. + - On a TV/console system where readability may be lower or mouse inputs may be awkward, you may want to set the ImGuiConfigFlags_NavEnableSetMousePos flag. + Enabling ImGuiConfigFlags_NavEnableSetMousePos + ImGuiBackendFlags_HasSetMousePos instructs Dear ImGui to move your mouse cursor along with navigation movements. + When enabled, the NewFrame() function may alter 'io.MousePos' and set 'io.WantSetMousePos' to notify you that it wants the mouse cursor to be moved. + When that happens your backend NEEDS to move the OS or underlying mouse cursor on the next frame. Some of the backends in examples/ do that. + (If you set the NavEnableSetMousePos flag but don't honor 'io.WantSetMousePos' properly, Dear ImGui will misbehave as it will see your mouse moving back & forth!) + (In a setup when you may not have easy control over the mouse cursor, e.g. uSynergy.c doesn't expose moving remote mouse cursor, you may want + to set a boolean to ignore your other external mouse positions until the external source is moved again.) + + + PROGRAMMER GUIDE + ================ + + READ FIRST + ---------- + - Remember to check the wonderful Wiki (https://github.com/ocornut/imgui/wiki) + - Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction or + destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, fewer bugs. + - Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features. + - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build. + - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori). + You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links in Wiki. + - Dear ImGui is a "single pass" rasterizing implementation of the IMGUI paradigm, aimed at ease of use and high-performances. + For every application frame, your UI code will be called only once. This is in contrast to e.g. Unity's implementation of an IMGUI, + where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches. + - Our origin is on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right. + - This codebase is also optimized to yield decent performances with typical "Debug" builds settings. + - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected). + If you get an assert, read the messages and comments around the assert. + - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace. + - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types. + See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that. + However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase. + - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!). + + + HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI + ---------------------------------------------- + - Overwrite all the sources files except for imconfig.h (if you have modified your copy of imconfig.h) + - Or maintain your own branch where you have imconfig.h modified as a top-most commit which you can regularly rebase over "master". + - You can also use '#define IMGUI_USER_CONFIG "my_config_file.h" to redirect configuration to your own file. + - Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes. + If a function/type has been renamed / or marked obsolete, try to fix the name in your code before it is permanently removed + from the public API. If you have a problem with a missing function/symbols, search for its name in the code, there will + likely be a comment about it. Please report any issue to the GitHub page! + - To find out usage of old API, you can add '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in your configuration file. + - Try to keep your copy of Dear ImGui reasonably up to date. + + + GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE + --------------------------------------------------------------- + - Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library. + - In the majority of cases you should be able to use unmodified backends files available in the backends/ folder. + - Add the Dear ImGui source files + selected backend source files to your projects or using your preferred build system. + It is recommended you build and statically link the .cpp files as part of your project and NOT as a shared library (DLL). + - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types. + - When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them. + - Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide. + Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render" + phases of your own application. All rendering information is stored into command-lists that you will retrieve after calling ImGui::Render(). + - Refer to the backends and demo applications in the examples/ folder for instruction on how to setup your code. + - If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder. + + + HOW A SIMPLE APPLICATION MAY LOOK LIKE + -------------------------------------- + EXHIBIT 1: USING THE EXAMPLE BACKENDS (= imgui_impl_XXX.cpp files from the backends/ folder). + The sub-folders in examples/ contain examples applications following this structure. + + // Application init: create a dear imgui context, setup some options, load fonts + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. + // TODO: Fill optional fields of the io structure later. + // TODO: Load TTF/OTF fonts if you don't want to use the default font. + + // Initialize helper Platform and Renderer backends (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp) + ImGui_ImplWin32_Init(hwnd); + ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext); + + // Application main loop + while (true) + { + // Feed inputs to dear imgui, start new frame + ImGui_ImplDX11_NewFrame(); + ImGui_ImplWin32_NewFrame(); + ImGui::NewFrame(); + + // Any application code here + ImGui::Text("Hello, world!"); + + // Render dear imgui into screen + ImGui::Render(); + ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData()); + g_pSwapChain->Present(1, 0); + } + + // Shutdown + ImGui_ImplDX11_Shutdown(); + ImGui_ImplWin32_Shutdown(); + ImGui::DestroyContext(); + + EXHIBIT 2: IMPLEMENTING CUSTOM BACKEND / CUSTOM ENGINE + + // Application init: create a dear imgui context, setup some options, load fonts + ImGui::CreateContext(); + ImGuiIO& io = ImGui::GetIO(); + // TODO: Set optional io.ConfigFlags values, e.g. 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard' to enable keyboard controls. + // TODO: Fill optional fields of the io structure later. + // TODO: Load TTF/OTF fonts if you don't want to use the default font. + + // Build and load the texture atlas into a texture + // (In the examples/ app this is usually done within the ImGui_ImplXXX_Init() function from one of the demo Renderer) + int width, height; + unsigned char* pixels = NULL; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // At this point you've got the texture data and you need to upload that to your graphic system: + // After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'. + // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID. + MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32) + io.Fonts->SetTexID((void*)texture); + + // Application main loop + while (true) + { + // Setup low-level inputs, e.g. on Win32: calling GetKeyboardState(), or write to those fields from your Windows message handlers, etc. + // (In the examples/ app this is usually done within the ImGui_ImplXXX_NewFrame() function from one of the demo Platform Backends) + io.DeltaTime = 1.0f/60.0f; // set the time elapsed since the previous frame (in seconds) + io.DisplaySize.x = 1920.0f; // set the current display width + io.DisplaySize.y = 1280.0f; // set the current display height here + io.AddMousePosEvent(mouse_x, mouse_y); // update mouse position + io.AddMouseButtonEvent(0, mouse_b[0]); // update mouse button states + io.AddMouseButtonEvent(1, mouse_b[1]); // update mouse button states + + // Call NewFrame(), after this point you can use ImGui::* functions anytime + // (So you want to try calling NewFrame() as early as you can in your main loop to be able to use Dear ImGui everywhere) + ImGui::NewFrame(); + + // Most of your application code here + ImGui::Text("Hello, world!"); + MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End(); + MyGameRender(); // may use any Dear ImGui functions as well! + + // Render dear imgui, swap buffers + // (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code) + ImGui::EndFrame(); + ImGui::Render(); + ImDrawData* draw_data = ImGui::GetDrawData(); + MyImGuiRenderFunction(draw_data); + SwapBuffers(); + } + + // Shutdown + ImGui::DestroyContext(); + + To decide whether to dispatch mouse/keyboard inputs to Dear ImGui to the rest of your application, + you should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + Please read the FAQ and example applications for details about this! + + + HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE + --------------------------------------------- + The backends in impl_impl_XXX.cpp files contain many working implementations of a rendering function. + + void MyImGuiRenderFunction(ImDrawData* draw_data) + { + // TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled + // TODO: Setup texture sampling state: sample with bilinear filtering (NOT point/nearest filtering). Use 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines;' to allow point/nearest filtering. + // TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize + // TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize + // TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color. + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui + const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback) + { + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // We are using scissoring to clip some objects. All low-level graphics API should support it. + // - If your engine doesn't support scissoring yet, you may ignore this at first. You will get some small glitches + // (some elements visible outside their bounds) but you can fix that once everything else works! + // - Clipping coordinates are provided in imgui coordinates space: + // - For a given viewport, draw_data->DisplayPos == viewport->Pos and draw_data->DisplaySize == viewport->Size + // - In a single viewport application, draw_data->DisplayPos == (0,0) and draw_data->DisplaySize == io.DisplaySize, but always use GetMainViewport()->Pos/Size instead of hardcoding those values. + // - In the interest of supporting multi-viewport applications (see 'docking' branch on github), + // always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space. + // - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min) + MyEngineSetScissor(clip_min.x, clip_min.y, clip_max.x, clip_max.y); + + // The texture for the draw call is specified by pcmd->GetTexID(). + // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization. + MyEngineBindTexture((MyTexture*)pcmd->GetTexID()); + + // Render 'pcmd->ElemCount/3' indexed triangles. + // By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices. + MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer + pcmd->IdxOffset, vtx_buffer, pcmd->VtxOffset); + } + } + } + } + + + API BREAKING CHANGES + ==================== + + Occasionally introducing changes that are breaking the API. We try to make the breakage minor and easy to fix. + Below is a change-log of API breaking changes only. If you are using one of the functions listed, expect to have to fix some code. + When you are not sure about an old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files. + You can read releases logs https://github.com/ocornut/imgui/releases for more details. + + - 2023/03/09 (1.89.4) - renamed PushAllowKeyboardFocus()/PopAllowKeyboardFocus() to PushTabStop()/PopTabStop(). Kept inline redirection functions (will obsolete). + - 2023/03/09 (1.89.4) - tooltips: Added 'bool' return value to BeginTooltip() for API consistency. Please only submit contents and call EndTooltip() if BeginTooltip() returns true. In reality the function will _currently_ always return true, but further changes down the line may change this, best to clarify API sooner. + - 2023/02/15 (1.89.4) - moved the optional "courtesy maths operators" implementation from imgui_internal.h in imgui.h. + Even though we encourage using your own maths types and operators by setting up IM_VEC2_CLASS_EXTRA, + it has been frequently requested by people to use our own. We had an opt-in define which was + previously fulfilled in imgui_internal.h. It is now fulfilled in imgui.h. (#6164) + - OK: #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui.h" / #include "imgui_internal.h" + - Error: #include "imgui.h" / #define IMGUI_DEFINE_MATH_OPERATORS / #include "imgui_internal.h" + - 2023/02/07 (1.89.3) - backends: renamed "imgui_impl_sdl.cpp" to "imgui_impl_sdl2.cpp" and "imgui_impl_sdl.h" to "imgui_impl_sdl2.h". (#6146) This is in prevision for the future release of SDL3. + - 2022/10/26 (1.89) - commented out redirecting OpenPopupContextItem() which was briefly the name of OpenPopupOnItemClick() from 1.77 to 1.79. + - 2022/10/12 (1.89) - removed runtime patching of invalid "%f"/"%0.f" format strings for DragInt()/SliderInt(). This was obsoleted in 1.61 (May 2018). See 1.61 changelog for details. + - 2022/09/26 (1.89) - renamed and merged keyboard modifiers key enums and flags into a same set. Kept inline redirection enums (will obsolete). + - ImGuiKey_ModCtrl and ImGuiModFlags_Ctrl -> ImGuiMod_Ctrl + - ImGuiKey_ModShift and ImGuiModFlags_Shift -> ImGuiMod_Shift + - ImGuiKey_ModAlt and ImGuiModFlags_Alt -> ImGuiMod_Alt + - ImGuiKey_ModSuper and ImGuiModFlags_Super -> ImGuiMod_Super + the ImGuiKey_ModXXX were introduced in 1.87 and mostly used by backends. + the ImGuiModFlags_XXX have been exposed in imgui.h but not really used by any public api only by third-party extensions. + exceptionally commenting out the older ImGuiKeyModFlags_XXX names ahead of obsolescence schedule to reduce confusion and because they were not meant to be used anyway. + - 2022/09/20 (1.89) - ImGuiKey is now a typed enum, allowing ImGuiKey_XXX symbols to be named in debuggers. + this will require uses of legacy backend-dependent indices to be casted, e.g. + - with imgui_impl_glfw: IsKeyPressed(GLFW_KEY_A) -> IsKeyPressed((ImGuiKey)GLFW_KEY_A); + - with imgui_impl_win32: IsKeyPressed('A') -> IsKeyPressed((ImGuiKey)'A') + - etc. However if you are upgrading code you might well use the better, backend-agnostic IsKeyPressed(ImGuiKey_A) now! + - 2022/09/12 (1.89) - removed the bizarre legacy default argument for 'TreePush(const void* ptr = NULL)', always pass a pointer value explicitly. NULL/nullptr is ok but require cast, e.g. TreePush((void*)nullptr); + - 2022/09/05 (1.89) - commented out redirecting functions/enums names that were marked obsolete in 1.77 and 1.78 (June 2020): + - DragScalar(), DragScalarN(), DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(): For old signatures ending with (..., const char* format, float power = 1.0f) -> use (..., format ImGuiSliderFlags_Logarithmic) if power != 1.0f. + - SliderScalar(), SliderScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4(): For old signatures ending with (..., const char* format, float power = 1.0f) -> use (..., format ImGuiSliderFlags_Logarithmic) if power != 1.0f. + - BeginPopupContextWindow(const char*, ImGuiMouseButton, bool) -> use BeginPopupContextWindow(const char*, ImGuiPopupFlags) + - 2022/09/02 (1.89) - obsoleted using SetCursorPos()/SetCursorScreenPos() to extend parent window/cell boundaries. + this relates to when moving the cursor position beyond current boundaries WITHOUT submitting an item. + - previously this would make the window content size ~200x200: + Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End(); + - instead, please submit an item: + Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End(); + - alternative: + Begin(...) + Dummy(ImVec2(200,200)) + End(); + - content size is now only extended when submitting an item! + - with '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' this will now be detected and assert. + - without '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' this will silently be fixed until we obsolete it. + - 2022/08/03 (1.89) - changed signature of ImageButton() function. Kept redirection function (will obsolete). + - added 'const char* str_id' parameter + removed 'int frame_padding = -1' parameter. + - old signature: bool ImageButton(ImTextureID tex_id, ImVec2 size, ImVec2 uv0 = ImVec2(0,0), ImVec2 uv1 = ImVec2(1,1), int frame_padding = -1, ImVec4 bg_col = ImVec4(0,0,0,0), ImVec4 tint_col = ImVec4(1,1,1,1)); + - used the ImTextureID value to create an ID. This was inconsistent with other functions, led to ID conflicts, and caused problems with engines using transient ImTextureID values. + - had a FramePadding override which was inconsistent with other functions and made the already-long signature even longer. + - new signature: bool ImageButton(const char* str_id, ImTextureID tex_id, ImVec2 size, ImVec2 uv0 = ImVec2(0,0), ImVec2 uv1 = ImVec2(1,1), ImVec4 bg_col = ImVec4(0,0,0,0), ImVec4 tint_col = ImVec4(1,1,1,1)); + - requires an explicit identifier. You may still use e.g. PushID() calls and then pass an empty identifier. + - always uses style.FramePadding for padding, to be consistent with other buttons. You may use PushStyleVar() to alter this. + - 2022/07/08 (1.89) - inputs: removed io.NavInputs[] and ImGuiNavInput enum (following 1.87 changes). + - Official backends from 1.87+ -> no issue. + - Official backends from 1.60 to 1.86 -> will build and convert gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need updating! + - Custom backends not writing to io.NavInputs[] -> no issue. + - Custom backends writing to io.NavInputs[] -> will build and convert gamepad inputs, unless IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Need fixing! + - TL;DR: Backends should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values instead of filling io.NavInput[]. + - 2022/06/15 (1.88) - renamed IMGUI_DISABLE_METRICS_WINDOW to IMGUI_DISABLE_DEBUG_TOOLS for correctness. kept support for old define (will obsolete). + - 2022/05/03 (1.88) - backends: osx: removed ImGui_ImplOSX_HandleEvent() from backend API in favor of backend automatically handling event capture. All ImGui_ImplOSX_HandleEvent() calls should be removed as they are now unnecessary. + - 2022/04/05 (1.88) - inputs: renamed ImGuiKeyModFlags to ImGuiModFlags. Kept inline redirection enums (will obsolete). This was never used in public API functions but technically present in imgui.h and ImGuiIO. + - 2022/01/20 (1.87) - inputs: reworded gamepad IO. + - Backend writing to io.NavInputs[] -> backend should call io.AddKeyEvent()/io.AddKeyAnalogEvent() with ImGuiKey_GamepadXXX values. + - 2022/01/19 (1.87) - sliders, drags: removed support for legacy arithmetic operators (+,+-,*,/) when inputing text. This doesn't break any api/code but a feature that used to be accessible by end-users (which seemingly no one used). + - 2022/01/17 (1.87) - inputs: reworked mouse IO. + - Backend writing to io.MousePos -> backend should call io.AddMousePosEvent() + - Backend writing to io.MouseDown[] -> backend should call io.AddMouseButtonEvent() + - Backend writing to io.MouseWheel -> backend should call io.AddMouseWheelEvent() + - Backend writing to io.MouseHoveredViewport -> backend should call io.AddMouseViewportEvent() [Docking branch w/ multi-viewports only] + note: for all calls to IO new functions, the Dear ImGui context should be bound/current. + read https://github.com/ocornut/imgui/issues/4921 for details. + - 2022/01/10 (1.87) - inputs: reworked keyboard IO. Removed io.KeyMap[], io.KeysDown[] in favor of calling io.AddKeyEvent(). Removed GetKeyIndex(), now unecessary. All IsKeyXXX() functions now take ImGuiKey values. All features are still functional until IMGUI_DISABLE_OBSOLETE_KEYIO is defined. Read Changelog and Release Notes for details. + - IsKeyPressed(MY_NATIVE_KEY_XXX) -> use IsKeyPressed(ImGuiKey_XXX) + - IsKeyPressed(GetKeyIndex(ImGuiKey_XXX)) -> use IsKeyPressed(ImGuiKey_XXX) + - Backend writing to io.KeyMap[],io.KeysDown[] -> backend should call io.AddKeyEvent() (+ call io.SetKeyEventNativeData() if you want legacy user code to stil function with legacy key codes). + - Backend writing to io.KeyCtrl, io.KeyShift.. -> backend should call io.AddKeyEvent() with ImGuiMod_XXX values. *IF YOU PULLED CODE BETWEEN 2021/01/10 and 2021/01/27: We used to have a io.AddKeyModsEvent() function which was now replaced by io.AddKeyEvent() with ImGuiMod_XXX values.* + - one case won't work with backward compatibility: if your custom backend used ImGuiKey as mock native indices (e.g. "io.KeyMap[ImGuiKey_A] = ImGuiKey_A") because those values are now larger than the legacy KeyDown[] array. Will assert. + - inputs: added ImGuiKey_ModCtrl/ImGuiKey_ModShift/ImGuiKey_ModAlt/ImGuiKey_ModSuper values to submit keyboard modifiers using io.AddKeyEvent(), instead of writing directly to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper. + - 2022/01/05 (1.87) - inputs: renamed ImGuiKey_KeyPadEnter to ImGuiKey_KeypadEnter to align with new symbols. Kept redirection enum. + - 2022/01/05 (1.87) - removed io.ImeSetInputScreenPosFn() in favor of more flexible io.SetPlatformImeDataFn(). Removed 'void* io.ImeWindowHandle' in favor of writing to 'void* ImGuiViewport::PlatformHandleRaw'. + - 2022/01/01 (1.87) - commented out redirecting functions/enums names that were marked obsolete in 1.69, 1.70, 1.71, 1.72 (March-July 2019) + - ImGui::SetNextTreeNodeOpen() -> use ImGui::SetNextItemOpen() + - ImGui::GetContentRegionAvailWidth() -> use ImGui::GetContentRegionAvail().x + - ImGui::TreeAdvanceToLabelPos() -> use ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetTreeNodeToLabelSpacing()); + - ImFontAtlas::CustomRect -> use ImFontAtlasCustomRect + - ImGuiColorEditFlags_RGB/HSV/HEX -> use ImGuiColorEditFlags_DisplayRGB/HSV/Hex + - 2021/12/20 (1.86) - backends: removed obsolete Marmalade backend (imgui_impl_marmalade.cpp) + example. Find last supported version at https://github.com/ocornut/imgui/wiki/Bindings + - 2021/11/04 (1.86) - removed CalcListClipping() function. Prefer using ImGuiListClipper which can return non-contiguous ranges. Please open an issue if you think you really need this function. + - 2021/08/23 (1.85) - removed GetWindowContentRegionWidth() function. keep inline redirection helper. can use 'GetWindowContentRegionMax().x - GetWindowContentRegionMin().x' instead for generally 'GetContentRegionAvail().x' is more useful. + - 2021/07/26 (1.84) - commented out redirecting functions/enums names that were marked obsolete in 1.67 and 1.69 (March 2019): + - ImGui::GetOverlayDrawList() -> use ImGui::GetForegroundDrawList() + - ImFont::GlyphRangesBuilder -> use ImFontGlyphRangesBuilder + - 2021/05/19 (1.83) - backends: obsoleted direct access to ImDrawCmd::TextureId in favor of calling ImDrawCmd::GetTexID(). + - if you are using official backends from the source tree: you have nothing to do. + - if you have copied old backend code or using your own: change access to draw_cmd->TextureId to draw_cmd->GetTexID(). + - 2021/03/12 (1.82) - upgraded ImDrawList::AddRect(), AddRectFilled(), PathRect() to use ImDrawFlags instead of ImDrawCornersFlags. + - ImDrawCornerFlags_TopLeft -> use ImDrawFlags_RoundCornersTopLeft + - ImDrawCornerFlags_BotRight -> use ImDrawFlags_RoundCornersBottomRight + - ImDrawCornerFlags_None -> use ImDrawFlags_RoundCornersNone etc. + flags now sanely defaults to 0 instead of 0x0F, consistent with all other flags in the API. + breaking: the default with rounding > 0.0f is now "round all corners" vs old implicit "round no corners": + - rounding == 0.0f + flags == 0 --> meant no rounding --> unchanged (common use) + - rounding > 0.0f + flags != 0 --> meant rounding --> unchanged (common use) + - rounding == 0.0f + flags != 0 --> meant no rounding --> unchanged (unlikely use) + - rounding > 0.0f + flags == 0 --> meant no rounding --> BREAKING (unlikely use): will now round all corners --> use ImDrawFlags_RoundCornersNone or rounding == 0.0f. + this ONLY matters for hard coded use of 0 + rounding > 0.0f. Use of named ImDrawFlags_RoundCornersNone (new) or ImDrawCornerFlags_None (old) are ok. + the old ImDrawCornersFlags used awkward default values of ~0 or 0xF (4 lower bits set) to signify "round all corners" and we sometimes encouraged using them as shortcuts. + legacy path still support use of hard coded ~0 or any value from 0x1 or 0xF. They will behave the same with legacy paths enabled (will assert otherwise). + - 2021/03/11 (1.82) - removed redirecting functions/enums names that were marked obsolete in 1.66 (September 2018): + - ImGui::SetScrollHere() -> use ImGui::SetScrollHereY() + - 2021/03/11 (1.82) - clarified that ImDrawList::PathArcTo(), ImDrawList::PathArcToFast() won't render with radius < 0.0f. Previously it sorts of accidentally worked but would generally lead to counter-clockwise paths and have an effect on anti-aliasing. + - 2021/03/10 (1.82) - upgraded ImDrawList::AddPolyline() and PathStroke() "bool closed" parameter to "ImDrawFlags flags". The matching ImDrawFlags_Closed value is guaranteed to always stay == 1 in the future. + - 2021/02/22 (1.82) - (*undone in 1.84*) win32+mingw: Re-enabled IME functions by default even under MinGW. In July 2016, issue #738 had me incorrectly disable those default functions for MinGW. MinGW users should: either link with -limm32, either set their imconfig file with '#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS'. + - 2021/02/17 (1.82) - renamed rarely used style.CircleSegmentMaxError (old default = 1.60f) to style.CircleTessellationMaxError (new default = 0.30f) as the meaning of the value changed. + - 2021/02/03 (1.81) - renamed ListBoxHeader(const char* label, ImVec2 size) to BeginListBox(). Kept inline redirection function (will obsolete). + - removed ListBoxHeader(const char* label, int items_count, int height_in_items = -1) in favor of specifying size. Kept inline redirection function (will obsolete). + - renamed ListBoxFooter() to EndListBox(). Kept inline redirection function (will obsolete). + - 2021/01/26 (1.81) - removed ImGuiFreeType::BuildFontAtlas(). Kept inline redirection function. Prefer using '#define IMGUI_ENABLE_FREETYPE', but there's a runtime selection path available too. The shared extra flags parameters (very rarely used) are now stored in ImFontAtlas::FontBuilderFlags. + - renamed ImFontConfig::RasterizerFlags (used by FreeType) to ImFontConfig::FontBuilderFlags. + - renamed ImGuiFreeType::XXX flags to ImGuiFreeTypeBuilderFlags_XXX for consistency with other API. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.63 (August 2018): + - ImGui::IsItemDeactivatedAfterChange() -> use ImGui::IsItemDeactivatedAfterEdit(). + - ImGuiCol_ModalWindowDarkening -> use ImGuiCol_ModalWindowDimBg + - ImGuiInputTextCallback -> use ImGuiTextEditCallback + - ImGuiInputTextCallbackData -> use ImGuiTextEditCallbackData + - 2020/12/21 (1.80) - renamed ImDrawList::AddBezierCurve() to AddBezierCubic(), and PathBezierCurveTo() to PathBezierCubicCurveTo(). Kept inline redirection function (will obsolete). + - 2020/12/04 (1.80) - added imgui_tables.cpp file! Manually constructed project files will need the new file added! + - 2020/11/18 (1.80) - renamed undocumented/internals ImGuiColumnsFlags_* to ImGuiOldColumnFlags_* in prevision of incoming Tables API. + - 2020/11/03 (1.80) - renamed io.ConfigWindowsMemoryCompactTimer to io.ConfigMemoryCompactTimer as the feature will apply to other data structures + - 2020/10/14 (1.80) - backends: moved all backends files (imgui_impl_XXXX.cpp, imgui_impl_XXXX.h) from examples/ to backends/. + - 2020/10/12 (1.80) - removed redirecting functions/enums that were marked obsolete in 1.60 (April 2018): + - io.RenderDrawListsFn pointer -> use ImGui::GetDrawData() value and call the render function of your backend + - ImGui::IsAnyWindowFocused() -> use ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow) + - ImGui::IsAnyWindowHovered() -> use ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + - ImGuiStyleVar_Count_ -> use ImGuiStyleVar_COUNT + - ImGuiMouseCursor_Count_ -> use ImGuiMouseCursor_COUNT + - removed redirecting functions names that were marked obsolete in 1.61 (May 2018): + - InputFloat (... int decimal_precision ...) -> use InputFloat (... const char* format ...) with format = "%.Xf" where X is your value for decimal_precision. + - same for InputFloat2()/InputFloat3()/InputFloat4() variants taking a `int decimal_precision` parameter. + - 2020/10/05 (1.79) - removed ImGuiListClipper: Renamed constructor parameters which created an ambiguous alternative to using the ImGuiListClipper::Begin() function, with misleading edge cases (note: imgui_memory_editor <0.40 from imgui_club/ used this old clipper API. Update your copy if needed). + - 2020/09/25 (1.79) - renamed ImGuiSliderFlags_ClampOnInput to ImGuiSliderFlags_AlwaysClamp. Kept redirection enum (will obsolete sooner because previous name was added recently). + - 2020/09/25 (1.79) - renamed style.TabMinWidthForUnselectedCloseButton to style.TabMinWidthForCloseButton. + - 2020/09/21 (1.79) - renamed OpenPopupContextItem() back to OpenPopupOnItemClick(), reverting the change from 1.77. For varieties of reason this is more self-explanatory. + - 2020/09/21 (1.79) - removed return value from OpenPopupOnItemClick() - returned true on mouse release on an item - because it is inconsistent with other popup APIs and makes others misleading. It's also and unnecessary: you can use IsWindowAppearing() after BeginPopup() for a similar result. + - 2020/09/17 (1.79) - removed ImFont::DisplayOffset in favor of ImFontConfig::GlyphOffset. DisplayOffset was applied after scaling and not very meaningful/useful outside of being needed by the default ProggyClean font. If you scaled this value after calling AddFontDefault(), this is now done automatically. It was also getting in the way of better font scaling, so let's get rid of it now! + - 2020/08/17 (1.78) - obsoleted use of the trailing 'float power=1.0f' parameter for DragFloat(), DragFloat2(), DragFloat3(), DragFloat4(), DragFloatRange2(), DragScalar(), DragScalarN(), SliderFloat(), SliderFloat2(), SliderFloat3(), SliderFloat4(), SliderScalar(), SliderScalarN(), VSliderFloat() and VSliderScalar(). + replaced the 'float power=1.0f' argument with integer-based flags defaulting to 0 (as with all our flags). + worked out a backward-compatibility scheme so hopefully most C++ codebase should not be affected. in short, when calling those functions: + - if you omitted the 'power' parameter (likely!), you are not affected. + - if you set the 'power' parameter to 1.0f (same as previous default value): 1/ your compiler may warn on float>int conversion, 2/ everything else will work. 3/ you can replace the 1.0f value with 0 to fix the warning, and be technically correct. + - if you set the 'power' parameter to >1.0f (to enable non-linear editing): 1/ your compiler may warn on float>int conversion, 2/ code will assert at runtime, 3/ in case asserts are disabled, the code will not crash and enable the _Logarithmic flag. 4/ you can replace the >1.0f value with ImGuiSliderFlags_Logarithmic to fix the warning/assert and get a _similar_ effect as previous uses of power >1.0f. + see https://github.com/ocornut/imgui/issues/3361 for all details. + kept inline redirection functions (will obsolete) apart for: DragFloatRange2(), VSliderFloat(), VSliderScalar(). For those three the 'float power=1.0f' version was removed directly as they were most unlikely ever used. + for shared code, you can version check at compile-time with `#if IMGUI_VERSION_NUM >= 17704`. + - obsoleted use of v_min > v_max in DragInt, DragFloat, DragScalar to lock edits (introduced in 1.73, was not demoed nor documented very), will be replaced by a more generic ReadOnly feature. You may use the ImGuiSliderFlags_ReadOnly internal flag in the meantime. + - 2020/06/23 (1.77) - removed BeginPopupContextWindow(const char*, int mouse_button, bool also_over_items) in favor of BeginPopupContextWindow(const char*, ImGuiPopupFlags flags) with ImGuiPopupFlags_NoOverItems. + - 2020/06/15 (1.77) - renamed OpenPopupOnItemClick() to OpenPopupContextItem(). Kept inline redirection function (will obsolete). [NOTE: THIS WAS REVERTED IN 1.79] + - 2020/06/15 (1.77) - removed CalcItemRectClosestPoint() entry point which was made obsolete and asserting in December 2017. + - 2020/04/23 (1.77) - removed unnecessary ID (first arg) of ImFontAtlas::AddCustomRectRegular(). + - 2020/01/22 (1.75) - ImDrawList::AddCircle()/AddCircleFilled() functions don't accept negative radius any more. + - 2019/12/17 (1.75) - [undid this change in 1.76] made Columns() limited to 64 columns by asserting above that limit. While the current code technically supports it, future code may not so we're putting the restriction ahead. + - 2019/12/13 (1.75) - [imgui_internal.h] changed ImRect() default constructor initializes all fields to 0.0f instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). If you used ImRect::Add() to create bounding boxes by adding multiple points into it, you may need to fix your initial value. + - 2019/12/08 (1.75) - removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017): + - ShowTestWindow() -> use ShowDemoWindow() + - IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow) + - IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows) + - SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f) + - GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing() + - ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg + - ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding + - ImGuiTreeNodeFlags_AllowOverlapMode -> use ImGuiTreeNodeFlags_AllowItemOverlap + - IMGUI_DISABLE_TEST_WINDOWS -> use IMGUI_DISABLE_DEMO_WINDOWS + - 2019/12/08 (1.75) - obsoleted calling ImDrawList::PrimReserve() with a negative count (which was vaguely documented and rarely if ever used). Instead, we added an explicit PrimUnreserve() API. + - 2019/12/06 (1.75) - removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions (none of the other functions have it). + - 2019/11/21 (1.74) - ImFontAtlas::AddCustomRectRegular() now requires an ID larger than 0x110000 (instead of 0x10000) to conform with supporting Unicode planes 1-16 in a future update. ID below 0x110000 will now assert. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency. + - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency. + - 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017): + - Begin() [old 5 args version] -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed + - IsRootWindowOrAnyChildHovered() -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows) + - AlignFirstTextHeightToWidgets() -> use AlignTextToFramePadding() + - SetNextWindowPosCenter() -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f) + - ImFont::Glyph -> use ImFontGlyph + - 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function. + if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix. + The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay). + If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you. + - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete). + - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete). + - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names, or see how they were implemented until 1.71. + - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have + overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering. + This optimization is disabled if the parent window has no visual output, because it appears to be the most common situation leading to the creation of overlapping child windows. + Please reach out if you are affected. + - 2019/05/13 (1.71) - renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Kept inline redirection function (will obsolete). + - 2019/05/11 (1.71) - changed io.AddInputCharacter(unsigned short c) signature to io.AddInputCharacter(unsigned int c). + - 2019/04/29 (1.70) - improved ImDrawList thick strokes (>1.0f) preserving correct thickness up to 90 degrees angles (e.g. rectangles). If you have custom rendering using thick lines, they will appear thicker now. + - 2019/04/29 (1.70) - removed GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function (will obsolete). + - 2019/03/04 (1.69) - renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete). + - 2019/02/26 (1.69) - renamed ImGuiColorEditFlags_RGB/ImGuiColorEditFlags_HSV/ImGuiColorEditFlags_HEX to ImGuiColorEditFlags_DisplayRGB/ImGuiColorEditFlags_DisplayHSV/ImGuiColorEditFlags_DisplayHex. Kept redirection enums (will obsolete). + - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with an arbitrarily small value! + - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already). + - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead! + - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete). + - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects. + - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags. + - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files. + - 2018/09/28 (1.66) - renamed SetScrollHere() to SetScrollHereY(). Kept redirection function (will obsolete). + - 2018/09/06 (1.65) - renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h. + If you were conveniently using the imgui copy of those STB headers in your project you will have to update your include paths. + - 2018/09/05 (1.65) - renamed io.OptCursorBlink/io.ConfigCursorBlink to io.ConfigInputTextCursorBlink. (#1427) + - 2018/08/31 (1.64) - added imgui_widgets.cpp file, extracted and moved widgets code out of imgui.cpp into imgui_widgets.cpp. Re-ordered some of the code remaining in imgui.cpp. + NONE OF THE FUNCTIONS HAVE CHANGED. THE CODE IS SEMANTICALLY 100% IDENTICAL, BUT _EVERY_ FUNCTION HAS BEEN MOVED. + Because of this, any local modifications to imgui.cpp will likely conflict when you update. Read docs/CHANGELOG.txt for suggestions. + - 2018/08/22 (1.63) - renamed IsItemDeactivatedAfterChange() to IsItemDeactivatedAfterEdit() for consistency with new IsItemEdited() API. Kept redirection function (will obsolete soonish as IsItemDeactivatedAfterChange() is very recent). + - 2018/08/21 (1.63) - renamed ImGuiTextEditCallback to ImGuiInputTextCallback, ImGuiTextEditCallbackData to ImGuiInputTextCallbackData for consistency. Kept redirection types (will obsolete). + - 2018/08/21 (1.63) - removed ImGuiInputTextCallbackData::ReadOnly since it is a duplication of (ImGuiInputTextCallbackData::Flags & ImGuiInputTextFlags_ReadOnly). + - 2018/08/01 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.ConfigResizeWindowsFromEdges [update 1.67 renamed to ConfigWindowsResizeFromEdges] to enable the feature. + - 2018/08/01 (1.63) - renamed io.OptCursorBlink to io.ConfigCursorBlink [-> io.ConfigInputTextCursorBlink in 1.65], io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency. + - 2018/07/22 (1.63) - changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time. + - 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete). + - 2018/06/08 (1.62) - examples: the imgui_impl_XXX files have been split to separate platform (Win32, GLFW, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.). + old backends will still work as is, however prefer using the separated backends as they will be updated to support multi-viewports. + when adopting new backends follow the main.cpp code of your preferred examples/ folder to know which functions to call. + in particular, note that old backends called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function. + - 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set. + - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details. + - 2018/05/03 (1.61) - DragInt(): the default compile-time format string has been changed from "%.0f" to "%d", as we are not using integers internally any more. + If you used DragInt() with custom format strings, make sure you change them to use %d or an integer-compatible format. + To honor backward-compatibility, the DragInt() code will currently parse and modify format strings to replace %*f with %d, giving time to users to upgrade their code. + If you have IMGUI_DISABLE_OBSOLETE_FUNCTIONS enabled, the code will instead assert! You may run a reg-exp search on your codebase for e.g. "DragInt.*%f" to help you find them. + - 2018/04/28 (1.61) - obsoleted InputFloat() functions taking an optional "int decimal_precision" in favor of an equivalent and more flexible "const char* format", + consistent with other functions. Kept redirection functions (will obsolete). + - 2018/04/09 (1.61) - IM_DELETE() helper function added in 1.60 doesn't clear the input _pointer_ reference, more consistent with expectation and allows passing r-value. + - 2018/03/20 (1.60) - renamed io.WantMoveMouse to io.WantSetMousePos for consistency and ease of understanding (was added in 1.52, _not_ used by core and only honored by some backend ahead of merging the Nav branch). + - 2018/03/12 (1.60) - removed ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered as the closing cross uses regular button colors now. + - 2018/03/08 (1.60) - changed ImFont::DisplayOffset.y to default to 0 instead of +1. Fixed rounding of Ascent/Descent to match TrueType renderer. If you were adding or subtracting to ImFont::DisplayOffset check if your fonts are correctly aligned vertically. + - 2018/03/03 (1.60) - renamed ImGuiStyleVar_Count_ to ImGuiStyleVar_COUNT and ImGuiMouseCursor_Count_ to ImGuiMouseCursor_COUNT for consistency with other public enums. + - 2018/02/18 (1.60) - BeginDragDropSource(): temporarily removed the optional mouse_button=0 parameter because it is not really usable in many situations at the moment. + - 2018/02/16 (1.60) - obsoleted the io.RenderDrawListsFn callback, you can call your graphics engine render function after ImGui::Render(). Use ImGui::GetDrawData() to retrieve the ImDrawData* to display. + - 2018/02/07 (1.60) - reorganized context handling to be more explicit, + - YOU NOW NEED TO CALL ImGui::CreateContext() AT THE BEGINNING OF YOUR APP, AND CALL ImGui::DestroyContext() AT THE END. + - removed Shutdown() function, as DestroyContext() serve this purpose. + - you may pass a ImFontAtlas* pointer to CreateContext() to share a font atlas between contexts. Otherwise CreateContext() will create its own font atlas instance. + - removed allocator parameters from CreateContext(), they are now setup with SetAllocatorFunctions(), and shared by all contexts. + - removed the default global context and font atlas instance, which were confusing for users of DLL reloading and users of multiple contexts. + - 2018/01/31 (1.60) - moved sample TTF files from extra_fonts/ to misc/fonts/. If you loaded files directly from the imgui repo you may need to update your paths. + - 2018/01/11 (1.60) - obsoleted IsAnyWindowHovered() in favor of IsWindowHovered(ImGuiHoveredFlags_AnyWindow). Kept redirection function (will obsolete). + - 2018/01/11 (1.60) - obsoleted IsAnyWindowFocused() in favor of IsWindowFocused(ImGuiFocusedFlags_AnyWindow). Kept redirection function (will obsolete). + - 2018/01/03 (1.60) - renamed ImGuiSizeConstraintCallback to ImGuiSizeCallback, ImGuiSizeConstraintCallbackData to ImGuiSizeCallbackData. + - 2017/12/29 (1.60) - removed CalcItemRectClosestPoint() which was weird and not really used by anyone except demo code. If you need it it's easy to replicate on your side. + - 2017/12/24 (1.53) - renamed the emblematic ShowTestWindow() function to ShowDemoWindow(). Kept redirection function (will obsolete). + - 2017/12/21 (1.53) - ImDrawList: renamed style.AntiAliasedShapes to style.AntiAliasedFill for consistency and as a way to explicitly break code that manipulate those flag at runtime. You can now manipulate ImDrawList::Flags + - 2017/12/21 (1.53) - ImDrawList: removed 'bool anti_aliased = true' final parameter of ImDrawList::AddPolyline() and ImDrawList::AddConvexPolyFilled(). Prefer manipulating ImDrawList::Flags if you need to toggle them during the frame. + - 2017/12/14 (1.53) - using the ImGuiWindowFlags_NoScrollWithMouse flag on a child window forwards the mouse wheel event to the parent window, unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set. + - 2017/12/13 (1.53) - renamed GetItemsLineHeightWithSpacing() to GetFrameHeightWithSpacing(). Kept redirection function (will obsolete). + - 2017/12/13 (1.53) - obsoleted IsRootWindowFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootWindow). Kept redirection function (will obsolete). + - obsoleted IsRootWindowOrAnyChildFocused() in favor of using IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows). Kept redirection function (will obsolete). + - 2017/12/12 (1.53) - renamed ImGuiTreeNodeFlags_AllowOverlapMode to ImGuiTreeNodeFlags_AllowItemOverlap. Kept redirection enum (will obsolete). + - 2017/12/10 (1.53) - removed SetNextWindowContentWidth(), prefer using SetNextWindowContentSize(). Kept redirection function (will obsolete). + - 2017/11/27 (1.53) - renamed ImGuiTextBuffer::append() helper to appendf(), appendv() to appendfv(). If you copied the 'Log' demo in your code, it uses appendv() so that needs to be renamed. + - 2017/11/18 (1.53) - Style, Begin: removed ImGuiWindowFlags_ShowBorders window flag. Borders are now fully set up in the ImGuiStyle structure (see e.g. style.FrameBorderSize, style.WindowBorderSize). Use ImGui::ShowStyleEditor() to look them up. + Please note that the style system will keep evolving (hopefully stabilizing in Q1 2018), and so custom styles will probably subtly break over time. It is recommended you use the StyleColorsClassic(), StyleColorsDark(), StyleColorsLight() functions. + - 2017/11/18 (1.53) - Style: removed ImGuiCol_ComboBg in favor of combo boxes using ImGuiCol_PopupBg for consistency. + - 2017/11/18 (1.53) - Style: renamed ImGuiCol_ChildWindowBg to ImGuiCol_ChildBg. + - 2017/11/18 (1.53) - Style: renamed style.ChildWindowRounding to style.ChildRounding, ImGuiStyleVar_ChildWindowRounding to ImGuiStyleVar_ChildRounding. + - 2017/11/02 (1.53) - obsoleted IsRootWindowOrAnyChildHovered() in favor of using IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); + - 2017/10/24 (1.52) - renamed IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCS to IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS/IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS for consistency. + - 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it. + - 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details. + removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting. + IsItemHoveredRect() --> IsItemHovered(ImGuiHoveredFlags_RectOnly) + IsMouseHoveringAnyWindow() --> IsWindowHovered(ImGuiHoveredFlags_AnyWindow) + IsMouseHoveringWindow() --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior] + - 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead! + - 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete). + - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete). + - 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete). + - 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your backend if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)". + - 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)! + - renamed IsMouseHoveringAnyWindow() to IsAnyWindowHovered() for consistency. Kept inline redirection function (will obsolete). + - renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete). + - 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency. + - 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix. + - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type. + - 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely. + - 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete). + - 2017/08/11 (1.51) - renamed ImGuiSetCond_Always to ImGuiCond_Always, ImGuiSetCond_Once to ImGuiCond_Once, ImGuiSetCond_FirstUseEver to ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing to ImGuiCond_Appearing. Kept redirection enums (will obsolete). + - 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton(). + - 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu. + - changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options. + - changed prototype of rarely used 'ColorButton(ImVec4 col, bool small_height = false, bool outline_border = true)' to 'ColorButton(const char* desc_id, ImVec4 col, ImGuiColorEditFlags flags = 0, ImVec2 size = ImVec2(0, 0))' + - 2017/07/20 (1.51) - removed IsPosHoveringAnyWindow(ImVec2), which was partly broken and misleading. ASSERT + redirect user to io.WantCaptureMouse + - 2017/05/26 (1.50) - removed ImFontConfig::MergeGlyphCenterV in favor of a more multipurpose ImFontConfig::GlyphOffset. + - 2017/05/01 (1.50) - renamed ImDrawList::PathFill() (rarely used directly) to ImDrawList::PathFillConvex() for clarity. + - 2016/11/06 (1.50) - BeginChild(const char*) now applies the stack id to the provided label, consistently with other functions as it should always have been. It shouldn't affect you unless (extremely unlikely) you were appending multiple times to a same child from different locations of the stack id. If that's the case, generate an id with GetID() and use it instead of passing string to BeginChild(). + - 2016/10/15 (1.50) - avoid 'void* user_data' parameter to io.SetClipboardTextFn/io.GetClipboardTextFn pointers. We pass io.ClipboardUserData to it. + - 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc. + - 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully, breakage should be minimal. + - 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore. + If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar. + This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color: + ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); } + If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color. + - 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext(). + - 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection. + - 2016/05/01 (1.49) - obsoleted old signature of CollapsingHeader(const char* label, const char* str_id = NULL, bool display_frame = true, bool default_open = false) as extra parameters were badly designed and rarely used. You can replace the "default_open = true" flag in new API with CollapsingHeader(label, ImGuiTreeNodeFlags_DefaultOpen). + - 2016/04/26 (1.49) - changed ImDrawList::PushClipRect(ImVec4 rect) to ImDrawList::PushClipRect(Imvec2 min,ImVec2 max,bool intersect_with_current_clip_rect=false). Note that higher-level ImGui::PushClipRect() is preferable because it will clip at logic/widget level, whereas ImDrawList::PushClipRect() only affect your renderer. + - 2016/04/03 (1.48) - removed style.WindowFillAlphaDefault setting which was redundant. Bake default BG alpha inside style.Colors[ImGuiCol_WindowBg] and all other Bg color values. (ref GitHub issue #337). + - 2016/04/03 (1.48) - renamed ImGuiCol_TooltipBg to ImGuiCol_PopupBg, used by popups/menus and tooltips. popups/menus were previously using ImGuiCol_WindowBg. (ref github issue #337) + - 2016/03/21 (1.48) - renamed GetWindowFont() to GetFont(), GetWindowFontSize() to GetFontSize(). Kept inline redirection function (will obsolete). + - 2016/03/02 (1.48) - InputText() completion/history/always callbacks: if you modify the text buffer manually (without using DeleteChars()/InsertChars() helper) you need to maintain the BufTextLen field. added an assert. + - 2016/01/23 (1.48) - fixed not honoring exact width passed to PushItemWidth(), previously it would add extra FramePadding.x*2 over that width. if you had manual pixel-perfect alignment in place it might affect you. + - 2015/12/27 (1.48) - fixed ImDrawList::AddRect() which used to render a rectangle 1 px too large on each axis. + - 2015/12/04 (1.47) - renamed Color() helpers to ValueColor() - dangerously named, rarely used and probably to be made obsolete. + - 2015/08/29 (1.45) - with the addition of horizontal scrollbar we made various fixes to inconsistencies with dealing with cursor position. + GetCursorPos()/SetCursorPos() functions now include the scrolled amount. It shouldn't affect the majority of users, but take note that SetCursorPosX(100.0f) puts you at +100 from the starting x position which may include scrolling, not at +100 from the window left side. + GetContentRegionMax()/GetWindowContentRegionMin()/GetWindowContentRegionMax() functions allow include the scrolled amount. Typically those were used in cases where no scrolling would happen so it may not be a problem, but watch out! + - 2015/08/29 (1.45) - renamed style.ScrollbarWidth to style.ScrollbarSize + - 2015/08/05 (1.44) - split imgui.cpp into extra files: imgui_demo.cpp imgui_draw.cpp imgui_internal.h that you need to add to your project. + - 2015/07/18 (1.44) - fixed angles in ImDrawList::PathArcTo(), PathArcToFast() (introduced in 1.43) being off by an extra PI for no justifiable reason + - 2015/07/14 (1.43) - add new ImFontAtlas::AddFont() API. For the old AddFont***, moved the 'font_no' parameter of ImFontAtlas::AddFont** functions to the ImFontConfig structure. + you need to render your textured triangles with bilinear filtering to benefit from sub-pixel positioning of text. + - 2015/07/08 (1.43) - switched rendering data to use indexed rendering. this is saving a fair amount of CPU/GPU and enables us to get anti-aliasing for a marginal cost. + this necessary change will break your rendering function! the fix should be very easy. sorry for that :( + - if you are using a vanilla copy of one of the imgui_impl_XXX.cpp provided in the example, you just need to update your copy and you can ignore the rest. + - the signature of the io.RenderDrawListsFn handler has changed! + old: ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count) + new: ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data). + parameters: 'cmd_lists' becomes 'draw_data->CmdLists', 'cmd_lists_count' becomes 'draw_data->CmdListsCount' + ImDrawList: 'commands' becomes 'CmdBuffer', 'vtx_buffer' becomes 'VtxBuffer', 'IdxBuffer' is new. + ImDrawCmd: 'vtx_count' becomes 'ElemCount', 'clip_rect' becomes 'ClipRect', 'user_callback' becomes 'UserCallback', 'texture_id' becomes 'TextureId'. + - each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer. + - if you REALLY cannot render indexed primitives, you can call the draw_data->DeIndexAllBuffers() method to de-index the buffers. This is slow and a waste of CPU/GPU. Prefer using indexed rendering! + - refer to code in the examples/ folder or ask on the GitHub if you are unsure of how to upgrade. please upgrade! + - 2015/07/10 (1.43) - changed SameLine() parameters from int to float. + - 2015/07/02 (1.42) - renamed SetScrollPosHere() to SetScrollFromCursorPos(). Kept inline redirection function (will obsolete). + - 2015/07/02 (1.42) - renamed GetScrollPosY() to GetScrollY(). Necessary to reduce confusion along with other scrolling functions, because positions (e.g. cursor position) are not equivalent to scrolling amount. + - 2015/06/14 (1.41) - changed ImageButton() default bg_col parameter from (0,0,0,1) (black) to (0,0,0,0) (transparent) - makes a difference when texture have transparence + - 2015/06/14 (1.41) - changed Selectable() API from (label, selected, size) to (label, selected, flags, size). Size override should have been rarely used. Sorry! + - 2015/05/31 (1.40) - renamed GetWindowCollapsed() to IsWindowCollapsed() for consistency. Kept inline redirection function (will obsolete). + - 2015/05/31 (1.40) - renamed IsRectClipped() to IsRectVisible() for consistency. Note that return value is opposite! Kept inline redirection function (will obsolete). + - 2015/05/27 (1.40) - removed the third 'repeat_if_held' parameter from Button() - sorry! it was rarely used and inconsistent. Use PushButtonRepeat(true) / PopButtonRepeat() to enable repeat on desired buttons. + - 2015/05/11 (1.40) - changed BeginPopup() API, takes a string identifier instead of a bool. ImGui needs to manage the open/closed state of popups. Call OpenPopup() to actually set the "open" state of a popup. BeginPopup() returns true if the popup is opened. + - 2015/05/03 (1.40) - removed style.AutoFitPadding, using style.WindowPadding makes more sense (the default values were already the same). + - 2015/04/13 (1.38) - renamed IsClipped() to IsRectClipped(). Kept inline redirection function until 1.50. + - 2015/04/09 (1.38) - renamed ImDrawList::AddArc() to ImDrawList::AddArcFast() for compatibility with future API + - 2015/04/03 (1.38) - removed ImGuiCol_CheckHovered, ImGuiCol_CheckActive, replaced with the more general ImGuiCol_FrameBgHovered, ImGuiCol_FrameBgActive. + - 2014/04/03 (1.38) - removed support for passing -FLT_MAX..+FLT_MAX as the range for a SliderFloat(). Use DragFloat() or Inputfloat() instead. + - 2015/03/17 (1.36) - renamed GetItemBoxMin()/GetItemBoxMax()/IsMouseHoveringBox() to GetItemRectMin()/GetItemRectMax()/IsMouseHoveringRect(). Kept inline redirection function until 1.50. + - 2015/03/15 (1.36) - renamed style.TreeNodeSpacing to style.IndentSpacing, ImGuiStyleVar_TreeNodeSpacing to ImGuiStyleVar_IndentSpacing + - 2015/03/13 (1.36) - renamed GetWindowIsFocused() to IsWindowFocused(). Kept inline redirection function until 1.50. + - 2015/03/08 (1.35) - renamed style.ScrollBarWidth to style.ScrollbarWidth (casing) + - 2015/02/27 (1.34) - renamed OpenNextNode(bool) to SetNextTreeNodeOpened(bool, ImGuiSetCond). Kept inline redirection function until 1.50. + - 2015/02/27 (1.34) - renamed ImGuiSetCondition_*** to ImGuiSetCond_***, and _FirstUseThisSession becomes _Once. + - 2015/02/11 (1.32) - changed text input callback ImGuiTextEditCallback return type from void-->int. reserved for future use, return 0 for now. + - 2015/02/10 (1.32) - renamed GetItemWidth() to CalcItemWidth() to clarify its evolving behavior + - 2015/02/08 (1.31) - renamed GetTextLineSpacing() to GetTextLineHeightWithSpacing() + - 2015/02/01 (1.31) - removed IO.MemReallocFn (unused) + - 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions. + - 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader. + - 2015/01/11 (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels. + - old: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); [..Upload texture to GPU..]; + - new: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); [..Upload texture to GPU..]; io.Fonts->SetTexID(YourTexIdentifier); + you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. It is now recommended that you sample the font texture with bilinear interpolation. + - 2015/01/11 (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to call io.Fonts->SetTexID() + - 2015/01/11 (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix) + - 2015/01/11 (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets + - 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver) + - 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph) + - 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility + - 2014/11/07 (1.15) - renamed IsHovered() to IsItemHovered() + - 2014/10/02 (1.14) - renamed IMGUI_INCLUDE_IMGUI_USER_CPP to IMGUI_INCLUDE_IMGUI_USER_INL and imgui_user.cpp to imgui_user.inl (more IDE friendly) + - 2014/09/25 (1.13) - removed 'text_end' parameter from IO.SetClipboardTextFn (the string is now always zero-terminated for simplicity) + - 2014/09/24 (1.12) - renamed SetFontScale() to SetWindowFontScale() + - 2014/09/24 (1.12) - moved IM_MALLOC/IM_REALLOC/IM_FREE preprocessor defines to IO.MemAllocFn/IO.MemReallocFn/IO.MemFreeFn + - 2014/08/30 (1.09) - removed IO.FontHeight (now computed automatically) + - 2014/08/30 (1.09) - moved IMGUI_FONT_TEX_UV_FOR_WHITE preprocessor define to IO.FontTexUvForWhite + - 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes + + + FREQUENTLY ASKED QUESTIONS (FAQ) + ================================ + + Read all answers online: + https://www.dearimgui.org/faq or https://github.com/ocornut/imgui/blob/master/docs/FAQ.md (same url) + Read all answers locally (with a text editor or ideally a Markdown viewer): + docs/FAQ.md + Some answers are copied down here to facilitate searching in code. + + Q&A: Basics + =========== + + Q: Where is the documentation? + A: This library is poorly documented at the moment and expects the user to be acquainted with C/C++. + - Run the examples/ and explore them. + - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function. + - The demo covers most features of Dear ImGui, so you can read the code and see its output. + - See documentation and comments at the top of imgui.cpp + effectively imgui.h. + - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the + examples/ folder to explain how to integrate Dear ImGui with your own engine/application. + - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links. + - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful. + - Your programming IDE is your friend, find the type or function declaration to find comments + associated with it. + + Q: What is this library called? + Q: Which version should I get? + >> This library is called "Dear ImGui", please don't call it "ImGui" :) + >> See https://www.dearimgui.org/faq for details. + + Q&A: Integration + ================ + + Q: How to get started? + A: Read 'PROGRAMMER GUIDE' above. Read examples/README.txt. + + Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or my application? + A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags! + >> See https://www.dearimgui.org/faq for a fully detailed answer. You really want to read this. + + Q. How can I enable keyboard controls? + Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display) + Q: I integrated Dear ImGui in my engine and little squares are showing instead of text... + Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around... + Q: I integrated Dear ImGui in my engine and some elements are displaying outside their expected windows boundaries... + >> See https://www.dearimgui.org/faq + + Q&A: Usage + ---------- + + Q: About the ID Stack system.. + - Why is my widget not reacting when I click on it? + - How can I have widgets with an empty label? + - How can I have multiple widgets with the same label? + - How can I have multiple windows with the same label? + Q: How can I display an image? What is ImTextureID, how does it work? + Q: How can I use my own math types instead of ImVec2/ImVec4? + Q: How can I interact with standard C++ types (such as std::string and std::vector)? + Q: How can I display custom shapes? (using low-level ImDrawList API) + >> See https://www.dearimgui.org/faq + + Q&A: Fonts, Text + ================ + + Q: How should I handle DPI in my application? + Q: How can I load a different font than the default? + Q: How can I easily use icons in my application? + Q: How can I load multiple fonts? + Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic? + >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/edit/master/docs/FONTS.md + + Q&A: Concerns + ============= + + Q: Who uses Dear ImGui? + Q: Can you create elaborate/serious tools with Dear ImGui? + Q: Can you reskin the look of Dear ImGui? + Q: Why using C++ (as opposed to C)? + >> See https://www.dearimgui.org/faq + + Q&A: Community + ============== + + Q: How can I help? + A: - Businesses: please reach out to "contact AT dearimgui.com" if you work in a place using Dear ImGui! + We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts. + This is among the most useful thing you can do for Dear ImGui. With increased funding, we can hire more people working on this project. + - Individuals: you can support continued development via PayPal donations. See README. + - If you are experienced with Dear ImGui and C++, look at the GitHub issues, look at the Wiki, read docs/TODO.txt + and see how you want to help and can help! + - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc. + You may post screenshot or links in the gallery threads. Visuals are ideal as they inspire other programmers. + But even without visuals, disclosing your use of dear imgui helps the library grow credibility, and help other teams and programmers with taking decisions. + - If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues (on GitHub or privately). + +*/ + +//------------------------------------------------------------------------- +// [SECTION] INCLUDES +//------------------------------------------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE +#include "imgui_internal.h" + +// System includes +#include // vsnprintf, sscanf, printf +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// [Windows] On non-Visual Studio compilers, we default to IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS unless explicitly enabled +#if defined(_WIN32) && !defined(_MSC_VER) && !defined(IMGUI_ENABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) +#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS +#endif + +// [Windows] OS specific includes (optional) +#if defined(_WIN32) && defined(IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) && defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#define IMGUI_DISABLE_WIN32_FUNCTIONS +#endif +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX +#define NOMINMAX +#endif +#ifndef __MINGW32__ +#include // _wfopen, OpenClipboard +#else +#include +#endif +#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have all Win32 functions +#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS +#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS +#endif +#endif + +// [Apple] OS specific includes +#if defined(__APPLE__) +#include +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to an 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wformat-pedantic" // warning: format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic. +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type 'int' +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +// We disable -Wpragmas because GCC doesn't provide a has_warning equivalent and some forks/patches may not follow the warning/version association. +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size +#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*' +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +// Debug options +#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL +#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window +#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower) + +// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch. +static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in +static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear + +// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by backend) +static const float WINDOWS_HOVER_PADDING = 4.0f; // Extend outside window for hovering/resizing (maxxed with TouchPadding) and inside windows for borders. Affect FindHoveredWindow(). +static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time. +static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 0.70f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certain time, unless mouse moved. + +//------------------------------------------------------------------------- +// [SECTION] FORWARD DECLARATIONS +//------------------------------------------------------------------------- + +static void SetCurrentWindow(ImGuiWindow* window); +static void FindHoveredWindow(); +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags); +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window); + +static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list); +static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window); + +// Settings +static void WindowSettingsHandler_ClearAll(ImGuiContext*, ImGuiSettingsHandler*); +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name); +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line); +static void WindowSettingsHandler_ApplyAll(ImGuiContext*, ImGuiSettingsHandler*); +static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf); + +// Platform Dependents default implementation for IO functions +static const char* GetClipboardTextFn_DefaultImpl(void* user_data_ctx); +static void SetClipboardTextFn_DefaultImpl(void* user_data_ctx, const char* text); +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data); + +namespace ImGui +{ +// Navigation +static void NavUpdate(); +static void NavUpdateWindowing(); +static void NavUpdateWindowingOverlay(); +static void NavUpdateCancelRequest(); +static void NavUpdateCreateMoveRequest(); +static void NavUpdateCreateTabbingRequest(); +static float NavUpdatePageUpPageDown(); +static inline void NavUpdateAnyRequestFlag(); +static void NavUpdateCreateWrappingRequest(); +static void NavEndFrame(); +static bool NavScoreItem(ImGuiNavItemData* result); +static void NavApplyItemToResult(ImGuiNavItemData* result); +static void NavProcessItem(); +static void NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flags, ImGuiNavMoveFlags move_flags); +static ImVec2 NavCalcPreferredRefPos(); +static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window); +static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window); +static void NavRestoreLayer(ImGuiNavLayer layer); +static void NavRestoreHighlightAfterMove(); +static int FindWindowFocusIndex(ImGuiWindow* window); + +// Error Checking and Debug Tools +static void ErrorCheckNewFrameSanityChecks(); +static void ErrorCheckEndFrameSanityChecks(); +static void UpdateDebugToolItemPicker(); +static void UpdateDebugToolStackQueries(); + +// Inputs +static void UpdateKeyboardInputs(); +static void UpdateMouseInputs(); +static void UpdateMouseWheel(); +static void UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt); + +// Misc +static void UpdateSettings(); +static bool UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect); +static void RenderWindowOuterBorders(ImGuiWindow* window); +static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size); +static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open); +static void RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col); +static void RenderDimmedBackgrounds(); +static ImGuiWindow* FindBlockingModal(ImGuiWindow* window); + +// Viewports +static void UpdateViewportsNewFrame(); + +} + +//----------------------------------------------------------------------------- +// [SECTION] CONTEXT AND MEMORY ALLOCATORS +//----------------------------------------------------------------------------- + +// DLL users: +// - Heaps and globals are not shared across DLL boundaries! +// - You will need to call SetCurrentContext() + SetAllocatorFunctions() for each static/DLL boundary you are calling from. +// - Same applies for hot-reloading mechanisms that are reliant on reloading DLL (note that many hot-reloading mechanisms work without DLL). +// - Using Dear ImGui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility. +// - Confused? In a debugger: add GImGui to your watch window and notice how its value changes depending on your current location (which DLL boundary you are in). + +// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL. +// - ImGui::CreateContext() will automatically set this pointer if it is NULL. +// Change to a different context by calling ImGui::SetCurrentContext(). +// - Important: Dear ImGui functions are not thread-safe because of this pointer. +// If you want thread-safety to allow N threads to access N different contexts: +// - Change this variable to use thread local storage so each thread can refer to a different context, in your imconfig.h: +// struct ImGuiContext; +// extern thread_local ImGuiContext* MyImGuiTLS; +// #define GImGui MyImGuiTLS +// And then define MyImGuiTLS in one of your cpp files. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword. +// - Future development aims to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586 +// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from a different namespace. +// - DLL users: read comments above. +#ifndef GImGui +ImGuiContext* GImGui = NULL; +#endif + +// Memory Allocator functions. Use SetAllocatorFunctions() to change them. +// - You probably don't want to modify that mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction. +// - DLL users: read comments above. +#ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS +static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); } +static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); } +#else +static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; } +static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); } +#endif +static ImGuiMemAllocFunc GImAllocatorAllocFunc = MallocWrapper; +static ImGuiMemFreeFunc GImAllocatorFreeFunc = FreeWrapper; +static void* GImAllocatorUserData = NULL; + +//----------------------------------------------------------------------------- +// [SECTION] USER FACING STRUCTURES (ImGuiStyle, ImGuiIO) +//----------------------------------------------------------------------------- + +ImGuiStyle::ImGuiStyle() +{ + Alpha = 1.0f; // Global alpha applies to everything in Dear ImGui. + DisabledAlpha = 0.60f; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + WindowPadding = ImVec2(8,8); // Padding within a window + WindowRounding = 0.0f; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested. + WindowMinSize = ImVec2(32,32); // Minimum window size + WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text + WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left. + ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows + ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested. + PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows + PopupBorderSize = 1.0f; // Thickness of border around popup or tooltip windows. Generally set to 0.0f or 1.0f. Other values not well tested. + FramePadding = ImVec2(4,3); // Padding within a framed rectangle (used by most widgets) + FrameRounding = 0.0f; // Radius of frame corners rounding. Set to 0.0f to have rectangular frames (used by most widgets). + FrameBorderSize = 0.0f; // Thickness of border around frames. Generally set to 0.0f or 1.0f. Other values not well tested. + ItemSpacing = ImVec2(8,4); // Horizontal and vertical spacing between widgets/lines + ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label) + CellPadding = ImVec2(4,2); // Padding within a table cell + TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar + ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar + GrabMinSize = 12.0f; // Minimum width/height of a grab box for slider/scrollbar + GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + LogSliderDeadzone = 4.0f; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + TabBorderSize = 0.0f; // Thickness of border around tabs. + TabMinWidthForCloseButton = 0.0f; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text. + SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + SeparatorTextBorderSize = 3.0f; // Thickkness of border in SeparatorText() + SeparatorTextAlign = ImVec2(0.0f,0.5f);// Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). + SeparatorTextPadding = ImVec2(20.0f,3.f);// Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. + DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows. + MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + AntiAliasedLines = true; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. + AntiAliasedLinesUseTex = true; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + AntiAliasedFill = true; // Enable anti-aliased filled shapes (rounded rectangles, circles, etc.). + CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + CircleTessellationMaxError = 0.30f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + + // Default theme + ImGui::StyleColorsDark(this); +} + +// To scale your entire UI (e.g. if you want your app to use High DPI or generally be DPI aware) you may use this helper function. Scaling the fonts is done separately and is up to you. +// Important: This operation is lossy because we round all sizes to integer. If you need to change your scale multiples, call this over a freshly initialized ImGuiStyle structure rather than scaling multiple times. +void ImGuiStyle::ScaleAllSizes(float scale_factor) +{ + WindowPadding = ImFloor(WindowPadding * scale_factor); + WindowRounding = ImFloor(WindowRounding * scale_factor); + WindowMinSize = ImFloor(WindowMinSize * scale_factor); + ChildRounding = ImFloor(ChildRounding * scale_factor); + PopupRounding = ImFloor(PopupRounding * scale_factor); + FramePadding = ImFloor(FramePadding * scale_factor); + FrameRounding = ImFloor(FrameRounding * scale_factor); + ItemSpacing = ImFloor(ItemSpacing * scale_factor); + ItemInnerSpacing = ImFloor(ItemInnerSpacing * scale_factor); + CellPadding = ImFloor(CellPadding * scale_factor); + TouchExtraPadding = ImFloor(TouchExtraPadding * scale_factor); + IndentSpacing = ImFloor(IndentSpacing * scale_factor); + ColumnsMinSpacing = ImFloor(ColumnsMinSpacing * scale_factor); + ScrollbarSize = ImFloor(ScrollbarSize * scale_factor); + ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor); + GrabMinSize = ImFloor(GrabMinSize * scale_factor); + GrabRounding = ImFloor(GrabRounding * scale_factor); + LogSliderDeadzone = ImFloor(LogSliderDeadzone * scale_factor); + TabRounding = ImFloor(TabRounding * scale_factor); + TabMinWidthForCloseButton = (TabMinWidthForCloseButton != FLT_MAX) ? ImFloor(TabMinWidthForCloseButton * scale_factor) : FLT_MAX; + SeparatorTextPadding = ImFloor(SeparatorTextPadding * scale_factor); + DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor); + DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor); + MouseCursorScale = ImFloor(MouseCursorScale * scale_factor); +} + +ImGuiIO::ImGuiIO() +{ + // Most fields are initialized with zero + memset(this, 0, sizeof(*this)); + IM_STATIC_ASSERT(IM_ARRAYSIZE(ImGuiIO::MouseDown) == ImGuiMouseButton_COUNT && IM_ARRAYSIZE(ImGuiIO::MouseClicked) == ImGuiMouseButton_COUNT); + + // Settings + ConfigFlags = ImGuiConfigFlags_None; + BackendFlags = ImGuiBackendFlags_None; + DisplaySize = ImVec2(-1.0f, -1.0f); + DeltaTime = 1.0f / 60.0f; + IniSavingRate = 5.0f; + IniFilename = "imgui.ini"; // Important: "imgui.ini" is relative to current working dir, most apps will want to lock this to an absolute path (e.g. same path as executables). + LogFilename = "imgui_log.txt"; + MouseDoubleClickTime = 0.30f; + MouseDoubleClickMaxDist = 6.0f; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + for (int i = 0; i < ImGuiKey_COUNT; i++) + KeyMap[i] = -1; +#endif + KeyRepeatDelay = 0.275f; + KeyRepeatRate = 0.050f; + HoverDelayNormal = 0.30f; + HoverDelayShort = 0.10f; + UserData = NULL; + + Fonts = NULL; + FontGlobalScale = 1.0f; + FontDefault = NULL; + FontAllowUserScaling = false; + DisplayFramebufferScale = ImVec2(1.0f, 1.0f); + + // Miscellaneous options + MouseDrawCursor = false; +#ifdef __APPLE__ + ConfigMacOSXBehaviors = true; // Set Mac OS X style defaults based on __APPLE__ compile time flag +#else + ConfigMacOSXBehaviors = false; +#endif + ConfigInputTrickleEventQueue = true; + ConfigInputTextCursorBlink = true; + ConfigInputTextEnterKeepActive = false; + ConfigDragClickToInputText = false; + ConfigWindowsResizeFromEdges = true; + ConfigWindowsMoveFromTitleBarOnly = false; + ConfigMemoryCompactTimer = 60.0f; + + // Platform Functions + // Note: Initialize() will setup default clipboard/ime handlers. + BackendPlatformName = BackendRendererName = NULL; + BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL; + + // Input (NB: we already have memset zero the entire structure!) + MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX); + MouseDragThreshold = 6.0f; + for (int i = 0; i < IM_ARRAYSIZE(MouseDownDuration); i++) MouseDownDuration[i] = MouseDownDurationPrev[i] = -1.0f; + for (int i = 0; i < IM_ARRAYSIZE(KeysData); i++) { KeysData[i].DownDuration = KeysData[i].DownDurationPrev = -1.0f; } + AppAcceptingEvents = true; + BackendUsingLegacyKeyArrays = (ImS8)-1; + BackendUsingLegacyNavInputArray = true; // assume using legacy array until proven wrong +} + +// Pass in translated ASCII characters for text input. +// - with glfw you can get those from the callback set in glfwSetCharCallback() +// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message +// FIXME: Should in theory be called "AddCharacterEvent()" to be consistent with new API +void ImGuiIO::AddInputCharacter(unsigned int c) +{ + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + if (c == 0 || !AppAcceptingEvents) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Text; + e.Source = ImGuiInputSource_Keyboard; + e.Text.Char = c; + g.InputEventsQueue.push_back(e); +} + +// UTF16 strings use surrogate pairs to encode codepoints >= 0x10000, so +// we should save the high surrogate. +void ImGuiIO::AddInputCharacterUTF16(ImWchar16 c) +{ + if ((c == 0 && InputQueueSurrogate == 0) || !AppAcceptingEvents) + return; + + if ((c & 0xFC00) == 0xD800) // High surrogate, must save + { + if (InputQueueSurrogate != 0) + AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); + InputQueueSurrogate = c; + return; + } + + ImWchar cp = c; + if (InputQueueSurrogate != 0) + { + if ((c & 0xFC00) != 0xDC00) // Invalid low surrogate + { + AddInputCharacter(IM_UNICODE_CODEPOINT_INVALID); + } + else + { +#if IM_UNICODE_CODEPOINT_MAX == 0xFFFF + cp = IM_UNICODE_CODEPOINT_INVALID; // Codepoint will not fit in ImWchar +#else + cp = (ImWchar)(((InputQueueSurrogate - 0xD800) << 10) + (c - 0xDC00) + 0x10000); +#endif + } + + InputQueueSurrogate = 0; + } + AddInputCharacter((unsigned)cp); +} + +void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars) +{ + if (!AppAcceptingEvents) + return; + while (*utf8_chars != 0) + { + unsigned int c = 0; + utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL); + AddInputCharacter(c); + } +} + +// FIXME: Perhaps we could clear queued events as well? +void ImGuiIO::ClearInputCharacters() +{ + InputQueueCharacters.resize(0); +} + +// FIXME: Perhaps we could clear queued events as well? +void ImGuiIO::ClearInputKeys() +{ +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + memset(KeysDown, 0, sizeof(KeysDown)); +#endif + for (int n = 0; n < IM_ARRAYSIZE(KeysData); n++) + { + KeysData[n].Down = false; + KeysData[n].DownDuration = -1.0f; + KeysData[n].DownDurationPrev = -1.0f; + } + KeyCtrl = KeyShift = KeyAlt = KeySuper = false; + KeyMods = ImGuiMod_None; + MousePos = ImVec2(-FLT_MAX, -FLT_MAX); + for (int n = 0; n < IM_ARRAYSIZE(MouseDown); n++) + { + MouseDown[n] = false; + MouseDownDuration[n] = MouseDownDurationPrev[n] = -1.0f; + } + MouseWheel = MouseWheelH = 0.0f; +} + +static ImGuiInputEvent* FindLatestInputEvent(ImGuiInputEventType type, int arg = -1) +{ + ImGuiContext& g = *GImGui; + for (int n = g.InputEventsQueue.Size - 1; n >= 0; n--) + { + ImGuiInputEvent* e = &g.InputEventsQueue[n]; + if (e->Type != type) + continue; + if (type == ImGuiInputEventType_Key && e->Key.Key != arg) + continue; + if (type == ImGuiInputEventType_MouseButton && e->MouseButton.Button != arg) + continue; + return e; + } + return NULL; +} + +// Queue a new key down/up event. +// - ImGuiKey key: Translated key (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) +// - bool down: Is the key down? use false to signify a key release. +// - float analog_value: 0.0f..1.0f +void ImGuiIO::AddKeyAnalogEvent(ImGuiKey key, bool down, float analog_value) +{ + //if (e->Down) { IMGUI_DEBUG_LOG_IO("AddKeyEvent() Key='%s' %d, NativeKeycode = %d, NativeScancode = %d\n", ImGui::GetKeyName(e->Key), e->Down, e->NativeKeycode, e->NativeScancode); } + IM_ASSERT(Ctx != NULL); + if (key == ImGuiKey_None || !AppAcceptingEvents) + return; + ImGuiContext& g = *Ctx; + IM_ASSERT(ImGui::IsNamedKeyOrModKey(key)); // Backend needs to pass a valid ImGuiKey_ constant. 0..511 values are legacy native key codes which are not accepted by this API. + IM_ASSERT(!ImGui::IsAliasKey(key)); // Backend cannot submit ImGuiKey_MouseXXX values they are automatically inferred from AddMouseXXX() events. + IM_ASSERT(key != ImGuiMod_Shortcut); // We could easily support the translation here but it seems saner to not accept it (TestEngine perform a translation itself) + + // Verify that backend isn't mixing up using new io.AddKeyEvent() api and old io.KeysDown[] + io.KeyMap[] data. +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT((BackendUsingLegacyKeyArrays == -1 || BackendUsingLegacyKeyArrays == 0) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + if (BackendUsingLegacyKeyArrays == -1) + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) + IM_ASSERT(KeyMap[n] == -1 && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + BackendUsingLegacyKeyArrays = 0; +#endif + if (ImGui::IsGamepadKey(key)) + BackendUsingLegacyNavInputArray = false; + + // Filter duplicate (in particular: key mods and gamepad analog values are commonly spammed) + const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_Key, (int)key); + const ImGuiKeyData* key_data = ImGui::GetKeyData(key); + const bool latest_key_down = latest_event ? latest_event->Key.Down : key_data->Down; + const float latest_key_analog = latest_event ? latest_event->Key.AnalogValue : key_data->AnalogValue; + if (latest_key_down == down && latest_key_analog == analog_value) + return; + + // Add event + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Key; + e.Source = ImGui::IsGamepadKey(key) ? ImGuiInputSource_Gamepad : ImGuiInputSource_Keyboard; + e.Key.Key = key; + e.Key.Down = down; + e.Key.AnalogValue = analog_value; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddKeyEvent(ImGuiKey key, bool down) +{ + if (!AppAcceptingEvents) + return; + AddKeyAnalogEvent(key, down, down ? 1.0f : 0.0f); +} + +// [Optional] Call after AddKeyEvent(). +// Specify native keycode, scancode + Specify index for legacy <1.87 IsKeyXXX() functions with native indices. +// If you are writing a backend in 2022 or don't use IsKeyXXX() with native values that are not ImGuiKey values, you can avoid calling this. +void ImGuiIO::SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index) +{ + if (key == ImGuiKey_None) + return; + IM_ASSERT(ImGui::IsNamedKey(key)); // >= 512 + IM_ASSERT(native_legacy_index == -1 || ImGui::IsLegacyKey((ImGuiKey)native_legacy_index)); // >= 0 && <= 511 + IM_UNUSED(native_keycode); // Yet unused + IM_UNUSED(native_scancode); // Yet unused + + // Build native->imgui map so old user code can still call key functions with native 0..511 values. +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + const int legacy_key = (native_legacy_index != -1) ? native_legacy_index : native_keycode; + if (!ImGui::IsLegacyKey((ImGuiKey)legacy_key)) + return; + KeyMap[legacy_key] = key; + KeyMap[key] = legacy_key; +#else + IM_UNUSED(key); + IM_UNUSED(native_legacy_index); +#endif +} + +// Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. +void ImGuiIO::SetAppAcceptingEvents(bool accepting_events) +{ + AppAcceptingEvents = accepting_events; +} + +// Queue a mouse move event +void ImGuiIO::AddMousePosEvent(float x, float y) +{ + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + if (!AppAcceptingEvents) + return; + + // Apply same flooring as UpdateMouseInputs() + ImVec2 pos((x > -FLT_MAX) ? ImFloorSigned(x) : x, (y > -FLT_MAX) ? ImFloorSigned(y) : y); + + // Filter duplicate + const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_MousePos); + const ImVec2 latest_pos = latest_event ? ImVec2(latest_event->MousePos.PosX, latest_event->MousePos.PosY) : g.IO.MousePos; + if (latest_pos.x == pos.x && latest_pos.y == pos.y) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MousePos; + e.Source = ImGuiInputSource_Mouse; + e.MousePos.PosX = pos.x; + e.MousePos.PosY = pos.y; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddMouseButtonEvent(int mouse_button, bool down) +{ + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT); + if (!AppAcceptingEvents) + return; + + // Filter duplicate + const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_MouseButton, (int)mouse_button); + const bool latest_button_down = latest_event ? latest_event->MouseButton.Down : g.IO.MouseDown[mouse_button]; + if (latest_button_down == down) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MouseButton; + e.Source = ImGuiInputSource_Mouse; + e.MouseButton.Button = mouse_button; + e.MouseButton.Down = down; + g.InputEventsQueue.push_back(e); +} + +// Queue a mouse wheel event (some mouse/API may only have a Y component) +void ImGuiIO::AddMouseWheelEvent(float wheel_x, float wheel_y) +{ + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + + // Filter duplicate (unlike most events, wheel values are relative and easy to filter) + if (!AppAcceptingEvents || (wheel_x == 0.0f && wheel_y == 0.0f)) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_MouseWheel; + e.Source = ImGuiInputSource_Mouse; + e.MouseWheel.WheelX = wheel_x; + e.MouseWheel.WheelY = wheel_y; + g.InputEventsQueue.push_back(e); +} + +void ImGuiIO::AddFocusEvent(bool focused) +{ + IM_ASSERT(Ctx != NULL); + ImGuiContext& g = *Ctx; + + // Filter duplicate + const ImGuiInputEvent* latest_event = FindLatestInputEvent(ImGuiInputEventType_Focus); + const bool latest_focused = latest_event ? latest_event->AppFocused.Focused : !g.IO.AppFocusLost; + if (latest_focused == focused) + return; + + ImGuiInputEvent e; + e.Type = ImGuiInputEventType_Focus; + e.AppFocused.Focused = focused; + g.InputEventsQueue.push_back(e); +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (Geometry functions) +//----------------------------------------------------------------------------- + +ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments) +{ + IM_ASSERT(num_segments > 0); // Use ImBezierCubicClosestPointCasteljau() + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + { + ImVec2 p_current = ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + return p_closest; +} + +// Closely mimics PathBezierToCasteljau() in imgui_draw.cpp +static void ImBezierCubicClosestPointCasteljauStep(const ImVec2& p, ImVec2& p_closest, ImVec2& p_last, float& p_closest_dist2, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +{ + float dx = x4 - x1; + float dy = y4 - y1; + float d2 = ((x2 - x4) * dy - (y2 - y4) * dx); + float d3 = ((x3 - x4) * dy - (y3 - y4) * dx); + d2 = (d2 >= 0) ? d2 : -d2; + d3 = (d3 >= 0) ? d3 : -d3; + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) + { + ImVec2 p_current(x4, y4); + ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p); + float dist2 = ImLengthSqr(p - p_line); + if (dist2 < p_closest_dist2) + { + p_closest = p_line; + p_closest_dist2 = dist2; + } + p_last = p_current; + } + else if (level < 10) + { + float x12 = (x1 + x2)*0.5f, y12 = (y1 + y2)*0.5f; + float x23 = (x2 + x3)*0.5f, y23 = (y2 + y3)*0.5f; + float x34 = (x3 + x4)*0.5f, y34 = (y3 + y4)*0.5f; + float x123 = (x12 + x23)*0.5f, y123 = (y12 + y23)*0.5f; + float x234 = (x23 + x34)*0.5f, y234 = (y23 + y34)*0.5f; + float x1234 = (x123 + x234)*0.5f, y1234 = (y123 + y234)*0.5f; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); + } +} + +// tess_tol is generally the same value you would find in ImGui::GetStyle().CurveTessellationTol +// Because those ImXXX functions are lower-level than ImGui:: we cannot access this value automatically. +ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol) +{ + IM_ASSERT(tess_tol > 0.0f); + ImVec2 p_last = p1; + ImVec2 p_closest; + float p_closest_dist2 = FLT_MAX; + ImBezierCubicClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0); + return p_closest; +} + +ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p) +{ + ImVec2 ap = p - a; + ImVec2 ab_dir = b - a; + float dot = ap.x * ab_dir.x + ap.y * ab_dir.y; + if (dot < 0.0f) + return a; + float ab_len_sqr = ab_dir.x * ab_dir.x + ab_dir.y * ab_dir.y; + if (dot > ab_len_sqr) + return b; + return a + ab_dir * dot / ab_len_sqr; +} + +bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) +{ + bool b1 = ((p.x - b.x) * (a.y - b.y) - (p.y - b.y) * (a.x - b.x)) < 0.0f; + bool b2 = ((p.x - c.x) * (b.y - c.y) - (p.y - c.y) * (b.x - c.x)) < 0.0f; + bool b3 = ((p.x - a.x) * (c.y - a.y) - (p.y - a.y) * (c.x - a.x)) < 0.0f; + return ((b1 == b2) && (b2 == b3)); +} + +void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w) +{ + ImVec2 v0 = b - a; + ImVec2 v1 = c - a; + ImVec2 v2 = p - a; + const float denom = v0.x * v1.y - v1.x * v0.y; + out_v = (v2.x * v1.y - v1.x * v2.y) / denom; + out_w = (v0.x * v2.y - v2.x * v0.y) / denom; + out_u = 1.0f - out_v - out_w; +} + +ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p) +{ + ImVec2 proj_ab = ImLineClosestPoint(a, b, p); + ImVec2 proj_bc = ImLineClosestPoint(b, c, p); + ImVec2 proj_ca = ImLineClosestPoint(c, a, p); + float dist2_ab = ImLengthSqr(p - proj_ab); + float dist2_bc = ImLengthSqr(p - proj_bc); + float dist2_ca = ImLengthSqr(p - proj_ca); + float m = ImMin(dist2_ab, ImMin(dist2_bc, dist2_ca)); + if (m == dist2_ab) + return proj_ab; + if (m == dist2_bc) + return proj_bc; + return proj_ca; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions) +//----------------------------------------------------------------------------- + +// Consider using _stricmp/_strnicmp under Windows or strcasecmp/strncasecmp. We don't actually use either ImStricmp/ImStrnicmp in the codebase any more. +int ImStricmp(const char* str1, const char* str2) +{ + int d; + while ((d = ImToUpper(*str2) - ImToUpper(*str1)) == 0 && *str1) { str1++; str2++; } + return d; +} + +int ImStrnicmp(const char* str1, const char* str2, size_t count) +{ + int d = 0; + while (count > 0 && (d = ImToUpper(*str2) - ImToUpper(*str1)) == 0 && *str1) { str1++; str2++; count--; } + return d; +} + +void ImStrncpy(char* dst, const char* src, size_t count) +{ + if (count < 1) + return; + if (count > 1) + strncpy(dst, src, count - 1); + dst[count - 1] = 0; +} + +char* ImStrdup(const char* str) +{ + size_t len = strlen(str); + void* buf = IM_ALLOC(len + 1); + return (char*)memcpy(buf, (const void*)str, len + 1); +} + +char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src) +{ + size_t dst_buf_size = p_dst_size ? *p_dst_size : strlen(dst) + 1; + size_t src_size = strlen(src) + 1; + if (dst_buf_size < src_size) + { + IM_FREE(dst); + dst = (char*)IM_ALLOC(src_size); + if (p_dst_size) + *p_dst_size = src_size; + } + return (char*)memcpy(dst, (const void*)src, src_size); +} + +const char* ImStrchrRange(const char* str, const char* str_end, char c) +{ + const char* p = (const char*)memchr(str, (int)c, str_end - str); + return p; +} + +int ImStrlenW(const ImWchar* str) +{ + //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bit + int n = 0; + while (*str++) n++; + return n; +} + +// Find end-of-line. Return pointer will point to either first \n, either str_end. +const char* ImStreolRange(const char* str, const char* str_end) +{ + const char* p = (const char*)memchr(str, '\n', str_end - str); + return p ? p : str_end; +} + +const ImWchar* ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin) // find beginning-of-line +{ + while (buf_mid_line > buf_begin && buf_mid_line[-1] != '\n') + buf_mid_line--; + return buf_mid_line; +} + +const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end) +{ + if (!needle_end) + needle_end = needle + strlen(needle); + + const char un0 = (char)ImToUpper(*needle); + while ((!haystack_end && *haystack) || (haystack_end && haystack < haystack_end)) + { + if (ImToUpper(*haystack) == un0) + { + const char* b = needle + 1; + for (const char* a = haystack + 1; b < needle_end; a++, b++) + if (ImToUpper(*a) != ImToUpper(*b)) + break; + if (b == needle_end) + return haystack; + } + haystack++; + } + return NULL; +} + +// Trim str by offsetting contents when there's leading data + writing a \0 at the trailing position. We use this in situation where the cost is negligible. +void ImStrTrimBlanks(char* buf) +{ + char* p = buf; + while (p[0] == ' ' || p[0] == '\t') // Leading blanks + p++; + char* p_start = p; + while (*p != 0) // Find end of string + p++; + while (p > p_start && (p[-1] == ' ' || p[-1] == '\t')) // Trailing blanks + p--; + if (p_start != buf) // Copy memory if we had leading blanks + memmove(buf, p_start, p - p_start); + buf[p - p_start] = 0; // Zero terminate +} + +const char* ImStrSkipBlank(const char* str) +{ + while (str[0] == ' ' || str[0] == '\t') + str++; + return str; +} + +// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size). +// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm. +// B) When buf==NULL vsnprintf() will return the output size. +#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + +// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h) +// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are +// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.) +#ifdef IMGUI_USE_STB_SPRINTF +#define STB_SPRINTF_IMPLEMENTATION +#ifdef IMGUI_STB_SPRINTF_FILENAME +#include IMGUI_STB_SPRINTF_FILENAME +#else +#include "stb_sprintf.h" +#endif +#endif + +#if defined(_MSC_VER) && !defined(vsnprintf) +#define vsnprintf _vsnprintf +#endif + +int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); +#ifdef IMGUI_USE_STB_SPRINTF + int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); +#else + int w = vsnprintf(buf, buf_size, fmt, args); +#endif + va_end(args); + if (buf == NULL) + return w; + if (w == -1 || w >= (int)buf_size) + w = (int)buf_size - 1; + buf[w] = 0; + return w; +} + +int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) +{ +#ifdef IMGUI_USE_STB_SPRINTF + int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args); +#else + int w = vsnprintf(buf, buf_size, fmt, args); +#endif + if (buf == NULL) + return w; + if (w == -1 || w >= (int)buf_size) + w = (int)buf_size - 1; + buf[w] = 0; + return w; +} +#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + +void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) +{ + ImGuiContext& g = *GImGui; + va_list args; + va_start(args, fmt); + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + { + const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" + *out_buf = buf; + if (out_buf_end) { *out_buf_end = buf + strlen(buf); } + } + else + { + int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); + *out_buf = g.TempBuffer.Data; + if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } + } + va_end(args); +} + +void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + if (fmt[0] == '%' && fmt[1] == 's' && fmt[2] == 0) + { + const char* buf = va_arg(args, const char*); // Skip formatting when using "%s" + *out_buf = buf; + if (out_buf_end) { *out_buf_end = buf + strlen(buf); } + } + else + { + int buf_len = ImFormatStringV(g.TempBuffer.Data, g.TempBuffer.Size, fmt, args); + *out_buf = g.TempBuffer.Data; + if (out_buf_end) { *out_buf_end = g.TempBuffer.Data + buf_len; } + } +} + +// CRC32 needs a 1KB lookup table (not cache friendly) +// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily: +// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe. +static const ImU32 GCrc32LookupTable[256] = +{ + 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91, + 0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5, + 0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59, + 0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D, + 0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01, + 0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65, + 0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, + 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD, + 0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1, + 0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5, + 0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79, + 0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D, + 0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21, + 0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, + 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9, + 0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D, +}; + +// Known size hash +// It is ok to call ImHashData on a string with known length but the ### operator won't be supported. +// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. +ImGuiID ImHashData(const void* data_p, size_t data_size, ImGuiID seed) +{ + ImU32 crc = ~seed; + const unsigned char* data = (const unsigned char*)data_p; + const ImU32* crc32_lut = GCrc32LookupTable; + while (data_size-- != 0) + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++]; + return ~crc; +} + +// Zero-terminated string hash, with support for ### to reset back to seed value +// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed. +// Because this syntax is rarely used we are optimizing for the common case. +// - If we reach ### in the string we discard the hash so far and reset to the seed. +// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build) +// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements. +ImGuiID ImHashStr(const char* data_p, size_t data_size, ImGuiID seed) +{ + seed = ~seed; + ImU32 crc = seed; + const unsigned char* data = (const unsigned char*)data_p; + const ImU32* crc32_lut = GCrc32LookupTable; + if (data_size != 0) + { + while (data_size-- != 0) + { + unsigned char c = *data++; + if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#') + crc = seed; + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; + } + } + else + { + while (unsigned char c = *data++) + { + if (c == '#' && data[0] == '#' && data[1] == '#') + crc = seed; + crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c]; + } + } + return ~crc; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (File functions) +//----------------------------------------------------------------------------- + +// Default file functions +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +ImFileHandle ImFileOpen(const char* filename, const char* mode) +{ +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__) + // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. + // Previously we used ImTextCountCharsFromUtf8/ImTextStrFromUtf8 here but we now need to support ImWchar16 and ImWchar32! + const int filename_wsize = ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, NULL, 0); + const int mode_wsize = ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, NULL, 0); + ImVector buf; + buf.resize(filename_wsize + mode_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, filename, -1, (wchar_t*)&buf[0], filename_wsize); + ::MultiByteToWideChar(CP_UTF8, 0, mode, -1, (wchar_t*)&buf[filename_wsize], mode_wsize); + return ::_wfopen((const wchar_t*)&buf[0], (const wchar_t*)&buf[filename_wsize]); +#else + return fopen(filename, mode); +#endif +} + +// We should in theory be using fseeko()/ftello() with off_t and _fseeki64()/_ftelli64() with __int64, waiting for the PR that does that in a very portable pre-C++11 zero-warnings way. +bool ImFileClose(ImFileHandle f) { return fclose(f) == 0; } +ImU64 ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (ImU64)sz : (ImU64)-1; } +ImU64 ImFileRead(void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fread(data, (size_t)sz, (size_t)count, f); } +ImU64 ImFileWrite(const void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fwrite(data, (size_t)sz, (size_t)count, f); } +#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + +// Helper: Load file content into memory +// Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree() +// This can't really be used with "rt" because fseek size won't match read size. +void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes) +{ + IM_ASSERT(filename && mode); + if (out_file_size) + *out_file_size = 0; + + ImFileHandle f; + if ((f = ImFileOpen(filename, mode)) == NULL) + return NULL; + + size_t file_size = (size_t)ImFileGetSize(f); + if (file_size == (size_t)-1) + { + ImFileClose(f); + return NULL; + } + + void* file_data = IM_ALLOC(file_size + padding_bytes); + if (file_data == NULL) + { + ImFileClose(f); + return NULL; + } + if (ImFileRead(file_data, 1, file_size, f) != file_size) + { + ImFileClose(f); + IM_FREE(file_data); + return NULL; + } + if (padding_bytes > 0) + memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes); + + ImFileClose(f); + if (out_file_size) + *out_file_size = file_size; + + return file_data; +} + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (ImText* functions) +//----------------------------------------------------------------------------- + +IM_MSVC_RUNTIME_CHECKS_OFF + +// Convert UTF-8 to 32-bit character, process single character input. +// A nearly-branchless UTF-8 decoder, based on work of Christopher Wellons (https://github.com/skeeto/branchless-utf8). +// We handle UTF-8 decoding error by skipping forward. +int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end) +{ + static const char lengths[32] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0 }; + static const int masks[] = { 0x00, 0x7f, 0x1f, 0x0f, 0x07 }; + static const uint32_t mins[] = { 0x400000, 0, 0x80, 0x800, 0x10000 }; + static const int shiftc[] = { 0, 18, 12, 6, 0 }; + static const int shifte[] = { 0, 6, 4, 2, 0 }; + int len = lengths[*(const unsigned char*)in_text >> 3]; + int wanted = len + (len ? 0 : 1); + + if (in_text_end == NULL) + in_text_end = in_text + wanted; // Max length, nulls will be taken into account. + + // Copy at most 'len' bytes, stop copying at 0 or past in_text_end. Branch predictor does a good job here, + // so it is fast even with excessive branching. + unsigned char s[4]; + s[0] = in_text + 0 < in_text_end ? in_text[0] : 0; + s[1] = in_text + 1 < in_text_end ? in_text[1] : 0; + s[2] = in_text + 2 < in_text_end ? in_text[2] : 0; + s[3] = in_text + 3 < in_text_end ? in_text[3] : 0; + + // Assume a four-byte character and load four bytes. Unused bits are shifted out. + *out_char = (uint32_t)(s[0] & masks[len]) << 18; + *out_char |= (uint32_t)(s[1] & 0x3f) << 12; + *out_char |= (uint32_t)(s[2] & 0x3f) << 6; + *out_char |= (uint32_t)(s[3] & 0x3f) << 0; + *out_char >>= shiftc[len]; + + // Accumulate the various error conditions. + int e = 0; + e = (*out_char < mins[len]) << 6; // non-canonical encoding + e |= ((*out_char >> 11) == 0x1b) << 7; // surrogate half? + e |= (*out_char > IM_UNICODE_CODEPOINT_MAX) << 8; // out of range? + e |= (s[1] & 0xc0) >> 2; + e |= (s[2] & 0xc0) >> 4; + e |= (s[3] ) >> 6; + e ^= 0x2a; // top two bits of each tail byte correct? + e >>= shifte[len]; + + if (e) + { + // No bytes are consumed when *in_text == 0 || in_text == in_text_end. + // One byte is consumed in case of invalid first byte of in_text. + // All available bytes (at most `len` bytes) are consumed on incomplete/invalid second to last bytes. + // Invalid or incomplete input may consume less bytes than wanted, therefore every byte has to be inspected in s. + wanted = ImMin(wanted, !!s[0] + !!s[1] + !!s[2] + !!s[3]); + *out_char = IM_UNICODE_CODEPOINT_INVALID; + } + + return wanted; +} + +int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_text_remaining) +{ + ImWchar* buf_out = buf; + ImWchar* buf_end = buf + buf_size; + while (buf_out < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c; + in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); + *buf_out++ = (ImWchar)c; + } + *buf_out = 0; + if (in_text_remaining) + *in_text_remaining = in_text; + return (int)(buf_out - buf); +} + +int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end) +{ + int char_count = 0; + while ((!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c; + in_text += ImTextCharFromUtf8(&c, in_text, in_text_end); + char_count++; + } + return char_count; +} + +// Based on stb_to_utf8() from github.com/nothings/stb/ +static inline int ImTextCharToUtf8_inline(char* buf, int buf_size, unsigned int c) +{ + if (c < 0x80) + { + buf[0] = (char)c; + return 1; + } + if (c < 0x800) + { + if (buf_size < 2) return 0; + buf[0] = (char)(0xc0 + (c >> 6)); + buf[1] = (char)(0x80 + (c & 0x3f)); + return 2; + } + if (c < 0x10000) + { + if (buf_size < 3) return 0; + buf[0] = (char)(0xe0 + (c >> 12)); + buf[1] = (char)(0x80 + ((c >> 6) & 0x3f)); + buf[2] = (char)(0x80 + ((c ) & 0x3f)); + return 3; + } + if (c <= 0x10FFFF) + { + if (buf_size < 4) return 0; + buf[0] = (char)(0xf0 + (c >> 18)); + buf[1] = (char)(0x80 + ((c >> 12) & 0x3f)); + buf[2] = (char)(0x80 + ((c >> 6) & 0x3f)); + buf[3] = (char)(0x80 + ((c ) & 0x3f)); + return 4; + } + // Invalid code point, the max unicode is 0x10FFFF + return 0; +} + +const char* ImTextCharToUtf8(char out_buf[5], unsigned int c) +{ + int count = ImTextCharToUtf8_inline(out_buf, 5, c); + out_buf[count] = 0; + return out_buf; +} + +// Not optimal but we very rarely use this function. +int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end) +{ + unsigned int unused = 0; + return ImTextCharFromUtf8(&unused, in_text, in_text_end); +} + +static inline int ImTextCountUtf8BytesFromChar(unsigned int c) +{ + if (c < 0x80) return 1; + if (c < 0x800) return 2; + if (c < 0x10000) return 3; + if (c <= 0x10FFFF) return 4; + return 3; +} + +int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end) +{ + char* buf_p = out_buf; + const char* buf_end = out_buf + out_buf_size; + while (buf_p < buf_end - 1 && (!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c = (unsigned int)(*in_text++); + if (c < 0x80) + *buf_p++ = (char)c; + else + buf_p += ImTextCharToUtf8_inline(buf_p, (int)(buf_end - buf_p - 1), c); + } + *buf_p = 0; + return (int)(buf_p - out_buf); +} + +int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end) +{ + int bytes_count = 0; + while ((!in_text_end || in_text < in_text_end) && *in_text) + { + unsigned int c = (unsigned int)(*in_text++); + if (c < 0x80) + bytes_count++; + else + bytes_count += ImTextCountUtf8BytesFromChar(c); + } + return bytes_count; +} +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] MISC HELPERS/UTILITIES (Color functions) +// Note: The Convert functions are early design which are not consistent with other API. +//----------------------------------------------------------------------------- + +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b) +{ + float t = ((col_b >> IM_COL32_A_SHIFT) & 0xFF) / 255.f; + int r = ImLerp((int)(col_a >> IM_COL32_R_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_R_SHIFT) & 0xFF, t); + int g = ImLerp((int)(col_a >> IM_COL32_G_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_G_SHIFT) & 0xFF, t); + int b = ImLerp((int)(col_a >> IM_COL32_B_SHIFT) & 0xFF, (int)(col_b >> IM_COL32_B_SHIFT) & 0xFF, t); + return IM_COL32(r, g, b, 0xFF); +} + +ImVec4 ImGui::ColorConvertU32ToFloat4(ImU32 in) +{ + float s = 1.0f / 255.0f; + return ImVec4( + ((in >> IM_COL32_R_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_G_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_B_SHIFT) & 0xFF) * s, + ((in >> IM_COL32_A_SHIFT) & 0xFF) * s); +} + +ImU32 ImGui::ColorConvertFloat4ToU32(const ImVec4& in) +{ + ImU32 out; + out = ((ImU32)IM_F32_TO_INT8_SAT(in.x)) << IM_COL32_R_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.y)) << IM_COL32_G_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.z)) << IM_COL32_B_SHIFT; + out |= ((ImU32)IM_F32_TO_INT8_SAT(in.w)) << IM_COL32_A_SHIFT; + return out; +} + +// Convert rgb floats ([0-1],[0-1],[0-1]) to hsv floats ([0-1],[0-1],[0-1]), from Foley & van Dam p592 +// Optimized http://lolengine.net/blog/2013/01/13/fast-rgb-to-hsv +void ImGui::ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v) +{ + float K = 0.f; + if (g < b) + { + ImSwap(g, b); + K = -1.f; + } + if (r < g) + { + ImSwap(r, g); + K = -2.f / 6.f - K; + } + + const float chroma = r - (g < b ? g : b); + out_h = ImFabs(K + (g - b) / (6.f * chroma + 1e-20f)); + out_s = chroma / (r + 1e-20f); + out_v = r; +} + +// Convert hsv floats ([0-1],[0-1],[0-1]) to rgb floats ([0-1],[0-1],[0-1]), from Foley & van Dam p593 +// also http://en.wikipedia.org/wiki/HSL_and_HSV +void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b) +{ + if (s == 0.0f) + { + // gray + out_r = out_g = out_b = v; + return; + } + + h = ImFmod(h, 1.0f) / (60.0f / 360.0f); + int i = (int)h; + float f = h - (float)i; + float p = v * (1.0f - s); + float q = v * (1.0f - s * f); + float t = v * (1.0f - s * (1.0f - f)); + + switch (i) + { + case 0: out_r = v; out_g = t; out_b = p; break; + case 1: out_r = q; out_g = v; out_b = p; break; + case 2: out_r = p; out_g = v; out_b = t; break; + case 3: out_r = p; out_g = q; out_b = v; break; + case 4: out_r = t; out_g = p; out_b = v; break; + case 5: default: out_r = v; out_g = p; out_b = q; break; + } +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiStorage +// Helper: Key->value storage +//----------------------------------------------------------------------------- + +// std::lower_bound but without the bullshit +static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector& data, ImGuiID key) +{ + ImGuiStorage::ImGuiStoragePair* first = data.Data; + ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size; + size_t count = (size_t)(last - first); + while (count > 0) + { + size_t count2 = count >> 1; + ImGuiStorage::ImGuiStoragePair* mid = first + count2; + if (mid->key < key) + { + first = ++mid; + count -= count2 + 1; + } + else + { + count = count2; + } + } + return first; +} + +// For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. +void ImGuiStorage::BuildSortByKey() +{ + struct StaticFunc + { + static int IMGUI_CDECL PairComparerByID(const void* lhs, const void* rhs) + { + // We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that. + if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1; + if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1; + return 0; + } + }; + ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairComparerByID); +} + +int ImGuiStorage::GetInt(ImGuiID key, int default_val) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return default_val; + return it->val_i; +} + +bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const +{ + return GetInt(key, default_val ? 1 : 0) != 0; +} + +float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return default_val; + return it->val_f; +} + +void* ImGuiStorage::GetVoidPtr(ImGuiID key) const +{ + ImGuiStoragePair* it = LowerBound(const_cast&>(Data), key); + if (it == Data.end() || it->key != key) + return NULL; + return it->val_p; +} + +// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. +int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_i; +} + +bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val) +{ + return (bool*)GetIntRef(key, default_val ? 1 : 0); +} + +float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_f; +} + +void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + it = Data.insert(it, ImGuiStoragePair(key, default_val)); + return &it->val_p; +} + +// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame) +void ImGuiStorage::SetInt(ImGuiID key, int val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_i = val; +} + +void ImGuiStorage::SetBool(ImGuiID key, bool val) +{ + SetInt(key, val ? 1 : 0); +} + +void ImGuiStorage::SetFloat(ImGuiID key, float val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_f = val; +} + +void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val) +{ + ImGuiStoragePair* it = LowerBound(Data, key); + if (it == Data.end() || it->key != key) + { + Data.insert(it, ImGuiStoragePair(key, val)); + return; + } + it->val_p = val; +} + +void ImGuiStorage::SetAllInt(int v) +{ + for (int i = 0; i < Data.Size; i++) + Data[i].val_i = v; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiTextFilter +//----------------------------------------------------------------------------- + +// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" +ImGuiTextFilter::ImGuiTextFilter(const char* default_filter) //-V1077 +{ + InputBuf[0] = 0; + CountGrep = 0; + if (default_filter) + { + ImStrncpy(InputBuf, default_filter, IM_ARRAYSIZE(InputBuf)); + Build(); + } +} + +bool ImGuiTextFilter::Draw(const char* label, float width) +{ + if (width != 0.0f) + ImGui::SetNextItemWidth(width); + bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf)); + if (value_changed) + Build(); + return value_changed; +} + +void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector* out) const +{ + out->resize(0); + const char* wb = b; + const char* we = wb; + while (we < e) + { + if (*we == separator) + { + out->push_back(ImGuiTextRange(wb, we)); + wb = we + 1; + } + we++; + } + if (wb != we) + out->push_back(ImGuiTextRange(wb, we)); +} + +void ImGuiTextFilter::Build() +{ + Filters.resize(0); + ImGuiTextRange input_range(InputBuf, InputBuf + strlen(InputBuf)); + input_range.split(',', &Filters); + + CountGrep = 0; + for (int i = 0; i != Filters.Size; i++) + { + ImGuiTextRange& f = Filters[i]; + while (f.b < f.e && ImCharIsBlankA(f.b[0])) + f.b++; + while (f.e > f.b && ImCharIsBlankA(f.e[-1])) + f.e--; + if (f.empty()) + continue; + if (Filters[i].b[0] != '-') + CountGrep += 1; + } +} + +bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const +{ + if (Filters.empty()) + return true; + + if (text == NULL) + text = ""; + + for (int i = 0; i != Filters.Size; i++) + { + const ImGuiTextRange& f = Filters[i]; + if (f.empty()) + continue; + if (f.b[0] == '-') + { + // Subtract + if (ImStristr(text, text_end, f.b + 1, f.e) != NULL) + return false; + } + else + { + // Grep + if (ImStristr(text, text_end, f.b, f.e) != NULL) + return true; + } + } + + // Implicit * grep + if (CountGrep == 0) + return true; + + return false; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiTextBuffer, ImGuiTextIndex +//----------------------------------------------------------------------------- + +// On some platform vsnprintf() takes va_list by reference and modifies it. +// va_copy is the 'correct' way to copy a va_list but Visual Studio prior to 2013 doesn't have it. +#ifndef va_copy +#if defined(__GNUC__) || defined(__clang__) +#define va_copy(dest, src) __builtin_va_copy(dest, src) +#else +#define va_copy(dest, src) (dest = src) +#endif +#endif + +char ImGuiTextBuffer::EmptyString[1] = { 0 }; + +void ImGuiTextBuffer::append(const char* str, const char* str_end) +{ + int len = str_end ? (int)(str_end - str) : (int)strlen(str); + + // Add zero-terminator the first time + const int write_off = (Buf.Size != 0) ? Buf.Size : 1; + const int needed_sz = write_off + len; + if (write_off + len >= Buf.Capacity) + { + int new_capacity = Buf.Capacity * 2; + Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); + } + + Buf.resize(needed_sz); + memcpy(&Buf[write_off - 1], str, (size_t)len); + Buf[write_off - 1 + len] = 0; +} + +void ImGuiTextBuffer::appendf(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + appendfv(fmt, args); + va_end(args); +} + +// Helper: Text buffer for logging/accumulating text +void ImGuiTextBuffer::appendfv(const char* fmt, va_list args) +{ + va_list args_copy; + va_copy(args_copy, args); + + int len = ImFormatStringV(NULL, 0, fmt, args); // FIXME-OPT: could do a first pass write attempt, likely successful on first pass. + if (len <= 0) + { + va_end(args_copy); + return; + } + + // Add zero-terminator the first time + const int write_off = (Buf.Size != 0) ? Buf.Size : 1; + const int needed_sz = write_off + len; + if (write_off + len >= Buf.Capacity) + { + int new_capacity = Buf.Capacity * 2; + Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity); + } + + Buf.resize(needed_sz); + ImFormatStringV(&Buf[write_off - 1], (size_t)len + 1, fmt, args_copy); + va_end(args_copy); +} + +void ImGuiTextIndex::append(const char* base, int old_size, int new_size) +{ + IM_ASSERT(old_size >= 0 && new_size >= old_size && new_size >= EndOffset); + if (old_size == new_size) + return; + if (EndOffset == 0 || base[EndOffset - 1] == '\n') + LineOffsets.push_back(EndOffset); + const char* base_end = base + new_size; + for (const char* p = base + old_size; (p = (const char*)memchr(p, '\n', base_end - p)) != 0; ) + if (++p < base_end) // Don't push a trailing offset on last \n + LineOffsets.push_back((int)(intptr_t)(p - base)); + EndOffset = ImMax(EndOffset, new_size); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiListClipper +// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed +// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO) +//----------------------------------------------------------------------------- + +// FIXME-TABLE: This prevents us from using ImGuiListClipper _inside_ a table cell. +// The problem we have is that without a Begin/End scheme for rows using the clipper is ambiguous. +static bool GetSkipItemForListClipping() +{ + ImGuiContext& g = *GImGui; + return (g.CurrentTable ? g.CurrentTable->HostSkipItems : g.CurrentWindow->SkipItems); +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// Legacy helper to calculate coarse clipping of large list of evenly sized items. +// This legacy API is not ideal because it assumes we will return a single contiguous rectangle. +// Prefer using ImGuiListClipper which can returns non-contiguous ranges. +void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.LogEnabled) + { + // If logging is active, do not perform any clipping + *out_items_display_start = 0; + *out_items_display_end = items_count; + return; + } + if (GetSkipItemForListClipping()) + { + *out_items_display_start = *out_items_display_end = 0; + return; + } + + // We create the union of the ClipRect and the scoring rect which at worst should be 1 page away from ClipRect + // We don't include g.NavId's rectangle in there (unless g.NavJustMovedToId is set) because the rectangle enlargement can get costly. + ImRect rect = window->ClipRect; + if (g.NavMoveScoringItems) + rect.Add(g.NavScoringNoClipRect); + if (g.NavJustMovedToId && window->NavLastIds[0] == g.NavJustMovedToId) + rect.Add(WindowRectRelToAbs(window, window->NavRectRel[0])); // Could store and use NavJustMovedToRectRel + + const ImVec2 pos = window->DC.CursorPos; + int start = (int)((rect.Min.y - pos.y) / items_height); + int end = (int)((rect.Max.y - pos.y) / items_height); + + // When performing a navigation request, ensure we have one item extra in the direction we are moving to + // FIXME: Verify this works with tabbing + const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) + start--; + if (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) + end++; + + start = ImClamp(start, 0, items_count); + end = ImClamp(end + 1, start, items_count); + *out_items_display_start = start; + *out_items_display_end = end; +} +#endif + +static void ImGuiListClipper_SortAndFuseRanges(ImVector& ranges, int offset = 0) +{ + if (ranges.Size - offset <= 1) + return; + + // Helper to order ranges and fuse them together if possible (bubble sort is fine as we are only sorting 2-3 entries) + for (int sort_end = ranges.Size - offset - 1; sort_end > 0; --sort_end) + for (int i = offset; i < sort_end + offset; ++i) + if (ranges[i].Min > ranges[i + 1].Min) + ImSwap(ranges[i], ranges[i + 1]); + + // Now fuse ranges together as much as possible. + for (int i = 1 + offset; i < ranges.Size; i++) + { + IM_ASSERT(!ranges[i].PosToIndexConvert && !ranges[i - 1].PosToIndexConvert); + if (ranges[i - 1].Max < ranges[i].Min) + continue; + ranges[i - 1].Min = ImMin(ranges[i - 1].Min, ranges[i].Min); + ranges[i - 1].Max = ImMax(ranges[i - 1].Max, ranges[i].Max); + ranges.erase(ranges.Data + i); + i--; + } +} + +static void ImGuiListClipper_SeekCursorAndSetupPrevLine(float pos_y, float line_height) +{ + // Set cursor position and a few other things so that SetScrollHereY() and Columns() can work when seeking cursor. + // FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue. + // The clipper should probably have a final step to display the last item in a regular manner, maybe with an opt-out flag for data sets which may have costly seek? + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float off_y = pos_y - window->DC.CursorPos.y; + window->DC.CursorPos.y = pos_y; + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y - g.Style.ItemSpacing.y); + window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage. + window->DC.PrevLineSize.y = (line_height - g.Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list. + if (ImGuiOldColumns* columns = window->DC.CurrentColumns) + columns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly + if (ImGuiTable* table = g.CurrentTable) + { + if (table->IsInsideRow) + ImGui::TableEndRow(table); + table->RowPosY2 = window->DC.CursorPos.y; + const int row_increase = (int)((off_y / line_height) + 0.5f); + //table->CurrentRow += row_increase; // Can't do without fixing TableEndRow() + table->RowBgColorCounter += row_increase; + } +} + +static void ImGuiListClipper_SeekCursorForItem(ImGuiListClipper* clipper, int item_n) +{ + // StartPosY starts from ItemsFrozen hence the subtraction + // Perform the add and multiply with double to allow seeking through larger ranges + ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData; + float pos_y = (float)((double)clipper->StartPosY + data->LossynessOffset + (double)(item_n - data->ItemsFrozen) * clipper->ItemsHeight); + ImGuiListClipper_SeekCursorAndSetupPrevLine(pos_y, clipper->ItemsHeight); +} + +ImGuiListClipper::ImGuiListClipper() +{ + memset(this, 0, sizeof(*this)); + Ctx = ImGui::GetCurrentContext(); + IM_ASSERT(Ctx != NULL); + ItemsCount = -1; +} + +ImGuiListClipper::~ImGuiListClipper() +{ + End(); +} + +void ImGuiListClipper::Begin(int items_count, float items_height) +{ + ImGuiContext& g = *Ctx; + ImGuiWindow* window = g.CurrentWindow; + IMGUI_DEBUG_LOG_CLIPPER("Clipper: Begin(%d,%.2f) in '%s'\n", items_count, items_height, window->Name); + + if (ImGuiTable* table = g.CurrentTable) + if (table->IsInsideRow) + ImGui::TableEndRow(table); + + StartPosY = window->DC.CursorPos.y; + ItemsHeight = items_height; + ItemsCount = items_count; + DisplayStart = -1; + DisplayEnd = 0; + + // Acquire temporary buffer + if (++g.ClipperTempDataStacked > g.ClipperTempData.Size) + g.ClipperTempData.resize(g.ClipperTempDataStacked, ImGuiListClipperData()); + ImGuiListClipperData* data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; + data->Reset(this); + data->LossynessOffset = window->DC.CursorStartPosLossyness.y; + TempData = data; +} + +void ImGuiListClipper::End() +{ + ImGuiContext& g = *Ctx; + if (ImGuiListClipperData* data = (ImGuiListClipperData*)TempData) + { + // In theory here we should assert that we are already at the right position, but it seems saner to just seek at the end and not assert/crash the user. + IMGUI_DEBUG_LOG_CLIPPER("Clipper: End() in '%s'\n", g.CurrentWindow->Name); + if (ItemsCount >= 0 && ItemsCount < INT_MAX && DisplayStart >= 0) + ImGuiListClipper_SeekCursorForItem(this, ItemsCount); + + // Restore temporary buffer and fix back pointers which may be invalidated when nesting + IM_ASSERT(data->ListClipper == this); + data->StepNo = data->Ranges.Size; + if (--g.ClipperTempDataStacked > 0) + { + data = &g.ClipperTempData[g.ClipperTempDataStacked - 1]; + data->ListClipper->TempData = data; + } + TempData = NULL; + } + ItemsCount = -1; +} + +void ImGuiListClipper::ForceDisplayRangeByIndices(int item_min, int item_max) +{ + ImGuiListClipperData* data = (ImGuiListClipperData*)TempData; + IM_ASSERT(DisplayStart < 0); // Only allowed after Begin() and if there has not been a specified range yet. + IM_ASSERT(item_min <= item_max); + if (item_min < item_max) + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(item_min, item_max)); +} + +static bool ImGuiListClipper_StepInternal(ImGuiListClipper* clipper) +{ + ImGuiContext& g = *clipper->Ctx; + ImGuiWindow* window = g.CurrentWindow; + ImGuiListClipperData* data = (ImGuiListClipperData*)clipper->TempData; + IM_ASSERT(data != NULL && "Called ImGuiListClipper::Step() too many times, or before ImGuiListClipper::Begin() ?"); + + ImGuiTable* table = g.CurrentTable; + if (table && table->IsInsideRow) + ImGui::TableEndRow(table); + + // No items + if (clipper->ItemsCount == 0 || GetSkipItemForListClipping()) + return false; + + // While we are in frozen row state, keep displaying items one by one, unclipped + // FIXME: Could be stored as a table-agnostic state. + if (data->StepNo == 0 && table != NULL && !table->IsUnfrozenRows) + { + clipper->DisplayStart = data->ItemsFrozen; + clipper->DisplayEnd = ImMin(data->ItemsFrozen + 1, clipper->ItemsCount); + if (clipper->DisplayStart < clipper->DisplayEnd) + data->ItemsFrozen++; + return true; + } + + // Step 0: Let you process the first element (regardless of it being visible or not, so we can measure the element height) + bool calc_clipping = false; + if (data->StepNo == 0) + { + clipper->StartPosY = window->DC.CursorPos.y; + if (clipper->ItemsHeight <= 0.0f) + { + // Submit the first item (or range) so we can measure its height (generally the first range is 0..1) + data->Ranges.push_front(ImGuiListClipperRange::FromIndices(data->ItemsFrozen, data->ItemsFrozen + 1)); + clipper->DisplayStart = ImMax(data->Ranges[0].Min, data->ItemsFrozen); + clipper->DisplayEnd = ImMin(data->Ranges[0].Max, clipper->ItemsCount); + data->StepNo = 1; + return true; + } + calc_clipping = true; // If on the first step with known item height, calculate clipping. + } + + // Step 1: Let the clipper infer height from first range + if (clipper->ItemsHeight <= 0.0f) + { + IM_ASSERT(data->StepNo == 1); + if (table) + IM_ASSERT(table->RowPosY1 == clipper->StartPosY && table->RowPosY2 == window->DC.CursorPos.y); + + clipper->ItemsHeight = (window->DC.CursorPos.y - clipper->StartPosY) / (float)(clipper->DisplayEnd - clipper->DisplayStart); + bool affected_by_floating_point_precision = ImIsFloatAboveGuaranteedIntegerPrecision(clipper->StartPosY) || ImIsFloatAboveGuaranteedIntegerPrecision(window->DC.CursorPos.y); + if (affected_by_floating_point_precision) + clipper->ItemsHeight = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y; // FIXME: Technically wouldn't allow multi-line entries. + + IM_ASSERT(clipper->ItemsHeight > 0.0f && "Unable to calculate item height! First item hasn't moved the cursor vertically!"); + calc_clipping = true; // If item height had to be calculated, calculate clipping afterwards. + } + + // Step 0 or 1: Calculate the actual ranges of visible elements. + const int already_submitted = clipper->DisplayEnd; + if (calc_clipping) + { + if (g.LogEnabled) + { + // If logging is active, do not perform any clipping + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(0, clipper->ItemsCount)); + } + else + { + // Add range selected to be included for navigation + const bool is_nav_request = (g.NavMoveScoringItems && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (is_nav_request) + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(g.NavScoringNoClipRect.Min.y, g.NavScoringNoClipRect.Max.y, 0, 0)); + if (is_nav_request && (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && g.NavTabbingDir == -1) + data->Ranges.push_back(ImGuiListClipperRange::FromIndices(clipper->ItemsCount - 1, clipper->ItemsCount)); + + // Add focused/active item + ImRect nav_rect_abs = ImGui::WindowRectRelToAbs(window, window->NavRectRel[0]); + if (g.NavId != 0 && window->NavLastIds[0] == g.NavId) + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(nav_rect_abs.Min.y, nav_rect_abs.Max.y, 0, 0)); + + // Add visible range + const int off_min = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Up) ? -1 : 0; + const int off_max = (is_nav_request && g.NavMoveClipDir == ImGuiDir_Down) ? 1 : 0; + data->Ranges.push_back(ImGuiListClipperRange::FromPositions(window->ClipRect.Min.y, window->ClipRect.Max.y, off_min, off_max)); + } + + // Convert position ranges to item index ranges + // - Very important: when a starting position is after our maximum item, we set Min to (ItemsCount - 1). This allows us to handle most forms of wrapping. + // - Due to how Selectable extra padding they tend to be "unaligned" with exact unit in the item list, + // which with the flooring/ceiling tend to lead to 2 items instead of one being submitted. + for (int i = 0; i < data->Ranges.Size; i++) + if (data->Ranges[i].PosToIndexConvert) + { + int m1 = (int)(((double)data->Ranges[i].Min - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight); + int m2 = (int)((((double)data->Ranges[i].Max - window->DC.CursorPos.y - data->LossynessOffset) / clipper->ItemsHeight) + 0.999999f); + data->Ranges[i].Min = ImClamp(already_submitted + m1 + data->Ranges[i].PosToIndexOffsetMin, already_submitted, clipper->ItemsCount - 1); + data->Ranges[i].Max = ImClamp(already_submitted + m2 + data->Ranges[i].PosToIndexOffsetMax, data->Ranges[i].Min + 1, clipper->ItemsCount); + data->Ranges[i].PosToIndexConvert = false; + } + ImGuiListClipper_SortAndFuseRanges(data->Ranges, data->StepNo); + } + + // Step 0+ (if item height is given in advance) or 1+: Display the next range in line. + if (data->StepNo < data->Ranges.Size) + { + clipper->DisplayStart = ImMax(data->Ranges[data->StepNo].Min, already_submitted); + clipper->DisplayEnd = ImMin(data->Ranges[data->StepNo].Max, clipper->ItemsCount); + if (clipper->DisplayStart > already_submitted) //-V1051 + ImGuiListClipper_SeekCursorForItem(clipper, clipper->DisplayStart); + data->StepNo++; + return true; + } + + // After the last step: Let the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), + // Advance the cursor to the end of the list and then returns 'false' to end the loop. + if (clipper->ItemsCount < INT_MAX) + ImGuiListClipper_SeekCursorForItem(clipper, clipper->ItemsCount); + + return false; +} + +bool ImGuiListClipper::Step() +{ + ImGuiContext& g = *Ctx; + bool need_items_height = (ItemsHeight <= 0.0f); + bool ret = ImGuiListClipper_StepInternal(this); + if (ret && (DisplayStart == DisplayEnd)) + ret = false; + if (g.CurrentTable && g.CurrentTable->IsUnfrozenRows == false) + IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): inside frozen table row.\n"); + if (need_items_height && ItemsHeight > 0.0f) + IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): computed ItemsHeight: %.2f.\n", ItemsHeight); + if (ret) + { + IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): display %d to %d.\n", DisplayStart, DisplayEnd); + } + else + { + IMGUI_DEBUG_LOG_CLIPPER("Clipper: Step(): End.\n"); + End(); + } + return ret; +} + +//----------------------------------------------------------------------------- +// [SECTION] STYLING +//----------------------------------------------------------------------------- + +ImGuiStyle& ImGui::GetStyle() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + return GImGui->Style; +} + +ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = style.Colors[idx]; + c.w *= style.Alpha * alpha_mul; + return ColorConvertFloat4ToU32(c); +} + +ImU32 ImGui::GetColorU32(const ImVec4& col) +{ + ImGuiStyle& style = GImGui->Style; + ImVec4 c = col; + c.w *= style.Alpha; + return ColorConvertFloat4ToU32(c); +} + +const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx) +{ + ImGuiStyle& style = GImGui->Style; + return style.Colors[idx]; +} + +ImU32 ImGui::GetColorU32(ImU32 col) +{ + ImGuiStyle& style = GImGui->Style; + if (style.Alpha >= 1.0f) + return col; + ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT; + a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range. + return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT); +} + +// FIXME: This may incur a round-trip (if the end user got their data from a float4) but eventually we aim to store the in-flight colors as ImU32 +void ImGui::PushStyleColor(ImGuiCol idx, ImU32 col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = ColorConvertU32ToFloat4(col); +} + +void ImGui::PushStyleColor(ImGuiCol idx, const ImVec4& col) +{ + ImGuiContext& g = *GImGui; + ImGuiColorMod backup; + backup.Col = idx; + backup.BackupValue = g.Style.Colors[idx]; + g.ColorStack.push_back(backup); + g.Style.Colors[idx] = col; +} + +void ImGui::PopStyleColor(int count) +{ + ImGuiContext& g = *GImGui; + if (g.ColorStack.Size < count) + { + IM_ASSERT_USER_ERROR(g.ColorStack.Size > count, "Calling PopStyleColor() too many times: stack underflow."); + count = g.ColorStack.Size; + } + while (count > 0) + { + ImGuiColorMod& backup = g.ColorStack.back(); + g.Style.Colors[backup.Col] = backup.BackupValue; + g.ColorStack.pop_back(); + count--; + } +} + +static const ImGuiDataVarInfo GStyleVarInfo[] = +{ + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, DisabledAlpha) }, // ImGuiStyleVar_DisabledAlpha + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, CellPadding) }, // ImGuiStyleVar_CellPadding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign + { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextBorderSize) },// ImGuiStyleVar_SeparatorTextBorderSize + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextAlign) }, // ImGuiStyleVar_SeparatorTextAlign + { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SeparatorTextPadding) }, // ImGuiStyleVar_SeparatorTextPadding +}; + +const ImGuiDataVarInfo* ImGui::GetStyleVarInfo(ImGuiStyleVar idx) +{ + IM_ASSERT(idx >= 0 && idx < ImGuiStyleVar_COUNT); + IM_STATIC_ASSERT(IM_ARRAYSIZE(GStyleVarInfo) == ImGuiStyleVar_COUNT); + return &GStyleVarInfo[idx]; +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, float val) +{ + ImGuiContext& g = *GImGui; + const ImGuiDataVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 1) + { + float* pvar = (float*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); +} + +void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val) +{ + ImGuiContext& g = *GImGui; + const ImGuiDataVarInfo* var_info = GetStyleVarInfo(idx); + if (var_info->Type == ImGuiDataType_Float && var_info->Count == 2) + { + ImVec2* pvar = (ImVec2*)var_info->GetVarPtr(&g.Style); + g.StyleVarStack.push_back(ImGuiStyleMod(idx, *pvar)); + *pvar = val; + return; + } + IM_ASSERT_USER_ERROR(0, "Called PushStyleVar() variant with wrong type!"); +} + +void ImGui::PopStyleVar(int count) +{ + ImGuiContext& g = *GImGui; + if (g.StyleVarStack.Size < count) + { + IM_ASSERT_USER_ERROR(g.StyleVarStack.Size > count, "Calling PopStyleVar() too many times: stack underflow."); + count = g.StyleVarStack.Size; + } + while (count > 0) + { + // We avoid a generic memcpy(data, &backup.Backup.., GDataTypeSize[info->Type] * info->Count), the overhead in Debug is not worth it. + ImGuiStyleMod& backup = g.StyleVarStack.back(); + const ImGuiDataVarInfo* info = GetStyleVarInfo(backup.VarIdx); + void* data = info->GetVarPtr(&g.Style); + if (info->Type == ImGuiDataType_Float && info->Count == 1) { ((float*)data)[0] = backup.BackupFloat[0]; } + else if (info->Type == ImGuiDataType_Float && info->Count == 2) { ((float*)data)[0] = backup.BackupFloat[0]; ((float*)data)[1] = backup.BackupFloat[1]; } + g.StyleVarStack.pop_back(); + count--; + } +} + +const char* ImGui::GetStyleColorName(ImGuiCol idx) +{ + // Create switch-case from enum with regexp: ImGuiCol_{.*}, --> case ImGuiCol_\1: return "\1"; + switch (idx) + { + case ImGuiCol_Text: return "Text"; + case ImGuiCol_TextDisabled: return "TextDisabled"; + case ImGuiCol_WindowBg: return "WindowBg"; + case ImGuiCol_ChildBg: return "ChildBg"; + case ImGuiCol_PopupBg: return "PopupBg"; + case ImGuiCol_Border: return "Border"; + case ImGuiCol_BorderShadow: return "BorderShadow"; + case ImGuiCol_FrameBg: return "FrameBg"; + case ImGuiCol_FrameBgHovered: return "FrameBgHovered"; + case ImGuiCol_FrameBgActive: return "FrameBgActive"; + case ImGuiCol_TitleBg: return "TitleBg"; + case ImGuiCol_TitleBgActive: return "TitleBgActive"; + case ImGuiCol_TitleBgCollapsed: return "TitleBgCollapsed"; + case ImGuiCol_MenuBarBg: return "MenuBarBg"; + case ImGuiCol_ScrollbarBg: return "ScrollbarBg"; + case ImGuiCol_ScrollbarGrab: return "ScrollbarGrab"; + case ImGuiCol_ScrollbarGrabHovered: return "ScrollbarGrabHovered"; + case ImGuiCol_ScrollbarGrabActive: return "ScrollbarGrabActive"; + case ImGuiCol_CheckMark: return "CheckMark"; + case ImGuiCol_SliderGrab: return "SliderGrab"; + case ImGuiCol_SliderGrabActive: return "SliderGrabActive"; + case ImGuiCol_Button: return "Button"; + case ImGuiCol_ButtonHovered: return "ButtonHovered"; + case ImGuiCol_ButtonActive: return "ButtonActive"; + case ImGuiCol_Header: return "Header"; + case ImGuiCol_HeaderHovered: return "HeaderHovered"; + case ImGuiCol_HeaderActive: return "HeaderActive"; + case ImGuiCol_Separator: return "Separator"; + case ImGuiCol_SeparatorHovered: return "SeparatorHovered"; + case ImGuiCol_SeparatorActive: return "SeparatorActive"; + case ImGuiCol_ResizeGrip: return "ResizeGrip"; + case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered"; + case ImGuiCol_ResizeGripActive: return "ResizeGripActive"; + case ImGuiCol_Tab: return "Tab"; + case ImGuiCol_TabHovered: return "TabHovered"; + case ImGuiCol_TabActive: return "TabActive"; + case ImGuiCol_TabUnfocused: return "TabUnfocused"; + case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive"; + case ImGuiCol_PlotLines: return "PlotLines"; + case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered"; + case ImGuiCol_PlotHistogram: return "PlotHistogram"; + case ImGuiCol_PlotHistogramHovered: return "PlotHistogramHovered"; + case ImGuiCol_TableHeaderBg: return "TableHeaderBg"; + case ImGuiCol_TableBorderStrong: return "TableBorderStrong"; + case ImGuiCol_TableBorderLight: return "TableBorderLight"; + case ImGuiCol_TableRowBg: return "TableRowBg"; + case ImGuiCol_TableRowBgAlt: return "TableRowBgAlt"; + case ImGuiCol_TextSelectedBg: return "TextSelectedBg"; + case ImGuiCol_DragDropTarget: return "DragDropTarget"; + case ImGuiCol_NavHighlight: return "NavHighlight"; + case ImGuiCol_NavWindowingHighlight: return "NavWindowingHighlight"; + case ImGuiCol_NavWindowingDimBg: return "NavWindowingDimBg"; + case ImGuiCol_ModalWindowDimBg: return "ModalWindowDimBg"; + } + IM_ASSERT(0); + return "Unknown"; +} + + +//----------------------------------------------------------------------------- +// [SECTION] RENDER HELPERS +// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change, +// we need a nicer separation between low-level functions and high-level functions relying on the ImGui context. +// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: context. +//----------------------------------------------------------------------------- + +const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end) +{ + const char* text_display_end = text; + if (!text_end) + text_end = (const char*)-1; + + while (text_display_end < text_end && *text_display_end != '\0' && (text_display_end[0] != '#' || text_display_end[1] != '#')) + text_display_end++; + return text_display_end; +} + +// Internal ImGui functions to render text +// RenderText***() functions calls ImDrawList::AddText() calls ImBitmapFont::RenderText() +void ImGui::RenderText(ImVec2 pos, const char* text, const char* text_end, bool hide_text_after_hash) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Hide anything after a '##' string + const char* text_display_end; + if (hide_text_after_hash) + { + text_display_end = FindRenderedTextEnd(text, text_end); + } + else + { + if (!text_end) + text_end = text + strlen(text); // FIXME-OPT + text_display_end = text_end; + } + + if (text != text_display_end) + { + window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end); + if (g.LogEnabled) + LogRenderedText(&pos, text, text_display_end); + } +} + +void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (!text_end) + text_end = text + strlen(text); // FIXME-OPT + + if (text != text_end) + { + window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_end, wrap_width); + if (g.LogEnabled) + LogRenderedText(&pos, text, text_end); + } +} + +// Default clip_rect uses (pos_min,pos_max) +// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges) +void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) +{ + // Perform CPU side clipping for single clipped element to avoid using scissor state + ImVec2 pos = pos_min; + const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f); + + const ImVec2* clip_min = clip_rect ? &clip_rect->Min : &pos_min; + const ImVec2* clip_max = clip_rect ? &clip_rect->Max : &pos_max; + bool need_clipping = (pos.x + text_size.x >= clip_max->x) || (pos.y + text_size.y >= clip_max->y); + if (clip_rect) // If we had no explicit clipping rectangle then pos==clip_min + need_clipping |= (pos.x < clip_min->x) || (pos.y < clip_min->y); + + // Align whole block. We should defer that to the better rendering function when we'll have support for individual line alignment. + if (align.x > 0.0f) pos.x = ImMax(pos.x, pos.x + (pos_max.x - pos.x - text_size.x) * align.x); + if (align.y > 0.0f) pos.y = ImMax(pos.y, pos.y + (pos_max.y - pos.y - text_size.y) * align.y); + + // Render + if (need_clipping) + { + ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y); + draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect); + } + else + { + draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL); + } +} + +void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect) +{ + // Hide anything after a '##' string + const char* text_display_end = FindRenderedTextEnd(text, text_end); + const int text_len = (int)(text_display_end - text); + if (text_len == 0) + return; + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + RenderTextClippedEx(window->DrawList, pos_min, pos_max, text, text_display_end, text_size_if_known, align, clip_rect); + if (g.LogEnabled) + LogRenderedText(&pos_min, text, text_display_end); +} + +// Another overly complex function until we reorganize everything into a nice all-in-one helper. +// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display. +// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move. +void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known) +{ + ImGuiContext& g = *GImGui; + if (text_end_full == NULL) + text_end_full = FindRenderedTextEnd(text); + const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f); + + //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255)); + //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255)); + //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255)); + // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels. + if (text_size.x > pos_max.x - pos_min.x) + { + // Hello wo... + // | | | + // min max ellipsis_max + // <-> this is generally some padding value + + const ImFont* font = draw_list->_Data->Font; + const float font_size = draw_list->_Data->FontSize; + const float font_scale = font_size / font->FontSize; + const char* text_end_ellipsis = NULL; + const float ellipsis_width = font->EllipsisWidth * font_scale; + + // We can now claim the space between pos_max.x and ellipsis_max.x + const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_width) - pos_min.x, 1.0f); + float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x; + if (text == text_end_ellipsis && text_end_ellipsis < text_end_full) + { + // Always display at least 1 character if there's no room for character + ellipsis + text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full); + text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x; + } + while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1])) + { + // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text) + text_end_ellipsis--; + text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte + } + + // Render text, render ellipsis + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f)); + ImVec2 ellipsis_pos = ImFloor(ImVec2(pos_min.x + text_size_clipped_x, pos_min.y)); + if (ellipsis_pos.x + ellipsis_width <= ellipsis_max_x) + for (int i = 0; i < font->EllipsisCharCount; i++, ellipsis_pos.x += font->EllipsisCharStep * font_scale) + font->RenderChar(draw_list, font_size, ellipsis_pos, GetColorU32(ImGuiCol_Text), font->EllipsisChar); + } + else + { + RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_full, &text_size, ImVec2(0.0f, 0.0f)); + } + + if (g.LogEnabled) + LogRenderedText(&pos_min, text, text_end_full); +} + +// Render a rectangle shaped with optional rounding and borders +void ImGui::RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border, float rounding) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->DrawList->AddRectFilled(p_min, p_max, fill_col, rounding); + const float border_size = g.Style.FrameBorderSize; + if (border && border_size > 0.0f) + { + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + } +} + +void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const float border_size = g.Style.FrameBorderSize; + if (border_size > 0.0f) + { + window->DrawList->AddRect(p_min + ImVec2(1, 1), p_max + ImVec2(1, 1), GetColorU32(ImGuiCol_BorderShadow), rounding, 0, border_size); + window->DrawList->AddRect(p_min, p_max, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + } +} + +void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags) +{ + ImGuiContext& g = *GImGui; + if (id != g.NavId) + return; + if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysDraw)) + return; + ImGuiWindow* window = g.CurrentWindow; + if (window->DC.NavHideHighlightOneFrame) + return; + + float rounding = (flags & ImGuiNavHighlightFlags_NoRounding) ? 0.0f : g.Style.FrameRounding; + ImRect display_rect = bb; + display_rect.ClipWith(window->ClipRect); + if (flags & ImGuiNavHighlightFlags_TypeDefault) + { + const float THICKNESS = 2.0f; + const float DISTANCE = 3.0f + THICKNESS * 0.5f; + display_rect.Expand(ImVec2(DISTANCE, DISTANCE)); + bool fully_visible = window->ClipRect.Contains(display_rect); + if (!fully_visible) + window->DrawList->PushClipRect(display_rect.Min, display_rect.Max); + window->DrawList->AddRect(display_rect.Min + ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), display_rect.Max - ImVec2(THICKNESS * 0.5f, THICKNESS * 0.5f), GetColorU32(ImGuiCol_NavHighlight), rounding, 0, THICKNESS); + if (!fully_visible) + window->DrawList->PopClipRect(); + } + if (flags & ImGuiNavHighlightFlags_TypeThin) + { + window->DrawList->AddRect(display_rect.Min, display_rect.Max, GetColorU32(ImGuiCol_NavHighlight), rounding, 0, 1.0f); + } +} + +void ImGui::RenderMouseCursor(ImVec2 base_pos, float base_scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT); + ImFontAtlas* font_atlas = g.DrawListSharedData.Font->ContainerAtlas; + for (int n = 0; n < g.Viewports.Size; n++) + { + // We scale cursor with current viewport/monitor, however Windows 10 for its own hardware cursor seems to be using a different scale factor. + ImVec2 offset, size, uv[4]; + if (!font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2])) + continue; + ImGuiViewportP* viewport = g.Viewports[n]; + const ImVec2 pos = base_pos - offset; + const float scale = base_scale; + if (!viewport->GetMainRect().Overlaps(ImRect(pos, pos + ImVec2(size.x + 2, size.y + 2) * scale))) + continue; + ImDrawList* draw_list = GetForegroundDrawList(viewport); + ImTextureID tex_id = font_atlas->TexID; + draw_list->PushTextureID(tex_id); + draw_list->AddImage(tex_id, pos + ImVec2(1, 0) * scale, pos + (ImVec2(1, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos + ImVec2(2, 0) * scale, pos + (ImVec2(2, 0) + size) * scale, uv[2], uv[3], col_shadow); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[2], uv[3], col_border); + draw_list->AddImage(tex_id, pos, pos + size * scale, uv[0], uv[1], col_fill); + draw_list->PopTextureID(); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] INITIALIZATION, SHUTDOWN +//----------------------------------------------------------------------------- + +// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself +// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module +ImGuiContext* ImGui::GetCurrentContext() +{ + return GImGui; +} + +void ImGui::SetCurrentContext(ImGuiContext* ctx) +{ +#ifdef IMGUI_SET_CURRENT_CONTEXT_FUNC + IMGUI_SET_CURRENT_CONTEXT_FUNC(ctx); // For custom thread-based hackery you may want to have control over this. +#else + GImGui = ctx; +#endif +} + +void ImGui::SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data) +{ + GImAllocatorAllocFunc = alloc_func; + GImAllocatorFreeFunc = free_func; + GImAllocatorUserData = user_data; +} + +// This is provided to facilitate copying allocators from one static/DLL boundary to another (e.g. retrieve default allocator of your executable address space) +void ImGui::GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data) +{ + *p_alloc_func = GImAllocatorAllocFunc; + *p_free_func = GImAllocatorFreeFunc; + *p_user_data = GImAllocatorUserData; +} + +ImGuiContext* ImGui::CreateContext(ImFontAtlas* shared_font_atlas) +{ + ImGuiContext* prev_ctx = GetCurrentContext(); + ImGuiContext* ctx = IM_NEW(ImGuiContext)(shared_font_atlas); + SetCurrentContext(ctx); + Initialize(); + if (prev_ctx != NULL) + SetCurrentContext(prev_ctx); // Restore previous context if any, else keep new one. + return ctx; +} + +void ImGui::DestroyContext(ImGuiContext* ctx) +{ + ImGuiContext* prev_ctx = GetCurrentContext(); + if (ctx == NULL) //-V1051 + ctx = prev_ctx; + SetCurrentContext(ctx); + Shutdown(); + SetCurrentContext((prev_ctx != ctx) ? prev_ctx : NULL); + IM_DELETE(ctx); +} + +// IMPORTANT: ###xxx suffixes must be same in ALL languages +static const ImGuiLocEntry GLocalizationEntriesEnUS[] = +{ + { ImGuiLocKey_TableSizeOne, "Size column to fit###SizeOne" }, + { ImGuiLocKey_TableSizeAllFit, "Size all columns to fit###SizeAll" }, + { ImGuiLocKey_TableSizeAllDefault, "Size all columns to default###SizeAll" }, + { ImGuiLocKey_TableResetOrder, "Reset order###ResetOrder" }, + { ImGuiLocKey_WindowingMainMenuBar, "(Main menu bar)" }, + { ImGuiLocKey_WindowingPopup, "(Popup)" }, + { ImGuiLocKey_WindowingUntitled, "(Untitled)" }, +}; + +void ImGui::Initialize() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(!g.Initialized && !g.SettingsLoaded); + + // Add .ini handle for ImGuiWindow and ImGuiTable types + { + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Window"; + ini_handler.TypeHash = ImHashStr("Window"); + ini_handler.ClearAllFn = WindowSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = WindowSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll; + AddSettingsHandler(&ini_handler); + } + TableSettingsAddSettingsHandler(); + + // Setup default localization table + LocalizeRegisterEntries(GLocalizationEntriesEnUS, IM_ARRAYSIZE(GLocalizationEntriesEnUS)); + + // Setup default platform clipboard/IME handlers. + g.IO.GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations + g.IO.SetClipboardTextFn = SetClipboardTextFn_DefaultImpl; + g.IO.ClipboardUserData = (void*)&g; // Default implementation use the ImGuiContext as user data (ideally those would be arguments to the function) + g.IO.SetPlatformImeDataFn = SetPlatformImeDataFn_DefaultImpl; + + // Create default viewport + ImGuiViewportP* viewport = IM_NEW(ImGuiViewportP)(); + g.Viewports.push_back(viewport); + g.TempBuffer.resize(1024 * 3 + 1, 0); + +#ifdef IMGUI_HAS_DOCK +#endif + + g.Initialized = true; +} + +// This function is merely here to free heap allocations. +void ImGui::Shutdown() +{ + // The fonts atlas can be used prior to calling NewFrame(), so we clear it even if g.Initialized is FALSE (which would happen if we never called NewFrame) + ImGuiContext& g = *GImGui; + if (g.IO.Fonts && g.FontAtlasOwnedByContext) + { + g.IO.Fonts->Locked = false; + IM_DELETE(g.IO.Fonts); + } + g.IO.Fonts = NULL; + g.DrawListSharedData.TempBuffer.clear(); + + // Cleanup of other data are conditional on actually having initialized Dear ImGui. + if (!g.Initialized) + return; + + // Save settings (unless we haven't attempted to load them: CreateContext/DestroyContext without a call to NewFrame shouldn't save an empty file) + if (g.SettingsLoaded && g.IO.IniFilename != NULL) + SaveIniSettingsToDisk(g.IO.IniFilename); + + CallContextHooks(&g, ImGuiContextHookType_Shutdown); + + // Clear everything else + g.Windows.clear_delete(); + g.WindowsFocusOrder.clear(); + g.WindowsTempSortBuffer.clear(); + g.CurrentWindow = NULL; + g.CurrentWindowStack.clear(); + g.WindowsById.Clear(); + g.NavWindow = NULL; + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; + g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL; + g.MovingWindow = NULL; + + g.KeysRoutingTable.Clear(); + + g.ColorStack.clear(); + g.StyleVarStack.clear(); + g.FontStack.clear(); + g.OpenPopupStack.clear(); + g.BeginPopupStack.clear(); + + g.Viewports.clear_delete(); + + g.TabBars.Clear(); + g.CurrentTabBarStack.clear(); + g.ShrinkWidthBuffer.clear(); + + g.ClipperTempData.clear_destruct(); + + g.Tables.Clear(); + g.TablesTempData.clear_destruct(); + g.DrawChannelsTempMergeBuffer.clear(); + + g.ClipboardHandlerData.clear(); + g.MenusIdSubmittedThisFrame.clear(); + g.InputTextState.ClearFreeMemory(); + + g.SettingsWindows.clear(); + g.SettingsHandlers.clear(); + + if (g.LogFile) + { +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + if (g.LogFile != stdout) +#endif + ImFileClose(g.LogFile); + g.LogFile = NULL; + } + g.LogBuffer.clear(); + g.DebugLogBuf.clear(); + g.DebugLogIndex.clear(); + + g.Initialized = false; +} + +// No specific ordering/dependency support, will see as needed +ImGuiID ImGui::AddContextHook(ImGuiContext* ctx, const ImGuiContextHook* hook) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook->Callback != NULL && hook->HookId == 0 && hook->Type != ImGuiContextHookType_PendingRemoval_); + g.Hooks.push_back(*hook); + g.Hooks.back().HookId = ++g.HookIdNext; + return g.HookIdNext; +} + +// Deferred removal, avoiding issue with changing vector while iterating it +void ImGui::RemoveContextHook(ImGuiContext* ctx, ImGuiID hook_id) +{ + ImGuiContext& g = *ctx; + IM_ASSERT(hook_id != 0); + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].HookId == hook_id) + g.Hooks[n].Type = ImGuiContextHookType_PendingRemoval_; +} + +// Call context hooks (used by e.g. test engine) +// We assume a small number of hooks so all stored in same array +void ImGui::CallContextHooks(ImGuiContext* ctx, ImGuiContextHookType hook_type) +{ + ImGuiContext& g = *ctx; + for (int n = 0; n < g.Hooks.Size; n++) + if (g.Hooks[n].Type == hook_type) + g.Hooks[n].Callback(&g, &g.Hooks[n]); +} + + +//----------------------------------------------------------------------------- +// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!) +//----------------------------------------------------------------------------- + +// ImGuiWindow is mostly a dumb struct. It merely has a constructor and a few helper methods +ImGuiWindow::ImGuiWindow(ImGuiContext* ctx, const char* name) : DrawListInst(NULL) +{ + memset(this, 0, sizeof(*this)); + Ctx = ctx; + Name = ImStrdup(name); + NameBufLen = (int)strlen(name) + 1; + ID = ImHashStr(name); + IDStack.push_back(ID); + MoveId = GetID("#MOVE"); + ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); + ScrollTargetCenterRatio = ImVec2(0.5f, 0.5f); + AutoFitFramesX = AutoFitFramesY = -1; + AutoPosLastDirection = ImGuiDir_None; + SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = 0; + SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX); + LastFrameActive = -1; + LastTimeActive = -1.0f; + FontWindowScale = 1.0f; + SettingsOffset = -1; + DrawList = &DrawListInst; + DrawList->_Data = &Ctx->DrawListSharedData; + DrawList->_OwnerName = Name; +} + +ImGuiWindow::~ImGuiWindow() +{ + IM_ASSERT(DrawList == &DrawListInst); + IM_DELETE(Name); + ColumnsStorage.clear_destruct(); +} + +ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); + return id; +} + +ImGuiID ImGuiWindow::GetID(const void* ptr) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&ptr, sizeof(void*), seed); + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_Pointer, ptr, NULL); + return id; +} + +ImGuiID ImGuiWindow::GetID(int n) +{ + ImGuiID seed = IDStack.back(); + ImGuiID id = ImHashData(&n, sizeof(n), seed); + ImGuiContext& g = *Ctx; + if (g.DebugHookIdInfo == id) + ImGui::DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); + return id; +} + +// This is only used in rare/specific situations to manufacture an ID out of nowhere. +ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs) +{ + ImGuiID seed = IDStack.back(); + ImRect r_rel = ImGui::WindowRectAbsToRel(this, r_abs); + ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed); + return id; +} + +static void SetCurrentWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + g.CurrentWindow = window; + g.CurrentTable = window && window->DC.CurrentTableIdx != -1 ? g.Tables.GetByIndex(window->DC.CurrentTableIdx) : NULL; + if (window) + g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); +} + +void ImGui::GcCompactTransientMiscBuffers() +{ + ImGuiContext& g = *GImGui; + g.ItemFlagsStack.clear(); + g.GroupStack.clear(); + TableGcCompactSettings(); +} + +// Free up/compact internal window buffers, we can use this when a window becomes unused. +// Not freed: +// - ImGuiWindow, ImGuiWindowSettings, Name, StateStorage, ColumnsStorage (may hold useful data) +// This should have no noticeable visual effect. When the window reappear however, expect new allocation/buffer growth/copy cost. +void ImGui::GcCompactTransientWindowBuffers(ImGuiWindow* window) +{ + window->MemoryCompacted = true; + window->MemoryDrawListIdxCapacity = window->DrawList->IdxBuffer.Capacity; + window->MemoryDrawListVtxCapacity = window->DrawList->VtxBuffer.Capacity; + window->IDStack.clear(); + window->DrawList->_ClearFreeMemory(); + window->DC.ChildWindows.clear(); + window->DC.ItemWidthStack.clear(); + window->DC.TextWrapPosStack.clear(); +} + +void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window) +{ + // We stored capacity of the ImDrawList buffer to reduce growth-caused allocation/copy when awakening. + // The other buffers tends to amortize much faster. + window->MemoryCompacted = false; + window->DrawList->IdxBuffer.reserve(window->MemoryDrawListIdxCapacity); + window->DrawList->VtxBuffer.reserve(window->MemoryDrawListVtxCapacity); + window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0; +} + +void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + + // While most behaved code would make an effort to not steal active id during window move/drag operations, + // we at least need to be resilient to it. Cancelling the move is rather aggressive and users of 'master' branch + // may prefer the weird ill-defined half working situation ('docking' did assert), so may need to rework that. + if (g.MovingWindow != NULL && g.ActiveId == g.MovingWindow->MoveId) + { + IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() cancel MovingWindow\n"); + g.MovingWindow = NULL; + } + + // Set active id + g.ActiveIdIsJustActivated = (g.ActiveId != id); + if (g.ActiveIdIsJustActivated) + { + IMGUI_DEBUG_LOG_ACTIVEID("SetActiveID() old:0x%08X (window \"%s\") -> new:0x%08X (window \"%s\")\n", g.ActiveId, g.ActiveIdWindow ? g.ActiveIdWindow->Name : "", id, window ? window->Name : ""); + g.ActiveIdTimer = 0.0f; + g.ActiveIdHasBeenPressedBefore = false; + g.ActiveIdHasBeenEditedBefore = false; + g.ActiveIdMouseButton = -1; + if (id != 0) + { + g.LastActiveId = id; + g.LastActiveIdTimer = 0.0f; + } + } + g.ActiveId = id; + g.ActiveIdAllowOverlap = false; + g.ActiveIdNoClearOnFocusLoss = false; + g.ActiveIdWindow = window; + g.ActiveIdHasBeenEditedThisFrame = false; + if (id) + { + g.ActiveIdIsAlive = id; + g.ActiveIdSource = (g.NavActivateId == id || g.NavJustMovedToId == id) ? (ImGuiInputSource)ImGuiInputSource_Nav : ImGuiInputSource_Mouse; + } + + // Clear declaration of inputs claimed by the widget + // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet) + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingAllKeyboardKeys = false; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + g.ActiveIdUsingNavInputMask = 0x00; +#endif +} + +void ImGui::ClearActiveID() +{ + SetActiveID(0, NULL); // g.ActiveId = 0; +} + +void ImGui::SetHoveredID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.HoveredId = id; + g.HoveredIdAllowOverlap = false; + if (id != 0 && g.HoveredIdPreviousFrame != id) + g.HoveredIdTimer = g.HoveredIdNotActiveTimer = 0.0f; +} + +ImGuiID ImGui::GetHoveredID() +{ + ImGuiContext& g = *GImGui; + return g.HoveredId ? g.HoveredId : g.HoveredIdPreviousFrame; +} + +// This is called by ItemAdd(). +// Code not using ItemAdd() may need to call this manually otherwise ActiveId will be cleared. In IMGUI_VERSION_NUM < 18717 this was called by GetID(). +void ImGui::KeepAliveID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId == id) + g.ActiveIdIsAlive = id; + if (g.ActiveIdPreviousFrame == id) + g.ActiveIdPreviousFrameIsAlive = true; +} + +void ImGui::MarkItemEdited(ImGuiID id) +{ + // This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit(). + // ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need to fill the data. + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive); + IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out. + //IM_ASSERT(g.CurrentWindow->DC.LastItemId == id); + g.ActiveIdHasBeenEditedThisFrame = true; + g.ActiveIdHasBeenEditedBefore = true; + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; +} + +static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFlags flags) +{ + // An active popup disable hovering on other windows (apart from its own children) + // FIXME-OPT: This could be cached/stored within the window. + ImGuiContext& g = *GImGui; + if (g.NavWindow) + if (ImGuiWindow* focused_root_window = g.NavWindow->RootWindow) + if (focused_root_window->WasActive && focused_root_window != window->RootWindow) + { + // For the purpose of those flags we differentiate "standard popup" from "modal popup" + // NB: The 'else' is important because Modal windows are also Popups. + bool want_inhibit = false; + if (focused_root_window->Flags & ImGuiWindowFlags_Modal) + want_inhibit = true; + else if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + want_inhibit = true; + + // Inhibit hover unless the window is within the stack of our modal/popup + if (want_inhibit) + if (!ImGui::IsWindowWithinBeginStackOf(window->RootWindow, focused_root_window)) + return false; + } + return true; +} + +// This is roughly matching the behavior of internal-facing ItemHoverable() +// - we allow hovering to be true when ActiveId==window->MoveID, so that clicking on non-interactive items such as a Text() item still returns true with IsItemHovered() +// - this should work even for non-interactive items that have no ID, so we cannot use LastItemId +bool ImGui::IsItemHovered(ImGuiHoveredFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.NavDisableMouseHover && !g.NavDisableHighlight && !(flags & ImGuiHoveredFlags_NoNavOverride)) + { + if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) + return false; + if (!IsItemFocused()) + return false; + } + else + { + // Test for bounding box overlap, as updated as ItemAdd() + ImGuiItemStatusFlags status_flags = g.LastItemData.StatusFlags; + if (!(status_flags & ImGuiItemStatusFlags_HoveredRect)) + return false; + IM_ASSERT((flags & (ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy)) == 0); // Flags not supported by this function + + // Done with rectangle culling so we can perform heavier checks now + // Test if we are hovering the right window (our window could be behind another window) + // [2021/03/02] Reworked / reverted the revert, finally. Note we want e.g. BeginGroup/ItemAdd/EndGroup to work as well. (#3851) + // [2017/10/16] Reverted commit 344d48be3 and testing RootWindow instead. I believe it is correct to NOT test for RootWindow but this leaves us unable + // to use IsItemHovered() after EndChild() itself. Until a solution is found I believe reverting to the test from 2017/09/27 is safe since this was + // the test that has been running for a long while. + if (g.HoveredWindow != window && (status_flags & ImGuiItemStatusFlags_HoveredWindow) == 0) + if ((flags & ImGuiHoveredFlags_AllowWhenOverlapped) == 0) + return false; + + // Test if another item is active (e.g. being dragged) + if ((flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) == 0) + if (g.ActiveId != 0 && g.ActiveId != g.LastItemData.ID && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId) + return false; + + // Test if interactions on this window are blocked by an active popup or modal. + // The ImGuiHoveredFlags_AllowWhenBlockedByPopup flag will be tested here. + if (!IsWindowContentHoverable(window, flags) && !(g.LastItemData.InFlags & ImGuiItemFlags_NoWindowHoverableCheck)) + return false; + + // Test if the item is disabled + if ((g.LastItemData.InFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled)) + return false; + + // Special handling for calling after Begin() which represent the title bar or tab. + // When the window is skipped/collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case. + if (g.LastItemData.ID == window->MoveId && window->WriteAccessed) + return false; + } + + // Handle hover delay + // (some ideas: https://www.nngroup.com/articles/timing-exposing-content) + float delay; + if (flags & ImGuiHoveredFlags_DelayNormal) + delay = g.IO.HoverDelayNormal; + else if (flags & ImGuiHoveredFlags_DelayShort) + delay = g.IO.HoverDelayShort; + else + delay = 0.0f; + if (delay > 0.0f) + { + ImGuiID hover_delay_id = (g.LastItemData.ID != 0) ? g.LastItemData.ID : window->GetIDFromRectangle(g.LastItemData.Rect); + if ((flags & ImGuiHoveredFlags_NoSharedDelay) && (g.HoverDelayIdPreviousFrame != hover_delay_id)) + g.HoverDelayTimer = 0.0f; + g.HoverDelayId = hover_delay_id; + return g.HoverDelayTimer >= delay; + } + + return true; +} + +// Internal facing ItemHoverable() used when submitting widgets. Differs slightly from IsItemHovered(). +bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (g.HoveredId != 0 && g.HoveredId != id && !g.HoveredIdAllowOverlap) + return false; + + ImGuiWindow* window = g.CurrentWindow; + if (g.HoveredWindow != window) + return false; + if (g.ActiveId != 0 && g.ActiveId != id && !g.ActiveIdAllowOverlap) + return false; + if (!IsMouseHoveringRect(bb.Min, bb.Max)) + return false; + + // Done with rectangle culling so we can perform heavier checks now. + ImGuiItemFlags item_flags = (g.LastItemData.ID == id ? g.LastItemData.InFlags : g.CurrentItemFlags); + if (!(item_flags & ImGuiItemFlags_NoWindowHoverableCheck) && !IsWindowContentHoverable(window, ImGuiHoveredFlags_None)) + { + g.HoveredIdDisabled = true; + return false; + } + + // We exceptionally allow this function to be called with id==0 to allow using it for easy high-level + // hover test in widgets code. We could also decide to split this function is two. + if (id != 0) + SetHoveredID(id); + + // When disabled we'll return false but still set HoveredId + if (item_flags & ImGuiItemFlags_Disabled) + { + // Release active id if turning disabled + if (g.ActiveId == id) + ClearActiveID(); + g.HoveredIdDisabled = true; + return false; + } + + if (id != 0) + { + // [DEBUG] Item Picker tool! + // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making + // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered + // items if we performed the test in ItemAdd(), but that would incur a small runtime cost. + if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id) + GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255)); + if (g.DebugItemPickerBreakId == id) + IM_DEBUG_BREAK(); + } + + if (g.NavDisableMouseHover) + return false; + + return true; +} + +// FIXME: This is inlined/duplicated in ItemAdd() +bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!bb.Overlaps(window->ClipRect)) + if (id == 0 || (id != g.ActiveId && id != g.NavId)) + if (!g.LogEnabled) + return true; + return false; +} + +// This is also inlined in ItemAdd() +// Note: if ImGuiItemStatusFlags_HasDisplayRect is set, user needs to set g.LastItemData.DisplayRect. +void ImGui::SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags item_flags, const ImRect& item_rect) +{ + ImGuiContext& g = *GImGui; + g.LastItemData.ID = item_id; + g.LastItemData.InFlags = in_flags; + g.LastItemData.StatusFlags = item_flags; + g.LastItemData.Rect = g.LastItemData.NavRect = item_rect; +} + +float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x) +{ + if (wrap_pos_x < 0.0f) + return 0.0f; + + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (wrap_pos_x == 0.0f) + { + // We could decide to setup a default wrapping max point for auto-resizing windows, + // or have auto-wrap (with unspecified wrapping pos) behave as a ContentSize extending function? + //if (window->Hidden && (window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) + // wrap_pos_x = ImMax(window->WorkRect.Min.x + g.FontSize * 10.0f, window->WorkRect.Max.x); + //else + wrap_pos_x = window->WorkRect.Max.x; + } + else if (wrap_pos_x > 0.0f) + { + wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space + } + + return ImMax(wrap_pos_x - pos.x, 1.0f); +} + +// IM_ALLOC() == ImGui::MemAlloc() +void* ImGui::MemAlloc(size_t size) +{ + if (ImGuiContext* ctx = GImGui) + ctx->IO.MetricsActiveAllocations++; + return (*GImAllocatorAllocFunc)(size, GImAllocatorUserData); +} + +// IM_FREE() == ImGui::MemFree() +void ImGui::MemFree(void* ptr) +{ + if (ptr) + if (ImGuiContext* ctx = GImGui) + ctx->IO.MetricsActiveAllocations--; + return (*GImAllocatorFreeFunc)(ptr, GImAllocatorUserData); +} + +const char* ImGui::GetClipboardText() +{ + ImGuiContext& g = *GImGui; + return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : ""; +} + +void ImGui::SetClipboardText(const char* text) +{ + ImGuiContext& g = *GImGui; + if (g.IO.SetClipboardTextFn) + g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text); +} + +const char* ImGui::GetVersion() +{ + return IMGUI_VERSION; +} + +ImGuiIO& ImGui::GetIO() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + return GImGui->IO; +} + +// Pass this to your backend rendering function! Valid after Render() and until the next call to NewFrame() +ImDrawData* ImGui::GetDrawData() +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = g.Viewports[0]; + return viewport->DrawDataP.Valid ? &viewport->DrawDataP : NULL; +} + +double ImGui::GetTime() +{ + return GImGui->Time; +} + +int ImGui::GetFrameCount() +{ + return GImGui->FrameCount; +} + +static ImDrawList* GetViewportDrawList(ImGuiViewportP* viewport, size_t drawlist_no, const char* drawlist_name) +{ + // Create the draw list on demand, because they are not frequently used for all viewports + ImGuiContext& g = *GImGui; + IM_ASSERT(drawlist_no < IM_ARRAYSIZE(viewport->DrawLists)); + ImDrawList* draw_list = viewport->DrawLists[drawlist_no]; + if (draw_list == NULL) + { + draw_list = IM_NEW(ImDrawList)(&g.DrawListSharedData); + draw_list->_OwnerName = drawlist_name; + viewport->DrawLists[drawlist_no] = draw_list; + } + + // Our ImDrawList system requires that there is always a command + if (viewport->DrawListsLastFrame[drawlist_no] != g.FrameCount) + { + draw_list->_ResetForNewFrame(); + draw_list->PushTextureID(g.IO.Fonts->TexID); + draw_list->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size, false); + viewport->DrawListsLastFrame[drawlist_no] = g.FrameCount; + } + return draw_list; +} + +ImDrawList* ImGui::GetBackgroundDrawList(ImGuiViewport* viewport) +{ + return GetViewportDrawList((ImGuiViewportP*)viewport, 0, "##Background"); +} + +ImDrawList* ImGui::GetBackgroundDrawList() +{ + ImGuiContext& g = *GImGui; + return GetBackgroundDrawList(g.Viewports[0]); +} + +ImDrawList* ImGui::GetForegroundDrawList(ImGuiViewport* viewport) +{ + return GetViewportDrawList((ImGuiViewportP*)viewport, 1, "##Foreground"); +} + +ImDrawList* ImGui::GetForegroundDrawList() +{ + ImGuiContext& g = *GImGui; + return GetForegroundDrawList(g.Viewports[0]); +} + +ImDrawListSharedData* ImGui::GetDrawListSharedData() +{ + return &GImGui->DrawListSharedData; +} + +void ImGui::StartMouseMovingWindow(ImGuiWindow* window) +{ + // Set ActiveId even if the _NoMove flag is set. Without it, dragging away from a window with _NoMove would activate hover on other windows. + // We _also_ call this when clicking in a window empty space when io.ConfigWindowsMoveFromTitleBarOnly is set, but clear g.MovingWindow afterward. + // This is because we want ActiveId to be set even when the window is not permitted to move. + ImGuiContext& g = *GImGui; + FocusWindow(window); + SetActiveID(window->MoveId, window); + g.NavDisableHighlight = true; + g.ActiveIdClickOffset = g.IO.MouseClickedPos[0] - window->RootWindow->Pos; + g.ActiveIdNoClearOnFocusLoss = true; + SetActiveIdUsingAllKeyboardKeys(); + + bool can_move_window = true; + if ((window->Flags & ImGuiWindowFlags_NoMove) || (window->RootWindow->Flags & ImGuiWindowFlags_NoMove)) + can_move_window = false; + if (can_move_window) + g.MovingWindow = window; +} + +// Handle mouse moving window +// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing() +// FIXME: We don't have strong guarantee that g.MovingWindow stay synched with g.ActiveId == g.MovingWindow->MoveId. +// This is currently enforced by the fact that BeginDragDropSource() is setting all g.ActiveIdUsingXXXX flags to inhibit navigation inputs, +// but if we should more thoroughly test cases where g.ActiveId or g.MovingWindow gets changed and not the other. +void ImGui::UpdateMouseMovingWindowNewFrame() +{ + ImGuiContext& g = *GImGui; + if (g.MovingWindow != NULL) + { + // We actually want to move the root window. g.MovingWindow == window we clicked on (could be a child window). + // We track it to preserve Focus and so that generally ActiveIdWindow == MovingWindow and ActiveId == MovingWindow->MoveId for consistency. + KeepAliveID(g.ActiveId); + IM_ASSERT(g.MovingWindow && g.MovingWindow->RootWindow); + ImGuiWindow* moving_window = g.MovingWindow->RootWindow; + if (g.IO.MouseDown[0] && IsMousePosValid(&g.IO.MousePos)) + { + ImVec2 pos = g.IO.MousePos - g.ActiveIdClickOffset; + SetWindowPos(moving_window, pos, ImGuiCond_Always); + FocusWindow(g.MovingWindow); + } + else + { + g.MovingWindow = NULL; + ClearActiveID(); + } + } + else + { + // When clicking/dragging from a window that has the _NoMove flag, we still set the ActiveId in order to prevent hovering others. + if (g.ActiveIdWindow && g.ActiveIdWindow->MoveId == g.ActiveId) + { + KeepAliveID(g.ActiveId); + if (!g.IO.MouseDown[0]) + ClearActiveID(); + } + } +} + +// Initiate moving window when clicking on empty space or title bar. +// Handle left-click and right-click focus. +void ImGui::UpdateMouseMovingWindowEndFrame() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId != 0 || g.HoveredId != 0) + return; + + // Unless we just made a window/popup appear + if (g.NavWindow && g.NavWindow->Appearing) + return; + + // Click on empty space to focus window and start moving + // (after we're done with all our widgets) + if (g.IO.MouseClicked[0]) + { + // Handle the edge case of a popup being closed while clicking in its empty space. + // If we try to focus it, FocusWindow() > ClosePopupsOverWindow() will accidentally close any parent popups because they are not linked together any more. + ImGuiWindow* root_window = g.HoveredWindow ? g.HoveredWindow->RootWindow : NULL; + const bool is_closed_popup = root_window && (root_window->Flags & ImGuiWindowFlags_Popup) && !IsPopupOpen(root_window->PopupId, ImGuiPopupFlags_AnyPopupLevel); + + if (root_window != NULL && !is_closed_popup) + { + StartMouseMovingWindow(g.HoveredWindow); //-V595 + + // Cancel moving if clicked outside of title bar + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(root_window->Flags & ImGuiWindowFlags_NoTitleBar)) + if (!root_window->TitleBarRect().Contains(g.IO.MouseClickedPos[0])) + g.MovingWindow = NULL; + + // Cancel moving if clicked over an item which was disabled or inhibited by popups (note that we know HoveredId == 0 already) + if (g.HoveredIdDisabled) + g.MovingWindow = NULL; + } + else if (root_window == NULL && g.NavWindow != NULL && GetTopMostPopupModal() == NULL) + { + // Clicking on void disable focus + FocusWindow(NULL); + } + } + + // With right mouse button we close popups without changing focus based on where the mouse is aimed + // Instead, focus will be restored to the window under the bottom-most closed popup. + // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger) + if (g.IO.MouseClicked[1]) + { + // Find the top-most window between HoveredWindow and the top-most Modal Window. + // This is where we can trim the popup stack. + ImGuiWindow* modal = GetTopMostPopupModal(); + bool hovered_window_above_modal = g.HoveredWindow && (modal == NULL || IsWindowAbove(g.HoveredWindow, modal)); + ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal, true); + } +} + +static bool IsWindowActiveAndVisible(ImGuiWindow* window) +{ + return (window->Active) && (!window->Hidden); +} + +// The reason this is exposed in imgui_internal.h is: on touch-based system that don't have hovering, we want to dispatch inputs to the right target (imgui vs imgui+app) +void ImGui::UpdateHoveredWindowAndCaptureFlags() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + g.WindowsHoverPadding = ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_HOVER_PADDING, WINDOWS_HOVER_PADDING)); + + // Find the window hovered by mouse: + // - Child windows can extend beyond the limit of their parent so we need to derive HoveredRootWindow from HoveredWindow. + // - When moving a window we can skip the search, which also conveniently bypasses the fact that window->WindowRectClipped is lagging as this point of the frame. + // - We also support the moved window toggling the NoInputs flag after moving has started in order to be able to detect windows below it, which is useful for e.g. docking mechanisms. + bool clear_hovered_windows = false; + FindHoveredWindow(); + + // Modal windows prevents mouse from hovering behind them. + ImGuiWindow* modal_window = GetTopMostPopupModal(); + if (modal_window && g.HoveredWindow && !IsWindowWithinBeginStackOf(g.HoveredWindow->RootWindow, modal_window)) + clear_hovered_windows = true; + + // Disabled mouse? + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) + clear_hovered_windows = true; + + // We track click ownership. When clicked outside of a window the click is owned by the application and + // won't report hovering nor request capture even while dragging over our windows afterward. + const bool has_open_popup = (g.OpenPopupStack.Size > 0); + const bool has_open_modal = (modal_window != NULL); + int mouse_earliest_down = -1; + bool mouse_any_down = false; + for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) + { + if (io.MouseClicked[i]) + { + io.MouseDownOwned[i] = (g.HoveredWindow != NULL) || has_open_popup; + io.MouseDownOwnedUnlessPopupClose[i] = (g.HoveredWindow != NULL) || has_open_modal; + } + mouse_any_down |= io.MouseDown[i]; + if (io.MouseDown[i]) + if (mouse_earliest_down == -1 || io.MouseClickedTime[i] < io.MouseClickedTime[mouse_earliest_down]) + mouse_earliest_down = i; + } + const bool mouse_avail = (mouse_earliest_down == -1) || io.MouseDownOwned[mouse_earliest_down]; + const bool mouse_avail_unless_popup_close = (mouse_earliest_down == -1) || io.MouseDownOwnedUnlessPopupClose[mouse_earliest_down]; + + // If mouse was first clicked outside of ImGui bounds we also cancel out hovering. + // FIXME: For patterns of drag and drop across OS windows, we may need to rework/remove this test (first committed 311c0ca9 on 2015/02) + const bool mouse_dragging_extern_payload = g.DragDropActive && (g.DragDropSourceFlags & ImGuiDragDropFlags_SourceExtern) != 0; + if (!mouse_avail && !mouse_dragging_extern_payload) + clear_hovered_windows = true; + + if (clear_hovered_windows) + g.HoveredWindow = g.HoveredWindowUnderMovingWindow = NULL; + + // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to Dear ImGui only, false = dispatch mouse to Dear ImGui + underlying app) + // Update io.WantCaptureMouseAllowPopupClose (experimental) to give a chance for app to react to popup closure with a drag + if (g.WantCaptureMouseNextFrame != -1) + { + io.WantCaptureMouse = io.WantCaptureMouseUnlessPopupClose = (g.WantCaptureMouseNextFrame != 0); + } + else + { + io.WantCaptureMouse = (mouse_avail && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_popup; + io.WantCaptureMouseUnlessPopupClose = (mouse_avail_unless_popup_close && (g.HoveredWindow != NULL || mouse_any_down)) || has_open_modal; + } + + // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to Dear ImGui only, false = dispatch keyboard info to Dear ImGui + underlying app) + if (g.WantCaptureKeyboardNextFrame != -1) + io.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0); + else + io.WantCaptureKeyboard = (g.ActiveId != 0) || (modal_window != NULL); + if (io.NavActive && (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && !(io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard)) + io.WantCaptureKeyboard = true; + + // Update io.WantTextInput flag, this is to allow systems without a keyboard (e.g. mobile, hand-held) to show a software keyboard if possible + io.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false; +} + +void ImGui::NewFrame() +{ + IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?"); + ImGuiContext& g = *GImGui; + + // Remove pending delete hooks before frame start. + // This deferred removal avoid issues of removal while iterating the hook vector + for (int n = g.Hooks.Size - 1; n >= 0; n--) + if (g.Hooks[n].Type == ImGuiContextHookType_PendingRemoval_) + g.Hooks.erase(&g.Hooks[n]); + + CallContextHooks(&g, ImGuiContextHookType_NewFramePre); + + // Check and assert for various common IO and Configuration mistakes + ErrorCheckNewFrameSanityChecks(); + + // Load settings on first frame, save settings when modified (after a delay) + UpdateSettings(); + + g.Time += g.IO.DeltaTime; + g.WithinFrameScope = true; + g.FrameCount += 1; + g.TooltipOverrideCount = 0; + g.WindowsActiveCount = 0; + g.MenusIdSubmittedThisFrame.resize(0); + + // Calculate frame-rate for the user, as a purely luxurious feature + g.FramerateSecPerFrameAccum += g.IO.DeltaTime - g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx]; + g.FramerateSecPerFrame[g.FramerateSecPerFrameIdx] = g.IO.DeltaTime; + g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame); + g.FramerateSecPerFrameCount = ImMin(g.FramerateSecPerFrameCount + 1, IM_ARRAYSIZE(g.FramerateSecPerFrame)); + g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)g.FramerateSecPerFrameCount)) : FLT_MAX; + + // Process input queue (trickle as many events as possible), turn events into writes to IO structure + g.InputEventsTrail.resize(0); + UpdateInputEvents(g.IO.ConfigInputTrickleEventQueue); + + // Update viewports (after processing input queue, so io.MouseHoveredViewport is set) + UpdateViewportsNewFrame(); + + // Setup current font and draw list shared data + g.IO.Fonts->Locked = true; + SetCurrentFont(GetDefaultFont()); + IM_ASSERT(g.Font->IsLoaded()); + ImRect virtual_space(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + virtual_space.Add(g.Viewports[n]->GetMainRect()); + g.DrawListSharedData.ClipRectFullscreen = virtual_space.ToVec4(); + g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol; + g.DrawListSharedData.SetCircleTessellationMaxError(g.Style.CircleTessellationMaxError); + g.DrawListSharedData.InitialFlags = ImDrawListFlags_None; + if (g.Style.AntiAliasedLines) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines; + if (g.Style.AntiAliasedLinesUseTex && !(g.Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLinesUseTex; + if (g.Style.AntiAliasedFill) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill; + if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) + g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset; + + // Mark rendering data as invalid to prevent user who may have a handle on it to use it. + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataP.Clear(); + } + + // Drag and drop keep the source ID alive so even if the source disappear our state is consistent + if (g.DragDropActive && g.DragDropPayload.SourceId == g.ActiveId) + KeepAliveID(g.DragDropPayload.SourceId); + + // Update HoveredId data + if (!g.HoveredIdPreviousFrame) + g.HoveredIdTimer = 0.0f; + if (!g.HoveredIdPreviousFrame || (g.HoveredId && g.ActiveId == g.HoveredId)) + g.HoveredIdNotActiveTimer = 0.0f; + if (g.HoveredId) + g.HoveredIdTimer += g.IO.DeltaTime; + if (g.HoveredId && g.ActiveId != g.HoveredId) + g.HoveredIdNotActiveTimer += g.IO.DeltaTime; + g.HoveredIdPreviousFrame = g.HoveredId; + g.HoveredId = 0; + g.HoveredIdAllowOverlap = false; + g.HoveredIdDisabled = false; + + // Clear ActiveID if the item is not alive anymore. + // In 1.87, the common most call to KeepAliveID() was moved from GetID() to ItemAdd(). + // As a result, custom widget using ButtonBehavior() _without_ ItemAdd() need to call KeepAliveID() themselves. + if (g.ActiveId != 0 && g.ActiveIdIsAlive != g.ActiveId && g.ActiveIdPreviousFrame == g.ActiveId) + { + IMGUI_DEBUG_LOG_ACTIVEID("NewFrame(): ClearActiveID() because it isn't marked alive anymore!\n"); + ClearActiveID(); + } + + // Update ActiveId data (clear reference to active widget if the widget isn't alive anymore) + if (g.ActiveId) + g.ActiveIdTimer += g.IO.DeltaTime; + g.LastActiveIdTimer += g.IO.DeltaTime; + g.ActiveIdPreviousFrame = g.ActiveId; + g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow; + g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore; + g.ActiveIdIsAlive = 0; + g.ActiveIdHasBeenEditedThisFrame = false; + g.ActiveIdPreviousFrameIsAlive = false; + g.ActiveIdIsJustActivated = false; + if (g.TempInputId != 0 && g.ActiveId != g.TempInputId) + g.TempInputId = 0; + if (g.ActiveId == 0) + { + g.ActiveIdUsingNavDirMask = 0x00; + g.ActiveIdUsingAllKeyboardKeys = false; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + g.ActiveIdUsingNavInputMask = 0x00; +#endif + } + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + if (g.ActiveId == 0) + g.ActiveIdUsingNavInputMask = 0; + else if (g.ActiveIdUsingNavInputMask != 0) + { + // If your custom widget code used: { g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel); } + // Since IMGUI_VERSION_NUM >= 18804 it should be: { SetKeyOwner(ImGuiKey_Escape, g.ActiveId); SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId); } + if (g.ActiveIdUsingNavInputMask & (1 << ImGuiNavInput_Cancel)) + SetKeyOwner(ImGuiKey_Escape, g.ActiveId); + if (g.ActiveIdUsingNavInputMask & ~(1 << ImGuiNavInput_Cancel)) + IM_ASSERT(0); // Other values unsupported + } +#endif + + // Update hover delay for IsItemHovered() with delays and tooltips + g.HoverDelayIdPreviousFrame = g.HoverDelayId; + if (g.HoverDelayId != 0) + { + //if (g.IO.MouseDelta.x == 0.0f && g.IO.MouseDelta.y == 0.0f) // Need design/flags + g.HoverDelayTimer += g.IO.DeltaTime; + g.HoverDelayClearTimer = 0.0f; + g.HoverDelayId = 0; + } + else if (g.HoverDelayTimer > 0.0f) + { + // This gives a little bit of leeway before clearing the hover timer, allowing mouse to cross gaps + g.HoverDelayClearTimer += g.IO.DeltaTime; + if (g.HoverDelayClearTimer >= ImMax(0.20f, g.IO.DeltaTime * 2.0f)) // ~6 frames at 30 Hz + allow for low framerate + g.HoverDelayTimer = g.HoverDelayClearTimer = 0.0f; // May want a decaying timer, in which case need to clamp at max first, based on max of caller last requested timer. + } + + // Drag and drop + g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr; + g.DragDropAcceptIdCurr = 0; + g.DragDropAcceptIdCurrRectSurface = FLT_MAX; + g.DragDropWithinSource = false; + g.DragDropWithinTarget = false; + g.DragDropHoldJustPressedId = 0; + + // Close popups on focus lost (currently wip/opt-in) + //if (g.IO.AppFocusLost) + // ClosePopupsExceptModals(); + + // Update keyboard input state + UpdateKeyboardInputs(); + + //IM_ASSERT(g.IO.KeyCtrl == IsKeyDown(ImGuiKey_LeftCtrl) || IsKeyDown(ImGuiKey_RightCtrl)); + //IM_ASSERT(g.IO.KeyShift == IsKeyDown(ImGuiKey_LeftShift) || IsKeyDown(ImGuiKey_RightShift)); + //IM_ASSERT(g.IO.KeyAlt == IsKeyDown(ImGuiKey_LeftAlt) || IsKeyDown(ImGuiKey_RightAlt)); + //IM_ASSERT(g.IO.KeySuper == IsKeyDown(ImGuiKey_LeftSuper) || IsKeyDown(ImGuiKey_RightSuper)); + + // Update gamepad/keyboard navigation + NavUpdate(); + + // Update mouse input state + UpdateMouseInputs(); + + // Find hovered window + // (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame) + UpdateHoveredWindowAndCaptureFlags(); + + // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering) + UpdateMouseMovingWindowNewFrame(); + + // Background darkening/whitening + if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f)) + g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f); + else + g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f); + + g.MouseCursor = ImGuiMouseCursor_Arrow; + g.WantCaptureMouseNextFrame = g.WantCaptureKeyboardNextFrame = g.WantTextInputNextFrame = -1; + + // Platform IME data: reset for the frame + g.PlatformImeDataPrev = g.PlatformImeData; + g.PlatformImeData.WantVisible = false; + + // Mouse wheel scrolling, scale + UpdateMouseWheel(); + + // Mark all windows as not visible and compact unused memory. + IM_ASSERT(g.WindowsFocusOrder.Size <= g.Windows.Size); + const float memory_compact_start_time = (g.GcCompactAll || g.IO.ConfigMemoryCompactTimer < 0.0f) ? FLT_MAX : (float)g.Time - g.IO.ConfigMemoryCompactTimer; + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + window->WasActive = window->Active; + window->Active = false; + window->WriteAccessed = false; + window->BeginCountPreviousFrame = window->BeginCount; + window->BeginCount = 0; + + // Garbage collect transient buffers of recently unused windows + if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time) + GcCompactTransientWindowBuffers(window); + } + + // Garbage collect transient buffers of recently unused tables + for (int i = 0; i < g.TablesLastTimeActive.Size; i++) + if (g.TablesLastTimeActive[i] >= 0.0f && g.TablesLastTimeActive[i] < memory_compact_start_time) + TableGcCompactTransientBuffers(g.Tables.GetByIndex(i)); + for (int i = 0; i < g.TablesTempData.Size; i++) + if (g.TablesTempData[i].LastTimeActive >= 0.0f && g.TablesTempData[i].LastTimeActive < memory_compact_start_time) + TableGcCompactTransientBuffers(&g.TablesTempData[i]); + if (g.GcCompactAll) + GcCompactTransientMiscBuffers(); + g.GcCompactAll = false; + + // Closing the focused window restore focus to the first active root window in descending z-order + if (g.NavWindow && !g.NavWindow->WasActive) + FocusTopMostWindowUnderOne(NULL, NULL); + + // No window should be open at the beginning of the frame. + // But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear. + g.CurrentWindowStack.resize(0); + g.BeginPopupStack.resize(0); + g.ItemFlagsStack.resize(0); + g.ItemFlagsStack.push_back(ImGuiItemFlags_None); + g.GroupStack.resize(0); + + // [DEBUG] Update debug features + UpdateDebugToolItemPicker(); + UpdateDebugToolStackQueries(); + if (g.DebugLocateFrames > 0 && --g.DebugLocateFrames == 0) + g.DebugLocateId = 0; + if (g.DebugLogClipperAutoDisableFrames > 0 && --g.DebugLogClipperAutoDisableFrames == 0) + { + DebugLog("(Auto-disabled ImGuiDebugLogFlags_EventClipper to avoid spamming)\n"); + g.DebugLogFlags &= ~ImGuiDebugLogFlags_EventClipper; + } + + // Create implicit/fallback window - which we will only render it if the user has added something to it. + // We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags. + // This fallback is particularly important as it prevents ImGui:: calls from crashing. + g.WithinFrameScopeWithImplicitWindow = true; + SetNextWindowSize(ImVec2(400, 400), ImGuiCond_FirstUseEver); + Begin("Debug##Default"); + IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true); + + CallContextHooks(&g, ImGuiContextHookType_NewFramePost); +} + +// FIXME: Add a more explicit sort order in the window structure. +static int IMGUI_CDECL ChildWindowComparer(const void* lhs, const void* rhs) +{ + const ImGuiWindow* const a = *(const ImGuiWindow* const *)lhs; + const ImGuiWindow* const b = *(const ImGuiWindow* const *)rhs; + if (int d = (a->Flags & ImGuiWindowFlags_Popup) - (b->Flags & ImGuiWindowFlags_Popup)) + return d; + if (int d = (a->Flags & ImGuiWindowFlags_Tooltip) - (b->Flags & ImGuiWindowFlags_Tooltip)) + return d; + return (a->BeginOrderWithinParent - b->BeginOrderWithinParent); +} + +static void AddWindowToSortBuffer(ImVector* out_sorted_windows, ImGuiWindow* window) +{ + out_sorted_windows->push_back(window); + if (window->Active) + { + int count = window->DC.ChildWindows.Size; + ImQsort(window->DC.ChildWindows.Data, (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer); + for (int i = 0; i < count; i++) + { + ImGuiWindow* child = window->DC.ChildWindows[i]; + if (child->Active) + AddWindowToSortBuffer(out_sorted_windows, child); + } + } +} + +static void AddDrawListToDrawData(ImVector* out_list, ImDrawList* draw_list) +{ + if (draw_list->CmdBuffer.Size == 0) + return; + if (draw_list->CmdBuffer.Size == 1 && draw_list->CmdBuffer[0].ElemCount == 0 && draw_list->CmdBuffer[0].UserCallback == NULL) + return; + + // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. + // May trigger for you if you are using PrimXXX functions incorrectly. + IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size); + IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size); + if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset)) + IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size); + + // Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window) + // If this assert triggers because you are drawing lots of stuff manually: + // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds. + // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics/Debugger window to inspect draw list contents. + // - If you want large meshes with more than 64K vertices, you can either: + // (A) Handle the ImDrawCmd::VtxOffset value in your renderer backend, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'. + // Most example backends already support this from 1.71. Pre-1.71 backends won't. + // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them. + // (B) Or handle 32-bit indices in your renderer backend, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h. + // Most example backends already support this. For example, the OpenGL example code detect index size at compile-time: + // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset); + // Your own engine or render API may use different parameters or function calls to specify index sizes. + // 2 and 4 bytes indices are generally supported by most graphics API. + // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching + // the 64K limit to split your draw commands in multiple draw lists. + if (sizeof(ImDrawIdx) == 2) + IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above"); + + out_list->push_back(draw_list); +} + +static void AddWindowToDrawData(ImGuiWindow* window, int layer) +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = g.Viewports[0]; + g.IO.MetricsRenderWindows++; + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[layer], window->DrawList); + for (int i = 0; i < window->DC.ChildWindows.Size; i++) + { + ImGuiWindow* child = window->DC.ChildWindows[i]; + if (IsWindowActiveAndVisible(child)) // Clipped children may have been marked not active + AddWindowToDrawData(child, layer); + } +} + +static inline int GetWindowDisplayLayer(ImGuiWindow* window) +{ + return (window->Flags & ImGuiWindowFlags_Tooltip) ? 1 : 0; +} + +// Layer is locked for the root window, however child windows may use a different viewport (e.g. extruding menu) +static inline void AddRootWindowToDrawData(ImGuiWindow* window) +{ + AddWindowToDrawData(window, GetWindowDisplayLayer(window)); +} + +void ImDrawDataBuilder::FlattenIntoSingleLayer() +{ + int n = Layers[0].Size; + int size = n; + for (int i = 1; i < IM_ARRAYSIZE(Layers); i++) + size += Layers[i].Size; + Layers[0].resize(size); + for (int layer_n = 1; layer_n < IM_ARRAYSIZE(Layers); layer_n++) + { + ImVector& layer = Layers[layer_n]; + if (layer.empty()) + continue; + memcpy(&Layers[0][n], &layer[0], layer.Size * sizeof(ImDrawList*)); + n += layer.Size; + layer.resize(0); + } +} + +static void SetupViewportDrawData(ImGuiViewportP* viewport, ImVector* draw_lists) +{ + ImGuiIO& io = ImGui::GetIO(); + ImDrawData* draw_data = &viewport->DrawDataP; + draw_data->Valid = true; + draw_data->CmdLists = (draw_lists->Size > 0) ? draw_lists->Data : NULL; + draw_data->CmdListsCount = draw_lists->Size; + draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0; + draw_data->DisplayPos = viewport->Pos; + draw_data->DisplaySize = viewport->Size; + draw_data->FramebufferScale = io.DisplayFramebufferScale; + for (int n = 0; n < draw_lists->Size; n++) + { + ImDrawList* draw_list = draw_lists->Data[n]; + draw_list->_PopUnusedDrawCmd(); + draw_data->TotalVtxCount += draw_list->VtxBuffer.Size; + draw_data->TotalIdxCount += draw_list->IdxBuffer.Size; + } +} + +// Push a clipping rectangle for both ImGui logic (hit-testing etc.) and low-level ImDrawList rendering. +// - When using this function it is sane to ensure that float are perfectly rounded to integer values, +// so that e.g. (int)(max.x-min.x) in user's render produce correct result. +// - If the code here changes, may need to update code of functions like NextColumn() and PushColumnClipRect(): +// some frequently called functions which to modify both channels and clipping simultaneously tend to use the +// more specialized SetWindowClipRectBeforeSetChannel() to avoid extraneous updates of underlying ImDrawCmds. +void ImGui::PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DrawList->PushClipRect(clip_rect_min, clip_rect_max, intersect_with_current_clip_rect); + window->ClipRect = window->DrawList->_ClipRectStack.back(); +} + +void ImGui::PopClipRect() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DrawList->PopClipRect(); + window->ClipRect = window->DrawList->_ClipRectStack.back(); +} + +static void ImGui::RenderDimmedBackgroundBehindWindow(ImGuiWindow* window, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + ImGuiViewportP* viewport = (ImGuiViewportP*)GetMainViewport(); + ImRect viewport_rect = viewport->GetMainRect(); + + // Draw behind window by moving the draw command at the FRONT of the draw list + { + // We've already called AddWindowToDrawData() which called DrawList->ChannelsMerge() on DockNodeHost windows, + // and draw list have been trimmed already, hence the explicit recreation of a draw command if missing. + // FIXME: This is creating complication, might be simpler if we could inject a drawlist in drawdata at a given position and not attempt to manipulate ImDrawCmd order. + ImDrawList* draw_list = window->RootWindow->DrawList; + if (draw_list->CmdBuffer.Size == 0) + draw_list->AddDrawCmd(); + draw_list->PushClipRect(viewport_rect.Min - ImVec2(1, 1), viewport_rect.Max + ImVec2(1, 1), false); // Ensure ImDrawCmd are not merged + draw_list->AddRectFilled(viewport_rect.Min, viewport_rect.Max, col); + ImDrawCmd cmd = draw_list->CmdBuffer.back(); + IM_ASSERT(cmd.ElemCount == 6); + draw_list->CmdBuffer.pop_back(); + draw_list->CmdBuffer.push_front(cmd); + draw_list->PopClipRect(); + draw_list->AddDrawCmd(); // We need to create a command as CmdBuffer.back().IdxOffset won't be correct if we append to same command. + } +} + +ImGuiWindow* ImGui::FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* parent_window) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* bottom_most_visible_window = parent_window; + for (int i = FindWindowDisplayIndex(parent_window); i >= 0; i--) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + continue; + if (!IsWindowWithinBeginStackOf(window, parent_window)) + break; + if (IsWindowActiveAndVisible(window) && GetWindowDisplayLayer(window) <= GetWindowDisplayLayer(parent_window)) + bottom_most_visible_window = window; + } + return bottom_most_visible_window; +} + +static void ImGui::RenderDimmedBackgrounds() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* modal_window = GetTopMostAndVisiblePopupModal(); + if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) + return; + const bool dim_bg_for_modal = (modal_window != NULL); + const bool dim_bg_for_window_list = (g.NavWindowingTargetAnim != NULL && g.NavWindowingTargetAnim->Active); + if (!dim_bg_for_modal && !dim_bg_for_window_list) + return; + + if (dim_bg_for_modal) + { + // Draw dimming behind modal or a begin stack child, whichever comes first in draw order. + ImGuiWindow* dim_behind_window = FindBottomMostVisibleWindowWithinBeginStack(modal_window); + RenderDimmedBackgroundBehindWindow(dim_behind_window, GetColorU32(ImGuiCol_ModalWindowDimBg, g.DimBgRatio)); + } + else if (dim_bg_for_window_list) + { + // Draw dimming behind CTRL+Tab target window + RenderDimmedBackgroundBehindWindow(g.NavWindowingTargetAnim, GetColorU32(ImGuiCol_NavWindowingDimBg, g.DimBgRatio)); + + // Draw border around CTRL+Tab target window + ImGuiWindow* window = g.NavWindowingTargetAnim; + ImGuiViewport* viewport = GetMainViewport(); + float distance = g.FontSize; + ImRect bb = window->Rect(); + bb.Expand(distance); + if (bb.GetWidth() >= viewport->Size.x && bb.GetHeight() >= viewport->Size.y) + bb.Expand(-distance - 1.0f); // If a window fits the entire viewport, adjust its highlight inward + if (window->DrawList->CmdBuffer.Size == 0) + window->DrawList->AddDrawCmd(); + window->DrawList->PushClipRect(viewport->Pos, viewport->Pos + viewport->Size); + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), window->WindowRounding, 0, 3.0f); + window->DrawList->PopClipRect(); + } +} + +// This is normally called by Render(). You may want to call it directly if you want to avoid calling Render() but the gain will be very minimal. +void ImGui::EndFrame() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + + // Don't process EndFrame() multiple times. + if (g.FrameCountEnded == g.FrameCount) + return; + IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?"); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePre); + + ErrorCheckEndFrameSanityChecks(); + + // Notify Platform/OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME) + ImGuiPlatformImeData* ime_data = &g.PlatformImeData; + if (g.IO.SetPlatformImeDataFn && memcmp(ime_data, &g.PlatformImeDataPrev, sizeof(ImGuiPlatformImeData)) != 0) + { + IMGUI_DEBUG_LOG_IO("Calling io.SetPlatformImeDataFn(): WantVisible: %d, InputPos (%.2f,%.2f)\n", ime_data->WantVisible, ime_data->InputPos.x, ime_data->InputPos.y); + ImGuiViewport* viewport = GetMainViewport(); +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (viewport->PlatformHandleRaw == NULL && g.IO.ImeWindowHandle != NULL) + { + viewport->PlatformHandleRaw = g.IO.ImeWindowHandle; + g.IO.SetPlatformImeDataFn(viewport, ime_data); + viewport->PlatformHandleRaw = NULL; + } + else +#endif + { + g.IO.SetPlatformImeDataFn(viewport, ime_data); + } + } + + // Hide implicit/fallback "Debug" window if it hasn't been used + g.WithinFrameScopeWithImplicitWindow = false; + if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed) + g.CurrentWindow->Active = false; + End(); + + // Update navigation: CTRL+Tab, wrap-around requests + NavEndFrame(); + + // Drag and Drop: Elapse payload (if delivered, or if source stops being submitted) + if (g.DragDropActive) + { + bool is_delivered = g.DragDropPayload.Delivery; + bool is_elapsed = (g.DragDropPayload.DataFrameCount + 1 < g.FrameCount) && ((g.DragDropSourceFlags & ImGuiDragDropFlags_SourceAutoExpirePayload) || !IsMouseDown(g.DragDropMouseButton)); + if (is_delivered || is_elapsed) + ClearDragDrop(); + } + + // Drag and Drop: Fallback for source tooltip. This is not ideal but better than nothing. + if (g.DragDropActive && g.DragDropSourceFrameCount < g.FrameCount && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + { + g.DragDropWithinSource = true; + SetTooltip("..."); + g.DragDropWithinSource = false; + } + + // End frame + g.WithinFrameScope = false; + g.FrameCountEnded = g.FrameCount; + + // Initiate moving window + handle left-click and right-click focus + UpdateMouseMovingWindowEndFrame(); + + // Sort the window list so that all child windows are after their parent + // We cannot do that on FocusWindow() because children may not exist yet + g.WindowsTempSortBuffer.resize(0); + g.WindowsTempSortBuffer.reserve(g.Windows.Size); + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it + continue; + AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window); + } + + // This usually assert if there is a mismatch between the ImGuiWindowFlags_ChildWindow / ParentWindow values and DC.ChildWindows[] in parents, aka we've done something wrong. + IM_ASSERT(g.Windows.Size == g.WindowsTempSortBuffer.Size); + g.Windows.swap(g.WindowsTempSortBuffer); + g.IO.MetricsActiveWindows = g.WindowsActiveCount; + + // Unlock font atlas + g.IO.Fonts->Locked = false; + + // Clear Input data for next frame + g.IO.AppFocusLost = false; + g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f; + g.IO.InputQueueCharacters.resize(0); + + CallContextHooks(&g, ImGuiContextHookType_EndFramePost); +} + +// Prepare the data for rendering so you can call GetDrawData() +// (As with anything within the ImGui:: namspace this doesn't touch your GPU or graphics API at all: +// it is the role of the ImGui_ImplXXXX_RenderDrawData() function provided by the renderer backend) +void ImGui::Render() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + + if (g.FrameCountEnded != g.FrameCount) + EndFrame(); + const bool first_render_of_frame = (g.FrameCountRendered != g.FrameCount); + g.FrameCountRendered = g.FrameCount; + g.IO.MetricsRenderWindows = 0; + + CallContextHooks(&g, ImGuiContextHookType_RenderPre); + + // Add background ImDrawList (for each active viewport) + for (int n = 0; n != g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.Clear(); + if (viewport->DrawLists[0] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetBackgroundDrawList(viewport)); + } + + // Draw modal/window whitening backgrounds + if (first_render_of_frame) + RenderDimmedBackgrounds(); + + // Add ImDrawList to render + ImGuiWindow* windows_to_render_top_most[2]; + windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL; + windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingListWindow : NULL); + for (int n = 0; n != g.Windows.Size; n++) + { + ImGuiWindow* window = g.Windows[n]; + IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" + if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1]) + AddRootWindowToDrawData(window); + } + for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++) + if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window + AddRootWindowToDrawData(windows_to_render_top_most[n]); + + // Draw software mouse cursor if requested by io.MouseDrawCursor flag + if (g.IO.MouseDrawCursor && first_render_of_frame && g.MouseCursor != ImGuiMouseCursor_None) + RenderMouseCursor(g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48)); + + // Setup ImDrawData structures for end-user + g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = 0; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + viewport->DrawDataBuilder.FlattenIntoSingleLayer(); + + // Add foreground ImDrawList (for each active viewport) + if (viewport->DrawLists[1] != NULL) + AddDrawListToDrawData(&viewport->DrawDataBuilder.Layers[0], GetForegroundDrawList(viewport)); + + SetupViewportDrawData(viewport, &viewport->DrawDataBuilder.Layers[0]); + ImDrawData* draw_data = &viewport->DrawDataP; + g.IO.MetricsRenderVertices += draw_data->TotalVtxCount; + g.IO.MetricsRenderIndices += draw_data->TotalIdxCount; + } + + CallContextHooks(&g, ImGuiContextHookType_RenderPost); +} + +// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker. +// CalcTextSize("") should return ImVec2(0.0f, g.FontSize) +ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width) +{ + ImGuiContext& g = *GImGui; + + const char* text_display_end; + if (hide_text_after_double_hash) + text_display_end = FindRenderedTextEnd(text, text_end); // Hide anything after a '##' string + else + text_display_end = text_end; + + ImFont* font = g.Font; + const float font_size = g.FontSize; + if (text == text_display_end) + return ImVec2(0.0f, font_size); + ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL); + + // Round + // FIXME: This has been here since Dec 2015 (7b0bf230) but down the line we want this out. + // FIXME: Investigate using ceilf or e.g. + // - https://git.musl-libc.org/cgit/musl/tree/src/math/ceilf.c + // - https://embarkstudios.github.io/rust-gpu/api/src/libm/math/ceilf.rs.html + text_size.x = IM_FLOOR(text_size.x + 0.99999f); + + return text_size; +} + +// Find window given position, search front-to-back +// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically +// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is +// called, aka before the next Begin(). Moving window isn't affected. +static void FindHoveredWindow() +{ + ImGuiContext& g = *GImGui; + + ImGuiWindow* hovered_window = NULL; + ImGuiWindow* hovered_window_ignoring_moving_window = NULL; + if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) + hovered_window = g.MovingWindow; + + ImVec2 padding_regular = g.Style.TouchExtraPadding; + ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; + for (int i = g.Windows.Size - 1; i >= 0; i--) + { + ImGuiWindow* window = g.Windows[i]; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (!window->Active || window->Hidden) + continue; + if (window->Flags & ImGuiWindowFlags_NoMouseInputs) + continue; + + // Using the clipped AABB, a child window will typically be clipped by its parent (not always) + ImRect bb(window->OuterRectClipped); + if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) + bb.Expand(padding_regular); + else + bb.Expand(padding_for_resize); + if (!bb.Contains(g.IO.MousePos)) + continue; + + // Support for one rectangular hole in any given window + // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) + if (window->HitTestHoleSize.x != 0) + { + ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); + ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); + if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) + continue; + } + + if (hovered_window == NULL) + hovered_window = window; + IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. + if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) + hovered_window_ignoring_moving_window = window; + if (hovered_window && hovered_window_ignoring_moving_window) + break; + } + + g.HoveredWindow = hovered_window; + g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; +} + +bool ImGui::IsItemActive() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId) + return g.ActiveId == g.LastItemData.ID; + return false; +} + +bool ImGui::IsItemActivated() +{ + ImGuiContext& g = *GImGui; + if (g.ActiveId) + if (g.ActiveId == g.LastItemData.ID && g.ActiveIdPreviousFrame != g.LastItemData.ID) + return true; + return false; +} + +bool ImGui::IsItemDeactivated() +{ + ImGuiContext& g = *GImGui; + if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDeactivated) + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Deactivated) != 0; + return (g.ActiveIdPreviousFrame == g.LastItemData.ID && g.ActiveIdPreviousFrame != 0 && g.ActiveId != g.LastItemData.ID); +} + +bool ImGui::IsItemDeactivatedAfterEdit() +{ + ImGuiContext& g = *GImGui; + return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore)); +} + +// == GetItemID() == GetFocusID() +bool ImGui::IsItemFocused() +{ + ImGuiContext& g = *GImGui; + if (g.NavId != g.LastItemData.ID || g.NavId == 0) + return false; + return true; +} + +// Important: this can be useful but it is NOT equivalent to the behavior of e.g.Button()! +// Most widgets have specific reactions based on mouse-up/down state, mouse position etc. +bool ImGui::IsItemClicked(ImGuiMouseButton mouse_button) +{ + return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None); +} + +bool ImGui::IsItemToggledOpen() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false; +} + +bool ImGui::IsItemToggledSelection() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false; +} + +bool ImGui::IsAnyItemHovered() +{ + ImGuiContext& g = *GImGui; + return g.HoveredId != 0 || g.HoveredIdPreviousFrame != 0; +} + +bool ImGui::IsAnyItemActive() +{ + ImGuiContext& g = *GImGui; + return g.ActiveId != 0; +} + +bool ImGui::IsAnyItemFocused() +{ + ImGuiContext& g = *GImGui; + return g.NavId != 0 && !g.NavDisableHighlight; +} + +bool ImGui::IsItemVisible() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) != 0; +} + +bool ImGui::IsItemEdited() +{ + ImGuiContext& g = *GImGui; + return (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Edited) != 0; +} + +// Allow last item to be overlapped by a subsequent item. Both may be activated during the same frame before the later one takes priority. +// FIXME: Although this is exposed, its interaction and ideal idiom with using ImGuiButtonFlags_AllowItemOverlap flag are extremely confusing, need rework. +void ImGui::SetItemAllowOverlap() +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.LastItemData.ID; + if (g.HoveredId == id) + g.HoveredIdAllowOverlap = true; + if (g.ActiveId == id) + g.ActiveIdAllowOverlap = true; +} + +// FIXME: It might be undesirable that this will likely disable KeyOwner-aware shortcuts systems. Consider a more fine-tuned version for the two users of this function. +void ImGui::SetActiveIdUsingAllKeyboardKeys() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ActiveId != 0); + g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_COUNT) - 1; + g.ActiveIdUsingAllKeyboardKeys = true; + NavMoveRequestCancel(); +} + +ImGuiID ImGui::GetItemID() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.ID; +} + +ImVec2 ImGui::GetItemRectMin() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.Min; +} + +ImVec2 ImGui::GetItemRectMax() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.Max; +} + +ImVec2 ImGui::GetItemRectSize() +{ + ImGuiContext& g = *GImGui; + return g.LastItemData.Rect.GetSize(); +} + +bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* parent_window = g.CurrentWindow; + + flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_ChildWindow; + flags |= (parent_window->Flags & ImGuiWindowFlags_NoMove); // Inherit the NoMove flag + + // Size + const ImVec2 content_avail = GetContentRegionAvail(); + ImVec2 size = ImFloor(size_arg); + const int auto_fit_axises = ((size.x == 0.0f) ? (1 << ImGuiAxis_X) : 0x00) | ((size.y == 0.0f) ? (1 << ImGuiAxis_Y) : 0x00); + if (size.x <= 0.0f) + size.x = ImMax(content_avail.x + size.x, 4.0f); // Arbitrary minimum child size (0.0f causing too many issues) + if (size.y <= 0.0f) + size.y = ImMax(content_avail.y + size.y, 4.0f); + SetNextWindowSize(size); + + // Build up name. If you need to append to a same child from multiple location in the ID stack, use BeginChild(ImGuiID id) with a stable value. + const char* temp_window_name; + if (name) + ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%s_%08X", parent_window->Name, name, id); + else + ImFormatStringToTempBuffer(&temp_window_name, NULL, "%s/%08X", parent_window->Name, id); + + const float backup_border_size = g.Style.ChildBorderSize; + if (!border) + g.Style.ChildBorderSize = 0.0f; + bool ret = Begin(temp_window_name, NULL, flags); + g.Style.ChildBorderSize = backup_border_size; + + ImGuiWindow* child_window = g.CurrentWindow; + child_window->ChildId = id; + child_window->AutoFitChildAxises = (ImS8)auto_fit_axises; + + // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually. + // While this is not really documented/defined, it seems that the expected thing to do. + if (child_window->BeginCount == 1) + parent_window->DC.CursorPos = child_window->Pos; + + // Process navigation-in immediately so NavInit can run on first frame + if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayersActiveMask != 0 || child_window->DC.NavHasScroll)) + { + FocusWindow(child_window); + NavInitWindow(child_window, false); + SetActiveID(id + 1, child_window); // Steal ActiveId with another arbitrary id so that key-press won't activate child item + g.ActiveIdSource = ImGuiInputSource_Nav; + } + return ret; +} + +bool ImGui::BeginChild(const char* str_id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + return BeginChildEx(str_id, window->GetID(str_id), size_arg, border, extra_flags); +} + +bool ImGui::BeginChild(ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags extra_flags) +{ + IM_ASSERT(id != 0); + return BeginChildEx(NULL, id, size_arg, border, extra_flags); +} + +void ImGui::EndChild() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + IM_ASSERT(g.WithinEndChild == false); + IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls + + g.WithinEndChild = true; + if (window->BeginCount > 1) + { + End(); + } + else + { + ImVec2 sz = window->Size; + if (window->AutoFitChildAxises & (1 << ImGuiAxis_X)) // Arbitrary minimum zero-ish child size of 4.0f causes less trouble than a 0.0f + sz.x = ImMax(4.0f, sz.x); + if (window->AutoFitChildAxises & (1 << ImGuiAxis_Y)) + sz.y = ImMax(4.0f, sz.y); + End(); + + ImGuiWindow* parent_window = g.CurrentWindow; + ImRect bb(parent_window->DC.CursorPos, parent_window->DC.CursorPos + sz); + ItemSize(sz); + if ((window->DC.NavLayersActiveMask != 0 || window->DC.NavHasScroll) && !(window->Flags & ImGuiWindowFlags_NavFlattened)) + { + ItemAdd(bb, window->ChildId); + RenderNavHighlight(bb, window->ChildId); + + // When browsing a window that has no activable items (scroll only) we keep a highlight on the child (pass g.NavId to trick into always displaying) + if (window->DC.NavLayersActiveMask == 0 && window == g.NavWindow) + RenderNavHighlight(ImRect(bb.Min - ImVec2(2, 2), bb.Max + ImVec2(2, 2)), g.NavId, ImGuiNavHighlightFlags_TypeThin); + } + else + { + // Not navigable into + ItemAdd(bb, 0); + } + if (g.HoveredWindow == window) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + } + g.WithinEndChild = false; + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return +} + +// Helper to create a child window / scrolling region that looks like a normal widget frame. +bool ImGui::BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags extra_flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding); + bool ret = BeginChild(id, size, true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding | extra_flags); + PopStyleVar(3); + PopStyleColor(); + return ret; +} + +void ImGui::EndChildFrame() +{ + EndChild(); +} + +static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled) +{ + window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags); + window->SetWindowSizeAllowFlags = enabled ? (window->SetWindowSizeAllowFlags | flags) : (window->SetWindowSizeAllowFlags & ~flags); + window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags); +} + +ImGuiWindow* ImGui::FindWindowByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id); +} + +ImGuiWindow* ImGui::FindWindowByName(const char* name) +{ + ImGuiID id = ImHashStr(name); + return FindWindowByID(id); +} + +static void ApplyWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) +{ + window->Pos = ImFloor(ImVec2(settings->Pos.x, settings->Pos.y)); + if (settings->Size.x > 0 && settings->Size.y > 0) + window->Size = window->SizeFull = ImFloor(ImVec2(settings->Size.x, settings->Size.y)); + window->Collapsed = settings->Collapsed; +} + +static void UpdateWindowInFocusOrderList(ImGuiWindow* window, bool just_created, ImGuiWindowFlags new_flags) +{ + ImGuiContext& g = *GImGui; + + const bool new_is_explicit_child = (new_flags & ImGuiWindowFlags_ChildWindow) != 0 && ((new_flags & ImGuiWindowFlags_Popup) == 0 || (new_flags & ImGuiWindowFlags_ChildMenu) != 0); + const bool child_flag_changed = new_is_explicit_child != window->IsExplicitChild; + if ((just_created || child_flag_changed) && !new_is_explicit_child) + { + IM_ASSERT(!g.WindowsFocusOrder.contains(window)); + g.WindowsFocusOrder.push_back(window); + window->FocusOrder = (short)(g.WindowsFocusOrder.Size - 1); + } + else if (!just_created && child_flag_changed && new_is_explicit_child) + { + IM_ASSERT(g.WindowsFocusOrder[window->FocusOrder] == window); + for (int n = window->FocusOrder + 1; n < g.WindowsFocusOrder.Size; n++) + g.WindowsFocusOrder[n]->FocusOrder--; + g.WindowsFocusOrder.erase(g.WindowsFocusOrder.Data + window->FocusOrder); + window->FocusOrder = -1; + } + window->IsExplicitChild = new_is_explicit_child; +} + +static void InitOrLoadWindowSettings(ImGuiWindow* window, ImGuiWindowSettings* settings) +{ + // Initial window state with e.g. default/arbitrary window position + // Use SetNextWindowPos() with the appropriate condition flag to change the initial position of a window. + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + window->Pos = main_viewport->Pos + ImVec2(60, 60); + window->SetWindowPosAllowFlags = window->SetWindowSizeAllowFlags = window->SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing; + + if (settings != NULL) + { + SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false); + ApplyWindowSettings(window, settings); + } + window->DC.CursorStartPos = window->DC.CursorMaxPos = window->DC.IdealMaxPos = window->Pos; // So first call to CalcWindowContentSizes() doesn't return crazy values + + if ((window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0) + { + window->AutoFitFramesX = window->AutoFitFramesY = 2; + window->AutoFitOnlyGrows = false; + } + else + { + if (window->Size.x <= 0.0f) + window->AutoFitFramesX = 2; + if (window->Size.y <= 0.0f) + window->AutoFitFramesY = 2; + window->AutoFitOnlyGrows = (window->AutoFitFramesX > 0) || (window->AutoFitFramesY > 0); + } +} + +static ImGuiWindow* CreateNewWindow(const char* name, ImGuiWindowFlags flags) +{ + // Create window the first time + //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name); + window->Flags = flags; + g.WindowsById.SetVoidPtr(window->ID, window); + + ImGuiWindowSettings* settings = NULL; + if (!(flags & ImGuiWindowFlags_NoSavedSettings)) + if ((settings = ImGui::FindWindowSettingsByWindow(window)) != 0) + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); + + InitOrLoadWindowSettings(window, settings); + + if (flags & ImGuiWindowFlags_NoBringToFrontOnFocus) + g.Windows.push_front(window); // Quite slow but rare and only once + else + g.Windows.push_back(window); + + return window; +} + +static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, const ImVec2& size_desired) +{ + ImGuiContext& g = *GImGui; + ImVec2 new_size = size_desired; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) + { + // Using -1,-1 on either X/Y axis to preserve the current size. + ImRect cr = g.NextWindowData.SizeConstraintRect; + new_size.x = (cr.Min.x >= 0 && cr.Max.x >= 0) ? ImClamp(new_size.x, cr.Min.x, cr.Max.x) : window->SizeFull.x; + new_size.y = (cr.Min.y >= 0 && cr.Max.y >= 0) ? ImClamp(new_size.y, cr.Min.y, cr.Max.y) : window->SizeFull.y; + if (g.NextWindowData.SizeCallback) + { + ImGuiSizeCallbackData data; + data.UserData = g.NextWindowData.SizeCallbackUserData; + data.Pos = window->Pos; + data.CurrentSize = window->SizeFull; + data.DesiredSize = new_size; + g.NextWindowData.SizeCallback(&data); + new_size = data.DesiredSize; + } + new_size.x = IM_FLOOR(new_size.x); + new_size.y = IM_FLOOR(new_size.y); + } + + // Minimum size + if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize))) + { + ImGuiWindow* window_for_height = window; + new_size = ImMax(new_size, g.Style.WindowMinSize); + const float minimum_height = window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f); + new_size.y = ImMax(new_size.y, minimum_height); // Reduce artifacts with very small windows + } + return new_size; +} + +static void CalcWindowContentSizes(ImGuiWindow* window, ImVec2* content_size_current, ImVec2* content_size_ideal) +{ + bool preserve_old_content_sizes = false; + if (window->Collapsed && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) + preserve_old_content_sizes = true; + else if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0) + preserve_old_content_sizes = true; + if (preserve_old_content_sizes) + { + *content_size_current = window->ContentSize; + *content_size_ideal = window->ContentSizeIdeal; + return; + } + + content_size_current->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x); + content_size_current->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y); + content_size_ideal->x = (window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : IM_FLOOR(ImMax(window->DC.CursorMaxPos.x, window->DC.IdealMaxPos.x) - window->DC.CursorStartPos.x); + content_size_ideal->y = (window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : IM_FLOOR(ImMax(window->DC.CursorMaxPos.y, window->DC.IdealMaxPos.y) - window->DC.CursorStartPos.y); +} + +static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + const float decoration_w_without_scrollbars = window->DecoOuterSizeX1 + window->DecoOuterSizeX2 - window->ScrollbarSizes.x; + const float decoration_h_without_scrollbars = window->DecoOuterSizeY1 + window->DecoOuterSizeY2 - window->ScrollbarSizes.y; + ImVec2 size_pad = window->WindowPadding * 2.0f; + ImVec2 size_desired = size_contents + size_pad + ImVec2(decoration_w_without_scrollbars, decoration_h_without_scrollbars); + if (window->Flags & ImGuiWindowFlags_Tooltip) + { + // Tooltip always resize + return size_desired; + } + else + { + // Maximum window size is determined by the viewport size or monitor size + const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0; + const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0; + ImVec2 size_min = style.WindowMinSize; + if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups) + size_min = ImMin(size_min, ImVec2(4.0f, 4.0f)); + + ImVec2 avail_size = ImGui::GetMainViewport()->WorkSize; + ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, avail_size - style.DisplaySafeAreaPadding * 2.0f)); + + // When the window cannot fit all contents (either because of constraints, either because screen is too small), + // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding. + ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit); + bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - decoration_w_without_scrollbars < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar); + bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - decoration_h_without_scrollbars < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar); + if (will_have_scrollbar_x) + size_auto_fit.y += style.ScrollbarSize; + if (will_have_scrollbar_y) + size_auto_fit.x += style.ScrollbarSize; + return size_auto_fit; + } +} + +ImVec2 ImGui::CalcWindowNextAutoFitSize(ImGuiWindow* window) +{ + ImVec2 size_contents_current; + ImVec2 size_contents_ideal; + CalcWindowContentSizes(window, &size_contents_current, &size_contents_ideal); + ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, size_contents_ideal); + ImVec2 size_final = CalcWindowSizeAfterConstraint(window, size_auto_fit); + return size_final; +} + +static ImGuiCol GetWindowBgColorIdx(ImGuiWindow* window) +{ + if (window->Flags & (ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_Popup)) + return ImGuiCol_PopupBg; + if (window->Flags & ImGuiWindowFlags_ChildWindow) + return ImGuiCol_ChildBg; + return ImGuiCol_WindowBg; +} + +static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& corner_target, const ImVec2& corner_norm, ImVec2* out_pos, ImVec2* out_size) +{ + ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left + ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right + ImVec2 size_expected = pos_max - pos_min; + ImVec2 size_constrained = CalcWindowSizeAfterConstraint(window, size_expected); + *out_pos = pos_min; + if (corner_norm.x == 0.0f) + out_pos->x -= (size_constrained.x - size_expected.x); + if (corner_norm.y == 0.0f) + out_pos->y -= (size_constrained.y - size_expected.y); + *out_size = size_constrained; +} + +// Data for resizing from corner +struct ImGuiResizeGripDef +{ + ImVec2 CornerPosN; + ImVec2 InnerDir; + int AngleMin12, AngleMax12; +}; +static const ImGuiResizeGripDef resize_grip_def[4] = +{ + { ImVec2(1, 1), ImVec2(-1, -1), 0, 3 }, // Lower-right + { ImVec2(0, 1), ImVec2(+1, -1), 3, 6 }, // Lower-left + { ImVec2(0, 0), ImVec2(+1, +1), 6, 9 }, // Upper-left (Unused) + { ImVec2(1, 0), ImVec2(-1, +1), 9, 12 } // Upper-right (Unused) +}; + +// Data for resizing from borders +struct ImGuiResizeBorderDef +{ + ImVec2 InnerDir; + ImVec2 SegmentN1, SegmentN2; + float OuterAngle; +}; +static const ImGuiResizeBorderDef resize_border_def[4] = +{ + { ImVec2(+1, 0), ImVec2(0, 1), ImVec2(0, 0), IM_PI * 1.00f }, // Left + { ImVec2(-1, 0), ImVec2(1, 0), ImVec2(1, 1), IM_PI * 0.00f }, // Right + { ImVec2(0, +1), ImVec2(0, 0), ImVec2(1, 0), IM_PI * 1.50f }, // Up + { ImVec2(0, -1), ImVec2(1, 1), ImVec2(0, 1), IM_PI * 0.50f } // Down +}; + +static ImRect GetResizeBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness) +{ + ImRect rect = window->Rect(); + if (thickness == 0.0f) + rect.Max -= ImVec2(1, 1); + if (border_n == ImGuiDir_Left) { return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); } + if (border_n == ImGuiDir_Right) { return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); } + if (border_n == ImGuiDir_Up) { return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); } + if (border_n == ImGuiDir_Down) { return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); } + IM_ASSERT(0); + return ImRect(); +} + +// 0..3: corners (Lower-right, Lower-left, Unused, Unused) +ImGuiID ImGui::GetWindowResizeCornerID(ImGuiWindow* window, int n) +{ + IM_ASSERT(n >= 0 && n < 4); + ImGuiID id = window->ID; + id = ImHashStr("#RESIZE", 0, id); + id = ImHashData(&n, sizeof(int), id); + return id; +} + +// Borders (Left, Right, Up, Down) +ImGuiID ImGui::GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir) +{ + IM_ASSERT(dir >= 0 && dir < 4); + int n = (int)dir + 4; + ImGuiID id = window->ID; + id = ImHashStr("#RESIZE", 0, id); + id = ImHashData(&n, sizeof(int), id); + return id; +} + +// Handle resize for: Resize Grips, Borders, Gamepad +// Return true when using auto-fit (double-click on resize grip) +static bool ImGui::UpdateWindowManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4], const ImRect& visibility_rect) +{ + ImGuiContext& g = *GImGui; + ImGuiWindowFlags flags = window->Flags; + + if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + return false; + if (window->WasActive == false) // Early out to avoid running this code for e.g. a hidden implicit/fallback Debug window. + return false; + + bool ret_auto_fit = false; + const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0; + const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f); + const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_HOVER_PADDING : 0.0f; + + ImVec2 pos_target(FLT_MAX, FLT_MAX); + ImVec2 size_target(FLT_MAX, FLT_MAX); + + // Resize grips and borders are on layer 1 + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + + // Manual resize grips + PushID("#RESIZE"); + for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) + { + const ImGuiResizeGripDef& def = resize_grip_def[resize_grip_n]; + const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, def.CornerPosN); + + // Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window + bool hovered, held; + ImRect resize_rect(corner - def.InnerDir * grip_hover_outer_size, corner + def.InnerDir * grip_hover_inner_size); + if (resize_rect.Min.x > resize_rect.Max.x) ImSwap(resize_rect.Min.x, resize_rect.Max.x); + if (resize_rect.Min.y > resize_rect.Max.y) ImSwap(resize_rect.Min.y, resize_rect.Max.y); + ImGuiID resize_grip_id = window->GetID(resize_grip_n); // == GetWindowResizeCornerID() + ItemAdd(resize_rect, resize_grip_id, NULL, ImGuiItemFlags_NoNav); + ButtonBehavior(resize_rect, resize_grip_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); + //GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255)); + if (hovered || held) + g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE; + + if (held && g.IO.MouseClickedCount[0] == 2 && resize_grip_n == 0) + { + // Manual auto-fit when double-clicking + size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit); + ret_auto_fit = true; + ClearActiveID(); + } + else if (held) + { + // Resize from any of the four corners + // We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position + ImVec2 clamp_min = ImVec2(def.CornerPosN.x == 1.0f ? visibility_rect.Min.x : -FLT_MAX, def.CornerPosN.y == 1.0f ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max = ImVec2(def.CornerPosN.x == 0.0f ? visibility_rect.Max.x : +FLT_MAX, def.CornerPosN.y == 0.0f ? visibility_rect.Max.y : +FLT_MAX); + ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(def.InnerDir * grip_hover_outer_size, def.InnerDir * -grip_hover_inner_size, def.CornerPosN); // Corner of the window corresponding to our corner grip + corner_target = ImClamp(corner_target, clamp_min, clamp_max); + CalcResizePosSizeFromAnyCorner(window, corner_target, def.CornerPosN, &pos_target, &size_target); + } + + // Only lower-left grip is visible before hovering/activating + if (resize_grip_n == 0 || held || hovered) + resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip); + } + for (int border_n = 0; border_n < resize_border_count; border_n++) + { + const ImGuiResizeBorderDef& def = resize_border_def[border_n]; + const ImGuiAxis axis = (border_n == ImGuiDir_Left || border_n == ImGuiDir_Right) ? ImGuiAxis_X : ImGuiAxis_Y; + + bool hovered, held; + ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_HOVER_PADDING); + ImGuiID border_id = window->GetID(border_n + 4); // == GetWindowResizeBorderID() + ItemAdd(border_rect, border_id, NULL, ImGuiItemFlags_NoNav); + ButtonBehavior(border_rect, border_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus); + //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255)); + if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held) + { + g.MouseCursor = (axis == ImGuiAxis_X) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS; + if (held) + *border_held = border_n; + } + if (held) + { + ImVec2 clamp_min(border_n == ImGuiDir_Right ? visibility_rect.Min.x : -FLT_MAX, border_n == ImGuiDir_Down ? visibility_rect.Min.y : -FLT_MAX); + ImVec2 clamp_max(border_n == ImGuiDir_Left ? visibility_rect.Max.x : +FLT_MAX, border_n == ImGuiDir_Up ? visibility_rect.Max.y : +FLT_MAX); + ImVec2 border_target = window->Pos; + border_target[axis] = g.IO.MousePos[axis] - g.ActiveIdClickOffset[axis] + WINDOWS_HOVER_PADDING; + border_target = ImClamp(border_target, clamp_min, clamp_max); + CalcResizePosSizeFromAnyCorner(window, border_target, ImMin(def.SegmentN1, def.SegmentN2), &pos_target, &size_target); + } + } + PopID(); + + // Restore nav layer + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + + // Navigation resize (keyboard/gamepad) + // FIXME: This cannot be moved to NavUpdateWindowing() because CalcWindowSizeAfterConstraint() need to callback into user. + // Not even sure the callback works here. + if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window) + { + ImVec2 nav_resize_dir; + if (g.NavInputSource == ImGuiInputSource_Keyboard && g.IO.KeyShift) + nav_resize_dir = GetKeyMagnitude2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow); + if (g.NavInputSource == ImGuiInputSource_Gamepad) + nav_resize_dir = GetKeyMagnitude2d(ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown); + if (nav_resize_dir.x != 0.0f || nav_resize_dir.y != 0.0f) + { + const float NAV_RESIZE_SPEED = 600.0f; + const float resize_step = NAV_RESIZE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y); + g.NavWindowingAccumDeltaSize += nav_resize_dir * resize_step; + g.NavWindowingAccumDeltaSize = ImMax(g.NavWindowingAccumDeltaSize, visibility_rect.Min - window->Pos - window->Size); // We need Pos+Size >= visibility_rect.Min, so Size >= visibility_rect.Min - Pos, so size_delta >= visibility_rect.Min - window->Pos - window->Size + g.NavWindowingToggleLayer = false; + g.NavDisableMouseHover = true; + resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive); + ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaSize); + if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) + { + // FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck. + size_target = CalcWindowSizeAfterConstraint(window, window->SizeFull + accum_floored); + g.NavWindowingAccumDeltaSize -= accum_floored; + } + } + } + + // Apply back modified position/size to window + if (size_target.x != FLT_MAX) + { + window->SizeFull = size_target; + MarkIniSettingsDirty(window); + } + if (pos_target.x != FLT_MAX) + { + window->Pos = ImFloor(pos_target); + MarkIniSettingsDirty(window); + } + + window->Size = window->SizeFull; + return ret_auto_fit; +} + +static inline void ClampWindowPos(ImGuiWindow* window, const ImRect& visibility_rect) +{ + ImGuiContext& g = *GImGui; + ImVec2 size_for_clamping = window->Size; + if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + size_for_clamping.y = window->TitleBarHeight(); + window->Pos = ImClamp(window->Pos, visibility_rect.Min - size_for_clamping, visibility_rect.Max); +} + +static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + float rounding = window->WindowRounding; + float border_size = window->WindowBorderSize; + if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground)) + window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, 0, border_size); + + int border_held = window->ResizeBorderHeld; + if (border_held != -1) + { + const ImGuiResizeBorderDef& def = resize_border_def[border_held]; + ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI * 0.25f, def.OuterAngle); + window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.SegmentN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI * 0.25f); + window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), 0, ImMax(2.0f, border_size)); // Thicker than usual + } + if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + { + float y = window->Pos.y + window->TitleBarHeight() - 1; + window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize); + } +} + +// Draw background and borders +// Draw and handle scrollbars +void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, bool handle_borders_and_resize_grips, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + // Ensure that ScrollBar doesn't read last frame's SkipItems + IM_ASSERT(window->BeginCount == 0); + window->SkipItems = false; + + // Draw window + handle manual resize + // As we highlight the title bar when want_focus is set, multiple reappearing windows will have their title bar highlighted on their reappearing frame. + const float window_rounding = window->WindowRounding; + const float window_border_size = window->WindowBorderSize; + if (window->Collapsed) + { + // Title bar only + const float backup_border_size = style.FrameBorderSize; + g.Style.FrameBorderSize = window->WindowBorderSize; + ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed); + RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding); + g.Style.FrameBorderSize = backup_border_size; + } + else + { + // Window background + if (!(flags & ImGuiWindowFlags_NoBackground)) + { + ImU32 bg_col = GetColorU32(GetWindowBgColorIdx(window)); + bool override_alpha = false; + float alpha = 1.0f; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha) + { + alpha = g.NextWindowData.BgAlphaVal; + override_alpha = true; + } + if (override_alpha) + bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT); + window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? 0 : ImDrawFlags_RoundCornersBottom); + } + + // Title bar + if (!(flags & ImGuiWindowFlags_NoTitleBar)) + { + ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg); + window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawFlags_RoundCornersTop); + } + + // Menu bar + if (flags & ImGuiWindowFlags_MenuBar) + { + ImRect menu_bar_rect = window->MenuBarRect(); + menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them. + window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawFlags_RoundCornersTop); + if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y) + window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize); + } + + // Scrollbars + if (window->ScrollbarX) + Scrollbar(ImGuiAxis_X); + if (window->ScrollbarY) + Scrollbar(ImGuiAxis_Y); + + // Render resize grips (after their input handling so we don't have a frame of latency) + if (handle_borders_and_resize_grips && !(flags & ImGuiWindowFlags_NoResize)) + { + for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++) + { + const ImU32 col = resize_grip_col[resize_grip_n]; + if ((col & IM_COL32_A_MASK) == 0) + continue; + const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n]; + const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size))); + window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size))); + window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12); + window->DrawList->PathFillConvex(col); + } + } + + // Borders + if (handle_borders_and_resize_grips) + RenderWindowOuterBorders(window); + } +} + +// Render title text, collapse button, close button +void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open) +{ + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImGuiWindowFlags flags = window->Flags; + + const bool has_close_button = (p_open != NULL); + const bool has_collapse_button = !(flags & ImGuiWindowFlags_NoCollapse) && (style.WindowMenuButtonPosition != ImGuiDir_None); + + // Close & Collapse button are on the Menu NavLayer and don't default focus (unless there's nothing else on that layer) + // FIXME-NAV: Might want (or not?) to set the equivalent of ImGuiButtonFlags_NoNavFocus so that mouse clicks on standard title bar items don't necessarily set nav/keyboard ref? + const ImGuiItemFlags item_flags_backup = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_NoNavDefaultFocus; + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + + // Layout buttons + // FIXME: Would be nice to generalize the subtleties expressed here into reusable code. + float pad_l = style.FramePadding.x; + float pad_r = style.FramePadding.x; + float button_sz = g.FontSize; + ImVec2 close_button_pos; + ImVec2 collapse_button_pos; + if (has_close_button) + { + pad_r += button_sz; + close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right) + { + pad_r += button_sz; + collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y); + } + if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left) + { + collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y); + pad_l += button_sz; + } + + // Collapse button (submitting first so it gets priority when choosing a navigation init fallback) + if (has_collapse_button) + if (CollapseButton(window->GetID("#COLLAPSE"), collapse_button_pos)) + window->WantCollapseToggle = true; // Defer actual collapsing to next frame as we are too far in the Begin() function + + // Close button + if (has_close_button) + if (CloseButton(window->GetID("#CLOSE"), close_button_pos)) + *p_open = false; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + g.CurrentItemFlags = item_flags_backup; + + // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker) + // FIXME: Refactor text alignment facilities along with RenderText helpers, this is WAY too much messy code.. + const float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? button_sz * 0.80f : 0.0f; + const ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f); + + // As a nice touch we try to ensure that centered title text doesn't get affected by visibility of Close/Collapse button, + // while uncentered title text will still reach edges correctly. + if (pad_l > style.FramePadding.x) + pad_l += g.Style.ItemInnerSpacing.x; + if (pad_r > style.FramePadding.x) + pad_r += g.Style.ItemInnerSpacing.x; + if (style.WindowTitleAlign.x > 0.0f && style.WindowTitleAlign.x < 1.0f) + { + float centerness = ImSaturate(1.0f - ImFabs(style.WindowTitleAlign.x - 0.5f) * 2.0f); // 0.0f on either edges, 1.0f on center + float pad_extend = ImMin(ImMax(pad_l, pad_r), title_bar_rect.GetWidth() - pad_l - pad_r - text_size.x); + pad_l = ImMax(pad_l, pad_extend * centerness); + pad_r = ImMax(pad_r, pad_extend * centerness); + } + + ImRect layout_r(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y, title_bar_rect.Max.x - pad_r, title_bar_rect.Max.y); + ImRect clip_r(layout_r.Min.x, layout_r.Min.y, ImMin(layout_r.Max.x + g.Style.ItemInnerSpacing.x, title_bar_rect.Max.x), layout_r.Max.y); + if (flags & ImGuiWindowFlags_UnsavedDocument) + { + ImVec2 marker_pos; + marker_pos.x = ImClamp(layout_r.Min.x + (layout_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x + text_size.x, layout_r.Min.x, layout_r.Max.x); + marker_pos.y = (layout_r.Min.y + layout_r.Max.y) * 0.5f; + if (marker_pos.x > layout_r.Min.x) + { + RenderBullet(window->DrawList, marker_pos, GetColorU32(ImGuiCol_Text)); + clip_r.Max.x = ImMin(clip_r.Max.x, marker_pos.x - (int)(marker_size_x * 0.5f)); + } + } + //if (g.IO.KeyShift) window->DrawList->AddRect(layout_r.Min, layout_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + //if (g.IO.KeyCtrl) window->DrawList->AddRect(clip_r.Min, clip_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG] + RenderTextClipped(layout_r.Min, layout_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_r); +} + +void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window) +{ + window->ParentWindow = parent_window; + window->RootWindow = window->RootWindowPopupTree = window->RootWindowForTitleBarHighlight = window->RootWindowForNav = window; + if (parent_window && (flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Tooltip)) + window->RootWindow = parent_window->RootWindow; + if (parent_window && (flags & ImGuiWindowFlags_Popup)) + window->RootWindowPopupTree = parent_window->RootWindowPopupTree; + if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup))) + window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight; + while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened) + { + IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL); + window->RootWindowForNav = window->RootWindowForNav->ParentWindow; + } +} + +// When a modal popup is open, newly created windows that want focus (i.e. are not popups and do not specify ImGuiWindowFlags_NoFocusOnAppearing) +// should be positioned behind that modal window, unless the window was created inside the modal begin-stack. +// In case of multiple stacked modals newly created window honors begin stack order and does not go below its own modal parent. +// - Window // FindBlockingModal() returns Modal1 +// - Window // .. returns Modal1 +// - Modal1 // .. returns Modal2 +// - Window // .. returns Modal2 +// - Window // .. returns Modal2 +// - Modal2 // .. returns Modal2 +static ImGuiWindow* ImGui::FindBlockingModal(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size <= 0) + return NULL; + + // Find a modal that has common parent with specified window. Specified window should be positioned behind that modal. + for (int i = g.OpenPopupStack.Size - 1; i >= 0; i--) + { + ImGuiWindow* popup_window = g.OpenPopupStack.Data[i].Window; + if (popup_window == NULL || !(popup_window->Flags & ImGuiWindowFlags_Modal)) + continue; + if (!popup_window->Active && !popup_window->WasActive) // Check WasActive, because this code may run before popup renders on current frame, also check Active to handle newly created windows. + continue; + if (IsWindowWithinBeginStackOf(window, popup_window)) // Window is rendered over last modal, no render order change needed. + break; + for (ImGuiWindow* parent = popup_window->ParentWindowInBeginStack->RootWindow; parent != NULL; parent = parent->ParentWindowInBeginStack->RootWindow) + if (IsWindowWithinBeginStackOf(window, parent)) + return popup_window; // Place window above its begin stack parent. + } + return NULL; +} + +// Push a new Dear ImGui window to add widgets to. +// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair. +// - Begin/End can be called multiple times during the frame with the same window name to append content. +// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file). +// You can use the "##" or "###" markers to use the same label with different id, or same id with different label. See documentation at the top of this file. +// - Return false when window is collapsed, so you can early out in your code. You always need to call ImGui::End() even if false is returned. +// - Passing 'bool* p_open' displays a Close button on the upper-right corner of the window, the pointed value will be set to false when the button is pressed. +bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required + IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame() + IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet + + // Find or create + ImGuiWindow* window = FindWindowByName(name); + const bool window_just_created = (window == NULL); + if (window_just_created) + window = CreateNewWindow(name, flags); + + // Automatically disable manual moving/resizing when NoInputs is set + if ((flags & ImGuiWindowFlags_NoInputs) == ImGuiWindowFlags_NoInputs) + flags |= ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize; + + if (flags & ImGuiWindowFlags_NavFlattened) + IM_ASSERT(flags & ImGuiWindowFlags_ChildWindow); + + const int current_frame = g.FrameCount; + const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame); + window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow); + + // Update the Appearing flag + bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on + if (flags & ImGuiWindowFlags_Popup) + { + ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; + window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed + window_just_activated_by_user |= (window != popup_ref.Window); + } + window->Appearing = window_just_activated_by_user; + if (window->Appearing) + SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true); + + // Update Flags, LastFrameActive, BeginOrderXXX fields + if (first_begin_of_the_frame) + { + UpdateWindowInFocusOrderList(window, window_just_created, flags); + window->Flags = (ImGuiWindowFlags)flags; + window->LastFrameActive = current_frame; + window->LastTimeActive = (float)g.Time; + window->BeginOrderWithinParent = 0; + window->BeginOrderWithinContext = (short)(g.WindowsActiveCount++); + } + else + { + flags = window->Flags; + } + + // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack + ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back().Window; + ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow; + IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow)); + + // We allow window memory to be compacted so recreate the base stack when needed. + if (window->IDStack.Size == 0) + window->IDStack.push_back(window->ID); + + // Add to stack + // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow() + g.CurrentWindow = window; + ImGuiWindowStackData window_stack_data; + window_stack_data.Window = window; + window_stack_data.ParentLastItemDataBackup = g.LastItemData; + window_stack_data.StackSizesOnBegin.SetToContextState(&g); + g.CurrentWindowStack.push_back(window_stack_data); + if (flags & ImGuiWindowFlags_ChildMenu) + g.BeginMenuCount++; + + // Update ->RootWindow and others pointers (before any possible call to FocusWindow) + if (first_begin_of_the_frame) + { + UpdateWindowParentAndRootLinks(window, flags, parent_window); + window->ParentWindowInBeginStack = parent_window_in_stack; + } + + // Add to focus scope stack + PushFocusScope(window->ID); + window->NavRootFocusScopeId = g.CurrentFocusScopeId; + g.CurrentWindow = NULL; + + // Add to popup stack + if (flags & ImGuiWindowFlags_Popup) + { + ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size]; + popup_ref.Window = window; + popup_ref.ParentNavLayer = parent_window_in_stack->DC.NavLayerCurrent; + g.BeginPopupStack.push_back(popup_ref); + window->PopupId = popup_ref.PopupId; + } + + // Process SetNextWindow***() calls + // (FIXME: Consider splitting the HasXXX flags into X/Y components + bool window_pos_set_by_api = false; + bool window_size_x_set_by_api = false, window_size_y_set_by_api = false; + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) + { + window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0; + if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f) + { + // May be processed on the next frame if this is our first frame and we are measuring size + // FIXME: Look into removing the branch so everything can go through this same code path for consistency. + window->SetWindowPosVal = g.NextWindowData.PosVal; + window->SetWindowPosPivot = g.NextWindowData.PosPivotVal; + window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + } + else + { + SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond); + } + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) + { + window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f); + window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f); + SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond); + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasScroll) + { + if (g.NextWindowData.ScrollVal.x >= 0.0f) + { + window->ScrollTarget.x = g.NextWindowData.ScrollVal.x; + window->ScrollTargetCenterRatio.x = 0.0f; + } + if (g.NextWindowData.ScrollVal.y >= 0.0f) + { + window->ScrollTarget.y = g.NextWindowData.ScrollVal.y; + window->ScrollTargetCenterRatio.y = 0.0f; + } + } + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize) + window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal; + else if (first_begin_of_the_frame) + window->ContentSizeExplicit = ImVec2(0.0f, 0.0f); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed) + SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus) + FocusWindow(window); + if (window->Appearing) + SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false); + + // When reusing window again multiple times a frame, just append content (don't need to setup again) + if (first_begin_of_the_frame) + { + // Initialize + const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345) + const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFramesCannotSkipItems > 0); + window->Active = true; + window->HasCloseButton = (p_open != NULL); + window->ClipRect = ImVec4(-FLT_MAX, -FLT_MAX, +FLT_MAX, +FLT_MAX); + window->IDStack.resize(1); + window->DrawList->_ResetForNewFrame(); + window->DC.CurrentTableIdx = -1; + + // Restore buffer capacity when woken from a compacted state, to avoid + if (window->MemoryCompacted) + GcAwakeTransientWindowBuffers(window); + + // Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged). + // The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere. + bool window_title_visible_elsewhere = false; + if (g.NavWindowingListWindow != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB + window_title_visible_elsewhere = true; + if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0) + { + size_t buf_len = (size_t)window->NameBufLen; + window->Name = ImStrdupcpy(window->Name, &buf_len, name); + window->NameBufLen = (int)buf_len; + } + + // UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS + + // Update contents size from last frame for auto-fitting (or use explicit size) + CalcWindowContentSizes(window, &window->ContentSize, &window->ContentSizeIdeal); + if (window->HiddenFramesCanSkipItems > 0) + window->HiddenFramesCanSkipItems--; + if (window->HiddenFramesCannotSkipItems > 0) + window->HiddenFramesCannotSkipItems--; + if (window->HiddenFramesForRenderOnly > 0) + window->HiddenFramesForRenderOnly--; + + // Hide new windows for one frame until they calculate their size + if (window_just_created && (!window_size_x_set_by_api || !window_size_y_set_by_api)) + window->HiddenFramesCannotSkipItems = 1; + + // Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows) + // We reset Size/ContentSize for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size. + if (window_just_activated_by_user && (flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0) + { + window->HiddenFramesCannotSkipItems = 1; + if (flags & ImGuiWindowFlags_AlwaysAutoResize) + { + if (!window_size_x_set_by_api) + window->Size.x = window->SizeFull.x = 0.f; + if (!window_size_y_set_by_api) + window->Size.y = window->SizeFull.y = 0.f; + window->ContentSize = window->ContentSizeIdeal = ImVec2(0.f, 0.f); + } + } + + // SELECT VIEWPORT + // FIXME-VIEWPORT: In the docking/viewport branch, this is the point where we select the current viewport (which may affect the style) + + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + SetWindowViewport(window, viewport); + SetCurrentWindow(window); + + // LOCK BORDER SIZE AND PADDING FOR THE FRAME (so that altering them doesn't cause inconsistencies) + + if (flags & ImGuiWindowFlags_ChildWindow) + window->WindowBorderSize = style.ChildBorderSize; + else + window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize; + window->WindowPadding = style.WindowPadding; + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f) + window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f); + + // Lock menu offset so size calculation can use it as menu-bar windows need a minimum size. + window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x); + window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y; + + bool use_current_size_for_scrollbar_x = window_just_created; + bool use_current_size_for_scrollbar_y = window_just_created; + + // Collapse window by double-clicking on title bar + // At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing + if (!(flags & ImGuiWindowFlags_NoTitleBar) && !(flags & ImGuiWindowFlags_NoCollapse)) + { + // We don't use a regular button+id to test for double-click on title bar (mostly due to legacy reason, could be fixed), so verify that we don't have items over the title bar. + ImRect title_bar_rect = window->TitleBarRect(); + if (g.HoveredWindow == window && g.HoveredId == 0 && g.HoveredIdPreviousFrame == 0 && IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max) && g.IO.MouseClickedCount[0] == 2) + window->WantCollapseToggle = true; + if (window->WantCollapseToggle) + { + window->Collapsed = !window->Collapsed; + if (!window->Collapsed) + use_current_size_for_scrollbar_y = true; + MarkIniSettingsDirty(window); + } + } + else + { + window->Collapsed = false; + } + window->WantCollapseToggle = false; + + // SIZE + + // Outer Decoration Sizes + // (we need to clear ScrollbarSize immediatly as CalcWindowAutoFitSize() needs it and can be called from other locations). + const ImVec2 scrollbar_sizes_from_last_frame = window->ScrollbarSizes; + window->DecoOuterSizeX1 = 0.0f; + window->DecoOuterSizeX2 = 0.0f; + window->DecoOuterSizeY1 = window->TitleBarHeight() + window->MenuBarHeight(); + window->DecoOuterSizeY2 = 0.0f; + window->ScrollbarSizes = ImVec2(0.0f, 0.0f); + + // Calculate auto-fit size, handle automatic resize + const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSizeIdeal); + if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed) + { + // Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc. + if (!window_size_x_set_by_api) + { + window->SizeFull.x = size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } + if (!window_size_y_set_by_api) + { + window->SizeFull.y = size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } + } + else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0) + { + // Auto-fit may only grow window during the first few frames + // We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed. + if (!window_size_x_set_by_api && window->AutoFitFramesX > 0) + { + window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x; + use_current_size_for_scrollbar_x = true; + } + if (!window_size_y_set_by_api && window->AutoFitFramesY > 0) + { + window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y; + use_current_size_for_scrollbar_y = true; + } + if (!window->Collapsed) + MarkIniSettingsDirty(window); + } + + // Apply minimum/maximum window size constraints and final size + window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull); + window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull; + + // POSITION + + // Popup latch its initial position, will position itself when it appears next frame + if (window_just_activated_by_user) + { + window->AutoPosLastDirection = ImGuiDir_None; + if ((flags & ImGuiWindowFlags_Popup) != 0 && !(flags & ImGuiWindowFlags_Modal) && !window_pos_set_by_api) // FIXME: BeginPopup() could use SetNextWindowPos() + window->Pos = g.BeginPopupStack.back().OpenPopupPos; + } + + // Position child window + if (flags & ImGuiWindowFlags_ChildWindow) + { + IM_ASSERT(parent_window && parent_window->Active); + window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size; + parent_window->DC.ChildWindows.push_back(window); + if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip) + window->Pos = parent_window->DC.CursorPos; + } + + const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesCannotSkipItems == 0); + if (window_pos_with_pivot) + SetWindowPos(window, window->SetWindowPosVal - window->Size * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering) + else if ((flags & ImGuiWindowFlags_ChildMenu) != 0) + window->Pos = FindBestWindowPosForPopup(window); + else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize) + window->Pos = FindBestWindowPosForPopup(window); + else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip) + window->Pos = FindBestWindowPosForPopup(window); + + // Calculate the range of allowed position for that window (to be movable and visible past safe area padding) + // When clamping to stay visible, we will enforce that window->Pos stays inside of visibility_rect. + ImRect viewport_rect(viewport->GetMainRect()); + ImRect viewport_work_rect(viewport->GetWorkRect()); + ImVec2 visibility_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding); + ImRect visibility_rect(viewport_work_rect.Min + visibility_padding, viewport_work_rect.Max - visibility_padding); + + // Clamp position/size so window stays visible within its viewport or monitor + // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing. + if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow)) + if (viewport_rect.GetWidth() > 0.0f && viewport_rect.GetHeight() > 0.0f) + ClampWindowPos(window, visibility_rect); + window->Pos = ImFloor(window->Pos); + + // Lock window rounding for the frame (so that altering them doesn't cause inconsistencies) + // Large values tend to lead to variety of artifacts and are not recommended. + window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding; + + // For windows with title bar or menu bar, we clamp to FrameHeight(FontSize + FramePadding.y * 2.0f) to completely hide artifacts. + //if ((window->Flags & ImGuiWindowFlags_MenuBar) || !(window->Flags & ImGuiWindowFlags_NoTitleBar)) + // window->WindowRounding = ImMin(window->WindowRounding, g.FontSize + style.FramePadding.y * 2.0f); + + // Apply window focus (new and reactivated windows are moved to front) + bool want_focus = false; + if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing)) + { + if (flags & ImGuiWindowFlags_Popup) + want_focus = true; + else if ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0) + want_focus = true; + + ImGuiWindow* modal = GetTopMostPopupModal(); + if (modal != NULL && !IsWindowWithinBeginStackOf(window, modal)) + { + // Avoid focusing a window that is created outside of active modal. This will prevent active modal from being closed. + // Since window is not focused it would reappear at the same display position like the last time it was visible. + // In case of completely new windows it would go to the top (over current modal), but input to such window would still be blocked by modal. + // Position window behind a modal that is not a begin-parent of this window. + want_focus = false; + if (window == window->RootWindow) + { + ImGuiWindow* blocking_modal = FindBlockingModal(window); + IM_ASSERT(blocking_modal != NULL); + BringWindowToDisplayBehind(window, blocking_modal); + } + } + } + + // [Test Engine] Register whole window in the item system (before submitting further decorations) +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (g.TestEngineHookItems) + { + IM_ASSERT(window->IDStack.Size == 1); + window->IDStack.Size = 0; // As window->IDStack[0] == window->ID here, make sure TestEngine doesn't erroneously see window as parent of itself. + IMGUI_TEST_ENGINE_ITEM_ADD(window->ID, window->Rect(), NULL); + IMGUI_TEST_ENGINE_ITEM_INFO(window->ID, window->Name, (g.HoveredWindow == window) ? ImGuiItemStatusFlags_HoveredRect : 0); + window->IDStack.Size = 1; + } +#endif + + // Handle manual resize: Resize Grips, Borders, Gamepad + int border_held = -1; + ImU32 resize_grip_col[4] = {}; + const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it. + const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.10f, window->WindowRounding + 1.0f + g.FontSize * 0.2f)); + if (!window->Collapsed) + if (UpdateWindowManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0], visibility_rect)) + use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true; + window->ResizeBorderHeld = (signed char)border_held; + + // SCROLLBAR VISIBILITY + + // Update scrollbar visibility (based on the Size that was effective during last frame or the auto-resized Size). + if (!window->Collapsed) + { + // When reading the current size we need to read it after size constraints have been applied. + // Intentionally use previous frame values for InnerRect and ScrollbarSizes. + // And when we use window->DecorationUp here it doesn't have ScrollbarSizes.y applied yet. + ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2)); + ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + scrollbar_sizes_from_last_frame; + ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f; + float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x; + float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y; + //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons? + window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar)); + window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar)); + if (window->ScrollbarX && !window->ScrollbarY) + window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar); + window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f); + + // Amend the partially filled window->DecorationXXX values. + window->DecoOuterSizeX2 += window->ScrollbarSizes.x; + window->DecoOuterSizeY2 += window->ScrollbarSizes.y; + } + + // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING) + // Update various regions. Variables they depend on should be set above in this function. + // We set this up after processing the resize grip so that our rectangles doesn't lag by a frame. + + // Outer rectangle + // Not affected by window border size. Used by: + // - FindHoveredWindow() (w/ extra padding when border resize is enabled) + // - Begin() initial clipping rect for drawing window background and borders. + // - Begin() clipping whole child + const ImRect host_rect = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) ? parent_window->ClipRect : viewport_rect; + const ImRect outer_rect = window->Rect(); + const ImRect title_bar_rect = window->TitleBarRect(); + window->OuterRectClipped = outer_rect; + window->OuterRectClipped.ClipWith(host_rect); + + // Inner rectangle + // Not affected by window border size. Used by: + // - InnerClipRect + // - ScrollToRectEx() + // - NavUpdatePageUpPageDown() + // - Scrollbar() + window->InnerRect.Min.x = window->Pos.x + window->DecoOuterSizeX1; + window->InnerRect.Min.y = window->Pos.y + window->DecoOuterSizeY1; + window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->DecoOuterSizeX2; + window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->DecoOuterSizeY2; + + // Inner clipping rectangle. + // Will extend a little bit outside the normal work region. + // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space. + // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result. + // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior. + // Affected by window/frame border size. Used by: + // - Begin() initial clip rect + float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize); + window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size); + window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize)); + window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize); + window->InnerClipRect.ClipWithFull(host_rect); + + // Default item width. Make it proportional to window size if window manually resizes + if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize)) + window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f); + else + window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f); + + // SCROLLING + + // Lock down maximum scrolling + // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate + // for right/bottom aligned items without creating a scrollbar. + window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth()); + window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight()); + + // Apply scrolling + window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window); + window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX); + window->DecoInnerSizeX1 = window->DecoInnerSizeY1 = 0.0f; + + // DRAWING + + // Setup draw list and outer clipping rectangle + IM_ASSERT(window->DrawList->CmdBuffer.Size == 1 && window->DrawList->CmdBuffer[0].ElemCount == 0); + window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID); + PushClipRect(host_rect.Min, host_rect.Max, false); + + // Child windows can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call (since 1.71) + // When using overlapping child windows, this will break the assumption that child z-order is mapped to submission order. + // FIXME: User code may rely on explicit sorting of overlapping child window and would need to disable this somehow. Please get in contact if you are affected (github #4493) + { + bool render_decorations_in_parent = false; + if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) + { + // - We test overlap with the previous child window only (testing all would end up being O(log N) not a good investment here) + // - We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping childs + ImGuiWindow* previous_child = parent_window->DC.ChildWindows.Size >= 2 ? parent_window->DC.ChildWindows[parent_window->DC.ChildWindows.Size - 2] : NULL; + bool previous_child_overlapping = previous_child ? previous_child->Rect().Overlaps(window->Rect()) : false; + bool parent_is_empty = parent_window->DrawList->VtxBuffer.Size > 0; + if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_is_empty && !previous_child_overlapping) + render_decorations_in_parent = true; + } + if (render_decorations_in_parent) + window->DrawList = parent_window->DrawList; + + // Handle title bar, scrollbar, resize grips and resize borders + const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow; + const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight); + const bool handle_borders_and_resize_grips = true; // This exists to facilitate merge with 'docking' branch. + RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, handle_borders_and_resize_grips, resize_grip_count, resize_grip_col, resize_grip_draw_size); + + if (render_decorations_in_parent) + window->DrawList = &window->DrawListInst; + } + + // UPDATE RECTANGLES (2- THOSE AFFECTED BY SCROLLING) + + // Work rectangle. + // Affected by window padding and border size. Used by: + // - Columns() for right-most edge + // - TreeNode(), CollapsingHeader() for right-most edge + // - BeginTabBar() for right-most edge + const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar); + const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar); + const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2))); + const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2))); + window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize)); + window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize)); + window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x; + window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y; + window->ParentWorkRect = window->WorkRect; + + // [LEGACY] Content Region + // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it. + // Used by: + // - Mouse wheel scrolling + many other things + window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x + window->DecoOuterSizeX1; + window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->DecoOuterSizeY1; + window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - (window->DecoOuterSizeX1 + window->DecoOuterSizeX2))); + window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - (window->DecoOuterSizeY1 + window->DecoOuterSizeY2))); + + // Setup drawing context + // (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.) + window->DC.Indent.x = window->DecoOuterSizeX1 + window->WindowPadding.x - window->Scroll.x; + window->DC.GroupOffset.x = 0.0f; + window->DC.ColumnsOffset.x = 0.0f; + + // Record the loss of precision of CursorStartPos which can happen due to really large scrolling amount. + // This is used by clipper to compensate and fix the most common use case of large scroll area. Easy and cheap, next best thing compared to switching everything to double or ImU64. + double start_pos_highp_x = (double)window->Pos.x + window->WindowPadding.x - (double)window->Scroll.x + window->DecoOuterSizeX1 + window->DC.ColumnsOffset.x; + double start_pos_highp_y = (double)window->Pos.y + window->WindowPadding.y - (double)window->Scroll.y + window->DecoOuterSizeY1; + window->DC.CursorStartPos = ImVec2((float)start_pos_highp_x, (float)start_pos_highp_y); + window->DC.CursorStartPosLossyness = ImVec2((float)(start_pos_highp_x - window->DC.CursorStartPos.x), (float)(start_pos_highp_y - window->DC.CursorStartPos.y)); + window->DC.CursorPos = window->DC.CursorStartPos; + window->DC.CursorPosPrevLine = window->DC.CursorPos; + window->DC.CursorMaxPos = window->DC.CursorStartPos; + window->DC.IdealMaxPos = window->DC.CursorStartPos; + window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f; + window->DC.IsSameLine = window->DC.IsSetPos = false; + + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + window->DC.NavLayersActiveMask = window->DC.NavLayersActiveMaskNext; + window->DC.NavLayersActiveMaskNext = 0x00; + window->DC.NavHideHighlightOneFrame = false; + window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f); + + window->DC.MenuBarAppending = false; + window->DC.MenuColumns.Update(style.ItemSpacing.x, window_just_activated_by_user); + window->DC.TreeDepth = 0; + window->DC.TreeJumpToParentOnPopMask = 0x00; + window->DC.ChildWindows.resize(0); + window->DC.StateStorage = &window->StateStorage; + window->DC.CurrentColumns = NULL; + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical; + + window->DC.ItemWidth = window->ItemWidthDefault; + window->DC.TextWrapPos = -1.0f; // disabled + window->DC.ItemWidthStack.resize(0); + window->DC.TextWrapPosStack.resize(0); + + if (window->AutoFitFramesX > 0) + window->AutoFitFramesX--; + if (window->AutoFitFramesY > 0) + window->AutoFitFramesY--; + + // Apply focus (we need to call FocusWindow() AFTER setting DC.CursorStartPos so our initial navigation reference rectangle can start around there) + if (want_focus) + { + FocusWindow(window); + NavInitWindow(window, false); // <-- this is in the way for us to be able to defer and sort reappearing FocusWindow() calls + } + + // Title bar + if (!(flags & ImGuiWindowFlags_NoTitleBar)) + RenderWindowTitleBarContents(window, ImRect(title_bar_rect.Min.x + window->WindowBorderSize, title_bar_rect.Min.y, title_bar_rect.Max.x - window->WindowBorderSize, title_bar_rect.Max.y), name, p_open); + + // Clear hit test shape every frame + window->HitTestHoleSize.x = window->HitTestHoleSize.y = 0; + + // Pressing CTRL+C while holding on a window copy its content to the clipboard + // This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope. + // Maybe we can support CTRL+C on every element? + /* + //if (g.NavWindow == window && g.ActiveId == 0) + if (g.ActiveId == window->MoveId) + if (g.IO.KeyCtrl && IsKeyPressed(ImGuiKey_C)) + LogToClipboard(); + */ + + // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin(). + // This is useful to allow creating context menus on title bar only, etc. + SetLastItemData(window->MoveId, g.CurrentItemFlags, IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0, title_bar_rect); + + // [DEBUG] +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (g.DebugLocateId != 0 && (window->ID == g.DebugLocateId || window->MoveId == g.DebugLocateId)) + DebugLocateItemResolveWithLastItem(); +#endif + + // [Test Engine] Register title bar / tab with MoveId. +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (!(window->Flags & ImGuiWindowFlags_NoTitleBar)) + IMGUI_TEST_ENGINE_ITEM_ADD(g.LastItemData.ID, g.LastItemData.Rect, &g.LastItemData); +#endif + } + else + { + // Append + SetCurrentWindow(window); + } + + PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true); + + // Clear 'accessed' flag last thing (After PushClipRect which will set the flag. We want the flag to stay false when the default "Debug" window is unused) + window->WriteAccessed = false; + window->BeginCount++; + g.NextWindowData.ClearFlags(); + + // Update visibility + if (first_begin_of_the_frame) + { + if (flags & ImGuiWindowFlags_ChildWindow) + { + // Child window can be out of sight and have "negative" clip windows. + // Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar). + IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0); + if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0) // FIXME: Doesn't make sense for ChildWindow?? + { + const bool nav_request = (flags & ImGuiWindowFlags_NavFlattened) && (g.NavAnyRequest && g.NavWindow && g.NavWindow->RootWindowForNav == window->RootWindowForNav); + if (!g.LogEnabled && !nav_request) + if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y) + window->HiddenFramesCanSkipItems = 1; + } + + // Hide along with parent or if parent is collapsed + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0)) + window->HiddenFramesCanSkipItems = 1; + if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0)) + window->HiddenFramesCannotSkipItems = 1; + } + + // Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point) + if (style.Alpha <= 0.0f) + window->HiddenFramesCanSkipItems = 1; + + // Update the Hidden flag + bool hidden_regular = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0); + window->Hidden = hidden_regular || (window->HiddenFramesForRenderOnly > 0); + + // Disable inputs for requested number of frames + if (window->DisableInputsFrames > 0) + { + window->DisableInputsFrames--; + window->Flags |= ImGuiWindowFlags_NoInputs; + } + + // Update the SkipItems flag, used to early out of all items functions (no layout required) + bool skip_items = false; + if (window->Collapsed || !window->Active || hidden_regular) + if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0) + skip_items = true; + window->SkipItems = skip_items; + } + + return !window->SkipItems; +} + +void ImGui::End() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Error checking: verify that user hasn't called End() too many times! + if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow) + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!"); + return; + } + IM_ASSERT(g.CurrentWindowStack.Size > 0); + + // Error checking: verify that user doesn't directly call End() on a child window. + if (window->Flags & ImGuiWindowFlags_ChildWindow) + IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!"); + + // Close anything that is open + if (window->DC.CurrentColumns) + EndColumns(); + PopClipRect(); // Inner window clip rectangle + PopFocusScope(); + + // Stop logging + if (!(window->Flags & ImGuiWindowFlags_ChildWindow)) // FIXME: add more options for scope of logging + LogFinish(); + + if (window->DC.IsSetPos) + ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + + // Pop from window stack + g.LastItemData = g.CurrentWindowStack.back().ParentLastItemDataBackup; + if (window->Flags & ImGuiWindowFlags_ChildMenu) + g.BeginMenuCount--; + if (window->Flags & ImGuiWindowFlags_Popup) + g.BeginPopupStack.pop_back(); + g.CurrentWindowStack.back().StackSizesOnBegin.CompareWithContextState(&g); + g.CurrentWindowStack.pop_back(); + SetCurrentWindow(g.CurrentWindowStack.Size == 0 ? NULL : g.CurrentWindowStack.back().Window); +} + +void ImGui::BringWindowToFocusFront(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(window == window->RootWindow); + + const int cur_order = window->FocusOrder; + IM_ASSERT(g.WindowsFocusOrder[cur_order] == window); + if (g.WindowsFocusOrder.back() == window) + return; + + const int new_order = g.WindowsFocusOrder.Size - 1; + for (int n = cur_order; n < new_order; n++) + { + g.WindowsFocusOrder[n] = g.WindowsFocusOrder[n + 1]; + g.WindowsFocusOrder[n]->FocusOrder--; + IM_ASSERT(g.WindowsFocusOrder[n]->FocusOrder == n); + } + g.WindowsFocusOrder[new_order] = window; + window->FocusOrder = (short)new_order; +} + +void ImGui::BringWindowToDisplayFront(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* current_front_window = g.Windows.back(); + if (current_front_window == window || current_front_window->RootWindow == window) // Cheap early out (could be better) + return; + for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window + if (g.Windows[i] == window) + { + memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*)); + g.Windows[g.Windows.Size - 1] = window; + break; + } +} + +void ImGui::BringWindowToDisplayBack(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.Windows[0] == window) + return; + for (int i = 0; i < g.Windows.Size; i++) + if (g.Windows[i] == window) + { + memmove(&g.Windows[1], &g.Windows[0], (size_t)i * sizeof(ImGuiWindow*)); + g.Windows[0] = window; + break; + } +} + +void ImGui::BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* behind_window) +{ + IM_ASSERT(window != NULL && behind_window != NULL); + ImGuiContext& g = *GImGui; + window = window->RootWindow; + behind_window = behind_window->RootWindow; + int pos_wnd = FindWindowDisplayIndex(window); + int pos_beh = FindWindowDisplayIndex(behind_window); + if (pos_wnd < pos_beh) + { + size_t copy_bytes = (pos_beh - pos_wnd - 1) * sizeof(ImGuiWindow*); + memmove(&g.Windows.Data[pos_wnd], &g.Windows.Data[pos_wnd + 1], copy_bytes); + g.Windows[pos_beh - 1] = window; + } + else + { + size_t copy_bytes = (pos_wnd - pos_beh) * sizeof(ImGuiWindow*); + memmove(&g.Windows.Data[pos_beh + 1], &g.Windows.Data[pos_beh], copy_bytes); + g.Windows[pos_beh] = window; + } +} + +int ImGui::FindWindowDisplayIndex(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + return g.Windows.index_from_ptr(g.Windows.find(window)); +} + +// Moving window to front of display and set focus (which happens to be back of our sorted list) +void ImGui::FocusWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + + if (g.NavWindow != window) + { + SetNavWindow(window); + if (window && g.NavDisableMouseHover) + g.NavMousePosDirty = true; + g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId + g.NavLayer = ImGuiNavLayer_Main; + g.NavFocusScopeId = window ? window->NavRootFocusScopeId : 0; + g.NavIdIsAlive = false; + + // Close popups if any + ClosePopupsOverWindow(window, false); + } + + // Move the root window to the top of the pile + IM_ASSERT(window == NULL || window->RootWindow != NULL); + ImGuiWindow* focus_front_window = window ? window->RootWindow : NULL; // NB: In docking branch this is window->RootWindowDockStop + ImGuiWindow* display_front_window = window ? window->RootWindow : NULL; + + // Steal active widgets. Some of the cases it triggers includes: + // - Focus a window while an InputText in another window is active, if focus happens before the old InputText can run. + // - When using Nav to activate menu items (due to timing of activating on press->new window appears->losing ActiveId) + if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window) + if (!g.ActiveIdNoClearOnFocusLoss) + ClearActiveID(); + + // Passing NULL allow to disable keyboard focus + if (!window) + return; + + // Bring to front + BringWindowToFocusFront(focus_front_window); + if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0) + BringWindowToDisplayFront(display_front_window); +} + +void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window) +{ + ImGuiContext& g = *GImGui; + int start_idx = g.WindowsFocusOrder.Size - 1; + if (under_this_window != NULL) + { + // Aim at root window behind us, if we are in a child window that's our own root (see #4640) + int offset = -1; + while (under_this_window->Flags & ImGuiWindowFlags_ChildWindow) + { + under_this_window = under_this_window->ParentWindow; + offset = 0; + } + start_idx = FindWindowFocusIndex(under_this_window) + offset; + } + for (int i = start_idx; i >= 0; i--) + { + // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user. + ImGuiWindow* window = g.WindowsFocusOrder[i]; + IM_ASSERT(window == window->RootWindow); + if (window != ignore_window && window->WasActive) + if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) + { + ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window); + FocusWindow(focus_window); + return; + } + } + FocusWindow(NULL); +} + +// Important: this alone doesn't alter current ImDrawList state. This is called by PushFont/PopFont only. +void ImGui::SetCurrentFont(ImFont* font) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ? + IM_ASSERT(font->Scale > 0.0f); + g.Font = font; + g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale); + g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f; + + ImFontAtlas* atlas = g.Font->ContainerAtlas; + g.DrawListSharedData.TexUvWhitePixel = atlas->TexUvWhitePixel; + g.DrawListSharedData.TexUvLines = atlas->TexUvLines; + g.DrawListSharedData.Font = g.Font; + g.DrawListSharedData.FontSize = g.FontSize; +} + +void ImGui::PushFont(ImFont* font) +{ + ImGuiContext& g = *GImGui; + if (!font) + font = GetDefaultFont(); + SetCurrentFont(font); + g.FontStack.push_back(font); + g.CurrentWindow->DrawList->PushTextureID(font->ContainerAtlas->TexID); +} + +void ImGui::PopFont() +{ + ImGuiContext& g = *GImGui; + g.CurrentWindow->DrawList->PopTextureID(); + g.FontStack.pop_back(); + SetCurrentFont(g.FontStack.empty() ? GetDefaultFont() : g.FontStack.back()); +} + +void ImGui::PushItemFlag(ImGuiItemFlags option, bool enabled) +{ + ImGuiContext& g = *GImGui; + ImGuiItemFlags item_flags = g.CurrentItemFlags; + IM_ASSERT(item_flags == g.ItemFlagsStack.back()); + if (enabled) + item_flags |= option; + else + item_flags &= ~option; + g.CurrentItemFlags = item_flags; + g.ItemFlagsStack.push_back(item_flags); +} + +void ImGui::PopItemFlag() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ItemFlagsStack.Size > 1); // Too many calls to PopItemFlag() - we always leave a 0 at the bottom of the stack. + g.ItemFlagsStack.pop_back(); + g.CurrentItemFlags = g.ItemFlagsStack.back(); +} + +// BeginDisabled()/EndDisabled() +// - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) +// - Visually this is currently altering alpha, but it is expected that in a future styling system this would work differently. +// - Feedback welcome at https://github.com/ocornut/imgui/issues/211 +// - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. +// - Optimized shortcuts instead of PushStyleVar() + PushItemFlag() +void ImGui::BeginDisabled(bool disabled) +{ + ImGuiContext& g = *GImGui; + bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + if (!was_disabled && disabled) + { + g.DisabledAlphaBackup = g.Style.Alpha; + g.Style.Alpha *= g.Style.DisabledAlpha; // PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * g.Style.DisabledAlpha); + } + if (was_disabled || disabled) + g.CurrentItemFlags |= ImGuiItemFlags_Disabled; + g.ItemFlagsStack.push_back(g.CurrentItemFlags); + g.DisabledStackSize++; +} + +void ImGui::EndDisabled() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DisabledStackSize > 0); + g.DisabledStackSize--; + bool was_disabled = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + //PopItemFlag(); + g.ItemFlagsStack.pop_back(); + g.CurrentItemFlags = g.ItemFlagsStack.back(); + if (was_disabled && (g.CurrentItemFlags & ImGuiItemFlags_Disabled) == 0) + g.Style.Alpha = g.DisabledAlphaBackup; //PopStyleVar(); +} + +void ImGui::PushTabStop(bool tab_stop) +{ + PushItemFlag(ImGuiItemFlags_NoTabStop, !tab_stop); +} + +void ImGui::PopTabStop() +{ + PopItemFlag(); +} + +void ImGui::PushButtonRepeat(bool repeat) +{ + PushItemFlag(ImGuiItemFlags_ButtonRepeat, repeat); +} + +void ImGui::PopButtonRepeat() +{ + PopItemFlag(); +} + +void ImGui::PushTextWrapPos(float wrap_pos_x) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPosStack.push_back(window->DC.TextWrapPos); + window->DC.TextWrapPos = wrap_pos_x; +} + +void ImGui::PopTextWrapPos() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.TextWrapPos = window->DC.TextWrapPosStack.back(); + window->DC.TextWrapPosStack.pop_back(); +} + +static ImGuiWindow* GetCombinedRootWindow(ImGuiWindow* window, bool popup_hierarchy) +{ + ImGuiWindow* last_window = NULL; + while (last_window != window) + { + last_window = window; + window = window->RootWindow; + if (popup_hierarchy) + window = window->RootWindowPopupTree; + } + return window; +} + +bool ImGui::IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy) +{ + ImGuiWindow* window_root = GetCombinedRootWindow(window, popup_hierarchy); + if (window_root == potential_parent) + return true; + while (window != NULL) + { + if (window == potential_parent) + return true; + if (window == window_root) // end of chain + return false; + window = window->ParentWindow; + } + return false; +} + +bool ImGui::IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent) +{ + if (window->RootWindow == potential_parent) + return true; + while (window != NULL) + { + if (window == potential_parent) + return true; + window = window->ParentWindowInBeginStack; + } + return false; +} + +bool ImGui::IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below) +{ + ImGuiContext& g = *GImGui; + + // It would be saner to ensure that display layer is always reflected in the g.Windows[] order, which would likely requires altering all manipulations of that array + const int display_layer_delta = GetWindowDisplayLayer(potential_above) - GetWindowDisplayLayer(potential_below); + if (display_layer_delta != 0) + return display_layer_delta > 0; + + for (int i = g.Windows.Size - 1; i >= 0; i--) + { + ImGuiWindow* candidate_window = g.Windows[i]; + if (candidate_window == potential_above) + return true; + if (candidate_window == potential_below) + return false; + } + return false; +} + +bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags) +{ + IM_ASSERT((flags & (ImGuiHoveredFlags_AllowWhenOverlapped | ImGuiHoveredFlags_AllowWhenDisabled)) == 0); // Flags not supported by this function + ImGuiContext& g = *GImGui; + ImGuiWindow* ref_window = g.HoveredWindow; + ImGuiWindow* cur_window = g.CurrentWindow; + if (ref_window == NULL) + return false; + + if ((flags & ImGuiHoveredFlags_AnyWindow) == 0) + { + IM_ASSERT(cur_window); // Not inside a Begin()/End() + const bool popup_hierarchy = (flags & ImGuiHoveredFlags_NoPopupHierarchy) == 0; + if (flags & ImGuiHoveredFlags_RootWindow) + cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); + + bool result; + if (flags & ImGuiHoveredFlags_ChildWindows) + result = IsWindowChildOf(ref_window, cur_window, popup_hierarchy); + else + result = (ref_window == cur_window); + if (!result) + return false; + } + + if (!IsWindowContentHoverable(ref_window, flags)) + return false; + if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) + if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != ref_window->MoveId) + return false; + return true; +} + +bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* ref_window = g.NavWindow; + ImGuiWindow* cur_window = g.CurrentWindow; + + if (ref_window == NULL) + return false; + if (flags & ImGuiFocusedFlags_AnyWindow) + return true; + + IM_ASSERT(cur_window); // Not inside a Begin()/End() + const bool popup_hierarchy = (flags & ImGuiFocusedFlags_NoPopupHierarchy) == 0; + if (flags & ImGuiHoveredFlags_RootWindow) + cur_window = GetCombinedRootWindow(cur_window, popup_hierarchy); + + if (flags & ImGuiHoveredFlags_ChildWindows) + return IsWindowChildOf(ref_window, cur_window, popup_hierarchy); + else + return (ref_window == cur_window); +} + +// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext) +// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmatically. +// If you want a window to never be focused, you may use the e.g. NoInputs flag. +bool ImGui::IsWindowNavFocusable(ImGuiWindow* window) +{ + return window->WasActive && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus); +} + +float ImGui::GetWindowWidth() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Size.x; +} + +float ImGui::GetWindowHeight() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Size.y; +} + +ImVec2 ImGui::GetWindowPos() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + return window->Pos; +} + +void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowPosAllowFlags & cond) == 0) + return; + + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + window->SetWindowPosAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + window->SetWindowPosVal = ImVec2(FLT_MAX, FLT_MAX); + + // Set + const ImVec2 old_pos = window->Pos; + window->Pos = ImFloor(pos); + ImVec2 offset = window->Pos - old_pos; + if (offset.x == 0.0f && offset.y == 0.0f) + return; + MarkIniSettingsDirty(window); + window->DC.CursorPos += offset; // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor + window->DC.CursorMaxPos += offset; // And more importantly we need to offset CursorMaxPos/CursorStartPos this so ContentSize calculation doesn't get affected. + window->DC.IdealMaxPos += offset; + window->DC.CursorStartPos += offset; +} + +void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + SetWindowPos(window, pos, cond); +} + +void ImGui::SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowPos(window, pos, cond); +} + +ImVec2 ImGui::GetWindowSize() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Size; +} + +void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowSizeAllowFlags & cond) == 0) + return; + + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + window->SetWindowSizeAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + + // Set + ImVec2 old_size = window->SizeFull; + window->AutoFitFramesX = (size.x <= 0.0f) ? 2 : 0; + window->AutoFitFramesY = (size.y <= 0.0f) ? 2 : 0; + if (size.x <= 0.0f) + window->AutoFitOnlyGrows = false; + else + window->SizeFull.x = IM_FLOOR(size.x); + if (size.y <= 0.0f) + window->AutoFitOnlyGrows = false; + else + window->SizeFull.y = IM_FLOOR(size.y); + if (old_size.x != window->SizeFull.x || old_size.y != window->SizeFull.y) + MarkIniSettingsDirty(window); +} + +void ImGui::SetWindowSize(const ImVec2& size, ImGuiCond cond) +{ + SetWindowSize(GImGui->CurrentWindow, size, cond); +} + +void ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowSize(window, size, cond); +} + +void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond) +{ + // Test condition (NB: bit 0 is always true) and clear flags for next time + if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0) + return; + window->SetWindowCollapsedAllowFlags &= ~(ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing); + + // Set + window->Collapsed = collapsed; +} + +void ImGui::SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size) +{ + IM_ASSERT(window->HitTestHoleSize.x == 0); // We don't support multiple holes/hit test filters + window->HitTestHoleSize = ImVec2ih(size); + window->HitTestHoleOffset = ImVec2ih(pos - window->Pos); +} + +void ImGui::SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window) +{ + window->Hidden = window->SkipItems = true; + window->HiddenFramesCanSkipItems = 1; +} + +void ImGui::SetWindowCollapsed(bool collapsed, ImGuiCond cond) +{ + SetWindowCollapsed(GImGui->CurrentWindow, collapsed, cond); +} + +bool ImGui::IsWindowCollapsed() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Collapsed; +} + +bool ImGui::IsWindowAppearing() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->Appearing; +} + +void ImGui::SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond) +{ + if (ImGuiWindow* window = FindWindowByName(name)) + SetWindowCollapsed(window, collapsed, cond); +} + +void ImGui::SetWindowFocus() +{ + FocusWindow(GImGui->CurrentWindow); +} + +void ImGui::SetWindowFocus(const char* name) +{ + if (name) + { + if (ImGuiWindow* window = FindWindowByName(name)) + FocusWindow(window); + } + else + { + FocusWindow(NULL); + } +} + +void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pivot) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos; + g.NextWindowData.PosVal = pos; + g.NextWindowData.PosPivotVal = pivot; + g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize; + g.NextWindowData.SizeVal = size; + g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint; + g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max); + g.NextWindowData.SizeCallback = custom_callback; + g.NextWindowData.SizeCallbackUserData = custom_callback_user_data; +} + +// Content size = inner scrollable rectangle, padded with WindowPadding. +// SetNextWindowContentSize(ImVec2(100,100) + ImGuiWindowFlags_AlwaysAutoResize will always allow submitting a 100x100 item. +void ImGui::SetNextWindowContentSize(const ImVec2& size) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize; + g.NextWindowData.ContentSizeVal = ImFloor(size); +} + +void ImGui::SetNextWindowScroll(const ImVec2& scroll) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasScroll; + g.NextWindowData.ScrollVal = scroll; +} + +void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags. + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed; + g.NextWindowData.CollapsedVal = collapsed; + g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always; +} + +void ImGui::SetNextWindowFocus() +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus; +} + +void ImGui::SetNextWindowBgAlpha(float alpha) +{ + ImGuiContext& g = *GImGui; + g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha; + g.NextWindowData.BgAlphaVal = alpha; +} + +ImDrawList* ImGui::GetWindowDrawList() +{ + ImGuiWindow* window = GetCurrentWindow(); + return window->DrawList; +} + +ImFont* ImGui::GetFont() +{ + return GImGui->Font; +} + +float ImGui::GetFontSize() +{ + return GImGui->FontSize; +} + +ImVec2 ImGui::GetFontTexUvWhitePixel() +{ + return GImGui->DrawListSharedData.TexUvWhitePixel; +} + +void ImGui::SetWindowFontScale(float scale) +{ + IM_ASSERT(scale > 0.0f); + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->FontWindowScale = scale; + g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize(); +} + +void ImGui::ActivateItem(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.NavNextActivateId = id; + g.NavNextActivateFlags = ImGuiActivateFlags_None; +} + +void ImGui::PushFocusScope(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + g.FocusScopeStack.push_back(id); + g.CurrentFocusScopeId = id; +} + +void ImGui::PopFocusScope() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.FocusScopeStack.Size > 0); // Too many PopFocusScope() ? + g.FocusScopeStack.pop_back(); + g.CurrentFocusScopeId = g.FocusScopeStack.Size ? g.FocusScopeStack.back() : 0; +} + +// Note: this will likely be called ActivateItem() once we rework our Focus/Activation system! +void ImGui::SetKeyboardFocusHere(int offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(offset >= -1); // -1 is allowed but not below + IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere(%d) in window \"%s\"\n", offset, window->Name); + + // It makes sense in the vast majority of cases to never interrupt a drag and drop. + // When we refactor this function into ActivateItem() we may want to make this an option. + // MovingWindow is protected from most user inputs using SetActiveIdUsingNavAndKeys(), but + // is also automatically dropped in the event g.ActiveId is stolen. + if (g.DragDropActive || g.MovingWindow != NULL) + { + IMGUI_DEBUG_LOG_ACTIVEID("SetKeyboardFocusHere() ignored while DragDropActive!\n"); + return; + } + + SetNavWindow(window); + + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + NavMoveRequestSubmit(ImGuiDir_None, offset < 0 ? ImGuiDir_Up : ImGuiDir_Down, ImGuiNavMoveFlags_Tabbing | ImGuiNavMoveFlags_FocusApi, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + if (offset == -1) + { + NavMoveRequestResolveWithLastItem(&g.NavMoveResultLocal); + } + else + { + g.NavTabbingDir = 1; + g.NavTabbingCounter = offset + 1; + } +} + +void ImGui::SetItemDefaultFocus() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!window->Appearing) + return; + if (g.NavWindow != window->RootWindowForNav || (!g.NavInitRequest && g.NavInitResultId == 0) || g.NavLayer != window->DC.NavLayerCurrent) + return; + + g.NavInitRequest = false; + g.NavInitResultId = g.LastItemData.ID; + g.NavInitResultRectRel = WindowRectAbsToRel(window, g.LastItemData.Rect); + NavUpdateAnyRequestFlag(); + + // Scroll could be done in NavInitRequestApplyResult() via an opt-in flag (we however don't want regular init requests to scroll) + if (!window->ClipRect.Contains(g.LastItemData.Rect)) + ScrollToRectEx(window, g.LastItemData.Rect, ImGuiScrollFlags_None); +} + +void ImGui::SetStateStorage(ImGuiStorage* tree) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + window->DC.StateStorage = tree ? tree : &window->StateStorage; +} + +ImGuiStorage* ImGui::GetStateStorage() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->DC.StateStorage; +} + +void ImGui::PushID(const char* str_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(str_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(str_id_begin, str_id_end); + window->IDStack.push_back(id); +} + +void ImGui::PushID(const void* ptr_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(ptr_id); + window->IDStack.push_back(id); +} + +void ImGui::PushID(int int_id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiID id = window->GetID(int_id); + window->IDStack.push_back(id); +} + +// Push a given id value ignoring the ID stack as a seed. +void ImGui::PushOverrideID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_ID, NULL, NULL); + window->IDStack.push_back(id); +} + +// Helper to avoid a common series of PushOverrideID -> GetID() -> PopID() call +// (note that when using this pattern, TestEngine's "Stack Tool" will tend to not display the intermediate stack level. +// for that to work we would need to do PushOverrideID() -> ItemAdd() -> PopID() which would alter widget code a little more) +ImGuiID ImGui::GetIDWithSeed(const char* str, const char* str_end, ImGuiID seed) +{ + ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_String, str, str_end); + return id; +} + +ImGuiID ImGui::GetIDWithSeed(int n, ImGuiID seed) +{ + ImGuiID id = ImHashData(&n, sizeof(n), seed); + ImGuiContext& g = *GImGui; + if (g.DebugHookIdInfo == id) + DebugHookIdInfo(id, ImGuiDataType_S32, (void*)(intptr_t)n, NULL); + return id; +} + +void ImGui::PopID() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + IM_ASSERT(window->IDStack.Size > 1); // Too many PopID(), or could be popping in a wrong/different window? + window->IDStack.pop_back(); +} + +ImGuiID ImGui::GetID(const char* str_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id); +} + +ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(str_id_begin, str_id_end); +} + +ImGuiID ImGui::GetID(const void* ptr_id) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(ptr_id); +} + +bool ImGui::IsRectVisible(const ImVec2& size) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size)); +} + +bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max) +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ClipRect.Overlaps(ImRect(rect_min, rect_max)); +} + + +//----------------------------------------------------------------------------- +// [SECTION] INPUTS +//----------------------------------------------------------------------------- +// - GetKeyData() [Internal] +// - GetKeyIndex() [Internal] +// - GetKeyName() +// - GetKeyChordName() [Internal] +// - CalcTypematicRepeatAmount() [Internal] +// - GetTypematicRepeatRate() [Internal] +// - GetKeyPressedAmount() [Internal] +// - GetKeyMagnitude2d() [Internal] +//----------------------------------------------------------------------------- +// - UpdateKeyRoutingTable() [Internal] +// - GetRoutingIdFromOwnerId() [Internal] +// - GetShortcutRoutingData() [Internal] +// - CalcRoutingScore() [Internal] +// - SetShortcutRouting() [Internal] +// - TestShortcutRouting() [Internal] +//----------------------------------------------------------------------------- +// - IsKeyDown() +// - IsKeyPressed() +// - IsKeyReleased() +//----------------------------------------------------------------------------- +// - IsMouseDown() +// - IsMouseClicked() +// - IsMouseReleased() +// - IsMouseDoubleClicked() +// - GetMouseClickedCount() +// - IsMouseHoveringRect() [Internal] +// - IsMouseDragPastThreshold() [Internal] +// - IsMouseDragging() +// - GetMousePos() +// - GetMousePosOnOpeningCurrentPopup() +// - IsMousePosValid() +// - IsAnyMouseDown() +// - GetMouseDragDelta() +// - ResetMouseDragDelta() +// - GetMouseCursor() +// - SetMouseCursor() +//----------------------------------------------------------------------------- +// - UpdateAliasKey() +// - GetMergedModsFromKeys() +// - UpdateKeyboardInputs() +// - UpdateMouseInputs() +//----------------------------------------------------------------------------- +// - LockWheelingWindow [Internal] +// - FindBestWheelingWindow [Internal] +// - UpdateMouseWheel() [Internal] +//----------------------------------------------------------------------------- +// - SetNextFrameWantCaptureKeyboard() +// - SetNextFrameWantCaptureMouse() +//----------------------------------------------------------------------------- +// - GetInputSourceName() [Internal] +// - DebugPrintInputEvent() [Internal] +// - UpdateInputEvents() [Internal] +//----------------------------------------------------------------------------- +// - GetKeyOwner() [Internal] +// - TestKeyOwner() [Internal] +// - SetKeyOwner() [Internal] +// - SetItemKeyOwner() [Internal] +// - Shortcut() [Internal] +//----------------------------------------------------------------------------- + +ImGuiKeyData* ImGui::GetKeyData(ImGuiKey key) +{ + ImGuiContext& g = *GImGui; + + // Special storage location for mods + if (key & ImGuiMod_Mask_) + key = ConvertSingleModFlagToKey(key); + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT(key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_NamedKey_END); + if (IsLegacyKey(key) && g.IO.KeyMap[key] != -1) + key = (ImGuiKey)g.IO.KeyMap[key]; // Remap native->imgui or imgui->native +#else + IM_ASSERT(IsNamedKey(key) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend & user code."); +#endif + return &g.IO.KeysData[key - ImGuiKey_KeysData_OFFSET]; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO +ImGuiKey ImGui::GetKeyIndex(ImGuiKey key) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(IsNamedKey(key)); + const ImGuiKeyData* key_data = GetKeyData(key); + return (ImGuiKey)(key_data - g.IO.KeysData); +} +#endif + +// Those names a provided for debugging purpose and are not meant to be saved persistently not compared. +static const char* const GKeyNames[] = +{ + "Tab", "LeftArrow", "RightArrow", "UpArrow", "DownArrow", "PageUp", "PageDown", + "Home", "End", "Insert", "Delete", "Backspace", "Space", "Enter", "Escape", + "LeftCtrl", "LeftShift", "LeftAlt", "LeftSuper", "RightCtrl", "RightShift", "RightAlt", "RightSuper", "Menu", + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", + "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", + "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", + "Apostrophe", "Comma", "Minus", "Period", "Slash", "Semicolon", "Equal", "LeftBracket", + "Backslash", "RightBracket", "GraveAccent", "CapsLock", "ScrollLock", "NumLock", "PrintScreen", + "Pause", "Keypad0", "Keypad1", "Keypad2", "Keypad3", "Keypad4", "Keypad5", "Keypad6", + "Keypad7", "Keypad8", "Keypad9", "KeypadDecimal", "KeypadDivide", "KeypadMultiply", + "KeypadSubtract", "KeypadAdd", "KeypadEnter", "KeypadEqual", + "GamepadStart", "GamepadBack", + "GamepadFaceLeft", "GamepadFaceRight", "GamepadFaceUp", "GamepadFaceDown", + "GamepadDpadLeft", "GamepadDpadRight", "GamepadDpadUp", "GamepadDpadDown", + "GamepadL1", "GamepadR1", "GamepadL2", "GamepadR2", "GamepadL3", "GamepadR3", + "GamepadLStickLeft", "GamepadLStickRight", "GamepadLStickUp", "GamepadLStickDown", + "GamepadRStickLeft", "GamepadRStickRight", "GamepadRStickUp", "GamepadRStickDown", + "MouseLeft", "MouseRight", "MouseMiddle", "MouseX1", "MouseX2", "MouseWheelX", "MouseWheelY", + "ModCtrl", "ModShift", "ModAlt", "ModSuper", // ReservedForModXXX are showing the ModXXX names. +}; +IM_STATIC_ASSERT(ImGuiKey_NamedKey_COUNT == IM_ARRAYSIZE(GKeyNames)); + +const char* ImGui::GetKeyName(ImGuiKey key) +{ +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + IM_ASSERT((IsNamedKey(key) || key == ImGuiKey_None) && "Support for user key indices was dropped in favor of ImGuiKey. Please update backend and user code."); +#else + if (IsLegacyKey(key)) + { + ImGuiIO& io = GetIO(); + if (io.KeyMap[key] == -1) + return "N/A"; + IM_ASSERT(IsNamedKey((ImGuiKey)io.KeyMap[key])); + key = (ImGuiKey)io.KeyMap[key]; + } +#endif + if (key == ImGuiKey_None) + return "None"; + if (key & ImGuiMod_Mask_) + key = ConvertSingleModFlagToKey(key); + if (!IsNamedKey(key)) + return "Unknown"; + + return GKeyNames[key - ImGuiKey_NamedKey_BEGIN]; +} + +// ImGuiMod_Shortcut is translated to either Ctrl or Super. +void ImGui::GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size) +{ + ImGuiContext& g = *GImGui; + if (key_chord & ImGuiMod_Shortcut) + key_chord = ConvertShortcutMod(key_chord); + ImFormatString(out_buf, (size_t)out_buf_size, "%s%s%s%s%s", + (key_chord & ImGuiMod_Ctrl) ? "Ctrl+" : "", + (key_chord & ImGuiMod_Shift) ? "Shift+" : "", + (key_chord & ImGuiMod_Alt) ? "Alt+" : "", + (key_chord & ImGuiMod_Super) ? (g.IO.ConfigMacOSXBehaviors ? "Cmd+" : "Super+") : "", + GetKeyName((ImGuiKey)(key_chord & ~ImGuiMod_Mask_))); +} + +// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime) +// t1 = current time (e.g.: g.Time) +// An event is triggered at: +// t = 0.0f t = repeat_delay, t = repeat_delay + repeat_rate*N +int ImGui::CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate) +{ + if (t1 == 0.0f) + return 1; + if (t0 >= t1) + return 0; + if (repeat_rate <= 0.0f) + return (t0 < repeat_delay) && (t1 >= repeat_delay); + const int count_t0 = (t0 < repeat_delay) ? -1 : (int)((t0 - repeat_delay) / repeat_rate); + const int count_t1 = (t1 < repeat_delay) ? -1 : (int)((t1 - repeat_delay) / repeat_rate); + const int count = count_t1 - count_t0; + return count; +} + +void ImGui::GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate) +{ + ImGuiContext& g = *GImGui; + switch (flags & ImGuiInputFlags_RepeatRateMask_) + { + case ImGuiInputFlags_RepeatRateNavMove: *repeat_delay = g.IO.KeyRepeatDelay * 0.72f; *repeat_rate = g.IO.KeyRepeatRate * 0.80f; return; + case ImGuiInputFlags_RepeatRateNavTweak: *repeat_delay = g.IO.KeyRepeatDelay * 0.72f; *repeat_rate = g.IO.KeyRepeatRate * 0.30f; return; + case ImGuiInputFlags_RepeatRateDefault: default: *repeat_delay = g.IO.KeyRepeatDelay * 1.00f; *repeat_rate = g.IO.KeyRepeatRate * 1.00f; return; + } +} + +// Return value representing the number of presses in the last time period, for the given repeat rate +// (most often returns 0 or 1. The result is generally only >1 when RepeatRate is smaller than DeltaTime, aka large DeltaTime or fast RepeatRate) +int ImGui::GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float repeat_rate) +{ + ImGuiContext& g = *GImGui; + const ImGuiKeyData* key_data = GetKeyData(key); + if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) + return 0; + const float t = key_data->DownDuration; + return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, repeat_delay, repeat_rate); +} + +// Return 2D vector representing the combination of four cardinal direction, with analog value support (for e.g. ImGuiKey_GamepadLStick* values). +ImVec2 ImGui::GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down) +{ + return ImVec2( + GetKeyData(key_right)->AnalogValue - GetKeyData(key_left)->AnalogValue, + GetKeyData(key_down)->AnalogValue - GetKeyData(key_up)->AnalogValue); +} + +// Rewrite routing data buffers to strip old entries + sort by key to make queries not touch scattered data. +// Entries D,A,B,B,A,C,B --> A,A,B,B,B,C,D +// Index A:1 B:2 C:5 D:0 --> A:0 B:2 C:5 D:6 +// See 'Metrics->Key Owners & Shortcut Routing' to visualize the result of that operation. +static void ImGui::UpdateKeyRoutingTable(ImGuiKeyRoutingTable* rt) +{ + ImGuiContext& g = *GImGui; + rt->EntriesNext.resize(0); + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + { + const int new_routing_start_idx = rt->EntriesNext.Size; + ImGuiKeyRoutingData* routing_entry; + for (int old_routing_idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; old_routing_idx != -1; old_routing_idx = routing_entry->NextEntryIndex) + { + routing_entry = &rt->Entries[old_routing_idx]; + routing_entry->RoutingCurr = routing_entry->RoutingNext; // Update entry + routing_entry->RoutingNext = ImGuiKeyOwner_None; + routing_entry->RoutingNextScore = 255; + if (routing_entry->RoutingCurr == ImGuiKeyOwner_None) + continue; + rt->EntriesNext.push_back(*routing_entry); // Write alive ones into new buffer + + // Apply routing to owner if there's no owner already (RoutingCurr == None at this point) + if (routing_entry->Mods == g.IO.KeyMods) + { + ImGuiKeyOwnerData* owner_data = ImGui::GetKeyOwnerData(key); + if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + owner_data->OwnerCurr = routing_entry->RoutingCurr; + } + } + + // Rewrite linked-list + rt->Index[key - ImGuiKey_NamedKey_BEGIN] = (ImGuiKeyRoutingIndex)(new_routing_start_idx < rt->EntriesNext.Size ? new_routing_start_idx : -1); + for (int n = new_routing_start_idx; n < rt->EntriesNext.Size; n++) + rt->EntriesNext[n].NextEntryIndex = (ImGuiKeyRoutingIndex)((n + 1 < rt->EntriesNext.Size) ? n + 1 : -1); + } + rt->Entries.swap(rt->EntriesNext); // Swap new and old indexes +} + +// owner_id may be None/Any, but routing_id needs to be always be set, so we default to GetCurrentFocusScope(). +static inline ImGuiID GetRoutingIdFromOwnerId(ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + return (owner_id != ImGuiKeyOwner_None && owner_id != ImGuiKeyOwner_Any) ? owner_id : g.CurrentFocusScopeId; +} + +ImGuiKeyRoutingData* ImGui::GetShortcutRoutingData(ImGuiKeyChord key_chord) +{ + // Majority of shortcuts will be Key + any number of Mods + // We accept _Single_ mod with ImGuiKey_None. + // - Shortcut(ImGuiKey_S | ImGuiMod_Ctrl); // Legal + // - Shortcut(ImGuiKey_S | ImGuiMod_Ctrl | ImGuiMod_Shift); // Legal + // - Shortcut(ImGuiMod_Ctrl); // Legal + // - Shortcut(ImGuiMod_Ctrl | ImGuiMod_Shift); // Not legal + ImGuiContext& g = *GImGui; + ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; + ImGuiKeyRoutingData* routing_data; + if (key_chord & ImGuiMod_Shortcut) + key_chord = ConvertShortcutMod(key_chord); + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); + if (key == ImGuiKey_None) + key = ConvertSingleModFlagToKey(mods); + IM_ASSERT(IsNamedKey(key)); + + // Get (in the majority of case, the linked list will have one element so this should be 2 reads. + // Subsequent elements will be contiguous in memory as list is sorted/rebuilt in NewFrame). + for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; idx = routing_data->NextEntryIndex) + { + routing_data = &rt->Entries[idx]; + if (routing_data->Mods == mods) + return routing_data; + } + + // Add to linked-list + ImGuiKeyRoutingIndex routing_data_idx = (ImGuiKeyRoutingIndex)rt->Entries.Size; + rt->Entries.push_back(ImGuiKeyRoutingData()); + routing_data = &rt->Entries[routing_data_idx]; + routing_data->Mods = (ImU16)mods; + routing_data->NextEntryIndex = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; // Setup linked list + rt->Index[key - ImGuiKey_NamedKey_BEGIN] = routing_data_idx; + return routing_data; +} + +// Current score encoding (lower is highest priority): +// - 0: ImGuiInputFlags_RouteGlobalHigh +// - 1: ImGuiInputFlags_RouteFocused (if item active) +// - 2: ImGuiInputFlags_RouteGlobal +// - 3+: ImGuiInputFlags_RouteFocused (if window in focus-stack) +// - 254: ImGuiInputFlags_RouteGlobalLow +// - 255: never route +// 'flags' should include an explicit routing policy +static int CalcRoutingScore(ImGuiWindow* location, ImGuiID owner_id, ImGuiInputFlags flags) +{ + if (flags & ImGuiInputFlags_RouteFocused) + { + ImGuiContext& g = *GImGui; + ImGuiWindow* focused = g.NavWindow; + + // ActiveID gets top priority + // (we don't check g.ActiveIdUsingAllKeys here. Routing is applied but if input ownership is tested later it may discard it) + if (owner_id != 0 && g.ActiveId == owner_id) + return 1; + + // Score based on distance to focused window (lower is better) + // Assuming both windows are submitting a routing request, + // - When Window....... is focused -> Window scores 3 (best), Window/ChildB scores 255 (no match) + // - When Window/ChildB is focused -> Window scores 4, Window/ChildB scores 3 (best) + // Assuming only WindowA is submitting a routing request, + // - When Window/ChildB is focused -> Window scores 4 (best), Window/ChildB doesn't have a score. + if (focused != NULL && focused->RootWindow == location->RootWindow) + for (int next_score = 3; focused != NULL; next_score++) + { + if (focused == location) + { + IM_ASSERT(next_score < 255); + return next_score; + } + focused = (focused->RootWindow != focused) ? focused->ParentWindow : NULL; // FIXME: This could be later abstracted as a focus path + } + return 255; + } + + // ImGuiInputFlags_RouteGlobalHigh is default, so calls without flags are not conditional + if (flags & ImGuiInputFlags_RouteGlobal) + return 2; + if (flags & ImGuiInputFlags_RouteGlobalLow) + return 254; + return 0; +} + +// Request a desired route for an input chord (key + mods). +// Return true if the route is available this frame. +// - Routes and key ownership are attributed at the beginning of next frame based on best score and mod state. +// (Conceptually this does a "Submit for next frame" + "Test for current frame". +// As such, it could be called TrySetXXX or SubmitXXX, or the Submit and Test operations should be separate.) +// - Using 'owner_id == ImGuiKeyOwner_Any/0': auto-assign an owner based on current focus scope (each window has its focus scope by default) +// - Using 'owner_id == ImGuiKeyOwner_None': allows disabling/locking a shortcut. +bool ImGui::SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + if ((flags & ImGuiInputFlags_RouteMask_) == 0) + flags |= ImGuiInputFlags_RouteGlobalHigh; // IMPORTANT: This is the default for SetShortcutRouting() but NOT Shortcut() + else + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiInputFlags_RouteMask_)); // Check that only 1 routing flag is used + + if (flags & ImGuiInputFlags_RouteUnlessBgFocused) + if (g.NavWindow == NULL) + return false; + if (flags & ImGuiInputFlags_RouteAlways) + return true; + + const int score = CalcRoutingScore(g.CurrentWindow, owner_id, flags); + if (score == 255) + return false; + + // Submit routing for NEXT frame (assuming score is sufficient) + // FIXME: Could expose a way to use a "serve last" policy for same score resolution (using <= instead of <). + ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); + const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); + //const bool set_route = (flags & ImGuiInputFlags_ServeLast) ? (score <= routing_data->RoutingNextScore) : (score < routing_data->RoutingNextScore); + if (score < routing_data->RoutingNextScore) + { + routing_data->RoutingNext = routing_id; + routing_data->RoutingNextScore = (ImU8)score; + } + + // Return routing state for CURRENT frame + return routing_data->RoutingCurr == routing_id; +} + +// Currently unused by core (but used by tests) +// Note: this cannot be turned into GetShortcutRouting() because we do the owner_id->routing_id translation, name would be more misleading. +bool ImGui::TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id) +{ + const ImGuiID routing_id = GetRoutingIdFromOwnerId(owner_id); + ImGuiKeyRoutingData* routing_data = GetShortcutRoutingData(key_chord); // FIXME: Could avoid creating entry. + return routing_data->RoutingCurr == routing_id; +} + +// Note that Dear ImGui doesn't know the meaning/semantic of ImGuiKey from 0..511: they are legacy native keycodes. +// Consider transitioning from 'IsKeyDown(MY_ENGINE_KEY_A)' (<1.87) to IsKeyDown(ImGuiKey_A) (>= 1.87) +bool ImGui::IsKeyDown(ImGuiKey key) +{ + return IsKeyDown(key, ImGuiKeyOwner_Any); +} + +bool ImGui::IsKeyDown(ImGuiKey key, ImGuiID owner_id) +{ + const ImGuiKeyData* key_data = GetKeyData(key); + if (!key_data->Down) + return false; + if (!TestKeyOwner(key, owner_id)) + return false; + return true; +} + +bool ImGui::IsKeyPressed(ImGuiKey key, bool repeat) +{ + return IsKeyPressed(key, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); +} + +// Important: unless legacy IsKeyPressed(ImGuiKey, bool repeat=true) which DEFAULT to repeat, this requires EXPLICIT repeat. +bool ImGui::IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) +{ + const ImGuiKeyData* key_data = GetKeyData(key); + if (!key_data->Down) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) + return false; + const float t = key_data->DownDuration; + if (t < 0.0f) + return false; + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + + bool pressed = (t == 0.0f); + if (!pressed && ((flags & ImGuiInputFlags_Repeat) != 0)) + { + float repeat_delay, repeat_rate; + GetTypematicRepeatRate(flags, &repeat_delay, &repeat_rate); + pressed = (t > repeat_delay) && GetKeyPressedAmount(key, repeat_delay, repeat_rate) > 0; + } + if (!pressed) + return false; + if (!TestKeyOwner(key, owner_id)) + return false; + return true; +} + +bool ImGui::IsKeyReleased(ImGuiKey key) +{ + return IsKeyReleased(key, ImGuiKeyOwner_Any); +} + +bool ImGui::IsKeyReleased(ImGuiKey key, ImGuiID owner_id) +{ + const ImGuiKeyData* key_data = GetKeyData(key); + if (key_data->DownDurationPrev < 0.0f || key_data->Down) + return false; + if (!TestKeyOwner(key, owner_id)) + return false; + return true; +} + +bool ImGui::IsMouseDown(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseDown[button] && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any); // should be same as IsKeyDown(MouseButtonToKey(button), ImGuiKeyOwner_Any), but this allows legacy code hijacking the io.Mousedown[] array. +} + +bool ImGui::IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseDown[button] && TestKeyOwner(MouseButtonToKey(button), owner_id); // Should be same as IsKeyDown(MouseButtonToKey(button), owner_id), but this allows legacy code hijacking the io.Mousedown[] array. +} + +bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat) +{ + return IsMouseClicked(button, ImGuiKeyOwner_Any, repeat ? ImGuiInputFlags_Repeat : ImGuiInputFlags_None); +} + +bool ImGui::IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (!g.IO.MouseDown[button]) // In theory this should already be encoded as (DownDuration < 0.0f), but testing this facilitates eating mechanism (until we finish work on key ownership) + return false; + const float t = g.IO.MouseDownDuration[button]; + if (t < 0.0f) + return false; + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByIsKeyPressed) == 0); // Passing flags not supported by this function! + + const bool repeat = (flags & ImGuiInputFlags_Repeat) != 0; + const bool pressed = (t == 0.0f) || (repeat && t > g.IO.KeyRepeatDelay && CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0); + if (!pressed) + return false; + + if (!TestKeyOwner(MouseButtonToKey(button), owner_id)) + return false; + + return true; +} + +bool ImGui::IsMouseReleased(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseReleased[button] && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any); // Should be same as IsKeyReleased(MouseButtonToKey(button), ImGuiKeyOwner_Any) +} + +bool ImGui::IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseReleased[button] && TestKeyOwner(MouseButtonToKey(button), owner_id); // Should be same as IsKeyReleased(MouseButtonToKey(button), owner_id) +} + +bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button] == 2 && TestKeyOwner(MouseButtonToKey(button), ImGuiKeyOwner_Any); +} + +int ImGui::GetMouseClickedCount(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + return g.IO.MouseClickedCount[button]; +} + +// Test if mouse cursor is hovering given rectangle +// NB- Rectangle is clipped by our current clip setting +// NB- Expand the rectangle to be generous on imprecise inputs systems (g.Style.TouchExtraPadding) +bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip) +{ + ImGuiContext& g = *GImGui; + + // Clip + ImRect rect_clipped(r_min, r_max); + if (clip) + rect_clipped.ClipWith(g.CurrentWindow->ClipRect); + + // Expand for touch input + const ImRect rect_for_touch(rect_clipped.Min - g.Style.TouchExtraPadding, rect_clipped.Max + g.Style.TouchExtraPadding); + if (!rect_for_touch.Contains(g.IO.MousePos)) + return false; + return true; +} + +// Return if a mouse click/drag went past the given threshold. Valid to call during the MouseReleased frame. +// [Internal] This doesn't test if the button is pressed +bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (lock_threshold < 0.0f) + lock_threshold = g.IO.MouseDragThreshold; + return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold; +} + +bool ImGui::IsMouseDragging(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (!g.IO.MouseDown[button]) + return false; + return IsMouseDragPastThreshold(button, lock_threshold); +} + +ImVec2 ImGui::GetMousePos() +{ + ImGuiContext& g = *GImGui; + return g.IO.MousePos; +} + +// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed! +ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup() +{ + ImGuiContext& g = *GImGui; + if (g.BeginPopupStack.Size > 0) + return g.OpenPopupStack[g.BeginPopupStack.Size - 1].OpenMousePos; + return g.IO.MousePos; +} + +// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position. +bool ImGui::IsMousePosValid(const ImVec2* mouse_pos) +{ + // The assert is only to silence a false-positive in XCode Static Analysis. + // Because GImGui is not dereferenced in every code path, the static analyzer assume that it may be NULL (which it doesn't for other functions). + IM_ASSERT(GImGui != NULL); + const float MOUSE_INVALID = -256000.0f; + ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos; + return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID; +} + +// [WILL OBSOLETE] This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. +bool ImGui::IsAnyMouseDown() +{ + ImGuiContext& g = *GImGui; + for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++) + if (g.IO.MouseDown[n]) + return true; + return false; +} + +// Return the delta from the initial clicking position while the mouse button is clicked or was just released. +// This is locked and return 0.0f until the mouse moves past a distance threshold at least once. +// NB: This is only valid if IsMousePosValid(). backends in theory should always keep mouse position valid when dragging even outside the client window. +ImVec2 ImGui::GetMouseDragDelta(ImGuiMouseButton button, float lock_threshold) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + if (lock_threshold < 0.0f) + lock_threshold = g.IO.MouseDragThreshold; + if (g.IO.MouseDown[button] || g.IO.MouseReleased[button]) + if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold) + if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MouseClickedPos[button])) + return g.IO.MousePos - g.IO.MouseClickedPos[button]; + return ImVec2(0.0f, 0.0f); +} + +void ImGui::ResetMouseDragDelta(ImGuiMouseButton button) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown)); + // NB: We don't need to reset g.IO.MouseDragMaxDistanceSqr + g.IO.MouseClickedPos[button] = g.IO.MousePos; +} + +// Get desired mouse cursor shape. +// Important: this is meant to be used by a platform backend, it is reset in ImGui::NewFrame(), +// updated during the frame, and locked in EndFrame()/Render(). +// If you use software rendering by setting io.MouseDrawCursor then Dear ImGui will render those for you +ImGuiMouseCursor ImGui::GetMouseCursor() +{ + ImGuiContext& g = *GImGui; + return g.MouseCursor; +} + +void ImGui::SetMouseCursor(ImGuiMouseCursor cursor_type) +{ + ImGuiContext& g = *GImGui; + g.MouseCursor = cursor_type; +} + +static void UpdateAliasKey(ImGuiKey key, bool v, float analog_value) +{ + IM_ASSERT(ImGui::IsAliasKey(key)); + ImGuiKeyData* key_data = ImGui::GetKeyData(key); + key_data->Down = v; + key_data->AnalogValue = analog_value; +} + +// [Internal] Do not use directly +static ImGuiKeyChord GetMergedModsFromKeys() +{ + ImGuiKeyChord mods = 0; + if (ImGui::IsKeyDown(ImGuiMod_Ctrl)) { mods |= ImGuiMod_Ctrl; } + if (ImGui::IsKeyDown(ImGuiMod_Shift)) { mods |= ImGuiMod_Shift; } + if (ImGui::IsKeyDown(ImGuiMod_Alt)) { mods |= ImGuiMod_Alt; } + if (ImGui::IsKeyDown(ImGuiMod_Super)) { mods |= ImGuiMod_Super; } + return mods; +} + +static void ImGui::UpdateKeyboardInputs() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Import legacy keys or verify they are not used +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + if (io.BackendUsingLegacyKeyArrays == 0) + { + // Backend used new io.AddKeyEvent() API: Good! Verify that old arrays are never written to externally. + for (int n = 0; n < ImGuiKey_LegacyNativeKey_END; n++) + IM_ASSERT((io.KeysDown[n] == false || IsKeyDown((ImGuiKey)n)) && "Backend needs to either only use io.AddKeyEvent(), either only fill legacy io.KeysDown[] + io.KeyMap[]. Not both!"); + } + else + { + if (g.FrameCount == 0) + for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) + IM_ASSERT(g.IO.KeyMap[n] == -1 && "Backend is not allowed to write to io.KeyMap[0..511]!"); + + // Build reverse KeyMap (Named -> Legacy) + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_NamedKey_END; n++) + if (io.KeyMap[n] != -1) + { + IM_ASSERT(IsLegacyKey((ImGuiKey)io.KeyMap[n])); + io.KeyMap[io.KeyMap[n]] = n; + } + + // Import legacy keys into new ones + for (int n = ImGuiKey_LegacyNativeKey_BEGIN; n < ImGuiKey_LegacyNativeKey_END; n++) + if (io.KeysDown[n] || io.BackendUsingLegacyKeyArrays == 1) + { + const ImGuiKey key = (ImGuiKey)(io.KeyMap[n] != -1 ? io.KeyMap[n] : n); + IM_ASSERT(io.KeyMap[n] == -1 || IsNamedKey(key)); + io.KeysData[key].Down = io.KeysDown[n]; + if (key != n) + io.KeysDown[key] = io.KeysDown[n]; // Allow legacy code using io.KeysDown[GetKeyIndex()] with old backends + io.BackendUsingLegacyKeyArrays = 1; + } + if (io.BackendUsingLegacyKeyArrays == 1) + { + GetKeyData(ImGuiMod_Ctrl)->Down = io.KeyCtrl; + GetKeyData(ImGuiMod_Shift)->Down = io.KeyShift; + GetKeyData(ImGuiMod_Alt)->Down = io.KeyAlt; + GetKeyData(ImGuiMod_Super)->Down = io.KeySuper; + } + } + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + if (io.BackendUsingLegacyNavInputArray && nav_gamepad_active) + { + #define MAP_LEGACY_NAV_INPUT_TO_KEY1(_KEY, _NAV1) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f); io.KeysData[_KEY].AnalogValue = io.NavInputs[_NAV1]; } while (0) + #define MAP_LEGACY_NAV_INPUT_TO_KEY2(_KEY, _NAV1, _NAV2) do { io.KeysData[_KEY].Down = (io.NavInputs[_NAV1] > 0.0f) || (io.NavInputs[_NAV2] > 0.0f); io.KeysData[_KEY].AnalogValue = ImMax(io.NavInputs[_NAV1], io.NavInputs[_NAV2]); } while (0) + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceDown, ImGuiNavInput_Activate); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceRight, ImGuiNavInput_Cancel); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceLeft, ImGuiNavInput_Menu); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadFaceUp, ImGuiNavInput_Input); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadLeft, ImGuiNavInput_DpadLeft); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadRight, ImGuiNavInput_DpadRight); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadUp, ImGuiNavInput_DpadUp); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadDpadDown, ImGuiNavInput_DpadDown); + MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadL1, ImGuiNavInput_FocusPrev, ImGuiNavInput_TweakSlow); + MAP_LEGACY_NAV_INPUT_TO_KEY2(ImGuiKey_GamepadR1, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakFast); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickLeft, ImGuiNavInput_LStickLeft); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickRight, ImGuiNavInput_LStickRight); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickUp, ImGuiNavInput_LStickUp); + MAP_LEGACY_NAV_INPUT_TO_KEY1(ImGuiKey_GamepadLStickDown, ImGuiNavInput_LStickDown); + #undef NAV_MAP_KEY + } +#endif +#endif + + // Update aliases + for (int n = 0; n < ImGuiMouseButton_COUNT; n++) + UpdateAliasKey(MouseButtonToKey(n), io.MouseDown[n], io.MouseDown[n] ? 1.0f : 0.0f); + UpdateAliasKey(ImGuiKey_MouseWheelX, io.MouseWheelH != 0.0f, io.MouseWheelH); + UpdateAliasKey(ImGuiKey_MouseWheelY, io.MouseWheel != 0.0f, io.MouseWheel); + + // Synchronize io.KeyMods and io.KeyXXX values. + // - New backends (1.87+): send io.AddKeyEvent(ImGuiMod_XXX) -> -> (here) deriving io.KeyMods + io.KeyXXX from key array. + // - Legacy backends: set io.KeyXXX bools -> (above) set key array from io.KeyXXX -> (here) deriving io.KeyMods + io.KeyXXX from key array. + // So with legacy backends the 4 values will do a unnecessary back-and-forth but it makes the code simpler and future facing. + io.KeyMods = GetMergedModsFromKeys(); + io.KeyCtrl = (io.KeyMods & ImGuiMod_Ctrl) != 0; + io.KeyShift = (io.KeyMods & ImGuiMod_Shift) != 0; + io.KeyAlt = (io.KeyMods & ImGuiMod_Alt) != 0; + io.KeySuper = (io.KeyMods & ImGuiMod_Super) != 0; + + // Clear gamepad data if disabled + if ((io.BackendFlags & ImGuiBackendFlags_HasGamepad) == 0) + for (int i = ImGuiKey_Gamepad_BEGIN; i < ImGuiKey_Gamepad_END; i++) + { + io.KeysData[i - ImGuiKey_KeysData_OFFSET].Down = false; + io.KeysData[i - ImGuiKey_KeysData_OFFSET].AnalogValue = 0.0f; + } + + // Update keys + for (int i = 0; i < ImGuiKey_KeysData_SIZE; i++) + { + ImGuiKeyData* key_data = &io.KeysData[i]; + key_data->DownDurationPrev = key_data->DownDuration; + key_data->DownDuration = key_data->Down ? (key_data->DownDuration < 0.0f ? 0.0f : key_data->DownDuration + io.DeltaTime) : -1.0f; + } + + // Update keys/input owner (named keys only): one entry per key + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + { + ImGuiKeyData* key_data = &io.KeysData[key - ImGuiKey_KeysData_OFFSET]; + ImGuiKeyOwnerData* owner_data = &g.KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; + owner_data->OwnerCurr = owner_data->OwnerNext; + if (!key_data->Down) // Important: ownership is released on the frame after a release. Ensure a 'MouseDown -> CloseWindow -> MouseUp' chain doesn't lead to someone else seeing the MouseUp. + owner_data->OwnerNext = ImGuiKeyOwner_None; + owner_data->LockThisFrame = owner_data->LockUntilRelease = owner_data->LockUntilRelease && key_data->Down; // Clear LockUntilRelease when key is not Down anymore + } + + UpdateKeyRoutingTable(&g.KeysRoutingTable); +} + +static void ImGui::UpdateMouseInputs() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well) + if (IsMousePosValid(&io.MousePos)) + io.MousePos = g.MouseLastValidPos = ImFloorSigned(io.MousePos); + + // If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta + if (IsMousePosValid(&io.MousePos) && IsMousePosValid(&io.MousePosPrev)) + io.MouseDelta = io.MousePos - io.MousePosPrev; + else + io.MouseDelta = ImVec2(0.0f, 0.0f); + + // If mouse moved we re-enable mouse hovering in case it was disabled by gamepad/keyboard. In theory should use a >0.0f threshold but would need to reset in everywhere we set this to true. + if (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f) + g.NavDisableMouseHover = false; + + io.MousePosPrev = io.MousePos; + for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) + { + io.MouseClicked[i] = io.MouseDown[i] && io.MouseDownDuration[i] < 0.0f; + io.MouseClickedCount[i] = 0; // Will be filled below + io.MouseReleased[i] = !io.MouseDown[i] && io.MouseDownDuration[i] >= 0.0f; + io.MouseDownDurationPrev[i] = io.MouseDownDuration[i]; + io.MouseDownDuration[i] = io.MouseDown[i] ? (io.MouseDownDuration[i] < 0.0f ? 0.0f : io.MouseDownDuration[i] + io.DeltaTime) : -1.0f; + if (io.MouseClicked[i]) + { + bool is_repeated_click = false; + if ((float)(g.Time - io.MouseClickedTime[i]) < io.MouseDoubleClickTime) + { + ImVec2 delta_from_click_pos = IsMousePosValid(&io.MousePos) ? (io.MousePos - io.MouseClickedPos[i]) : ImVec2(0.0f, 0.0f); + if (ImLengthSqr(delta_from_click_pos) < io.MouseDoubleClickMaxDist * io.MouseDoubleClickMaxDist) + is_repeated_click = true; + } + if (is_repeated_click) + io.MouseClickedLastCount[i]++; + else + io.MouseClickedLastCount[i] = 1; + io.MouseClickedTime[i] = g.Time; + io.MouseClickedPos[i] = io.MousePos; + io.MouseClickedCount[i] = io.MouseClickedLastCount[i]; + io.MouseDragMaxDistanceSqr[i] = 0.0f; + } + else if (io.MouseDown[i]) + { + // Maintain the maximum distance we reaching from the initial click position, which is used with dragging threshold + float delta_sqr_click_pos = IsMousePosValid(&io.MousePos) ? ImLengthSqr(io.MousePos - io.MouseClickedPos[i]) : 0.0f; + io.MouseDragMaxDistanceSqr[i] = ImMax(io.MouseDragMaxDistanceSqr[i], delta_sqr_click_pos); + } + + // We provide io.MouseDoubleClicked[] as a legacy service + io.MouseDoubleClicked[i] = (io.MouseClickedCount[i] == 2); + + // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation + if (io.MouseClicked[i]) + g.NavDisableMouseHover = false; + } +} + +static void LockWheelingWindow(ImGuiWindow* window, float wheel_amount) +{ + ImGuiContext& g = *GImGui; + if (window) + g.WheelingWindowReleaseTimer = ImMin(g.WheelingWindowReleaseTimer + ImAbs(wheel_amount) * WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER, WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER); + else + g.WheelingWindowReleaseTimer = 0.0f; + if (g.WheelingWindow == window) + return; + IMGUI_DEBUG_LOG_IO("LockWheelingWindow() \"%s\"\n", window ? window->Name : "NULL"); + g.WheelingWindow = window; + g.WheelingWindowRefMousePos = g.IO.MousePos; + if (window == NULL) + { + g.WheelingWindowStartFrame = -1; + g.WheelingAxisAvg = ImVec2(0.0f, 0.0f); + } +} + +static ImGuiWindow* FindBestWheelingWindow(const ImVec2& wheel) +{ + // For each axis, find window in the hierarchy that may want to use scrolling + ImGuiContext& g = *GImGui; + ImGuiWindow* windows[2] = { NULL, NULL }; + for (int axis = 0; axis < 2; axis++) + if (wheel[axis] != 0.0f) + for (ImGuiWindow* window = windows[axis] = g.HoveredWindow; window->Flags & ImGuiWindowFlags_ChildWindow; window = windows[axis] = window->ParentWindow) + { + // Bubble up into parent window if: + // - a child window doesn't allow any scrolling. + // - a child window has the ImGuiWindowFlags_NoScrollWithMouse flag. + //// - a child window doesn't need scrolling because it is already at the edge for the direction we are going in (FIXME-WIP) + const bool has_scrolling = (window->ScrollMax[axis] != 0.0f); + const bool inputs_disabled = (window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs); + //const bool scrolling_past_limits = (wheel_v < 0.0f) ? (window->Scroll[axis] <= 0.0f) : (window->Scroll[axis] >= window->ScrollMax[axis]); + if (has_scrolling && !inputs_disabled) // && !scrolling_past_limits) + break; // select this window + } + if (windows[0] == NULL && windows[1] == NULL) + return NULL; + + // If there's only one window or only one axis then there's no ambiguity + if (windows[0] == windows[1] || windows[0] == NULL || windows[1] == NULL) + return windows[1] ? windows[1] : windows[0]; + + // If candidate are different windows we need to decide which one to prioritize + // - First frame: only find a winner if one axis is zero. + // - Subsequent frames: only find a winner when one is more than the other. + if (g.WheelingWindowStartFrame == -1) + g.WheelingWindowStartFrame = g.FrameCount; + if ((g.WheelingWindowStartFrame == g.FrameCount && wheel.x != 0.0f && wheel.y != 0.0f) || (g.WheelingAxisAvg.x == g.WheelingAxisAvg.y)) + { + g.WheelingWindowWheelRemainder = wheel; + return NULL; + } + return (g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? windows[0] : windows[1]; +} + +// Called by NewFrame() +void ImGui::UpdateMouseWheel() +{ + // Reset the locked window if we move the mouse or after the timer elapses. + // FIXME: Ideally we could refactor to have one timer for "changing window w/ same axis" and a shorter timer for "changing window or axis w/ other axis" (#3795) + ImGuiContext& g = *GImGui; + if (g.WheelingWindow != NULL) + { + g.WheelingWindowReleaseTimer -= g.IO.DeltaTime; + if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold) + g.WheelingWindowReleaseTimer = 0.0f; + if (g.WheelingWindowReleaseTimer <= 0.0f) + LockWheelingWindow(NULL, 0.0f); + } + + ImVec2 wheel; + wheel.x = TestKeyOwner(ImGuiKey_MouseWheelX, ImGuiKeyOwner_None) ? g.IO.MouseWheelH : 0.0f; + wheel.y = TestKeyOwner(ImGuiKey_MouseWheelY, ImGuiKeyOwner_None) ? g.IO.MouseWheel : 0.0f; + + //IMGUI_DEBUG_LOG("MouseWheel X:%.3f Y:%.3f\n", wheel_x, wheel_y); + ImGuiWindow* mouse_window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow; + if (!mouse_window || mouse_window->Collapsed) + return; + + // Zoom / Scale window + // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned. + if (wheel.y != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling) + { + LockWheelingWindow(mouse_window, wheel.y); + ImGuiWindow* window = mouse_window; + const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f); + const float scale = new_font_scale / window->FontWindowScale; + window->FontWindowScale = new_font_scale; + if (window == window->RootWindow) + { + const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size; + SetWindowPos(window, window->Pos + offset, 0); + window->Size = ImFloor(window->Size * scale); + window->SizeFull = ImFloor(window->SizeFull * scale); + } + return; + } + if (g.IO.KeyCtrl) + return; + + // Mouse wheel scrolling + // As a standard behavior holding SHIFT while using Vertical Mouse Wheel triggers Horizontal scroll instead + // - We avoid doing it on OSX as it the OS input layer handles this already. + // - However this means when running on OSX over Emcripten, Shift+WheelY will incur two swappings (1 in OS, 1 here), cancelling the feature. + const bool swap_axis = g.IO.KeyShift && !g.IO.ConfigMacOSXBehaviors; + if (swap_axis) + { + wheel.x = wheel.y; + wheel.y = 0.0f; + } + + // Maintain a rough average of moving magnitude on both axises + // FIXME: should by based on wall clock time rather than frame-counter + g.WheelingAxisAvg.x = ImExponentialMovingAverage(g.WheelingAxisAvg.x, ImAbs(wheel.x), 30); + g.WheelingAxisAvg.y = ImExponentialMovingAverage(g.WheelingAxisAvg.y, ImAbs(wheel.y), 30); + + // In the rare situation where FindBestWheelingWindow() had to defer first frame of wheeling due to ambiguous main axis, reinject it now. + wheel += g.WheelingWindowWheelRemainder; + g.WheelingWindowWheelRemainder = ImVec2(0.0f, 0.0f); + if (wheel.x == 0.0f && wheel.y == 0.0f) + return; + + // Mouse wheel scrolling: find target and apply + // - don't renew lock if axis doesn't apply on the window. + // - select a main axis when both axises are being moved. + if (ImGuiWindow* window = (g.WheelingWindow ? g.WheelingWindow : FindBestWheelingWindow(wheel))) + if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs)) + { + bool do_scroll[2] = { wheel.x != 0.0f && window->ScrollMax.x != 0.0f, wheel.y != 0.0f && window->ScrollMax.y != 0.0f }; + if (do_scroll[ImGuiAxis_X] && do_scroll[ImGuiAxis_Y]) + do_scroll[(g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? ImGuiAxis_Y : ImGuiAxis_X] = false; + if (do_scroll[ImGuiAxis_X]) + { + LockWheelingWindow(window, wheel.x); + float max_step = window->InnerRect.GetWidth() * 0.67f; + float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step)); + SetScrollX(window, window->Scroll.x - wheel.x * scroll_step); + } + if (do_scroll[ImGuiAxis_Y]) + { + LockWheelingWindow(window, wheel.y); + float max_step = window->InnerRect.GetHeight() * 0.67f; + float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step)); + SetScrollY(window, window->Scroll.y - wheel.y * scroll_step); + } + } +} + +void ImGui::SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard) +{ + ImGuiContext& g = *GImGui; + g.WantCaptureKeyboardNextFrame = want_capture_keyboard ? 1 : 0; +} + +void ImGui::SetNextFrameWantCaptureMouse(bool want_capture_mouse) +{ + ImGuiContext& g = *GImGui; + g.WantCaptureMouseNextFrame = want_capture_mouse ? 1 : 0; +} + +#ifndef IMGUI_DISABLE_DEBUG_TOOLS +static const char* GetInputSourceName(ImGuiInputSource source) +{ + const char* input_source_names[] = { "None", "Mouse", "Keyboard", "Gamepad", "Nav", "Clipboard" }; + IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT && source >= 0 && source < ImGuiInputSource_COUNT); + return input_source_names[source]; +} +static void DebugPrintInputEvent(const char* prefix, const ImGuiInputEvent* e) +{ + ImGuiContext& g = *GImGui; + if (e->Type == ImGuiInputEventType_MousePos) { if (e->MousePos.PosX == -FLT_MAX && e->MousePos.PosY == -FLT_MAX) IMGUI_DEBUG_LOG_IO("%s: MousePos (-FLT_MAX, -FLT_MAX)\n", prefix); else IMGUI_DEBUG_LOG_IO("%s: MousePos (%.1f, %.1f)\n", prefix, e->MousePos.PosX, e->MousePos.PosY); return; } + if (e->Type == ImGuiInputEventType_MouseButton) { IMGUI_DEBUG_LOG_IO("%s: MouseButton %d %s\n", prefix, e->MouseButton.Button, e->MouseButton.Down ? "Down" : "Up"); return; } + if (e->Type == ImGuiInputEventType_MouseWheel) { IMGUI_DEBUG_LOG_IO("%s: MouseWheel (%.3f, %.3f)\n", prefix, e->MouseWheel.WheelX, e->MouseWheel.WheelY); return; } + if (e->Type == ImGuiInputEventType_Key) { IMGUI_DEBUG_LOG_IO("%s: Key \"%s\" %s\n", prefix, ImGui::GetKeyName(e->Key.Key), e->Key.Down ? "Down" : "Up"); return; } + if (e->Type == ImGuiInputEventType_Text) { IMGUI_DEBUG_LOG_IO("%s: Text: %c (U+%08X)\n", prefix, e->Text.Char, e->Text.Char); return; } + if (e->Type == ImGuiInputEventType_Focus) { IMGUI_DEBUG_LOG_IO("%s: AppFocused %d\n", prefix, e->AppFocused.Focused); return; } +} +#endif + +// Process input queue +// We always call this with the value of 'bool g.IO.ConfigInputTrickleEventQueue'. +// - trickle_fast_inputs = false : process all events, turn into flattened input state (e.g. successive down/up/down/up will be lost) +// - trickle_fast_inputs = true : process as many events as possible (successive down/up/down/up will be trickled over several frames so nothing is lost) (new feature in 1.87) +void ImGui::UpdateInputEvents(bool trickle_fast_inputs) +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + // Only trickle chars<>key when working with InputText() + // FIXME: InputText() could parse event trail? + // FIXME: Could specialize chars<>keys trickling rules for control keys (those not typically associated to characters) + const bool trickle_interleaved_keys_and_text = (trickle_fast_inputs && g.WantTextInputNextFrame == 1); + + bool mouse_moved = false, mouse_wheeled = false, key_changed = false, text_inputted = false; + int mouse_button_changed = 0x00; + ImBitArray key_changed_mask; + + int event_n = 0; + for (; event_n < g.InputEventsQueue.Size; event_n++) + { + ImGuiInputEvent* e = &g.InputEventsQueue[event_n]; + if (e->Type == ImGuiInputEventType_MousePos) + { + // Trickling Rule: Stop processing queued events if we already handled a mouse button change + ImVec2 event_pos(e->MousePos.PosX, e->MousePos.PosY); + if (trickle_fast_inputs && (mouse_button_changed != 0 || mouse_wheeled || key_changed || text_inputted)) + break; + io.MousePos = event_pos; + mouse_moved = true; + } + else if (e->Type == ImGuiInputEventType_MouseButton) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the same button + const ImGuiMouseButton button = e->MouseButton.Button; + IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); + if (trickle_fast_inputs && ((mouse_button_changed & (1 << button)) || mouse_wheeled)) + break; + io.MouseDown[button] = e->MouseButton.Down; + mouse_button_changed |= (1 << button); + } + else if (e->Type == ImGuiInputEventType_MouseWheel) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the event + if (trickle_fast_inputs && (mouse_moved || mouse_button_changed != 0)) + break; + io.MouseWheelH += e->MouseWheel.WheelX; + io.MouseWheel += e->MouseWheel.WheelY; + mouse_wheeled = true; + } + else if (e->Type == ImGuiInputEventType_Key) + { + // Trickling Rule: Stop processing queued events if we got multiple action on the same button + ImGuiKey key = e->Key.Key; + IM_ASSERT(key != ImGuiKey_None); + ImGuiKeyData* key_data = GetKeyData(key); + const int key_data_index = (int)(key_data - g.IO.KeysData); + if (trickle_fast_inputs && key_data->Down != e->Key.Down && (key_changed_mask.TestBit(key_data_index) || text_inputted || mouse_button_changed != 0)) + break; + key_data->Down = e->Key.Down; + key_data->AnalogValue = e->Key.AnalogValue; + key_changed = true; + key_changed_mask.SetBit(key_data_index); + + // Allow legacy code using io.KeysDown[GetKeyIndex()] with new backends +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + io.KeysDown[key_data_index] = key_data->Down; + if (io.KeyMap[key_data_index] != -1) + io.KeysDown[io.KeyMap[key_data_index]] = key_data->Down; +#endif + } + else if (e->Type == ImGuiInputEventType_Text) + { + // Trickling Rule: Stop processing queued events if keys/mouse have been interacted with + if (trickle_fast_inputs && ((key_changed && trickle_interleaved_keys_and_text) || mouse_button_changed != 0 || mouse_moved || mouse_wheeled)) + break; + unsigned int c = e->Text.Char; + io.InputQueueCharacters.push_back(c <= IM_UNICODE_CODEPOINT_MAX ? (ImWchar)c : IM_UNICODE_CODEPOINT_INVALID); + if (trickle_interleaved_keys_and_text) + text_inputted = true; + } + else if (e->Type == ImGuiInputEventType_Focus) + { + // We intentionally overwrite this and process in NewFrame(), in order to give a chance + // to multi-viewports backends to queue AddFocusEvent(false) + AddFocusEvent(true) in same frame. + const bool focus_lost = !e->AppFocused.Focused; + io.AppFocusLost = focus_lost; + } + else + { + IM_ASSERT(0 && "Unknown event!"); + } + } + + // Record trail (for domain-specific applications wanting to access a precise trail) + //if (event_n != 0) IMGUI_DEBUG_LOG_IO("Processed: %d / Remaining: %d\n", event_n, g.InputEventsQueue.Size - event_n); + for (int n = 0; n < event_n; n++) + g.InputEventsTrail.push_back(g.InputEventsQueue[n]); + + // [DEBUG] +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (event_n != 0 && (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO)) + for (int n = 0; n < g.InputEventsQueue.Size; n++) + DebugPrintInputEvent(n < event_n ? "Processed" : "Remaining", &g.InputEventsQueue[n]); +#endif + + // Remaining events will be processed on the next frame + if (event_n == g.InputEventsQueue.Size) + g.InputEventsQueue.resize(0); + else + g.InputEventsQueue.erase(g.InputEventsQueue.Data, g.InputEventsQueue.Data + event_n); + + // Clear buttons state when focus is lost + // - this is useful so e.g. releasing Alt after focus loss on Alt-Tab doesn't trigger the Alt menu toggle. + // - we clear in EndFrame() and not now in order allow application/user code polling this flag + // (e.g. custom backend may want to clear additional data, custom widgets may want to react with a "canceling" event). + if (g.IO.AppFocusLost) + g.IO.ClearInputKeys(); +} + +ImGuiID ImGui::GetKeyOwner(ImGuiKey key) +{ + if (!IsNamedKeyOrModKey(key)) + return ImGuiKeyOwner_None; + + ImGuiContext& g = *GImGui; + ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key); + ImGuiID owner_id = owner_data->OwnerCurr; + + if (g.ActiveIdUsingAllKeyboardKeys && owner_id != g.ActiveId && owner_id != ImGuiKeyOwner_Any) + if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) + return ImGuiKeyOwner_None; + + return owner_id; +} + +// TestKeyOwner(..., ID) : (owner == None || owner == ID) +// TestKeyOwner(..., None) : (owner == None) +// TestKeyOwner(..., Any) : no owner test +// All paths are also testing for key not being locked, for the rare cases that key have been locked with using ImGuiInputFlags_LockXXX flags. +bool ImGui::TestKeyOwner(ImGuiKey key, ImGuiID owner_id) +{ + if (!IsNamedKeyOrModKey(key)) + return true; + + ImGuiContext& g = *GImGui; + if (g.ActiveIdUsingAllKeyboardKeys && owner_id != g.ActiveId && owner_id != ImGuiKeyOwner_Any) + if (key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END) + return false; + + ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key); + if (owner_id == ImGuiKeyOwner_Any) + return (owner_data->LockThisFrame == false); + + // Note: SetKeyOwner() sets OwnerCurr. It is not strictly required for most mouse routing overlap (because of ActiveId/HoveredId + // are acting as filter before this has a chance to filter), but sane as soon as user tries to look into things. + // Setting OwnerCurr in SetKeyOwner() is more consistent than testing OwnerNext here: would be inconsistent with getter and other functions. + if (owner_data->OwnerCurr != owner_id) + { + if (owner_data->LockThisFrame) + return false; + if (owner_data->OwnerCurr != ImGuiKeyOwner_None) + return false; + } + + return true; +} + +// _LockXXX flags are useful to lock keys away from code which is not input-owner aware. +// When using _LockXXX flags, you can use ImGuiKeyOwner_Any to lock keys from everyone. +// - SetKeyOwner(..., None) : clears owner +// - SetKeyOwner(..., Any, !Lock) : illegal (assert) +// - SetKeyOwner(..., Any or None, Lock) : set lock +void ImGui::SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags) +{ + IM_ASSERT(IsNamedKeyOrModKey(key) && (owner_id != ImGuiKeyOwner_Any || (flags & (ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease)))); // Can only use _Any with _LockXXX flags (to eat a key away without an ID to retrieve it) + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetKeyOwner) == 0); // Passing flags not supported by this function! + + ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key); + owner_data->OwnerCurr = owner_data->OwnerNext = owner_id; + + // We cannot lock by default as it would likely break lots of legacy code. + // In the case of using LockUntilRelease while key is not down we still lock during the frame (no key_data->Down test) + owner_data->LockUntilRelease = (flags & ImGuiInputFlags_LockUntilRelease) != 0; + owner_data->LockThisFrame = (flags & ImGuiInputFlags_LockThisFrame) != 0 || (owner_data->LockUntilRelease); +} + +// This is more or less equivalent to: +// if (IsItemHovered() || IsItemActive()) +// SetKeyOwner(key, GetItemID()); +// Extensive uses of that (e.g. many calls for a single item) may want to manually perform the tests once and then call SetKeyOwner() multiple times. +// More advanced usage scenarios may want to call SetKeyOwner() manually based on different condition. +// Worth noting is that only one item can be hovered and only one item can be active, therefore this usage pattern doesn't need to bother with routing and priority. +void ImGui::SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.LastItemData.ID; + if (id == 0 || (g.HoveredId != id && g.ActiveId != id)) + return; + if ((flags & ImGuiInputFlags_CondMask_) == 0) + flags |= ImGuiInputFlags_CondDefault_; + if ((g.HoveredId == id && (flags & ImGuiInputFlags_CondHovered)) || (g.ActiveId == id && (flags & ImGuiInputFlags_CondActive))) + { + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedBySetItemKeyOwner) == 0); // Passing flags not supported by this function! + SetKeyOwner(key, id, flags & ~ImGuiInputFlags_CondMask_); + } +} + +bool ImGui::Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id, ImGuiInputFlags flags) +{ + ImGuiContext& g = *GImGui; + + // When using (owner_id == 0/Any): SetShortcutRouting() will use CurrentFocusScopeId and filter with this, so IsKeyPressed() is fine with he 0/Any. + if ((flags & ImGuiInputFlags_RouteMask_) == 0) + flags |= ImGuiInputFlags_RouteFocused; + if (!SetShortcutRouting(key_chord, owner_id, flags)) + return false; + + if (key_chord & ImGuiMod_Shortcut) + key_chord = ConvertShortcutMod(key_chord); + ImGuiKey mods = (ImGuiKey)(key_chord & ImGuiMod_Mask_); + if (g.IO.KeyMods != mods) + return false; + + // Special storage location for mods + ImGuiKey key = (ImGuiKey)(key_chord & ~ImGuiMod_Mask_); + if (key == ImGuiKey_None) + key = ConvertSingleModFlagToKey(mods); + + if (!IsKeyPressed(key, owner_id, (flags & (ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateMask_)))) + return false; + IM_ASSERT((flags & ~ImGuiInputFlags_SupportedByShortcut) == 0); // Passing flags not supported by this function! + + return true; +} + + +//----------------------------------------------------------------------------- +// [SECTION] ERROR CHECKING +//----------------------------------------------------------------------------- + +// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui. +// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit +// If this triggers you have an issue: +// - Most commonly: mismatched headers and compiled code version. +// - Or: mismatched configuration #define, compilation settings, packing pragma etc. +// The configuration settings mentioned in imconfig.h must be set for all compilation units involved with Dear ImGui, +// which is way it is required you put them in your imconfig file (and not just before including imgui.h). +// Otherwise it is possible that different compilation units would see different structure layout +bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx) +{ + bool error = false; + if (strcmp(version, IMGUI_VERSION) != 0) { error = true; IM_ASSERT(strcmp(version, IMGUI_VERSION) == 0 && "Mismatched version string!"); } + if (sz_io != sizeof(ImGuiIO)) { error = true; IM_ASSERT(sz_io == sizeof(ImGuiIO) && "Mismatched struct layout!"); } + if (sz_style != sizeof(ImGuiStyle)) { error = true; IM_ASSERT(sz_style == sizeof(ImGuiStyle) && "Mismatched struct layout!"); } + if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); } + if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); } + if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); } + if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); } + return !error; +} + +// Until 1.89 (IMGUI_VERSION_NUM < 18814) it was legal to use SetCursorPos() to extend the boundary of a parent (e.g. window or table cell) +// This is causing issues and ambiguity and we need to retire that. +// See https://github.com/ocornut/imgui/issues/5548 for more details. +// [Scenario 1] +// Previously this would make the window content size ~200x200: +// Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + End(); // NOT OK +// Instead, please submit an item: +// Begin(...) + SetCursorScreenPos(GetCursorScreenPos() + ImVec2(200,200)) + Dummy(ImVec2(0,0)) + End(); // OK +// Alternative: +// Begin(...) + Dummy(ImVec2(200,200)) + End(); // OK +// [Scenario 2] +// For reference this is one of the issue what we aim to fix with this change: +// BeginGroup() + SomeItem("foobar") + SetCursorScreenPos(GetCursorScreenPos()) + EndGroup() +// The previous logic made SetCursorScreenPos(GetCursorScreenPos()) have a side-effect! It would erroneously incorporate ItemSpacing.y after the item into content size, making the group taller! +// While this code is a little twisted, no-one would expect SetXXX(GetXXX()) to have a side-effect. Using vertical alignment patterns could trigger this issue. +void ImGui::ErrorCheckUsingSetCursorPosToExtendParentBoundaries() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window->DC.IsSetPos); + window->DC.IsSetPos = false; +#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + if (window->DC.CursorPos.x <= window->DC.CursorMaxPos.x && window->DC.CursorPos.y <= window->DC.CursorMaxPos.y) + return; + if (window->SkipItems) + return; + IM_ASSERT(0 && "Code uses SetCursorPos()/SetCursorScreenPos() to extend window/parent boundaries. Please submit an item e.g. Dummy() to validate extent."); +#else + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); +#endif +} + +static void ImGui::ErrorCheckNewFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Check user IM_ASSERT macro + // (IF YOU GET A WARNING OR COMPILE ERROR HERE: it means your assert macro is incorrectly defined! + // If your macro uses multiple statements, it NEEDS to be surrounded by a 'do { ... } while (0)' block. + // This is a common C/C++ idiom to allow multiple statements macros to be used in control flow blocks.) + // #define IM_ASSERT(EXPR) if (SomeCode(EXPR)) SomeMoreCode(); // Wrong! + // #define IM_ASSERT(EXPR) do { if (SomeCode(EXPR)) SomeMoreCode(); } while (0) // Correct! + if (true) IM_ASSERT(1); else IM_ASSERT(0); + + // Emscripten backends are often imprecise in their submission of DeltaTime. (#6114, #3644) + // Ideally the Emscripten app/backend should aim to fix or smooth this value and avoid feeding zero, but we tolerate it. +#ifdef __EMSCRIPTEN__ + if (g.IO.DeltaTime <= 0.0f && g.FrameCount > 0) + g.IO.DeltaTime = 0.00001f; +#endif + + // Check user data + // (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument) + IM_ASSERT(g.Initialized); + IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!"); + IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?"); + IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!"); + IM_ASSERT(g.IO.Fonts->IsBuilt() && "Font Atlas not built! Make sure you called ImGui_ImplXXXX_NewFrame() function for renderer backend, which should call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8()"); + IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.CircleTessellationMaxError > 0.0f && "Invalid style setting!"); + IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting!"); // Allows us to avoid a few clamps in color computations + IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting."); + IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right); + IM_ASSERT(g.Style.ColorButtonPosition == ImGuiDir_Left || g.Style.ColorButtonPosition == ImGuiDir_Right); +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + for (int n = ImGuiKey_NamedKey_BEGIN; n < ImGuiKey_COUNT; n++) + IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < ImGuiKey_LegacyNativeKey_END && "io.KeyMap[] contains an out of bound value (need to be 0..511, or -1 for unmapped key)"); + + // Check: required key mapping (we intentionally do NOT check all keys to not pressure user into setting up everything, but Space is required and was only added in 1.60 WIP) + if ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) && g.IO.BackendUsingLegacyKeyArrays == 1) + IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation."); +#endif + + // Check: the io.ConfigWindowsResizeFromEdges option requires backend to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly. + if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors)) + g.IO.ConfigWindowsResizeFromEdges = false; +} + +static void ImGui::ErrorCheckEndFrameSanityChecks() +{ + ImGuiContext& g = *GImGui; + + // Verify that io.KeyXXX fields haven't been tampered with. Key mods should not be modified between NewFrame() and EndFrame() + // One possible reason leading to this assert is that your backends update inputs _AFTER_ NewFrame(). + // It is known that when some modal native windows called mid-frame takes focus away, some backends such as GLFW will + // send key release events mid-frame. This would normally trigger this assertion and lead to sheared inputs. + // We silently accommodate for this case by ignoring the case where all io.KeyXXX modifiers were released (aka key_mod_flags == 0), + // while still correctly asserting on mid-frame key press events. + const ImGuiKeyChord key_mods = GetMergedModsFromKeys(); + IM_ASSERT((key_mods == 0 || g.IO.KeyMods == key_mods) && "Mismatching io.KeyCtrl/io.KeyShift/io.KeyAlt/io.KeySuper vs io.KeyMods"); + IM_UNUSED(key_mods); + + // [EXPERIMENTAL] Recover from errors: You may call this yourself before EndFrame(). + //ErrorCheckEndFrameRecover(); + + // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you + // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API). + if (g.CurrentWindowStack.Size != 1) + { + if (g.CurrentWindowStack.Size > 1) + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?"); + while (g.CurrentWindowStack.Size > 1) + End(); + } + else + { + IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?"); + } + } + + IM_ASSERT_USER_ERROR(g.GroupStack.Size == 0, "Missing EndGroup call!"); +} + +// Experimental recovery from incorrect usage of BeginXXX/EndXXX/PushXXX/PopXXX calls. +// Must be called during or before EndFrame(). +// This is generally flawed as we are not necessarily End/Popping things in the right order. +// FIXME: Can't recover from inside BeginTabItem/EndTabItem yet. +// FIXME: Can't recover from interleaved BeginTabBar/Begin +void ImGui::ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data) +{ + // PVS-Studio V1044 is "Loop break conditions do not depend on the number of iterations" + ImGuiContext& g = *GImGui; + while (g.CurrentWindowStack.Size > 0) //-V1044 + { + ErrorCheckEndWindowRecover(log_callback, user_data); + ImGuiWindow* window = g.CurrentWindow; + if (g.CurrentWindowStack.Size == 1) + { + IM_ASSERT(window->IsFallbackWindow); + break; + } + if (window->Flags & ImGuiWindowFlags_ChildWindow) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndChild() for '%s'", window->Name); + EndChild(); + } + else + { + if (log_callback) log_callback(user_data, "Recovered from missing End() for '%s'", window->Name); + End(); + } + } +} + +// Must be called before End()/EndChild() +void ImGui::ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data) +{ + ImGuiContext& g = *GImGui; + while (g.CurrentTable && (g.CurrentTable->OuterWindow == g.CurrentWindow || g.CurrentTable->InnerWindow == g.CurrentWindow)) + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTable() in '%s'", g.CurrentTable->OuterWindow->Name); + EndTable(); + } + + ImGuiWindow* window = g.CurrentWindow; + ImGuiStackSizes* stack_sizes = &g.CurrentWindowStack.back().StackSizesOnBegin; + IM_ASSERT(window != NULL); + while (g.CurrentTabBar != NULL) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndTabBar() in '%s'", window->Name); + EndTabBar(); + } + while (window->DC.TreeDepth > 0) + { + if (log_callback) log_callback(user_data, "Recovered from missing TreePop() in '%s'", window->Name); + TreePop(); + } + while (g.GroupStack.Size > stack_sizes->SizeOfGroupStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndGroup() in '%s'", window->Name); + EndGroup(); + } + while (window->IDStack.Size > 1) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopID() in '%s'", window->Name); + PopID(); + } + while (g.DisabledStackSize > stack_sizes->SizeOfDisabledStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing EndDisabled() in '%s'", window->Name); + EndDisabled(); + } + while (g.ColorStack.Size > stack_sizes->SizeOfColorStack) + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleColor() in '%s' for ImGuiCol_%s", window->Name, GetStyleColorName(g.ColorStack.back().Col)); + PopStyleColor(); + } + while (g.ItemFlagsStack.Size > stack_sizes->SizeOfItemFlagsStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopItemFlag() in '%s'", window->Name); + PopItemFlag(); + } + while (g.StyleVarStack.Size > stack_sizes->SizeOfStyleVarStack) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopStyleVar() in '%s'", window->Name); + PopStyleVar(); + } + while (g.FocusScopeStack.Size > stack_sizes->SizeOfFocusScopeStack + 1) //-V1044 + { + if (log_callback) log_callback(user_data, "Recovered from missing PopFocusScope() in '%s'", window->Name); + PopFocusScope(); + } +} + +// Save current stack sizes for later compare +void ImGuiStackSizes::SetToContextState(ImGuiContext* ctx) +{ + ImGuiContext& g = *ctx; + ImGuiWindow* window = g.CurrentWindow; + SizeOfIDStack = (short)window->IDStack.Size; + SizeOfColorStack = (short)g.ColorStack.Size; + SizeOfStyleVarStack = (short)g.StyleVarStack.Size; + SizeOfFontStack = (short)g.FontStack.Size; + SizeOfFocusScopeStack = (short)g.FocusScopeStack.Size; + SizeOfGroupStack = (short)g.GroupStack.Size; + SizeOfItemFlagsStack = (short)g.ItemFlagsStack.Size; + SizeOfBeginPopupStack = (short)g.BeginPopupStack.Size; + SizeOfDisabledStack = (short)g.DisabledStackSize; +} + +// Compare to detect usage errors +void ImGuiStackSizes::CompareWithContextState(ImGuiContext* ctx) +{ + ImGuiContext& g = *ctx; + ImGuiWindow* window = g.CurrentWindow; + IM_UNUSED(window); + + // Window stacks + // NOT checking: DC.ItemWidth, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin) + IM_ASSERT(SizeOfIDStack == window->IDStack.Size && "PushID/PopID or TreeNode/TreePop Mismatch!"); + + // Global stacks + // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them. + IM_ASSERT(SizeOfGroupStack == g.GroupStack.Size && "BeginGroup/EndGroup Mismatch!"); + IM_ASSERT(SizeOfBeginPopupStack == g.BeginPopupStack.Size && "BeginPopup/EndPopup or BeginMenu/EndMenu Mismatch!"); + IM_ASSERT(SizeOfDisabledStack == g.DisabledStackSize && "BeginDisabled/EndDisabled Mismatch!"); + IM_ASSERT(SizeOfItemFlagsStack >= g.ItemFlagsStack.Size && "PushItemFlag/PopItemFlag Mismatch!"); + IM_ASSERT(SizeOfColorStack >= g.ColorStack.Size && "PushStyleColor/PopStyleColor Mismatch!"); + IM_ASSERT(SizeOfStyleVarStack >= g.StyleVarStack.Size && "PushStyleVar/PopStyleVar Mismatch!"); + IM_ASSERT(SizeOfFontStack >= g.FontStack.Size && "PushFont/PopFont Mismatch!"); + IM_ASSERT(SizeOfFocusScopeStack == g.FocusScopeStack.Size && "PushFocusScope/PopFocusScope Mismatch!"); +} + + +//----------------------------------------------------------------------------- +// [SECTION] LAYOUT +//----------------------------------------------------------------------------- +// - ItemSize() +// - ItemAdd() +// - SameLine() +// - GetCursorScreenPos() +// - SetCursorScreenPos() +// - GetCursorPos(), GetCursorPosX(), GetCursorPosY() +// - SetCursorPos(), SetCursorPosX(), SetCursorPosY() +// - GetCursorStartPos() +// - Indent() +// - Unindent() +// - SetNextItemWidth() +// - PushItemWidth() +// - PushMultiItemsWidths() +// - PopItemWidth() +// - CalcItemWidth() +// - CalcItemSize() +// - GetTextLineHeight() +// - GetTextLineHeightWithSpacing() +// - GetFrameHeight() +// - GetFrameHeightWithSpacing() +// - GetContentRegionMax() +// - GetContentRegionMaxAbs() [Internal] +// - GetContentRegionAvail(), +// - GetWindowContentRegionMin(), GetWindowContentRegionMax() +// - BeginGroup() +// - EndGroup() +// Also see in imgui_widgets: tab bars, and in imgui_tables: tables, columns. +//----------------------------------------------------------------------------- + +// Advance cursor given item size for layout. +// Register minimum needed size so it can extend the bounding box used for auto-fit calculation. +// See comments in ItemAdd() about how/why the size provided to ItemSize() vs ItemAdd() may often different. +void ImGui::ItemSize(const ImVec2& size, float text_baseline_y) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // We increase the height in this function to accommodate for baseline offset. + // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor, + // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect. + const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f; + + const float line_y1 = window->DC.IsSameLine ? window->DC.CursorPosPrevLine.y : window->DC.CursorPos.y; + const float line_height = ImMax(window->DC.CurrLineSize.y, /*ImMax(*/window->DC.CursorPos.y - line_y1/*, 0.0f)*/ + size.y + offset_to_match_baseline_y); + + // Always align ourselves on pixel boundaries + //if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG] + window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x; + window->DC.CursorPosPrevLine.y = line_y1; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line + window->DC.CursorPos.y = IM_FLOOR(line_y1 + line_height + g.Style.ItemSpacing.y); // Next line + window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x); + window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y); + //if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG] + + window->DC.PrevLineSize.y = line_height; + window->DC.CurrLineSize.y = 0.0f; + window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y); + window->DC.CurrLineTextBaseOffset = 0.0f; + window->DC.IsSameLine = window->DC.IsSetPos = false; + + // Horizontal layout mode + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + SameLine(); +} + +// Declare item bounding box for clipping and interaction. +// Note that the size can be different than the one provided to ItemSize(). Typically, widgets that spread over available surface +// declare their minimum size requirement to ItemSize() and provide a larger region to ItemAdd() which is used drawing/interaction. +bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg, ImGuiItemFlags extra_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Set item data + // (DisplayRect is left untouched, made valid when ImGuiItemStatusFlags_HasDisplayRect is set) + g.LastItemData.ID = id; + g.LastItemData.Rect = bb; + g.LastItemData.NavRect = nav_bb_arg ? *nav_bb_arg : bb; + g.LastItemData.InFlags = g.CurrentItemFlags | extra_flags; + g.LastItemData.StatusFlags = ImGuiItemStatusFlags_None; + + // Directional navigation processing + if (id != 0) + { + KeepAliveID(id); + + // Runs prior to clipping early-out + // (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget + // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests + // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of + // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame. + // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able + // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick). + // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null. + // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere. + if (!(g.LastItemData.InFlags & ImGuiItemFlags_NoNav)) + { + window->DC.NavLayersActiveMaskNext |= (1 << window->DC.NavLayerCurrent); + if (g.NavId == id || g.NavAnyRequest) + if (g.NavWindow->RootWindowForNav == window->RootWindowForNav) + if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened)) + NavProcessItem(); + } + + // [DEBUG] People keep stumbling on this problem and using "" as identifier in the root of a window instead of "##something". + // Empty identifier are valid and useful in a small amount of cases, but 99.9% of the time you want to use "##something". + // READ THE FAQ: https://dearimgui.org/faq + IM_ASSERT(id != window->ID && "Cannot have an empty ID at the root of a window. If you need an empty label, use ## and read the FAQ about how the ID Stack works!"); + } + g.NextItemData.Flags = ImGuiNextItemDataFlags_None; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (id != 0) + IMGUI_TEST_ENGINE_ITEM_ADD(id, g.LastItemData.NavRect, &g.LastItemData); +#endif + + // Clipping test + // (FIXME: This is a modified copy of IsClippedEx() so we can reuse the is_rect_visible value) + //const bool is_clipped = IsClippedEx(bb, id); + //if (is_clipped) + // return false; + const bool is_rect_visible = bb.Overlaps(window->ClipRect); + if (!is_rect_visible) + if (id == 0 || (id != g.ActiveId && id != g.NavId)) + if (!g.LogEnabled) + return false; + + // [DEBUG] +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + if (id != 0 && id == g.DebugLocateId) + DebugLocateItemResolveWithLastItem(); +#endif + //if (g.IO.KeyAlt) window->DrawList->AddRect(bb.Min, bb.Max, IM_COL32(255,255,0,120)); // [DEBUG] + + // We need to calculate this now to take account of the current clipping rectangle (as items like Selectable may change them) + if (is_rect_visible) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Visible; + if (IsMouseHoveringRect(bb.Min, bb.Max)) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; + return true; +} + +// Gets back to previous line and continue with horizontal layout +// offset_from_start_x == 0 : follow right after previous item +// offset_from_start_x != 0 : align to specified x position (relative to window/group left) +// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0 +// spacing_w >= 0 : enforce spacing amount +void ImGui::SameLine(float offset_from_start_x, float spacing_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + if (offset_from_start_x != 0.0f) + { + if (spacing_w < 0.0f) + spacing_w = 0.0f; + window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + else + { + if (spacing_w < 0.0f) + spacing_w = g.Style.ItemSpacing.x; + window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w; + window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y; + } + window->DC.CurrLineSize = window->DC.PrevLineSize; + window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; + window->DC.IsSameLine = true; +} + +ImVec2 ImGui::GetCursorScreenPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos; +} + +// 2022/08/05: Setting cursor position also extend boundaries (via modifying CursorMaxPos) used to compute window size, group size etc. +// I believe this was is a judicious choice but it's probably being relied upon (it has been the case since 1.31 and 1.50) +// It would be sane if we requested user to use SetCursorPos() + Dummy(ImVec2(0,0)) to extend CursorMaxPos... +void ImGui::SetCursorScreenPos(const ImVec2& pos) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos = pos; + //window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); + window->DC.IsSetPos = true; +} + +// User generally sees positions in window coordinates. Internally we store CursorPos in absolute screen coordinates because it is more convenient. +// Conversion happens as we pass the value to user, but it makes our naming convention confusing because GetCursorPos() == (DC.CursorPos - window.Pos). May want to rename 'DC.CursorPos'. +ImVec2 ImGui::GetCursorPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos - window->Pos + window->Scroll; +} + +float ImGui::GetCursorPosX() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos.x - window->Pos.x + window->Scroll.x; +} + +float ImGui::GetCursorPosY() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorPos.y - window->Pos.y + window->Scroll.y; +} + +void ImGui::SetCursorPos(const ImVec2& local_pos) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos = window->Pos - window->Scroll + local_pos; + //window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos); + window->DC.IsSetPos = true; +} + +void ImGui::SetCursorPosX(float x) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + x; + //window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPos.x); + window->DC.IsSetPos = true; +} + +void ImGui::SetCursorPosY(float y) +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.CursorPos.y = window->Pos.y - window->Scroll.y + y; + //window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y); + window->DC.IsSetPos = true; +} + +ImVec2 ImGui::GetCursorStartPos() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CursorStartPos - window->Pos; +} + +void ImGui::Indent(float indent_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->DC.Indent.x += (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; + window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; +} + +void ImGui::Unindent(float indent_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + window->DC.Indent.x -= (indent_w != 0.0f) ? indent_w : g.Style.IndentSpacing; + window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x; +} + +// Affect large frame+labels widgets only. +void ImGui::SetNextItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth; + g.NextItemData.Width = item_width; +} + +// FIXME: Remove the == 0.0f behavior? +void ImGui::PushItemWidth(float item_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width); + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PushMultiItemsWidths(int components, float w_full) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiStyle& style = g.Style; + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + window->DC.ItemWidthStack.push_back(window->DC.ItemWidth); // Backup current width + window->DC.ItemWidthStack.push_back(w_item_last); + for (int i = 0; i < components - 2; i++) + window->DC.ItemWidthStack.push_back(w_item_one); + window->DC.ItemWidth = (components == 1) ? w_item_last : w_item_one; + g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth; +} + +void ImGui::PopItemWidth() +{ + ImGuiWindow* window = GetCurrentWindow(); + window->DC.ItemWidth = window->DC.ItemWidthStack.back(); + window->DC.ItemWidthStack.pop_back(); +} + +// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth(). +// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags() +float ImGui::CalcItemWidth() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float w; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) + w = g.NextItemData.Width; + else + w = window->DC.ItemWidth; + if (w < 0.0f) + { + float region_max_x = GetContentRegionMaxAbs().x; + w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w); + } + w = IM_FLOOR(w); + return w; +} + +// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth(). +// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical. +// Note that only CalcItemWidth() is publicly exposed. +// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable) +ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImVec2 region_max; + if (size.x < 0.0f || size.y < 0.0f) + region_max = GetContentRegionMaxAbs(); + + if (size.x == 0.0f) + size.x = default_w; + else if (size.x < 0.0f) + size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x); + + if (size.y == 0.0f) + size.y = default_h; + else if (size.y < 0.0f) + size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y); + + return size; +} + +float ImGui::GetTextLineHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize; +} + +float ImGui::GetTextLineHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.ItemSpacing.y; +} + +float ImGui::GetFrameHeight() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f; +} + +float ImGui::GetFrameHeightWithSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + g.Style.FramePadding.y * 2.0f + g.Style.ItemSpacing.y; +} + +// FIXME: All the Contents Region function are messy or misleading. WE WILL AIM TO OBSOLETE ALL OF THEM WITH A NEW "WORK RECT" API. Thanks for your patience! + +// FIXME: This is in window space (not screen space!). +ImVec2 ImGui::GetContentRegionMax() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max - window->Pos; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x - window->Pos.x; + return mx; +} + +// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features. +ImVec2 ImGui::GetContentRegionMaxAbs() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImVec2 mx = window->ContentRegionRect.Max; + if (window->DC.CurrentColumns || g.CurrentTable) + mx.x = window->WorkRect.Max.x; + return mx; +} + +ImVec2 ImGui::GetContentRegionAvail() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return GetContentRegionMaxAbs() - window->DC.CursorPos; +} + +// In window space (not screen space!) +ImVec2 ImGui::GetWindowContentRegionMin() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Min - window->Pos; +} + +ImVec2 ImGui::GetWindowContentRegionMax() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ContentRegionRect.Max - window->Pos; +} + +// Lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) +// Groups are currently a mishmash of functionalities which should perhaps be clarified and separated. +// FIXME-OPT: Could we safely early out on ->SkipItems? +void ImGui::BeginGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + g.GroupStack.resize(g.GroupStack.Size + 1); + ImGuiGroupData& group_data = g.GroupStack.back(); + group_data.WindowID = window->ID; + group_data.BackupCursorPos = window->DC.CursorPos; + group_data.BackupCursorMaxPos = window->DC.CursorMaxPos; + group_data.BackupIndent = window->DC.Indent; + group_data.BackupGroupOffset = window->DC.GroupOffset; + group_data.BackupCurrLineSize = window->DC.CurrLineSize; + group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset; + group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive; + group_data.BackupHoveredIdIsAlive = g.HoveredId != 0; + group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive; + group_data.EmitItem = true; + + window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x; + window->DC.Indent = window->DC.GroupOffset; + window->DC.CursorMaxPos = window->DC.CursorPos; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return +} + +void ImGui::EndGroup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.GroupStack.Size > 0); // Mismatched BeginGroup()/EndGroup() calls + + ImGuiGroupData& group_data = g.GroupStack.back(); + IM_ASSERT(group_data.WindowID == window->ID); // EndGroup() in wrong window? + + if (window->DC.IsSetPos) + ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + + ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos)); + + window->DC.CursorPos = group_data.BackupCursorPos; + window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos); + window->DC.Indent = group_data.BackupIndent; + window->DC.GroupOffset = group_data.BackupGroupOffset; + window->DC.CurrLineSize = group_data.BackupCurrLineSize; + window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset; + if (g.LogEnabled) + g.LogLinePosY = -FLT_MAX; // To enforce a carriage return + + if (!group_data.EmitItem) + { + g.GroupStack.pop_back(); + return; + } + + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now. + ItemSize(group_bb.GetSize()); + ItemAdd(group_bb, 0, NULL, ImGuiItemFlags_NoTabStop); + + // If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group. + // It would be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets. + // Also if you grep for LastItemId you'll notice it is only used in that context. + // (The two tests not the same because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.) + const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId; + const bool group_contains_prev_active_id = (group_data.BackupActiveIdPreviousFrameIsAlive == false) && (g.ActiveIdPreviousFrameIsAlive == true); + if (group_contains_curr_active_id) + g.LastItemData.ID = g.ActiveId; + else if (group_contains_prev_active_id) + g.LastItemData.ID = g.ActiveIdPreviousFrame; + g.LastItemData.Rect = group_bb; + + // Forward Hovered flag + const bool group_contains_curr_hovered_id = (group_data.BackupHoveredIdIsAlive == false) && g.HoveredId != 0; + if (group_contains_curr_hovered_id) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + + // Forward Edited flag + if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Edited; + + // Forward Deactivated flag + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDeactivated; + if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_Deactivated; + + g.GroupStack.pop_back(); + //window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug] +} + + +//----------------------------------------------------------------------------- +// [SECTION] SCROLLING +//----------------------------------------------------------------------------- + +// Helper to snap on edges when aiming at an item very close to the edge, +// So the difference between WindowPadding and ItemSpacing will be in the visible area after scrolling. +// When we refactor the scrolling API this may be configurable with a flag? +// Note that the effect for this won't be visible on X axis with default Style settings as WindowPadding.x == ItemSpacing.x by default. +static float CalcScrollEdgeSnap(float target, float snap_min, float snap_max, float snap_threshold, float center_ratio) +{ + if (target <= snap_min + snap_threshold) + return ImLerp(snap_min, target, center_ratio); + if (target >= snap_max - snap_threshold) + return ImLerp(target, snap_max, center_ratio); + return target; +} + +static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window) +{ + ImVec2 scroll = window->Scroll; + ImVec2 decoration_size(window->DecoOuterSizeX1 + window->DecoInnerSizeX1 + window->DecoOuterSizeX2, window->DecoOuterSizeY1 + window->DecoInnerSizeY1 + window->DecoOuterSizeY2); + for (int axis = 0; axis < 2; axis++) + { + if (window->ScrollTarget[axis] < FLT_MAX) + { + float center_ratio = window->ScrollTargetCenterRatio[axis]; + float scroll_target = window->ScrollTarget[axis]; + if (window->ScrollTargetEdgeSnapDist[axis] > 0.0f) + { + float snap_min = 0.0f; + float snap_max = window->ScrollMax[axis] + window->SizeFull[axis] - decoration_size[axis]; + scroll_target = CalcScrollEdgeSnap(scroll_target, snap_min, snap_max, window->ScrollTargetEdgeSnapDist[axis], center_ratio); + } + scroll[axis] = scroll_target - center_ratio * (window->SizeFull[axis] - decoration_size[axis]); + } + scroll[axis] = IM_FLOOR(ImMax(scroll[axis], 0.0f)); + if (!window->Collapsed && !window->SkipItems) + scroll[axis] = ImMin(scroll[axis], window->ScrollMax[axis]); + } + return scroll; +} + +void ImGui::ScrollToItem(ImGuiScrollFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ScrollToRectEx(window, g.LastItemData.NavRect, flags); +} + +void ImGui::ScrollToRect(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) +{ + ScrollToRectEx(window, item_rect, flags); +} + +// Scroll to keep newly navigated item fully into view +ImVec2 ImGui::ScrollToRectEx(ImGuiWindow* window, const ImRect& item_rect, ImGuiScrollFlags flags) +{ + ImGuiContext& g = *GImGui; + ImRect scroll_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1)); + scroll_rect.Min.x = ImMin(scroll_rect.Min.x + window->DecoInnerSizeX1, scroll_rect.Max.x); + scroll_rect.Min.y = ImMin(scroll_rect.Min.y + window->DecoInnerSizeY1, scroll_rect.Max.y); + //GetForegroundDrawList(window)->AddRect(item_rect.Min, item_rect.Max, IM_COL32(255,0,0,255), 0.0f, 0, 5.0f); // [DEBUG] + //GetForegroundDrawList(window)->AddRect(scroll_rect.Min, scroll_rect.Max, IM_COL32_WHITE); // [DEBUG] + + // Check that only one behavior is selected per axis + IM_ASSERT((flags & ImGuiScrollFlags_MaskX_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskX_)); + IM_ASSERT((flags & ImGuiScrollFlags_MaskY_) == 0 || ImIsPowerOfTwo(flags & ImGuiScrollFlags_MaskY_)); + + // Defaults + ImGuiScrollFlags in_flags = flags; + if ((flags & ImGuiScrollFlags_MaskX_) == 0 && window->ScrollbarX) + flags |= ImGuiScrollFlags_KeepVisibleEdgeX; + if ((flags & ImGuiScrollFlags_MaskY_) == 0) + flags |= window->Appearing ? ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeY; + + const bool fully_visible_x = item_rect.Min.x >= scroll_rect.Min.x && item_rect.Max.x <= scroll_rect.Max.x; + const bool fully_visible_y = item_rect.Min.y >= scroll_rect.Min.y && item_rect.Max.y <= scroll_rect.Max.y; + const bool can_be_fully_visible_x = (item_rect.GetWidth() + g.Style.ItemSpacing.x * 2.0f) <= scroll_rect.GetWidth() || (window->AutoFitFramesX > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0; + const bool can_be_fully_visible_y = (item_rect.GetHeight() + g.Style.ItemSpacing.y * 2.0f) <= scroll_rect.GetHeight() || (window->AutoFitFramesY > 0) || (window->Flags & ImGuiWindowFlags_AlwaysAutoResize) != 0; + + if ((flags & ImGuiScrollFlags_KeepVisibleEdgeX) && !fully_visible_x) + { + if (item_rect.Min.x < scroll_rect.Min.x || !can_be_fully_visible_x) + SetScrollFromPosX(window, item_rect.Min.x - g.Style.ItemSpacing.x - window->Pos.x, 0.0f); + else if (item_rect.Max.x >= scroll_rect.Max.x) + SetScrollFromPosX(window, item_rect.Max.x + g.Style.ItemSpacing.x - window->Pos.x, 1.0f); + } + else if (((flags & ImGuiScrollFlags_KeepVisibleCenterX) && !fully_visible_x) || (flags & ImGuiScrollFlags_AlwaysCenterX)) + { + if (can_be_fully_visible_x) + SetScrollFromPosX(window, ImFloor((item_rect.Min.x + item_rect.Max.x) * 0.5f) - window->Pos.x, 0.5f); + else + SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x, 0.0f); + } + + if ((flags & ImGuiScrollFlags_KeepVisibleEdgeY) && !fully_visible_y) + { + if (item_rect.Min.y < scroll_rect.Min.y || !can_be_fully_visible_y) + SetScrollFromPosY(window, item_rect.Min.y - g.Style.ItemSpacing.y - window->Pos.y, 0.0f); + else if (item_rect.Max.y >= scroll_rect.Max.y) + SetScrollFromPosY(window, item_rect.Max.y + g.Style.ItemSpacing.y - window->Pos.y, 1.0f); + } + else if (((flags & ImGuiScrollFlags_KeepVisibleCenterY) && !fully_visible_y) || (flags & ImGuiScrollFlags_AlwaysCenterY)) + { + if (can_be_fully_visible_y) + SetScrollFromPosY(window, ImFloor((item_rect.Min.y + item_rect.Max.y) * 0.5f) - window->Pos.y, 0.5f); + else + SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y, 0.0f); + } + + ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); + ImVec2 delta_scroll = next_scroll - window->Scroll; + + // Also scroll parent window to keep us into view if necessary + if (!(flags & ImGuiScrollFlags_NoScrollParent) && (window->Flags & ImGuiWindowFlags_ChildWindow)) + { + // FIXME-SCROLL: May be an option? + if ((in_flags & (ImGuiScrollFlags_AlwaysCenterX | ImGuiScrollFlags_KeepVisibleCenterX)) != 0) + in_flags = (in_flags & ~ImGuiScrollFlags_MaskX_) | ImGuiScrollFlags_KeepVisibleEdgeX; + if ((in_flags & (ImGuiScrollFlags_AlwaysCenterY | ImGuiScrollFlags_KeepVisibleCenterY)) != 0) + in_flags = (in_flags & ~ImGuiScrollFlags_MaskY_) | ImGuiScrollFlags_KeepVisibleEdgeY; + delta_scroll += ScrollToRectEx(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll), in_flags); + } + + return delta_scroll; +} + +float ImGui::GetScrollX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.x; +} + +float ImGui::GetScrollY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->Scroll.y; +} + +float ImGui::GetScrollMaxX() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.x; +} + +float ImGui::GetScrollMaxY() +{ + ImGuiWindow* window = GImGui->CurrentWindow; + return window->ScrollMax.y; +} + +void ImGui::SetScrollX(ImGuiWindow* window, float scroll_x) +{ + window->ScrollTarget.x = scroll_x; + window->ScrollTargetCenterRatio.x = 0.0f; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollY(ImGuiWindow* window, float scroll_y) +{ + window->ScrollTarget.y = scroll_y; + window->ScrollTargetCenterRatio.y = 0.0f; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollX(float scroll_x) +{ + ImGuiContext& g = *GImGui; + SetScrollX(g.CurrentWindow, scroll_x); +} + +void ImGui::SetScrollY(float scroll_y) +{ + ImGuiContext& g = *GImGui; + SetScrollY(g.CurrentWindow, scroll_y); +} + +// Note that a local position will vary depending on initial scroll value, +// This is a little bit confusing so bear with us: +// - local_pos = (absolution_pos - window->Pos) +// - So local_x/local_y are 0.0f for a position at the upper-left corner of a window, +// and generally local_x/local_y are >(padding+decoration) && <(size-padding-decoration) when in the visible area. +// - They mostly exist because of legacy API. +// Following the rules above, when trying to work with scrolling code, consider that: +// - SetScrollFromPosY(0.0f) == SetScrollY(0.0f + scroll.y) == has no effect! +// - SetScrollFromPosY(-scroll.y) == SetScrollY(-scroll.y + scroll.y) == SetScrollY(0.0f) == reset scroll. Of course writing SetScrollY(0.0f) directly then makes more sense +// We store a target position so centering and clamping can occur on the next frame when we are guaranteed to have a known window size +void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio) +{ + IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f); + window->ScrollTarget.x = IM_FLOOR(local_x - window->DecoOuterSizeX1 - window->DecoInnerSizeX1 + window->Scroll.x); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.x = center_x_ratio; + window->ScrollTargetEdgeSnapDist.x = 0.0f; +} + +void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio) +{ + IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f); + window->ScrollTarget.y = IM_FLOOR(local_y - window->DecoOuterSizeY1 - window->DecoInnerSizeY1 + window->Scroll.y); // Convert local position to scroll offset + window->ScrollTargetCenterRatio.y = center_y_ratio; + window->ScrollTargetEdgeSnapDist.y = 0.0f; +} + +void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosX(g.CurrentWindow, local_x, center_x_ratio); +} + +void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + SetScrollFromPosY(g.CurrentWindow, local_y, center_y_ratio); +} + +// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item. +void ImGui::SetScrollHereX(float center_x_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_x = ImMax(window->WindowPadding.x, g.Style.ItemSpacing.x); + float target_pos_x = ImLerp(g.LastItemData.Rect.Min.x - spacing_x, g.LastItemData.Rect.Max.x + spacing_x, center_x_ratio); + SetScrollFromPosX(window, target_pos_x - window->Pos.x, center_x_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.x = ImMax(0.0f, window->WindowPadding.x - spacing_x); +} + +// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item. +void ImGui::SetScrollHereY(float center_y_ratio) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + float spacing_y = ImMax(window->WindowPadding.y, g.Style.ItemSpacing.y); + float target_pos_y = ImLerp(window->DC.CursorPosPrevLine.y - spacing_y, window->DC.CursorPosPrevLine.y + window->DC.PrevLineSize.y + spacing_y, center_y_ratio); + SetScrollFromPosY(window, target_pos_y - window->Pos.y, center_y_ratio); // Convert from absolute to local pos + + // Tweak: snap on edges when aiming at an item very close to the edge + window->ScrollTargetEdgeSnapDist.y = ImMax(0.0f, window->WindowPadding.y - spacing_y); +} + +//----------------------------------------------------------------------------- +// [SECTION] TOOLTIPS +//----------------------------------------------------------------------------- + +bool ImGui::BeginTooltip() +{ + return BeginTooltipEx(ImGuiTooltipFlags_None, ImGuiWindowFlags_None); +} + +bool ImGui::BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags) +{ + ImGuiContext& g = *GImGui; + + if (g.DragDropWithinSource || g.DragDropWithinTarget) + { + // The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor) + // In the context of a dragging tooltip we try to reduce that offset and we enforce following the cursor. + // Whatever we do we want to call SetNextWindowPos() to enforce a tooltip position and disable clipping the tooltip without our display area, like regular tooltip do. + //ImVec2 tooltip_pos = g.IO.MousePos - g.ActiveIdClickOffset - g.Style.WindowPadding; + ImVec2 tooltip_pos = g.IO.MousePos + ImVec2(16 * g.Style.MouseCursorScale, 8 * g.Style.MouseCursorScale); + SetNextWindowPos(tooltip_pos); + SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f); + //PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :( + tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip; + } + + char window_name[16]; + ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount); + if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip) + if (ImGuiWindow* window = FindWindowByName(window_name)) + if (window->Active) + { + // Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one. + SetWindowHiddendAndSkipItemsForCurrentFrame(window); + ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount); + } + ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_AlwaysAutoResize; + Begin(window_name, NULL, flags | extra_window_flags); + // 2023-03-09: Added bool return value to the API, but currently always returning true. + // If this ever returns false we need to update BeginDragDropSource() accordingly. + //if (!ret) + // End(); + //return ret; + return true; +} + +void ImGui::EndTooltip() +{ + IM_ASSERT(GetCurrentWindowRead()->Flags & ImGuiWindowFlags_Tooltip); // Mismatched BeginTooltip()/EndTooltip() calls + End(); +} + +void ImGui::SetTooltipV(const char* fmt, va_list args) +{ + BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); + TextV(fmt, args); + EndTooltip(); +} + +void ImGui::SetTooltip(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + SetTooltipV(fmt, args); + va_end(args); +} + +//----------------------------------------------------------------------------- +// [SECTION] POPUPS +//----------------------------------------------------------------------------- + +// Supported flags: ImGuiPopupFlags_AnyPopupId, ImGuiPopupFlags_AnyPopupLevel +bool ImGui::IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + if (popup_flags & ImGuiPopupFlags_AnyPopupId) + { + // Return true if any popup is open at the current BeginPopup() level of the popup stack + // This may be used to e.g. test for another popups already opened to handle popups priorities at the same level. + IM_ASSERT(id == 0); + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + return g.OpenPopupStack.Size > 0; + else + return g.OpenPopupStack.Size > g.BeginPopupStack.Size; + } + else + { + if (popup_flags & ImGuiPopupFlags_AnyPopupLevel) + { + // Return true if the popup is open anywhere in the popup stack + for (int n = 0; n < g.OpenPopupStack.Size; n++) + if (g.OpenPopupStack[n].PopupId == id) + return true; + return false; + } + else + { + // Return true if the popup is open at the current BeginPopup() level of the popup stack (this is the most-common query) + return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id; + } + } +} + +bool ImGui::IsPopupOpen(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiID id = (popup_flags & ImGuiPopupFlags_AnyPopupId) ? 0 : g.CurrentWindow->GetID(str_id); + if ((popup_flags & ImGuiPopupFlags_AnyPopupLevel) && id != 0) + IM_ASSERT(0 && "Cannot use IsPopupOpen() with a string id and ImGuiPopupFlags_AnyPopupLevel."); // But non-string version is legal and used internally + return IsPopupOpen(id, popup_flags); +} + +ImGuiWindow* ImGui::GetTopMostPopupModal() +{ + ImGuiContext& g = *GImGui; + for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) + if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) + if (popup->Flags & ImGuiWindowFlags_Modal) + return popup; + return NULL; +} + +ImGuiWindow* ImGui::GetTopMostAndVisiblePopupModal() +{ + ImGuiContext& g = *GImGui; + for (int n = g.OpenPopupStack.Size - 1; n >= 0; n--) + if (ImGuiWindow* popup = g.OpenPopupStack.Data[n].Window) + if ((popup->Flags & ImGuiWindowFlags_Modal) && IsWindowActiveAndVisible(popup)) + return popup; + return NULL; +} + +void ImGui::OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiID id = g.CurrentWindow->GetID(str_id); + IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopup(\"%s\" -> 0x%08X)\n", str_id, id); + OpenPopupEx(id, popup_flags); +} + +void ImGui::OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + OpenPopupEx(id, popup_flags); +} + +// Mark popup as open (toggle toward open state). +// Popups are closed when user click outside, or activate a pressable item, or CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. +// Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level). +// One open popup per level of the popup hierarchy (NB: when assigning we reset the Window member of ImGuiPopupRef to NULL) +void ImGui::OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* parent_window = g.CurrentWindow; + const int current_stack_size = g.BeginPopupStack.Size; + + if (popup_flags & ImGuiPopupFlags_NoOpenOverExistingPopup) + if (IsPopupOpen((ImGuiID)0, ImGuiPopupFlags_AnyPopupId)) + return; + + ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack. + popup_ref.PopupId = id; + popup_ref.Window = NULL; + popup_ref.BackupNavWindow = g.NavWindow; // When popup closes focus may be restored to NavWindow (depend on window type). + popup_ref.OpenFrameCount = g.FrameCount; + popup_ref.OpenParentId = parent_window->IDStack.back(); + popup_ref.OpenPopupPos = NavCalcPreferredRefPos(); + popup_ref.OpenMousePos = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : popup_ref.OpenPopupPos; + + IMGUI_DEBUG_LOG_POPUP("[popup] OpenPopupEx(0x%08X)\n", id); + if (g.OpenPopupStack.Size < current_stack_size + 1) + { + g.OpenPopupStack.push_back(popup_ref); + } + else + { + // Gently handle the user mistakenly calling OpenPopup() every frame. It is a programming mistake! However, if we were to run the regular code path, the ui + // would become completely unusable because the popup will always be in hidden-while-calculating-size state _while_ claiming focus. Which would be a very confusing + // situation for the programmer. Instead, we silently allow the popup to proceed, it will keep reappearing and the programming error will be more obvious to understand. + if (g.OpenPopupStack[current_stack_size].PopupId == id && g.OpenPopupStack[current_stack_size].OpenFrameCount == g.FrameCount - 1) + { + g.OpenPopupStack[current_stack_size].OpenFrameCount = popup_ref.OpenFrameCount; + } + else + { + // Close child popups if any, then flag popup for open/reopen + ClosePopupToLevel(current_stack_size, false); + g.OpenPopupStack.push_back(popup_ref); + } + + // When reopening a popup we first refocus its parent, otherwise if its parent is itself a popup it would get closed by ClosePopupsOverWindow(). + // This is equivalent to what ClosePopupToLevel() does. + //if (g.OpenPopupStack[current_stack_size].PopupId == id) + // FocusWindow(parent_window); + } +} + +// When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it. +// This function closes any popups that are over 'ref_window'. +void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size == 0) + return; + + // Don't close our own child popup windows. + int popup_count_to_keep = 0; + if (ref_window) + { + // Find the highest popup which is a descendant of the reference window (generally reference window = NavWindow) + for (; popup_count_to_keep < g.OpenPopupStack.Size; popup_count_to_keep++) + { + ImGuiPopupData& popup = g.OpenPopupStack[popup_count_to_keep]; + if (!popup.Window) + continue; + IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0); + if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow) + continue; + + // Trim the stack unless the popup is a direct parent of the reference window (the reference window is often the NavWindow) + // - With this stack of window, clicking/focusing Popup1 will close Popup2 and Popup3: + // Window -> Popup1 -> Popup2 -> Popup3 + // - Each popups may contain child windows, which is why we compare ->RootWindow! + // Window -> Popup1 -> Popup1_Child -> Popup2 -> Popup2_Child + bool ref_window_is_descendent_of_popup = false; + for (int n = popup_count_to_keep; n < g.OpenPopupStack.Size; n++) + if (ImGuiWindow* popup_window = g.OpenPopupStack[n].Window) + if (IsWindowWithinBeginStackOf(ref_window, popup_window)) + { + ref_window_is_descendent_of_popup = true; + break; + } + if (!ref_window_is_descendent_of_popup) + break; + } + } + if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below + { + IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupsOverWindow(\"%s\")\n", ref_window ? ref_window->Name : ""); + ClosePopupToLevel(popup_count_to_keep, restore_focus_to_window_under_popup); + } +} + +void ImGui::ClosePopupsExceptModals() +{ + ImGuiContext& g = *GImGui; + + int popup_count_to_keep; + for (popup_count_to_keep = g.OpenPopupStack.Size; popup_count_to_keep > 0; popup_count_to_keep--) + { + ImGuiWindow* window = g.OpenPopupStack[popup_count_to_keep - 1].Window; + if (!window || window->Flags & ImGuiWindowFlags_Modal) + break; + } + if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below + ClosePopupToLevel(popup_count_to_keep, true); +} + +void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup) +{ + ImGuiContext& g = *GImGui; + IMGUI_DEBUG_LOG_POPUP("[popup] ClosePopupToLevel(%d), restore_focus_to_window_under_popup=%d\n", remaining, restore_focus_to_window_under_popup); + IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size); + + // Trim open popup stack + ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window; + ImGuiWindow* popup_backup_nav_window = g.OpenPopupStack[remaining].BackupNavWindow; + g.OpenPopupStack.resize(remaining); + + if (restore_focus_to_window_under_popup) + { + ImGuiWindow* focus_window = (popup_window && popup_window->Flags & ImGuiWindowFlags_ChildMenu) ? popup_window->ParentWindow : popup_backup_nav_window; + if (focus_window && !focus_window->WasActive && popup_window) + { + // Fallback + FocusTopMostWindowUnderOne(popup_window, NULL); + } + else + { + if (g.NavLayer == ImGuiNavLayer_Main && focus_window) + focus_window = NavRestoreLastChildNavWindow(focus_window); + FocusWindow(focus_window); + } + } +} + +// Close the popup we have begin-ed into. +void ImGui::CloseCurrentPopup() +{ + ImGuiContext& g = *GImGui; + int popup_idx = g.BeginPopupStack.Size - 1; + if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.BeginPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId) + return; + + // Closing a menu closes its top-most parent popup (unless a modal) + while (popup_idx > 0) + { + ImGuiWindow* popup_window = g.OpenPopupStack[popup_idx].Window; + ImGuiWindow* parent_popup_window = g.OpenPopupStack[popup_idx - 1].Window; + bool close_parent = false; + if (popup_window && (popup_window->Flags & ImGuiWindowFlags_ChildMenu)) + if (parent_popup_window && !(parent_popup_window->Flags & ImGuiWindowFlags_MenuBar)) + close_parent = true; + if (!close_parent) + break; + popup_idx--; + } + IMGUI_DEBUG_LOG_POPUP("[popup] CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx); + ClosePopupToLevel(popup_idx, true); + + // A common pattern is to close a popup when selecting a menu item/selectable that will open another window. + // To improve this usage pattern, we avoid nav highlight for a single frame in the parent window. + // Similarly, we could avoid mouse hover highlight in this window but it is less visually problematic. + if (ImGuiWindow* window = g.NavWindow) + window->DC.NavHideHighlightOneFrame = true; +} + +// Attention! BeginPopup() adds default flags which BeginPopupEx()! +bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + char name[20]; + if (flags & ImGuiWindowFlags_ChildMenu) + ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginMenuCount); // Recycle windows based on depth + else + ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame + + flags |= ImGuiWindowFlags_Popup; + bool is_open = Begin(name, NULL, flags); + if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display) + EndPopup(); + + return is_open; +} + +bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + flags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings; + ImGuiID id = g.CurrentWindow->GetID(str_id); + return BeginPopupEx(id, flags); +} + +// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup. +// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here. +bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = window->GetID(name); + if (!IsPopupOpen(id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + return false; + } + + // Center modal windows by default for increased visibility + // (this won't really last as settings will kick in, and is mostly for backward compatibility. user may do the same themselves) + // FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window. + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0) + { + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_FirstUseEver, ImVec2(0.5f, 0.5f)); + } + + flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse; + const bool is_open = Begin(name, p_open, flags); + if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + { + EndPopup(); + if (is_open) + ClosePopupToLevel(g.BeginPopupStack.Size, true); + return false; + } + return is_open; +} + +void ImGui::EndPopup() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls + IM_ASSERT(g.BeginPopupStack.Size > 0); + + // Make all menus and popups wrap around for now, may need to expose that policy (e.g. focus scope could include wrap/loop policy flags used by new move requests) + if (g.NavWindow == window) + NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY); + + // Child-popups don't need to be laid out + IM_ASSERT(g.WithinEndChild == false); + if (window->Flags & ImGuiWindowFlags_ChildWindow) + g.WithinEndChild = true; + End(); + g.WithinEndChild = false; +} + +// Helper to open a popup if mouse button is released over the item +// - This is essentially the same as BeginPopupContextItem() but without the trailing BeginPopup() +void ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + { + ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! + IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + OpenPopupEx(id, popup_flags); + } +} + +// This is a helper to handle the simplest case of associating one named popup to one given widget. +// - To create a popup associated to the last item, you generally want to pass a NULL value to str_id. +// - To create a popup with a specific identifier, pass it in str_id. +// - This is useful when using using BeginPopupContextItem() on an item which doesn't have an identifier, e.g. a Text() call. +// - This is useful when multiple code locations may want to manipulate/open the same popup, given an explicit id. +// - You may want to handle the whole on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters). +// This is essentially the same as: +// id = str_id ? GetID(str_id) : GetItemID(); +// OpenPopupOnItemClick(str_id, ImGuiPopupFlags_MouseButtonRight); +// return BeginPopup(id); +// Which is essentially the same as: +// id = str_id ? GetID(str_id) : GetItemID(); +// if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) +// OpenPopup(id); +// return BeginPopup(id); +// The main difference being that this is tweaked to avoid computing the ID twice. +bool ImGui::BeginPopupContextItem(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + ImGuiID id = str_id ? window->GetID(str_id) : g.LastItemData.ID; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict! + IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item) + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +bool ImGui::BeginPopupContextWindow(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!str_id) + str_id = "window_context"; + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + if (!(popup_flags & ImGuiPopupFlags_NoOpenOverItems) || !IsAnyItemHovered()) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +bool ImGui::BeginPopupContextVoid(const char* str_id, ImGuiPopupFlags popup_flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (!str_id) + str_id = "void_context"; + ImGuiID id = window->GetID(str_id); + int mouse_button = (popup_flags & ImGuiPopupFlags_MouseButtonMask_); + if (IsMouseReleased(mouse_button) && !IsWindowHovered(ImGuiHoveredFlags_AnyWindow)) + if (GetTopMostPopupModal() == NULL) + OpenPopupEx(id, popup_flags); + return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings); +} + +// r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.) +// r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it. +// (r_outer is usually equivalent to the viewport rectangle minus padding, but when multi-viewports are enabled and monitor +// information are available, it may represent the entire platform monitor from the frame of reference of the current viewport. +// this allows us to have tooltips/popups displayed out of the parent viewport.) +ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy) +{ + ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size); + //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255)); + //GetForegroundDrawList()->AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255)); + + // Combo Box policy (we want a connecting edge) + if (policy == ImGuiPopupPositionPolicy_ComboBox) + { + const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Down, ImGuiDir_Right, ImGuiDir_Left, ImGuiDir_Up }; + for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + { + const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; + if (n != -1 && dir == *last_dir) // Already tried this direction? + continue; + ImVec2 pos; + if (dir == ImGuiDir_Down) pos = ImVec2(r_avoid.Min.x, r_avoid.Max.y); // Below, Toward Right (default) + if (dir == ImGuiDir_Right) pos = ImVec2(r_avoid.Min.x, r_avoid.Min.y - size.y); // Above, Toward Right + if (dir == ImGuiDir_Left) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Max.y); // Below, Toward Left + if (dir == ImGuiDir_Up) pos = ImVec2(r_avoid.Max.x - size.x, r_avoid.Min.y - size.y); // Above, Toward Left + if (!r_outer.Contains(ImRect(pos, pos + size))) + continue; + *last_dir = dir; + return pos; + } + } + + // Tooltip and Default popup policy + // (Always first try the direction we used on the last frame, if any) + if (policy == ImGuiPopupPositionPolicy_Tooltip || policy == ImGuiPopupPositionPolicy_Default) + { + const ImGuiDir dir_prefered_order[ImGuiDir_COUNT] = { ImGuiDir_Right, ImGuiDir_Down, ImGuiDir_Up, ImGuiDir_Left }; + for (int n = (*last_dir != ImGuiDir_None) ? -1 : 0; n < ImGuiDir_COUNT; n++) + { + const ImGuiDir dir = (n == -1) ? *last_dir : dir_prefered_order[n]; + if (n != -1 && dir == *last_dir) // Already tried this direction? + continue; + + const float avail_w = (dir == ImGuiDir_Left ? r_avoid.Min.x : r_outer.Max.x) - (dir == ImGuiDir_Right ? r_avoid.Max.x : r_outer.Min.x); + const float avail_h = (dir == ImGuiDir_Up ? r_avoid.Min.y : r_outer.Max.y) - (dir == ImGuiDir_Down ? r_avoid.Max.y : r_outer.Min.y); + + // If there's not enough room on one axis, there's no point in positioning on a side on this axis (e.g. when not enough width, use a top/bottom position to maximize available width) + if (avail_w < size.x && (dir == ImGuiDir_Left || dir == ImGuiDir_Right)) + continue; + if (avail_h < size.y && (dir == ImGuiDir_Up || dir == ImGuiDir_Down)) + continue; + + ImVec2 pos; + pos.x = (dir == ImGuiDir_Left) ? r_avoid.Min.x - size.x : (dir == ImGuiDir_Right) ? r_avoid.Max.x : base_pos_clamped.x; + pos.y = (dir == ImGuiDir_Up) ? r_avoid.Min.y - size.y : (dir == ImGuiDir_Down) ? r_avoid.Max.y : base_pos_clamped.y; + + // Clamp top-left corner of popup + pos.x = ImMax(pos.x, r_outer.Min.x); + pos.y = ImMax(pos.y, r_outer.Min.y); + + *last_dir = dir; + return pos; + } + } + + // Fallback when not enough room: + *last_dir = ImGuiDir_None; + + // For tooltip we prefer avoiding the cursor at all cost even if it means that part of the tooltip won't be visible. + if (policy == ImGuiPopupPositionPolicy_Tooltip) + return ref_pos + ImVec2(2, 2); + + // Otherwise try to keep within display + ImVec2 pos = ref_pos; + pos.x = ImMax(ImMin(pos.x + size.x, r_outer.Max.x) - size.x, r_outer.Min.x); + pos.y = ImMax(ImMin(pos.y + size.y, r_outer.Max.y) - size.y, r_outer.Min.y); + return pos; +} + +// Note that this is used for popups, which can overlap the non work-area of individual viewports. +ImRect ImGui::GetPopupAllowedExtentRect(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_UNUSED(window); + ImRect r_screen = ((ImGuiViewportP*)(void*)GetMainViewport())->GetMainRect(); + ImVec2 padding = g.Style.DisplaySafeAreaPadding; + r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f)); + return r_screen; +} + +ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + + ImRect r_outer = GetPopupAllowedExtentRect(window); + if (window->Flags & ImGuiWindowFlags_ChildMenu) + { + // Child menus typically request _any_ position within the parent menu item, and then we move the new menu outside the parent bounds. + // This is how we end up with child menus appearing (most-commonly) on the right of the parent menu. + IM_ASSERT(g.CurrentWindow == window); + ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.Size - 2].Window; + float horizontal_overlap = g.Style.ItemInnerSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x). + ImRect r_avoid; + if (parent_window->DC.MenuBarAppending) + r_avoid = ImRect(-FLT_MAX, parent_window->ClipRect.Min.y, FLT_MAX, parent_window->ClipRect.Max.y); // Avoid parent menu-bar. If we wanted multi-line menu-bar, we may instead want to have the calling window setup e.g. a NextWindowData.PosConstraintAvoidRect field + else + r_avoid = ImRect(parent_window->Pos.x + horizontal_overlap, -FLT_MAX, parent_window->Pos.x + parent_window->Size.x - horizontal_overlap - parent_window->ScrollbarSizes.x, FLT_MAX); + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Default); + } + if (window->Flags & ImGuiWindowFlags_Popup) + { + return FindBestWindowPosForPopupEx(window->Pos, window->Size, &window->AutoPosLastDirection, r_outer, ImRect(window->Pos, window->Pos), ImGuiPopupPositionPolicy_Default); // Ideally we'd disable r_avoid here + } + if (window->Flags & ImGuiWindowFlags_Tooltip) + { + // Position tooltip (always follows mouse) + float sc = g.Style.MouseCursorScale; + ImVec2 ref_pos = NavCalcPreferredRefPos(); + ImRect r_avoid; + if (!g.NavDisableHighlight && g.NavDisableMouseHover && !(g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos)) + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 16, ref_pos.y + 8); + else + r_avoid = ImRect(ref_pos.x - 16, ref_pos.y - 8, ref_pos.x + 24 * sc, ref_pos.y + 24 * sc); // FIXME: Hard-coded based on mouse cursor shape expectation. Exact dimension not very important. + return FindBestWindowPosForPopupEx(ref_pos, window->Size, &window->AutoPosLastDirection, r_outer, r_avoid, ImGuiPopupPositionPolicy_Tooltip); + } + IM_ASSERT(0); + return window->Pos; +} + +//----------------------------------------------------------------------------- +// [SECTION] KEYBOARD/GAMEPAD NAVIGATION +//----------------------------------------------------------------------------- + +// FIXME-NAV: The existence of SetNavID vs SetFocusID vs FocusWindow() needs to be clarified/reworked. +// In our terminology those should be interchangeable, yet right now this is super confusing. +// Those two functions are merely a legacy artifact, so at minimum naming should be clarified. + +void ImGui::SetNavWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (g.NavWindow != window) + { + IMGUI_DEBUG_LOG_FOCUS("[focus] SetNavWindow(\"%s\")\n", window ? window->Name : ""); + g.NavWindow = window; + } + g.NavInitRequest = g.NavMoveSubmitted = g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); +} + +void ImGui::SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindow != NULL); + IM_ASSERT(nav_layer == ImGuiNavLayer_Main || nav_layer == ImGuiNavLayer_Menu); + g.NavId = id; + g.NavLayer = nav_layer; + g.NavFocusScopeId = focus_scope_id; + g.NavWindow->NavLastIds[nav_layer] = id; + g.NavWindow->NavRectRel[nav_layer] = rect_rel; +} + +void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(id != 0); + + if (g.NavWindow != window) + SetNavWindow(window); + + // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and g.CurrentFocusScopeId are valid. + // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text) + const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent; + g.NavId = id; + g.NavLayer = nav_layer; + g.NavFocusScopeId = g.CurrentFocusScopeId; + window->NavLastIds[nav_layer] = id; + if (g.LastItemData.ID == id) + window->NavRectRel[nav_layer] = WindowRectAbsToRel(window, g.LastItemData.NavRect); + + if (g.ActiveIdSource == ImGuiInputSource_Nav) + g.NavDisableMouseHover = true; + else + g.NavDisableHighlight = true; +} + +ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy) +{ + if (ImFabs(dx) > ImFabs(dy)) + return (dx > 0.0f) ? ImGuiDir_Right : ImGuiDir_Left; + return (dy > 0.0f) ? ImGuiDir_Down : ImGuiDir_Up; +} + +static float inline NavScoreItemDistInterval(float a0, float a1, float b0, float b1) +{ + if (a1 < b0) + return a1 - b0; + if (b1 < a0) + return a0 - b1; + return 0.0f; +} + +static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect& r, const ImRect& clip_rect) +{ + if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) + { + r.Min.y = ImClamp(r.Min.y, clip_rect.Min.y, clip_rect.Max.y); + r.Max.y = ImClamp(r.Max.y, clip_rect.Min.y, clip_rect.Max.y); + } + else // FIXME: PageUp/PageDown are leaving move_dir == None + { + r.Min.x = ImClamp(r.Min.x, clip_rect.Min.x, clip_rect.Max.x); + r.Max.x = ImClamp(r.Max.x, clip_rect.Min.x, clip_rect.Max.x); + } +} + +// Scoring function for gamepad/keyboard directional navigation. Based on https://gist.github.com/rygorous/6981057 +static bool ImGui::NavScoreItem(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (g.NavLayer != window->DC.NavLayerCurrent) + return false; + + // FIXME: Those are not good variables names + ImRect cand = g.LastItemData.NavRect; // Current item nav rectangle + const ImRect curr = g.NavScoringRect; // Current modified source rect (NB: we've applied Max.x = Min.x in NavUpdate() to inhibit the effect of having varied item width) + g.NavScoringDebugCount++; + + // When entering through a NavFlattened border, we consider child window items as fully clipped for scoring + if (window->ParentWindow == g.NavWindow) + { + IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened); + if (!window->ClipRect.Overlaps(cand)) + return false; + cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window + } + + // We perform scoring on items bounding box clipped by the current clipping rectangle on the other axis (clipping on our movement axis would give us equal scores for all clipped items) + // For example, this ensures that items in one column are not reached when moving vertically from items in another column. + NavClampRectToVisibleAreaForMoveDir(g.NavMoveClipDir, cand, window->ClipRect); + + // Compute distance between boxes + // FIXME-NAV: Introducing biases for vertical navigation, needs to be removed. + float dbx = NavScoreItemDistInterval(cand.Min.x, cand.Max.x, curr.Min.x, curr.Max.x); + float dby = NavScoreItemDistInterval(ImLerp(cand.Min.y, cand.Max.y, 0.2f), ImLerp(cand.Min.y, cand.Max.y, 0.8f), ImLerp(curr.Min.y, curr.Max.y, 0.2f), ImLerp(curr.Min.y, curr.Max.y, 0.8f)); // Scale down on Y to keep using box-distance for vertically touching items + if (dby != 0.0f && dbx != 0.0f) + dbx = (dbx / 1000.0f) + ((dbx > 0.0f) ? +1.0f : -1.0f); + float dist_box = ImFabs(dbx) + ImFabs(dby); + + // Compute distance between centers (this is off by a factor of 2, but we only compare center distances with each other so it doesn't matter) + float dcx = (cand.Min.x + cand.Max.x) - (curr.Min.x + curr.Max.x); + float dcy = (cand.Min.y + cand.Max.y) - (curr.Min.y + curr.Max.y); + float dist_center = ImFabs(dcx) + ImFabs(dcy); // L1 metric (need this for our connectedness guarantee) + + // Determine which quadrant of 'curr' our candidate item 'cand' lies in based on distance + ImGuiDir quadrant; + float dax = 0.0f, day = 0.0f, dist_axial = 0.0f; + if (dbx != 0.0f || dby != 0.0f) + { + // For non-overlapping boxes, use distance between boxes + dax = dbx; + day = dby; + dist_axial = dist_box; + quadrant = ImGetDirQuadrantFromDelta(dbx, dby); + } + else if (dcx != 0.0f || dcy != 0.0f) + { + // For overlapping boxes with different centers, use distance between centers + dax = dcx; + day = dcy; + dist_axial = dist_center; + quadrant = ImGetDirQuadrantFromDelta(dcx, dcy); + } + else + { + // Degenerate case: two overlapping buttons with same center, break ties arbitrarily (note that LastItemId here is really the _previous_ item order, but it doesn't matter) + quadrant = (g.LastItemData.ID < g.NavId) ? ImGuiDir_Left : ImGuiDir_Right; + } + +#if IMGUI_DEBUG_NAV_SCORING + char buf[128]; + if (IsMouseHoveringRect(cand.Min, cand.Max)) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]); + ImDrawList* draw_list = GetForegroundDrawList(window); + draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100)); + draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200)); + draw_list->AddRectFilled(cand.Max - ImVec2(4, 4), cand.Max + CalcTextSize(buf) + ImVec2(4, 4), IM_COL32(40,0,0,150)); + draw_list->AddText(cand.Max, ~0U, buf); + } + else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate. + { + if (quadrant == g.NavMoveDir) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center); + ImDrawList* draw_list = GetForegroundDrawList(window); + draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200)); + draw_list->AddText(cand.Min, IM_COL32(255, 255, 255, 255), buf); + } + } +#endif + + // Is it in the quadrant we're interested in moving to? + bool new_best = false; + const ImGuiDir move_dir = g.NavMoveDir; + if (quadrant == move_dir) + { + // Does it beat the current best candidate? + if (dist_box < result->DistBox) + { + result->DistBox = dist_box; + result->DistCenter = dist_center; + return true; + } + if (dist_box == result->DistBox) + { + // Try using distance between center points to break ties + if (dist_center < result->DistCenter) + { + result->DistCenter = dist_center; + new_best = true; + } + else if (dist_center == result->DistCenter) + { + // Still tied! we need to be extra-careful to make sure everything gets linked properly. We consistently break ties by symbolically moving "later" items + // (with higher index) to the right/downwards by an infinitesimal amount since we the current "best" button already (so it must have a lower index), + // this is fairly easy. This rule ensures that all buttons with dx==dy==0 will end up being linked in order of appearance along the x axis. + if (((move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) ? dby : dbx) < 0.0f) // moving bj to the right/down decreases distance + new_best = true; + } + } + } + + // Axial check: if 'curr' has no link at all in some direction and 'cand' lies roughly in that direction, add a tentative link. This will only be kept if no "real" matches + // are found, so it only augments the graph produced by the above method using extra links. (important, since it doesn't guarantee strong connectedness) + // This is just to avoid buttons having no links in a particular direction when there's a suitable neighbor. you get good graphs without this too. + // 2017/09/29: FIXME: This now currently only enabled inside menu bars, ideally we'd disable it everywhere. Menus in particular need to catch failure. For general navigation it feels awkward. + // Disabling it may lead to disconnected graphs when nodes are very spaced out on different axis. Perhaps consider offering this as an option? + if (result->DistBox == FLT_MAX && dist_axial < result->DistAxial) // Check axial match + if (g.NavLayer == ImGuiNavLayer_Menu && !(g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) + if ((move_dir == ImGuiDir_Left && dax < 0.0f) || (move_dir == ImGuiDir_Right && dax > 0.0f) || (move_dir == ImGuiDir_Up && day < 0.0f) || (move_dir == ImGuiDir_Down && day > 0.0f)) + { + result->DistAxial = dist_axial; + new_best = true; + } + + return new_best; +} + +static void ImGui::NavApplyItemToResult(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + result->Window = window; + result->ID = g.LastItemData.ID; + result->FocusScopeId = g.CurrentFocusScopeId; + result->InFlags = g.LastItemData.InFlags; + result->RectRel = WindowRectAbsToRel(window, g.LastItemData.NavRect); +} + +// We get there when either NavId == id, or when g.NavAnyRequest is set (which is updated by NavUpdateAnyRequestFlag above) +// This is called after LastItemData is set. +static void ImGui::NavProcessItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = g.LastItemData.ID; + const ImRect nav_bb = g.LastItemData.NavRect; + const ImGuiItemFlags item_flags = g.LastItemData.InFlags; + + // Process Init Request + if (g.NavInitRequest && g.NavLayer == window->DC.NavLayerCurrent && (item_flags & ImGuiItemFlags_Disabled) == 0) + { + // Even if 'ImGuiItemFlags_NoNavDefaultFocus' is on (typically collapse/close button) we record the first ResultId so they can be used as a fallback + const bool candidate_for_nav_default_focus = (item_flags & ImGuiItemFlags_NoNavDefaultFocus) == 0; + if (candidate_for_nav_default_focus || g.NavInitResultId == 0) + { + g.NavInitResultId = id; + g.NavInitResultRectRel = WindowRectAbsToRel(window, nav_bb); + } + if (candidate_for_nav_default_focus) + { + g.NavInitRequest = false; // Found a match, clear request + NavUpdateAnyRequestFlag(); + } + } + + // Process Move Request (scoring for navigation) + // FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRect + scoring from a rect wrapped according to current wrapping policy) + if (g.NavMoveScoringItems && (item_flags & ImGuiItemFlags_Disabled) == 0) + { + const bool is_tabbing = (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) != 0; + if (is_tabbing) + { + NavProcessItemForTabbingRequest(id, item_flags, g.NavMoveFlags); + } + else if (g.NavId != id || (g.NavMoveFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) + { + ImGuiNavItemData* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther; + if (NavScoreItem(result)) + NavApplyItemToResult(result); + + // Features like PageUp/PageDown need to maintain a separate score for the visible set of items. + const float VISIBLE_RATIO = 0.70f; + if ((g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb)) + if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO) + if (NavScoreItem(&g.NavMoveResultLocalVisible)) + NavApplyItemToResult(&g.NavMoveResultLocalVisible); + } + } + + // Update window-relative bounding box of navigated item + if (g.NavId == id) + { + if (g.NavWindow != window) + SetNavWindow(window); // Always refresh g.NavWindow, because some operations such as FocusItem() may not have a window. + g.NavLayer = window->DC.NavLayerCurrent; + g.NavFocusScopeId = g.CurrentFocusScopeId; + g.NavIdIsAlive = true; + window->NavRectRel[window->DC.NavLayerCurrent] = WindowRectAbsToRel(window, nav_bb); // Store item bounding box (relative to window position) + } +} + +// Handle "scoring" of an item for a tabbing/focusing request initiated by NavUpdateCreateTabbingRequest(). +// Note that SetKeyboardFocusHere() API calls are considered tabbing requests! +// - Case 1: no nav/active id: set result to first eligible item, stop storing. +// - Case 2: tab forward: on ref id set counter, on counter elapse store result +// - Case 3: tab forward wrap: set result to first eligible item (preemptively), on ref id set counter, on next frame if counter hasn't elapsed store result. // FIXME-TABBING: Could be done as a next-frame forwarded request +// - Case 4: tab backward: store all results, on ref id pick prev, stop storing +// - Case 5: tab backward wrap: store all results, on ref id if no result keep storing until last // FIXME-TABBING: Could be done as next-frame forwarded requested +void ImGui::NavProcessItemForTabbingRequest(ImGuiID id, ImGuiItemFlags item_flags, ImGuiNavMoveFlags move_flags) +{ + ImGuiContext& g = *GImGui; + + if ((move_flags & ImGuiNavMoveFlags_FocusApi) == 0) + if (g.NavLayer != g.CurrentWindow->DC.NavLayerCurrent) + return; + + // - Can always land on an item when using API call. + // - Tabbing with _NavEnableKeyboard (space/enter/arrows): goes through every item. + // - Tabbing without _NavEnableKeyboard: goes through inputable items only. + bool can_stop; + if (move_flags & ImGuiNavMoveFlags_FocusApi) + can_stop = true; + else + can_stop = (item_flags & ImGuiItemFlags_NoTabStop) == 0 && ((g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) || (item_flags & ImGuiItemFlags_Inputable)); + + // Always store in NavMoveResultLocal (unlike directional request which uses NavMoveResultOther on sibling/flattened windows) + ImGuiNavItemData* result = &g.NavMoveResultLocal; + if (g.NavTabbingDir == +1) + { + // Tab Forward or SetKeyboardFocusHere() with >= 0 + if (can_stop && g.NavTabbingResultFirst.ID == 0) + NavApplyItemToResult(&g.NavTabbingResultFirst); + if (can_stop && g.NavTabbingCounter > 0 && --g.NavTabbingCounter == 0) + NavMoveRequestResolveWithLastItem(result); + else if (g.NavId == id) + g.NavTabbingCounter = 1; + } + else if (g.NavTabbingDir == -1) + { + // Tab Backward + if (g.NavId == id) + { + if (result->ID) + { + g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); + } + } + else if (can_stop) + { + // Keep applying until reaching NavId + NavApplyItemToResult(result); + } + } + else if (g.NavTabbingDir == 0) + { + if (can_stop && g.NavId == id) + NavMoveRequestResolveWithLastItem(result); + if (can_stop && g.NavTabbingResultFirst.ID == 0) // Tab init + NavApplyItemToResult(&g.NavTabbingResultFirst); + } +} + +bool ImGui::NavMoveRequestButNoResultYet() +{ + ImGuiContext& g = *GImGui; + return g.NavMoveScoringItems && g.NavMoveResultLocal.ID == 0 && g.NavMoveResultOther.ID == 0; +} + +// FIXME: ScoringRect is not set +void ImGui::NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindow != NULL); + + if (move_flags & ImGuiNavMoveFlags_Tabbing) + move_flags |= ImGuiNavMoveFlags_AllowCurrentNavId; + + g.NavMoveSubmitted = g.NavMoveScoringItems = true; + g.NavMoveDir = move_dir; + g.NavMoveDirForDebug = move_dir; + g.NavMoveClipDir = clip_dir; + g.NavMoveFlags = move_flags; + g.NavMoveScrollFlags = scroll_flags; + g.NavMoveForwardToNextFrame = false; + g.NavMoveKeyMods = g.IO.KeyMods; + g.NavMoveResultLocal.Clear(); + g.NavMoveResultLocalVisible.Clear(); + g.NavMoveResultOther.Clear(); + g.NavTabbingCounter = 0; + g.NavTabbingResultFirst.Clear(); + NavUpdateAnyRequestFlag(); +} + +void ImGui::NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result) +{ + ImGuiContext& g = *GImGui; + g.NavMoveScoringItems = false; // Ensure request doesn't need more processing + NavApplyItemToResult(result); + NavUpdateAnyRequestFlag(); +} + +void ImGui::NavMoveRequestCancel() +{ + ImGuiContext& g = *GImGui; + g.NavMoveSubmitted = g.NavMoveScoringItems = false; + NavUpdateAnyRequestFlag(); +} + +// Forward will reuse the move request again on the next frame (generally with modifications done to it) +void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavMoveForwardToNextFrame == false); + NavMoveRequestCancel(); + g.NavMoveForwardToNextFrame = true; + g.NavMoveDir = move_dir; + g.NavMoveClipDir = clip_dir; + g.NavMoveFlags = move_flags | ImGuiNavMoveFlags_Forwarded; + g.NavMoveScrollFlags = scroll_flags; +} + +// Navigation wrap-around logic is delayed to the end of the frame because this operation is only valid after entire +// popup is assembled and in case of appended popups it is not clear which EndPopup() call is final. +void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags wrap_flags) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(wrap_flags != 0); // Call with _WrapX, _WrapY, _LoopX, _LoopY + // In theory we should test for NavMoveRequestButNoResultYet() but there's no point doing it, NavEndFrame() will do the same test + if (g.NavWindow == window && g.NavMoveScoringItems && g.NavLayer == ImGuiNavLayer_Main) + g.NavMoveFlags |= wrap_flags; +} + +// FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0). +// This way we could find the last focused window among our children. It would be much less confusing this way? +static void ImGui::NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window) +{ + ImGuiWindow* parent = nav_window; + while (parent && parent->RootWindow != parent && (parent->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) + parent = parent->ParentWindow; + if (parent && parent != nav_window) + parent->NavLastChildNavWindow = nav_window; +} + +// Restore the last focused child. +// Call when we are expected to land on the Main Layer (0) after FocusWindow() +static ImGuiWindow* ImGui::NavRestoreLastChildNavWindow(ImGuiWindow* window) +{ + if (window->NavLastChildNavWindow && window->NavLastChildNavWindow->WasActive) + return window->NavLastChildNavWindow; + return window; +} + +void ImGui::NavRestoreLayer(ImGuiNavLayer layer) +{ + ImGuiContext& g = *GImGui; + if (layer == ImGuiNavLayer_Main) + { + ImGuiWindow* prev_nav_window = g.NavWindow; + g.NavWindow = NavRestoreLastChildNavWindow(g.NavWindow); // FIXME-NAV: Should clear ongoing nav requests? + if (prev_nav_window) + IMGUI_DEBUG_LOG_FOCUS("[focus] NavRestoreLayer: from \"%s\" to SetNavWindow(\"%s\")\n", prev_nav_window->Name, g.NavWindow->Name); + } + ImGuiWindow* window = g.NavWindow; + if (window->NavLastIds[layer] != 0) + { + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); + } + else + { + g.NavLayer = layer; + NavInitWindow(window, true); + } +} + +void ImGui::NavRestoreHighlightAfterMove() +{ + ImGuiContext& g = *GImGui; + g.NavDisableHighlight = false; + g.NavDisableMouseHover = g.NavMousePosDirty = true; +} + +static inline void ImGui::NavUpdateAnyRequestFlag() +{ + ImGuiContext& g = *GImGui; + g.NavAnyRequest = g.NavMoveScoringItems || g.NavInitRequest || (IMGUI_DEBUG_NAV_SCORING && g.NavWindow != NULL); + if (g.NavAnyRequest) + IM_ASSERT(g.NavWindow != NULL); +} + +// This needs to be called before we submit any widget (aka in or before Begin) +void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(window == g.NavWindow); + + if (window->Flags & ImGuiWindowFlags_NoNavInputs) + { + g.NavId = 0; + g.NavFocusScopeId = window->NavRootFocusScopeId; + return; + } + + bool init_for_nav = false; + if (window == window->RootWindow || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit) + init_for_nav = true; + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from NavInitWindow(), init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer); + if (init_for_nav) + { + SetNavID(0, g.NavLayer, window->NavRootFocusScopeId, ImRect()); + g.NavInitRequest = true; + g.NavInitRequestFromMove = false; + g.NavInitResultId = 0; + g.NavInitResultRectRel = ImRect(); + NavUpdateAnyRequestFlag(); + } + else + { + g.NavId = window->NavLastIds[0]; + g.NavFocusScopeId = window->NavRootFocusScopeId; + } +} + +static ImVec2 ImGui::NavCalcPreferredRefPos() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + if (g.NavDisableHighlight || !g.NavDisableMouseHover || !window) + { + // Mouse (we need a fallback in case the mouse becomes invalid after being used) + // The +1.0f offset when stored by OpenPopupEx() allows reopening this or another popup (same or another mouse button) while not moving the mouse, it is pretty standard. + // In theory we could move that +1.0f offset in OpenPopupEx() + ImVec2 p = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : g.MouseLastValidPos; + return ImVec2(p.x + 1.0f, p.y); + } + else + { + // When navigation is active and mouse is disabled, pick a position around the bottom left of the currently navigated item + // Take account of upcoming scrolling (maybe set mouse pos should be done in EndFrame?) + ImRect rect_rel = WindowRectRelToAbs(window, window->NavRectRel[g.NavLayer]); + if (window->LastFrameActive != g.FrameCount && (window->ScrollTarget.x != FLT_MAX || window->ScrollTarget.y != FLT_MAX)) + { + ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window); + rect_rel.Translate(window->Scroll - next_scroll); + } + ImVec2 pos = ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight())); + ImGuiViewport* viewport = GetMainViewport(); + return ImFloor(ImClamp(pos, viewport->Pos, viewport->Pos + viewport->Size)); // ImFloor() is important because non-integer mouse position application in backend might be lossy and result in undesirable non-zero delta. + } +} + +float ImGui::GetNavTweakPressedAmount(ImGuiAxis axis) +{ + ImGuiContext& g = *GImGui; + float repeat_delay, repeat_rate; + GetTypematicRepeatRate(ImGuiInputFlags_RepeatRateNavTweak, &repeat_delay, &repeat_rate); + + ImGuiKey key_less, key_more; + if (g.NavInputSource == ImGuiInputSource_Gamepad) + { + key_less = (axis == ImGuiAxis_X) ? ImGuiKey_GamepadDpadLeft : ImGuiKey_GamepadDpadUp; + key_more = (axis == ImGuiAxis_X) ? ImGuiKey_GamepadDpadRight : ImGuiKey_GamepadDpadDown; + } + else + { + key_less = (axis == ImGuiAxis_X) ? ImGuiKey_LeftArrow : ImGuiKey_UpArrow; + key_more = (axis == ImGuiAxis_X) ? ImGuiKey_RightArrow : ImGuiKey_DownArrow; + } + float amount = (float)GetKeyPressedAmount(key_more, repeat_delay, repeat_rate) - (float)GetKeyPressedAmount(key_less, repeat_delay, repeat_rate); + if (amount != 0.0f && IsKeyDown(key_less) && IsKeyDown(key_more)) // Cancel when opposite directions are held, regardless of repeat phase + amount = 0.0f; + return amount; +} + +static void ImGui::NavUpdate() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + io.WantSetMousePos = false; + //if (g.NavScoringDebugCount > 0) IMGUI_DEBUG_LOG_NAV("[nav] NavScoringDebugCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.NavScoringDebugCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest); + + // Set input source based on which keys are last pressed (as some features differs when used with Gamepad vs Keyboard) + // FIXME-NAV: Now that keys are separated maybe we can get rid of NavInputSource? + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + const ImGuiKey nav_gamepad_keys_to_change_source[] = { ImGuiKey_GamepadFaceRight, ImGuiKey_GamepadFaceLeft, ImGuiKey_GamepadFaceUp, ImGuiKey_GamepadFaceDown, ImGuiKey_GamepadDpadRight, ImGuiKey_GamepadDpadLeft, ImGuiKey_GamepadDpadUp, ImGuiKey_GamepadDpadDown }; + if (nav_gamepad_active) + for (ImGuiKey key : nav_gamepad_keys_to_change_source) + if (IsKeyDown(key)) + g.NavInputSource = ImGuiInputSource_Gamepad; + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + const ImGuiKey nav_keyboard_keys_to_change_source[] = { ImGuiKey_Space, ImGuiKey_Enter, ImGuiKey_Escape, ImGuiKey_RightArrow, ImGuiKey_LeftArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow }; + if (nav_keyboard_active) + for (ImGuiKey key : nav_keyboard_keys_to_change_source) + if (IsKeyDown(key)) + g.NavInputSource = ImGuiInputSource_Keyboard; + + // Process navigation init request (select first/default focus) + if (g.NavInitResultId != 0) + NavInitRequestApplyResult(); + g.NavInitRequest = false; + g.NavInitRequestFromMove = false; + g.NavInitResultId = 0; + g.NavJustMovedToId = 0; + + // Process navigation move request + if (g.NavMoveSubmitted) + NavMoveRequestApplyResult(); + g.NavTabbingCounter = 0; + g.NavMoveSubmitted = g.NavMoveScoringItems = false; + + // Schedule mouse position update (will be done at the bottom of this function, after 1) processing all move requests and 2) updating scrolling) + bool set_mouse_pos = false; + if (g.NavMousePosDirty && g.NavIdIsAlive) + if (!g.NavDisableHighlight && g.NavDisableMouseHover && g.NavWindow) + set_mouse_pos = true; + g.NavMousePosDirty = false; + IM_ASSERT(g.NavLayer == ImGuiNavLayer_Main || g.NavLayer == ImGuiNavLayer_Menu); + + // Store our return window (for returning from Menu Layer to Main Layer) and clear it as soon as we step back in our own Layer 0 + if (g.NavWindow) + NavSaveLastChildNavWindowIntoParent(g.NavWindow); + if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == ImGuiNavLayer_Main) + g.NavWindow->NavLastChildNavWindow = NULL; + + // Update CTRL+TAB and Windowing features (hold Square to move/resize/etc.) + NavUpdateWindowing(); + + // Set output flags for user application + io.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs); + io.NavVisible = (io.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL); + + // Process NavCancel input (to close a popup, get back to parent, clear focus) + NavUpdateCancelRequest(); + + // Process manual activation request + g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = 0; + g.NavActivateFlags = ImGuiActivateFlags_None; + if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) + { + const bool activate_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Space)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadActivate)); + const bool activate_pressed = activate_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Space, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadActivate, false))); + const bool input_down = (nav_keyboard_active && IsKeyDown(ImGuiKey_Enter)) || (nav_gamepad_active && IsKeyDown(ImGuiKey_NavGamepadInput)); + const bool input_pressed = input_down && ((nav_keyboard_active && IsKeyPressed(ImGuiKey_Enter, false)) || (nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadInput, false))); + if (g.ActiveId == 0 && activate_pressed) + { + g.NavActivateId = g.NavId; + g.NavActivateFlags = ImGuiActivateFlags_PreferTweak; + } + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && input_pressed) + { + g.NavActivateId = g.NavId; + g.NavActivateFlags = ImGuiActivateFlags_PreferInput; + } + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_down || input_down)) + g.NavActivateDownId = g.NavId; + if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && (activate_pressed || input_pressed)) + g.NavActivatePressedId = g.NavId; + } + if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs)) + g.NavDisableHighlight = true; + if (g.NavActivateId != 0) + IM_ASSERT(g.NavActivateDownId == g.NavActivateId); + + // Process programmatic activation request + // FIXME-NAV: Those should eventually be queued (unlike focus they don't cancel each others) + if (g.NavNextActivateId != 0) + { + g.NavActivateId = g.NavActivateDownId = g.NavActivatePressedId = g.NavNextActivateId; + g.NavActivateFlags = g.NavNextActivateFlags; + } + g.NavNextActivateId = 0; + + // Process move requests + NavUpdateCreateMoveRequest(); + if (g.NavMoveDir == ImGuiDir_None) + NavUpdateCreateTabbingRequest(); + NavUpdateAnyRequestFlag(); + g.NavIdIsAlive = false; + + // Scrolling + if (g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget) + { + // *Fallback* manual-scroll with Nav directional keys when window has no navigable item + ImGuiWindow* window = g.NavWindow; + const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * io.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported. + const ImGuiDir move_dir = g.NavMoveDir; + if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll && move_dir != ImGuiDir_None) + { + if (move_dir == ImGuiDir_Left || move_dir == ImGuiDir_Right) + SetScrollX(window, ImFloor(window->Scroll.x + ((move_dir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed)); + if (move_dir == ImGuiDir_Up || move_dir == ImGuiDir_Down) + SetScrollY(window, ImFloor(window->Scroll.y + ((move_dir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed)); + } + + // *Normal* Manual scroll with LStick + // Next movement request will clamp the NavId reference rectangle to the visible area, so navigation will resume within those bounds. + if (nav_gamepad_active) + { + const ImVec2 scroll_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); + const float tweak_factor = IsKeyDown(ImGuiKey_NavGamepadTweakSlow) ? 1.0f / 10.0f : IsKeyDown(ImGuiKey_NavGamepadTweakFast) ? 10.0f : 1.0f; + if (scroll_dir.x != 0.0f && window->ScrollbarX) + SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed * tweak_factor)); + if (scroll_dir.y != 0.0f) + SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed * tweak_factor)); + } + } + + // Always prioritize mouse highlight if navigation is disabled + if (!nav_keyboard_active && !nav_gamepad_active) + { + g.NavDisableHighlight = true; + g.NavDisableMouseHover = set_mouse_pos = false; + } + + // Update mouse position if requested + // (This will take into account the possibility that a Scroll was queued in the window to offset our absolute mouse position before scroll has been applied) + if (set_mouse_pos && (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) && (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos)) + { + io.MousePos = io.MousePosPrev = NavCalcPreferredRefPos(); + io.WantSetMousePos = true; + //IMGUI_DEBUG_LOG_IO("SetMousePos: (%.1f,%.1f)\n", io.MousePos.x, io.MousePos.y); + } + + // [DEBUG] + g.NavScoringDebugCount = 0; +#if IMGUI_DEBUG_NAV_RECTS + if (g.NavWindow) + { + ImDrawList* draw_list = GetForegroundDrawList(g.NavWindow); + if (1) { for (int layer = 0; layer < 2; layer++) { ImRect r = WindowRectRelToAbs(g.NavWindow, g.NavWindow->NavRectRel[layer]); draw_list->AddRect(r.Min, r.Max, IM_COL32(255,200,0,255)); } } // [DEBUG] + if (1) { ImU32 col = (!g.NavWindow->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); } + } +#endif +} + +void ImGui::NavInitRequestApplyResult() +{ + // In very rare cases g.NavWindow may be null (e.g. clearing focus after requesting an init request, which does happen when releasing Alt while clicking on void) + ImGuiContext& g = *GImGui; + if (!g.NavWindow) + return; + + // Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called) + // FIXME-NAV: On _NavFlattened windows, g.NavWindow will only be updated during subsequent frame. Not a problem currently. + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: ApplyResult: NavID 0x%08X in Layer %d Window \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name); + SetNavID(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel); + g.NavIdIsAlive = true; // Mark as alive from previous frame as we got a result + if (g.NavInitRequestFromMove) + NavRestoreHighlightAfterMove(); +} + +void ImGui::NavUpdateCreateMoveRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + ImGuiWindow* window = g.NavWindow; + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + + if (g.NavMoveForwardToNextFrame && window != NULL) + { + // Forwarding previous request (which has been modified, e.g. wrap around menus rewrite the requests with a starting rectangle at the other side of the window) + // (preserve most state, which were already set by the NavMoveRequestForward() function) + IM_ASSERT(g.NavMoveDir != ImGuiDir_None && g.NavMoveClipDir != ImGuiDir_None); + IM_ASSERT(g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded); + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequestForward %d\n", g.NavMoveDir); + } + else + { + // Initiate directional inputs request + g.NavMoveDir = ImGuiDir_None; + g.NavMoveFlags = ImGuiNavMoveFlags_None; + g.NavMoveScrollFlags = ImGuiScrollFlags_None; + if (window && !g.NavWindowingTarget && !(window->Flags & ImGuiWindowFlags_NoNavInputs)) + { + const ImGuiInputFlags repeat_mode = ImGuiInputFlags_Repeat | (ImGuiInputFlags)ImGuiInputFlags_RepeatRateNavMove; + if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadLeft, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_LeftArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Left; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadRight, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_RightArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Right; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadUp, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_UpArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Up; } + if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && ((nav_gamepad_active && IsKeyPressed(ImGuiKey_GamepadDpadDown, ImGuiKeyOwner_None, repeat_mode)) || (nav_keyboard_active && IsKeyPressed(ImGuiKey_DownArrow, ImGuiKeyOwner_None, repeat_mode)))) { g.NavMoveDir = ImGuiDir_Down; } + } + g.NavMoveClipDir = g.NavMoveDir; + g.NavScoringNoClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); + } + + // Update PageUp/PageDown/Home/End scroll + // FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag? + float scoring_rect_offset_y = 0.0f; + if (window && g.NavMoveDir == ImGuiDir_None && nav_keyboard_active) + scoring_rect_offset_y = NavUpdatePageUpPageDown(); + if (scoring_rect_offset_y != 0.0f) + { + g.NavScoringNoClipRect = window->InnerRect; + g.NavScoringNoClipRect.TranslateY(scoring_rect_offset_y); + } + + // [DEBUG] Always send a request +#if IMGUI_DEBUG_NAV_SCORING + if (io.KeyCtrl && IsKeyPressed(ImGuiKey_C)) + g.NavMoveDirForDebug = (ImGuiDir)((g.NavMoveDirForDebug + 1) & 3); + if (io.KeyCtrl && g.NavMoveDir == ImGuiDir_None) + { + g.NavMoveDir = g.NavMoveDirForDebug; + g.NavMoveFlags |= ImGuiNavMoveFlags_DebugNoResult; + } +#endif + + // Submit + g.NavMoveForwardToNextFrame = false; + if (g.NavMoveDir != ImGuiDir_None) + NavMoveRequestSubmit(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); + + // Moving with no reference triggers an init request (will be used as a fallback if the direction fails to find a match) + if (g.NavMoveSubmitted && g.NavId == 0) + { + IMGUI_DEBUG_LOG_NAV("[nav] NavInitRequest: from move, window \"%s\", layer=%d\n", window ? window->Name : "", g.NavLayer); + g.NavInitRequest = g.NavInitRequestFromMove = true; + g.NavInitResultId = 0; + g.NavDisableHighlight = false; + } + + // When using gamepad, we project the reference nav bounding box into window visible area. + // This is to allow resuming navigation inside the visible area after doing a large amount of scrolling, + // since with gamepad all movements are relative (can't focus a visible object like we can with the mouse). + if (g.NavMoveSubmitted && g.NavInputSource == ImGuiInputSource_Gamepad && g.NavLayer == ImGuiNavLayer_Main && window != NULL)// && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded)) + { + bool clamp_x = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapX)) == 0; + bool clamp_y = (g.NavMoveFlags & (ImGuiNavMoveFlags_LoopY | ImGuiNavMoveFlags_WrapY)) == 0; + ImRect inner_rect_rel = WindowRectAbsToRel(window, ImRect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1))); + + // Take account of changing scroll to handle triggering a new move request on a scrolling frame. (#6171) + // Otherwise 'inner_rect_rel' would be off on the move result frame. + inner_rect_rel.Translate(CalcNextScrollFromScrollTargetAndClamp(window) - window->Scroll); + + if ((clamp_x || clamp_y) && !inner_rect_rel.Contains(window->NavRectRel[g.NavLayer])) + { + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: clamp NavRectRel for gamepad move\n"); + float pad_x = ImMin(inner_rect_rel.GetWidth(), window->CalcFontSize() * 0.5f); + float pad_y = ImMin(inner_rect_rel.GetHeight(), window->CalcFontSize() * 0.5f); // Terrible approximation for the intent of starting navigation from first fully visible item + inner_rect_rel.Min.x = clamp_x ? (inner_rect_rel.Min.x + pad_x) : -FLT_MAX; + inner_rect_rel.Max.x = clamp_x ? (inner_rect_rel.Max.x - pad_x) : +FLT_MAX; + inner_rect_rel.Min.y = clamp_y ? (inner_rect_rel.Min.y + pad_y) : -FLT_MAX; + inner_rect_rel.Max.y = clamp_y ? (inner_rect_rel.Max.y - pad_y) : +FLT_MAX; + window->NavRectRel[g.NavLayer].ClipWithFull(inner_rect_rel); + g.NavId = 0; + } + } + + // For scoring we use a single segment on the left side our current item bounding box (not touching the edge to avoid box overlap with zero-spaced items) + ImRect scoring_rect; + if (window != NULL) + { + ImRect nav_rect_rel = !window->NavRectRel[g.NavLayer].IsInverted() ? window->NavRectRel[g.NavLayer] : ImRect(0, 0, 0, 0); + scoring_rect = WindowRectRelToAbs(window, nav_rect_rel); + scoring_rect.TranslateY(scoring_rect_offset_y); + scoring_rect.Min.x = ImMin(scoring_rect.Min.x + 1.0f, scoring_rect.Max.x); + scoring_rect.Max.x = scoring_rect.Min.x; + IM_ASSERT(!scoring_rect.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allow us to remove extraneous ImFabs() calls in NavScoreItem(). + //GetForegroundDrawList()->AddRect(scoring_rect.Min, scoring_rect.Max, IM_COL32(255,200,0,255)); // [DEBUG] + //if (!g.NavScoringNoClipRect.IsInverted()) { GetForegroundDrawList()->AddRect(g.NavScoringNoClipRect.Min, g.NavScoringNoClipRect.Max, IM_COL32(255, 200, 0, 255)); } // [DEBUG] + } + g.NavScoringRect = scoring_rect; + g.NavScoringNoClipRect.Add(scoring_rect); +} + +void ImGui::NavUpdateCreateTabbingRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + IM_ASSERT(g.NavMoveDir == ImGuiDir_None); + if (window == NULL || g.NavWindowingTarget != NULL || (window->Flags & ImGuiWindowFlags_NoNavInputs)) + return; + + const bool tab_pressed = IsKeyPressed(ImGuiKey_Tab, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat) && !g.IO.KeyCtrl && !g.IO.KeyAlt; + if (!tab_pressed) + return; + + // Initiate tabbing request + // (this is ALWAYS ENABLED, regardless of ImGuiConfigFlags_NavEnableKeyboard flag!) + // Initially this was designed to use counters and modulo arithmetic, but that could not work with unsubmitted items (list clipper). Instead we use a strategy close to other move requests. + // See NavProcessItemForTabbingRequest() for a description of the various forward/backward tabbing cases with and without wrapping. + const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + if (nav_keyboard_active) + g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.NavDisableHighlight == true && g.ActiveId == 0) ? 0 : +1; + else + g.NavTabbingDir = g.IO.KeyShift ? -1 : (g.ActiveId == 0) ? 0 : +1; + ImGuiScrollFlags scroll_flags = window->Appearing ? ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_AlwaysCenterY : ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleEdgeY; + ImGuiDir clip_dir = (g.NavTabbingDir < 0) ? ImGuiDir_Up : ImGuiDir_Down; + NavMoveRequestSubmit(ImGuiDir_None, clip_dir, ImGuiNavMoveFlags_Tabbing, scroll_flags); // FIXME-NAV: Once we refactor tabbing, add LegacyApi flag to not activate non-inputable. + g.NavTabbingCounter = -1; +} + +// Apply result from previous frame navigation directional move request. Always called from NavUpdate() +void ImGui::NavMoveRequestApplyResult() +{ + ImGuiContext& g = *GImGui; +#if IMGUI_DEBUG_NAV_SCORING + if (g.NavMoveFlags & ImGuiNavMoveFlags_DebugNoResult) // [DEBUG] Scoring all items in NavWindow at all times + return; +#endif + + // Select which result to use + ImGuiNavItemData* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : (g.NavMoveResultOther.ID != 0) ? &g.NavMoveResultOther : NULL; + + // Tabbing forward wrap + if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && result == NULL) + if ((g.NavTabbingCounter == 1 || g.NavTabbingDir == 0) && g.NavTabbingResultFirst.ID) + result = &g.NavTabbingResultFirst; + + // In a situation when there are no results but NavId != 0, re-enable the Navigation highlight (because g.NavId is not considered as a possible result) + if (result == NULL) + { + if (g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) + g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; + if (g.NavId != 0 && (g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + NavRestoreHighlightAfterMove(); + return; + } + + // PageUp/PageDown behavior first jumps to the bottom/top mostly visible item, _otherwise_ use the result from the previous/next page. + if (g.NavMoveFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) + if (g.NavMoveResultLocalVisible.ID != 0 && g.NavMoveResultLocalVisible.ID != g.NavId) + result = &g.NavMoveResultLocalVisible; + + // Maybe entering a flattened child from the outside? In this case solve the tie using the regular scoring rules. + if (result != &g.NavMoveResultOther && g.NavMoveResultOther.ID != 0 && g.NavMoveResultOther.Window->ParentWindow == g.NavWindow) + if ((g.NavMoveResultOther.DistBox < result->DistBox) || (g.NavMoveResultOther.DistBox == result->DistBox && g.NavMoveResultOther.DistCenter < result->DistCenter)) + result = &g.NavMoveResultOther; + IM_ASSERT(g.NavWindow && result->Window); + + // Scroll to keep newly navigated item fully into view. + if (g.NavLayer == ImGuiNavLayer_Main) + { + if (g.NavMoveFlags & ImGuiNavMoveFlags_ScrollToEdgeY) + { + // FIXME: Should remove this + float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f; + SetScrollY(result->Window, scroll_target); + } + else + { + ImRect rect_abs = WindowRectRelToAbs(result->Window, result->RectRel); + ScrollToRectEx(result->Window, rect_abs, g.NavMoveScrollFlags); + } + } + + if (g.NavWindow != result->Window) + { + IMGUI_DEBUG_LOG_FOCUS("[focus] NavMoveRequest: SetNavWindow(\"%s\")\n", result->Window->Name); + g.NavWindow = result->Window; + } + if (g.ActiveId != result->ID) + ClearActiveID(); + if (g.NavId != result->ID) + { + // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId) + g.NavJustMovedToId = result->ID; + g.NavJustMovedToFocusScopeId = result->FocusScopeId; + g.NavJustMovedToKeyMods = g.NavMoveKeyMods; + } + + // Focus + IMGUI_DEBUG_LOG_NAV("[nav] NavMoveRequest: result NavID 0x%08X in Layer %d Window \"%s\"\n", result->ID, g.NavLayer, g.NavWindow->Name); + SetNavID(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel); + + // Tabbing: Activates Inputable or Focus non-Inputable + if ((g.NavMoveFlags & ImGuiNavMoveFlags_Tabbing) && (result->InFlags & ImGuiItemFlags_Inputable)) + { + g.NavNextActivateId = result->ID; + g.NavNextActivateFlags = ImGuiActivateFlags_PreferInput | ImGuiActivateFlags_TryToPreserveState; + g.NavMoveFlags |= ImGuiNavMoveFlags_DontSetNavHighlight; + } + + // Activate + if (g.NavMoveFlags & ImGuiNavMoveFlags_Activate) + { + g.NavNextActivateId = result->ID; + g.NavNextActivateFlags = ImGuiActivateFlags_None; + } + + // Enable nav highlight + if ((g.NavMoveFlags & ImGuiNavMoveFlags_DontSetNavHighlight) == 0) + NavRestoreHighlightAfterMove(); +} + +// Process NavCancel input (to close a popup, get back to parent, clear focus) +// FIXME: In order to support e.g. Escape to clear a selection we'll need: +// - either to store the equivalent of ActiveIdUsingKeyInputMask for a FocusScope and test for it. +// - either to move most/all of those tests to the epilogue/end functions of the scope they are dealing with (e.g. exit child window in EndChild()) or in EndFrame(), to allow an earlier intercept +static void ImGui::NavUpdateCancelRequest() +{ + ImGuiContext& g = *GImGui; + const bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + const bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + if (!(nav_keyboard_active && IsKeyPressed(ImGuiKey_Escape, ImGuiKeyOwner_None)) && !(nav_gamepad_active && IsKeyPressed(ImGuiKey_NavGamepadCancel, ImGuiKeyOwner_None))) + return; + + IMGUI_DEBUG_LOG_NAV("[nav] NavUpdateCancelRequest()\n"); + if (g.ActiveId != 0) + { + ClearActiveID(); + } + else if (g.NavLayer != ImGuiNavLayer_Main) + { + // Leave the "menu" layer + NavRestoreLayer(ImGuiNavLayer_Main); + NavRestoreHighlightAfterMove(); + } + else if (g.NavWindow && g.NavWindow != g.NavWindow->RootWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow) + { + // Exit child window + ImGuiWindow* child_window = g.NavWindow; + ImGuiWindow* parent_window = g.NavWindow->ParentWindow; + IM_ASSERT(child_window->ChildId != 0); + ImRect child_rect = child_window->Rect(); + FocusWindow(parent_window); + SetNavID(child_window->ChildId, ImGuiNavLayer_Main, 0, WindowRectAbsToRel(parent_window, child_rect)); + NavRestoreHighlightAfterMove(); + } + else if (g.OpenPopupStack.Size > 0 && g.OpenPopupStack.back().Window != NULL && !(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal)) + { + // Close open popup/menu + ClosePopupToLevel(g.OpenPopupStack.Size - 1, true); + } + else + { + // Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were + if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow))) + g.NavWindow->NavLastIds[0] = 0; + g.NavId = 0; + } +} + +// Handle PageUp/PageDown/Home/End keys +// Called from NavUpdateCreateMoveRequest() which will use our output to create a move request +// FIXME-NAV: This doesn't work properly with NavFlattened siblings as we use NavWindow rectangle for reference +// FIXME-NAV: how to get Home/End to aim at the beginning/end of a 2D grid? +static float ImGui::NavUpdatePageUpPageDown() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + if ((window->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL) + return 0.0f; + + const bool page_up_held = IsKeyDown(ImGuiKey_PageUp, ImGuiKeyOwner_None); + const bool page_down_held = IsKeyDown(ImGuiKey_PageDown, ImGuiKeyOwner_None); + const bool home_pressed = IsKeyPressed(ImGuiKey_Home, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); + const bool end_pressed = IsKeyPressed(ImGuiKey_End, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat); + if (page_up_held == page_down_held && home_pressed == end_pressed) // Proceed if either (not both) are pressed, otherwise early out + return 0.0f; + + if (g.NavLayer != ImGuiNavLayer_Main) + NavRestoreLayer(ImGuiNavLayer_Main); + + if (window->DC.NavLayersActiveMask == 0x00 && window->DC.NavHasScroll) + { + // Fallback manual-scroll when window has no navigable item + if (IsKeyPressed(ImGuiKey_PageUp, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight()); + else if (IsKeyPressed(ImGuiKey_PageDown, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat)) + SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight()); + else if (home_pressed) + SetScrollY(window, 0.0f); + else if (end_pressed) + SetScrollY(window, window->ScrollMax.y); + } + else + { + ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer]; + const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight()); + float nav_scoring_rect_offset_y = 0.0f; + if (IsKeyPressed(ImGuiKey_PageUp, true)) + { + nav_scoring_rect_offset_y = -page_offset_y; + g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Up; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + } + else if (IsKeyPressed(ImGuiKey_PageDown, true)) + { + nav_scoring_rect_offset_y = +page_offset_y; + g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item) + g.NavMoveClipDir = ImGuiDir_Down; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet; + } + else if (home_pressed) + { + // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y + // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdgeY flag, we don't scroll immediately to avoid scrolling happening before nav result. + // Preserve current horizontal position if we have any. + nav_rect_rel.Min.y = nav_rect_rel.Max.y = 0.0f; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Down; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; + // FIXME-NAV: MoveClipDir left to _None, intentional? + } + else if (end_pressed) + { + nav_rect_rel.Min.y = nav_rect_rel.Max.y = window->ContentSize.y; + if (nav_rect_rel.IsInverted()) + nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f; + g.NavMoveDir = ImGuiDir_Up; + g.NavMoveFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdgeY; + // FIXME-NAV: MoveClipDir left to _None, intentional? + } + return nav_scoring_rect_offset_y; + } + return 0.0f; +} + +static void ImGui::NavEndFrame() +{ + ImGuiContext& g = *GImGui; + + // Show CTRL+TAB list window + if (g.NavWindowingTarget != NULL) + NavUpdateWindowingOverlay(); + + // Perform wrap-around in menus + // FIXME-NAV: Wrap may need to apply a weight bias on the other axis. e.g. 4x4 grid with 2 last items missing on last item won't handle LoopY/WrapY correctly. + // FIXME-NAV: Wrap (not Loop) support could be handled by the scoring function and then WrapX would function without an extra frame. + const ImGuiNavMoveFlags wanted_flags = ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX | ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY; + if (g.NavWindow && NavMoveRequestButNoResultYet() && (g.NavMoveFlags & wanted_flags) && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) + NavUpdateCreateWrappingRequest(); +} + +static void ImGui::NavUpdateCreateWrappingRequest() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.NavWindow; + + bool do_forward = false; + ImRect bb_rel = window->NavRectRel[g.NavLayer]; + ImGuiDir clip_dir = g.NavMoveDir; + const ImGuiNavMoveFlags move_flags = g.NavMoveFlags; + if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = window->ContentSize.x + window->WindowPadding.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(-bb_rel.GetHeight()); // Previous row + clip_dir = ImGuiDir_Up; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Right && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX))) + { + bb_rel.Min.x = bb_rel.Max.x = -window->WindowPadding.x; + if (move_flags & ImGuiNavMoveFlags_WrapX) + { + bb_rel.TranslateY(+bb_rel.GetHeight()); // Next row + clip_dir = ImGuiDir_Down; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = window->ContentSize.y + window->WindowPadding.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(-bb_rel.GetWidth()); // Previous column + clip_dir = ImGuiDir_Left; + } + do_forward = true; + } + if (g.NavMoveDir == ImGuiDir_Down && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY))) + { + bb_rel.Min.y = bb_rel.Max.y = -window->WindowPadding.y; + if (move_flags & ImGuiNavMoveFlags_WrapY) + { + bb_rel.TranslateX(+bb_rel.GetWidth()); // Next column + clip_dir = ImGuiDir_Right; + } + do_forward = true; + } + if (!do_forward) + return; + window->NavRectRel[g.NavLayer] = bb_rel; + NavMoveRequestForward(g.NavMoveDir, clip_dir, move_flags, g.NavMoveScrollFlags); +} + +static int ImGui::FindWindowFocusIndex(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + IM_UNUSED(g); + int order = window->FocusOrder; + IM_ASSERT(window->RootWindow == window); // No child window (not testing _ChildWindow because of docking) + IM_ASSERT(g.WindowsFocusOrder[order] == window); + return order; +} + +static ImGuiWindow* FindWindowNavFocusable(int i_start, int i_stop, int dir) // FIXME-OPT O(N) +{ + ImGuiContext& g = *GImGui; + for (int i = i_start; i >= 0 && i < g.WindowsFocusOrder.Size && i != i_stop; i += dir) + if (ImGui::IsWindowNavFocusable(g.WindowsFocusOrder[i])) + return g.WindowsFocusOrder[i]; + return NULL; +} + +static void NavUpdateWindowingHighlightWindow(int focus_change_dir) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindowingTarget); + if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal) + return; + + const int i_current = ImGui::FindWindowFocusIndex(g.NavWindowingTarget); + ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir); + if (!window_target) + window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.WindowsFocusOrder.Size - 1) : 0, i_current, focus_change_dir); + if (window_target) // Don't reset windowing target if there's a single window in the list + { + g.NavWindowingTarget = g.NavWindowingTargetAnim = window_target; + g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f); + } + g.NavWindowingToggleLayer = false; +} + +// Windowing management mode +// Keyboard: CTRL+Tab (change focus/move/resize), Alt (toggle menu layer) +// Gamepad: Hold Menu/Square (change focus/move/resize), Tap Menu/Square (toggle menu layer) +static void ImGui::NavUpdateWindowing() +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + + ImGuiWindow* apply_focus_window = NULL; + bool apply_toggle_layer = false; + + ImGuiWindow* modal_window = GetTopMostPopupModal(); + bool allow_windowing = (modal_window == NULL); + if (!allow_windowing) + g.NavWindowingTarget = NULL; + + // Fade out + if (g.NavWindowingTargetAnim && g.NavWindowingTarget == NULL) + { + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha - io.DeltaTime * 10.0f, 0.0f); + if (g.DimBgRatio <= 0.0f && g.NavWindowingHighlightAlpha <= 0.0f) + g.NavWindowingTargetAnim = NULL; + } + + // Start CTRL+Tab or Square+L/R window selection + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + const bool nav_keyboard_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0; + const bool keyboard_next_window = allow_windowing && g.ConfigNavWindowingKeyNext && Shortcut(g.ConfigNavWindowingKeyNext, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); + const bool keyboard_prev_window = allow_windowing && g.ConfigNavWindowingKeyPrev && Shortcut(g.ConfigNavWindowingKeyPrev, ImGuiKeyOwner_None, ImGuiInputFlags_Repeat | ImGuiInputFlags_RouteAlways); + const bool start_windowing_with_gamepad = allow_windowing && nav_gamepad_active && !g.NavWindowingTarget && IsKeyPressed(ImGuiKey_NavGamepadMenu, 0, ImGuiInputFlags_None); + const bool start_windowing_with_keyboard = allow_windowing && !g.NavWindowingTarget && (keyboard_next_window || keyboard_prev_window); // Note: enabled even without NavEnableKeyboard! + if (start_windowing_with_gamepad || start_windowing_with_keyboard) + if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1)) + { + g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; + g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f; + g.NavWindowingAccumDeltaPos = g.NavWindowingAccumDeltaSize = ImVec2(0.0f, 0.0f); + g.NavWindowingToggleLayer = start_windowing_with_gamepad ? true : false; // Gamepad starts toggling layer + g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_Keyboard : ImGuiInputSource_Gamepad; + } + + // Gamepad update + g.NavWindowingTimer += io.DeltaTime; + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Gamepad) + { + // Highlight only appears after a brief time holding the button, so that a fast tap on PadMenu (to toggle NavLayer) doesn't add visual noise + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); + + // Select window to focus + const int focus_change_dir = (int)IsKeyPressed(ImGuiKey_GamepadL1) - (int)IsKeyPressed(ImGuiKey_GamepadR1); + if (focus_change_dir != 0) + { + NavUpdateWindowingHighlightWindow(focus_change_dir); + g.NavWindowingHighlightAlpha = 1.0f; + } + + // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most) + if (!IsKeyDown(ImGuiKey_NavGamepadMenu)) + { + g.NavWindowingToggleLayer &= (g.NavWindowingHighlightAlpha < 1.0f); // Once button was held long enough we don't consider it a tap-to-toggle-layer press anymore. + if (g.NavWindowingToggleLayer && g.NavWindow) + apply_toggle_layer = true; + else if (!g.NavWindowingToggleLayer) + apply_focus_window = g.NavWindowingTarget; + g.NavWindowingTarget = NULL; + } + } + + // Keyboard: Focus + if (g.NavWindowingTarget && g.NavInputSource == ImGuiInputSource_Keyboard) + { + // Visuals only appears after a brief time after pressing TAB the first time, so that a fast CTRL+TAB doesn't add visual noise + ImGuiKeyChord shared_mods = ((g.ConfigNavWindowingKeyNext ? g.ConfigNavWindowingKeyNext : ImGuiMod_Mask_) & (g.ConfigNavWindowingKeyPrev ? g.ConfigNavWindowingKeyPrev : ImGuiMod_Mask_)) & ImGuiMod_Mask_; + IM_ASSERT(shared_mods != 0); // Next/Prev shortcut currently needs a shared modifier to "hold", otherwise Prev actions would keep cycling between two windows. + g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f)); // 1.0f + if (keyboard_next_window || keyboard_prev_window) + NavUpdateWindowingHighlightWindow(keyboard_next_window ? -1 : +1); + else if ((io.KeyMods & shared_mods) != shared_mods) + apply_focus_window = g.NavWindowingTarget; + } + + // Keyboard: Press and Release ALT to toggle menu layer + // - Testing that only Alt is tested prevents Alt+Shift or AltGR from toggling menu layer. + // - AltGR is normally Alt+Ctrl but we can't reliably detect it (not all backends/systems/layout emit it as Alt+Ctrl). But even on keyboards without AltGR we don't want Alt+Ctrl to open menu anyway. + if (nav_keyboard_active && IsKeyPressed(ImGuiMod_Alt, ImGuiKeyOwner_None)) + { + g.NavWindowingToggleLayer = true; + g.NavInputSource = ImGuiInputSource_Keyboard; + } + if (g.NavWindowingToggleLayer && g.NavInputSource == ImGuiInputSource_Keyboard) + { + // We cancel toggling nav layer when any text has been typed (generally while holding Alt). (See #370) + // We cancel toggling nav layer when other modifiers are pressed. (See #4439) + // We cancel toggling nav layer if an owner has claimed the key. + if (io.InputQueueCharacters.Size > 0 || io.KeyCtrl || io.KeyShift || io.KeySuper || TestKeyOwner(ImGuiMod_Alt, ImGuiKeyOwner_None) == false) + g.NavWindowingToggleLayer = false; + + // Apply layer toggle on release + // Important: as before version <18314 we lacked an explicit IO event for focus gain/loss, we also compare mouse validity to detect old backends clearing mouse pos on focus loss. + if (IsKeyReleased(ImGuiMod_Alt) && g.NavWindowingToggleLayer) + if (g.ActiveId == 0 || g.ActiveIdAllowOverlap) + if (IsMousePosValid(&io.MousePos) == IsMousePosValid(&io.MousePosPrev)) + apply_toggle_layer = true; + if (!IsKeyDown(ImGuiMod_Alt)) + g.NavWindowingToggleLayer = false; + } + + // Move window + if (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoMove)) + { + ImVec2 nav_move_dir; + if (g.NavInputSource == ImGuiInputSource_Keyboard && !io.KeyShift) + nav_move_dir = GetKeyMagnitude2d(ImGuiKey_LeftArrow, ImGuiKey_RightArrow, ImGuiKey_UpArrow, ImGuiKey_DownArrow); + if (g.NavInputSource == ImGuiInputSource_Gamepad) + nav_move_dir = GetKeyMagnitude2d(ImGuiKey_GamepadLStickLeft, ImGuiKey_GamepadLStickRight, ImGuiKey_GamepadLStickUp, ImGuiKey_GamepadLStickDown); + if (nav_move_dir.x != 0.0f || nav_move_dir.y != 0.0f) + { + const float NAV_MOVE_SPEED = 800.0f; + const float move_step = NAV_MOVE_SPEED * io.DeltaTime * ImMin(io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + g.NavWindowingAccumDeltaPos += nav_move_dir * move_step; + g.NavDisableMouseHover = true; + ImVec2 accum_floored = ImFloor(g.NavWindowingAccumDeltaPos); + if (accum_floored.x != 0.0f || accum_floored.y != 0.0f) + { + ImGuiWindow* moving_window = g.NavWindowingTarget->RootWindow; + SetWindowPos(moving_window, moving_window->Pos + accum_floored, ImGuiCond_Always); + g.NavWindowingAccumDeltaPos -= accum_floored; + } + } + } + + // Apply final focus + if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow)) + { + ClearActiveID(); + NavRestoreHighlightAfterMove(); + apply_focus_window = NavRestoreLastChildNavWindow(apply_focus_window); + ClosePopupsOverWindow(apply_focus_window, false); + FocusWindow(apply_focus_window); + if (apply_focus_window->NavLastIds[0] == 0) + NavInitWindow(apply_focus_window, false); + + // If the window has ONLY a menu layer (no main layer), select it directly + // Use NavLayersActiveMaskNext since windows didn't have a chance to be Begin()-ed on this frame, + // so CTRL+Tab where the keys are only held for 1 frame will be able to use correct layers mask since + // the target window as already been previewed once. + // FIXME-NAV: This should be done in NavInit.. or in FocusWindow... However in both of those cases, + // we won't have a guarantee that windows has been visible before and therefore NavLayersActiveMask* + // won't be valid. + if (apply_focus_window->DC.NavLayersActiveMaskNext == (1 << ImGuiNavLayer_Menu)) + g.NavLayer = ImGuiNavLayer_Menu; + } + if (apply_focus_window) + g.NavWindowingTarget = NULL; + + // Apply menu/layer toggle + if (apply_toggle_layer && g.NavWindow) + { + ClearActiveID(); + + // Move to parent menu if necessary + ImGuiWindow* new_nav_window = g.NavWindow; + while (new_nav_window->ParentWindow + && (new_nav_window->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) == 0 + && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 + && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0) + new_nav_window = new_nav_window->ParentWindow; + if (new_nav_window != g.NavWindow) + { + ImGuiWindow* old_nav_window = g.NavWindow; + FocusWindow(new_nav_window); + new_nav_window->NavLastChildNavWindow = old_nav_window; + } + + // Toggle layer + const ImGuiNavLayer new_nav_layer = (g.NavWindow->DC.NavLayersActiveMask & (1 << ImGuiNavLayer_Menu)) ? (ImGuiNavLayer)((int)g.NavLayer ^ 1) : ImGuiNavLayer_Main; + if (new_nav_layer != g.NavLayer) + { + // Reinitialize navigation when entering menu bar with the Alt key (FIXME: could be a properly of the layer?) + if (new_nav_layer == ImGuiNavLayer_Menu) + g.NavWindow->NavLastIds[new_nav_layer] = 0; + NavRestoreLayer(new_nav_layer); + NavRestoreHighlightAfterMove(); + } + } +} + +// Window has already passed the IsWindowNavFocusable() +static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window) +{ + if (window->Flags & ImGuiWindowFlags_Popup) + return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingPopup); + if ((window->Flags & ImGuiWindowFlags_MenuBar) && strcmp(window->Name, "##MainMenuBar") == 0) + return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingMainMenuBar); + return ImGui::LocalizeGetMsg(ImGuiLocKey_WindowingUntitled); +} + +// Overlay displayed when using CTRL+TAB. Called by EndFrame(). +void ImGui::NavUpdateWindowingOverlay() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.NavWindowingTarget != NULL); + + if (g.NavWindowingTimer < NAV_WINDOWING_LIST_APPEAR_DELAY) + return; + + if (g.NavWindowingListWindow == NULL) + g.NavWindowingListWindow = FindWindowByName("###NavWindowingList"); + const ImGuiViewport* viewport = GetMainViewport(); + SetNextWindowSizeConstraints(ImVec2(viewport->Size.x * 0.20f, viewport->Size.y * 0.20f), ImVec2(FLT_MAX, FLT_MAX)); + SetNextWindowPos(viewport->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + PushStyleVar(ImGuiStyleVar_WindowPadding, g.Style.WindowPadding * 2.0f); + Begin("###NavWindowingList", NULL, ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoInputs | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings); + for (int n = g.WindowsFocusOrder.Size - 1; n >= 0; n--) + { + ImGuiWindow* window = g.WindowsFocusOrder[n]; + IM_ASSERT(window != NULL); // Fix static analyzers + if (!IsWindowNavFocusable(window)) + continue; + const char* label = window->Name; + if (label == FindRenderedTextEnd(label)) + label = GetFallbackWindowNameForWindowingList(window); + Selectable(label, g.NavWindowingTarget == window); + } + End(); + PopStyleVar(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] DRAG AND DROP +//----------------------------------------------------------------------------- + +bool ImGui::IsDragDropActive() +{ + ImGuiContext& g = *GImGui; + return g.DragDropActive; +} + +void ImGui::ClearDragDrop() +{ + ImGuiContext& g = *GImGui; + g.DragDropActive = false; + g.DragDropPayload.Clear(); + g.DragDropAcceptFlags = ImGuiDragDropFlags_None; + g.DragDropAcceptIdCurr = g.DragDropAcceptIdPrev = 0; + g.DragDropAcceptIdCurrRectSurface = FLT_MAX; + g.DragDropAcceptFrameCount = -1; + + g.DragDropPayloadBufHeap.clear(); + memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); +} + +// When this returns true you need to: a) call SetDragDropPayload() exactly once, b) you may render the payload visual/description, c) call EndDragDropSource() +// If the item has an identifier: +// - This assume/require the item to be activated (typically via ButtonBehavior). +// - Therefore if you want to use this with a mouse button other than left mouse button, it is up to the item itself to activate with another button. +// - We then pull and use the mouse button that was used to activate the item and use it to carry on the drag. +// If the item has no identifier: +// - Currently always assume left mouse button. +bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // FIXME-DRAGDROP: While in the common-most "drag from non-zero active id" case we can tell the mouse button, + // in both SourceExtern and id==0 cases we may requires something else (explicit flags or some heuristic). + ImGuiMouseButton mouse_button = ImGuiMouseButton_Left; + + bool source_drag_active = false; + ImGuiID source_id = 0; + ImGuiID source_parent_id = 0; + if (!(flags & ImGuiDragDropFlags_SourceExtern)) + { + source_id = g.LastItemData.ID; + if (source_id != 0) + { + // Common path: items with ID + if (g.ActiveId != source_id) + return false; + if (g.ActiveIdMouseButton != -1) + mouse_button = g.ActiveIdMouseButton; + if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) + return false; + g.ActiveIdAllowOverlap = false; + } + else + { + // Uncommon path: items without ID + if (g.IO.MouseDown[mouse_button] == false || window->SkipItems) + return false; + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) == 0 && (g.ActiveId == 0 || g.ActiveIdWindow != window)) + return false; + + // If you want to use BeginDragDropSource() on an item with no unique identifier for interaction, such as Text() or Image(), you need to: + // A) Read the explanation below, B) Use the ImGuiDragDropFlags_SourceAllowNullID flag. + if (!(flags & ImGuiDragDropFlags_SourceAllowNullID)) + { + IM_ASSERT(0); + return false; + } + + // Magic fallback to handle items with no assigned ID, e.g. Text(), Image() + // We build a throwaway ID based on current ID stack + relative AABB of items in window. + // THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING/RESIZINGG OF THE WIDGET, so if your widget moves your dragging operation will be canceled. + // We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive. + // Rely on keeping other window->LastItemXXX fields intact. + source_id = g.LastItemData.ID = window->GetIDFromRectangle(g.LastItemData.Rect); + KeepAliveID(source_id); + bool is_hovered = ItemHoverable(g.LastItemData.Rect, source_id); + if (is_hovered && g.IO.MouseClicked[mouse_button]) + { + SetActiveID(source_id, window); + FocusWindow(window); + } + if (g.ActiveId == source_id) // Allow the underlying widget to display/return hovered during the mouse release frame, else we would get a flicker. + g.ActiveIdAllowOverlap = is_hovered; + } + if (g.ActiveId != source_id) + return false; + source_parent_id = window->IDStack.back(); + source_drag_active = IsMouseDragging(mouse_button); + + // Disable navigation and key inputs while dragging + cancel existing request if any + SetActiveIdUsingAllKeyboardKeys(); + } + else + { + window = NULL; + source_id = ImHashStr("#SourceExtern"); + source_drag_active = true; + } + + if (source_drag_active) + { + if (!g.DragDropActive) + { + IM_ASSERT(source_id != 0); + ClearDragDrop(); + ImGuiPayload& payload = g.DragDropPayload; + payload.SourceId = source_id; + payload.SourceParentId = source_parent_id; + g.DragDropActive = true; + g.DragDropSourceFlags = flags; + g.DragDropMouseButton = mouse_button; + if (payload.SourceId == g.ActiveId) + g.ActiveIdNoClearOnFocusLoss = true; + } + g.DragDropSourceFrameCount = g.FrameCount; + g.DragDropWithinSource = true; + + if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + { + // Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit) + // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents. + bool ret = BeginTooltip(); + IM_ASSERT(ret); // FIXME-NEWBEGIN: If this ever becomes false, we need to Begin("##Hidden", NULL, ImGuiWindowFlags_NoSavedSettings) + SetWindowHiddendAndSkipItemsForCurrentFrame(). + IM_UNUSED(ret); + + if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip)) + SetWindowHiddendAndSkipItemsForCurrentFrame(g.CurrentWindow); + } + + if (!(flags & ImGuiDragDropFlags_SourceNoDisableHover) && !(flags & ImGuiDragDropFlags_SourceExtern)) + g.LastItemData.StatusFlags &= ~ImGuiItemStatusFlags_HoveredRect; + + return true; + } + return false; +} + +void ImGui::EndDragDropSource() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DragDropActive); + IM_ASSERT(g.DragDropWithinSource && "Not after a BeginDragDropSource()?"); + + if (!(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoPreviewTooltip)) + EndTooltip(); + + // Discard the drag if have not called SetDragDropPayload() + if (g.DragDropPayload.DataFrameCount == -1) + ClearDragDrop(); + g.DragDropWithinSource = false; +} + +// Use 'cond' to choose to submit payload on drag start or every frame +bool ImGui::SetDragDropPayload(const char* type, const void* data, size_t data_size, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + ImGuiPayload& payload = g.DragDropPayload; + if (cond == 0) + cond = ImGuiCond_Always; + + IM_ASSERT(type != NULL); + IM_ASSERT(strlen(type) < IM_ARRAYSIZE(payload.DataType) && "Payload type can be at most 32 characters long"); + IM_ASSERT((data != NULL && data_size > 0) || (data == NULL && data_size == 0)); + IM_ASSERT(cond == ImGuiCond_Always || cond == ImGuiCond_Once); + IM_ASSERT(payload.SourceId != 0); // Not called between BeginDragDropSource() and EndDragDropSource() + + if (cond == ImGuiCond_Always || payload.DataFrameCount == -1) + { + // Copy payload + ImStrncpy(payload.DataType, type, IM_ARRAYSIZE(payload.DataType)); + g.DragDropPayloadBufHeap.resize(0); + if (data_size > sizeof(g.DragDropPayloadBufLocal)) + { + // Store in heap + g.DragDropPayloadBufHeap.resize((int)data_size); + payload.Data = g.DragDropPayloadBufHeap.Data; + memcpy(payload.Data, data, data_size); + } + else if (data_size > 0) + { + // Store locally + memset(&g.DragDropPayloadBufLocal, 0, sizeof(g.DragDropPayloadBufLocal)); + payload.Data = g.DragDropPayloadBufLocal; + memcpy(payload.Data, data, data_size); + } + else + { + payload.Data = NULL; + } + payload.DataSize = (int)data_size; + } + payload.DataFrameCount = g.FrameCount; + + // Return whether the payload has been accepted + return (g.DragDropAcceptFrameCount == g.FrameCount) || (g.DragDropAcceptFrameCount == g.FrameCount - 1); +} + +bool ImGui::BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id) +{ + ImGuiContext& g = *GImGui; + if (!g.DragDropActive) + return false; + + ImGuiWindow* window = g.CurrentWindow; + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow) + return false; + IM_ASSERT(id != 0); + if (!IsMouseHoveringRect(bb.Min, bb.Max) || (id == g.DragDropPayload.SourceId)) + return false; + if (window->SkipItems) + return false; + + IM_ASSERT(g.DragDropWithinTarget == false); + g.DragDropTargetRect = bb; + g.DragDropTargetId = id; + g.DragDropWithinTarget = true; + return true; +} + +// We don't use BeginDragDropTargetCustom() and duplicate its code because: +// 1) we use LastItemRectHoveredRect which handles items that push a temporarily clip rectangle in their code. Calling BeginDragDropTargetCustom(LastItemRect) would not handle them. +// 2) and it's faster. as this code may be very frequently called, we want to early out as fast as we can. +// Also note how the HoveredWindow test is positioned differently in both functions (in both functions we optimize for the cheapest early out case) +bool ImGui::BeginDragDropTarget() +{ + ImGuiContext& g = *GImGui; + if (!g.DragDropActive) + return false; + + ImGuiWindow* window = g.CurrentWindow; + if (!(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect)) + return false; + ImGuiWindow* hovered_window = g.HoveredWindowUnderMovingWindow; + if (hovered_window == NULL || window->RootWindow != hovered_window->RootWindow || window->SkipItems) + return false; + + const ImRect& display_rect = (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HasDisplayRect) ? g.LastItemData.DisplayRect : g.LastItemData.Rect; + ImGuiID id = g.LastItemData.ID; + if (id == 0) + { + id = window->GetIDFromRectangle(display_rect); + KeepAliveID(id); + } + if (g.DragDropPayload.SourceId == id) + return false; + + IM_ASSERT(g.DragDropWithinTarget == false); + g.DragDropTargetRect = display_rect; + g.DragDropTargetId = id; + g.DragDropWithinTarget = true; + return true; +} + +bool ImGui::IsDragDropPayloadBeingAccepted() +{ + ImGuiContext& g = *GImGui; + return g.DragDropActive && g.DragDropAcceptIdPrev != 0; +} + +const ImGuiPayload* ImGui::AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiPayload& payload = g.DragDropPayload; + IM_ASSERT(g.DragDropActive); // Not called between BeginDragDropTarget() and EndDragDropTarget() ? + IM_ASSERT(payload.DataFrameCount != -1); // Forgot to call EndDragDropTarget() ? + if (type != NULL && !payload.IsDataType(type)) + return NULL; + + // Accept smallest drag target bounding box, this allows us to nest drag targets conveniently without ordering constraints. + // NB: We currently accept NULL id as target. However, overlapping targets requires a unique ID to function! + const bool was_accepted_previously = (g.DragDropAcceptIdPrev == g.DragDropTargetId); + ImRect r = g.DragDropTargetRect; + float r_surface = r.GetWidth() * r.GetHeight(); + if (r_surface > g.DragDropAcceptIdCurrRectSurface) + return NULL; + + g.DragDropAcceptFlags = flags; + g.DragDropAcceptIdCurr = g.DragDropTargetId; + g.DragDropAcceptIdCurrRectSurface = r_surface; + //IMGUI_DEBUG_LOG("AcceptDragDropPayload(): %08X: accept\n", g.DragDropTargetId); + + // Render default drop visuals + payload.Preview = was_accepted_previously; + flags |= (g.DragDropSourceFlags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect); // Source can also inhibit the preview (useful for external sources that live for 1 frame) + if (!(flags & ImGuiDragDropFlags_AcceptNoDrawDefaultRect) && payload.Preview) + window->DrawList->AddRect(r.Min - ImVec2(3.5f,3.5f), r.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); + + g.DragDropAcceptFrameCount = g.FrameCount; + payload.Delivery = was_accepted_previously && !IsMouseDown(g.DragDropMouseButton); // For extern drag sources affecting OS window focus, it's easier to just test !IsMouseDown() instead of IsMouseReleased() + if (!payload.Delivery && !(flags & ImGuiDragDropFlags_AcceptBeforeDelivery)) + return NULL; + + //IMGUI_DEBUG_LOG("AcceptDragDropPayload(): %08X: return payload\n", g.DragDropTargetId); + return &payload; +} + +// FIXME-DRAGDROP: Settle on a proper default visuals for drop target. +void ImGui::RenderDragDropTargetRect(const ImRect& bb) +{ + GetWindowDrawList()->AddRect(bb.Min - ImVec2(3.5f, 3.5f), bb.Max + ImVec2(3.5f, 3.5f), GetColorU32(ImGuiCol_DragDropTarget), 0.0f, 0, 2.0f); +} + +const ImGuiPayload* ImGui::GetDragDropPayload() +{ + ImGuiContext& g = *GImGui; + return (g.DragDropActive && g.DragDropPayload.DataFrameCount != -1) ? &g.DragDropPayload : NULL; +} + +void ImGui::EndDragDropTarget() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.DragDropActive); + IM_ASSERT(g.DragDropWithinTarget); + g.DragDropWithinTarget = false; + + // Clear drag and drop state payload right after delivery + if (g.DragDropPayload.Delivery) + ClearDragDrop(); +} + +//----------------------------------------------------------------------------- +// [SECTION] LOGGING/CAPTURING +//----------------------------------------------------------------------------- +// All text output from the interface can be captured into tty/file/clipboard. +// By default, tree nodes are automatically opened during logging. +//----------------------------------------------------------------------------- + +// Pass text data straight to log (without being displayed) +static inline void LogTextV(ImGuiContext& g, const char* fmt, va_list args) +{ + if (g.LogFile) + { + g.LogBuffer.Buf.resize(0); + g.LogBuffer.appendfv(fmt, args); + ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (ImU64)g.LogBuffer.size(), g.LogFile); + } + else + { + g.LogBuffer.appendfv(fmt, args); + } +} + +void ImGui::LogText(const char* fmt, ...) +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + va_list args; + va_start(args, fmt); + LogTextV(g, fmt, args); + va_end(args); +} + +void ImGui::LogTextV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + LogTextV(g, fmt, args); +} + +// Internal version that takes a position to decide on newline placement and pad items according to their depth. +// We split text into individual lines to add current tree level padding +// FIXME: This code is a little complicated perhaps, considering simplifying the whole system. +void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const char* prefix = g.LogNextPrefix; + const char* suffix = g.LogNextSuffix; + g.LogNextPrefix = g.LogNextSuffix = NULL; + + if (!text_end) + text_end = FindRenderedTextEnd(text, text_end); + + const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + g.Style.FramePadding.y + 1); + if (ref_pos) + g.LogLinePosY = ref_pos->y; + if (log_new_line) + { + LogText(IM_NEWLINE); + g.LogLineFirstItem = true; + } + + if (prefix) + LogRenderedText(ref_pos, prefix, prefix + strlen(prefix)); // Calculate end ourself to ensure "##" are included here. + + // Re-adjust padding if we have popped out of our starting depth + if (g.LogDepthRef > window->DC.TreeDepth) + g.LogDepthRef = window->DC.TreeDepth; + const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef); + + const char* text_remaining = text; + for (;;) + { + // Split the string. Each new line (after a '\n') is followed by indentation corresponding to the current depth of our log entry. + // We don't add a trailing \n yet to allow a subsequent item on the same line to be captured. + const char* line_start = text_remaining; + const char* line_end = ImStreolRange(line_start, text_end); + const bool is_last_line = (line_end == text_end); + if (line_start != line_end || !is_last_line) + { + const int line_length = (int)(line_end - line_start); + const int indentation = g.LogLineFirstItem ? tree_depth * 4 : 1; + LogText("%*s%.*s", indentation, "", line_length, line_start); + g.LogLineFirstItem = false; + if (*line_end == '\n') + { + LogText(IM_NEWLINE); + g.LogLineFirstItem = true; + } + } + if (is_last_line) + break; + text_remaining = line_end + 1; + } + + if (suffix) + LogRenderedText(ref_pos, suffix, suffix + strlen(suffix)); +} + +// Start logging/capturing text output +void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(g.LogEnabled == false); + IM_ASSERT(g.LogFile == NULL); + IM_ASSERT(g.LogBuffer.empty()); + g.LogEnabled = true; + g.LogType = type; + g.LogNextPrefix = g.LogNextSuffix = NULL; + g.LogDepthRef = window->DC.TreeDepth; + g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault); + g.LogLinePosY = FLT_MAX; + g.LogLineFirstItem = true; +} + +// Important: doesn't copy underlying data, use carefully (prefix/suffix must be in scope at the time of the next LogRenderedText) +void ImGui::LogSetNextTextDecoration(const char* prefix, const char* suffix) +{ + ImGuiContext& g = *GImGui; + g.LogNextPrefix = prefix; + g.LogNextSuffix = suffix; +} + +void ImGui::LogToTTY(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + IM_UNUSED(auto_open_depth); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + LogBegin(ImGuiLogType_TTY, auto_open_depth); + g.LogFile = stdout; +#endif +} + +// Start logging/capturing text output to given file +void ImGui::LogToFile(int auto_open_depth, const char* filename) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + + // FIXME: We could probably open the file in text mode "at", however note that clipboard/buffer logging will still + // be subject to outputting OS-incompatible carriage return if within strings the user doesn't use IM_NEWLINE. + // By opening the file in binary mode "ab" we have consistent output everywhere. + if (!filename) + filename = g.IO.LogFilename; + if (!filename || !filename[0]) + return; + ImFileHandle f = ImFileOpen(filename, "ab"); + if (!f) + { + IM_ASSERT(0); + return; + } + + LogBegin(ImGuiLogType_File, auto_open_depth); + g.LogFile = f; +} + +// Start logging/capturing text output to clipboard +void ImGui::LogToClipboard(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + LogBegin(ImGuiLogType_Clipboard, auto_open_depth); +} + +void ImGui::LogToBuffer(int auto_open_depth) +{ + ImGuiContext& g = *GImGui; + if (g.LogEnabled) + return; + LogBegin(ImGuiLogType_Buffer, auto_open_depth); +} + +void ImGui::LogFinish() +{ + ImGuiContext& g = *GImGui; + if (!g.LogEnabled) + return; + + LogText(IM_NEWLINE); + switch (g.LogType) + { + case ImGuiLogType_TTY: +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + fflush(g.LogFile); +#endif + break; + case ImGuiLogType_File: + ImFileClose(g.LogFile); + break; + case ImGuiLogType_Buffer: + break; + case ImGuiLogType_Clipboard: + if (!g.LogBuffer.empty()) + SetClipboardText(g.LogBuffer.begin()); + break; + case ImGuiLogType_None: + IM_ASSERT(0); + break; + } + + g.LogEnabled = false; + g.LogType = ImGuiLogType_None; + g.LogFile = NULL; + g.LogBuffer.clear(); +} + +// Helper to display logging buttons +// FIXME-OBSOLETE: We should probably obsolete this and let the user have their own helper (this is one of the oldest function alive!) +void ImGui::LogButtons() +{ + ImGuiContext& g = *GImGui; + + PushID("LogButtons"); +#ifndef IMGUI_DISABLE_TTY_FUNCTIONS + const bool log_to_tty = Button("Log To TTY"); SameLine(); +#else + const bool log_to_tty = false; +#endif + const bool log_to_file = Button("Log To File"); SameLine(); + const bool log_to_clipboard = Button("Log To Clipboard"); SameLine(); + PushTabStop(false); + SetNextItemWidth(80.0f); + SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL); + PopTabStop(); + PopID(); + + // Start logging at the end of the function so that the buttons don't appear in the log + if (log_to_tty) + LogToTTY(); + if (log_to_file) + LogToFile(); + if (log_to_clipboard) + LogToClipboard(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] SETTINGS +//----------------------------------------------------------------------------- +// - UpdateSettings() [Internal] +// - MarkIniSettingsDirty() [Internal] +// - FindSettingsHandler() [Internal] +// - ClearIniSettings() [Internal] +// - LoadIniSettingsFromDisk() +// - LoadIniSettingsFromMemory() +// - SaveIniSettingsToDisk() +// - SaveIniSettingsToMemory() +//----------------------------------------------------------------------------- +// - CreateNewWindowSettings() [Internal] +// - FindWindowSettingsByID() [Internal] +// - FindWindowSettingsByWindow() [Internal] +// - ClearWindowSettings() [Internal] +// - WindowSettingsHandler_***() [Internal] +//----------------------------------------------------------------------------- + +// Called by NewFrame() +void ImGui::UpdateSettings() +{ + // Load settings on first frame (if not explicitly loaded manually before) + ImGuiContext& g = *GImGui; + if (!g.SettingsLoaded) + { + IM_ASSERT(g.SettingsWindows.empty()); + if (g.IO.IniFilename) + LoadIniSettingsFromDisk(g.IO.IniFilename); + g.SettingsLoaded = true; + } + + // Save settings (with a delay after the last modification, so we don't spam disk too much) + if (g.SettingsDirtyTimer > 0.0f) + { + g.SettingsDirtyTimer -= g.IO.DeltaTime; + if (g.SettingsDirtyTimer <= 0.0f) + { + if (g.IO.IniFilename != NULL) + SaveIniSettingsToDisk(g.IO.IniFilename); + else + g.IO.WantSaveIniSettings = true; // Let user know they can call SaveIniSettingsToMemory(). user will need to clear io.WantSaveIniSettings themselves. + g.SettingsDirtyTimer = 0.0f; + } + } +} + +void ImGui::MarkIniSettingsDirty() +{ + ImGuiContext& g = *GImGui; + if (g.SettingsDirtyTimer <= 0.0f) + g.SettingsDirtyTimer = g.IO.IniSavingRate; +} + +void ImGui::MarkIniSettingsDirty(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (!(window->Flags & ImGuiWindowFlags_NoSavedSettings)) + if (g.SettingsDirtyTimer <= 0.0f) + g.SettingsDirtyTimer = g.IO.IniSavingRate; +} + +void ImGui::AddSettingsHandler(const ImGuiSettingsHandler* handler) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(FindSettingsHandler(handler->TypeName) == NULL); + g.SettingsHandlers.push_back(*handler); +} + +void ImGui::RemoveSettingsHandler(const char* type_name) +{ + ImGuiContext& g = *GImGui; + if (ImGuiSettingsHandler* handler = FindSettingsHandler(type_name)) + g.SettingsHandlers.erase(handler); +} + +ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name) +{ + ImGuiContext& g = *GImGui; + const ImGuiID type_hash = ImHashStr(type_name); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].TypeHash == type_hash) + return &g.SettingsHandlers[handler_n]; + return NULL; +} + +// Clear all settings (windows, tables, docking etc.) +void ImGui::ClearIniSettings() +{ + ImGuiContext& g = *GImGui; + g.SettingsIniData.clear(); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ClearAllFn) + g.SettingsHandlers[handler_n].ClearAllFn(&g, &g.SettingsHandlers[handler_n]); +} + +void ImGui::LoadIniSettingsFromDisk(const char* ini_filename) +{ + size_t file_data_size = 0; + char* file_data = (char*)ImFileLoadToMemory(ini_filename, "rb", &file_data_size); + if (!file_data) + return; + if (file_data_size > 0) + LoadIniSettingsFromMemory(file_data, (size_t)file_data_size); + IM_FREE(file_data); +} + +// Zero-tolerance, no error reporting, cheap .ini parsing +void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Initialized); + //IM_ASSERT(!g.WithinFrameScope && "Cannot be called between NewFrame() and EndFrame()"); + //IM_ASSERT(g.SettingsLoaded == false && g.FrameCount == 0); + + // For user convenience, we allow passing a non zero-terminated string (hence the ini_size parameter). + // For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy.. + if (ini_size == 0) + ini_size = strlen(ini_data); + g.SettingsIniData.Buf.resize((int)ini_size + 1); + char* const buf = g.SettingsIniData.Buf.Data; + char* const buf_end = buf + ini_size; + memcpy(buf, ini_data, ini_size); + buf_end[0] = 0; + + // Call pre-read handlers + // Some types will clear their data (e.g. dock information) some types will allow merge/override (window) + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ReadInitFn) + g.SettingsHandlers[handler_n].ReadInitFn(&g, &g.SettingsHandlers[handler_n]); + + void* entry_data = NULL; + ImGuiSettingsHandler* entry_handler = NULL; + + char* line_end = NULL; + for (char* line = buf; line < buf_end; line = line_end + 1) + { + // Skip new lines markers, then find end of the line + while (*line == '\n' || *line == '\r') + line++; + line_end = line; + while (line_end < buf_end && *line_end != '\n' && *line_end != '\r') + line_end++; + line_end[0] = 0; + if (line[0] == ';') + continue; + if (line[0] == '[' && line_end > line && line_end[-1] == ']') + { + // Parse "[Type][Name]". Note that 'Name' can itself contains [] characters, which is acceptable with the current format and parsing code. + line_end[-1] = 0; + const char* name_end = line_end - 1; + const char* type_start = line + 1; + char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']'); + const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL; + if (!type_end || !name_start) + continue; + *type_end = 0; // Overwrite first ']' + name_start++; // Skip second '[' + entry_handler = FindSettingsHandler(type_start); + entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL; + } + else if (entry_handler != NULL && entry_data != NULL) + { + // Let type handler parse the line + entry_handler->ReadLineFn(&g, entry_handler, entry_data, line); + } + } + g.SettingsLoaded = true; + + // [DEBUG] Restore untouched copy so it can be browsed in Metrics (not strictly necessary) + memcpy(buf, ini_data, ini_size); + + // Call post-read handlers + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + if (g.SettingsHandlers[handler_n].ApplyAllFn) + g.SettingsHandlers[handler_n].ApplyAllFn(&g, &g.SettingsHandlers[handler_n]); +} + +void ImGui::SaveIniSettingsToDisk(const char* ini_filename) +{ + ImGuiContext& g = *GImGui; + g.SettingsDirtyTimer = 0.0f; + if (!ini_filename) + return; + + size_t ini_data_size = 0; + const char* ini_data = SaveIniSettingsToMemory(&ini_data_size); + ImFileHandle f = ImFileOpen(ini_filename, "wt"); + if (!f) + return; + ImFileWrite(ini_data, sizeof(char), ini_data_size, f); + ImFileClose(f); +} + +// Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer +const char* ImGui::SaveIniSettingsToMemory(size_t* out_size) +{ + ImGuiContext& g = *GImGui; + g.SettingsDirtyTimer = 0.0f; + g.SettingsIniData.Buf.resize(0); + g.SettingsIniData.Buf.push_back(0); + for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++) + { + ImGuiSettingsHandler* handler = &g.SettingsHandlers[handler_n]; + handler->WriteAllFn(&g, handler, &g.SettingsIniData); + } + if (out_size) + *out_size = (size_t)g.SettingsIniData.size(); + return g.SettingsIniData.c_str(); +} + +ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name) +{ + ImGuiContext& g = *GImGui; + +#if !IMGUI_DEBUG_INI_SETTINGS + // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID() + // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier. + if (const char* p = strstr(name, "###")) + name = p; +#endif + const size_t name_len = strlen(name); + + // Allocate chunk + const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1; + ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size); + IM_PLACEMENT_NEW(settings) ImGuiWindowSettings(); + settings->ID = ImHashStr(name, name_len); + memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator + + return settings; +} + +// We don't provide a FindWindowSettingsByName() because Docking system doesn't always hold on names. +// This is called once per window .ini entry + once per newly instantiated window. +ImGuiWindowSettings* ImGui::FindWindowSettingsByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->ID == id) + return settings; + return NULL; +} + +// This is faster if you are holding on a Window already as we don't need to perform a search. +ImGuiWindowSettings* ImGui::FindWindowSettingsByWindow(ImGuiWindow* window) +{ + ImGuiContext& g = *GImGui; + if (window->SettingsOffset != -1) + return g.SettingsWindows.ptr_from_offset(window->SettingsOffset); + return FindWindowSettingsByID(window->ID); +} + +// This will revert window to its initial state, including enabling the ImGuiCond_FirstUseEver/ImGuiCond_Once conditions once more. +void ImGui::ClearWindowSettings(const char* name) +{ + //IMGUI_DEBUG_LOG("ClearWindowSettings('%s')\n", name); + ImGuiWindow* window = FindWindowByName(name); + if (window != NULL) + { + window->Flags |= ImGuiWindowFlags_NoSavedSettings; + InitOrLoadWindowSettings(window, NULL); + } + if (ImGuiWindowSettings* settings = window ? FindWindowSettingsByWindow(window) : FindWindowSettingsByID(ImHashStr(name))) + settings->WantDelete = true; +} + +static void WindowSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Windows.Size; i++) + g.Windows[i]->SettingsOffset = -1; + g.SettingsWindows.clear(); +} + +static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiID id = ImHashStr(name); + ImGuiWindowSettings* settings = ImGui::FindWindowSettingsByID(id); + if (settings) + *settings = ImGuiWindowSettings(); // Clear existing if recycling previous entry + else + settings = ImGui::CreateNewWindowSettings(name); + settings->ID = id; + settings->WantApply = true; + return (void*)settings; +} + +static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) +{ + ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry; + int x, y; + int i; + if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) { settings->Pos = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) { settings->Size = ImVec2ih((short)x, (short)y); } + else if (sscanf(line, "Collapsed=%d", &i) == 1) { settings->Collapsed = (i != 0); } +} + +// Apply to existing windows (if any) +static void WindowSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + if (settings->WantApply) + { + if (ImGuiWindow* window = ImGui::FindWindowByID(settings->ID)) + ApplyWindowSettings(window, settings); + settings->WantApply = false; + } +} + +static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +{ + // Gather data from windows that were active during this session + // (if a window wasn't opened in this session we preserve its settings) + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* window = g.Windows[i]; + if (window->Flags & ImGuiWindowFlags_NoSavedSettings) + continue; + + ImGuiWindowSettings* settings = ImGui::FindWindowSettingsByWindow(window); + if (!settings) + { + settings = ImGui::CreateNewWindowSettings(window->Name); + window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings); + } + IM_ASSERT(settings->ID == window->ID); + settings->Pos = ImVec2ih(window->Pos); + settings->Size = ImVec2ih(window->SizeFull); + + settings->Collapsed = window->Collapsed; + settings->WantDelete = false; + } + + // Write to text buffer + buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + { + if (settings->WantDelete) + continue; + const char* settings_name = settings->GetName(); + buf->appendf("[%s][%s]\n", handler->TypeName, settings_name); + buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y); + buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y); + buf->appendf("Collapsed=%d\n", settings->Collapsed); + buf->append("\n"); + } +} + + +//----------------------------------------------------------------------------- +// [SECTION] LOCALIZATION +//----------------------------------------------------------------------------- + +void ImGui::LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count) +{ + ImGuiContext& g = *GImGui; + for (int n = 0; n < count; n++) + g.LocalizationTable[entries[n].Key] = entries[n].Text; +} + + +//----------------------------------------------------------------------------- +// [SECTION] VIEWPORTS, PLATFORM WINDOWS +//----------------------------------------------------------------------------- +// - GetMainViewport() +// - SetWindowViewport() [Internal] +// - UpdateViewportsNewFrame() [Internal] +// (this section is more complete in the 'docking' branch) +//----------------------------------------------------------------------------- + +ImGuiViewport* ImGui::GetMainViewport() +{ + ImGuiContext& g = *GImGui; + return g.Viewports[0]; +} + +void ImGui::SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport) +{ + window->Viewport = viewport; +} + +// Update viewports and monitor infos +static void ImGui::UpdateViewportsNewFrame() +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.Viewports.Size == 1); + + // Update main viewport with current platform position. + // FIXME-VIEWPORT: Size is driven by backend/user code for backward-compatibility but we should aim to make this more consistent. + ImGuiViewportP* main_viewport = g.Viewports[0]; + main_viewport->Flags = ImGuiViewportFlags_IsPlatformWindow | ImGuiViewportFlags_OwnedByApp; + main_viewport->Pos = ImVec2(0.0f, 0.0f); + main_viewport->Size = g.IO.DisplaySize; + + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + + // Lock down space taken by menu bars and status bars, reset the offset for fucntions like BeginMainMenuBar() to alter them again. + viewport->WorkOffsetMin = viewport->BuildWorkOffsetMin; + viewport->WorkOffsetMax = viewport->BuildWorkOffsetMax; + viewport->BuildWorkOffsetMin = viewport->BuildWorkOffsetMax = ImVec2(0.0f, 0.0f); + viewport->UpdateWorkRect(); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] DOCKING +//----------------------------------------------------------------------------- + +// (this section is filled in the 'docking' branch) + + +//----------------------------------------------------------------------------- +// [SECTION] PLATFORM DEPENDENT HELPERS +//----------------------------------------------------------------------------- + +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) + +#ifdef _MSC_VER +#pragma comment(lib, "user32") +#pragma comment(lib, "kernel32") +#endif + +// Win32 clipboard implementation +// We use g.ClipboardHandlerData for temporary storage to ensure it is freed on Shutdown() +static const char* GetClipboardTextFn_DefaultImpl(void* user_data_ctx) +{ + ImGuiContext& g = *(ImGuiContext*)user_data_ctx; + g.ClipboardHandlerData.clear(); + if (!::OpenClipboard(NULL)) + return NULL; + HANDLE wbuf_handle = ::GetClipboardData(CF_UNICODETEXT); + if (wbuf_handle == NULL) + { + ::CloseClipboard(); + return NULL; + } + if (const WCHAR* wbuf_global = (const WCHAR*)::GlobalLock(wbuf_handle)) + { + int buf_len = ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, NULL, 0, NULL, NULL); + g.ClipboardHandlerData.resize(buf_len); + ::WideCharToMultiByte(CP_UTF8, 0, wbuf_global, -1, g.ClipboardHandlerData.Data, buf_len, NULL, NULL); + } + ::GlobalUnlock(wbuf_handle); + ::CloseClipboard(); + return g.ClipboardHandlerData.Data; +} + +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + if (!::OpenClipboard(NULL)) + return; + const int wbuf_length = ::MultiByteToWideChar(CP_UTF8, 0, text, -1, NULL, 0); + HGLOBAL wbuf_handle = ::GlobalAlloc(GMEM_MOVEABLE, (SIZE_T)wbuf_length * sizeof(WCHAR)); + if (wbuf_handle == NULL) + { + ::CloseClipboard(); + return; + } + WCHAR* wbuf_global = (WCHAR*)::GlobalLock(wbuf_handle); + ::MultiByteToWideChar(CP_UTF8, 0, text, -1, wbuf_global, wbuf_length); + ::GlobalUnlock(wbuf_handle); + ::EmptyClipboard(); + if (::SetClipboardData(CF_UNICODETEXT, wbuf_handle) == NULL) + ::GlobalFree(wbuf_handle); + ::CloseClipboard(); +} + +#elif defined(__APPLE__) && TARGET_OS_OSX && defined(IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS) + +#include // Use old API to avoid need for separate .mm file +static PasteboardRef main_clipboard = 0; + +// OSX clipboard implementation +// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line! +static void SetClipboardTextFn_DefaultImpl(void*, const char* text) +{ + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardClear(main_clipboard); + CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text)); + if (cf_data) + { + PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0); + CFRelease(cf_data); + } +} + +static const char* GetClipboardTextFn_DefaultImpl(void* user_data_ctx) +{ + ImGuiContext& g = *(ImGuiContext*)user_data_ctx; + if (!main_clipboard) + PasteboardCreate(kPasteboardClipboard, &main_clipboard); + PasteboardSynchronize(main_clipboard); + + ItemCount item_count = 0; + PasteboardGetItemCount(main_clipboard, &item_count); + for (ItemCount i = 0; i < item_count; i++) + { + PasteboardItemID item_id = 0; + PasteboardGetItemIdentifier(main_clipboard, i + 1, &item_id); + CFArrayRef flavor_type_array = 0; + PasteboardCopyItemFlavors(main_clipboard, item_id, &flavor_type_array); + for (CFIndex j = 0, nj = CFArrayGetCount(flavor_type_array); j < nj; j++) + { + CFDataRef cf_data; + if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr) + { + g.ClipboardHandlerData.clear(); + int length = (int)CFDataGetLength(cf_data); + g.ClipboardHandlerData.resize(length + 1); + CFDataGetBytes(cf_data, CFRangeMake(0, length), (UInt8*)g.ClipboardHandlerData.Data); + g.ClipboardHandlerData[length] = 0; + CFRelease(cf_data); + return g.ClipboardHandlerData.Data; + } + } + } + return NULL; +} + +#else + +// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers. +static const char* GetClipboardTextFn_DefaultImpl(void* user_data_ctx) +{ + ImGuiContext& g = *(ImGuiContext*)user_data_ctx; + return g.ClipboardHandlerData.empty() ? NULL : g.ClipboardHandlerData.begin(); +} + +static void SetClipboardTextFn_DefaultImpl(void* user_data_ctx, const char* text) +{ + ImGuiContext& g = *(ImGuiContext*)user_data_ctx; + g.ClipboardHandlerData.clear(); + const char* text_end = text + strlen(text); + g.ClipboardHandlerData.resize((int)(text_end - text) + 1); + memcpy(&g.ClipboardHandlerData[0], text, (size_t)(text_end - text)); + g.ClipboardHandlerData[(int)(text_end - text)] = 0; +} + +#endif + +// Win32 API IME support (for Asian languages, etc.) +#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS) + +#include +#ifdef _MSC_VER +#pragma comment(lib, "imm32") +#endif + +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport* viewport, ImGuiPlatformImeData* data) +{ + // Notify OS Input Method Editor of text input position + HWND hwnd = (HWND)viewport->PlatformHandleRaw; + if (hwnd == 0) + return; + + //::ImmAssociateContextEx(hwnd, NULL, data->WantVisible ? IACE_DEFAULT : 0); + if (HIMC himc = ::ImmGetContext(hwnd)) + { + COMPOSITIONFORM composition_form = {}; + composition_form.ptCurrentPos.x = (LONG)data->InputPos.x; + composition_form.ptCurrentPos.y = (LONG)data->InputPos.y; + composition_form.dwStyle = CFS_FORCE_POSITION; + ::ImmSetCompositionWindow(himc, &composition_form); + CANDIDATEFORM candidate_form = {}; + candidate_form.dwStyle = CFS_CANDIDATEPOS; + candidate_form.ptCurrentPos.x = (LONG)data->InputPos.x; + candidate_form.ptCurrentPos.y = (LONG)data->InputPos.y; + ::ImmSetCandidateWindow(himc, &candidate_form); + ::ImmReleaseContext(hwnd, himc); + } +} + +#else + +static void SetPlatformImeDataFn_DefaultImpl(ImGuiViewport*, ImGuiPlatformImeData*) {} + +#endif + +//----------------------------------------------------------------------------- +// [SECTION] METRICS/DEBUGGER WINDOW +//----------------------------------------------------------------------------- +// - RenderViewportThumbnail() [Internal] +// - RenderViewportsThumbnails() [Internal] +// - DebugTextEncoding() +// - MetricsHelpMarker() [Internal] +// - ShowFontAtlas() [Internal] +// - ShowMetricsWindow() +// - DebugNodeColumns() [Internal] +// - DebugNodeDrawList() [Internal] +// - DebugNodeDrawCmdShowMeshAndBoundingBox() [Internal] +// - DebugNodeFont() [Internal] +// - DebugNodeFontGlyph() [Internal] +// - DebugNodeStorage() [Internal] +// - DebugNodeTabBar() [Internal] +// - DebugNodeViewport() [Internal] +// - DebugNodeWindow() [Internal] +// - DebugNodeWindowSettings() [Internal] +// - DebugNodeWindowsList() [Internal] +// - DebugNodeWindowsListByBeginStackParent() [Internal] +//----------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + +void ImGui::DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImVec2 scale = bb.GetSize() / viewport->Size; + ImVec2 off = bb.Min - viewport->Pos * scale; + float alpha_mul = 1.0f; + window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul * 0.40f)); + for (int i = 0; i != g.Windows.Size; i++) + { + ImGuiWindow* thumb_window = g.Windows[i]; + if (!thumb_window->WasActive || (thumb_window->Flags & ImGuiWindowFlags_ChildWindow)) + continue; + + ImRect thumb_r = thumb_window->Rect(); + ImRect title_r = thumb_window->TitleBarRect(); + thumb_r = ImRect(ImFloor(off + thumb_r.Min * scale), ImFloor(off + thumb_r.Max * scale)); + title_r = ImRect(ImFloor(off + title_r.Min * scale), ImFloor(off + ImVec2(title_r.Max.x, title_r.Min.y) * scale) + ImVec2(0,5)); // Exaggerate title bar height + thumb_r.ClipWithFull(bb); + title_r.ClipWithFull(bb); + const bool window_is_focused = (g.NavWindow && thumb_window->RootWindowForTitleBarHighlight == g.NavWindow->RootWindowForTitleBarHighlight); + window->DrawList->AddRectFilled(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_WindowBg, alpha_mul)); + window->DrawList->AddRectFilled(title_r.Min, title_r.Max, GetColorU32(window_is_focused ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg, alpha_mul)); + window->DrawList->AddRect(thumb_r.Min, thumb_r.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); + window->DrawList->AddText(g.Font, g.FontSize * 1.0f, title_r.Min, GetColorU32(ImGuiCol_Text, alpha_mul), thumb_window->Name, FindRenderedTextEnd(thumb_window->Name)); + } + draw_list->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_Border, alpha_mul)); +} + +static void RenderViewportsThumbnails() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // We don't display full monitor bounds (we could, but it often looks awkward), instead we display just enough to cover all of our viewports. + float SCALE = 1.0f / 8.0f; + ImRect bb_full(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + for (int n = 0; n < g.Viewports.Size; n++) + bb_full.Add(g.Viewports[n]->GetMainRect()); + ImVec2 p = window->DC.CursorPos; + ImVec2 off = p - bb_full.Min * SCALE; + for (int n = 0; n < g.Viewports.Size; n++) + { + ImGuiViewportP* viewport = g.Viewports[n]; + ImRect viewport_draw_bb(off + (viewport->Pos) * SCALE, off + (viewport->Pos + viewport->Size) * SCALE); + ImGui::DebugRenderViewportThumbnail(window->DrawList, viewport, viewport_draw_bb); + } + ImGui::Dummy(bb_full.GetSize() * SCALE); +} + +// Draw an arbitrary US keyboard layout to visualize translated keys +void ImGui::DebugRenderKeyboardPreview(ImDrawList* draw_list) +{ + const ImVec2 key_size = ImVec2(35.0f, 35.0f); + const float key_rounding = 3.0f; + const ImVec2 key_face_size = ImVec2(25.0f, 25.0f); + const ImVec2 key_face_pos = ImVec2(5.0f, 3.0f); + const float key_face_rounding = 2.0f; + const ImVec2 key_label_pos = ImVec2(7.0f, 4.0f); + const ImVec2 key_step = ImVec2(key_size.x - 1.0f, key_size.y - 1.0f); + const float key_row_offset = 9.0f; + + ImVec2 board_min = GetCursorScreenPos(); + ImVec2 board_max = ImVec2(board_min.x + 3 * key_step.x + 2 * key_row_offset + 10.0f, board_min.y + 3 * key_step.y + 10.0f); + ImVec2 start_pos = ImVec2(board_min.x + 5.0f - key_step.x, board_min.y); + + struct KeyLayoutData { int Row, Col; const char* Label; ImGuiKey Key; }; + const KeyLayoutData keys_to_display[] = + { + { 0, 0, "", ImGuiKey_Tab }, { 0, 1, "Q", ImGuiKey_Q }, { 0, 2, "W", ImGuiKey_W }, { 0, 3, "E", ImGuiKey_E }, { 0, 4, "R", ImGuiKey_R }, + { 1, 0, "", ImGuiKey_CapsLock }, { 1, 1, "A", ImGuiKey_A }, { 1, 2, "S", ImGuiKey_S }, { 1, 3, "D", ImGuiKey_D }, { 1, 4, "F", ImGuiKey_F }, + { 2, 0, "", ImGuiKey_LeftShift },{ 2, 1, "Z", ImGuiKey_Z }, { 2, 2, "X", ImGuiKey_X }, { 2, 3, "C", ImGuiKey_C }, { 2, 4, "V", ImGuiKey_V } + }; + + // Elements rendered manually via ImDrawList API are not clipped automatically. + // While not strictly necessary, here IsItemVisible() is used to avoid rendering these shapes when they are out of view. + Dummy(board_max - board_min); + if (!IsItemVisible()) + return; + draw_list->PushClipRect(board_min, board_max, true); + for (int n = 0; n < IM_ARRAYSIZE(keys_to_display); n++) + { + const KeyLayoutData* key_data = &keys_to_display[n]; + ImVec2 key_min = ImVec2(start_pos.x + key_data->Col * key_step.x + key_data->Row * key_row_offset, start_pos.y + key_data->Row * key_step.y); + ImVec2 key_max = key_min + key_size; + draw_list->AddRectFilled(key_min, key_max, IM_COL32(204, 204, 204, 255), key_rounding); + draw_list->AddRect(key_min, key_max, IM_COL32(24, 24, 24, 255), key_rounding); + ImVec2 face_min = ImVec2(key_min.x + key_face_pos.x, key_min.y + key_face_pos.y); + ImVec2 face_max = ImVec2(face_min.x + key_face_size.x, face_min.y + key_face_size.y); + draw_list->AddRect(face_min, face_max, IM_COL32(193, 193, 193, 255), key_face_rounding, ImDrawFlags_None, 2.0f); + draw_list->AddRectFilled(face_min, face_max, IM_COL32(252, 252, 252, 255), key_face_rounding); + ImVec2 label_min = ImVec2(key_min.x + key_label_pos.x, key_min.y + key_label_pos.y); + draw_list->AddText(label_min, IM_COL32(64, 64, 64, 255), key_data->Label); + if (ImGui::IsKeyDown(key_data->Key)) + draw_list->AddRectFilled(key_min, key_max, IM_COL32(255, 0, 0, 128), key_rounding); + } + draw_list->PopClipRect(); +} + +// Helper tool to diagnose between text encoding issues and font loading issues. Pass your UTF-8 string and verify that there are correct. +void ImGui::DebugTextEncoding(const char* str) +{ + Text("Text: \"%s\"", str); + if (!BeginTable("list", 4, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit)) + return; + TableSetupColumn("Offset"); + TableSetupColumn("UTF-8"); + TableSetupColumn("Glyph"); + TableSetupColumn("Codepoint"); + TableHeadersRow(); + for (const char* p = str; *p != 0; ) + { + unsigned int c; + const int c_utf8_len = ImTextCharFromUtf8(&c, p, NULL); + TableNextColumn(); + Text("%d", (int)(p - str)); + TableNextColumn(); + for (int byte_index = 0; byte_index < c_utf8_len; byte_index++) + { + if (byte_index > 0) + SameLine(); + Text("0x%02X", (int)(unsigned char)p[byte_index]); + } + TableNextColumn(); + if (GetFont()->FindGlyphNoFallback((ImWchar)c)) + TextUnformatted(p, p + c_utf8_len); + else + TextUnformatted((c == IM_UNICODE_CODEPOINT_INVALID) ? "[invalid]" : "[missing]"); + TableNextColumn(); + Text("U+%04X", (int)c); + p += c_utf8_len; + } + EndTable(); +} + +// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds. +static void MetricsHelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) + { + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// [DEBUG] List fonts in a font atlas and display its texture +void ImGui::ShowFontAtlas(ImFontAtlas* atlas) +{ + for (int i = 0; i < atlas->Fonts.Size; i++) + { + ImFont* font = atlas->Fonts[i]; + PushID(font); + DebugNodeFont(font); + PopID(); + } + if (TreeNode("Font Atlas", "Font Atlas (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight)) + { + ImGuiContext& g = *GImGui; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + Checkbox("Tint with Text Color", &cfg->ShowAtlasTintedWithTextColor); // Using text color ensure visibility of core atlas data, but will alter custom colored icons + ImVec4 tint_col = cfg->ShowAtlasTintedWithTextColor ? GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f); + ImVec4 border_col = GetStyleColorVec4(ImGuiCol_Border); + Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0.0f, 0.0f), ImVec2(1.0f, 1.0f), tint_col, border_col); + TreePop(); + } +} + +void ImGui::ShowMetricsWindow(bool* p_open) +{ + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + if (cfg->ShowDebugLog) + ShowDebugLogWindow(&cfg->ShowDebugLog); + if (cfg->ShowStackTool) + ShowStackToolWindow(&cfg->ShowStackTool); + + if (!Begin("Dear ImGui Metrics/Debugger", p_open) || GetCurrentWindow()->BeginCount > 1) + { + End(); + return; + } + + // Basic info + Text("Dear ImGui %s", GetVersion()); + Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); + Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3); + Text("%d visible windows, %d active allocations", io.MetricsRenderWindows, io.MetricsActiveAllocations); + //SameLine(); if (SmallButton("GC")) { g.GcCompactAll = true; } + + Separator(); + + // Debugging enums + enum { WRT_OuterRect, WRT_OuterRectClipped, WRT_InnerRect, WRT_InnerClipRect, WRT_WorkRect, WRT_Content, WRT_ContentIdeal, WRT_ContentRegionRect, WRT_Count }; // Windows Rect Type + const char* wrt_rects_names[WRT_Count] = { "OuterRect", "OuterRectClipped", "InnerRect", "InnerClipRect", "WorkRect", "Content", "ContentIdeal", "ContentRegionRect" }; + enum { TRT_OuterRect, TRT_InnerRect, TRT_WorkRect, TRT_HostClipRect, TRT_InnerClipRect, TRT_BackgroundClipRect, TRT_ColumnsRect, TRT_ColumnsWorkRect, TRT_ColumnsClipRect, TRT_ColumnsContentHeadersUsed, TRT_ColumnsContentHeadersIdeal, TRT_ColumnsContentFrozen, TRT_ColumnsContentUnfrozen, TRT_Count }; // Tables Rect Type + const char* trt_rects_names[TRT_Count] = { "OuterRect", "InnerRect", "WorkRect", "HostClipRect", "InnerClipRect", "BackgroundClipRect", "ColumnsRect", "ColumnsWorkRect", "ColumnsClipRect", "ColumnsContentHeadersUsed", "ColumnsContentHeadersIdeal", "ColumnsContentFrozen", "ColumnsContentUnfrozen" }; + if (cfg->ShowWindowsRectsType < 0) + cfg->ShowWindowsRectsType = WRT_WorkRect; + if (cfg->ShowTablesRectsType < 0) + cfg->ShowTablesRectsType = TRT_WorkRect; + + struct Funcs + { + static ImRect GetTableRect(ImGuiTable* table, int rect_type, int n) + { + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); // Always using last submitted instance + if (rect_type == TRT_OuterRect) { return table->OuterRect; } + else if (rect_type == TRT_InnerRect) { return table->InnerRect; } + else if (rect_type == TRT_WorkRect) { return table->WorkRect; } + else if (rect_type == TRT_HostClipRect) { return table->HostClipRect; } + else if (rect_type == TRT_InnerClipRect) { return table->InnerClipRect; } + else if (rect_type == TRT_BackgroundClipRect) { return table->BgClipRect; } + else if (rect_type == TRT_ColumnsRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->MinX, table->InnerClipRect.Min.y, c->MaxX, table->InnerClipRect.Min.y + table_instance->LastOuterHeight); } + else if (rect_type == TRT_ColumnsWorkRect) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->WorkRect.Min.y, c->WorkMaxX, table->WorkRect.Max.y); } + else if (rect_type == TRT_ColumnsClipRect) { ImGuiTableColumn* c = &table->Columns[n]; return c->ClipRect; } + else if (rect_type == TRT_ColumnsContentHeadersUsed){ ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersUsed, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } // Note: y1/y2 not always accurate + else if (rect_type == TRT_ColumnsContentHeadersIdeal){ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXHeadersIdeal, table->InnerClipRect.Min.y + table_instance->LastFirstRowHeight); } + else if (rect_type == TRT_ColumnsContentFrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y, c->ContentMaxXFrozen, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight); } + else if (rect_type == TRT_ColumnsContentUnfrozen) { ImGuiTableColumn* c = &table->Columns[n]; return ImRect(c->WorkMinX, table->InnerClipRect.Min.y + table_instance->LastFrozenHeight, c->ContentMaxXUnfrozen, table->InnerClipRect.Max.y); } + IM_ASSERT(0); + return ImRect(); + } + + static ImRect GetWindowRect(ImGuiWindow* window, int rect_type) + { + if (rect_type == WRT_OuterRect) { return window->Rect(); } + else if (rect_type == WRT_OuterRectClipped) { return window->OuterRectClipped; } + else if (rect_type == WRT_InnerRect) { return window->InnerRect; } + else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; } + else if (rect_type == WRT_WorkRect) { return window->WorkRect; } + else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); } + else if (rect_type == WRT_ContentIdeal) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSizeIdeal); } + else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; } + IM_ASSERT(0); + return ImRect(); + } + }; + + // Tools + if (TreeNode("Tools")) + { + bool show_encoding_viewer = TreeNode("UTF-8 Encoding viewer"); + SameLine(); + MetricsHelpMarker("You can also call ImGui::DebugTextEncoding() from your code with a given string to test that your UTF-8 encoding settings are correct."); + if (show_encoding_viewer) + { + static char buf[100] = ""; + SetNextItemWidth(-FLT_MIN); + InputText("##Text", buf, IM_ARRAYSIZE(buf)); + if (buf[0] != 0) + DebugTextEncoding(buf); + TreePop(); + } + + // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted. + if (Checkbox("Show Item Picker", &g.DebugItemPickerActive) && g.DebugItemPickerActive) + DebugStartItemPicker(); + SameLine(); + MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash."); + + // Stack Tool is your best friend! + Checkbox("Show Debug Log", &cfg->ShowDebugLog); + SameLine(); + MetricsHelpMarker("You can also call ImGui::ShowDebugLogWindow() from your code."); + + // Stack Tool is your best friend! + Checkbox("Show Stack Tool", &cfg->ShowStackTool); + SameLine(); + MetricsHelpMarker("You can also call ImGui::ShowStackToolWindow() from your code."); + + Checkbox("Show windows begin order", &cfg->ShowWindowsBeginOrder); + Checkbox("Show windows rectangles", &cfg->ShowWindowsRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowWindowsRects |= Combo("##show_windows_rect_type", &cfg->ShowWindowsRectsType, wrt_rects_names, WRT_Count, WRT_Count); + if (cfg->ShowWindowsRects && g.NavWindow != NULL) + { + BulletText("'%s':", g.NavWindow->Name); + Indent(); + for (int rect_n = 0; rect_n < WRT_Count; rect_n++) + { + ImRect r = Funcs::GetWindowRect(g.NavWindow, rect_n); + Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), wrt_rects_names[rect_n]); + } + Unindent(); + } + + Checkbox("Show tables rectangles", &cfg->ShowTablesRects); + SameLine(); + SetNextItemWidth(GetFontSize() * 12); + cfg->ShowTablesRects |= Combo("##show_table_rects_type", &cfg->ShowTablesRectsType, trt_rects_names, TRT_Count, TRT_Count); + if (cfg->ShowTablesRects && g.NavWindow != NULL) + { + for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) + { + ImGuiTable* table = g.Tables.TryGetMapData(table_n); + if (table == NULL || table->LastFrameActive < g.FrameCount - 1 || (table->OuterWindow != g.NavWindow && table->InnerWindow != g.NavWindow)) + continue; + + BulletText("Table 0x%08X (%d columns, in '%s')", table->ID, table->ColumnsCount, table->OuterWindow->Name); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min - ImVec2(1, 1), table->OuterRect.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + Indent(); + char buf[128]; + for (int rect_n = 0; rect_n < TRT_Count; rect_n++) + { + if (rect_n >= TRT_ColumnsRect) + { + if (rect_n != TRT_ColumnsRect && rect_n != TRT_ColumnsClipRect) + continue; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, rect_n, column_n); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) Col %d %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), column_n, trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, rect_n, -1); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), trt_rects_names[rect_n]); + Selectable(buf); + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(r.Min - ImVec2(1, 1), r.Max + ImVec2(1, 1), IM_COL32(255, 255, 0, 255), 0.0f, 0, 2.0f); + } + } + Unindent(); + } + } + + TreePop(); + } + + // Windows + if (TreeNode("Windows", "Windows (%d)", g.Windows.Size)) + { + //SetNextItemOpen(true, ImGuiCond_Once); + DebugNodeWindowsList(&g.Windows, "By display order"); + DebugNodeWindowsList(&g.WindowsFocusOrder, "By focus order (root windows)"); + if (TreeNode("By submission order (begin stack)")) + { + // Here we display windows in their submitted order/hierarchy, however note that the Begin stack doesn't constitute a Parent<>Child relationship! + ImVector& temp_buffer = g.WindowsTempSortBuffer; + temp_buffer.resize(0); + for (int i = 0; i < g.Windows.Size; i++) + if (g.Windows[i]->LastFrameActive + 1 >= g.FrameCount) + temp_buffer.push_back(g.Windows[i]); + struct Func { static int IMGUI_CDECL WindowComparerByBeginOrder(const void* lhs, const void* rhs) { return ((int)(*(const ImGuiWindow* const *)lhs)->BeginOrderWithinContext - (*(const ImGuiWindow* const*)rhs)->BeginOrderWithinContext); } }; + ImQsort(temp_buffer.Data, (size_t)temp_buffer.Size, sizeof(ImGuiWindow*), Func::WindowComparerByBeginOrder); + DebugNodeWindowsListByBeginStackParent(temp_buffer.Data, temp_buffer.Size, NULL); + TreePop(); + } + + TreePop(); + } + + // DrawLists + int drawlist_count = 0; + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + drawlist_count += g.Viewports[viewport_i]->DrawDataBuilder.GetDrawListCount(); + if (TreeNode("DrawLists", "DrawLists (%d)", drawlist_count)) + { + Checkbox("Show ImDrawCmd mesh when hovering", &cfg->ShowDrawCmdMesh); + Checkbox("Show ImDrawCmd bounding boxes when hovering", &cfg->ShowDrawCmdBoundingBoxes); + for (int viewport_i = 0; viewport_i < g.Viewports.Size; viewport_i++) + { + ImGuiViewportP* viewport = g.Viewports[viewport_i]; + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + } + TreePop(); + } + + // Viewports + if (TreeNode("Viewports", "Viewports (%d)", g.Viewports.Size)) + { + Indent(GetTreeNodeToLabelSpacing()); + RenderViewportsThumbnails(); + Unindent(GetTreeNodeToLabelSpacing()); + for (int i = 0; i < g.Viewports.Size; i++) + DebugNodeViewport(g.Viewports[i]); + TreePop(); + } + + // Details for Popups + if (TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size)) + { + for (int i = 0; i < g.OpenPopupStack.Size; i++) + { + // As it's difficult to interact with tree nodes while popups are open, we display everything inline. + const ImGuiPopupData* popup_data = &g.OpenPopupStack[i]; + ImGuiWindow* window = popup_data->Window; + BulletText("PopupID: %08x, Window: '%s' (%s%s), BackupNavWindow '%s', ParentWindow '%s'", + popup_data->PopupId, window ? window->Name : "NULL", window && (window->Flags & ImGuiWindowFlags_ChildWindow) ? "Child;" : "", window && (window->Flags & ImGuiWindowFlags_ChildMenu) ? "Menu;" : "", + popup_data->BackupNavWindow ? popup_data->BackupNavWindow->Name : "NULL", window && window->ParentWindow ? window->ParentWindow->Name : "NULL"); + } + TreePop(); + } + + // Details for TabBars + if (TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.GetAliveCount())) + { + for (int n = 0; n < g.TabBars.GetMapSize(); n++) + if (ImGuiTabBar* tab_bar = g.TabBars.TryGetMapData(n)) + { + PushID(tab_bar); + DebugNodeTabBar(tab_bar, "TabBar"); + PopID(); + } + TreePop(); + } + + // Details for Tables + if (TreeNode("Tables", "Tables (%d)", g.Tables.GetAliveCount())) + { + for (int n = 0; n < g.Tables.GetMapSize(); n++) + if (ImGuiTable* table = g.Tables.TryGetMapData(n)) + DebugNodeTable(table); + TreePop(); + } + + // Details for Fonts + ImFontAtlas* atlas = g.IO.Fonts; + if (TreeNode("Fonts", "Fonts (%d)", atlas->Fonts.Size)) + { + ShowFontAtlas(atlas); + TreePop(); + } + + // Details for InputText + if (TreeNode("InputText")) + { + DebugNodeInputTextState(&g.InputTextState); + TreePop(); + } + + // Details for Docking +#ifdef IMGUI_HAS_DOCK + if (TreeNode("Docking")) + { + TreePop(); + } +#endif // #ifdef IMGUI_HAS_DOCK + + // Settings + if (TreeNode("Settings")) + { + if (SmallButton("Clear")) + ClearIniSettings(); + SameLine(); + if (SmallButton("Save to memory")) + SaveIniSettingsToMemory(); + SameLine(); + if (SmallButton("Save to disk")) + SaveIniSettingsToDisk(g.IO.IniFilename); + SameLine(); + if (g.IO.IniFilename) + Text("\"%s\"", g.IO.IniFilename); + else + TextUnformatted(""); + Text("SettingsDirtyTimer %.2f", g.SettingsDirtyTimer); + if (TreeNode("SettingsHandlers", "Settings handlers: (%d)", g.SettingsHandlers.Size)) + { + for (int n = 0; n < g.SettingsHandlers.Size; n++) + BulletText("%s", g.SettingsHandlers[n].TypeName); + TreePop(); + } + if (TreeNode("SettingsWindows", "Settings packed data: Windows: %d bytes", g.SettingsWindows.size())) + { + for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings)) + DebugNodeWindowSettings(settings); + TreePop(); + } + + if (TreeNode("SettingsTables", "Settings packed data: Tables: %d bytes", g.SettingsTables.size())) + { + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + DebugNodeTableSettings(settings); + TreePop(); + } + +#ifdef IMGUI_HAS_DOCK +#endif // #ifdef IMGUI_HAS_DOCK + + if (TreeNode("SettingsIniData", "Settings unpacked data (.ini): %d bytes", g.SettingsIniData.size())) + { + InputTextMultiline("##Ini", (char*)(void*)g.SettingsIniData.c_str(), g.SettingsIniData.Buf.Size, ImVec2(-FLT_MIN, GetTextLineHeight() * 20), ImGuiInputTextFlags_ReadOnly); + TreePop(); + } + TreePop(); + } + + if (TreeNode("Inputs")) + { + Text("KEYBOARD/GAMEPAD/MOUSE KEYS"); + { + // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends. + // User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END. + Indent(); +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; +#else + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + //Text("Legacy raw:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key++) { if (io.KeysDown[key]) { SameLine(); Text("\"%s\" %d", GetKeyName(key), key); } } +#endif + Text("Keys down:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyDown(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); SameLine(); Text("(%.02f)", GetKeyData(key)->DownDuration); } + Text("Keys pressed:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyPressed(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); } + Text("Keys released:"); for (ImGuiKey key = ImGuiKey_KeysData_OFFSET; key < ImGuiKey_COUNT; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !IsKeyReleased(key)) continue; SameLine(); Text(IsNamedKey(key) ? "\"%s\"" : "\"%s\" %d", GetKeyName(key), key); } + Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); + Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; SameLine(); Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. + DebugRenderKeyboardPreview(GetWindowDrawList()); + Unindent(); + } + + Text("MOUSE STATE"); + { + Indent(); + if (IsMousePosValid()) + Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); + else + Text("Mouse pos: "); + Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); + int count = IM_ARRAYSIZE(io.MouseDown); + Text("Mouse down:"); for (int i = 0; i < count; i++) if (IsMouseDown(i)) { SameLine(); Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } + Text("Mouse clicked:"); for (int i = 0; i < count; i++) if (IsMouseClicked(i)) { SameLine(); Text("b%d (%d)", i, io.MouseClickedCount[i]); } + Text("Mouse released:"); for (int i = 0; i < count; i++) if (IsMouseReleased(i)) { SameLine(); Text("b%d", i); } + Text("Mouse wheel: %.1f", io.MouseWheel); + Text("Pen Pressure: %.1f", io.PenPressure); // Note: currently unused + Unindent(); + } + + Text("MOUSE WHEELING"); + { + Indent(); + Text("WheelingWindow: '%s'", g.WheelingWindow ? g.WheelingWindow->Name : "NULL"); + Text("WheelingWindowReleaseTimer: %.2f", g.WheelingWindowReleaseTimer); + Text("WheelingAxisAvg[] = { %.3f, %.3f }, Main Axis: %s", g.WheelingAxisAvg.x, g.WheelingAxisAvg.y, (g.WheelingAxisAvg.x > g.WheelingAxisAvg.y) ? "X" : (g.WheelingAxisAvg.x < g.WheelingAxisAvg.y) ? "Y" : ""); + Unindent(); + } + + Text("KEY OWNERS"); + { + Indent(); + if (BeginListBox("##owners", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) + { + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + { + ImGuiKeyOwnerData* owner_data = GetKeyOwnerData(key); + if (owner_data->OwnerCurr == ImGuiKeyOwner_None) + continue; + Text("%s: 0x%08X%s", GetKeyName(key), owner_data->OwnerCurr, + owner_data->LockUntilRelease ? " LockUntilRelease" : owner_data->LockThisFrame ? " LockThisFrame" : ""); + DebugLocateItemOnHover(owner_data->OwnerCurr); + } + EndListBox(); + } + Unindent(); + } + Text("SHORTCUT ROUTING"); + { + Indent(); + if (BeginListBox("##routes", ImVec2(-FLT_MIN, GetTextLineHeightWithSpacing() * 6))) + { + for (ImGuiKey key = ImGuiKey_NamedKey_BEGIN; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) + { + ImGuiKeyRoutingTable* rt = &g.KeysRoutingTable; + for (ImGuiKeyRoutingIndex idx = rt->Index[key - ImGuiKey_NamedKey_BEGIN]; idx != -1; ) + { + char key_chord_name[64]; + ImGuiKeyRoutingData* routing_data = &rt->Entries[idx]; + GetKeyChordName(key | routing_data->Mods, key_chord_name, IM_ARRAYSIZE(key_chord_name)); + Text("%s: 0x%08X", key_chord_name, routing_data->RoutingCurr); + DebugLocateItemOnHover(routing_data->RoutingCurr); + idx = routing_data->NextEntryIndex; + } + } + EndListBox(); + } + Text("(ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: 0x%X)", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); + Unindent(); + } + TreePop(); + } + + if (TreeNode("Internal state")) + { + Text("WINDOWING"); + Indent(); + Text("HoveredWindow: '%s'", g.HoveredWindow ? g.HoveredWindow->Name : "NULL"); + Text("HoveredWindow->Root: '%s'", g.HoveredWindow ? g.HoveredWindow->RootWindow->Name : "NULL"); + Text("HoveredWindowUnderMovingWindow: '%s'", g.HoveredWindowUnderMovingWindow ? g.HoveredWindowUnderMovingWindow->Name : "NULL"); + Text("MovingWindow: '%s'", g.MovingWindow ? g.MovingWindow->Name : "NULL"); + Unindent(); + + Text("ITEMS"); + Indent(); + Text("ActiveId: 0x%08X/0x%08X (%.2f sec), AllowOverlap: %d, Source: %s", g.ActiveId, g.ActiveIdPreviousFrame, g.ActiveIdTimer, g.ActiveIdAllowOverlap, GetInputSourceName(g.ActiveIdSource)); + DebugLocateItemOnHover(g.ActiveId); + Text("ActiveIdWindow: '%s'", g.ActiveIdWindow ? g.ActiveIdWindow->Name : "NULL"); + Text("ActiveIdUsing: AllKeyboardKeys: %d, NavDirMask: %X", g.ActiveIdUsingAllKeyboardKeys, g.ActiveIdUsingNavDirMask); + Text("HoveredId: 0x%08X (%.2f sec), AllowOverlap: %d", g.HoveredIdPreviousFrame, g.HoveredIdTimer, g.HoveredIdAllowOverlap); // Not displaying g.HoveredId as it is update mid-frame + Text("HoverDelayId: 0x%08X, Timer: %.2f, ClearTimer: %.2f", g.HoverDelayId, g.HoverDelayTimer, g.HoverDelayClearTimer); + Text("DragDrop: %d, SourceId = 0x%08X, Payload \"%s\" (%d bytes)", g.DragDropActive, g.DragDropPayload.SourceId, g.DragDropPayload.DataType, g.DragDropPayload.DataSize); + DebugLocateItemOnHover(g.DragDropPayload.SourceId); + Unindent(); + + Text("NAV,FOCUS"); + Indent(); + Text("NavWindow: '%s'", g.NavWindow ? g.NavWindow->Name : "NULL"); + Text("NavId: 0x%08X, NavLayer: %d", g.NavId, g.NavLayer); + DebugLocateItemOnHover(g.NavId); + Text("NavInputSource: %s", GetInputSourceName(g.NavInputSource)); + Text("NavActive: %d, NavVisible: %d", g.IO.NavActive, g.IO.NavVisible); + Text("NavActivateId/DownId/PressedId: %08X/%08X/%08X", g.NavActivateId, g.NavActivateDownId, g.NavActivatePressedId); + Text("NavActivateFlags: %04X", g.NavActivateFlags); + Text("NavDisableHighlight: %d, NavDisableMouseHover: %d", g.NavDisableHighlight, g.NavDisableMouseHover); + Text("NavFocusScopeId = 0x%08X", g.NavFocusScopeId); + Text("NavWindowingTarget: '%s'", g.NavWindowingTarget ? g.NavWindowingTarget->Name : "NULL"); + Unindent(); + + TreePop(); + } + + // Overlay: Display windows Rectangles and Begin Order + if (cfg->ShowWindowsRects || cfg->ShowWindowsBeginOrder) + { + for (int n = 0; n < g.Windows.Size; n++) + { + ImGuiWindow* window = g.Windows[n]; + if (!window->WasActive) + continue; + ImDrawList* draw_list = GetForegroundDrawList(window); + if (cfg->ShowWindowsRects) + { + ImRect r = Funcs::GetWindowRect(window, cfg->ShowWindowsRectsType); + draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); + } + if (cfg->ShowWindowsBeginOrder && !(window->Flags & ImGuiWindowFlags_ChildWindow)) + { + char buf[32]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext); + float font_size = GetFontSize(); + draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255)); + draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf); + } + } + } + + // Overlay: Display Tables Rectangles + if (cfg->ShowTablesRects) + { + for (int table_n = 0; table_n < g.Tables.GetMapSize(); table_n++) + { + ImGuiTable* table = g.Tables.TryGetMapData(table_n); + if (table == NULL || table->LastFrameActive < g.FrameCount - 1) + continue; + ImDrawList* draw_list = GetForegroundDrawList(table->OuterWindow); + if (cfg->ShowTablesRectsType >= TRT_ColumnsRect) + { + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, column_n); + ImU32 col = (table->HoveredColumnBody == column_n) ? IM_COL32(255, 255, 128, 255) : IM_COL32(255, 0, 128, 255); + float thickness = (table->HoveredColumnBody == column_n) ? 3.0f : 1.0f; + draw_list->AddRect(r.Min, r.Max, col, 0.0f, 0, thickness); + } + } + else + { + ImRect r = Funcs::GetTableRect(table, cfg->ShowTablesRectsType, -1); + draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255)); + } + } + } + +#ifdef IMGUI_HAS_DOCK + // Overlay: Display Docking info + if (show_docking_nodes && g.IO.KeyCtrl) + { + } +#endif // #ifdef IMGUI_HAS_DOCK + + End(); +} + +// [DEBUG] Display contents of Columns +void ImGui::DebugNodeColumns(ImGuiOldColumns* columns) +{ + if (!TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags)) + return; + BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX); + for (int column_n = 0; column_n < columns->Columns.Size; column_n++) + BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm)); + TreePop(); +} + +// [DEBUG] Display contents of ImDrawList +void ImGui::DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiMetricsConfig* cfg = &g.DebugMetricsConfig; + int cmd_count = draw_list->CmdBuffer.Size; + if (cmd_count > 0 && draw_list->CmdBuffer.back().ElemCount == 0 && draw_list->CmdBuffer.back().UserCallback == NULL) + cmd_count--; + bool node_open = TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, cmd_count); + if (draw_list == GetWindowDrawList()) + { + SameLine(); + TextColored(ImVec4(1.0f, 0.4f, 0.4f, 1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered) + if (node_open) + TreePop(); + return; + } + + ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list + if (window && IsItemHovered() && fg_draw_list) + fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!node_open) + return; + + if (window && !window->WasActive) + TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!"); + + for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.Data; pcmd < draw_list->CmdBuffer.Data + cmd_count; pcmd++) + { + if (pcmd->UserCallback) + { + BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData); + continue; + } + + char buf[300]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd:%5d tris, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)", + pcmd->ElemCount / 3, (void*)(intptr_t)pcmd->TextureId, + pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w); + bool pcmd_node_open = TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf); + if (IsItemHovered() && (cfg->ShowDrawCmdMesh || cfg->ShowDrawCmdBoundingBoxes) && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, cfg->ShowDrawCmdMesh, cfg->ShowDrawCmdBoundingBoxes); + if (!pcmd_node_open) + continue; + + // Calculate approximate coverage area (touched pixel count) + // This will be in pixels squared as long there's no post-scaling happening to the renderer output. + const ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; + const ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + pcmd->VtxOffset; + float total_area = 0.0f; + for (unsigned int idx_n = pcmd->IdxOffset; idx_n < pcmd->IdxOffset + pcmd->ElemCount; ) + { + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos; + total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]); + } + + // Display vertex information summary. Hover to get all triangles drawn in wire-frame + ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area); + Selectable(buf); + if (IsItemHovered() && fg_draw_list) + DebugNodeDrawCmdShowMeshAndBoundingBox(fg_draw_list, draw_list, pcmd, true, false); + + // Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted. + ImGuiListClipper clipper; + clipper.Begin(pcmd->ElemCount / 3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible. + while (clipper.Step()) + for (int prim = clipper.DisplayStart, idx_i = pcmd->IdxOffset + clipper.DisplayStart * 3; prim < clipper.DisplayEnd; prim++) + { + char* buf_p = buf, * buf_end = buf + IM_ARRAYSIZE(buf); + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_i++) + { + const ImDrawVert& v = vtx_buffer[idx_buffer ? idx_buffer[idx_i] : idx_i]; + triangle[n] = v.pos; + buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", + (n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col); + } + + Selectable(buf, false); + if (fg_draw_list && IsItemHovered()) + { + ImDrawListFlags backup_flags = fg_draw_list->Flags; + fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); + fg_draw_list->Flags = backup_flags; + } + } + TreePop(); + } + TreePop(); +} + +// [DEBUG] Display mesh/aabb of a ImDrawCmd +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb) +{ + IM_ASSERT(show_mesh || show_aabb); + + // Draw wire-frame version of all triangles + ImRect clip_rect = draw_cmd->ClipRect; + ImRect vtxs_rect(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX); + ImDrawListFlags backup_flags = out_draw_list->Flags; + out_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles. + for (unsigned int idx_n = draw_cmd->IdxOffset, idx_end = draw_cmd->IdxOffset + draw_cmd->ElemCount; idx_n < idx_end; ) + { + ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL; // We don't hold on those pointers past iterations as ->AddPolyline() may invalidate them if out_draw_list==draw_list + ImDrawVert* vtx_buffer = draw_list->VtxBuffer.Data + draw_cmd->VtxOffset; + + ImVec2 triangle[3]; + for (int n = 0; n < 3; n++, idx_n++) + vtxs_rect.Add((triangle[n] = vtx_buffer[idx_buffer ? idx_buffer[idx_n] : idx_n].pos)); + if (show_mesh) + out_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), ImDrawFlags_Closed, 1.0f); // In yellow: mesh triangles + } + // Draw bounding boxes + if (show_aabb) + { + out_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255)); // In pink: clipping rectangle submitted to GPU + out_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(0, 255, 255, 255)); // In cyan: bounding box of triangles + } + out_draw_list->Flags = backup_flags; +} + +// [DEBUG] Display details for a single font, called by ShowStyleEditor(). +void ImGui::DebugNodeFont(ImFont* font) +{ + bool opened = TreeNode(font, "Font: \"%s\"\n%.2f px, %d glyphs, %d file(s)", + font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount); + SameLine(); + if (SmallButton("Set as default")) + GetIO().FontDefault = font; + if (!opened) + return; + + // Display preview text + PushFont(font); + Text("The quick brown fox jumps over the lazy dog"); + PopFont(); + + // Display details + SetNextItemWidth(GetFontSize() * 8); + DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); + SameLine(); MetricsHelpMarker( + "Note than the default embedded font is NOT meant to be scaled.\n\n" + "Font are currently rendered into bitmaps at a given size at the time of building the atlas. " + "You may oversample them to get some flexibility with scaling. " + "You can also render at multiple sizes and select which one to use at runtime.\n\n" + "(Glimmer of hope: the atlas system will be rewritten in the future to make scaling more flexible.)"); + Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent); + char c_str[5]; + Text("Fallback character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->FallbackChar), font->FallbackChar); + Text("Ellipsis character: '%s' (U+%04X)", ImTextCharToUtf8(c_str, font->EllipsisChar), font->EllipsisChar); + const int surface_sqrt = (int)ImSqrt((float)font->MetricsTotalSurface); + Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, surface_sqrt, surface_sqrt); + for (int config_i = 0; config_i < font->ConfigDataCount; config_i++) + if (font->ConfigData) + if (const ImFontConfig* cfg = &font->ConfigData[config_i]) + BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d, Offset: (%.1f,%.1f)", + config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH, cfg->GlyphOffset.x, cfg->GlyphOffset.y); + + // Display all glyphs of the fonts in separate pages of 256 characters + if (TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size)) + { + ImDrawList* draw_list = GetWindowDrawList(); + const ImU32 glyph_col = GetColorU32(ImGuiCol_Text); + const float cell_size = font->FontSize * 1; + const float cell_spacing = GetStyle().ItemSpacing.y; + for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256) + { + // Skip ahead if a large bunch of glyphs are not present in the font (test in chunks of 4k) + // This is only a small optimization to reduce the number of iterations when IM_UNICODE_MAX_CODEPOINT + // is large // (if ImWchar==ImWchar32 we will do at least about 272 queries here) + if (!(base & 4095) && font->IsGlyphRangeUnused(base, base + 4095)) + { + base += 4096 - 256; + continue; + } + + int count = 0; + for (unsigned int n = 0; n < 256; n++) + if (font->FindGlyphNoFallback((ImWchar)(base + n))) + count++; + if (count <= 0) + continue; + if (!TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph")) + continue; + + // Draw a 16x16 grid of glyphs + ImVec2 base_pos = GetCursorScreenPos(); + for (unsigned int n = 0; n < 256; n++) + { + // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions + // available here and thus cannot easily generate a zero-terminated UTF-8 encoded string. + ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing)); + ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size); + const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n)); + draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50)); + if (!glyph) + continue; + font->RenderChar(draw_list, cell_size, cell_p1, glyph_col, (ImWchar)(base + n)); + if (IsMouseHoveringRect(cell_p1, cell_p2) && BeginTooltip()) + { + DebugNodeFontGlyph(font, glyph); + EndTooltip(); + } + } + Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16)); + TreePop(); + } + TreePop(); + } + TreePop(); +} + +void ImGui::DebugNodeFontGlyph(ImFont*, const ImFontGlyph* glyph) +{ + Text("Codepoint: U+%04X", glyph->Codepoint); + Separator(); + Text("Visible: %d", glyph->Visible); + Text("AdvanceX: %.1f", glyph->AdvanceX); + Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1); + Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1); +} + +// [DEBUG] Display contents of ImGuiStorage +void ImGui::DebugNodeStorage(ImGuiStorage* storage, const char* label) +{ + if (!TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes())) + return; + for (int n = 0; n < storage->Data.Size; n++) + { + const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n]; + BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer. + } + TreePop(); +} + +// [DEBUG] Display contents of ImGuiTabBar +void ImGui::DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label) +{ + // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings. + char buf[256]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (tab_bar->PrevFrameVisible >= GetFrameCount() - 2); + p += ImFormatString(p, buf_end - p, "%s 0x%08X (%d tabs)%s", label, tab_bar->ID, tab_bar->Tabs.Size, is_active ? "" : " *Inactive*"); + p += ImFormatString(p, buf_end - p, " { "); + for (int tab_n = 0; tab_n < ImMin(tab_bar->Tabs.Size, 3); tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + p += ImFormatString(p, buf_end - p, "%s'%s'", + tab_n > 0 ? ", " : "", TabBarGetTabName(tab_bar, tab)); + } + p += ImFormatString(p, buf_end - p, (tab_bar->Tabs.Size > 3) ? " ... }" : " } "); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(label, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (is_active && IsItemHovered()) + { + ImDrawList* draw_list = GetForegroundDrawList(); + draw_list->AddRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max, IM_COL32(255, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMinX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + draw_list->AddLine(ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Min.y), ImVec2(tab_bar->ScrollingRectMaxX, tab_bar->BarRect.Max.y), IM_COL32(0, 255, 0, 255)); + } + if (open) + { + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + PushID(tab); + if (SmallButton("<")) { TabBarQueueReorder(tab_bar, tab, -1); } SameLine(0, 2); + if (SmallButton(">")) { TabBarQueueReorder(tab_bar, tab, +1); } SameLine(); + Text("%02d%c Tab 0x%08X '%s' Offset: %.2f, Width: %.2f/%.2f", + tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, TabBarGetTabName(tab_bar, tab), tab->Offset, tab->Width, tab->ContentWidth); + PopID(); + } + TreePop(); + } +} + +void ImGui::DebugNodeViewport(ImGuiViewportP* viewport) +{ + SetNextItemOpen(true, ImGuiCond_Once); + if (TreeNode("viewport0", "Viewport #%d", 0)) + { + ImGuiWindowFlags flags = viewport->Flags; + BulletText("Main Pos: (%.0f,%.0f), Size: (%.0f,%.0f)\nWorkArea Offset Left: %.0f Top: %.0f, Right: %.0f, Bottom: %.0f", + viewport->Pos.x, viewport->Pos.y, viewport->Size.x, viewport->Size.y, + viewport->WorkOffsetMin.x, viewport->WorkOffsetMin.y, viewport->WorkOffsetMax.x, viewport->WorkOffsetMax.y); + BulletText("Flags: 0x%04X =%s%s%s", viewport->Flags, + (flags & ImGuiViewportFlags_IsPlatformWindow) ? " IsPlatformWindow" : "", + (flags & ImGuiViewportFlags_IsPlatformMonitor) ? " IsPlatformMonitor" : "", + (flags & ImGuiViewportFlags_OwnedByApp) ? " OwnedByApp" : ""); + for (int layer_i = 0; layer_i < IM_ARRAYSIZE(viewport->DrawDataBuilder.Layers); layer_i++) + for (int draw_list_i = 0; draw_list_i < viewport->DrawDataBuilder.Layers[layer_i].Size; draw_list_i++) + DebugNodeDrawList(NULL, viewport->DrawDataBuilder.Layers[layer_i][draw_list_i], "DrawList"); + TreePop(); + } +} + +void ImGui::DebugNodeWindow(ImGuiWindow* window, const char* label) +{ + if (window == NULL) + { + BulletText("%s: NULL", label); + return; + } + + ImGuiContext& g = *GImGui; + const bool is_active = window->WasActive; + ImGuiTreeNodeFlags tree_node_flags = (window == g.NavWindow) ? ImGuiTreeNodeFlags_Selected : ImGuiTreeNodeFlags_None; + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + const bool open = TreeNodeEx(label, tree_node_flags, "%s '%s'%s", label, window->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered() && is_active) + GetForegroundDrawList(window)->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255)); + if (!open) + return; + + if (window->MemoryCompacted) + TextDisabled("Note: some memory buffers have been compacted/freed."); + + ImGuiWindowFlags flags = window->Flags; + DebugNodeDrawList(window, window->DrawList, "DrawList"); + BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f) Ideal (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y, window->ContentSizeIdeal.x, window->ContentSizeIdeal.y); + BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags, + (flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "", + (flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "", + (flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : ""); + BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : ""); + BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1); + BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems); + for (int layer = 0; layer < ImGuiNavLayer_COUNT; layer++) + { + ImRect r = window->NavRectRel[layer]; + if (r.Min.x >= r.Max.y && r.Min.y >= r.Max.y) + BulletText("NavLastIds[%d]: 0x%08X", layer, window->NavLastIds[layer]); + else + BulletText("NavLastIds[%d]: 0x%08X at +(%.1f,%.1f)(%.1f,%.1f)", layer, window->NavLastIds[layer], r.Min.x, r.Min.y, r.Max.x, r.Max.y); + DebugLocateItemOnHover(window->NavLastIds[layer]); + } + BulletText("NavLayersActiveMask: %X, NavLastChildNavWindow: %s", window->DC.NavLayersActiveMask, window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL"); + if (window->RootWindow != window) { DebugNodeWindow(window->RootWindow, "RootWindow"); } + if (window->ParentWindow != NULL) { DebugNodeWindow(window->ParentWindow, "ParentWindow"); } + if (window->DC.ChildWindows.Size > 0) { DebugNodeWindowsList(&window->DC.ChildWindows, "ChildWindows"); } + if (window->ColumnsStorage.Size > 0 && TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size)) + { + for (int n = 0; n < window->ColumnsStorage.Size; n++) + DebugNodeColumns(&window->ColumnsStorage[n]); + TreePop(); + } + DebugNodeStorage(&window->StateStorage, "Storage"); + TreePop(); +} + +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings* settings) +{ + if (settings->WantDelete) + BeginDisabled(); + Text("0x%08X \"%s\" Pos (%d,%d) Size (%d,%d) Collapsed=%d", + settings->ID, settings->GetName(), settings->Pos.x, settings->Pos.y, settings->Size.x, settings->Size.y, settings->Collapsed); + if (settings->WantDelete) + EndDisabled(); +} + +void ImGui::DebugNodeWindowsList(ImVector* windows, const char* label) +{ + if (!TreeNode(label, "%s (%d)", label, windows->Size)) + return; + for (int i = windows->Size - 1; i >= 0; i--) // Iterate front to back + { + PushID((*windows)[i]); + DebugNodeWindow((*windows)[i], "Window"); + PopID(); + } + TreePop(); +} + +// FIXME-OPT: This is technically suboptimal, but it is simpler this way. +void ImGui::DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack) +{ + for (int i = 0; i < windows_size; i++) + { + ImGuiWindow* window = windows[i]; + if (window->ParentWindowInBeginStack != parent_in_begin_stack) + continue; + char buf[20]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "[%04d] Window", window->BeginOrderWithinContext); + //BulletText("[%04d] Window '%s'", window->BeginOrderWithinContext, window->Name); + DebugNodeWindow(window, buf); + Indent(); + DebugNodeWindowsListByBeginStackParent(windows + i + 1, windows_size - i - 1, window); + Unindent(); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] DEBUG LOG WINDOW +//----------------------------------------------------------------------------- + +void ImGui::DebugLog(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + DebugLogV(fmt, args); + va_end(args); +} + +void ImGui::DebugLogV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + const int old_size = g.DebugLogBuf.size(); + g.DebugLogBuf.appendf("[%05d] ", g.FrameCount); + g.DebugLogBuf.appendfv(fmt, args); + if (g.DebugLogFlags & ImGuiDebugLogFlags_OutputToTTY) + IMGUI_DEBUG_PRINTF("%s", g.DebugLogBuf.begin() + old_size); + g.DebugLogIndex.append(g.DebugLogBuf.c_str(), old_size, g.DebugLogBuf.size()); +} + +void ImGui::ShowDebugLogWindow(bool* p_open) +{ + ImGuiContext& g = *GImGui; + if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) + SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 12.0f), ImGuiCond_FirstUseEver); + if (!Begin("Dear ImGui Debug Log", p_open) || GetCurrentWindow()->BeginCount > 1) + { + End(); + return; + } + + AlignTextToFramePadding(); + Text("Log events:"); + SameLine(); CheckboxFlags("All", &g.DebugLogFlags, ImGuiDebugLogFlags_EventMask_); + SameLine(); CheckboxFlags("ActiveId", &g.DebugLogFlags, ImGuiDebugLogFlags_EventActiveId); + SameLine(); CheckboxFlags("Focus", &g.DebugLogFlags, ImGuiDebugLogFlags_EventFocus); + SameLine(); CheckboxFlags("Popup", &g.DebugLogFlags, ImGuiDebugLogFlags_EventPopup); + SameLine(); CheckboxFlags("Nav", &g.DebugLogFlags, ImGuiDebugLogFlags_EventNav); + SameLine(); if (CheckboxFlags("Clipper", &g.DebugLogFlags, ImGuiDebugLogFlags_EventClipper)) { g.DebugLogClipperAutoDisableFrames = 2; } if (IsItemHovered()) SetTooltip("Clipper log auto-disabled after 2 frames"); + SameLine(); CheckboxFlags("IO", &g.DebugLogFlags, ImGuiDebugLogFlags_EventIO); + + if (SmallButton("Clear")) + { + g.DebugLogBuf.clear(); + g.DebugLogIndex.clear(); + } + SameLine(); + if (SmallButton("Copy")) + SetClipboardText(g.DebugLogBuf.c_str()); + BeginChild("##log", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar); + + ImGuiListClipper clipper; + clipper.Begin(g.DebugLogIndex.size()); + while (clipper.Step()) + for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + { + const char* line_begin = g.DebugLogIndex.get_line_begin(g.DebugLogBuf.c_str(), line_no); + const char* line_end = g.DebugLogIndex.get_line_end(g.DebugLogBuf.c_str(), line_no); + TextUnformatted(line_begin, line_end); + ImRect text_rect = g.LastItemData.Rect; + if (IsItemHovered()) + for (const char* p = line_begin; p < line_end - 10; p++) + { + ImGuiID id = 0; + if (p[0] != '0' || (p[1] != 'x' && p[1] != 'X') || sscanf(p + 2, "%X", &id) != 1) + continue; + ImVec2 p0 = CalcTextSize(line_begin, p); + ImVec2 p1 = CalcTextSize(p, p + 10); + g.LastItemData.Rect = ImRect(text_rect.Min + ImVec2(p0.x, 0.0f), text_rect.Min + ImVec2(p0.x + p1.x, p1.y)); + if (IsMouseHoveringRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, true)) + DebugLocateItemOnHover(id); + p += 10; + } + } + if (GetScrollY() >= GetScrollMaxY()) + SetScrollHereY(1.0f); + EndChild(); + + End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] OTHER DEBUG TOOLS (ITEM PICKER, STACK TOOL) +//----------------------------------------------------------------------------- + +static const ImU32 DEBUG_LOCATE_ITEM_COLOR = IM_COL32(0, 255, 0, 255); // Green + +void ImGui::DebugLocateItem(ImGuiID target_id) +{ + ImGuiContext& g = *GImGui; + g.DebugLocateId = target_id; + g.DebugLocateFrames = 2; +} + +void ImGui::DebugLocateItemOnHover(ImGuiID target_id) +{ + if (target_id == 0 || !IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenBlockedByPopup)) + return; + ImGuiContext& g = *GImGui; + DebugLocateItem(target_id); + GetForegroundDrawList(g.CurrentWindow)->AddRect(g.LastItemData.Rect.Min - ImVec2(3.0f, 3.0f), g.LastItemData.Rect.Max + ImVec2(3.0f, 3.0f), DEBUG_LOCATE_ITEM_COLOR); +} + +void ImGui::DebugLocateItemResolveWithLastItem() +{ + ImGuiContext& g = *GImGui; + ImGuiLastItemData item_data = g.LastItemData; + g.DebugLocateId = 0; + ImDrawList* draw_list = GetForegroundDrawList(g.CurrentWindow); + ImRect r = item_data.Rect; + r.Expand(3.0f); + ImVec2 p1 = g.IO.MousePos; + ImVec2 p2 = ImVec2((p1.x < r.Min.x) ? r.Min.x : (p1.x > r.Max.x) ? r.Max.x : p1.x, (p1.y < r.Min.y) ? r.Min.y : (p1.y > r.Max.y) ? r.Max.y : p1.y); + draw_list->AddRect(r.Min, r.Max, DEBUG_LOCATE_ITEM_COLOR); + draw_list->AddLine(p1, p2, DEBUG_LOCATE_ITEM_COLOR); +} + +// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack. +void ImGui::UpdateDebugToolItemPicker() +{ + ImGuiContext& g = *GImGui; + g.DebugItemPickerBreakId = 0; + if (!g.DebugItemPickerActive) + return; + + const ImGuiID hovered_id = g.HoveredIdPreviousFrame; + SetMouseCursor(ImGuiMouseCursor_Hand); + if (IsKeyPressed(ImGuiKey_Escape)) + g.DebugItemPickerActive = false; + const bool change_mapping = g.IO.KeyMods == (ImGuiMod_Ctrl | ImGuiMod_Shift); + if (!change_mapping && IsMouseClicked(g.DebugItemPickerMouseButton) && hovered_id) + { + g.DebugItemPickerBreakId = hovered_id; + g.DebugItemPickerActive = false; + } + for (int mouse_button = 0; mouse_button < 3; mouse_button++) + if (change_mapping && IsMouseClicked(mouse_button)) + g.DebugItemPickerMouseButton = (ImU8)mouse_button; + SetNextWindowBgAlpha(0.70f); + if (!BeginTooltip()) + return; + Text("HoveredId: 0x%08X", hovered_id); + Text("Press ESC to abort picking."); + const char* mouse_button_names[] = { "Left", "Right", "Middle" }; + if (change_mapping) + Text("Remap w/ Ctrl+Shift: click anywhere to select new mouse button."); + else + TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click %s Button to break in debugger! (remap w/ Ctrl+Shift)", mouse_button_names[g.DebugItemPickerMouseButton]); + EndTooltip(); +} + +// [DEBUG] Stack Tool: update queries. Called by NewFrame() +void ImGui::UpdateDebugToolStackQueries() +{ + ImGuiContext& g = *GImGui; + ImGuiStackTool* tool = &g.DebugStackTool; + + // Clear hook when stack tool is not visible + g.DebugHookIdInfo = 0; + if (g.FrameCount != tool->LastActiveFrame + 1) + return; + + // Update queries. The steps are: -1: query Stack, >= 0: query each stack item + // We can only perform 1 ID Info query every frame. This is designed so the GetID() tests are cheap and constant-time + const ImGuiID query_id = g.HoveredIdPreviousFrame ? g.HoveredIdPreviousFrame : g.ActiveId; + if (tool->QueryId != query_id) + { + tool->QueryId = query_id; + tool->StackLevel = -1; + tool->Results.resize(0); + } + if (query_id == 0) + return; + + // Advance to next stack level when we got our result, or after 2 frames (in case we never get a result) + int stack_level = tool->StackLevel; + if (stack_level >= 0 && stack_level < tool->Results.Size) + if (tool->Results[stack_level].QuerySuccess || tool->Results[stack_level].QueryFrameCount > 2) + tool->StackLevel++; + + // Update hook + stack_level = tool->StackLevel; + if (stack_level == -1) + g.DebugHookIdInfo = query_id; + if (stack_level >= 0 && stack_level < tool->Results.Size) + { + g.DebugHookIdInfo = tool->Results[stack_level].ID; + tool->Results[stack_level].QueryFrameCount++; + } +} + +// [DEBUG] Stack tool: hooks called by GetID() family functions +void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStackTool* tool = &g.DebugStackTool; + + // Step 0: stack query + // This assumes that the ID was computed with the current ID stack, which tends to be the case for our widget. + if (tool->StackLevel == -1) + { + tool->StackLevel++; + tool->Results.resize(window->IDStack.Size + 1, ImGuiStackLevelInfo()); + for (int n = 0; n < window->IDStack.Size + 1; n++) + tool->Results[n].ID = (n < window->IDStack.Size) ? window->IDStack[n] : id; + return; + } + + // Step 1+: query for individual level + IM_ASSERT(tool->StackLevel >= 0); + if (tool->StackLevel != window->IDStack.Size) + return; + ImGuiStackLevelInfo* info = &tool->Results[tool->StackLevel]; + IM_ASSERT(info->ID == id && info->QueryFrameCount > 0); + + switch (data_type) + { + case ImGuiDataType_S32: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%d", (int)(intptr_t)data_id); + break; + case ImGuiDataType_String: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "%.*s", data_id_end ? (int)((const char*)data_id_end - (const char*)data_id) : (int)strlen((const char*)data_id), (const char*)data_id); + break; + case ImGuiDataType_Pointer: + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "(void*)0x%p", data_id); + break; + case ImGuiDataType_ID: + if (info->Desc[0] != 0) // PushOverrideID() is often used to avoid hashing twice, which would lead to 2 calls to DebugHookIdInfo(). We prioritize the first one. + return; + ImFormatString(info->Desc, IM_ARRAYSIZE(info->Desc), "0x%08X [override]", id); + break; + default: + IM_ASSERT(0); + } + info->QuerySuccess = true; + info->DataType = data_type; +} + +static int StackToolFormatLevelInfo(ImGuiStackTool* tool, int n, bool format_for_ui, char* buf, size_t buf_size) +{ + ImGuiStackLevelInfo* info = &tool->Results[n]; + ImGuiWindow* window = (info->Desc[0] == 0 && n == 0) ? ImGui::FindWindowByID(info->ID) : NULL; + if (window) // Source: window name (because the root ID don't call GetID() and so doesn't get hooked) + return ImFormatString(buf, buf_size, format_for_ui ? "\"%s\" [window]" : "%s", window->Name); + if (info->QuerySuccess) // Source: GetID() hooks (prioritize over ItemInfo() because we frequently use patterns like: PushID(str), Button("") where they both have same id) + return ImFormatString(buf, buf_size, (format_for_ui && info->DataType == ImGuiDataType_String) ? "\"%s\"" : "%s", info->Desc); + if (tool->StackLevel < tool->Results.Size) // Only start using fallback below when all queries are done, so during queries we don't flickering ??? markers. + return (*buf = 0); +#ifdef IMGUI_ENABLE_TEST_ENGINE + if (const char* label = ImGuiTestEngine_FindItemDebugLabel(GImGui, info->ID)) // Source: ImGuiTestEngine's ItemInfo() + return ImFormatString(buf, buf_size, format_for_ui ? "??? \"%s\"" : "%s", label); +#endif + return ImFormatString(buf, buf_size, "???"); +} + +// Stack Tool: Display UI +void ImGui::ShowStackToolWindow(bool* p_open) +{ + ImGuiContext& g = *GImGui; + if (!(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)) + SetNextWindowSize(ImVec2(0.0f, GetFontSize() * 8.0f), ImGuiCond_FirstUseEver); + if (!Begin("Dear ImGui Stack Tool", p_open) || GetCurrentWindow()->BeginCount > 1) + { + End(); + return; + } + + // Display hovered/active status + ImGuiStackTool* tool = &g.DebugStackTool; + const ImGuiID hovered_id = g.HoveredIdPreviousFrame; + const ImGuiID active_id = g.ActiveId; +#ifdef IMGUI_ENABLE_TEST_ENGINE + Text("HoveredId: 0x%08X (\"%s\"), ActiveId: 0x%08X (\"%s\")", hovered_id, hovered_id ? ImGuiTestEngine_FindItemDebugLabel(&g, hovered_id) : "", active_id, active_id ? ImGuiTestEngine_FindItemDebugLabel(&g, active_id) : ""); +#else + Text("HoveredId: 0x%08X, ActiveId: 0x%08X", hovered_id, active_id); +#endif + SameLine(); + MetricsHelpMarker("Hover an item with the mouse to display elements of the ID Stack leading to the item's final ID.\nEach level of the stack correspond to a PushID() call.\nAll levels of the stack are hashed together to make the final ID of a widget (ID displayed at the bottom level of the stack).\nRead FAQ entry about the ID stack for details."); + + // CTRL+C to copy path + const float time_since_copy = (float)g.Time - tool->CopyToClipboardLastTime; + Checkbox("Ctrl+C: copy path to clipboard", &tool->CopyToClipboardOnCtrlC); + SameLine(); + TextColored((time_since_copy >= 0.0f && time_since_copy < 0.75f && ImFmod(time_since_copy, 0.25f) < 0.25f * 0.5f) ? ImVec4(1.f, 1.f, 0.3f, 1.f) : ImVec4(), "*COPIED*"); + if (tool->CopyToClipboardOnCtrlC && IsKeyDown(ImGuiMod_Ctrl) && IsKeyPressed(ImGuiKey_C)) + { + tool->CopyToClipboardLastTime = (float)g.Time; + char* p = g.TempBuffer.Data; + char* p_end = p + g.TempBuffer.Size; + for (int stack_n = 0; stack_n < tool->Results.Size && p + 3 < p_end; stack_n++) + { + *p++ = '/'; + char level_desc[256]; + StackToolFormatLevelInfo(tool, stack_n, false, level_desc, IM_ARRAYSIZE(level_desc)); + for (int n = 0; level_desc[n] && p + 2 < p_end; n++) + { + if (level_desc[n] == '/') + *p++ = '\\'; + *p++ = level_desc[n]; + } + } + *p = '\0'; + SetClipboardText(g.TempBuffer.Data); + } + + // Display decorated stack + tool->LastActiveFrame = g.FrameCount; + if (tool->Results.Size > 0 && BeginTable("##table", 3, ImGuiTableFlags_Borders)) + { + const float id_width = CalcTextSize("0xDDDDDDDD").x; + TableSetupColumn("Seed", ImGuiTableColumnFlags_WidthFixed, id_width); + TableSetupColumn("PushID", ImGuiTableColumnFlags_WidthStretch); + TableSetupColumn("Result", ImGuiTableColumnFlags_WidthFixed, id_width); + TableHeadersRow(); + for (int n = 0; n < tool->Results.Size; n++) + { + ImGuiStackLevelInfo* info = &tool->Results[n]; + TableNextColumn(); + Text("0x%08X", (n > 0) ? tool->Results[n - 1].ID : 0); + TableNextColumn(); + StackToolFormatLevelInfo(tool, n, true, g.TempBuffer.Data, g.TempBuffer.Size); + TextUnformatted(g.TempBuffer.Data); + TableNextColumn(); + Text("0x%08X", info->ID); + if (n == tool->Results.Size - 1) + TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_Header)); + } + EndTable(); + } + End(); +} + +#else + +void ImGui::ShowMetricsWindow(bool*) {} +void ImGui::ShowFontAtlas(ImFontAtlas*) {} +void ImGui::DebugNodeColumns(ImGuiOldColumns*) {} +void ImGui::DebugNodeDrawList(ImGuiWindow*, const ImDrawList*, const char*) {} +void ImGui::DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList*, const ImDrawList*, const ImDrawCmd*, bool, bool) {} +void ImGui::DebugNodeFont(ImFont*) {} +void ImGui::DebugNodeStorage(ImGuiStorage*, const char*) {} +void ImGui::DebugNodeTabBar(ImGuiTabBar*, const char*) {} +void ImGui::DebugNodeWindow(ImGuiWindow*, const char*) {} +void ImGui::DebugNodeWindowSettings(ImGuiWindowSettings*) {} +void ImGui::DebugNodeWindowsList(ImVector*, const char*) {} +void ImGui::DebugNodeViewport(ImGuiViewportP*) {} + +void ImGui::DebugLog(const char*, ...) {} +void ImGui::DebugLogV(const char*, va_list) {} +void ImGui::ShowDebugLogWindow(bool*) {} +void ImGui::ShowStackToolWindow(bool*) {} +void ImGui::DebugHookIdInfo(ImGuiID, ImGuiDataType, const void*, const void*) {} +void ImGui::UpdateDebugToolItemPicker() {} +void ImGui::UpdateDebugToolStackQueries() {} + +#endif // #ifndef IMGUI_DISABLE_DEBUG_TOOLS + +//----------------------------------------------------------------------------- + +// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed. +// Prefer just including imgui_internal.h from your code rather than using this define. If a declaration is missing from imgui_internal.h add it or request it on the github. +#ifdef IMGUI_INCLUDE_IMGUI_USER_INL +#include "imgui_user.inl" +#endif + +//----------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui.h b/ImGui/imgui.h new file mode 100644 index 0000000..0fd3ce2 --- /dev/null +++ b/ImGui/imgui.h @@ -0,0 +1,3121 @@ +// dear imgui, v1.89.4 WIP +// (headers) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for details, links and comments. + +// Resources: +// - FAQ http://dearimgui.org/faq +// - Homepage & latest https://github.com/ocornut/imgui +// - Releases & changelog https://github.com/ocornut/imgui/releases +// - Gallery https://github.com/ocornut/imgui/issues/5886 (please post your screenshots/video there!) +// - Wiki https://github.com/ocornut/imgui/wiki (lots of good stuff there) +// - Glossary https://github.com/ocornut/imgui/wiki/Glossary +// - Issues & support https://github.com/ocornut/imgui/issues + +// Getting Started? +// - For first-time users having issues compiling/linking/running or issues loading fonts: +// please post in https://github.com/ocornut/imgui/discussions if you cannot find a solution in resources above. + +// Library Version +// (Integer encoded as XYYZZ for use in #if preprocessor conditionals, e.g. '#if IMGUI_VERSION_NUM > 12345') +#define IMGUI_VERSION "1.89.4 WIP" +#define IMGUI_VERSION_NUM 18937 +#define IMGUI_HAS_TABLE + +/* + +Index of this file: +// [SECTION] Header mess +// [SECTION] Forward declarations and basic types +// [SECTION] Dear ImGui end-user API functions +// [SECTION] Flags & Enumerations +// [SECTION] Helpers: Memory allocations macros, ImVector<> +// [SECTION] ImGuiStyle +// [SECTION] ImGuiIO +// [SECTION] Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload, ImGuiTableSortSpecs, ImGuiTableColumnSortSpecs) +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) +// [SECTION] Drawing API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawFlags, ImDrawListFlags, ImDrawList, ImDrawData) +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont) +// [SECTION] Viewports (ImGuiViewportFlags, ImGuiViewport) +// [SECTION] Platform Dependent Interfaces (ImGuiPlatformImeData) +// [SECTION] Obsolete functions and types + +*/ + +#pragma once + +// Configuration file with compile-time options +// (edit imconfig.h or '#define IMGUI_USER_CONFIG "myfilename.h" from your build system') +#ifdef IMGUI_USER_CONFIG +#include IMGUI_USER_CONFIG +#endif +#include "imconfig.h" + +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +// Includes +#include // FLT_MIN, FLT_MAX +#include // va_list, va_start, va_end +#include // ptrdiff_t, NULL +#include // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp + +// Define attributes of all API symbols declarations (e.g. for DLL under Windows) +// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default backends files (imgui_impl_xxx.h) +// Using dear imgui via a shared library is not recommended, because we don't guarantee backward nor forward ABI compatibility (also function call overhead, as dear imgui is a call-heavy API) +#ifndef IMGUI_API +#define IMGUI_API +#endif +#ifndef IMGUI_IMPL_API +#define IMGUI_IMPL_API IMGUI_API +#endif + +// Helper Macros +#ifndef IM_ASSERT +#include +#define IM_ASSERT(_EXPR) assert(_EXPR) // You can override the default assert handler by editing imconfig.h +#endif +#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*(_ARR)))) // Size of a static C-style array. Don't use on pointers! +#define IM_UNUSED(_VAR) ((void)(_VAR)) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds. +#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11 +#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx)) + +// Helper Macros - IM_FMTARGS, IM_FMTLIST: Apply printf-style warnings to our formatting functions. +#if !defined(IMGUI_USE_STB_SPRINTF) && defined(__MINGW32__) && !defined(__clang__) +#define IM_FMTARGS(FMT) __attribute__((format(gnu_printf, FMT, FMT+1))) +#define IM_FMTLIST(FMT) __attribute__((format(gnu_printf, FMT, 0))) +#elif !defined(IMGUI_USE_STB_SPRINTF) && (defined(__clang__) || defined(__GNUC__)) +#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) +#define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0))) +#else +#define IM_FMTARGS(FMT) +#define IM_FMTLIST(FMT) +#endif + +// Disable some of MSVC most aggressive Debug runtime checks in function header/footer (used in some simple/low-level functions) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(__INTEL_COMPILER) && !defined(IMGUI_DEBUG_PARANOID) +#define IM_MSVC_RUNTIME_CHECKS_OFF __pragma(runtime_checks("",off)) __pragma(check_stack(off)) __pragma(strict_gs_check(push,off)) +#define IM_MSVC_RUNTIME_CHECKS_RESTORE __pragma(runtime_checks("",restore)) __pragma(check_stack()) __pragma(strict_gs_check(pop)) +#else +#define IM_MSVC_RUNTIME_CHECKS_OFF +#define IM_MSVC_RUNTIME_CHECKS_RESTORE +#endif + +// Warnings +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#endif +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wold-style-cast" +#if __has_warning("-Wzero-as-null-pointer-constant") +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#endif +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward declarations and basic types +//----------------------------------------------------------------------------- + +// Forward declarations +struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit() +struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback) +struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix. +struct ImDrawList; // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder) +struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself) +struct ImDrawListSplitter; // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back. +struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT) +struct ImFont; // Runtime data for a single font within a parent ImFontAtlas +struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader +struct ImFontBuilderIO; // Opaque interface to a font builder (stb_truetype or FreeType). +struct ImFontConfig; // Configuration data when adding a font or merging fonts +struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset) +struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data +struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using) +struct ImGuiContext; // Dear ImGui context (opaque structure, unless including imgui_internal.h) +struct ImGuiIO; // Main configuration and I/O between your application and ImGui +struct ImGuiInputTextCallbackData; // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use) +struct ImGuiKeyData; // Storage for ImGuiIO and IsKeyDown(), IsKeyPressed() etc functions. +struct ImGuiListClipper; // Helper to manually clip large list of items +struct ImGuiOnceUponAFrame; // Helper for running a block of code not more than once a frame +struct ImGuiPayload; // User data payload for drag and drop operations +struct ImGuiPlatformImeData; // Platform IME data for io.SetPlatformImeDataFn() function. +struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use) +struct ImGuiStorage; // Helper for key->value storage +struct ImGuiStyle; // Runtime data for styling/colors +struct ImGuiTableSortSpecs; // Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +struct ImGuiTableColumnSortSpecs; // Sorting specification for one column of a table +struct ImGuiTextBuffer; // Helper to hold and append into a text buffer (~string builder) +struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbbb][,ccccc]") +struct ImGuiViewport; // A Platform Window (always only one in 'master' branch), in the future may represent Platform Monitor + +// Enumerations +// - We don't use strongly typed enums much because they add constraints (can't extend in private code, can't store typed in bit fields, extra casting on iteration) +// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! +// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +enum ImGuiKey : int; // -> enum ImGuiKey // Enum: A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value) +typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling +typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions +typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type +typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction +typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle) +typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor shape +typedef int ImGuiSortDirection; // -> enum ImGuiSortDirection_ // Enum: A sorting direction (ascending or descending) +typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling +typedef int ImGuiTableBgTarget; // -> enum ImGuiTableBgTarget_ // Enum: A color target for TableSetBgColor() + +// Flags (declared as int for compatibility with old C++, to allow using as flags without overhead, and to not pollute the top of this file) +// - Tip: Use your programming IDE navigation facilities on the names in the _central column_ below to find the actual flags/enum lists! +// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +typedef int ImDrawFlags; // -> enum ImDrawFlags_ // Flags: for ImDrawList functions +typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList instance +typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas build +typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags +typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for InvisibleButton() +typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc. +typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags +typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo() +typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload() +typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused() +typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc. +typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline() +typedef int ImGuiKeyChord; // -> ImGuiKey | ImGuiMod_XXX // Flags: for storage only for now: an ImGuiKey optionally OR-ed with one or more ImGuiMod_XXX values. +typedef int ImGuiPopupFlags; // -> enum ImGuiPopupFlags_ // Flags: for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() +typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable() +typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. +typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar() +typedef int ImGuiTabItemFlags; // -> enum ImGuiTabItemFlags_ // Flags: for BeginTabItem() +typedef int ImGuiTableFlags; // -> enum ImGuiTableFlags_ // Flags: For BeginTable() +typedef int ImGuiTableColumnFlags; // -> enum ImGuiTableColumnFlags_// Flags: For TableSetupColumn() +typedef int ImGuiTableRowFlags; // -> enum ImGuiTableRowFlags_ // Flags: For TableNextRow() +typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader() +typedef int ImGuiViewportFlags; // -> enum ImGuiViewportFlags_ // Flags: for ImGuiViewport +typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild() + +// ImTexture: user data for renderer backend to identify a texture [Compile-time configurable type] +// - To use something else than an opaque void* pointer: override with e.g. '#define ImTextureID MyTextureType*' in your imconfig.h file. +// - This can be whatever to you want it to be! read the FAQ about ImTextureID for details. +#ifndef ImTextureID +typedef void* ImTextureID; // Default: store a pointer or an integer fitting in a pointer (most renderer backends are ok with that) +#endif + +// ImDrawIdx: vertex index. [Compile-time configurable type] +// - To use 16-bit indices + allow large meshes: backend need to set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset (recommended). +// - To use 32-bit indices: override with '#define ImDrawIdx unsigned int' in your imconfig.h file. +#ifndef ImDrawIdx +typedef unsigned short ImDrawIdx; // Default: 16-bit (for maximum compatibility with renderer backends) +#endif + +// Scalar data types +typedef unsigned int ImGuiID;// A unique ID used by widgets (typically the result of hashing a stack of string) +typedef signed char ImS8; // 8-bit signed integer +typedef unsigned char ImU8; // 8-bit unsigned integer +typedef signed short ImS16; // 16-bit signed integer +typedef unsigned short ImU16; // 16-bit unsigned integer +typedef signed int ImS32; // 32-bit signed integer == int +typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors) +typedef signed long long ImS64; // 64-bit signed integer +typedef unsigned long long ImU64; // 64-bit unsigned integer + +// Character types +// (we generally use UTF-8 encoded string in the API. This is storage specifically for a decoded character used for keyboard input and display) +typedef unsigned short ImWchar16; // A single decoded U16 character/code point. We encode them as multi bytes UTF-8 when used in strings. +typedef unsigned int ImWchar32; // A single decoded U32 character/code point. We encode them as multi bytes UTF-8 when used in strings. +#ifdef IMGUI_USE_WCHAR32 // ImWchar [configurable type: override in imconfig.h with '#define IMGUI_USE_WCHAR32' to support Unicode planes 1-16] +typedef ImWchar32 ImWchar; +#else +typedef ImWchar16 ImWchar; +#endif + +// Callback and functions types +typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData* data); // Callback function for ImGui::InputText() +typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data); // Callback function for ImGui::SetNextWindowSizeConstraints() +typedef void* (*ImGuiMemAllocFunc)(size_t sz, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() +typedef void (*ImGuiMemFreeFunc)(void* ptr, void* user_data); // Function signature for ImGui::SetAllocatorFunctions() + +// ImVec2: 2D vector used to store positions, sizes etc. [Compile-time configurable type] +// This is a frequently used type in the API. Consider using IM_VEC2_CLASS_EXTRA to create implicit cast from/to our preferred type. +IM_MSVC_RUNTIME_CHECKS_OFF +struct ImVec2 +{ + float x, y; + constexpr ImVec2() : x(0.0f), y(0.0f) { } + constexpr ImVec2(float _x, float _y) : x(_x), y(_y) { } + float operator[] (size_t idx) const { IM_ASSERT(idx == 0 || idx == 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. + float& operator[] (size_t idx) { IM_ASSERT(idx == 0 || idx == 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine. +#ifdef IM_VEC2_CLASS_EXTRA + IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2. +#endif +}; + +// ImVec4: 4D vector used to store clipping rectangles, colors etc. [Compile-time configurable type] +struct ImVec4 +{ + float x, y, z, w; + constexpr ImVec4() : x(0.0f), y(0.0f), z(0.0f), w(0.0f) { } + constexpr ImVec4(float _x, float _y, float _z, float _w) : x(_x), y(_y), z(_z), w(_w) { } +#ifdef IM_VEC4_CLASS_EXTRA + IM_VEC4_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec4. +#endif +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] Dear ImGui end-user API functions +// (Note that ImGui:: being a namespace, you can add extra ImGui:: functions in your own separate file. Please don't modify imgui source files!) +//----------------------------------------------------------------------------- + +namespace ImGui +{ + // Context creation and access + // - Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between contexts. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for details. + IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL); + IMGUI_API void DestroyContext(ImGuiContext* ctx = NULL); // NULL = destroy current context + IMGUI_API ImGuiContext* GetCurrentContext(); + IMGUI_API void SetCurrentContext(ImGuiContext* ctx); + + // Main + IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags) + IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame! + IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame(). + IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(). If you don't need to render data (skipping rendering) you may call EndFrame() without Render()... but you'll have wasted CPU already! If you don't need to render, better to not create any windows and not call NewFrame() at all! + IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can then get call GetDrawData(). + IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render. + + // Demo, Debug, Information + IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window. demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application! + IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debugger window. display Dear ImGui internals: windows, draw commands, various internal state, etc. + IMGUI_API void ShowDebugLogWindow(bool* p_open = NULL); // create Debug Log window. display a simplified log of important dear imgui events. + IMGUI_API void ShowStackToolWindow(bool* p_open = NULL); // create Stack Tool window. hover items with mouse to query information about the source of their unique ID. + IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information. + IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style) + IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles. + IMGUI_API void ShowFontSelector(const char* label); // add font selector block (not a window), essentially a combo listing the loaded fonts. + IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as an end-user (mouse/keyboard controls). + IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.80 WIP" (essentially the value for IMGUI_VERSION from the compiled version of imgui.cpp) + + // Styles + IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default) + IMGUI_API void StyleColorsLight(ImGuiStyle* dst = NULL); // best used with borders and a custom, thicker font + IMGUI_API void StyleColorsClassic(ImGuiStyle* dst = NULL); // classic imgui style + + // Windows + // - Begin() = push window to the stack and start appending to it. End() = pop window from the stack. + // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window, + // which clicking will set the boolean to false when clicked. + // - You may append multiple times to the same window during the same frame by calling Begin()/End() pairs multiple times. + // Some information such as 'flags' or 'p_open' will only be considered by the first call to Begin(). + // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting + // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value! + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + // - Note that the bottom of window stack always contains a window called "Debug". + IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); + IMGUI_API void End(); + + // Child Windows + // - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child. + // - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400). + // - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window. + // Always call a matching EndChild() for each BeginChild() call, regardless of its return value. + // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu, + // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function + // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.] + IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0, 0), bool border = false, ImGuiWindowFlags flags = 0); + IMGUI_API void EndChild(); + + // Windows Utilities + // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into. + IMGUI_API bool IsWindowAppearing(); + IMGUI_API bool IsWindowCollapsed(); + IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options. + IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ! + IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives + IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API) + IMGUI_API ImVec2 GetWindowSize(); // get current window size + IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x) + IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y) + + // Window manipulation + // - Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin). + IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0, 0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc. + IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin() + IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints. + IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin() + IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin() + IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin() + IMGUI_API void SetNextWindowScroll(const ImVec2& scroll); // set next window scrolling value (use < 0.0f to not affect a given axis). + IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground. + IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects. + IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0, 0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects. + IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed(). + IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus(). + IMGUI_API void SetWindowFontScale(float scale); // [OBSOLETE] set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes(). + IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position. + IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis. + IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state + IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus. + + // Content region + // - Retrieve available space from a given point. GetContentRegionAvail() is frequently useful. + // - Those functions are bound to be redesigned (they are confusing, incomplete and the Min/Max return values are in local window coordinates which increases confusion) + IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos() + IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates + IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min for the full window (roughly (0,0)-Scroll), in window coordinates + IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max for the full window (roughly (0,0)+Size-Scroll) where Size can be overridden with SetNextWindowContentSize(), in window coordinates + + // Windows Scrolling + // - Any change of Scroll will be applied at the beginning of next frame in the first call to Begin(). + // - You may instead use SetNextWindowScroll() prior to calling Begin() to avoid this delay, as an alternative to using SetScrollX()/SetScrollY(). + IMGUI_API float GetScrollX(); // get scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API float GetScrollY(); // get scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0 .. GetScrollMaxX()] + IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0 .. GetScrollMaxY()] + IMGUI_API float GetScrollMaxX(); // get maximum scrolling amount ~~ ContentSize.x - WindowSize.x - DecorationsSize.x + IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.y - WindowSize.y - DecorationsSize.y + IMGUI_API void SetScrollHereX(float center_x_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. + IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead. + IMGUI_API void SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. + IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position. + + // Parameters stacks (shared) + IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font + IMGUI_API void PopFont(); + IMGUI_API void PushStyleColor(ImGuiCol idx, ImU32 col); // modify a style color. always use this if you modify the style after NewFrame(). + IMGUI_API void PushStyleColor(ImGuiCol idx, const ImVec4& col); + IMGUI_API void PopStyleColor(int count = 1); + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, float val); // modify a style float variable. always use this if you modify the style after NewFrame(). + IMGUI_API void PushStyleVar(ImGuiStyleVar idx, const ImVec2& val); // modify a style ImVec2 variable. always use this if you modify the style after NewFrame(). + IMGUI_API void PopStyleVar(int count = 1); + IMGUI_API void PushTabStop(bool tab_stop); // == tab stop enable. Allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets + IMGUI_API void PopTabStop(); + IMGUI_API void PushButtonRepeat(bool repeat); // in 'repeat' mode, Button*() functions return repeated true in a typematic manner (using io.KeyRepeatDelay/io.KeyRepeatRate setting). Note that you can call IsItemActive() after any Button() to tell if the button is held in the current frame. + IMGUI_API void PopButtonRepeat(); + + // Parameters stacks (current window) + IMGUI_API void PushItemWidth(float item_width); // push width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side). + IMGUI_API void PopItemWidth(); + IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -FLT_MIN always align width to the right side) + IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions. + IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // push word-wrapping position for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space + IMGUI_API void PopTextWrapPos(); + + // Style read access + // - Use the ShowStyleEditor() function to interactively see/edit the colors. + IMGUI_API ImFont* GetFont(); // get current font + IMGUI_API float GetFontSize(); // get current font size (= height in pixels) of current font with current scale applied + IMGUI_API ImVec2 GetFontTexUvWhitePixel(); // get UV coordinate for a while pixel, useful to draw custom shapes via the ImDrawList API + IMGUI_API ImU32 GetColorU32(ImGuiCol idx, float alpha_mul = 1.0f); // retrieve given style color with style alpha applied and optional extra alpha multiplier, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(const ImVec4& col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied, packed as a 32-bit value suitable for ImDrawList + IMGUI_API const ImVec4& GetStyleColorVec4(ImGuiCol idx); // retrieve style color as stored in ImGuiStyle structure. use to feed back into PushStyleColor(), otherwise use GetColorU32() to get style color with style alpha baked in. + + // Cursor / Layout + // - By "cursor" we mean the current output position. + // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down. + // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceding widget. + // - Attention! We currently have inconsistencies between window-local and absolute positions we will aim to fix with future API: + // Window-local coordinates: SameLine(), GetCursorPos(), SetCursorPos(), GetCursorStartPos(), GetContentRegionMax(), GetWindowContentRegion*(), PushTextWrapPos() + // Absolute coordinate: GetCursorScreenPos(), SetCursorScreenPos(), all ImDrawList:: functions. + IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator. + IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates. + IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in a horizontal-layout context. + IMGUI_API void Spacing(); // add vertical spacing. + IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into. + IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by indent_w, or style.IndentSpacing if indent_w <= 0 + IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by indent_w, or style.IndentSpacing if indent_w <= 0 + IMGUI_API void BeginGroup(); // lock horizontal starting position + IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.) + IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position) + IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc. + IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList:: + IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system. + IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.) + IMGUI_API void SetCursorPosY(float local_y); // + IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates + IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute coordinates (useful to work with ImDrawList API). generally top-left == GetMainViewport()->Pos == (0,0) in single viewport mode, and bottom-right == GetMainViewport()->Pos+Size == io.DisplaySize in single-viewport mode. + IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute coordinates + IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item) + IMGUI_API float GetTextLineHeight(); // ~ FontSize + IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text) + IMGUI_API float GetFrameHeight(); // ~ FontSize + style.FramePadding.y * 2 + IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets) + + // ID stack/scopes + // Read the FAQ (docs/FAQ.md or http://dearimgui.org/faq) for more details about how ID are handled in dear imgui. + // - Those questions are answered and impacted by understanding of the ID stack system: + // - "Q: Why is my widget not reacting when I click on it?" + // - "Q: How can I have widgets with an empty label?" + // - "Q: How can I have multiple widgets with the same label?" + // - Short version: ID are hashes of the entire ID stack. If you are creating widgets in a loop you most likely + // want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them. + // - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others. + // - In this header file we use the "label"/"name" terminology to denote a string that will be displayed + used as an ID, + // whereas "str_id" denote a string that is only used as an ID and not normally displayed. + IMGUI_API void PushID(const char* str_id); // push string into the ID stack (will hash string). + IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end); // push string into the ID stack (will hash string). + IMGUI_API void PushID(const void* ptr_id); // push pointer into the ID stack (will hash pointer). + IMGUI_API void PushID(int int_id); // push integer into the ID stack (will hash integer). + IMGUI_API void PopID(); // pop from the ID stack. + IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself + IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end); + IMGUI_API ImGuiID GetID(const void* ptr_id); + + // Widgets: Text + IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text. + IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text + IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor(); + IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API void TextDisabled(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); Text(fmt, ...); PopStyleColor(); + IMGUI_API void TextDisabledV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void TextWrapped(const char* fmt, ...) IM_FMTARGS(1); // shortcut for PushTextWrapPos(0.0f); Text(fmt, ...); PopTextWrapPos();. Note that this won't work on an auto-resizing window if there's no other widgets to extend the window width, yoy may need to set a size using SetNextWindowSize(). + IMGUI_API void TextWrappedV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void LabelText(const char* label, const char* fmt, ...) IM_FMTARGS(2); // display text+label aligned the same way as value+label widgets + IMGUI_API void LabelTextV(const char* label, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API void BulletText(const char* fmt, ...) IM_FMTARGS(1); // shortcut for Bullet()+Text() + IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1); + IMGUI_API void SeparatorText(const char* label); // currently: formatted text with an horizontal line + + // Widgets: Main + // - Most widgets return true when the value has been changed or when pressed/selected + // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state. + IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0, 0)); // button + IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text + IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size, ImGuiButtonFlags flags = 0); // flexible button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.) + IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape + IMGUI_API bool Checkbox(const char* label, bool* v); + IMGUI_API bool CheckboxFlags(const char* label, int* flags, int flags_value); + IMGUI_API bool CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value); + IMGUI_API bool RadioButton(const char* label, bool active); // use with e.g. if (RadioButton("one", my_value==1)) { my_value = 1; } + IMGUI_API bool RadioButton(const char* label, int* v, int v_button); // shortcut to handle the above pattern when value is an integer + IMGUI_API void ProgressBar(float fraction, const ImVec2& size_arg = ImVec2(-FLT_MIN, 0), const char* overlay = NULL); + IMGUI_API void Bullet(); // draw a small circle + keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses + + // Widgets: Images + // - Read about ImTextureID here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples + IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& tint_col = ImVec4(1, 1, 1, 1), const ImVec4& border_col = ImVec4(0, 0, 0, 0)); + IMGUI_API bool ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); + + // Widgets: Combo Box (Dropdown) + // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items. + // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose. This is analogous to how ListBox are created. + IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0); + IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true! + IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1); + IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0" + IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1); + + // Widgets: Drag Sliders + // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. + // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every function, note that a 'float v[X]' function argument is the same as 'float* v', + // the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x + // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). + // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision). + // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits if ImGuiSliderFlags_AlwaysClamp is not used. + // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum. + // - We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. + // - Legacy: Pre-1.78 there are DragXXX() function signatures that take a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloat4(const char* label, float v[4], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt(const char* label, int* v, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); // If v_min >= v_max we have no bound + IMGUI_API bool DragInt2(const char* label, int v[2], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed = 1.0f, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, ImGuiSliderFlags flags = 0); + + // Widgets: Regular Sliders + // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped by default and can go off-bounds. Use ImGuiSliderFlags_AlwaysClamp to always clamp. + // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc. + // - Format string may also be set to NULL or use the default format ("%f" or "%d"). + // - Legacy: Pre-1.78 there are SliderXXX() function signatures that take a final `float power=1.0f' argument instead of the `ImGuiSliderFlags flags=0' argument. + // If you get a warning converting a float to ImGuiSliderFlags, read https://github.com/ocornut/imgui/issues/3361 + IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. + IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderAngle(const char* label, float* v_rad, float v_degrees_min = -360.0f, float v_degrees_max = +360.0f, const char* format = "%.0f deg", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt(const char* label, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0); + IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, ImGuiSliderFlags flags = 0); + + // Widgets: Input with Keyboard + // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp. + // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc. + IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0); + + // Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little color square that can be left-clicked to open a picker, and right-clicked to open an option menu.) + // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. + // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x + IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0); + IMGUI_API bool ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags = 0, const float* ref_col = NULL); + IMGUI_API bool ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // display a color square/button, hover for details, return true when pressed. + IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls. + + // Widgets: Trees + // - TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents. + IMGUI_API bool TreeNode(const char* label); + IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // helper variation to easily decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet(). + IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2); // " + IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2); + IMGUI_API bool TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags = 0); + IMGUI_API bool TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); + IMGUI_API bool TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) IM_FMTARGS(3); + IMGUI_API bool TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); + IMGUI_API bool TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) IM_FMTLIST(3); + IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired. + IMGUI_API void TreePush(const void* ptr_id); // " + IMGUI_API void TreePop(); // ~ Unindent()+PopId() + IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode + IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop(). + IMGUI_API bool CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags = 0); // when 'p_visible != NULL': if '*p_visible==true' display an additional small close button on upper right of the header which will set the bool to false when clicked, if '*p_visible==false' don't display the header. + IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state. + + // Widgets: Selectables + // - A selectable highlights when hovered, and can display another color when selected. + // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous. + IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height + IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0, 0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper. + + // Widgets: List Boxes + // - This is essentially a thin wrapper to using BeginChild/EndChild with some stylistic changes. + // - The BeginListBox()/EndListBox() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() or any items. + // - The simplified/old ListBox() api are helpers over BeginListBox()/EndListBox() which are kept available for convenience purpose. This is analoguous to how Combos are created. + // - Choose frame width: size.x > 0.0f: custom / size.x < 0.0f or -FLT_MIN: right-align / size.x = 0.0f (default): use current ItemWidth + // - Choose frame height: size.y > 0.0f: custom / size.y < 0.0f or -FLT_MIN: bottom-align / size.y = 0.0f (default): arbitrary default height which can fit ~7 items + IMGUI_API bool BeginListBox(const char* label, const ImVec2& size = ImVec2(0, 0)); // open a framed scrolling region + IMGUI_API void EndListBox(); // only call EndListBox() if BeginListBox() returned true! + IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1); + IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1); + + // Widgets: Data Plotting + // - Consider using ImPlot (https://github.com/epezent/implot) which is much better! + IMGUI_API void PlotLines(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); + IMGUI_API void PlotLines(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float)); + IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0)); + + // Widgets: Value() Helpers. + // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace) + IMGUI_API void Value(const char* prefix, bool b); + IMGUI_API void Value(const char* prefix, int v); + IMGUI_API void Value(const char* prefix, unsigned int v); + IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL); + + // Widgets: Menus + // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar. + // - Use BeginMainMenuBar() to create a menu bar at the top of the screen and append to it. + // - Use BeginMenu() to create a menu. You can call BeginMenu() multiple time with the same identifier to append more items to it. + // - Not that MenuItem() keyboardshortcuts are displayed as a convenience but _not processed_ by Dear ImGui at the moment. + IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window). + IMGUI_API void EndMenuBar(); // only call EndMenuBar() if BeginMenuBar() returns true! + IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar. + IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true! + IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true! + IMGUI_API void EndMenu(); // only call EndMenu() if BeginMenu() returns true! + IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. + IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL + + // Tooltips + // - Tooltip are windows following the mouse. They do not take focus away. + IMGUI_API bool BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items). + IMGUI_API void EndTooltip(); // only call EndTooltip() if BeginTooltip() returns true! + IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip(). + IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Popups, Modals + // - They block normal mouse hovering detection (and therefore most mouse interactions) behind them. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally instead of being held by the programmer as we are used to with regular Begin*() calls. + // - The 3 properties above are related: we need to retain popup visibility state in the library because popups may be closed as any time. + // - You can bypass the hovering restriction by using ImGuiHoveredFlags_AllowWhenBlockedByPopup when calling IsItemHovered() or IsWindowHovered(). + // - IMPORTANT: Popup identifiers are relative to the current ID stack, so OpenPopup and BeginPopup generally needs to be at the same level of the stack. + // This is sometimes leading to confusing mistakes. May rework this in the future. + + // Popups: begin/end functions + // - BeginPopup(): query popup state, if open start appending into the window. Call EndPopup() afterwards. ImGuiWindowFlags are forwarded to the window. + // - BeginPopupModal(): block every interaction behind the window, cannot be closed by user, add a dimming background, has a title bar. + IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. + IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // return true if the modal is open, and you can start outputting to it. + IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true! + + // Popups: open/close functions + // - OpenPopup(): set popup state to open. ImGuiPopupFlags are available for opening options. + // - If not modal: they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - CloseCurrentPopup(): use inside the BeginPopup()/EndPopup() scope to close manually. + // - CloseCurrentPopup() is called by default by Selectable()/MenuItem() when activated (FIXME: need some options). + // - Use ImGuiPopupFlags_NoOpenOverExistingPopup to avoid opening a popup if there's already one at the same level. This is equivalent to e.g. testing for !IsAnyPopupOpen() prior to OpenPopup(). + // - Use IsWindowAppearing() after BeginPopup() to tell if a window just opened. + // - IMPORTANT: Notice that for OpenPopupOnItemClick() we exceptionally default flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter + IMGUI_API void OpenPopup(const char* str_id, ImGuiPopupFlags popup_flags = 0); // call to mark popup as open (don't call every frame!). + IMGUI_API void OpenPopup(ImGuiID id, ImGuiPopupFlags popup_flags = 0); // id overload to facilitate calling from nested stacks + IMGUI_API void OpenPopupOnItemClick(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // helper to open popup when clicked on last item. Default to ImGuiPopupFlags_MouseButtonRight == 1. (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors) + IMGUI_API void CloseCurrentPopup(); // manually close the popup we have begin-ed into. + + // Popups: open+begin combined functions helpers + // - Helpers to do OpenPopup+BeginPopup where the Open action is triggered by e.g. hovering an item and right-clicking. + // - They are convenient to easily create context menus, hence the name. + // - IMPORTANT: Notice that BeginPopupContextXXX takes ImGuiPopupFlags just like OpenPopup() and unlike BeginPopup(). For full consistency, we may add ImGuiWindowFlags to the BeginPopupContextXXX functions in the future. + // - IMPORTANT: Notice that we exceptionally default their flags to 1 (== ImGuiPopupFlags_MouseButtonRight) for backward compatibility with older API taking 'int mouse_button = 1' parameter, so if you add other flags remember to re-add the ImGuiPopupFlags_MouseButtonRight. + IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked on last item. Use str_id==NULL to associate the popup to previous item. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp! + IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1);// open+begin popup when clicked on current window. + IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, ImGuiPopupFlags popup_flags = 1); // open+begin popup when clicked in void (where there are no windows). + + // Popups: query functions + // - IsPopupOpen(): return true if the popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId: return true if any popup is open at the current BeginPopup() level of the popup stack. + // - IsPopupOpen() with ImGuiPopupFlags_AnyPopupId + ImGuiPopupFlags_AnyPopupLevel: return true if any popup is open. + IMGUI_API bool IsPopupOpen(const char* str_id, ImGuiPopupFlags flags = 0); // return true if the popup is open. + + // Tables + // - Full-featured replacement for old Columns API. + // - See Demo->Tables for demo code. See top of imgui_tables.cpp for general commentary. + // - See ImGuiTableFlags_ and ImGuiTableColumnFlags_ enums for a description of available flags. + // The typical call flow is: + // - 1. Call BeginTable(), early out if returning false. + // - 2. Optionally call TableSetupColumn() to submit column name/flags/defaults. + // - 3. Optionally call TableSetupScrollFreeze() to request scroll freezing of columns/rows. + // - 4. Optionally call TableHeadersRow() to submit a header row. Names are pulled from TableSetupColumn() data. + // - 5. Populate contents: + // - In most situations you can use TableNextRow() + TableSetColumnIndex(N) to start appending into a column. + // - If you are using tables as a sort of grid, where every column is holding the same type of contents, + // you may prefer using TableNextColumn() instead of TableNextRow() + TableSetColumnIndex(). + // TableNextColumn() will automatically wrap-around into the next row if needed. + // - IMPORTANT: Comparatively to the old Columns() API, we need to call TableNextColumn() for the first column! + // - Summary of possible call flow: + // -------------------------------------------------------------------------------------------------------- + // TableNextRow() -> TableSetColumnIndex(0) -> Text("Hello 0") -> TableSetColumnIndex(1) -> Text("Hello 1") // OK + // TableNextRow() -> TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK + // TableNextColumn() -> Text("Hello 0") -> TableNextColumn() -> Text("Hello 1") // OK: TableNextColumn() automatically gets to next row! + // TableNextRow() -> Text("Hello 0") // Not OK! Missing TableSetColumnIndex() or TableNextColumn()! Text will not appear! + // -------------------------------------------------------------------------------------------------------- + // - 5. Call EndTable() + IMGUI_API bool BeginTable(const char* str_id, int column, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0.0f, 0.0f), float inner_width = 0.0f); + IMGUI_API void EndTable(); // only call EndTable() if BeginTable() returns true! + IMGUI_API void TableNextRow(ImGuiTableRowFlags row_flags = 0, float min_row_height = 0.0f); // append into the first cell of a new row. + IMGUI_API bool TableNextColumn(); // append into the next column (or first column of next row if currently in last column). Return true when column is visible. + IMGUI_API bool TableSetColumnIndex(int column_n); // append into the specified column. Return true when column is visible. + + // Tables: Headers & Columns declaration + // - Use TableSetupColumn() to specify label, resizing policy, default width/weight, id, various other flags etc. + // - Use TableHeadersRow() to create a header row and automatically submit a TableHeader() for each column. + // Headers are required to perform: reordering, sorting, and opening the context menu. + // The context menu can also be made available in columns body using ImGuiTableFlags_ContextMenuInBody. + // - You may manually submit headers using TableNextRow() + TableHeader() calls, but this is only useful in + // some advanced use cases (e.g. adding custom widgets in header row). + // - Use TableSetupScrollFreeze() to lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableSetupColumn(const char* label, ImGuiTableColumnFlags flags = 0, float init_width_or_weight = 0.0f, ImGuiID user_id = 0); + IMGUI_API void TableSetupScrollFreeze(int cols, int rows); // lock columns/rows so they stay visible when scrolled. + IMGUI_API void TableHeadersRow(); // submit all headers cells based on data provided to TableSetupColumn() + submit context menu + IMGUI_API void TableHeader(const char* label); // submit one header cell manually (rarely used) + + // Tables: Sorting & Miscellaneous functions + // - Sorting: call TableGetSortSpecs() to retrieve latest sort specs for the table. NULL when not sorting. + // When 'sort_specs->SpecsDirty == true' you should sort your data. It will be true when sorting specs have + // changed since last call, or the first time. Make sure to set 'SpecsDirty = false' after sorting, + // else you may wastefully sort your data every frame! + // - Functions args 'int column_n' treat the default value of -1 as the same as passing the current column index. + IMGUI_API ImGuiTableSortSpecs* TableGetSortSpecs(); // get latest sort specs for the table (NULL if not sorting). Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable(). + IMGUI_API int TableGetColumnCount(); // return number of columns (value passed to BeginTable) + IMGUI_API int TableGetColumnIndex(); // return current column index. + IMGUI_API int TableGetRowIndex(); // return current row index. + IMGUI_API const char* TableGetColumnName(int column_n = -1); // return "" if column didn't have a name declared by TableSetupColumn(). Pass -1 to use current column. + IMGUI_API ImGuiTableColumnFlags TableGetColumnFlags(int column_n = -1); // return column flags so you can query their Enabled/Visible/Sorted/Hovered status flags. Pass -1 to use current column. + IMGUI_API void TableSetColumnEnabled(int column_n, bool v);// change user accessible enabled/disabled state of a column. Set to false to hide the column. User can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) + IMGUI_API void TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n = -1); // change the color of a cell, row, or column. See ImGuiTableBgTarget_ flags for details. + + // Legacy Columns API (prefer using Tables!) + // - You can also use SameLine(pos_x) to mimic simplified columns. + IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true); + IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished + IMGUI_API int GetColumnIndex(); // get current column index + IMGUI_API float GetColumnWidth(int column_index = -1); // get column width (in pixels). pass -1 to use current column + IMGUI_API void SetColumnWidth(int column_index, float width); // set column width (in pixels). pass -1 to use current column + IMGUI_API float GetColumnOffset(int column_index = -1); // get position of column line (in pixels, from the left side of the contents region). pass -1 to use current column, otherwise 0..GetColumnsCount() inclusive. column 0 is typically 0.0f + IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column + IMGUI_API int GetColumnsCount(); + + // Tab Bars, Tabs + // - Note: Tabs are automatically created by the docking system (when in 'docking' branch). Use this to create tab bars/tabs yourself. + IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar + IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true! + IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0); // create a Tab. Returns true if the Tab is selected. + IMGUI_API void EndTabItem(); // only call EndTabItem() if BeginTabItem() returns true! + IMGUI_API bool TabItemButton(const char* label, ImGuiTabItemFlags flags = 0); // create a Tab behaving like a button. return true when clicked. cannot be selected in the tab bar. + IMGUI_API void SetTabItemClosed(const char* tab_or_docked_window_label); // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name. + + // Logging/Capture + // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging. + IMGUI_API void LogToTTY(int auto_open_depth = -1); // start logging to tty (stdout) + IMGUI_API void LogToFile(int auto_open_depth = -1, const char* filename = NULL); // start logging to file + IMGUI_API void LogToClipboard(int auto_open_depth = -1); // start logging to OS clipboard + IMGUI_API void LogFinish(); // stop logging (close file, etc.) + IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard + IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed) + IMGUI_API void LogTextV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Drag and Drop + // - On source items, call BeginDragDropSource(), if it returns true also call SetDragDropPayload() + EndDragDropSource(). + // - On target candidates, call BeginDragDropTarget(), if it returns true also call AcceptDragDropPayload() + EndDragDropTarget(). + // - If you stop calling BeginDragDropSource() the payload is preserved however it won't have a preview tooltip (we currently display a fallback "..." tooltip, see #1725) + // - An item can be both drag source and drop target. + IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call after submitting an item which may be dragged. when this return true, you can call SetDragDropPayload() + EndDragDropSource() + IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui. Return true when payload has been accepted. + IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true! + IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget() + IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released. + IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true! + IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type. + + // Disabling [BETA API] + // - Disable all user interactions and dim items visuals (applying style.DisabledAlpha over current colors) + // - Those can be nested but it cannot be used to enable an already disabled section (a single BeginDisabled(true) in the stack is enough to keep everything disabled) + // - BeginDisabled(false) essentially does nothing useful but is provided to facilitate use of boolean expressions. If you can avoid calling BeginDisabled(False)/EndDisabled() best to avoid it. + IMGUI_API void BeginDisabled(bool disabled = true); + IMGUI_API void EndDisabled(); + + // Clipping + // - Mouse hovering is affected by ImGui::PushClipRect() calls, unlike direct calls to ImDrawList::PushClipRect() which are render only. + IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect); + IMGUI_API void PopClipRect(); + + // Focus, Activation + // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item" + IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window. + IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget. + + // Item/Widgets Utilities and Query Functions + // - Most of the functions are referring to the previous Item that has been submitted. + // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions. + IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options. + IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false) + IMGUI_API bool IsItemFocused(); // is the last item focused for keyboard/gamepad navigation? + IMGUI_API bool IsItemClicked(ImGuiMouseButton mouse_button = 0); // is the last item hovered and mouse clicked on? (**) == IsMouseClicked(mouse_button) && IsItemHovered()Important. (**) this is NOT equivalent to the behavior of e.g. Button(). Read comments in function definition. + IMGUI_API bool IsItemVisible(); // is the last item visible? (items may be out of sight because of clipping/scrolling) + IMGUI_API bool IsItemEdited(); // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets. + IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive). + IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that require continuous editing. + IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that require continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item). + IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode(). + IMGUI_API bool IsAnyItemHovered(); // is any item hovered? + IMGUI_API bool IsAnyItemActive(); // is any item active? + IMGUI_API bool IsAnyItemFocused(); // is any item focused? + IMGUI_API ImGuiID GetItemID(); // get ID of last item (~~ often same ImGui::GetID(label) beforehand) + IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space) + IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space) + IMGUI_API ImVec2 GetItemRectSize(); // get size of last item + IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area. + + // Viewports + // - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. + // - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. + // - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. + IMGUI_API ImGuiViewport* GetMainViewport(); // return primary/default viewport. This can never be NULL. + + // Background/Foreground Draw Lists + IMGUI_API ImDrawList* GetBackgroundDrawList(); // this draw list will be the first rendered one. Useful to quickly draw shapes/text behind dear imgui contents. + IMGUI_API ImDrawList* GetForegroundDrawList(); // this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + + // Miscellaneous Utilities + IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped. + IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side. + IMGUI_API double GetTime(); // get global imgui time. incremented by io.DeltaTime every frame. + IMGUI_API int GetFrameCount(); // get global imgui frame count. incremented by 1 every frame. + IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); // you may use this when creating your own ImDrawList instances. + IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.). + IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it) + IMGUI_API ImGuiStorage* GetStateStorage(); + IMGUI_API bool BeginChildFrame(ImGuiID id, const ImVec2& size, ImGuiWindowFlags flags = 0); // helper to create a child window / scrolling region that looks like a normal widget frame + IMGUI_API void EndChildFrame(); // always call EndChildFrame() regardless of BeginChildFrame() return values (which indicates a collapsed/clipped window) + + // Text Utilities + IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f); + + // Color Utilities + IMGUI_API ImVec4 ColorConvertU32ToFloat4(ImU32 in); + IMGUI_API ImU32 ColorConvertFloat4ToU32(const ImVec4& in); + IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v); + IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b); + + // Inputs Utilities: Keyboard/Mouse/Gamepad + // - the ImGuiKey enum contains all possible keyboard, mouse and gamepad inputs (e.g. ImGuiKey_A, ImGuiKey_MouseLeft, ImGuiKey_GamepadDpadUp...). + // - before v1.87, we used ImGuiKey to carry native/user indices as defined by each backends. About use of those legacy ImGuiKey values: + // - without IMGUI_DISABLE_OBSOLETE_KEYIO (legacy support): you can still use your legacy native/user indices (< 512) according to how your backend/engine stored them in io.KeysDown[], but need to cast them to ImGuiKey. + // - with IMGUI_DISABLE_OBSOLETE_KEYIO (this is the way forward): any use of ImGuiKey will assert with key < 512. GetKeyIndex() is pass-through and therefore deprecated (gone if IMGUI_DISABLE_OBSOLETE_KEYIO is defined). + IMGUI_API bool IsKeyDown(ImGuiKey key); // is key being held. + IMGUI_API bool IsKeyPressed(ImGuiKey key, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate + IMGUI_API bool IsKeyReleased(ImGuiKey key); // was key released (went from Down to !Down)? + IMGUI_API int GetKeyPressedAmount(ImGuiKey key, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate + IMGUI_API const char* GetKeyName(ImGuiKey key); // [DEBUG] returns English name of the key. Those names a provided for debugging purpose and are not meant to be saved persistently not compared. + IMGUI_API void SetNextFrameWantCaptureKeyboard(bool want_capture_keyboard); // Override io.WantCaptureKeyboard flag next frame (said flag is left for your application to handle, typically when true it instructs your app to ignore inputs). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard"; after the next NewFrame() call. + + // Inputs Utilities: Mouse specific + // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right. + // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle. + // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold') + IMGUI_API bool IsMouseDown(ImGuiMouseButton button); // is mouse button held? + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down). Same as GetMouseClickedCount() == 1. + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down) + IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? Same as GetMouseClickedCount() == 2. (note that a double-click will also report IsMouseClicked() == true) + IMGUI_API int GetMouseClickedCount(ImGuiMouseButton button); // return the number of successive mouse-clicks at the time where a click happen (otherwise 0). + IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block. + IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available + IMGUI_API bool IsAnyMouseDown(); // [WILL OBSOLETE] is any mouse button held? This was designed for backends, but prefer having backend maintain a mask of held mouse buttons, because upcoming input queue system will make this invalid. + IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls + IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves) + IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold) + IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); // + IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired mouse cursor shape. Important: reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you + IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired mouse cursor shape + IMGUI_API void SetNextFrameWantCaptureMouse(bool want_capture_mouse); // Override io.WantCaptureMouse flag next frame (said flag is left for your application to handle, typical when true it instucts your app to ignore inputs). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse;" after the next NewFrame() call. + + // Clipboard Utilities + // - Also see the LogToClipboard() function to capture GUI into clipboard, or easily output text data to the clipboard. + IMGUI_API const char* GetClipboardText(); + IMGUI_API void SetClipboardText(const char* text); + + // Settings/.Ini Utilities + // - The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini"). + // - Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually. + // - Important: default value "imgui.ini" is relative to current working dir! Most apps will want to lock this to an absolute path (e.g. same path as executables). + IMGUI_API void LoadIniSettingsFromDisk(const char* ini_filename); // call after CreateContext() and before the first call to NewFrame(). NewFrame() automatically calls LoadIniSettingsFromDisk(io.IniFilename). + IMGUI_API void LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size=0); // call after CreateContext() and before the first call to NewFrame() to provide .ini data from your own data source. + IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename); // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext). + IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings. + + // Debug Utilities + IMGUI_API void DebugTextEncoding(const char* text); + IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx); // This is called by IMGUI_CHECKVERSION() macro. + + // Memory Allocators + // - Those functions are not reliant on the current context. + // - DLL users: heaps and globals are not shared across DLL boundaries! You will need to call SetCurrentContext() + SetAllocatorFunctions() + // for each static/DLL boundary you are calling from. Read "Context and Memory Allocators" section of imgui.cpp for more details. + IMGUI_API void SetAllocatorFunctions(ImGuiMemAllocFunc alloc_func, ImGuiMemFreeFunc free_func, void* user_data = NULL); + IMGUI_API void GetAllocatorFunctions(ImGuiMemAllocFunc* p_alloc_func, ImGuiMemFreeFunc* p_free_func, void** p_user_data); + IMGUI_API void* MemAlloc(size_t size); + IMGUI_API void MemFree(void* ptr); + +} // namespace ImGui + +//----------------------------------------------------------------------------- +// [SECTION] Flags & Enumerations +//----------------------------------------------------------------------------- + +// Flags for ImGui::Begin() +// (Those are per-window flags. There are shared flags in ImGuiIO: io.ConfigWindowsResizeFromEdges and io.ConfigWindowsMoveFromTitleBarOnly) +enum ImGuiWindowFlags_ +{ + ImGuiWindowFlags_None = 0, + ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar + ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip + ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window + ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programmatically) + ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set. + ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it. Also referred to as Window Menu Button (e.g. within a docking node). + ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame + ImGuiWindowFlags_NoBackground = 1 << 7, // Disable drawing background color (WindowBg, etc.) and outside border. Similar as using SetNextWindowBgAlpha(0.0f). + ImGuiWindowFlags_NoSavedSettings = 1 << 8, // Never load/save settings in .ini file + ImGuiWindowFlags_NoMouseInputs = 1 << 9, // Disable catching mouse, hovering test with pass through. + ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar + ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section. + ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state + ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus) + ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y) + ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x) + ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient) + ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window + ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB) + ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Display a dot next to the title. When used in a tab/docking context, tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, + ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse, + ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus, + + // [Internal] + ImGuiWindowFlags_NavFlattened = 1 << 23, // [BETA] On child window: allow gamepad/keyboard navigation to cross over parent border to this child or between sibling child windows. + ImGuiWindowFlags_ChildWindow = 1 << 24, // Don't use! For internal use by BeginChild() + ImGuiWindowFlags_Tooltip = 1 << 25, // Don't use! For internal use by BeginTooltip() + ImGuiWindowFlags_Popup = 1 << 26, // Don't use! For internal use by BeginPopup() + ImGuiWindowFlags_Modal = 1 << 27, // Don't use! For internal use by BeginPopupModal() + ImGuiWindowFlags_ChildMenu = 1 << 28, // Don't use! For internal use by BeginMenu() +}; + +// Flags for ImGui::InputText() +// (Those are per-item flags. There are shared flags in ImGuiIO: io.ConfigInputTextCursorBlink and io.ConfigInputTextEnterKeepActive) +enum ImGuiInputTextFlags_ +{ + ImGuiInputTextFlags_None = 0, + ImGuiInputTextFlags_CharsDecimal = 1 << 0, // Allow 0123456789.+-*/ + ImGuiInputTextFlags_CharsHexadecimal = 1 << 1, // Allow 0123456789ABCDEFabcdef + ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z + ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs + ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus + ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function. + ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling) + ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling) + ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer. + ImGuiInputTextFlags_CallbackCharFilter = 1 << 9, // Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. + ImGuiInputTextFlags_AllowTabInput = 1 << 10, // Pressing TAB input a '\t' character into the text field + ImGuiInputTextFlags_CtrlEnterForNewLine = 1 << 11, // In multi-line mode, unfocus with Enter, add new line with Ctrl+Enter (default is opposite: unfocus with Ctrl+Enter, add line with Enter). + ImGuiInputTextFlags_NoHorizontalScroll = 1 << 12, // Disable following the cursor horizontally + ImGuiInputTextFlags_AlwaysOverwrite = 1 << 13, // Overwrite mode + ImGuiInputTextFlags_ReadOnly = 1 << 14, // Read-only mode + ImGuiInputTextFlags_Password = 1 << 15, // Password mode, display all characters as '*' + ImGuiInputTextFlags_NoUndoRedo = 1 << 16, // Disable undo/redo. Note that input text owns the text data while active, if you want to provide your own undo/redo stack you need e.g. to call ClearActiveID(). + ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input) + ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this) + ImGuiInputTextFlags_CallbackEdit = 1 << 19, // Callback on any edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) + ImGuiInputTextFlags_EscapeClearsAll = 1 << 20, // Escape key clears content if not empty, and deactivate otherwise (contrast to default behavior of Escape to revert) + + // Obsolete names (will be removed soon) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiInputTextFlags_AlwaysInsertMode = ImGuiInputTextFlags_AlwaysOverwrite // [renamed in 1.82] name was not matching behavior +#endif +}; + +// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*() +enum ImGuiTreeNodeFlags_ +{ + ImGuiTreeNodeFlags_None = 0, + ImGuiTreeNodeFlags_Selected = 1 << 0, // Draw as selected + ImGuiTreeNodeFlags_Framed = 1 << 1, // Draw frame with background (e.g. for CollapsingHeader) + ImGuiTreeNodeFlags_AllowItemOverlap = 1 << 2, // Hit testing to allow subsequent widgets to overlap this one + ImGuiTreeNodeFlags_NoTreePushOnOpen = 1 << 3, // Don't do a TreePush() when open (e.g. for CollapsingHeader) = no extra indent nor pushing on ID stack + ImGuiTreeNodeFlags_NoAutoOpenOnLog = 1 << 4, // Don't automatically and temporarily open node when Logging is active (by default logging will automatically open tree nodes) + ImGuiTreeNodeFlags_DefaultOpen = 1 << 5, // Default node to be open + ImGuiTreeNodeFlags_OpenOnDoubleClick = 1 << 6, // Need double-click to open node + ImGuiTreeNodeFlags_OpenOnArrow = 1 << 7, // Only open when clicking on the arrow part. If ImGuiTreeNodeFlags_OpenOnDoubleClick is also set, single-click arrow or double-click all box to open. + ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes). + ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow + ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding(). + ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default. + ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area). + ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop) + //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible + ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog, +}; + +// Flags for OpenPopup*(), BeginPopupContext*(), IsPopupOpen() functions. +// - To be backward compatible with older API which took an 'int mouse_button = 1' argument, we need to treat +// small flags values as a mouse button index, so we encode the mouse button in the first few bits of the flags. +// It is therefore guaranteed to be legal to pass a mouse button index in ImGuiPopupFlags. +// - For the same reason, we exceptionally default the ImGuiPopupFlags argument of BeginPopupContextXXX functions to 1 instead of 0. +// IMPORTANT: because the default parameter is 1 (==ImGuiPopupFlags_MouseButtonRight), if you rely on the default parameter +// and want to use another flag, you need to pass in the ImGuiPopupFlags_MouseButtonRight flag explicitly. +// - Multiple buttons currently cannot be combined/or-ed in those functions (we could allow it later). +enum ImGuiPopupFlags_ +{ + ImGuiPopupFlags_None = 0, + ImGuiPopupFlags_MouseButtonLeft = 0, // For BeginPopupContext*(): open on Left Mouse release. Guaranteed to always be == 0 (same as ImGuiMouseButton_Left) + ImGuiPopupFlags_MouseButtonRight = 1, // For BeginPopupContext*(): open on Right Mouse release. Guaranteed to always be == 1 (same as ImGuiMouseButton_Right) + ImGuiPopupFlags_MouseButtonMiddle = 2, // For BeginPopupContext*(): open on Middle Mouse release. Guaranteed to always be == 2 (same as ImGuiMouseButton_Middle) + ImGuiPopupFlags_MouseButtonMask_ = 0x1F, + ImGuiPopupFlags_MouseButtonDefault_ = 1, + ImGuiPopupFlags_NoOpenOverExistingPopup = 1 << 5, // For OpenPopup*(), BeginPopupContext*(): don't open if there's already a popup at the same level of the popup stack + ImGuiPopupFlags_NoOpenOverItems = 1 << 6, // For BeginPopupContextWindow(): don't return true when hovering items, only when hovering empty space + ImGuiPopupFlags_AnyPopupId = 1 << 7, // For IsPopupOpen(): ignore the ImGuiID parameter and test for any popup. + ImGuiPopupFlags_AnyPopupLevel = 1 << 8, // For IsPopupOpen(): search/test at any level of the popup stack (default test in the current level) + ImGuiPopupFlags_AnyPopup = ImGuiPopupFlags_AnyPopupId | ImGuiPopupFlags_AnyPopupLevel, +}; + +// Flags for ImGui::Selectable() +enum ImGuiSelectableFlags_ +{ + ImGuiSelectableFlags_None = 0, + ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this doesn't close parent popup window + ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column) + ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too + ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text + ImGuiSelectableFlags_AllowItemOverlap = 1 << 4, // (WIP) Hit testing to allow subsequent widgets to overlap this one +}; + +// Flags for ImGui::BeginCombo() +enum ImGuiComboFlags_ +{ + ImGuiComboFlags_None = 0, + ImGuiComboFlags_PopupAlignLeft = 1 << 0, // Align the popup toward the left by default + ImGuiComboFlags_HeightSmall = 1 << 1, // Max ~4 items visible. Tip: If you want your combo popup to be a specific size you can use SetNextWindowSizeConstraints() prior to calling BeginCombo() + ImGuiComboFlags_HeightRegular = 1 << 2, // Max ~8 items visible (default) + ImGuiComboFlags_HeightLarge = 1 << 3, // Max ~20 items visible + ImGuiComboFlags_HeightLargest = 1 << 4, // As many fitting items as possible + ImGuiComboFlags_NoArrowButton = 1 << 5, // Display on the preview box without the square arrow button + ImGuiComboFlags_NoPreview = 1 << 6, // Display only a square arrow button + ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest, +}; + +// Flags for ImGui::BeginTabBar() +enum ImGuiTabBarFlags_ +{ + ImGuiTabBarFlags_None = 0, + ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list + ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear + ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup + ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll) + ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab + ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit + ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit + ImGuiTabBarFlags_FittingPolicyMask_ = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll, + ImGuiTabBarFlags_FittingPolicyDefault_ = ImGuiTabBarFlags_FittingPolicyResizeDown, +}; + +// Flags for ImGui::BeginTabItem() +enum ImGuiTabItemFlags_ +{ + ImGuiTabItemFlags_None = 0, + ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Display a dot next to the title + tab is selected when clicking the X + closure is not assumed (will wait for user to stop submitting the tab). Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem() + ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false. + ImGuiTabItemFlags_NoPushId = 1 << 3, // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem() + ImGuiTabItemFlags_NoTooltip = 1 << 4, // Disable tooltip for the given tab + ImGuiTabItemFlags_NoReorder = 1 << 5, // Disable reordering this tab or having another tab cross over this tab + ImGuiTabItemFlags_Leading = 1 << 6, // Enforce the tab position to the left of the tab bar (after the tab list popup button) + ImGuiTabItemFlags_Trailing = 1 << 7, // Enforce the tab position to the right of the tab bar (before the scrolling buttons) +}; + +// Flags for ImGui::BeginTable() +// - Important! Sizing policies have complex and subtle side effects, much more so than you would expect. +// Read comments/demos carefully + experiment with live demos to get acquainted with them. +// - The DEFAULT sizing policies are: +// - Default to ImGuiTableFlags_SizingFixedFit if ScrollX is on, or if host window has ImGuiWindowFlags_AlwaysAutoResize. +// - Default to ImGuiTableFlags_SizingStretchSame if ScrollX is off. +// - When ScrollX is off: +// - Table defaults to ImGuiTableFlags_SizingStretchSame -> all Columns defaults to ImGuiTableColumnFlags_WidthStretch with same weight. +// - Columns sizing policy allowed: Stretch (default), Fixed/Auto. +// - Fixed Columns (if any) will generally obtain their requested width (unless the table cannot fit them all). +// - Stretch Columns will share the remaining width according to their respective weight. +// - Mixed Fixed/Stretch columns is possible but has various side-effects on resizing behaviors. +// The typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// (this is because the visible order of columns have subtle but necessary effects on how they react to manual resizing). +// - When ScrollX is on: +// - Table defaults to ImGuiTableFlags_SizingFixedFit -> all Columns defaults to ImGuiTableColumnFlags_WidthFixed +// - Columns sizing policy allowed: Fixed/Auto mostly. +// - Fixed Columns can be enlarged as needed. Table will show a horizontal scrollbar if needed. +// - When using auto-resizing (non-resizable) fixed columns, querying the content width to use item right-alignment e.g. SetNextItemWidth(-FLT_MIN) doesn't make sense, would create a feedback loop. +// - Using Stretch columns OFTEN DOES NOT MAKE SENSE if ScrollX is on, UNLESS you have specified a value for 'inner_width' in BeginTable(). +// If you specify a value for 'inner_width' then effectively the scrolling space is known and Stretch or mixed Fixed/Stretch columns become meaningful again. +// - Read on documentation at the top of imgui_tables.cpp for details. +enum ImGuiTableFlags_ +{ + // Features + ImGuiTableFlags_None = 0, + ImGuiTableFlags_Resizable = 1 << 0, // Enable resizing columns. + ImGuiTableFlags_Reorderable = 1 << 1, // Enable reordering columns in header row (need calling TableSetupColumn() + TableHeadersRow() to display headers) + ImGuiTableFlags_Hideable = 1 << 2, // Enable hiding/disabling columns in context menu. + ImGuiTableFlags_Sortable = 1 << 3, // Enable sorting. Call TableGetSortSpecs() to obtain sort specs. Also see ImGuiTableFlags_SortMulti and ImGuiTableFlags_SortTristate. + ImGuiTableFlags_NoSavedSettings = 1 << 4, // Disable persisting columns order, width and sort settings in the .ini file. + ImGuiTableFlags_ContextMenuInBody = 1 << 5, // Right-click on columns body/contents will display table context menu. By default it is available in TableHeadersRow(). + // Decorations + ImGuiTableFlags_RowBg = 1 << 6, // Set each RowBg color with ImGuiCol_TableRowBg or ImGuiCol_TableRowBgAlt (equivalent of calling TableSetBgColor with ImGuiTableBgFlags_RowBg0 on each row manually) + ImGuiTableFlags_BordersInnerH = 1 << 7, // Draw horizontal borders between rows. + ImGuiTableFlags_BordersOuterH = 1 << 8, // Draw horizontal borders at the top and bottom. + ImGuiTableFlags_BordersInnerV = 1 << 9, // Draw vertical borders between columns. + ImGuiTableFlags_BordersOuterV = 1 << 10, // Draw vertical borders on the left and right sides. + ImGuiTableFlags_BordersH = ImGuiTableFlags_BordersInnerH | ImGuiTableFlags_BordersOuterH, // Draw horizontal borders. + ImGuiTableFlags_BordersV = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersOuterV, // Draw vertical borders. + ImGuiTableFlags_BordersInner = ImGuiTableFlags_BordersInnerV | ImGuiTableFlags_BordersInnerH, // Draw inner borders. + ImGuiTableFlags_BordersOuter = ImGuiTableFlags_BordersOuterV | ImGuiTableFlags_BordersOuterH, // Draw outer borders. + ImGuiTableFlags_Borders = ImGuiTableFlags_BordersInner | ImGuiTableFlags_BordersOuter, // Draw all borders. + ImGuiTableFlags_NoBordersInBody = 1 << 11, // [ALPHA] Disable vertical borders in columns Body (borders will always appear in Headers). -> May move to style + ImGuiTableFlags_NoBordersInBodyUntilResize = 1 << 12, // [ALPHA] Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers). -> May move to style + // Sizing Policy (read above for defaults) + ImGuiTableFlags_SizingFixedFit = 1 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching contents width. + ImGuiTableFlags_SizingFixedSame = 2 << 13, // Columns default to _WidthFixed or _WidthAuto (if resizable or not resizable), matching the maximum contents width of all columns. Implicitly enable ImGuiTableFlags_NoKeepColumnsVisible. + ImGuiTableFlags_SizingStretchProp = 3 << 13, // Columns default to _WidthStretch with default weights proportional to each columns contents widths. + ImGuiTableFlags_SizingStretchSame = 4 << 13, // Columns default to _WidthStretch with default weights all equal, unless overridden by TableSetupColumn(). + // Sizing Extra Options + ImGuiTableFlags_NoHostExtendX = 1 << 16, // Make outer width auto-fit to columns, overriding outer_size.x value. Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. + ImGuiTableFlags_NoHostExtendY = 1 << 17, // Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible. + ImGuiTableFlags_NoKeepColumnsVisible = 1 << 18, // Disable keeping column always minimally visible when ScrollX is off and table gets too small. Not recommended if columns are resizable. + ImGuiTableFlags_PreciseWidths = 1 << 19, // Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth. + // Clipping + ImGuiTableFlags_NoClip = 1 << 20, // Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with TableSetupScrollFreeze(). + // Padding + ImGuiTableFlags_PadOuterX = 1 << 21, // Default if BordersOuterV is on. Enable outermost padding. Generally desirable if you have headers. + ImGuiTableFlags_NoPadOuterX = 1 << 22, // Default if BordersOuterV is off. Disable outermost padding. + ImGuiTableFlags_NoPadInnerX = 1 << 23, // Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off). + // Scrolling + ImGuiTableFlags_ScrollX = 1 << 24, // Enable horizontal scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. Changes default sizing policy. Because this creates a child window, ScrollY is currently generally recommended when using ScrollX. + ImGuiTableFlags_ScrollY = 1 << 25, // Enable vertical scrolling. Require 'outer_size' parameter of BeginTable() to specify the container size. + // Sorting + ImGuiTableFlags_SortMulti = 1 << 26, // Hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1). + ImGuiTableFlags_SortTristate = 1 << 27, // Allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0). + + // [Internal] Combinations and masks + ImGuiTableFlags_SizingMask_ = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_SizingFixedSame | ImGuiTableFlags_SizingStretchProp | ImGuiTableFlags_SizingStretchSame, +}; + +// Flags for ImGui::TableSetupColumn() +enum ImGuiTableColumnFlags_ +{ + // Input configuration flags + ImGuiTableColumnFlags_None = 0, + ImGuiTableColumnFlags_Disabled = 1 << 0, // Overriding/master disable flag: hide column, won't show in context menu (unlike calling TableSetColumnEnabled() which manipulates the user accessible state) + ImGuiTableColumnFlags_DefaultHide = 1 << 1, // Default as a hidden/disabled column. + ImGuiTableColumnFlags_DefaultSort = 1 << 2, // Default as a sorting column. + ImGuiTableColumnFlags_WidthStretch = 1 << 3, // Column will stretch. Preferable with horizontal scrolling disabled (default if table sizing policy is _SizingStretchSame or _SizingStretchProp). + ImGuiTableColumnFlags_WidthFixed = 1 << 4, // Column will not stretch. Preferable with horizontal scrolling enabled (default if table sizing policy is _SizingFixedFit and table is resizable). + ImGuiTableColumnFlags_NoResize = 1 << 5, // Disable manual resizing. + ImGuiTableColumnFlags_NoReorder = 1 << 6, // Disable manual reordering this column, this will also prevent other columns from crossing over this column. + ImGuiTableColumnFlags_NoHide = 1 << 7, // Disable ability to hide/disable this column. + ImGuiTableColumnFlags_NoClip = 1 << 8, // Disable clipping for this column (all NoClip columns will render in a same draw command). + ImGuiTableColumnFlags_NoSort = 1 << 9, // Disable ability to sort on this field (even if ImGuiTableFlags_Sortable is set on the table). + ImGuiTableColumnFlags_NoSortAscending = 1 << 10, // Disable ability to sort in the ascending direction. + ImGuiTableColumnFlags_NoSortDescending = 1 << 11, // Disable ability to sort in the descending direction. + ImGuiTableColumnFlags_NoHeaderLabel = 1 << 12, // TableHeadersRow() will not submit label for this column. Convenient for some small columns. Name will still appear in context menu. + ImGuiTableColumnFlags_NoHeaderWidth = 1 << 13, // Disable header text width contribution to automatic column width. + ImGuiTableColumnFlags_PreferSortAscending = 1 << 14, // Make the initial sort direction Ascending when first sorting on this column (default). + ImGuiTableColumnFlags_PreferSortDescending = 1 << 15, // Make the initial sort direction Descending when first sorting on this column. + ImGuiTableColumnFlags_IndentEnable = 1 << 16, // Use current Indent value when entering cell (default for column 0). + ImGuiTableColumnFlags_IndentDisable = 1 << 17, // Ignore current Indent value when entering cell (default for columns > 0). Indentation changes _within_ the cell will still be honored. + + // Output status flags, read-only via TableGetColumnFlags() + ImGuiTableColumnFlags_IsEnabled = 1 << 24, // Status: is enabled == not hidden by user/api (referred to as "Hide" in _DefaultHide and _NoHide) flags. + ImGuiTableColumnFlags_IsVisible = 1 << 25, // Status: is visible == is enabled AND not clipped by scrolling. + ImGuiTableColumnFlags_IsSorted = 1 << 26, // Status: is currently part of the sort specs + ImGuiTableColumnFlags_IsHovered = 1 << 27, // Status: is hovered by mouse + + // [Internal] Combinations and masks + ImGuiTableColumnFlags_WidthMask_ = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_WidthFixed, + ImGuiTableColumnFlags_IndentMask_ = ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_IndentDisable, + ImGuiTableColumnFlags_StatusMask_ = ImGuiTableColumnFlags_IsEnabled | ImGuiTableColumnFlags_IsVisible | ImGuiTableColumnFlags_IsSorted | ImGuiTableColumnFlags_IsHovered, + ImGuiTableColumnFlags_NoDirectResize_ = 1 << 30, // [Internal] Disable user resizing this column directly (it may however we resized indirectly from its left edge) +}; + +// Flags for ImGui::TableNextRow() +enum ImGuiTableRowFlags_ +{ + ImGuiTableRowFlags_None = 0, + ImGuiTableRowFlags_Headers = 1 << 0, // Identify header row (set default background color + width of its contents accounted differently for auto column width) +}; + +// Enum for ImGui::TableSetBgColor() +// Background colors are rendering in 3 layers: +// - Layer 0: draw with RowBg0 color if set, otherwise draw with ColumnBg0 if set. +// - Layer 1: draw with RowBg1 color if set, otherwise draw with ColumnBg1 if set. +// - Layer 2: draw with CellBg color if set. +// The purpose of the two row/columns layers is to let you decide if a background color change should override or blend with the existing color. +// When using ImGuiTableFlags_RowBg on the table, each row has the RowBg0 color automatically set for odd/even rows. +// If you set the color of RowBg0 target, your color will override the existing RowBg0 color. +// If you set the color of RowBg1 or ColumnBg1 target, your color will blend over the RowBg0 color. +enum ImGuiTableBgTarget_ +{ + ImGuiTableBgTarget_None = 0, + ImGuiTableBgTarget_RowBg0 = 1, // Set row background color 0 (generally used for background, automatically set when ImGuiTableFlags_RowBg is used) + ImGuiTableBgTarget_RowBg1 = 2, // Set row background color 1 (generally used for selection marking) + ImGuiTableBgTarget_CellBg = 3, // Set cell background color (top-most color) +}; + +// Flags for ImGui::IsWindowFocused() +enum ImGuiFocusedFlags_ +{ + ImGuiFocusedFlags_None = 0, + ImGuiFocusedFlags_ChildWindows = 1 << 0, // Return true if any children of the window is focused + ImGuiFocusedFlags_RootWindow = 1 << 1, // Test from root window (top most parent of the current hierarchy) + ImGuiFocusedFlags_AnyWindow = 1 << 2, // Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use 'io.WantCaptureMouse' instead! Please read the FAQ! + ImGuiFocusedFlags_NoPopupHierarchy = 1 << 3, // Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) + //ImGuiFocusedFlags_DockHierarchy = 1 << 4, // Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) + ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows, +}; + +// Flags for ImGui::IsItemHovered(), ImGui::IsWindowHovered() +// Note: if you are trying to check whether your mouse should be dispatched to Dear ImGui or to your app, you should use 'io.WantCaptureMouse' instead! Please read the FAQ! +// Note: windows with the ImGuiWindowFlags_NoInputs flag are ignored by IsWindowHovered() calls. +enum ImGuiHoveredFlags_ +{ + ImGuiHoveredFlags_None = 0, // Return true if directly over the item/window, not obstructed by another window, not obstructed by an active popup or modal blocking inputs under them. + ImGuiHoveredFlags_ChildWindows = 1 << 0, // IsWindowHovered() only: Return true if any children of the window is hovered + ImGuiHoveredFlags_RootWindow = 1 << 1, // IsWindowHovered() only: Test from root window (top most parent of the current hierarchy) + ImGuiHoveredFlags_AnyWindow = 1 << 2, // IsWindowHovered() only: Return true if any window is hovered + ImGuiHoveredFlags_NoPopupHierarchy = 1 << 3, // IsWindowHovered() only: Do not consider popup hierarchy (do not treat popup emitter as parent of popup) (when used with _ChildWindows or _RootWindow) + //ImGuiHoveredFlags_DockHierarchy = 1 << 4, // IsWindowHovered() only: Consider docking hierarchy (treat dockspace host as parent of docked window) (when used with _ChildWindows or _RootWindow) + ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 5, // Return true even if a popup window is normally blocking access to this item/window + //ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 6, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet. + ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 7, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns. + ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 8, // IsItemHovered() only: Return true even if the position is obstructed or overlapped by another window + ImGuiHoveredFlags_AllowWhenDisabled = 1 << 9, // IsItemHovered() only: Return true even if the item is disabled + ImGuiHoveredFlags_NoNavOverride = 1 << 10, // Disable using gamepad/keyboard navigation state when active, always query mouse. + ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped, + ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows, + + // Hovering delays (for tooltips) + ImGuiHoveredFlags_DelayNormal = 1 << 11, // Return true after io.HoverDelayNormal elapsed (~0.30 sec) + ImGuiHoveredFlags_DelayShort = 1 << 12, // Return true after io.HoverDelayShort elapsed (~0.10 sec) + ImGuiHoveredFlags_NoSharedDelay = 1 << 13, // Disable shared delay system where moving from one item to the next keeps the previous timer for a short time (standard for tooltips with long delays) +}; + +// Flags for ImGui::BeginDragDropSource(), ImGui::AcceptDragDropPayload() +enum ImGuiDragDropFlags_ +{ + ImGuiDragDropFlags_None = 0, + // BeginDragDropSource() flags + ImGuiDragDropFlags_SourceNoPreviewTooltip = 1 << 0, // Disable preview tooltip. By default, a successful call to BeginDragDropSource opens a tooltip so you can display a preview or description of the source contents. This flag disables this behavior. + ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disables this behavior so you can still call IsItemHovered() on the source item. + ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item. + ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit. + ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously. + ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged) + // AcceptDragDropPayload() flags + ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered. + ImGuiDragDropFlags_AcceptNoDrawDefaultRect = 1 << 11, // Do not draw the default highlight rectangle when hovering over target. + ImGuiDragDropFlags_AcceptNoPreviewTooltip = 1 << 12, // Request hiding the BeginDragDropSource tooltip from the BeginDragDropTarget site. + ImGuiDragDropFlags_AcceptPeekOnly = ImGuiDragDropFlags_AcceptBeforeDelivery | ImGuiDragDropFlags_AcceptNoDrawDefaultRect, // For peeking ahead and inspecting the payload before delivery. +}; + +// Standard Drag and Drop payload types. You can define you own payload types using short strings. Types starting with '_' are defined by Dear ImGui. +#define IMGUI_PAYLOAD_TYPE_COLOR_3F "_COL3F" // float[3]: Standard type for colors, without alpha. User code may use this type. +#define IMGUI_PAYLOAD_TYPE_COLOR_4F "_COL4F" // float[4]: Standard type for colors. User code may use this type. + +// A primary data type +enum ImGuiDataType_ +{ + ImGuiDataType_S8, // signed char / char (with sensible compilers) + ImGuiDataType_U8, // unsigned char + ImGuiDataType_S16, // short + ImGuiDataType_U16, // unsigned short + ImGuiDataType_S32, // int + ImGuiDataType_U32, // unsigned int + ImGuiDataType_S64, // long long / __int64 + ImGuiDataType_U64, // unsigned long long / unsigned __int64 + ImGuiDataType_Float, // float + ImGuiDataType_Double, // double + ImGuiDataType_COUNT +}; + +// A cardinal direction +enum ImGuiDir_ +{ + ImGuiDir_None = -1, + ImGuiDir_Left = 0, + ImGuiDir_Right = 1, + ImGuiDir_Up = 2, + ImGuiDir_Down = 3, + ImGuiDir_COUNT +}; + +// A sorting direction +enum ImGuiSortDirection_ +{ + ImGuiSortDirection_None = 0, + ImGuiSortDirection_Ascending = 1, // Ascending = 0->9, A->Z etc. + ImGuiSortDirection_Descending = 2 // Descending = 9->0, Z->A etc. +}; + +// A key identifier (ImGuiKey_XXX or ImGuiMod_XXX value): can represent Keyboard, Mouse and Gamepad values. +// All our named keys are >= 512. Keys value 0 to 511 are left unused as legacy native/opaque key values (< 1.87). +// Since >= 1.89 we increased typing (went from int to enum), some legacy code may need a cast to ImGuiKey. +// Read details about the 1.87 and 1.89 transition : https://github.com/ocornut/imgui/issues/4921 +// Note that "Keys" related to physical keys and are not the same concept as input "Characters", the later are submitted via io.AddInputCharacter(). +enum ImGuiKey : int +{ + // Keyboard + ImGuiKey_None = 0, + ImGuiKey_Tab = 512, // == ImGuiKey_NamedKey_BEGIN + ImGuiKey_LeftArrow, + ImGuiKey_RightArrow, + ImGuiKey_UpArrow, + ImGuiKey_DownArrow, + ImGuiKey_PageUp, + ImGuiKey_PageDown, + ImGuiKey_Home, + ImGuiKey_End, + ImGuiKey_Insert, + ImGuiKey_Delete, + ImGuiKey_Backspace, + ImGuiKey_Space, + ImGuiKey_Enter, + ImGuiKey_Escape, + ImGuiKey_LeftCtrl, ImGuiKey_LeftShift, ImGuiKey_LeftAlt, ImGuiKey_LeftSuper, + ImGuiKey_RightCtrl, ImGuiKey_RightShift, ImGuiKey_RightAlt, ImGuiKey_RightSuper, + ImGuiKey_Menu, + ImGuiKey_0, ImGuiKey_1, ImGuiKey_2, ImGuiKey_3, ImGuiKey_4, ImGuiKey_5, ImGuiKey_6, ImGuiKey_7, ImGuiKey_8, ImGuiKey_9, + ImGuiKey_A, ImGuiKey_B, ImGuiKey_C, ImGuiKey_D, ImGuiKey_E, ImGuiKey_F, ImGuiKey_G, ImGuiKey_H, ImGuiKey_I, ImGuiKey_J, + ImGuiKey_K, ImGuiKey_L, ImGuiKey_M, ImGuiKey_N, ImGuiKey_O, ImGuiKey_P, ImGuiKey_Q, ImGuiKey_R, ImGuiKey_S, ImGuiKey_T, + ImGuiKey_U, ImGuiKey_V, ImGuiKey_W, ImGuiKey_X, ImGuiKey_Y, ImGuiKey_Z, + ImGuiKey_F1, ImGuiKey_F2, ImGuiKey_F3, ImGuiKey_F4, ImGuiKey_F5, ImGuiKey_F6, + ImGuiKey_F7, ImGuiKey_F8, ImGuiKey_F9, ImGuiKey_F10, ImGuiKey_F11, ImGuiKey_F12, + ImGuiKey_Apostrophe, // ' + ImGuiKey_Comma, // , + ImGuiKey_Minus, // - + ImGuiKey_Period, // . + ImGuiKey_Slash, // / + ImGuiKey_Semicolon, // ; + ImGuiKey_Equal, // = + ImGuiKey_LeftBracket, // [ + ImGuiKey_Backslash, // \ (this text inhibit multiline comment caused by backslash) + ImGuiKey_RightBracket, // ] + ImGuiKey_GraveAccent, // ` + ImGuiKey_CapsLock, + ImGuiKey_ScrollLock, + ImGuiKey_NumLock, + ImGuiKey_PrintScreen, + ImGuiKey_Pause, + ImGuiKey_Keypad0, ImGuiKey_Keypad1, ImGuiKey_Keypad2, ImGuiKey_Keypad3, ImGuiKey_Keypad4, + ImGuiKey_Keypad5, ImGuiKey_Keypad6, ImGuiKey_Keypad7, ImGuiKey_Keypad8, ImGuiKey_Keypad9, + ImGuiKey_KeypadDecimal, + ImGuiKey_KeypadDivide, + ImGuiKey_KeypadMultiply, + ImGuiKey_KeypadSubtract, + ImGuiKey_KeypadAdd, + ImGuiKey_KeypadEnter, + ImGuiKey_KeypadEqual, + + // Gamepad (some of those are analog values, 0.0f to 1.0f) // NAVIGATION ACTION + // (download controller mapping PNG/PSD at http://dearimgui.org/controls_sheets) + ImGuiKey_GamepadStart, // Menu (Xbox) + (Switch) Start/Options (PS) + ImGuiKey_GamepadBack, // View (Xbox) - (Switch) Share (PS) + ImGuiKey_GamepadFaceLeft, // X (Xbox) Y (Switch) Square (PS) // Tap: Toggle Menu. Hold: Windowing mode (Focus/Move/Resize windows) + ImGuiKey_GamepadFaceRight, // B (Xbox) A (Switch) Circle (PS) // Cancel / Close / Exit + ImGuiKey_GamepadFaceUp, // Y (Xbox) X (Switch) Triangle (PS) // Text Input / On-screen Keyboard + ImGuiKey_GamepadFaceDown, // A (Xbox) B (Switch) Cross (PS) // Activate / Open / Toggle / Tweak + ImGuiKey_GamepadDpadLeft, // D-pad Left // Move / Tweak / Resize Window (in Windowing mode) + ImGuiKey_GamepadDpadRight, // D-pad Right // Move / Tweak / Resize Window (in Windowing mode) + ImGuiKey_GamepadDpadUp, // D-pad Up // Move / Tweak / Resize Window (in Windowing mode) + ImGuiKey_GamepadDpadDown, // D-pad Down // Move / Tweak / Resize Window (in Windowing mode) + ImGuiKey_GamepadL1, // L Bumper (Xbox) L (Switch) L1 (PS) // Tweak Slower / Focus Previous (in Windowing mode) + ImGuiKey_GamepadR1, // R Bumper (Xbox) R (Switch) R1 (PS) // Tweak Faster / Focus Next (in Windowing mode) + ImGuiKey_GamepadL2, // L Trig. (Xbox) ZL (Switch) L2 (PS) [Analog] + ImGuiKey_GamepadR2, // R Trig. (Xbox) ZR (Switch) R2 (PS) [Analog] + ImGuiKey_GamepadL3, // L Stick (Xbox) L3 (Switch) L3 (PS) + ImGuiKey_GamepadR3, // R Stick (Xbox) R3 (Switch) R3 (PS) + ImGuiKey_GamepadLStickLeft, // [Analog] // Move Window (in Windowing mode) + ImGuiKey_GamepadLStickRight, // [Analog] // Move Window (in Windowing mode) + ImGuiKey_GamepadLStickUp, // [Analog] // Move Window (in Windowing mode) + ImGuiKey_GamepadLStickDown, // [Analog] // Move Window (in Windowing mode) + ImGuiKey_GamepadRStickLeft, // [Analog] + ImGuiKey_GamepadRStickRight, // [Analog] + ImGuiKey_GamepadRStickUp, // [Analog] + ImGuiKey_GamepadRStickDown, // [Analog] + + // Aliases: Mouse Buttons (auto-submitted from AddMouseButtonEvent() calls) + // - This is mirroring the data also written to io.MouseDown[], io.MouseWheel, in a format allowing them to be accessed via standard key API. + ImGuiKey_MouseLeft, ImGuiKey_MouseRight, ImGuiKey_MouseMiddle, ImGuiKey_MouseX1, ImGuiKey_MouseX2, ImGuiKey_MouseWheelX, ImGuiKey_MouseWheelY, + + // [Internal] Reserved for mod storage + ImGuiKey_ReservedForModCtrl, ImGuiKey_ReservedForModShift, ImGuiKey_ReservedForModAlt, ImGuiKey_ReservedForModSuper, + ImGuiKey_COUNT, + + // Keyboard Modifiers (explicitly submitted by backend via AddKeyEvent() calls) + // - This is mirroring the data also written to io.KeyCtrl, io.KeyShift, io.KeyAlt, io.KeySuper, in a format allowing + // them to be accessed via standard key API, allowing calls such as IsKeyPressed(), IsKeyReleased(), querying duration etc. + // - Code polling every key (e.g. an interface to detect a key press for input mapping) might want to ignore those + // and prefer using the real keys (e.g. ImGuiKey_LeftCtrl, ImGuiKey_RightCtrl instead of ImGuiMod_Ctrl). + // - In theory the value of keyboard modifiers should be roughly equivalent to a logical or of the equivalent left/right keys. + // In practice: it's complicated; mods are often provided from different sources. Keyboard layout, IME, sticky keys and + // backends tend to interfere and break that equivalence. The safer decision is to relay that ambiguity down to the end-user... + ImGuiMod_None = 0, + ImGuiMod_Ctrl = 1 << 12, // Ctrl + ImGuiMod_Shift = 1 << 13, // Shift + ImGuiMod_Alt = 1 << 14, // Option/Menu + ImGuiMod_Super = 1 << 15, // Cmd/Super/Windows + ImGuiMod_Shortcut = 1 << 11, // Alias for Ctrl (non-macOS) _or_ Super (macOS). + ImGuiMod_Mask_ = 0xF800, // 5-bits + + // [Internal] Prior to 1.87 we required user to fill io.KeysDown[512] using their own native index + the io.KeyMap[] array. + // We are ditching this method but keeping a legacy path for user code doing e.g. IsKeyPressed(MY_NATIVE_KEY_CODE) + // If you need to iterate all keys (for e.g. an input mapper) you may use ImGuiKey_NamedKey_BEGIN..ImGuiKey_NamedKey_END. + ImGuiKey_NamedKey_BEGIN = 512, + ImGuiKey_NamedKey_END = ImGuiKey_COUNT, + ImGuiKey_NamedKey_COUNT = ImGuiKey_NamedKey_END - ImGuiKey_NamedKey_BEGIN, +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + ImGuiKey_KeysData_SIZE = ImGuiKey_NamedKey_COUNT, // Size of KeysData[]: only hold named keys + ImGuiKey_KeysData_OFFSET = ImGuiKey_NamedKey_BEGIN, // Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET) index. +#else + ImGuiKey_KeysData_SIZE = ImGuiKey_COUNT, // Size of KeysData[]: hold legacy 0..512 keycodes + named keys + ImGuiKey_KeysData_OFFSET = 0, // Accesses to io.KeysData[] must use (key - ImGuiKey_KeysData_OFFSET) index. +#endif + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiKey_ModCtrl = ImGuiMod_Ctrl, ImGuiKey_ModShift = ImGuiMod_Shift, ImGuiKey_ModAlt = ImGuiMod_Alt, ImGuiKey_ModSuper = ImGuiMod_Super, // Renamed in 1.89 + ImGuiKey_KeyPadEnter = ImGuiKey_KeypadEnter, // Renamed in 1.87 +#endif +}; + +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO +// OBSOLETED in 1.88 (from July 2022): ImGuiNavInput and io.NavInputs[]. +// Official backends between 1.60 and 1.86: will keep working and feed gamepad inputs as long as IMGUI_DISABLE_OBSOLETE_KEYIO is not set. +// Custom backends: feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. +enum ImGuiNavInput +{ + ImGuiNavInput_Activate, ImGuiNavInput_Cancel, ImGuiNavInput_Input, ImGuiNavInput_Menu, ImGuiNavInput_DpadLeft, ImGuiNavInput_DpadRight, ImGuiNavInput_DpadUp, ImGuiNavInput_DpadDown, + ImGuiNavInput_LStickLeft, ImGuiNavInput_LStickRight, ImGuiNavInput_LStickUp, ImGuiNavInput_LStickDown, ImGuiNavInput_FocusPrev, ImGuiNavInput_FocusNext, ImGuiNavInput_TweakSlow, ImGuiNavInput_TweakFast, + ImGuiNavInput_COUNT, +}; +#endif + +// Configuration flags stored in io.ConfigFlags. Set by user/application. +enum ImGuiConfigFlags_ +{ + ImGuiConfigFlags_None = 0, + ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. Enable full Tabbing + directional arrows + space/enter to activate. + ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. Backend also needs to set ImGuiBackendFlags_HasGamepad. + ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your backend, otherwise ImGui will react as if the mouse is jumping around back and forth. + ImGuiConfigFlags_NavNoCaptureKeyboard = 1 << 3, // Instruct navigation to not set the io.WantCaptureKeyboard flag when io.NavActive is set. + ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the backend. + ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct backend to not alter mouse cursor shape and visibility. Use if the backend cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead. + + // User storage (to allow your backend/engine to communicate to code that may be shared between multiple projects. Those flags are NOT used by core Dear ImGui) + ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware. + ImGuiConfigFlags_IsTouchScreen = 1 << 21, // Application is using a touch screen instead of a mouse. +}; + +// Backend capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom backend. +enum ImGuiBackendFlags_ +{ + ImGuiBackendFlags_None = 0, + ImGuiBackendFlags_HasGamepad = 1 << 0, // Backend Platform supports gamepad and currently has one connected. + ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Backend Platform supports honoring GetMouseCursor() value to change the OS cursor shape. + ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Backend Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set). + ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3, // Backend Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices. +}; + +// Enumeration for PushStyleColor() / PopStyleColor() +enum ImGuiCol_ +{ + ImGuiCol_Text, + ImGuiCol_TextDisabled, + ImGuiCol_WindowBg, // Background of normal windows + ImGuiCol_ChildBg, // Background of child windows + ImGuiCol_PopupBg, // Background of popups, menus, tooltips windows + ImGuiCol_Border, + ImGuiCol_BorderShadow, + ImGuiCol_FrameBg, // Background of checkbox, radio button, plot, slider, text input + ImGuiCol_FrameBgHovered, + ImGuiCol_FrameBgActive, + ImGuiCol_TitleBg, + ImGuiCol_TitleBgActive, + ImGuiCol_TitleBgCollapsed, + ImGuiCol_MenuBarBg, + ImGuiCol_ScrollbarBg, + ImGuiCol_ScrollbarGrab, + ImGuiCol_ScrollbarGrabHovered, + ImGuiCol_ScrollbarGrabActive, + ImGuiCol_CheckMark, + ImGuiCol_SliderGrab, + ImGuiCol_SliderGrabActive, + ImGuiCol_Button, + ImGuiCol_ButtonHovered, + ImGuiCol_ButtonActive, + ImGuiCol_Header, // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem + ImGuiCol_HeaderHovered, + ImGuiCol_HeaderActive, + ImGuiCol_Separator, + ImGuiCol_SeparatorHovered, + ImGuiCol_SeparatorActive, + ImGuiCol_ResizeGrip, // Resize grip in lower-right and lower-left corners of windows. + ImGuiCol_ResizeGripHovered, + ImGuiCol_ResizeGripActive, + ImGuiCol_Tab, // TabItem in a TabBar + ImGuiCol_TabHovered, + ImGuiCol_TabActive, + ImGuiCol_TabUnfocused, + ImGuiCol_TabUnfocusedActive, + ImGuiCol_PlotLines, + ImGuiCol_PlotLinesHovered, + ImGuiCol_PlotHistogram, + ImGuiCol_PlotHistogramHovered, + ImGuiCol_TableHeaderBg, // Table header background + ImGuiCol_TableBorderStrong, // Table outer and header borders (prefer using Alpha=1.0 here) + ImGuiCol_TableBorderLight, // Table inner borders (prefer using Alpha=1.0 here) + ImGuiCol_TableRowBg, // Table row background (even rows) + ImGuiCol_TableRowBgAlt, // Table row background (odd rows) + ImGuiCol_TextSelectedBg, + ImGuiCol_DragDropTarget, // Rectangle highlighting a drop target + ImGuiCol_NavHighlight, // Gamepad/keyboard: current highlighted item + ImGuiCol_NavWindowingHighlight, // Highlight window when using CTRL+TAB + ImGuiCol_NavWindowingDimBg, // Darken/colorize entire screen behind the CTRL+TAB window list, when active + ImGuiCol_ModalWindowDimBg, // Darken/colorize entire screen behind a modal window, when one is active + ImGuiCol_COUNT +}; + +// Enumeration for PushStyleVar() / PopStyleVar() to temporarily modify the ImGuiStyle structure. +// - The enum only refers to fields of ImGuiStyle which makes sense to be pushed/popped inside UI code. +// During initialization or between frames, feel free to just poke into ImGuiStyle directly. +// - Tip: Use your programming IDE navigation facilities on the names in the _second column_ below to find the actual members and their description. +// In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. +// - When changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type. +enum ImGuiStyleVar_ +{ + // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions) + ImGuiStyleVar_Alpha, // float Alpha + ImGuiStyleVar_DisabledAlpha, // float DisabledAlpha + ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding + ImGuiStyleVar_WindowRounding, // float WindowRounding + ImGuiStyleVar_WindowBorderSize, // float WindowBorderSize + ImGuiStyleVar_WindowMinSize, // ImVec2 WindowMinSize + ImGuiStyleVar_WindowTitleAlign, // ImVec2 WindowTitleAlign + ImGuiStyleVar_ChildRounding, // float ChildRounding + ImGuiStyleVar_ChildBorderSize, // float ChildBorderSize + ImGuiStyleVar_PopupRounding, // float PopupRounding + ImGuiStyleVar_PopupBorderSize, // float PopupBorderSize + ImGuiStyleVar_FramePadding, // ImVec2 FramePadding + ImGuiStyleVar_FrameRounding, // float FrameRounding + ImGuiStyleVar_FrameBorderSize, // float FrameBorderSize + ImGuiStyleVar_ItemSpacing, // ImVec2 ItemSpacing + ImGuiStyleVar_ItemInnerSpacing, // ImVec2 ItemInnerSpacing + ImGuiStyleVar_IndentSpacing, // float IndentSpacing + ImGuiStyleVar_CellPadding, // ImVec2 CellPadding + ImGuiStyleVar_ScrollbarSize, // float ScrollbarSize + ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding + ImGuiStyleVar_GrabMinSize, // float GrabMinSize + ImGuiStyleVar_GrabRounding, // float GrabRounding + ImGuiStyleVar_TabRounding, // float TabRounding + ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign + ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign + ImGuiStyleVar_SeparatorTextBorderSize,// float SeparatorTextBorderSize + ImGuiStyleVar_SeparatorTextAlign, // ImVec2 SeparatorTextAlign + ImGuiStyleVar_SeparatorTextPadding,// ImVec2 SeparatorTextPadding + ImGuiStyleVar_COUNT +}; + +// Flags for InvisibleButton() [extended in imgui_internal.h] +enum ImGuiButtonFlags_ +{ + ImGuiButtonFlags_None = 0, + ImGuiButtonFlags_MouseButtonLeft = 1 << 0, // React on left mouse button (default) + ImGuiButtonFlags_MouseButtonRight = 1 << 1, // React on right mouse button + ImGuiButtonFlags_MouseButtonMiddle = 1 << 2, // React on center mouse button + + // [Internal] + ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle, + ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft, +}; + +// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton() +enum ImGuiColorEditFlags_ +{ + ImGuiColorEditFlags_None = 0, + ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer). + ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on color square. + ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview. + ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable color square preview next to the inputs. (e.g. to show only the inputs) + ImGuiColorEditFlags_NoInputs = 1 << 5, // // ColorEdit, ColorPicker: disable inputs sliders/text widgets (e.g. to show only the small preview color square). + ImGuiColorEditFlags_NoTooltip = 1 << 6, // // ColorEdit, ColorPicker, ColorButton: disable tooltip when hovering the preview. + ImGuiColorEditFlags_NoLabel = 1 << 7, // // ColorEdit, ColorPicker: disable display of inline text label (the label is still forwarded to the tooltip and picker). + ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small color square preview instead. + ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source. + ImGuiColorEditFlags_NoBorder = 1 << 10, // // ColorButton: disable border (which is enforced by default) + + // User Options (right-click on widget to change some of them). + ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker. + ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque. + ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque. + ImGuiColorEditFlags_HDR = 1 << 19, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well). + ImGuiColorEditFlags_DisplayRGB = 1 << 20, // [Display] // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex. + ImGuiColorEditFlags_DisplayHSV = 1 << 21, // [Display] // " + ImGuiColorEditFlags_DisplayHex = 1 << 22, // [Display] // " + ImGuiColorEditFlags_Uint8 = 1 << 23, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255. + ImGuiColorEditFlags_Float = 1 << 24, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers. + ImGuiColorEditFlags_PickerHueBar = 1 << 25, // [Picker] // ColorPicker: bar for Hue, rectangle for Sat/Value. + ImGuiColorEditFlags_PickerHueWheel = 1 << 26, // [Picker] // ColorPicker: wheel for Hue, triangle for Sat/Value. + ImGuiColorEditFlags_InputRGB = 1 << 27, // [Input] // ColorEdit, ColorPicker: input and output data in RGB format. + ImGuiColorEditFlags_InputHSV = 1 << 28, // [Input] // ColorEdit, ColorPicker: input and output data in HSV format. + + // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to + // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup. + ImGuiColorEditFlags_DefaultOptions_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_PickerHueBar, + + // [Internal] Masks + ImGuiColorEditFlags_DisplayMask_ = ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_DisplayHex, + ImGuiColorEditFlags_DataTypeMask_ = ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_Float, + ImGuiColorEditFlags_PickerMask_ = ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_PickerHueBar, + ImGuiColorEditFlags_InputMask_ = ImGuiColorEditFlags_InputRGB | ImGuiColorEditFlags_InputHSV, + + // Obsolete names (will be removed) + // ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69] +}; + +// Flags for DragFloat(), DragInt(), SliderFloat(), SliderInt() etc. +// We use the same sets of flags for DragXXX() and SliderXXX() functions as the features are the same and it makes it easier to swap them. +// (Those are per-item flags. There are shared flags in ImGuiIO: io.ConfigDragClickToInputText) +enum ImGuiSliderFlags_ +{ + ImGuiSliderFlags_None = 0, + ImGuiSliderFlags_AlwaysClamp = 1 << 4, // Clamp value to min/max bounds when input manually with CTRL+Click. By default CTRL+Click allows going out of bounds. + ImGuiSliderFlags_Logarithmic = 1 << 5, // Make the widget logarithmic (linear otherwise). Consider using ImGuiSliderFlags_NoRoundToFormat with this if using a format-string with small amount of digits. + ImGuiSliderFlags_NoRoundToFormat = 1 << 6, // Disable rounding underlying value to match precision of the display format string (e.g. %.3f values are rounded to those 3 digits) + ImGuiSliderFlags_NoInput = 1 << 7, // Disable CTRL+Click or Enter key allowing to input text directly into the widget + ImGuiSliderFlags_InvalidMask_ = 0x7000000F, // [Internal] We treat using those bits as being potentially a 'float power' argument from the previous API that has got miscast to this enum, and will trigger an assert if needed. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiSliderFlags_ClampOnInput = ImGuiSliderFlags_AlwaysClamp, // [renamed in 1.79] +#endif +}; + +// Identify a mouse button. +// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience. +enum ImGuiMouseButton_ +{ + ImGuiMouseButton_Left = 0, + ImGuiMouseButton_Right = 1, + ImGuiMouseButton_Middle = 2, + ImGuiMouseButton_COUNT = 5 +}; + +// Enumeration for GetMouseCursor() +// User code may request backend to display given cursor by calling SetMouseCursor(), which is why we have some cursors that are marked unused here +enum ImGuiMouseCursor_ +{ + ImGuiMouseCursor_None = -1, + ImGuiMouseCursor_Arrow = 0, + ImGuiMouseCursor_TextInput, // When hovering over InputText, etc. + ImGuiMouseCursor_ResizeAll, // (Unused by Dear ImGui functions) + ImGuiMouseCursor_ResizeNS, // When hovering over a horizontal border + ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column + ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window + ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window + ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks) + ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle. + ImGuiMouseCursor_COUNT +}; + +// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions +// Represent a condition. +// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always. +enum ImGuiCond_ +{ + ImGuiCond_None = 0, // No condition (always set the variable), same as _Always + ImGuiCond_Always = 1 << 0, // No condition (always set the variable), same as _None + ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call will succeed) + ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the object/window has no persistently saved data (no entry in .ini file) + ImGuiCond_Appearing = 1 << 3, // Set the variable if the object/window is appearing after being hidden/inactive (or the first time) +}; + +//----------------------------------------------------------------------------- +// [SECTION] Helpers: Memory allocations macros, ImVector<> +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() +// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax. +// Defining a custom placement new() with a custom parameter allows us to bypass including which on some platforms complains when user has disabled exceptions. +//----------------------------------------------------------------------------- + +struct ImNewWrapper {}; +inline void* operator new(size_t, ImNewWrapper, void* ptr) { return ptr; } +inline void operator delete(void*, ImNewWrapper, void*) {} // This is only required so we can use the symmetrical new() +#define IM_ALLOC(_SIZE) ImGui::MemAlloc(_SIZE) +#define IM_FREE(_PTR) ImGui::MemFree(_PTR) +#define IM_PLACEMENT_NEW(_PTR) new(ImNewWrapper(), _PTR) +#define IM_NEW(_TYPE) new(ImNewWrapper(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE +template void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } } + +//----------------------------------------------------------------------------- +// ImVector<> +// Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug). +//----------------------------------------------------------------------------- +// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it. +// - We use std-like naming convention here, which is a little unusual for this codebase. +// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs. +// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that, +// Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset. +//----------------------------------------------------------------------------- + +IM_MSVC_RUNTIME_CHECKS_OFF +template +struct ImVector +{ + int Size; + int Capacity; + T* Data; + + // Provide standard typedefs but we don't use them ourselves. + typedef T value_type; + typedef value_type* iterator; + typedef const value_type* const_iterator; + + // Constructors, destructor + inline ImVector() { Size = Capacity = 0; Data = NULL; } + inline ImVector(const ImVector& src) { Size = Capacity = 0; Data = NULL; operator=(src); } + inline ImVector& operator=(const ImVector& src) { clear(); resize(src.Size); if (src.Data) memcpy(Data, src.Data, (size_t)Size * sizeof(T)); return *this; } + inline ~ImVector() { if (Data) IM_FREE(Data); } // Important: does not destruct anything + + inline void clear() { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } } // Important: does not destruct anything + inline void clear_delete() { for (int n = 0; n < Size; n++) IM_DELETE(Data[n]); clear(); } // Important: never called automatically! always explicit. + inline void clear_destruct() { for (int n = 0; n < Size; n++) Data[n].~T(); clear(); } // Important: never called automatically! always explicit. + + inline bool empty() const { return Size == 0; } + inline int size() const { return Size; } + inline int size_in_bytes() const { return Size * (int)sizeof(T); } + inline int max_size() const { return 0x7FFFFFFF / (int)sizeof(T); } + inline int capacity() const { return Capacity; } + inline T& operator[](int i) { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } + inline const T& operator[](int i) const { IM_ASSERT(i >= 0 && i < Size); return Data[i]; } + + inline T* begin() { return Data; } + inline const T* begin() const { return Data; } + inline T* end() { return Data + Size; } + inline const T* end() const { return Data + Size; } + inline T& front() { IM_ASSERT(Size > 0); return Data[0]; } + inline const T& front() const { IM_ASSERT(Size > 0); return Data[0]; } + inline T& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; } + inline const T& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; } + inline void swap(ImVector& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; } + + inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity / 2) : 8; return new_capacity > sz ? new_capacity : sz; } + inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; } + inline void resize(int new_size, const T& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; } + inline void shrink(int new_size) { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation + inline void reserve(int new_capacity) { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; } + inline void reserve_discard(int new_capacity) { if (new_capacity <= Capacity) return; if (Data) IM_FREE(Data); Data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); Capacity = new_capacity; } + + // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden. + inline void push_back(const T& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; } + inline void pop_back() { IM_ASSERT(Size > 0); Size--; } + inline void push_front(const T& v) { if (Size == 0) push_back(v); else insert(Data, v); } + inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; } + inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data + Size && it_last >= it && it_last <= Data + Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - (size_t)count) * sizeof(T)); Size -= (int)count; return Data + off; } + inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; if (it < Data + Size - 1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; } + inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data + Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; } + inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; } + inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; } + inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; } + inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; } + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; } +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiStyle +//----------------------------------------------------------------------------- +// You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame(). +// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, +// and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors. +//----------------------------------------------------------------------------- + +struct ImGuiStyle +{ + float Alpha; // Global alpha applies to everything in Dear ImGui. + float DisabledAlpha; // Additional alpha multiplier applied by BeginDisabled(). Multiply over current value of Alpha. + ImVec2 WindowPadding; // Padding within a window. + float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows. Large values tend to lead to variety of artifacts and are not recommended. + float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constrain individual windows, use SetNextWindowSizeConstraints(). + ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered. + ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left. + float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows. + float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + float PopupRounding; // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding) + float PopupBorderSize; // Thickness of border around popup/tooltip windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 FramePadding; // Padding within a framed rectangle (used by most widgets). + float FrameRounding; // Radius of frame corners rounding. Set to 0.0f to have rectangular frame (used by most widgets). + float FrameBorderSize; // Thickness of border around frames. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly). + ImVec2 ItemSpacing; // Horizontal and vertical spacing between widgets/lines. + ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label). + ImVec2 CellPadding; // Padding within a table cell + ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much! + float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2). + float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1). + float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar. + float ScrollbarRounding; // Radius of grab corners for scrollbar. + float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar. + float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs. + float LogSliderDeadzone; // The size in pixels of the dead-zone around zero on logarithmic sliders that cross zero. + float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs. + float TabBorderSize; // Thickness of border around tabs. + float TabMinWidthForCloseButton; // Minimum width for close button to appear on an unselected tab when hovered. Set to 0.0f to always show when hovering, set to FLT_MAX to never show close button unless selected. + ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right. + ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered). + ImVec2 SelectableTextAlign; // Alignment of selectable text. Defaults to (0.0f, 0.0f) (top-left aligned). It's generally important to keep this left-aligned if you want to lay multiple items on a same line. + float SeparatorTextBorderSize; // Thickkness of border in SeparatorText() + ImVec2 SeparatorTextAlign; // Alignment of text within the separator. Defaults to (0.0f, 0.5f) (left aligned, center). + ImVec2 SeparatorTextPadding; // Horizontal offset of text from each edge of the separator + spacing on other axis. Generally small values. .y is recommended to be == FramePadding.y. + ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows. + ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly! + float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later. + bool AntiAliasedLines; // Enable anti-aliased lines/borders. Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedLinesUseTex; // Enable anti-aliased lines/borders using textures where possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). Latched at the beginning of the frame (copied to ImDrawList). + bool AntiAliasedFill; // Enable anti-aliased edges around filled shapes (rounded rectangles, circles, etc.). Disable if you are really tight on CPU/GPU. Latched at the beginning of the frame (copied to ImDrawList). + float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality. + float CircleTessellationMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry. + ImVec4 Colors[ImGuiCol_COUNT]; + + IMGUI_API ImGuiStyle(); + IMGUI_API void ScaleAllSizes(float scale_factor); +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiIO +//----------------------------------------------------------------------------- +// Communicate most settings and inputs/outputs to Dear ImGui using this structure. +// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage. +//----------------------------------------------------------------------------- + +// [Internal] Storage used by IsKeyDown(), IsKeyPressed() etc functions. +// If prior to 1.87 you used io.KeysDownDuration[] (which was marked as internal), you should use GetKeyData(key)->DownDuration and *NOT* io.KeysData[key]->DownDuration. +struct ImGuiKeyData +{ + bool Down; // True for if key is down + float DownDuration; // Duration the key has been down (<0.0f: not pressed, 0.0f: just pressed, >0.0f: time held) + float DownDurationPrev; // Last frame duration the key has been down + float AnalogValue; // 0.0f..1.0f for gamepad values +}; + +struct ImGuiIO +{ + //------------------------------------------------------------------ + // Configuration // Default value + //------------------------------------------------------------------ + + ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc. + ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by backend (imgui_impl_xxx files or custom backend) to communicate features supported by the backend. + ImVec2 DisplaySize; // // Main display size, in pixels (generally == GetMainViewport()->Size). May change every frame. + float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds. May change every frame. + float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds. + const char* IniFilename; // = "imgui.ini" // Path to .ini file (important: default "imgui.ini" is relative to current working dir!). Set NULL to disable automatic .ini loading/saving or if you want to manually call LoadIniSettingsXXX() / SaveIniSettingsXXX() functions. + const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified). + float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds. + float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels. + float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging. + float KeyRepeatDelay; // = 0.275f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.). + float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds. + float HoverDelayNormal; // = 0.30 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayNormal) returns true. + float HoverDelayShort; // = 0.10 sec // Delay on hovering before IsItemHovered(ImGuiHoveredFlags_DelayShort) returns true. + void* UserData; // = NULL // Store your own data. + + ImFontAtlas*Fonts; // // Font atlas: load, rasterize and pack one or more fonts into a single texture. + float FontGlobalScale; // = 1.0f // Global scale all fonts + bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel. + ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0]. + ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale. + + // Miscellaneous options + bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by backend implementations. + bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl. + bool ConfigInputTrickleEventQueue; // = true // Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates. + bool ConfigInputTextCursorBlink; // = true // Enable blinking cursor (optional as some users consider it to be distracting). + bool ConfigInputTextEnterKeepActive; // = false // [BETA] Pressing Enter will keep item active and select contents (single-line only). + bool ConfigDragClickToInputText; // = false // [BETA] Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving). Not desirable on devices without a keyboard. + bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag) + bool ConfigWindowsMoveFromTitleBarOnly; // = false // Enable allowing to move windows only when clicking on their title bar. Does not apply to windows without a title bar. + float ConfigMemoryCompactTimer; // = 60.0f // Timer (in seconds) to free transient windows/tables memory buffers when unused. Set to -1.0f to disable. + + //------------------------------------------------------------------ + // Platform Functions + // (the imgui_impl_xxxx backend files are setting those up for you) + //------------------------------------------------------------------ + + // Optional: Platform/Renderer backend name (informational only! will be displayed in About Window) + User data for backend/wrappers to store their own stuff. + const char* BackendPlatformName; // = NULL + const char* BackendRendererName; // = NULL + void* BackendPlatformUserData; // = NULL // User data for platform backend + void* BackendRendererUserData; // = NULL // User data for renderer backend + void* BackendLanguageUserData; // = NULL // User data for non C++ programming language backend + + // Optional: Access OS clipboard + // (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures) + const char* (*GetClipboardTextFn)(void* user_data); + void (*SetClipboardTextFn)(void* user_data, const char* text); + void* ClipboardUserData; + + // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows) + // (default to use native imm32 api on Windows) + void (*SetPlatformImeDataFn)(ImGuiViewport* viewport, ImGuiPlatformImeData* data); +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + void* ImeWindowHandle; // = NULL // [Obsolete] Set ImGuiViewport::PlatformHandleRaw instead. Set this to your HWND to get automatic IME cursor positioning. +#else + void* _UnusedPadding; // Unused field to keep data structure the same size. +#endif + + //------------------------------------------------------------------ + // Input - Call before calling NewFrame() + //------------------------------------------------------------------ + + // Input Functions + IMGUI_API void AddKeyEvent(ImGuiKey key, bool down); // Queue a new key down/up event. Key should be "translated" (as in, generally ImGuiKey_A matches the key end-user would use to emit an 'A' character) + IMGUI_API void AddKeyAnalogEvent(ImGuiKey key, bool down, float v); // Queue a new key down/up event for analog values (e.g. ImGuiKey_Gamepad_ values). Dead-zones should be handled by the backend. + IMGUI_API void AddMousePosEvent(float x, float y); // Queue a mouse position update. Use -FLT_MAX,-FLT_MAX to signify no mouse (e.g. app not focused and not hovered) + IMGUI_API void AddMouseButtonEvent(int button, bool down); // Queue a mouse button change + IMGUI_API void AddMouseWheelEvent(float wheel_x, float wheel_y); // Queue a mouse wheel update. wheel_y<0: scroll down, wheel_y>0: scroll up, wheel_x<0: scroll right, wheel_x>0: scroll left. + IMGUI_API void AddFocusEvent(bool focused); // Queue a gain/loss of focus for the application (generally based on OS/platform focus of your window) + IMGUI_API void AddInputCharacter(unsigned int c); // Queue a new character input + IMGUI_API void AddInputCharacterUTF16(ImWchar16 c); // Queue a new character input from a UTF-16 character, it can be a surrogate + IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue a new characters input from a UTF-8 string + + IMGUI_API void SetKeyEventNativeData(ImGuiKey key, int native_keycode, int native_scancode, int native_legacy_index = -1); // [Optional] Specify index for legacy <1.87 IsKeyXXX() functions with native indices + specify native keycode, scancode. + IMGUI_API void SetAppAcceptingEvents(bool accepting_events); // Set master flag for accepting key/mouse/text events (default to true). Useful if you have native dialog boxes that are interrupting your application loop/refresh, and you want to disable events being queued while your app is frozen. + IMGUI_API void ClearInputCharacters(); // [Internal] Clear the text input buffer manually + IMGUI_API void ClearInputKeys(); // [Internal] Release all keys + + //------------------------------------------------------------------ + // Output - Updated by NewFrame() or EndFrame()/Render() + // (when reading from the io.WantCaptureMouse, io.WantCaptureKeyboard flags to dispatch your inputs, it is + // generally easier and more correct to use their state BEFORE calling NewFrame(). See FAQ for details!) + //------------------------------------------------------------------ + + bool WantCaptureMouse; // Set when Dear ImGui will use mouse inputs, in this case do not dispatch them to your main game/application (either way, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.). + bool WantCaptureKeyboard; // Set when Dear ImGui will use keyboard inputs, in this case do not dispatch them to your main game/application (either way, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.). + bool WantTextInput; // Mobile/console: when set, you may display an on-screen keyboard. This is set by Dear ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active). + bool WantSetMousePos; // MousePos has been altered, backend should reposition mouse on next frame. Rarely used! Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled. + bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. Important: clear io.WantSaveIniSettings yourself after saving! + bool NavActive; // Keyboard/Gamepad navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag. + bool NavVisible; // Keyboard/Gamepad navigation is visible and allowed (will handle ImGuiKey_NavXXX events). + float Framerate; // Estimate of application framerate (rolling average over 60 frames, based on io.DeltaTime), in frame per second. Solely for convenience. Slow applications may not want to use a moving average or may want to reset underlying buffers occasionally. + int MetricsRenderVertices; // Vertices output during last call to Render() + int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3 + int MetricsRenderWindows; // Number of visible windows + int MetricsActiveWindows; // Number of active windows + int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts. + ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta. + + // Legacy: before 1.87, we required backend to fill io.KeyMap[] (imgui->native map) during initialization and io.KeysDown[] (native indices) every frame. + // This is still temporarily supported as a legacy feature. However the new preferred scheme is for backend to call io.AddKeyEvent(). + // Old (<1.87): ImGui::IsKeyPressed(ImGui::GetIO().KeyMap[ImGuiKey_Space]) --> New (1.87+) ImGui::IsKeyPressed(ImGuiKey_Space) +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + int KeyMap[ImGuiKey_COUNT]; // [LEGACY] Input: map of indices into the KeysDown[512] entries array which represent your "native" keyboard state. The first 512 are now unused and should be kept zero. Legacy backend will write into KeyMap[] using ImGuiKey_ indices which are always >512. + bool KeysDown[ImGuiKey_COUNT]; // [LEGACY] Input: Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys). This used to be [512] sized. It is now ImGuiKey_COUNT to allow legacy io.KeysDown[GetKeyIndex(...)] to work without an overflow. + float NavInputs[ImGuiNavInput_COUNT]; // [LEGACY] Since 1.88, NavInputs[] was removed. Backends from 1.60 to 1.86 won't build. Feed gamepad inputs via io.AddKeyEvent() and ImGuiKey_GamepadXXX enums. +#endif + + //------------------------------------------------------------------ + // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed! + //------------------------------------------------------------------ + + ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent). + + // Main Input State + // (this block used to be written by backend, since 1.87 it is best to NOT write to those directly, call the AddXXX functions above instead) + // (reading from those variables is fair game, as they are extremely unlikely to be moving anywhere) + ImVec2 MousePos; // Mouse position, in pixels. Set to ImVec2(-FLT_MAX, -FLT_MAX) if mouse is unavailable (on another screen, etc.) + bool MouseDown[5]; // Mouse buttons: 0=left, 1=right, 2=middle + extras (ImGuiMouseButton_COUNT == 5). Dear ImGui mostly uses left and right buttons. Other buttons allow us to track if the mouse is being used by your application + available to user as a convenience via IsMouse** API. + float MouseWheel; // Mouse wheel Vertical: 1 unit scrolls about 5 lines text. >0 scrolls Up, <0 scrolls Down. Hold SHIFT to turn vertical scroll into horizontal scroll. + float MouseWheelH; // Mouse wheel Horizontal. >0 scrolls Left, <0 scrolls Right. Most users don't have a mouse with a horizontal wheel, may not be filled by all backends. + bool KeyCtrl; // Keyboard modifier down: Control + bool KeyShift; // Keyboard modifier down: Shift + bool KeyAlt; // Keyboard modifier down: Alt + bool KeySuper; // Keyboard modifier down: Cmd/Super/Windows + + // Other state maintained from data above + IO function calls + ImGuiKeyChord KeyMods; // Key mods flags (any of ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Alt/ImGuiMod_Super flags, same as io.KeyCtrl/KeyShift/KeyAlt/KeySuper but merged into flags. DOES NOT CONTAINS ImGuiMod_Shortcut which is pretranslated). Read-only, updated by NewFrame() + ImGuiKeyData KeysData[ImGuiKey_KeysData_SIZE]; // Key state for all known keys. Use IsKeyXXX() functions to access this. + bool WantCaptureMouseUnlessPopupClose; // Alternative to WantCaptureMouse: (WantCaptureMouse == true && WantCaptureMouseUnlessPopupClose == false) when a click over void is expected to close a popup. + ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid) + ImVec2 MouseClickedPos[5]; // Position at time of clicking + double MouseClickedTime[5]; // Time of last click (used to figure out double-click) + bool MouseClicked[5]; // Mouse button went from !Down to Down (same as MouseClickedCount[x] != 0) + bool MouseDoubleClicked[5]; // Has mouse button been double-clicked? (same as MouseClickedCount[x] == 2) + ImU16 MouseClickedCount[5]; // == 0 (not clicked), == 1 (same as MouseClicked[]), == 2 (double-clicked), == 3 (triple-clicked) etc. when going from !Down to Down + ImU16 MouseClickedLastCount[5]; // Count successive number of clicks. Stays valid after mouse release. Reset after another click is done. + bool MouseReleased[5]; // Mouse button went from Down to !Down + bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window or over void blocked by a popup. We don't request mouse capture from the application if click started outside ImGui bounds. + bool MouseDownOwnedUnlessPopupClose[5]; // Track if button was clicked inside a dear imgui window. + float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked) + float MouseDownDurationPrev[5]; // Previous time the mouse button has been down + float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point (used for moving thresholds) + float PenPressure; // Touch/Pen pressure (0.0f to 1.0f, should be >0.0f only when MouseDown[0] == true). Helper storage currently unused by Dear ImGui. + bool AppFocusLost; // Only modify via AddFocusEvent() + bool AppAcceptingEvents; // Only modify via SetAppAcceptingEvents() + ImS8 BackendUsingLegacyKeyArrays; // -1: unknown, 0: using AddKeyEvent(), 1: using legacy io.KeysDown[] + bool BackendUsingLegacyNavInputArray; // 0: using AddKeyAnalogEvent(), 1: writing to legacy io.NavInputs[] directly + ImWchar16 InputQueueSurrogate; // For AddInputCharacterUTF16() + ImVector InputQueueCharacters; // Queue of _characters_ input (obtained by platform backend). Fill using AddInputCharacter() helper. + + IMGUI_API ImGuiIO(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Misc data structures +//----------------------------------------------------------------------------- + +// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used. +// The callback function should return 0 by default. +// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details) +// - ImGuiInputTextFlags_CallbackEdit: Callback on buffer edit (note that InputText() already returns true on edit, the callback is useful mainly to manipulate the underlying buffer while focus is active) +// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration +// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB +// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows +// - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard. +// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. +struct ImGuiInputTextCallbackData +{ + ImGuiContext* Ctx; // Parent UI context + ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only + ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only + void* UserData; // What user passed to InputText() // Read-only + + // Arguments for the different callback events + // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary. + // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state. + ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0; + ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only // [Completion,History] + char* Buf; // Text buffer // Read-write // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer! + int BufTextLen; // Text length (in bytes) // Read-write // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length() + int BufSize; // Buffer size (in bytes) = capacity+1 // Read-only // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1 + bool BufDirty; // Set if you modify Buf/BufTextLen! // Write // [Completion,History,Always] + int CursorPos; // // Read-write // [Completion,History,Always] + int SelectionStart; // // Read-write // [Completion,History,Always] == to SelectionEnd when no selection) + int SelectionEnd; // // Read-write // [Completion,History,Always] + + // Helper functions for text manipulation. + // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection. + IMGUI_API ImGuiInputTextCallbackData(); + IMGUI_API void DeleteChars(int pos, int bytes_count); + IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL); + void SelectAll() { SelectionStart = 0; SelectionEnd = BufTextLen; } + void ClearSelection() { SelectionStart = SelectionEnd = BufTextLen; } + bool HasSelection() const { return SelectionStart != SelectionEnd; } +}; + +// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin(). +// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough. +struct ImGuiSizeCallbackData +{ + void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints(). Generally store an integer or float in here (need reinterpret_cast<>). + ImVec2 Pos; // Read-only. Window position, for reference. + ImVec2 CurrentSize; // Read-only. Current window size. + ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing. +}; + +// Data payload for Drag and Drop operations: AcceptDragDropPayload(), GetDragDropPayload() +struct ImGuiPayload +{ + // Members + void* Data; // Data (copied and owned by dear imgui) + int DataSize; // Data size + + // [Internal] + ImGuiID SourceId; // Source item id + ImGuiID SourceParentId; // Source parent id (if available) + int DataFrameCount; // Data timestamp + char DataType[32 + 1]; // Data type tag (short user-supplied string, 32 characters max) + bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets) + bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item. + + ImGuiPayload() { Clear(); } + void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; } + bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; } + bool IsPreview() const { return Preview; } + bool IsDelivery() const { return Delivery; } +}; + +// Sorting specification for one column of a table (sizeof == 12 bytes) +struct ImGuiTableColumnSortSpecs +{ + ImGuiID ColumnUserID; // User id of the column (if specified by a TableSetupColumn() call) + ImS16 ColumnIndex; // Index of the column + ImS16 SortOrder; // Index within parent ImGuiTableSortSpecs (always stored in order starting from 0, tables sorted on a single criteria will always have a 0 here) + ImGuiSortDirection SortDirection : 8; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending (you can use this or SortSign, whichever is more convenient for your sort function) + + ImGuiTableColumnSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +// Sorting specifications for a table (often handling sort specs for a single column, occasionally more) +// Obtained by calling TableGetSortSpecs(). +// When 'SpecsDirty == true' you can sort your data. It will be true with sorting specs have changed since last call, or the first time. +// Make sure to set 'SpecsDirty = false' after sorting, else you may wastefully sort your data every frame! +struct ImGuiTableSortSpecs +{ + const ImGuiTableColumnSortSpecs* Specs; // Pointer to sort spec array. + int SpecsCount; // Sort spec count. Most often 1. May be > 1 when ImGuiTableFlags_SortMulti is enabled. May be == 0 when ImGuiTableFlags_SortTristate is enabled. + bool SpecsDirty; // Set to true when specs have changed since last time! Use this to sort again, then clear the flag. + + ImGuiTableSortSpecs() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, Math Operators, ImColor) +//----------------------------------------------------------------------------- + +// Helper: Unicode defines +#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD // Invalid Unicode code point (standard value). +#ifdef IMGUI_USE_WCHAR32 +#define IM_UNICODE_CODEPOINT_MAX 0x10FFFF // Maximum Unicode code point supported by this build. +#else +#define IM_UNICODE_CODEPOINT_MAX 0xFFFF // Maximum Unicode code point supported by this build. +#endif + +// Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create a UI within deep-nested code that runs multiple times every frame. +// Usage: static ImGuiOnceUponAFrame oaf; if (oaf) ImGui::Text("This will be called only once per frame"); +struct ImGuiOnceUponAFrame +{ + ImGuiOnceUponAFrame() { RefFrame = -1; } + mutable int RefFrame; + operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; } +}; + +// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]" +struct ImGuiTextFilter +{ + IMGUI_API ImGuiTextFilter(const char* default_filter = ""); + IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build + IMGUI_API bool PassFilter(const char* text, const char* text_end = NULL) const; + IMGUI_API void Build(); + void Clear() { InputBuf[0] = 0; Build(); } + bool IsActive() const { return !Filters.empty(); } + + // [Internal] + struct ImGuiTextRange + { + const char* b; + const char* e; + + ImGuiTextRange() { b = e = NULL; } + ImGuiTextRange(const char* _b, const char* _e) { b = _b; e = _e; } + bool empty() const { return b == e; } + IMGUI_API void split(char separator, ImVector* out) const; + }; + char InputBuf[256]; + ImVectorFilters; + int CountGrep; +}; + +// Helper: Growable text buffer for logging/accumulating text +// (this could be called 'ImGuiTextBuilder' / 'ImGuiStringBuilder') +struct ImGuiTextBuffer +{ + ImVector Buf; + IMGUI_API static char EmptyString[1]; + + ImGuiTextBuffer() { } + inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; } + const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; } + const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator + int size() const { return Buf.Size ? Buf.Size - 1 : 0; } + bool empty() const { return Buf.Size <= 1; } + void clear() { Buf.clear(); } + void reserve(int capacity) { Buf.reserve(capacity); } + const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; } + IMGUI_API void append(const char* str, const char* str_end = NULL); + IMGUI_API void appendf(const char* fmt, ...) IM_FMTARGS(2); + IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2); +}; + +// Helper: Key->Value storage +// Typically you don't have to worry about this since a storage is held within each Window. +// We use it to e.g. store collapse state for a tree (Int 0/1) +// This is optimized for efficient lookup (dichotomy into a contiguous buffer) and rare insertion (typically tied to user interactions aka max once a frame) +// You can use it as custom user storage for temporary values. Declare your own storage if, for example: +// - You want to manipulate the open/close state of a particular sub-tree in your interface (tree node uses Int 0/1 to store their state). +// - You want to store custom debug data easily without adding or editing structures in your code (probably not efficient, but convenient) +// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types. +struct ImGuiStorage +{ + // [Internal] + struct ImGuiStoragePair + { + ImGuiID key; + union { int val_i; float val_f; void* val_p; }; + ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; } + ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; } + ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; } + }; + + ImVector Data; + + // - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N) + // - Set***() functions find pair, insertion on demand if missing. + // - Sorted insertion is costly, paid once. A typical frame shouldn't need to insert any new pair. + void Clear() { Data.clear(); } + IMGUI_API int GetInt(ImGuiID key, int default_val = 0) const; + IMGUI_API void SetInt(ImGuiID key, int val); + IMGUI_API bool GetBool(ImGuiID key, bool default_val = false) const; + IMGUI_API void SetBool(ImGuiID key, bool val); + IMGUI_API float GetFloat(ImGuiID key, float default_val = 0.0f) const; + IMGUI_API void SetFloat(ImGuiID key, float val); + IMGUI_API void* GetVoidPtr(ImGuiID key) const; // default_val is NULL + IMGUI_API void SetVoidPtr(ImGuiID key, void* val); + + // - Get***Ref() functions finds pair, insert on demand if missing, return pointer. Useful if you intend to do Get+Set. + // - References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer. + // - A typical use case where this is convenient for quick hacking (e.g. add storage during a live Edit&Continue session if you can't modify existing struct) + // float* pvar = ImGui::GetFloatRef(key); ImGui::SliderFloat("var", pvar, 0, 100.0f); some_var += *pvar; + IMGUI_API int* GetIntRef(ImGuiID key, int default_val = 0); + IMGUI_API bool* GetBoolRef(ImGuiID key, bool default_val = false); + IMGUI_API float* GetFloatRef(ImGuiID key, float default_val = 0.0f); + IMGUI_API void** GetVoidPtrRef(ImGuiID key, void* default_val = NULL); + + // Use on your own storage if you know only integer are being stored (open/close all tree nodes) + IMGUI_API void SetAllInt(int val); + + // For quicker full rebuild of a storage (instead of an incremental one), you may add all your contents and then sort once. + IMGUI_API void BuildSortByKey(); +}; + +// Helper: Manually clip large list of items. +// If you have lots evenly spaced items and you have random access to the list, you can perform coarse +// clipping based on visibility to only submit items that are in view. +// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped. +// (Dear ImGui already clip items based on their bounds but: it needs to first layout the item to do so, and generally +// fetching/submitting your own data incurs additional cost. Coarse clipping using ImGuiListClipper allows you to easily +// scale using lists with tens of thousands of items without a problem) +// Usage: +// ImGuiListClipper clipper; +// clipper.Begin(1000); // We have 1000 elements, evenly spaced. +// while (clipper.Step()) +// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) +// ImGui::Text("line number %d", i); +// Generally what happens is: +// - Clipper lets you process the first element (DisplayStart = 0, DisplayEnd = 1) regardless of it being visible or not. +// - User code submit that one element. +// - Clipper can measure the height of the first element +// - Clipper calculate the actual range of elements to display based on the current clipping rectangle, position the cursor before the first visible element. +// - User code submit visible elements. +// - The clipper also handles various subtleties related to keyboard/gamepad navigation, wrapping etc. +struct ImGuiListClipper +{ + ImGuiContext* Ctx; // Parent UI context + int DisplayStart; // First item to display, updated by each call to Step() + int DisplayEnd; // End of items to display (exclusive) + int ItemsCount; // [Internal] Number of items + float ItemsHeight; // [Internal] Height of item after a first step and item submission can calculate it + float StartPosY; // [Internal] Cursor position at the time of Begin() or after table frozen rows are all processed + void* TempData; // [Internal] Internal data + + // items_count: Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step) + // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing(). + IMGUI_API ImGuiListClipper(); + IMGUI_API ~ImGuiListClipper(); + IMGUI_API void Begin(int items_count, float items_height = -1.0f); + IMGUI_API void End(); // Automatically called on the last call of Step() that returns false. + IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items. + + // Call ForceDisplayRangeByIndices() before first call to Step() if you need a range of items to be displayed regardless of visibility. + IMGUI_API void ForceDisplayRangeByIndices(int item_min, int item_max); // item_max is exclusive e.g. use (42, 42+1) to make item 42 always visible BUT due to alignment/padding of certain items it is likely that an extra item may be included on either end of the display range. + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline ImGuiListClipper(int items_count, float items_height = -1.0f) { memset(this, 0, sizeof(*this)); ItemsCount = -1; Begin(items_count, items_height); } // [removed in 1.79] +#endif +}; + +// Helpers: ImVec2/ImVec4 operators +// - It is important that we are keeping those disabled by default so they don't leak in user space. +// - This is in order to allow user enabling implicit cast operators between ImVec2/ImVec4 and their own types (using IM_VEC2_CLASS_EXTRA in imconfig.h) +// - You can use '#define IMGUI_DEFINE_MATH_OPERATORS' to import our operators, provided as a courtesy. +// - We unfortunately don't have a unary- operator for ImVec2 because this would needs to be defined inside the class itself. +#ifdef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED +IM_MSVC_RUNTIME_CHECKS_OFF +static inline ImVec2 operator*(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x * rhs, lhs.y * rhs); } +static inline ImVec2 operator/(const ImVec2& lhs, const float rhs) { return ImVec2(lhs.x / rhs, lhs.y / rhs); } +static inline ImVec2 operator+(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x + rhs.x, lhs.y + rhs.y); } +static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x - rhs.x, lhs.y - rhs.y); } +static inline ImVec2 operator*(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } +static inline ImVec2 operator/(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x / rhs.x, lhs.y / rhs.y); } +static inline ImVec2& operator*=(ImVec2& lhs, const float rhs) { lhs.x *= rhs; lhs.y *= rhs; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const float rhs) { lhs.x /= rhs; lhs.y /= rhs; return lhs; } +static inline ImVec2& operator+=(ImVec2& lhs, const ImVec2& rhs) { lhs.x += rhs.x; lhs.y += rhs.y; return lhs; } +static inline ImVec2& operator-=(ImVec2& lhs, const ImVec2& rhs) { lhs.x -= rhs.x; lhs.y -= rhs.y; return lhs; } +static inline ImVec2& operator*=(ImVec2& lhs, const ImVec2& rhs) { lhs.x *= rhs.x; lhs.y *= rhs.y; return lhs; } +static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.x; lhs.y /= rhs.y; return lhs; } +static inline ImVec4 operator+(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z, lhs.w + rhs.w); } +static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z, lhs.w - rhs.w); } +static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z, lhs.w * rhs.w); } +IM_MSVC_RUNTIME_CHECKS_RESTORE +#endif + +// Helpers macros to generate 32-bit encoded colors +// User can declare their own format by #defining the 5 _SHIFT/_MASK macros in their imconfig file. +#ifndef IM_COL32_R_SHIFT +#ifdef IMGUI_USE_BGRA_PACKED_COLOR +#define IM_COL32_R_SHIFT 16 +#define IM_COL32_G_SHIFT 8 +#define IM_COL32_B_SHIFT 0 +#define IM_COL32_A_SHIFT 24 +#define IM_COL32_A_MASK 0xFF000000 +#else +#define IM_COL32_R_SHIFT 0 +#define IM_COL32_G_SHIFT 8 +#define IM_COL32_B_SHIFT 16 +#define IM_COL32_A_SHIFT 24 +#define IM_COL32_A_MASK 0xFF000000 +#endif +#endif +#define IM_COL32(R,G,B,A) (((ImU32)(A)<> IM_COL32_R_SHIFT) & 0xFF) * sc; Value.y = (float)((rgba >> IM_COL32_G_SHIFT) & 0xFF) * sc; Value.z = (float)((rgba >> IM_COL32_B_SHIFT) & 0xFF) * sc; Value.w = (float)((rgba >> IM_COL32_A_SHIFT) & 0xFF) * sc; } + inline operator ImU32() const { return ImGui::ColorConvertFloat4ToU32(Value); } + inline operator ImVec4() const { return Value; } + + // FIXME-OBSOLETE: May need to obsolete/cleanup those helpers. + inline void SetHSV(float h, float s, float v, float a = 1.0f){ ImGui::ColorConvertHSVtoRGB(h, s, v, Value.x, Value.y, Value.z); Value.w = a; } + static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r, g, b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r, g, b, a); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Drawing API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData) +// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList. +//----------------------------------------------------------------------------- + +// The maximum line width to bake anti-aliased textures for. Build atlas with ImFontAtlasFlags_NoBakedLines to disable baking. +#ifndef IM_DRAWLIST_TEX_LINES_WIDTH_MAX +#define IM_DRAWLIST_TEX_LINES_WIDTH_MAX (63) +#endif + +// ImDrawCallback: Draw callbacks for advanced uses [configurable type: override in imconfig.h] +// NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering, +// you can poke into the draw list for that! Draw callback may be useful for example to: +// A) Change your GPU render state, +// B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc. +// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }' +// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering backend accordingly. +#ifndef ImDrawCallback +typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd); +#endif + +// Special Draw callback value to request renderer backend to reset the graphics/render state. +// The renderer backend needs to handle this special value, otherwise it will crash trying to call a function at this address. +// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored. +// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call). +#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1) + +// Typically, 1 command = 1 GPU draw call (unless command is a callback) +// - VtxOffset: When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset' is enabled, +// this fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices. +// Backends made for <1.71. will typically ignore the VtxOffset fields. +// - The ClipRect/TextureId/VtxOffset fields must be contiguous as we memcmp() them together (this is asserted for). +struct ImDrawCmd +{ + ImVec4 ClipRect; // 4*4 // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates + ImTextureID TextureId; // 4-8 // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas. + unsigned int VtxOffset; // 4 // Start offset in vertex buffer. ImGuiBackendFlags_RendererHasVtxOffset: always 0, otherwise may be >0 to support meshes larger than 64K vertices with 16-bit indices. + unsigned int IdxOffset; // 4 // Start offset in index buffer. + unsigned int ElemCount; // 4 // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[]. + ImDrawCallback UserCallback; // 4-8 // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally. + void* UserCallbackData; // 4-8 // The draw callback code can access this. + + ImDrawCmd() { memset(this, 0, sizeof(*this)); } // Also ensure our padding fields are zeroed + + // Since 1.83: returns ImTextureID associated with this draw call. Warning: DO NOT assume this is always same as 'TextureId' (we will change this function for an upcoming feature) + inline ImTextureID GetTexID() const { return TextureId; } +}; + +// Vertex layout +#ifndef IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT +struct ImDrawVert +{ + ImVec2 pos; + ImVec2 uv; + ImU32 col; +}; +#else +// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h +// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine. +// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared at the time you'd want to set your type up. +// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM. +IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT; +#endif + +// [Internal] For use by ImDrawList +struct ImDrawCmdHeader +{ + ImVec4 ClipRect; + ImTextureID TextureId; + unsigned int VtxOffset; +}; + +// [Internal] For use by ImDrawListSplitter +struct ImDrawChannel +{ + ImVector _CmdBuffer; + ImVector _IdxBuffer; +}; + + +// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order. +// This is used by the Columns/Tables API, so items of each column can be batched together in a same draw call. +struct ImDrawListSplitter +{ + int _Current; // Current channel number (0) + int _Count; // Number of active channels (1+) + ImVector _Channels; // Draw channels (not resized down so _Count might be < Channels.Size) + + inline ImDrawListSplitter() { memset(this, 0, sizeof(*this)); } + inline ~ImDrawListSplitter() { ClearFreeMemory(); } + inline void Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame + IMGUI_API void ClearFreeMemory(); + IMGUI_API void Split(ImDrawList* draw_list, int count); + IMGUI_API void Merge(ImDrawList* draw_list); + IMGUI_API void SetCurrentChannel(ImDrawList* draw_list, int channel_idx); +}; + +// Flags for ImDrawList functions +// (Legacy: bit 0 must always correspond to ImDrawFlags_Closed to be backward compatible with old API using a bool. Bits 1..3 must be unused) +enum ImDrawFlags_ +{ + ImDrawFlags_None = 0, + ImDrawFlags_Closed = 1 << 0, // PathStroke(), AddPolyline(): specify that shape should be closed (Important: this is always == 1 for legacy reason) + ImDrawFlags_RoundCornersTopLeft = 1 << 4, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-left corner only (when rounding > 0.0f, we default to all corners). Was 0x01. + ImDrawFlags_RoundCornersTopRight = 1 << 5, // AddRect(), AddRectFilled(), PathRect(): enable rounding top-right corner only (when rounding > 0.0f, we default to all corners). Was 0x02. + ImDrawFlags_RoundCornersBottomLeft = 1 << 6, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-left corner only (when rounding > 0.0f, we default to all corners). Was 0x04. + ImDrawFlags_RoundCornersBottomRight = 1 << 7, // AddRect(), AddRectFilled(), PathRect(): enable rounding bottom-right corner only (when rounding > 0.0f, we default to all corners). Wax 0x08. + ImDrawFlags_RoundCornersNone = 1 << 8, // AddRect(), AddRectFilled(), PathRect(): disable rounding on all corners (when rounding > 0.0f). This is NOT zero, NOT an implicit flag! + ImDrawFlags_RoundCornersTop = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersBottom = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersLeft = ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersTopLeft, + ImDrawFlags_RoundCornersRight = ImDrawFlags_RoundCornersBottomRight | ImDrawFlags_RoundCornersTopRight, + ImDrawFlags_RoundCornersAll = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight, + ImDrawFlags_RoundCornersDefault_ = ImDrawFlags_RoundCornersAll, // Default to ALL corners if none of the _RoundCornersXX flags are specified. + ImDrawFlags_RoundCornersMask_ = ImDrawFlags_RoundCornersAll | ImDrawFlags_RoundCornersNone, +}; + +// Flags for ImDrawList instance. Those are set automatically by ImGui:: functions from ImGuiIO settings, and generally not manipulated directly. +// It is however possible to temporarily alter flags between calls to ImDrawList:: functions. +enum ImDrawListFlags_ +{ + ImDrawListFlags_None = 0, + ImDrawListFlags_AntiAliasedLines = 1 << 0, // Enable anti-aliased lines/borders (*2 the number of triangles for 1.0f wide line or lines thin enough to be drawn using textures, otherwise *3 the number of triangles) + ImDrawListFlags_AntiAliasedLinesUseTex = 1 << 1, // Enable anti-aliased lines/borders using textures when possible. Require backend to render with bilinear filtering (NOT point/nearest filtering). + ImDrawListFlags_AntiAliasedFill = 1 << 2, // Enable anti-aliased edge around filled shapes (rounded rectangles, circles). + ImDrawListFlags_AllowVtxOffset = 1 << 3, // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled. +}; + +// Draw command list +// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame, +// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering. +// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to +// access the current window draw list and draw custom primitives. +// You can interleave normal ImGui:: calls and adding primitives to the current draw list. +// In single viewport mode, top-left is == GetMainViewport()->Pos (generally 0,0), bottom-right is == GetMainViewport()->Pos+Size (generally io.DisplaySize). +// You are totally free to apply whatever transformation matrix to want to the data (depending on the use of the transformation you may want to apply it to ClipRect as well!) +// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. +struct ImDrawList +{ + // This is what you have to render + ImVector CmdBuffer; // Draw commands. Typically 1 command = 1 GPU draw call, unless the command is a callback. + ImVector IdxBuffer; // Index buffer. Each command consume ImDrawCmd::ElemCount of those + ImVector VtxBuffer; // Vertex buffer. + ImDrawListFlags Flags; // Flags, you may poke into these to adjust anti-aliasing settings per-primitive. + + // [Internal, used while building lists] + unsigned int _VtxCurrentIdx; // [Internal] generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0. + ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context) + const char* _OwnerName; // Pointer to owner window's name for debugging + ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) + ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much) + ImVector _ClipRectStack; // [Internal] + ImVector _TextureIdStack; // [Internal] + ImVector _Path; // [Internal] current path building + ImDrawCmdHeader _CmdHeader; // [Internal] template of active commands. Fields should match those of CmdBuffer.back(). + ImDrawListSplitter _Splitter; // [Internal] for channels api (note: prefer using your own persistent instance of ImDrawListSplitter!) + float _FringeScale; // [Internal] anti-alias fringe is scaled by this value, this helps to keep things sharp while zooming at vertex buffer content + + // If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui) + ImDrawList(ImDrawListSharedData* shared_data) { memset(this, 0, sizeof(*this)); _Data = shared_data; } + + ~ImDrawList() { _ClearFreeMemory(); } + IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect = false); // Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) + IMGUI_API void PushClipRectFullScreen(); + IMGUI_API void PopClipRect(); + IMGUI_API void PushTextureID(ImTextureID texture_id); + IMGUI_API void PopTextureID(); + inline ImVec2 GetClipRectMin() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.x, cr.y); } + inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); } + + // Primitives + // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners. + // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred). + // In older versions (until Dear ImGui 1.77) the AddCircle functions defaulted to num_segments == 12. + // In future versions we will use textures to provide cheaper and higher-quality circles. + // Use AddNgon() and AddNgonFilled() functions if you need to guarantee a specific number of sides. + IMGUI_API void AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawFlags flags = 0); // a: upper-left, b: lower-right (== upper-left + size) + IMGUI_API void AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left); + IMGUI_API void AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col); + IMGUI_API void AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f); + IMGUI_API void AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col); + IMGUI_API void AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 0, float thickness = 1.0f); + IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 0); + IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f); + IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments); + IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL); + IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL); + IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, ImDrawFlags flags, float thickness); + IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); + IMGUI_API void AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments = 0); // Quadratic Bezier (3 control points) + + // Image primitives + // - Read FAQ to understand what ImTextureID is. + // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle. + // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture. + IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE); + IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags = 0); + + // Stateful path API, add points then finish with PathFillConvex() or PathStroke() + // - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. + inline void PathClear() { _Path.Size = 0; } + inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); } + inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size - 1], &pos, 8) != 0) _Path.push_back(pos); } + inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } + inline void PathStroke(ImU32 col, ImDrawFlags flags = 0, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, flags, thickness); _Path.Size = 0; } + IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 0); + IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle + IMGUI_API void PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0); // Cubic Bezier (4 control points) + IMGUI_API void PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments = 0); // Quadratic Bezier (3 control points) + IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawFlags flags = 0); + + // Advanced + IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles. + IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible + IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer. + + // Advanced: Channels + // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives) + // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end) + // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place! + // Prefer using your own persistent instance of ImDrawListSplitter as you can stack them. + // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another. + inline void ChannelsSplit(int count) { _Splitter.Split(this, count); } + inline void ChannelsMerge() { _Splitter.Merge(this); } + inline void ChannelsSetCurrent(int n) { _Splitter.SetCurrentChannel(this, n); } + + // Advanced: Primitives allocations + // - We render triangles (three vertices) + // - All primitives needs to be reserved via PrimReserve() beforehand. + IMGUI_API void PrimReserve(int idx_count, int vtx_count); + IMGUI_API void PrimUnreserve(int idx_count, int vtx_count); + IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles) + IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col); + IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col); + inline void PrimWriteVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { _VtxWritePtr->pos = pos; _VtxWritePtr->uv = uv; _VtxWritePtr->col = col; _VtxWritePtr++; _VtxCurrentIdx++; } + inline void PrimWriteIdx(ImDrawIdx idx) { *_IdxWritePtr = idx; _IdxWritePtr++; } + inline void PrimVtx(const ImVec2& pos, const ImVec2& uv, ImU32 col) { PrimWriteIdx((ImDrawIdx)_VtxCurrentIdx); PrimWriteVtx(pos, uv, col); } // Write vertex with unique index + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0) { AddBezierCubic(p1, p2, p3, p4, col, thickness, num_segments); } // OBSOLETED in 1.80 (Jan 2021) + inline void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0) { PathBezierCubicCurveTo(p2, p3, p4, num_segments); } // OBSOLETED in 1.80 (Jan 2021) +#endif + + // [Internal helpers] + IMGUI_API void _ResetForNewFrame(); + IMGUI_API void _ClearFreeMemory(); + IMGUI_API void _PopUnusedDrawCmd(); + IMGUI_API void _TryMergeDrawCmds(); + IMGUI_API void _OnChangedClipRect(); + IMGUI_API void _OnChangedTextureID(); + IMGUI_API void _OnChangedVtxOffset(); + IMGUI_API int _CalcCircleAutoSegmentCount(float radius) const; + IMGUI_API void _PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step); + IMGUI_API void _PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments); +}; + +// All draw data to render a Dear ImGui frame +// (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose, +// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList) +struct ImDrawData +{ + bool Valid; // Only valid after Render() is called and before the next NewFrame() is called. + int CmdListsCount; // Number of ImDrawList* to render + int TotalIdxCount; // For convenience, sum of all ImDrawList's IdxBuffer.Size + int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size + ImDrawList** CmdLists; // Array of ImDrawList* to render. The ImDrawList are owned by ImGuiContext and only pointed to from here. + ImVec2 DisplayPos; // Top-left position of the viewport to render (== top-left of the orthogonal projection matrix to use) (== GetMainViewport()->Pos for the main viewport, == (0.0) in most single-viewport applications) + ImVec2 DisplaySize; // Size of the viewport to render (== GetMainViewport()->Size for the main viewport, == io.DisplaySize in most single-viewport applications) + ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display. + + // Functions + ImDrawData() { Clear(); } + void Clear() { memset(this, 0, sizeof(*this)); } // The ImDrawList are owned by ImGuiContext! + IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! + IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution. +}; + +//----------------------------------------------------------------------------- +// [SECTION] Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont) +//----------------------------------------------------------------------------- + +struct ImFontConfig +{ + void* FontData; // // TTF/OTF data + int FontDataSize; // // TTF/OTF data size + bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself). + int FontNo; // 0 // Index of font within TTF/OTF file + float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height). + int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Note the difference between 2 and 3 is minimal so you can reduce this to 2 to save memory. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details. + int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. This is not really useful as we don't use sub-pixel positions on the Y axis. + bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1. + ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now. + ImVec2 GlyphOffset; // 0, 0 // Offset all glyphs from this font input. + const ImWchar* GlyphRanges; // NULL // THE ARRAY DATA NEEDS TO PERSIST AS LONG AS THE FONT IS ALIVE. Pointer to a user-provided list of Unicode range (2 value per range, values are inclusive, zero-terminated list). + float GlyphMinAdvanceX; // 0 // Minimum AdvanceX for glyphs, set Min to align font icons, set both Min/Max to enforce mono-space font + float GlyphMaxAdvanceX; // FLT_MAX // Maximum AdvanceX for glyphs + bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights. + unsigned int FontBuilderFlags; // 0 // Settings for custom font builder. THIS IS BUILDER IMPLEMENTATION DEPENDENT. Leave as zero if unsure. + float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable. + ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used. + + // [Internal] + char Name[40]; // Name (strictly to ease debugging) + ImFont* DstFont; + + IMGUI_API ImFontConfig(); +}; + +// Hold rendering data for one glyph. +// (Note: some language parsers may fail to convert the 31+1 bitfield members, in this case maybe drop store a single u32 or we can rework this) +struct ImFontGlyph +{ + unsigned int Colored : 1; // Flag to indicate glyph is colored and should generally ignore tinting (make it usable with no shift on little-endian as this is used in loops) + unsigned int Visible : 1; // Flag to indicate glyph has no visible pixels (e.g. space). Allow early out when rendering. + unsigned int Codepoint : 30; // 0x0000..0x10FFFF + float AdvanceX; // Distance to next character (= data from font + ImFontConfig::GlyphExtraSpacing.x baked in) + float X0, Y0, X1, Y1; // Glyph corners + float U0, V0, U1, V1; // Texture coordinates +}; + +// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges(). +// This is essentially a tightly packed of vector of 64k booleans = 8KB storage. +struct ImFontGlyphRangesBuilder +{ + ImVector UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used) + + ImFontGlyphRangesBuilder() { Clear(); } + inline void Clear() { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX + 1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); } + inline bool GetBit(size_t n) const { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array + inline void SetBit(size_t n) { int off = (int)(n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array + inline void AddChar(ImWchar c) { SetBit(c); } // Add character + IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added) + IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext + IMGUI_API void BuildRanges(ImVector* out_ranges); // Output new ranges +}; + +// See ImFontAtlas::AddCustomRectXXX functions. +struct ImFontAtlasCustomRect +{ + unsigned short Width, Height; // Input // Desired rectangle dimension + unsigned short X, Y; // Output // Packed position in Atlas + unsigned int GlyphID; // Input // For custom font glyphs only (ID < 0x110000) + float GlyphAdvanceX; // Input // For custom font glyphs only: glyph xadvance + ImVec2 GlyphOffset; // Input // For custom font glyphs only: glyph display offset + ImFont* Font; // Input // For custom font glyphs only: target font + ImFontAtlasCustomRect() { Width = Height = 0; X = Y = 0xFFFF; GlyphID = 0; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0, 0); Font = NULL; } + bool IsPacked() const { return X != 0xFFFF; } +}; + +// Flags for ImFontAtlas build +enum ImFontAtlasFlags_ +{ + ImFontAtlasFlags_None = 0, + ImFontAtlasFlags_NoPowerOfTwoHeight = 1 << 0, // Don't round the height to next power of two + ImFontAtlasFlags_NoMouseCursors = 1 << 1, // Don't build software mouse cursors into the atlas (save a little texture memory) + ImFontAtlasFlags_NoBakedLines = 1 << 2, // Don't build thick line textures into the atlas (save a little texture memory, allow support for point/nearest filtering). The AntiAliasedLinesUseTex features uses them, otherwise they will be rendered using polygons (more expensive for CPU/GPU). +}; + +// Load and rasterize multiple TTF/OTF fonts into a same texture. The font atlas will build a single texture holding: +// - One or more fonts. +// - Custom graphics data needed to render the shapes needed by Dear ImGui. +// - Mouse cursor shapes for software cursor rendering (unless setting 'Flags |= ImFontAtlasFlags_NoMouseCursors' in the font atlas). +// It is the user-code responsibility to setup/build the atlas, then upload the pixel data into a texture accessible by your graphics api. +// - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you. +// - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data. +// - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples) +// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API. +// This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details. +// Common pitfalls: +// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the +// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data. +// - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction. +// You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed, +// - Even though many functions are suffixed with "TTF", OTF data is supported just as well. +// - This is an old API and it is currently awkward for those and various other reasons! We will address them in the future! +struct ImFontAtlas +{ + IMGUI_API ImFontAtlas(); + IMGUI_API ~ImFontAtlas(); + IMGUI_API ImFont* AddFont(const ImFontConfig* font_cfg); + IMGUI_API ImFont* AddFontDefault(const ImFontConfig* font_cfg = NULL); + IMGUI_API ImFont* AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); + IMGUI_API ImFont* AddFontFromMemoryTTF(void* font_data, int font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // Note: Transfer ownership of 'ttf_data' to ImFontAtlas! Will be deleted after destruction of the atlas. Set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed. + IMGUI_API ImFont* AddFontFromMemoryCompressedTTF(const void* compressed_font_data, int compressed_font_size, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data' still owned by caller. Compress with binary_to_compressed_c.cpp. + IMGUI_API ImFont* AddFontFromMemoryCompressedBase85TTF(const char* compressed_font_data_base85, float size_pixels, const ImFontConfig* font_cfg = NULL, const ImWchar* glyph_ranges = NULL); // 'compressed_font_data_base85' still owned by caller. Compress with binary_to_compressed_c.cpp with -base85 parameter. + IMGUI_API void ClearInputData(); // Clear input data (all ImFontConfig structures including sizes, TTF data, glyph ranges, etc.) = all the data used to build the texture and fonts. + IMGUI_API void ClearTexData(); // Clear output texture data (CPU side). Saves RAM once the texture has been copied to graphics memory. + IMGUI_API void ClearFonts(); // Clear output font data (glyphs storage, UV coordinates). + IMGUI_API void Clear(); // Clear all input and output. + + // Build atlas, retrieve pixel data. + // User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID(). + // The pitch is always = Width * BytesPerPixels (1 or 4) + // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into + // the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste. + IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions. + IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel + IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel + bool IsBuilt() const { return Fonts.Size > 0 && TexReady; } // Bit ambiguous: used to detect when user didn't build texture but effectively we should check TexID != 0 except that would be backend dependent... + void SetTexID(ImTextureID id) { TexID = id; } + + //------------------------------------------- + // Glyph Ranges + //------------------------------------------- + + // Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list) + // NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details. + // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data. + IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin + IMGUI_API const ImWchar* GetGlyphRangesGreek(); // Default + Greek and Coptic + IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters + IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 2999 Ideographs + IMGUI_API const ImWchar* GetGlyphRangesChineseFull(); // Default + Half-Width + Japanese Hiragana/Katakana + full set of about 21000 CJK Unified Ideographs + IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese + IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters + IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters + IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters + + //------------------------------------------- + // [BETA] Custom Rectangles/Glyphs API + //------------------------------------------- + + // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. + // - After calling Build(), you can query the rectangle position and render your pixels. + // - If you render colored output, set 'atlas->TexPixelsUseColors = true' as this may help some backends decide of prefered texture format. + // - You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), + // so you can render e.g. custom colorful icons and use them as regular glyphs. + // - Read docs/FONTS.md for more details about using colorful icons. + // - Note: this API may be redesigned later in order to support multi-monitor varying DPI settings. + IMGUI_API int AddCustomRectRegular(int width, int height); + IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0, 0)); + ImFontAtlasCustomRect* GetCustomRectByIndex(int index) { IM_ASSERT(index >= 0); return &CustomRects[index]; } + + // [Internal] + IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const; + IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]); + + //------------------------------------------- + // Members + //------------------------------------------- + + ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_) + ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure. + int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height. + int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0 (will also need to set AntiAliasedLinesUseTex = false). + bool Locked; // Marked as Locked by ImGui::NewFrame() so attempt to modify the atlas will assert. + void* UserData; // Store your own atlas related user-data (if e.g. you have multiple font atlas). + + // [Internal] + // NB: Access texture data via GetTexData*() calls! Which will setup a default font for you. + bool TexReady; // Set when texture was built matching current font input + bool TexPixelsUseColors; // Tell whether our texture data is known to use colors (rather than just alpha channel), in order to help backend select a format. + unsigned char* TexPixelsAlpha8; // 1 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight + unsigned int* TexPixelsRGBA32; // 4 component per pixel, each component is unsigned 8-bit. Total size = TexWidth * TexHeight * 4 + int TexWidth; // Texture width calculated during Build(). + int TexHeight; // Texture height calculated during Build(). + ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight) + ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel + ImVector Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font. + ImVector CustomRects; // Rectangles for packing custom texture data into the atlas. + ImVector ConfigData; // Configuration data + ImVec4 TexUvLines[IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1]; // UVs for baked anti-aliased lines + + // [Internal] Font builder + const ImFontBuilderIO* FontBuilderIO; // Opaque interface to a font builder (default to stb_truetype, can be changed to use FreeType by defining IMGUI_ENABLE_FREETYPE). + unsigned int FontBuilderFlags; // Shared flags (for all fonts) for custom font builder. THIS IS BUILD IMPLEMENTATION DEPENDENT. Per-font override is also available in ImFontConfig. + + // [Internal] Packing data + int PackIdMouseCursors; // Custom texture rectangle ID for white pixel and mouse cursors + int PackIdLines; // Custom texture rectangle ID for baked anti-aliased lines + + // [Obsolete] + //typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+ + //typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+ +}; + +// Font runtime data and rendering +// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32(). +struct ImFont +{ + // Members: Hot ~20/24 bytes (for CalcTextSize) + ImVector IndexAdvanceX; // 12-16 // out // // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI). + float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX + float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading) + + // Members: Hot ~28/40 bytes (for CalcTextSize + render loop) + ImVector IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point. + ImVector Glyphs; // 12-16 // out // // All glyphs. + const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar) + + // Members: Cold ~32/40 bytes + ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into + const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData + short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont. + ImWchar FallbackChar; // 2 // out // = FFFD/'?' // Character used if a glyph isn't found. + ImWchar EllipsisChar; // 2 // out // = '...'/'.'// Character used for ellipsis rendering. + short EllipsisCharCount; // 1 // out // 1 or 3 + float EllipsisWidth; // 4 // out // Width + float EllipsisCharStep; // 4 // out // Step between characters when EllipsisCount > 0 + bool DirtyLookupTables; // 1 // out // + float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale() + float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize] + int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs) + ImU8 Used4kPagesMap[(IM_UNICODE_CODEPOINT_MAX+1)/4096/8]; // 2 bytes if ImWchar=ImWchar16, 34 bytes if ImWchar==ImWchar32. Store 1-bit for each block of 4K codepoints that has one active glyph. This is mainly used to facilitate iterations across all used codepoints. + + // Methods + IMGUI_API ImFont(); + IMGUI_API ~ImFont(); + IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const; + IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const; + float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; } + bool IsLoaded() const { return ContainerAtlas != NULL; } + const char* GetDebugName() const { return ConfigData ? ConfigData->Name : ""; } + + // 'max_width' stops rendering after a certain width (could be turned into a 2d size). FLT_MAX to disable. + // 'wrap_width' enable automatic word-wrapping across multiple lines to fit into given width. 0.0f to disable. + IMGUI_API ImVec2 CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end = NULL, const char** remaining = NULL) const; // utf8 + IMGUI_API const char* CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const; + IMGUI_API void RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const; + IMGUI_API void RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const; + + // [Internal] Don't use! + IMGUI_API void BuildLookupTable(); + IMGUI_API void ClearOutputData(); + IMGUI_API void GrowIndex(int new_size); + IMGUI_API void AddGlyph(const ImFontConfig* src_cfg, ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x); + IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built. + IMGUI_API void SetGlyphVisible(ImWchar c, bool visible); + IMGUI_API bool IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Viewports +//----------------------------------------------------------------------------- + +// Flags stored in ImGuiViewport::Flags, giving indications to the platform backends. +enum ImGuiViewportFlags_ +{ + ImGuiViewportFlags_None = 0, + ImGuiViewportFlags_IsPlatformWindow = 1 << 0, // Represent a Platform Window + ImGuiViewportFlags_IsPlatformMonitor = 1 << 1, // Represent a Platform Monitor (unused yet) + ImGuiViewportFlags_OwnedByApp = 1 << 2, // Platform Window: is created/managed by the application (rather than a dear imgui backend) +}; + +// - Currently represents the Platform Window created by the application which is hosting our Dear ImGui windows. +// - In 'docking' branch with multi-viewport enabled, we extend this concept to have multiple active viewports. +// - In the future we will extend this concept further to also represent Platform Monitor and support a "no main platform window" operation mode. +// - About Main Area vs Work Area: +// - Main Area = entire viewport. +// - Work Area = entire viewport minus sections used by main menu bars (for platform windows), or by task bar (for platform monitor). +// - Windows are generally trying to stay within the Work Area of their host viewport. +struct ImGuiViewport +{ + ImGuiViewportFlags Flags; // See ImGuiViewportFlags_ + ImVec2 Pos; // Main Area: Position of the viewport (Dear ImGui coordinates are the same as OS desktop/native coordinates) + ImVec2 Size; // Main Area: Size of the viewport. + ImVec2 WorkPos; // Work Area: Position of the viewport minus task bars, menus bars, status bars (>= Pos) + ImVec2 WorkSize; // Work Area: Size of the viewport minus task bars, menu bars, status bars (<= Size) + + // Platform/Backend Dependent Data + void* PlatformHandleRaw; // void* to hold lower-level, platform-native window handle (under Win32 this is expected to be a HWND, unused for other platforms) + + ImGuiViewport() { memset(this, 0, sizeof(*this)); } + + // Helpers + ImVec2 GetCenter() const { return ImVec2(Pos.x + Size.x * 0.5f, Pos.y + Size.y * 0.5f); } + ImVec2 GetWorkCenter() const { return ImVec2(WorkPos.x + WorkSize.x * 0.5f, WorkPos.y + WorkSize.y * 0.5f); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Platform Dependent Interfaces +//----------------------------------------------------------------------------- + +// (Optional) Support for IME (Input Method Editor) via the io.SetPlatformImeDataFn() function. +struct ImGuiPlatformImeData +{ + bool WantVisible; // A widget wants the IME to be visible + ImVec2 InputPos; // Position of the input cursor + float InputLineHeight; // Line height + + ImGuiPlatformImeData() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Obsolete functions and types +// (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details) +// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead. +//----------------------------------------------------------------------------- + +namespace ImGui +{ +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + IMGUI_API ImGuiKey GetKeyIndex(ImGuiKey key); // map ImGuiKey_* values into legacy native key index. == io.KeyMap[key] +#else + static inline ImGuiKey GetKeyIndex(ImGuiKey key) { IM_ASSERT(key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END && "ImGuiKey and native_index was merged together and native_index is disabled by IMGUI_DISABLE_OBSOLETE_KEYIO. Please switch to ImGuiKey."); return key; } +#endif +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +namespace ImGui +{ + // OBSOLETED in 1.89.4 (from March 2023) + static inline void PushAllowKeyboardFocus(bool tab_stop) { PushTabStop(tab_stop); } + static inline void PopAllowKeyboardFocus() { PopTabStop(); } + // OBSOLETED in 1.89 (from August 2022) + IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0, 0), const ImVec2& uv1 = ImVec2(1, 1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0, 0, 0, 0), const ImVec4& tint_col = ImVec4(1, 1, 1, 1)); // Use new ImageButton() signature (explicit item id, regular FramePadding) + // OBSOLETED in 1.88 (from May 2022) + static inline void CaptureKeyboardFromApp(bool want_capture_keyboard = true) { SetNextFrameWantCaptureKeyboard(want_capture_keyboard); } // Renamed as name was misleading + removed default value. + static inline void CaptureMouseFromApp(bool want_capture_mouse = true) { SetNextFrameWantCaptureMouse(want_capture_mouse); } // Renamed as name was misleading + removed default value. + // OBSOLETED in 1.86 (from November 2021) + IMGUI_API void CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end); // Calculate coarse clipping for large list of evenly sized items. Prefer using ImGuiListClipper. + // OBSOLETED in 1.85 (from August 2021) + static inline float GetWindowContentRegionWidth() { return GetWindowContentRegionMax().x - GetWindowContentRegionMin().x; } + // OBSOLETED in 1.81 (from February 2021) + IMGUI_API bool ListBoxHeader(const char* label, int items_count, int height_in_items = -1); // Helper to calculate size from items_count and height_in_items + static inline bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0, 0)) { return BeginListBox(label, size); } + static inline void ListBoxFooter() { EndListBox(); } + + // Some of the older obsolete names along with their replacement (commented out so they are not reported in IDE) + //-- OBSOLETED in 1.79 (from August 2020) + //static inline void OpenPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mb = 1) { OpenPopupOnItemClick(str_id, mb); } // Bool return value removed. Use IsWindowAppearing() in BeginPopup() instead. Renamed in 1.77, renamed back in 1.79. Sorry! + //-- OBSOLETED in 1.78 (from June 2020): Old drag/sliders functions that took a 'float power > 1.0f' argument instead of ImGuiSliderFlags_Logarithmic. See github.com/ocornut/imgui/issues/3361 for details. + //IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power = 1.0f) // OBSOLETED in 1.78 (from June 2020) + //IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power = 1.0f); // OBSOLETED in 1.78 (from June 2020) + //IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power = 1.0f); // OBSOLETED in 1.78 (from June 2020) + //IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format, float power = 1.0f); // OBSOLETED in 1.78 (from June 2020) + //static inline bool DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, float power = 1.0f) { return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, float power = 1.0f) { return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, float power = 1.0f) { return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, float power = 1.0f) { return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, float power = 1.0f) { return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, float power = 1.0f) { return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, float power = 1.0f) { return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //static inline bool SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, float power = 1.0f) { return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, power); } // OBSOLETED in 1.78 (from June 2020) + //-- OBSOLETED in 1.77 and before + //static inline bool BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mb, bool over_items) { return BeginPopupContextWindow(str_id, mb | (over_items ? 0 : ImGuiPopupFlags_NoOpenOverItems)); } // OBSOLETED in 1.77 (from June 2020) + //static inline void TreeAdvanceToLabelPos() { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); } // OBSOLETED in 1.72 (from July 2019) + //static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); } // OBSOLETED in 1.71 (from June 2019) + //static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; } // OBSOLETED in 1.70 (from May 2019) + //static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); } // OBSOLETED in 1.69 (from Mar 2019) + //static inline void SetScrollHere(float ratio = 0.5f) { SetScrollHereY(ratio); } // OBSOLETED in 1.66 (from Nov 2018) + //static inline bool IsItemDeactivatedAfterChange() { return IsItemDeactivatedAfterEdit(); } // OBSOLETED in 1.63 (from Aug 2018) + //-- OBSOLETED in 1.60 and before + //static inline bool IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); } // OBSOLETED in 1.60 (from Apr 2018) + //static inline bool IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018) + //static inline void ShowTestWindow() { return ShowDemoWindow(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline void SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); } // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017) + //IMGUI_API bool Begin(char* name, bool* p_open, ImVec2 size_first_use, float bg_alpha = -1.0f, ImGuiWindowFlags flags=0); // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017): Equivalent of using SetNextWindowSize(size, ImGuiCond_FirstUseEver) and SetNextWindowBgAlpha(). + //static inline bool IsRootWindowOrAnyChildHovered() { return IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); } // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017) + //static inline void AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); } // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017) + //static inline void SetNextWindowPosCenter(ImGuiCond c=0) { SetNextWindowPos(GetMainViewport()->GetCenter(), c, ImVec2(0.5f,0.5f)); } // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017) + //static inline bool IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); } // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017) + //static inline bool IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017): This was misleading and partly broken. You probably want to use the io.WantCaptureMouse flag instead. + //static inline bool IsMouseHoveringAnyWindow() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); } // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017) + //static inline bool IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); } // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017) + //-- OBSOLETED in 1.50 and before + //static inline bool CollapsingHeader(char* label, const char* str_id, bool framed = true, bool default_open = false) { return CollapsingHeader(label, (default_open ? (1 << 5) : 0)); } // OBSOLETED in 1.49 + //static inline ImFont*GetWindowFont() { return GetFont(); } // OBSOLETED in 1.48 + //static inline float GetWindowFontSize() { return GetFontSize(); } // OBSOLETED in 1.48 + //static inline void SetScrollPosHere() { SetScrollHere(); } // OBSOLETED in 1.42 +} + +// OBSOLETED in 1.82 (from Mars 2021): flags for AddRect(), AddRectFilled(), AddImageRounded(), PathRect() +typedef ImDrawFlags ImDrawCornerFlags; +enum ImDrawCornerFlags_ +{ + ImDrawCornerFlags_None = ImDrawFlags_RoundCornersNone, // Was == 0 prior to 1.82, this is now == ImDrawFlags_RoundCornersNone which is != 0 and not implicit + ImDrawCornerFlags_TopLeft = ImDrawFlags_RoundCornersTopLeft, // Was == 0x01 (1 << 0) prior to 1.82. Order matches ImDrawFlags_NoRoundCorner* flag (we exploit this internally). + ImDrawCornerFlags_TopRight = ImDrawFlags_RoundCornersTopRight, // Was == 0x02 (1 << 1) prior to 1.82. + ImDrawCornerFlags_BotLeft = ImDrawFlags_RoundCornersBottomLeft, // Was == 0x04 (1 << 2) prior to 1.82. + ImDrawCornerFlags_BotRight = ImDrawFlags_RoundCornersBottomRight, // Was == 0x08 (1 << 3) prior to 1.82. + ImDrawCornerFlags_All = ImDrawFlags_RoundCornersAll, // Was == 0x0F prior to 1.82 + ImDrawCornerFlags_Top = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_TopRight, + ImDrawCornerFlags_Bot = ImDrawCornerFlags_BotLeft | ImDrawCornerFlags_BotRight, + ImDrawCornerFlags_Left = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotLeft, + ImDrawCornerFlags_Right = ImDrawCornerFlags_TopRight | ImDrawCornerFlags_BotRight, +}; + +// RENAMED and MERGED both ImGuiKey_ModXXX and ImGuiModFlags_XXX into ImGuiMod_XXX (from September 2022) +// RENAMED ImGuiKeyModFlags -> ImGuiModFlags in 1.88 (from April 2022). Exceptionally commented out ahead of obscolescence schedule to reduce confusion and because they were not meant to be used in the first place. +typedef ImGuiKeyChord ImGuiModFlags; // == int. We generally use ImGuiKeyChord to mean "a ImGuiKey or-ed with any number of ImGuiMod_XXX value", but you may store only mods in there. +enum ImGuiModFlags_ { ImGuiModFlags_None = 0, ImGuiModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiModFlags_Shift = ImGuiMod_Shift, ImGuiModFlags_Alt = ImGuiMod_Alt, ImGuiModFlags_Super = ImGuiMod_Super }; +//typedef ImGuiKeyChord ImGuiKeyModFlags; // == int +//enum ImGuiKeyModFlags_ { ImGuiKeyModFlags_None = 0, ImGuiKeyModFlags_Ctrl = ImGuiMod_Ctrl, ImGuiKeyModFlags_Shift = ImGuiMod_Shift, ImGuiKeyModFlags_Alt = ImGuiMod_Alt, ImGuiKeyModFlags_Super = ImGuiMod_Super }; + +#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +// RENAMED IMGUI_DISABLE_METRICS_WINDOW > IMGUI_DISABLE_DEBUG_TOOLS in 1.88 (from June 2022) +#if defined(IMGUI_DISABLE_METRICS_WINDOW) && !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && !defined(IMGUI_DISABLE_DEBUG_TOOLS) +#define IMGUI_DISABLE_DEBUG_TOOLS +#endif +#if defined(IMGUI_DISABLE_METRICS_WINDOW) && defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) +#error IMGUI_DISABLE_METRICS_WINDOW was renamed to IMGUI_DISABLE_DEBUG_TOOLS, please use new name. +#endif + +//----------------------------------------------------------------------------- + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +// Include imgui_user.h at the end of imgui.h (convenient for user to only explicitly include vanilla imgui.h) +#ifdef IMGUI_INCLUDE_IMGUI_USER_H +#include "imgui_user.h" +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui_demo.cpp b/ImGui/imgui_demo.cpp new file mode 100644 index 0000000..50082d7 --- /dev/null +++ b/ImGui/imgui_demo.cpp @@ -0,0 +1,8036 @@ +// dear imgui, v1.89.4 WIP +// (demo code) + +// Help: +// - Read FAQ at http://dearimgui.org/faq +// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase. +// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp. All applications in examples/ are doing that. +// Read imgui.cpp for more details, documentation and comments. +// Get the latest version at https://github.com/ocornut/imgui + +// ------------------------------------------------- +// PLEASE DO NOT REMOVE THIS FILE FROM YOUR PROJECT! +// ------------------------------------------------- +// Message to the person tempted to delete this file when integrating Dear ImGui into their codebase: +// Think again! It is the most useful reference code that you and other coders will want to refer to and call. +// Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of your game/app! +// Also include Metrics! ItemPicker! DebugLog! and other debug features. +// Removing this file from your project is hindering access to documentation for everyone in your team, +// likely leading you to poorer usage of the library. +// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow(). +// If you want to link core Dear ImGui in your shipped builds but want a thorough guarantee that the demo will not be +// linked, you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty. +// In another situation, whenever you have Dear ImGui available you probably want this to be available for reference. +// Thank you, +// -Your beloved friend, imgui_demo.cpp (which you won't delete) + +// Message to beginner C/C++ programmers about the meaning of the 'static' keyword: +// In this demo code, we frequently use 'static' variables inside functions. A static variable persists across calls, +// so it is essentially like a global variable but declared inside the scope of the function. We do this as a way to +// gather code and data in the same place, to make the demo source code faster to read, faster to write, and smaller +// in size. It also happens to be a convenient way of storing simple UI related information as long as your function +// doesn't need to be reentrant or used in multiple threads. This might be a pattern you will want to use in your code, +// but most of the real data you would be editing is likely going to be stored outside your functions. + +// The Demo code in this file is designed to be easy to copy-and-paste into your application! +// Because of this: +// - We never omit the ImGui:: prefix when calling functions, even though most code here is in the same namespace. +// - We try to declare static variables in the local scope, as close as possible to the code using them. +// - We never use any of the helpers/facilities used internally by Dear ImGui, unless available in the public API. +// - We never use maths operators on ImVec2/ImVec4. For our other sources files we use them, and they are provided +// by imgui.h using the IMGUI_DEFINE_MATH_OPERATORS define. For your own sources file they are optional +// and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h. +// Because we can't assume anything about your support of maths operators, we cannot use them in imgui_demo.cpp. + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +/* + +Index of this file: + +// [SECTION] Forward Declarations +// [SECTION] Helpers +// [SECTION] Demo Window / ShowDemoWindow() +// - ShowDemoWindow() +// - sub section: ShowDemoWindowWidgets() +// - sub section: ShowDemoWindowLayout() +// - sub section: ShowDemoWindowPopups() +// - sub section: ShowDemoWindowTables() +// - sub section: ShowDemoWindowInputs() +// [SECTION] About Window / ShowAboutWindow() +// [SECTION] Style Editor / ShowStyleEditor() +// [SECTION] User Guide / ShowUserGuide() +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +// [SECTION] Example App: Manipulating window titles / ShowExampleAppWindowTitles() +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE + +// System includes +#include // toupper +#include // INT_MIN, INT_MAX +#include // sqrtf, powf, cosf, sinf, floorf, ceilf +#include // vsnprintf, sscanf, printf +#include // NULL, malloc, free, atoi +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to an 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning: 'xx' is deprecated: The POSIX name for this.. // for strdup used in demo code (so user can copy & paste the code) +#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning: cast to 'void *' from smaller integer type +#pragma clang diagnostic ignored "-Wformat-security" // warning: format string is not a string literal +#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning: declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals. +#pragma clang diagnostic ignored "-Wunused-macros" // warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used. +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size +#pragma GCC diagnostic ignored "-Wformat-security" // warning: format string is not a string literal (potentially insecure) +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub. +#endif + +// Play it nice with Windows users (Update: May 2018, Notepad now supports Unix-style carriage returns!) +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" +#else +#define IM_NEWLINE "\n" +#endif + +// Helpers +#if defined(_MSC_VER) && !defined(snprintf) +#define snprintf _snprintf +#endif +#if defined(_MSC_VER) && !defined(vsnprintf) +#define vsnprintf _vsnprintf +#endif + +// Format specifiers, printing 64-bit hasn't been decently standardized... +// In a real application you should be using PRId64 and PRIu64 from (non-windows) and on Windows define them yourself. +#ifdef _MSC_VER +#define IM_PRId64 "I64d" +#define IM_PRIu64 "I64u" +#else +#define IM_PRId64 "lld" +#define IM_PRIu64 "llu" +#endif + +// Helpers macros +// We normally try to not use many helpers in imgui_demo.cpp in order to make code easier to copy and paste, +// but making an exception here as those are largely simplifying code... +// In other imgui sources we can use nicer internal functions from imgui_internal.h (ImMin/ImMax) but not in the demo. +#define IM_MIN(A, B) (((A) < (B)) ? (A) : (B)) +#define IM_MAX(A, B) (((A) >= (B)) ? (A) : (B)) +#define IM_CLAMP(V, MN, MX) ((V) < (MN) ? (MN) : (V) > (MX) ? (MX) : (V)) + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifndef IMGUI_CDECL +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward Declarations, Helpers +//----------------------------------------------------------------------------- + +#if !defined(IMGUI_DISABLE_DEMO_WINDOWS) + +// Forward Declarations +static void ShowExampleAppDocuments(bool* p_open); +static void ShowExampleAppMainMenuBar(); +static void ShowExampleAppConsole(bool* p_open); +static void ShowExampleAppLog(bool* p_open); +static void ShowExampleAppLayout(bool* p_open); +static void ShowExampleAppPropertyEditor(bool* p_open); +static void ShowExampleAppLongText(bool* p_open); +static void ShowExampleAppAutoResize(bool* p_open); +static void ShowExampleAppConstrainedResize(bool* p_open); +static void ShowExampleAppSimpleOverlay(bool* p_open); +static void ShowExampleAppFullscreen(bool* p_open); +static void ShowExampleAppWindowTitles(bool* p_open); +static void ShowExampleAppCustomRendering(bool* p_open); +static void ShowExampleMenuFile(); + +// We split the contents of the big ShowDemoWindow() function into smaller functions +// (because the link time of very large functions grow non-linearly) +static void ShowDemoWindowWidgets(); +static void ShowDemoWindowLayout(); +static void ShowDemoWindowPopups(); +static void ShowDemoWindowTables(); +static void ShowDemoWindowColumns(); +static void ShowDemoWindowInputs(); + +//----------------------------------------------------------------------------- +// [SECTION] Helpers +//----------------------------------------------------------------------------- + +// Helper to display a little (?) mark which shows a tooltip when hovered. +// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.md) +static void HelpMarker(const char* desc) +{ + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort) && ImGui::BeginTooltip()) + { + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f); + ImGui::TextUnformatted(desc); + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +// Helper to wire demo markers located in code to an interactive browser +typedef void (*ImGuiDemoMarkerCallback)(const char* file, int line, const char* section, void* user_data); +extern ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback; +extern void* GImGuiDemoMarkerCallbackUserData; +ImGuiDemoMarkerCallback GImGuiDemoMarkerCallback = NULL; +void* GImGuiDemoMarkerCallbackUserData = NULL; +#define IMGUI_DEMO_MARKER(section) do { if (GImGuiDemoMarkerCallback != NULL) GImGuiDemoMarkerCallback(__FILE__, __LINE__, section, GImGuiDemoMarkerCallbackUserData); } while (0) + +//----------------------------------------------------------------------------- +// [SECTION] Demo Window / ShowDemoWindow() +//----------------------------------------------------------------------------- +// - ShowDemoWindow() +// - ShowDemoWindowWidgets() +// - ShowDemoWindowLayout() +// - ShowDemoWindowPopups() +// - ShowDemoWindowTables() +// - ShowDemoWindowColumns() +// - ShowDemoWindowInputs() +//----------------------------------------------------------------------------- + +// Demonstrate most Dear ImGui features (this is big function!) +// You may execute this function to experiment with the UI and understand what it does. +// You may then search for keywords in the code when you are interested by a specific feature. +void ImGui::ShowDemoWindow(bool* p_open) +{ + // Exceptionally add an extra assert here for people confused about initial Dear ImGui setup + // Most functions would normally just crash if the context is missing. + IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); + + // Examples Apps (accessible from the "Examples" menu) + static bool show_app_main_menu_bar = false; + static bool show_app_documents = false; + static bool show_app_console = false; + static bool show_app_log = false; + static bool show_app_layout = false; + static bool show_app_property_editor = false; + static bool show_app_long_text = false; + static bool show_app_auto_resize = false; + static bool show_app_constrained_resize = false; + static bool show_app_simple_overlay = false; + static bool show_app_fullscreen = false; + static bool show_app_window_titles = false; + static bool show_app_custom_rendering = false; + + if (show_app_main_menu_bar) ShowExampleAppMainMenuBar(); + if (show_app_documents) ShowExampleAppDocuments(&show_app_documents); + if (show_app_console) ShowExampleAppConsole(&show_app_console); + if (show_app_log) ShowExampleAppLog(&show_app_log); + if (show_app_layout) ShowExampleAppLayout(&show_app_layout); + if (show_app_property_editor) ShowExampleAppPropertyEditor(&show_app_property_editor); + if (show_app_long_text) ShowExampleAppLongText(&show_app_long_text); + if (show_app_auto_resize) ShowExampleAppAutoResize(&show_app_auto_resize); + if (show_app_constrained_resize) ShowExampleAppConstrainedResize(&show_app_constrained_resize); + if (show_app_simple_overlay) ShowExampleAppSimpleOverlay(&show_app_simple_overlay); + if (show_app_fullscreen) ShowExampleAppFullscreen(&show_app_fullscreen); + if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles); + if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering); + + // Dear ImGui Tools/Apps (accessible from the "Tools" menu) + static bool show_app_metrics = false; + static bool show_app_debug_log = false; + static bool show_app_stack_tool = false; + static bool show_app_about = false; + static bool show_app_style_editor = false; + + if (show_app_metrics) + ImGui::ShowMetricsWindow(&show_app_metrics); + if (show_app_debug_log) + ImGui::ShowDebugLogWindow(&show_app_debug_log); + if (show_app_stack_tool) + ImGui::ShowStackToolWindow(&show_app_stack_tool); + if (show_app_about) + ImGui::ShowAboutWindow(&show_app_about); + if (show_app_style_editor) + { + ImGui::Begin("Dear ImGui Style Editor", &show_app_style_editor); + ImGui::ShowStyleEditor(); + ImGui::End(); + } + + // Demonstrate the various window flags. Typically you would just use the default! + static bool no_titlebar = false; + static bool no_scrollbar = false; + static bool no_menu = false; + static bool no_move = false; + static bool no_resize = false; + static bool no_collapse = false; + static bool no_close = false; + static bool no_nav = false; + static bool no_background = false; + static bool no_bring_to_front = false; + static bool unsaved_document = false; + + ImGuiWindowFlags window_flags = 0; + if (no_titlebar) window_flags |= ImGuiWindowFlags_NoTitleBar; + if (no_scrollbar) window_flags |= ImGuiWindowFlags_NoScrollbar; + if (!no_menu) window_flags |= ImGuiWindowFlags_MenuBar; + if (no_move) window_flags |= ImGuiWindowFlags_NoMove; + if (no_resize) window_flags |= ImGuiWindowFlags_NoResize; + if (no_collapse) window_flags |= ImGuiWindowFlags_NoCollapse; + if (no_nav) window_flags |= ImGuiWindowFlags_NoNav; + if (no_background) window_flags |= ImGuiWindowFlags_NoBackground; + if (no_bring_to_front) window_flags |= ImGuiWindowFlags_NoBringToFrontOnFocus; + if (unsaved_document) window_flags |= ImGuiWindowFlags_UnsavedDocument; + if (no_close) p_open = NULL; // Don't pass our bool* to Begin + + // We specify a default position/size in case there's no data in the .ini file. + // We only do it to make the demo applications a little more welcoming, but typically this isn't required. + const ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(ImVec2(main_viewport->WorkPos.x + 650, main_viewport->WorkPos.y + 20), ImGuiCond_FirstUseEver); + ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver); + + // Main body of the Demo window starts here. + if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags)) + { + // Early out if the window is collapsed, as an optimization. + ImGui::End(); + return; + } + + // Most "big" widgets share a common width settings by default. See 'Demo->Layout->Widgets Width' for details. + // e.g. Use 2/3 of the space for widgets and 1/3 for labels (right align) + //ImGui::PushItemWidth(-ImGui::GetWindowWidth() * 0.35f); + // e.g. Leave a fixed amount of width for labels (by passing a negative value), the rest goes to widgets. + ImGui::PushItemWidth(ImGui::GetFontSize() * -12); + + // Menu Bar + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + IMGUI_DEMO_MARKER("Menu/File"); + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Examples")) + { + IMGUI_DEMO_MARKER("Menu/Examples"); + ImGui::MenuItem("Main menu bar", NULL, &show_app_main_menu_bar); + ImGui::MenuItem("Console", NULL, &show_app_console); + ImGui::MenuItem("Log", NULL, &show_app_log); + ImGui::MenuItem("Simple layout", NULL, &show_app_layout); + ImGui::MenuItem("Property editor", NULL, &show_app_property_editor); + ImGui::MenuItem("Long text display", NULL, &show_app_long_text); + ImGui::MenuItem("Auto-resizing window", NULL, &show_app_auto_resize); + ImGui::MenuItem("Constrained-resizing window", NULL, &show_app_constrained_resize); + ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay); + ImGui::MenuItem("Fullscreen window", NULL, &show_app_fullscreen); + ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles); + ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering); + ImGui::MenuItem("Documents", NULL, &show_app_documents); + ImGui::EndMenu(); + } + //if (ImGui::MenuItem("MenuItem")) {} // You can also use MenuItem() inside a menu bar! + if (ImGui::BeginMenu("Tools")) + { + IMGUI_DEMO_MARKER("Menu/Tools"); +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + const bool has_debug_tools = true; +#else + const bool has_debug_tools = false; +#endif + ImGui::MenuItem("Metrics/Debugger", NULL, &show_app_metrics, has_debug_tools); + ImGui::MenuItem("Debug Log", NULL, &show_app_debug_log, has_debug_tools); + ImGui::MenuItem("Stack Tool", NULL, &show_app_stack_tool, has_debug_tools); + ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor); + ImGui::MenuItem("About Dear ImGui", NULL, &show_app_about); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + ImGui::Text("dear imgui says hello! (%s) (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); + ImGui::Spacing(); + + IMGUI_DEMO_MARKER("Help"); + if (ImGui::CollapsingHeader("Help")) + { + ImGui::Text("ABOUT THIS DEMO:"); + ImGui::BulletText("Sections below are demonstrating many aspects of the library."); + ImGui::BulletText("The \"Examples\" menu above leads to more demo contents."); + ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n" + "and Metrics/Debugger (general purpose Dear ImGui debugging tool)."); + ImGui::Separator(); + + ImGui::Text("PROGRAMMER GUIDE:"); + ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!"); + ImGui::BulletText("See comments in imgui.cpp."); + ImGui::BulletText("See example applications in the examples/ folder."); + ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/"); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls."); + ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls."); + ImGui::Separator(); + + ImGui::Text("USER GUIDE:"); + ImGui::ShowUserGuide(); + } + + IMGUI_DEMO_MARKER("Configuration"); + if (ImGui::CollapsingHeader("Configuration")) + { + ImGuiIO& io = ImGui::GetIO(); + + if (ImGui::TreeNode("Configuration##2")) + { + ImGui::SeparatorText("General"); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", &io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard); + ImGui::SameLine(); HelpMarker("Enable keyboard controls."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", &io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad); + ImGui::SameLine(); HelpMarker("Enable gamepad controls. Require backend to set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details."); + ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", &io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos); + ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos."); + ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", &io.ConfigFlags, ImGuiConfigFlags_NoMouse); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) + { + // The "NoMouse" option can get us stuck with a disabled mouse! Let's provide an alternative way to fix it: + if (fmodf((float)ImGui::GetTime(), 0.40f) < 0.20f) + { + ImGui::SameLine(); + ImGui::Text("<>"); + } + if (ImGui::IsKeyPressed(ImGuiKey_Space)) + io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse; + } + ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", &io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange); + ImGui::SameLine(); HelpMarker("Instruct backend to not alter mouse cursor shape and visibility."); + ImGui::Checkbox("io.ConfigInputTrickleEventQueue", &io.ConfigInputTrickleEventQueue); + ImGui::SameLine(); HelpMarker("Enable input queue trickling: some types of events submitted during the same frame (e.g. button down + up) will be spread over multiple frames, improving interactions with low framerates."); + ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor); + ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor itself. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something)."); + + ImGui::SeparatorText("Widgets"); + ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink); + ImGui::SameLine(); HelpMarker("Enable blinking cursor (optional as some users consider it to be distracting)."); + ImGui::Checkbox("io.ConfigInputTextEnterKeepActive", &io.ConfigInputTextEnterKeepActive); + ImGui::SameLine(); HelpMarker("Pressing Enter will keep item active and select contents (single-line only)."); + ImGui::Checkbox("io.ConfigDragClickToInputText", &io.ConfigDragClickToInputText); + ImGui::SameLine(); HelpMarker("Enable turning DragXXX widgets into text input with a simple mouse click-release (without moving)."); + ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges); + ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback."); + ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly); + ImGui::Checkbox("io.ConfigMacOSXBehaviors", &io.ConfigMacOSXBehaviors); + ImGui::Text("Also see Style->Rendering for rendering options."); + ImGui::TreePop(); + ImGui::Spacing(); + } + + IMGUI_DEMO_MARKER("Configuration/Backend Flags"); + if (ImGui::TreeNode("Backend Flags")) + { + HelpMarker( + "Those flags are set by the backends (imgui_impl_xxx files) to specify their capabilities.\n" + "Here we expose them as read-only fields to avoid breaking interactions with your backend."); + + // Make a local copy to avoid modifying actual backend flags. + // FIXME: We don't use BeginDisabled() to keep label bright, maybe we need a BeginReadonly() equivalent.. + ImGuiBackendFlags backend_flags = io.BackendFlags; + ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", &backend_flags, ImGuiBackendFlags_HasGamepad); + ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &backend_flags, ImGuiBackendFlags_HasMouseCursors); + ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", &backend_flags, ImGuiBackendFlags_HasSetMousePos); + ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", &backend_flags, ImGuiBackendFlags_RendererHasVtxOffset); + ImGui::TreePop(); + ImGui::Spacing(); + } + + IMGUI_DEMO_MARKER("Configuration/Style"); + if (ImGui::TreeNode("Style")) + { + HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function."); + ImGui::ShowStyleEditor(); + ImGui::TreePop(); + ImGui::Spacing(); + } + + IMGUI_DEMO_MARKER("Configuration/Capture, Logging"); + if (ImGui::TreeNode("Capture/Logging")) + { + HelpMarker( + "The logging API redirects all text output so you can easily capture the content of " + "a window or a block. Tree nodes can be automatically expanded.\n" + "Try opening any of the contents below in this window and then click one of the \"Log To\" button."); + ImGui::LogButtons(); + + HelpMarker("You can also call ImGui::LogText() to output directly to the log without a visual output."); + if (ImGui::Button("Copy \"Hello, world!\" to clipboard")) + { + ImGui::LogToClipboard(); + ImGui::LogText("Hello, world!"); + ImGui::LogFinish(); + } + ImGui::TreePop(); + } + } + + IMGUI_DEMO_MARKER("Window options"); + if (ImGui::CollapsingHeader("Window options")) + { + if (ImGui::BeginTable("split", 3)) + { + ImGui::TableNextColumn(); ImGui::Checkbox("No titlebar", &no_titlebar); + ImGui::TableNextColumn(); ImGui::Checkbox("No scrollbar", &no_scrollbar); + ImGui::TableNextColumn(); ImGui::Checkbox("No menu", &no_menu); + ImGui::TableNextColumn(); ImGui::Checkbox("No move", &no_move); + ImGui::TableNextColumn(); ImGui::Checkbox("No resize", &no_resize); + ImGui::TableNextColumn(); ImGui::Checkbox("No collapse", &no_collapse); + ImGui::TableNextColumn(); ImGui::Checkbox("No close", &no_close); + ImGui::TableNextColumn(); ImGui::Checkbox("No nav", &no_nav); + ImGui::TableNextColumn(); ImGui::Checkbox("No background", &no_background); + ImGui::TableNextColumn(); ImGui::Checkbox("No bring to front", &no_bring_to_front); + ImGui::TableNextColumn(); ImGui::Checkbox("Unsaved document", &unsaved_document); + ImGui::EndTable(); + } + } + + // All demo contents + ShowDemoWindowWidgets(); + ShowDemoWindowLayout(); + ShowDemoWindowPopups(); + ShowDemoWindowTables(); + ShowDemoWindowInputs(); + + // End of ShowDemoWindow() + ImGui::PopItemWidth(); + ImGui::End(); +} + +static void ShowDemoWindowWidgets() +{ + IMGUI_DEMO_MARKER("Widgets"); + if (!ImGui::CollapsingHeader("Widgets")) + return; + + static bool disable_all = false; // The Checkbox for that is inside the "Disabled" section at the bottom + if (disable_all) + ImGui::BeginDisabled(); + + IMGUI_DEMO_MARKER("Widgets/Basic"); + if (ImGui::TreeNode("Basic")) + { + ImGui::SeparatorText("General"); + + IMGUI_DEMO_MARKER("Widgets/Basic/Button"); + static int clicked = 0; + if (ImGui::Button("Button")) + clicked++; + if (clicked & 1) + { + ImGui::SameLine(); + ImGui::Text("Thanks for clicking me!"); + } + + IMGUI_DEMO_MARKER("Widgets/Basic/Checkbox"); + static bool check = true; + ImGui::Checkbox("checkbox", &check); + + IMGUI_DEMO_MARKER("Widgets/Basic/RadioButton"); + static int e = 0; + ImGui::RadioButton("radio a", &e, 0); ImGui::SameLine(); + ImGui::RadioButton("radio b", &e, 1); ImGui::SameLine(); + ImGui::RadioButton("radio c", &e, 2); + + // Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style. + IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Colored)"); + for (int i = 0; i < 7; i++) + { + if (i > 0) + ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.8f, 0.8f)); + ImGui::Button("Click"); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + + // Use AlignTextToFramePadding() to align text baseline to the baseline of framed widgets elements + // (otherwise a Text+SameLine+Button sequence will have the text a little too high by default!) + // See 'Demo->Layout->Text Baseline Alignment' for details. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Hold to repeat:"); + ImGui::SameLine(); + + // Arrow buttons with Repeater + IMGUI_DEMO_MARKER("Widgets/Basic/Buttons (Repeating)"); + static int counter = 0; + float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::PushButtonRepeat(true); + if (ImGui::ArrowButton("##left", ImGuiDir_Left)) { counter--; } + ImGui::SameLine(0.0f, spacing); + if (ImGui::ArrowButton("##right", ImGuiDir_Right)) { counter++; } + ImGui::PopButtonRepeat(); + ImGui::SameLine(); + ImGui::Text("%d", counter); + + { + // Tooltips + IMGUI_DEMO_MARKER("Widgets/Basic/Tooltips"); + //ImGui::AlignTextToFramePadding(); + ImGui::Text("Tooltips:"); + + ImGui::SameLine(); + ImGui::SmallButton("Button"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip"); + + ImGui::SameLine(); + ImGui::SmallButton("Fancy"); + if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) + { + ImGui::Text("I am a fancy tooltip"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Curve", arr, IM_ARRAYSIZE(arr)); + ImGui::Text("Sin(time) = %f", sinf((float)ImGui::GetTime())); + ImGui::EndTooltip(); + } + + ImGui::SameLine(); + ImGui::SmallButton("Delayed"); + if (ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal)) // With a delay + ImGui::SetTooltip("I am a tooltip with a delay."); + + ImGui::SameLine(); + HelpMarker( + "Tooltip are created by using the IsItemHovered() function over any kind of item."); + } + + ImGui::LabelText("label", "Value"); + + ImGui::SeparatorText("Inputs"); + + { + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + IMGUI_DEMO_MARKER("Widgets/Basic/InputText"); + static char str0[128] = "Hello, world!"; + ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0)); + ImGui::SameLine(); HelpMarker( + "USER:\n" + "Hold SHIFT or use mouse to select text.\n" + "CTRL+Left/Right to word jump.\n" + "CTRL+A or Double-Click to select all.\n" + "CTRL+X,CTRL+C,CTRL+V clipboard.\n" + "CTRL+Z,CTRL+Y undo/redo.\n" + "ESCAPE to revert.\n\n" + "PROGRAMMER:\n" + "You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() " + "to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated " + "in imgui_demo.cpp)."); + + static char str1[128] = ""; + ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1)); + + IMGUI_DEMO_MARKER("Widgets/Basic/InputInt, InputFloat"); + static int i0 = 123; + ImGui::InputInt("input int", &i0); + + static float f0 = 0.001f; + ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f"); + + static double d0 = 999999.00000001; + ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f"); + + static float f1 = 1.e10f; + ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e"); + ImGui::SameLine(); HelpMarker( + "You can input value using the scientific notation,\n" + " e.g. \"1e+8\" becomes \"100000000\"."); + + static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + ImGui::InputFloat3("input float3", vec4a); + } + + ImGui::SeparatorText("Drags"); + + { + IMGUI_DEMO_MARKER("Widgets/Basic/DragInt, DragFloat"); + static int i1 = 50, i2 = 42; + ImGui::DragInt("drag int", &i1, 1); + ImGui::SameLine(); HelpMarker( + "Click and drag to edit value.\n" + "Hold SHIFT/ALT for faster/slower edit.\n" + "Double-click or CTRL+click to input value."); + + ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%", ImGuiSliderFlags_AlwaysClamp); + + static float f1 = 1.00f, f2 = 0.0067f; + ImGui::DragFloat("drag float", &f1, 0.005f); + ImGui::DragFloat("drag small float", &f2, 0.0001f, 0.0f, 0.0f, "%.06f ns"); + } + + ImGui::SeparatorText("Sliders"); + + { + IMGUI_DEMO_MARKER("Widgets/Basic/SliderInt, SliderFloat"); + static int i1 = 0; + ImGui::SliderInt("slider int", &i1, -1, 3); + ImGui::SameLine(); HelpMarker("CTRL+click to input value."); + + static float f1 = 0.123f, f2 = 0.0f; + ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f"); + ImGui::SliderFloat("slider float (log)", &f2, -10.0f, 10.0f, "%.4f", ImGuiSliderFlags_Logarithmic); + + IMGUI_DEMO_MARKER("Widgets/Basic/SliderAngle"); + static float angle = 0.0f; + ImGui::SliderAngle("slider angle", &angle); + + // Using the format string to display a name instead of an integer. + // Here we completely omit '%d' from the format string, so it'll only display a name. + // This technique can also be used with DragInt(). + IMGUI_DEMO_MARKER("Widgets/Basic/Slider (enum)"); + enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT }; + static int elem = Element_Fire; + const char* elems_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" }; + const char* elem_name = (elem >= 0 && elem < Element_COUNT) ? elems_names[elem] : "Unknown"; + ImGui::SliderInt("slider enum", &elem, 0, Element_COUNT - 1, elem_name); + ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer."); + } + + ImGui::SeparatorText("Selectors/Pickers"); + + { + IMGUI_DEMO_MARKER("Widgets/Basic/ColorEdit3, ColorEdit4"); + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "Click and hold to use drag and drop.\n" + "Right-click on the color square to show options.\n" + "CTRL+click on individual component to input value.\n"); + + ImGui::ColorEdit4("color 2", col2); + } + + { + // Using the _simplified_ one-liner Combo() api here + // See "Combo" section for examples of how to use the more flexible BeginCombo()/EndCombo() api. + IMGUI_DEMO_MARKER("Widgets/Basic/Combo"); + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIIIIII", "JJJJ", "KKKKKKK" }; + static int item_current = 0; + ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items)); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner Combo API here.\nRefer to the \"Combo\" section below for an explanation of how to use the more flexible and general BeginCombo/EndCombo API."); + } + + { + // Using the _simplified_ one-liner ListBox() api here + // See "List boxes" section for examples of how to use the more flexible BeginListBox()/EndListBox() api. + IMGUI_DEMO_MARKER("Widgets/Basic/ListBox"); + const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi", "Mango", "Orange", "Pineapple", "Strawberry", "Watermelon" }; + static int item_current = 1; + ImGui::ListBox("listbox", &item_current, items, IM_ARRAYSIZE(items), 4); + ImGui::SameLine(); HelpMarker( + "Using the simplified one-liner ListBox API here.\nRefer to the \"List boxes\" section below for an explanation of how to use the more flexible and general BeginListBox/EndListBox API."); + } + + ImGui::TreePop(); + } + + // Testing ImGuiOnceUponAFrame helper. + //static ImGuiOnceUponAFrame once; + //for (int i = 0; i < 5; i++) + // if (once) + // ImGui::Text("This will be displayed only once."); + + IMGUI_DEMO_MARKER("Widgets/Trees"); + if (ImGui::TreeNode("Trees")) + { + IMGUI_DEMO_MARKER("Widgets/Trees/Basic trees"); + if (ImGui::TreeNode("Basic trees")) + { + for (int i = 0; i < 5; i++) + { + // Use SetNextItemOpen() so set the default state of a node to be open. We could + // also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing! + if (i == 0) + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + + if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i)) + { + ImGui::Text("blah blah"); + ImGui::SameLine(); + if (ImGui::SmallButton("button")) {} + ImGui::TreePop(); + } + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Trees/Advanced, with Selectable nodes"); + if (ImGui::TreeNode("Advanced, with Selectable nodes")) + { + HelpMarker( + "This is a more typical looking tree with selectable nodes.\n" + "Click to select, CTRL+Click to toggle, click on arrows or double-click to open."); + static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth; + static bool align_label_with_current_x_position = false; + static bool test_drag_and_drop = false; + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", &base_flags, ImGuiTreeNodeFlags_OpenOnArrow); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", &base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", &base_flags, ImGuiTreeNodeFlags_SpanAvailWidth); ImGui::SameLine(); HelpMarker("Extend hit area to all available width instead of allowing more items to be laid out after the node."); + ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", &base_flags, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::Checkbox("Align label with current X position", &align_label_with_current_x_position); + ImGui::Checkbox("Test tree node as drag source", &test_drag_and_drop); + ImGui::Text("Hello!"); + if (align_label_with_current_x_position) + ImGui::Unindent(ImGui::GetTreeNodeToLabelSpacing()); + + // 'selection_mask' is dumb representation of what may be user-side selection state. + // You may retain selection state inside or outside your objects in whatever format you see fit. + // 'node_clicked' is temporary storage of what node we have clicked to process selection at the end + /// of the loop. May be a pointer to your own node type, etc. + static int selection_mask = (1 << 2); + int node_clicked = -1; + for (int i = 0; i < 6; i++) + { + // Disable the default "open on single-click behavior" + set Selected flag according to our selection. + // To alter selection we use IsItemClicked() && !IsItemToggledOpen(), so clicking on an arrow doesn't alter selection. + ImGuiTreeNodeFlags node_flags = base_flags; + const bool is_selected = (selection_mask & (1 << i)) != 0; + if (is_selected) + node_flags |= ImGuiTreeNodeFlags_Selected; + if (i < 3) + { + // Items 0..2 are Tree Node + bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i); + if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + if (node_open) + { + ImGui::BulletText("Blah blah\nBlah Blah"); + ImGui::TreePop(); + } + } + else + { + // Items 3..5 are Tree Leaves + // The only reason we use TreeNode at all is to allow selection of the leaf. Otherwise we can + // use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text(). + node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet + ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i); + if (ImGui::IsItemClicked() && !ImGui::IsItemToggledOpen()) + node_clicked = i; + if (test_drag_and_drop && ImGui::BeginDragDropSource()) + { + ImGui::SetDragDropPayload("_TREENODE", NULL, 0); + ImGui::Text("This is a drag and drop source"); + ImGui::EndDragDropSource(); + } + } + } + if (node_clicked != -1) + { + // Update selection state + // (process outside of tree loop to avoid visual inconsistencies during the clicking frame) + if (ImGui::GetIO().KeyCtrl) + selection_mask ^= (1 << node_clicked); // CTRL+click to toggle + else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, may want to preserve selection when clicking on item that is part of the selection + selection_mask = (1 << node_clicked); // Click to single-select + } + if (align_label_with_current_x_position) + ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing()); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Collapsing Headers"); + if (ImGui::TreeNode("Collapsing Headers")) + { + static bool closable_group = true; + ImGui::Checkbox("Show 2nd header", &closable_group); + if (ImGui::CollapsingHeader("Header", ImGuiTreeNodeFlags_None)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("Some content %d", i); + } + if (ImGui::CollapsingHeader("Header with a close button", &closable_group)) + { + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + for (int i = 0; i < 5; i++) + ImGui::Text("More content %d", i); + } + /* + if (ImGui::CollapsingHeader("Header with a bullet", ImGuiTreeNodeFlags_Bullet)) + ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered()); + */ + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Bullets"); + if (ImGui::TreeNode("Bullets")) + { + ImGui::BulletText("Bullet point 1"); + ImGui::BulletText("Bullet point 2\nOn multiple lines"); + if (ImGui::TreeNode("Tree node")) + { + ImGui::BulletText("Another bullet point"); + ImGui::TreePop(); + } + ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)"); + ImGui::Bullet(); ImGui::SmallButton("Button"); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text"); + if (ImGui::TreeNode("Text")) + { + IMGUI_DEMO_MARKER("Widgets/Text/Colored Text"); + if (ImGui::TreeNode("Colorful Text")) + { + // Using shortcut. You can use PushStyleColor()/PopStyleColor() for more flexibility. + ImGui::TextColored(ImVec4(1.0f, 0.0f, 1.0f, 1.0f), "Pink"); + ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.0f), "Yellow"); + ImGui::TextDisabled("Disabled"); + ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle."); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text/Word Wrapping"); + if (ImGui::TreeNode("Word Wrapping")) + { + // Using shortcut. You can use PushTextWrapPos()/PopTextWrapPos() for more flexibility. + ImGui::TextWrapped( + "This text should automatically wrap on the edge of the window. The current implementation " + "for text wrapping follows simple rules suitable for English and possibly other languages."); + ImGui::Spacing(); + + static float wrap_width = 200.0f; + ImGui::SliderFloat("Wrap width", &wrap_width, -20, 600, "%.0f"); + + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + for (int n = 0; n < 2; n++) + { + ImGui::Text("Test paragraph %d:", n); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 marker_min = ImVec2(pos.x + wrap_width, pos.y); + ImVec2 marker_max = ImVec2(pos.x + wrap_width + 10, pos.y + ImGui::GetTextLineHeight()); + ImGui::PushTextWrapPos(ImGui::GetCursorPos().x + wrap_width); + if (n == 0) + ImGui::Text("The lazy dog is a good dog. This paragraph should fit within %.0f pixels. Testing a 1 character word. The quick brown fox jumps over the lazy dog.", wrap_width); + else + ImGui::Text("aaaaaaaa bbbbbbbb, c cccccccc,dddddddd. d eeeeeeee ffffffff. gggggggg!hhhhhhhh"); + + // Draw actual text bounding box, following by marker of our expected limit (should not overlap!) + draw_list->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + draw_list->AddRectFilled(marker_min, marker_max, IM_COL32(255, 0, 255, 255)); + ImGui::PopTextWrapPos(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text/UTF-8 Text"); + if (ImGui::TreeNode("UTF-8 Text")) + { + // UTF-8 test with Japanese characters + // (Needs a suitable font? Try "Google Noto" or "Arial Unicode". See docs/FONTS.md for details.) + // - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8 + // - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. in Visual Studio, you + // can save your source files as 'UTF-8 without signature'). + // - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 + // CHARACTERS IN THIS SOURCE FILE. Instead we are encoding a few strings with hexadecimal constants. + // Don't do this in your application! Please use u8"text in any language" in your application! + // Note that characters values are preserved even by InputText() if the font cannot be displayed, + // so you can safely copy & paste garbled characters into another application. + ImGui::TextWrapped( + "CJK text will only appear if the font was loaded with the appropriate CJK character ranges. " + "Call io.Fonts->AddFontFromFileTTF() manually to load extra character ranges. " + "Read docs/FONTS.md for details."); + ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string. + ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)"); + static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e"; + //static char buf[32] = u8"NIHONGO"; // <- this is how you would write it with C++11, using real kanjis + ImGui::InputText("UTF-8 input", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Images"); + if (ImGui::TreeNode("Images")) + { + ImGuiIO& io = ImGui::GetIO(); + ImGui::TextWrapped( + "Below we are displaying the font texture (which is the only texture we have access to in this demo). " + "Use the 'ImTextureID' type as storage to pass pointers or identifier to your own texture data. " + "Hover the texture for a zoomed view!"); + + // Below we are displaying the font texture because it is the only texture we have access to inside the demo! + // Remember that ImTextureID is just storage for whatever you want it to be. It is essentially a value that + // will be passed to the rendering backend via the ImDrawCmd structure. + // If you use one of the default imgui_impl_XXXX.cpp rendering backend, they all have comments at the top + // of their respective source file to specify what they expect to be stored in ImTextureID, for example: + // - The imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer + // - The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier, etc. + // More: + // - If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers + // to ImGui::Image(), and gather width/height through your own functions, etc. + // - You can use ShowMetricsWindow() to inspect the draw data that are being passed to your renderer, + // it will help you debug issues if you are confused about it. + // - Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage(). + // - Read https://github.com/ocornut/imgui/blob/master/docs/FAQ.md + // - Read https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples + ImTextureID my_tex_id = io.Fonts->TexID; + float my_tex_w = (float)io.Fonts->TexWidth; + float my_tex_h = (float)io.Fonts->TexHeight; + { + static bool use_text_color_for_tint = false; + ImGui::Checkbox("Use Text Color for Tint", &use_text_color_for_tint); + ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImVec2 uv_min = ImVec2(0.0f, 0.0f); // Top-left + ImVec2 uv_max = ImVec2(1.0f, 1.0f); // Lower-right + ImVec4 tint_col = use_text_color_for_tint ? ImGui::GetStyleColorVec4(ImGuiCol_Text) : ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + ImVec4 border_col = ImGui::GetStyleColorVec4(ImGuiCol_Border); + ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), uv_min, uv_max, tint_col, border_col); + if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) + { + float region_sz = 32.0f; + float region_x = io.MousePos.x - pos.x - region_sz * 0.5f; + float region_y = io.MousePos.y - pos.y - region_sz * 0.5f; + float zoom = 4.0f; + if (region_x < 0.0f) { region_x = 0.0f; } + else if (region_x > my_tex_w - region_sz) { region_x = my_tex_w - region_sz; } + if (region_y < 0.0f) { region_y = 0.0f; } + else if (region_y > my_tex_h - region_sz) { region_y = my_tex_h - region_sz; } + ImGui::Text("Min: (%.2f, %.2f)", region_x, region_y); + ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz); + ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h); + ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h); + ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, tint_col, border_col); + ImGui::EndTooltip(); + } + } + + IMGUI_DEMO_MARKER("Widgets/Images/Textured buttons"); + ImGui::TextWrapped("And now some textured buttons.."); + static int pressed_count = 0; + for (int i = 0; i < 8; i++) + { + // UV coordinates are often (0.0f, 0.0f) and (1.0f, 1.0f) to display an entire textures. + // Here are trying to display only a 32x32 pixels area of the texture, hence the UV computation. + // Read about UV coordinates here: https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples + ImGui::PushID(i); + if (i > 0) + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(i - 1.0f, i - 1.0f)); + ImVec2 size = ImVec2(32.0f, 32.0f); // Size of the image we want to make visible + ImVec2 uv0 = ImVec2(0.0f, 0.0f); // UV coordinates for lower-left + ImVec2 uv1 = ImVec2(32.0f / my_tex_w, 32.0f / my_tex_h); // UV coordinates for (32,32) in our texture + ImVec4 bg_col = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); // Black background + ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f); // No tint + if (ImGui::ImageButton("", my_tex_id, size, uv0, uv1, bg_col, tint_col)) + pressed_count += 1; + if (i > 0) + ImGui::PopStyleVar(); + ImGui::PopID(); + ImGui::SameLine(); + } + ImGui::NewLine(); + ImGui::Text("Pressed %d times.", pressed_count); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Combo"); + if (ImGui::TreeNode("Combo")) + { + // Combo Boxes are also called "Dropdown" in other systems + // Expose flags as checkbox for the demo + static ImGuiComboFlags flags = 0; + ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", &flags, ImGuiComboFlags_PopupAlignLeft); + ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo"); + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", &flags, ImGuiComboFlags_NoArrowButton)) + flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both + if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", &flags, ImGuiComboFlags_NoPreview)) + flags &= ~ImGuiComboFlags_NoArrowButton; // Clear the other flag, as we cannot combine both + + // Using the generic BeginCombo() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + const char* combo_preview_value = items[item_current_idx]; // Pass in the preview value visible before opening the combo (it could be anything) + if (ImGui::BeginCombo("combo 1", combo_preview_value, flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndCombo(); + } + + // Simplified one-liner Combo() API, using values packed in a single constant string + // This is a convenience for when the selection set is small and known at compile-time. + static int item_current_2 = 0; + ImGui::Combo("combo 2 (one-liner)", &item_current_2, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + + // Simplified one-liner Combo() using an array of const char* + // This is not very useful (may obsolete): prefer using BeginCombo()/EndCombo() for full control. + static int item_current_3 = -1; // If the selection isn't within 0..count, Combo won't display a preview + ImGui::Combo("combo 3 (array)", &item_current_3, items, IM_ARRAYSIZE(items)); + + // Simplified one-liner Combo() using an accessor function + struct Funcs { static bool ItemGetter(void* data, int n, const char** out_str) { *out_str = ((const char**)data)[n]; return true; } }; + static int item_current_4 = 0; + ImGui::Combo("combo 4 (function)", &item_current_4, &Funcs::ItemGetter, items, IM_ARRAYSIZE(items)); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/List Boxes"); + if (ImGui::TreeNode("List boxes")) + { + // Using the generic BeginListBox() API, you have full control over how to display the combo contents. + // (your selection data could be an index, a pointer to the object, an id for the object, a flag intrusively + // stored in the object itself, etc.) + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" }; + static int item_current_idx = 0; // Here we store our selection data as an index. + if (ImGui::BeginListBox("listbox 1")) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + // Custom size: use all width, 5 items tall + ImGui::Text("Full-width:"); + if (ImGui::BeginListBox("##listbox 2", ImVec2(-FLT_MIN, 5 * ImGui::GetTextLineHeightWithSpacing()))) + { + for (int n = 0; n < IM_ARRAYSIZE(items); n++) + { + const bool is_selected = (item_current_idx == n); + if (ImGui::Selectable(items[n], is_selected)) + item_current_idx = n; + + // Set the initial focus when opening the combo (scrolling + keyboard navigation focus) + if (is_selected) + ImGui::SetItemDefaultFocus(); + } + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Selectables"); + if (ImGui::TreeNode("Selectables")) + { + // Selectable() has 2 overloads: + // - The one taking "bool selected" as a read-only selection information. + // When Selectable() has been clicked it returns true and you can alter selection state accordingly. + // - The one taking "bool* p_selected" as a read-write selection information (convenient in some cases) + // The earlier is more flexible, as in real application your selection may be stored in many different ways + // and not necessarily inside a bool value (e.g. in flags within objects, as an external list, etc). + IMGUI_DEMO_MARKER("Widgets/Selectables/Basic"); + if (ImGui::TreeNode("Basic")) + { + static bool selection[5] = { false, true, false, false, false }; + ImGui::Selectable("1. I am selectable", &selection[0]); + ImGui::Selectable("2. I am selectable", &selection[1]); + ImGui::Text("(I am not selectable)"); + ImGui::Selectable("4. I am selectable", &selection[3]); + if (ImGui::Selectable("5. I am double clickable", selection[4], ImGuiSelectableFlags_AllowDoubleClick)) + if (ImGui::IsMouseDoubleClicked(0)) + selection[4] = !selection[4]; + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Single Selection"); + if (ImGui::TreeNode("Selection State: Single Selection")) + { + static int selected = -1; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selected == n)) + selected = n; + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Multiple Selection"); + if (ImGui::TreeNode("Selection State: Multiple Selection")) + { + HelpMarker("Hold CTRL and click to select multiple items."); + static bool selection[5] = { false, false, false, false, false }; + for (int n = 0; n < 5; n++) + { + char buf[32]; + sprintf(buf, "Object %d", n); + if (ImGui::Selectable(buf, selection[n])) + { + if (!ImGui::GetIO().KeyCtrl) // Clear selection when CTRL is not held + memset(selection, 0, sizeof(selection)); + selection[n] ^= 1; + } + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Rendering more text into the same line"); + if (ImGui::TreeNode("Rendering more text into the same line")) + { + // Using the Selectable() override that takes "bool* p_selected" parameter, + // this function toggle your bool value automatically. + static bool selected[3] = { false, false, false }; + ImGui::Selectable("main.c", &selected[0]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::Selectable("Hello.cpp", &selected[1]); ImGui::SameLine(300); ImGui::Text("12,345 bytes"); + ImGui::Selectable("Hello.h", &selected[2]); ImGui::SameLine(300); ImGui::Text(" 2,345 bytes"); + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/In columns"); + if (ImGui::TreeNode("In columns")) + { + static bool selected[10] = {}; + + if (ImGui::BeginTable("split1", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i]); // FIXME-TABLE: Selection overlap + } + ImGui::EndTable(); + } + ImGui::Spacing(); + if (ImGui::BeginTable("split2", 3, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings | ImGuiTableFlags_Borders)) + { + for (int i = 0; i < 10; i++) + { + char label[32]; + sprintf(label, "Item %d", i); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Selectable(label, &selected[i], ImGuiSelectableFlags_SpanAllColumns); + ImGui::TableNextColumn(); + ImGui::Text("Some other contents"); + ImGui::TableNextColumn(); + ImGui::Text("123456"); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Grid"); + if (ImGui::TreeNode("Grid")) + { + static char selected[4][4] = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 1, 0 }, { 0, 0, 0, 1 } }; + + // Add in a bit of silly fun... + const float time = (float)ImGui::GetTime(); + const bool winning_state = memchr(selected, 0, sizeof(selected)) == NULL; // If all cells are selected... + if (winning_state) + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, ImVec2(0.5f + 0.5f * cosf(time * 2.0f), 0.5f + 0.5f * sinf(time * 3.0f))); + + for (int y = 0; y < 4; y++) + for (int x = 0; x < 4; x++) + { + if (x > 0) + ImGui::SameLine(); + ImGui::PushID(y * 4 + x); + if (ImGui::Selectable("Sailor", selected[y][x] != 0, 0, ImVec2(50, 50))) + { + // Toggle clicked cell + toggle neighbors + selected[y][x] ^= 1; + if (x > 0) { selected[y][x - 1] ^= 1; } + if (x < 3) { selected[y][x + 1] ^= 1; } + if (y > 0) { selected[y - 1][x] ^= 1; } + if (y < 3) { selected[y + 1][x] ^= 1; } + } + ImGui::PopID(); + } + + if (winning_state) + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + IMGUI_DEMO_MARKER("Widgets/Selectables/Alignment"); + if (ImGui::TreeNode("Alignment")) + { + HelpMarker( + "By default, Selectables uses style.SelectableTextAlign but it can be overridden on a per-item " + "basis using PushStyleVar(). You'll probably want to always keep your default situation to " + "left-align otherwise it becomes difficult to layout multiple items on a same line"); + static bool selected[3 * 3] = { true, false, true, false, true, false, true, false, true }; + for (int y = 0; y < 3; y++) + { + for (int x = 0; x < 3; x++) + { + ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f); + char name[32]; + sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y); + if (x > 0) ImGui::SameLine(); + ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment); + ImGui::Selectable(name, &selected[3 * y + x], ImGuiSelectableFlags_None, ImVec2(80, 80)); + ImGui::PopStyleVar(); + } + } + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // To wire InputText() with std::string or any other custom string type, + // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file. + IMGUI_DEMO_MARKER("Widgets/Text Input"); + if (ImGui::TreeNode("Text Input")) + { + IMGUI_DEMO_MARKER("Widgets/Text Input/Multi-line Text Input"); + if (ImGui::TreeNode("Multi-line Text Input")) + { + // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize + // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings. + static char text[1024 * 16] = + "/*\n" + " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n" + " the hexadecimal encoding of one offending instruction,\n" + " more formally, the invalid operand with locked CMPXCHG8B\n" + " instruction bug, is a design flaw in the majority of\n" + " Intel Pentium, Pentium MMX, and Pentium OverDrive\n" + " processors (all in the P5 microarchitecture).\n" + "*/\n\n" + "label:\n" + "\tlock cmpxchg8b eax\n"; + + static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput; + HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include in here)"); + ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", &flags, ImGuiInputTextFlags_ReadOnly); + ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", &flags, ImGuiInputTextFlags_AllowTabInput); + ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", &flags, ImGuiInputTextFlags_CtrlEnterForNewLine); + ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Filtered Text Input"); + if (ImGui::TreeNode("Filtered Text Input")) + { + struct TextFilters + { + // Return 0 (pass) if the character is 'i' or 'm' or 'g' or 'u' or 'i' + static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) + { + if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) + return 0; + return 1; + } + }; + + static char buf1[64] = ""; ImGui::InputText("default", buf1, 64); + static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal); + static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase); + static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase); + static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank); + static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Password input"); + if (ImGui::TreeNode("Password Input")) + { + static char password[64] = "password123"; + ImGui::InputText("password", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n"); + ImGui::InputTextWithHint("password (w/ hint)", "", password, IM_ARRAYSIZE(password), ImGuiInputTextFlags_Password); + ImGui::InputText("password (clear)", password, IM_ARRAYSIZE(password)); + ImGui::TreePop(); + } + + if (ImGui::TreeNode("Completion, History, Edit Callbacks")) + { + struct Funcs + { + static int MyCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackCompletion) + { + data->InsertChars(data->CursorPos, ".."); + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackHistory) + { + if (data->EventKey == ImGuiKey_UpArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Up!"); + data->SelectAll(); + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, "Pressed Down!"); + data->SelectAll(); + } + } + else if (data->EventFlag == ImGuiInputTextFlags_CallbackEdit) + { + // Toggle casing of first character + char c = data->Buf[0]; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) data->Buf[0] ^= 32; + data->BufDirty = true; + + // Increment a counter + int* p_int = (int*)data->UserData; + *p_int = *p_int + 1; + } + return 0; + } + }; + static char buf1[64]; + ImGui::InputText("Completion", buf1, 64, ImGuiInputTextFlags_CallbackCompletion, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we append \"..\" each time Tab is pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf2[64]; + ImGui::InputText("History", buf2, 64, ImGuiInputTextFlags_CallbackHistory, Funcs::MyCallback); + ImGui::SameLine(); HelpMarker("Here we replace and select text each time Up/Down are pressed. See 'Examples>Console' for a more meaningful demonstration of using this callback."); + + static char buf3[64]; + static int edit_count = 0; + ImGui::InputText("Edit", buf3, 64, ImGuiInputTextFlags_CallbackEdit, Funcs::MyCallback, (void*)&edit_count); + ImGui::SameLine(); HelpMarker("Here we toggle the casing of the first character on every edit + count edits."); + ImGui::SameLine(); ImGui::Text("(%d)", edit_count); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Input/Resize Callback"); + if (ImGui::TreeNode("Resize Callback")) + { + // To wire InputText() with std::string or any other custom string type, + // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper + // using your preferred type. See misc/cpp/imgui_stdlib.h for an implementation of this using std::string. + HelpMarker( + "Using ImGuiInputTextFlags_CallbackResize to wire your custom string type to InputText().\n\n" + "See misc/cpp/imgui_stdlib.h for an implementation of this for std::string."); + struct Funcs + { + static int MyResizeCallback(ImGuiInputTextCallbackData* data) + { + if (data->EventFlag == ImGuiInputTextFlags_CallbackResize) + { + ImVector* my_str = (ImVector*)data->UserData; + IM_ASSERT(my_str->begin() == data->Buf); + my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1 + data->Buf = my_str->begin(); + } + return 0; + } + + // Note: Because ImGui:: is a namespace you would typically add your own function into the namespace. + // For example, you code may declare a function 'ImGui::InputText(const char* label, MyString* my_str)' + static bool MyInputTextMultiline(const char* label, ImVector* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0) + { + IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0); + return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str); + } + }; + + // For this demo we are using ImVector as a string container. + // Note that because we need to store a terminating zero character, our size/capacity are 1 more + // than usually reported by a typical string class. + static ImVector my_str; + if (my_str.empty()) + my_str.push_back(0); + Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16)); + ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity()); + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + // Tabs + IMGUI_DEMO_MARKER("Widgets/Tabs"); + if (ImGui::TreeNode("Tabs")) + { + IMGUI_DEMO_MARKER("Widgets/Tabs/Basic"); + if (ImGui::TreeNode("Basic")) + { + ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + if (ImGui::BeginTabItem("Avocado")) + { + ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Broccoli")) + { + ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Cucumber")) + { + ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Tabs/Advanced & Close Button"); + if (ImGui::TreeNode("Advanced & Close Button")) + { + // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0). + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable; + ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", &tab_bar_flags, ImGuiTabBarFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", &tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs); + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", &tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton); + if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) + tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_; + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + // Tab Bar + const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" }; + static bool opened[4] = { true, true, true, true }; // Persistent user state + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + { + if (n > 0) { ImGui::SameLine(); } + ImGui::Checkbox(names[n], &opened[n]); + } + + // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): + // the underlying bool will be set to false when the tab is closed. + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + for (int n = 0; n < IM_ARRAYSIZE(opened); n++) + if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", names[n]); + if (n & 1) + ImGui::Text("I am an odd tab."); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Tabs/TabItemButton & Leading-Trailing flags"); + if (ImGui::TreeNode("TabItemButton & Leading/Trailing flags")) + { + static ImVector active_tabs; + static int next_tab_id = 0; + if (next_tab_id == 0) // Initialize with some default tabs + for (int i = 0; i < 3; i++) + active_tabs.push_back(next_tab_id++); + + // TabItemButton() and Leading/Trailing flags are distinct features which we will demo together. + // (It is possible to submit regular tabs with Leading/Trailing flags, or TabItemButton tabs without Leading/Trailing flags... + // but they tend to make more sense together) + static bool show_leading_button = true; + static bool show_trailing_button = true; + ImGui::Checkbox("Show Leading TabItemButton()", &show_leading_button); + ImGui::Checkbox("Show Trailing TabItemButton()", &show_trailing_button); + + // Expose some other flags which are useful to showcase how they interact with Leading/Trailing tabs + static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_AutoSelectNewTabs | ImGuiTabBarFlags_Reorderable | ImGuiTabBarFlags_FittingPolicyResizeDown; + ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", &tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown); + if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", &tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll)) + tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll); + + if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags)) + { + // Demo a Leading TabItemButton(): click the "?" button to open a menu + if (show_leading_button) + if (ImGui::TabItemButton("?", ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_NoTooltip)) + ImGui::OpenPopup("MyHelpMenu"); + if (ImGui::BeginPopup("MyHelpMenu")) + { + ImGui::Selectable("Hello!"); + ImGui::EndPopup(); + } + + // Demo Trailing Tabs: click the "+" button to add a new tab (in your app you may want to use a font icon instead of the "+") + // Note that we submit it before the regular tabs, but because of the ImGuiTabItemFlags_Trailing flag it will always appear at the end. + if (show_trailing_button) + if (ImGui::TabItemButton("+", ImGuiTabItemFlags_Trailing | ImGuiTabItemFlags_NoTooltip)) + active_tabs.push_back(next_tab_id++); // Add new tab + + // Submit our regular tabs + for (int n = 0; n < active_tabs.Size; ) + { + bool open = true; + char name[16]; + snprintf(name, IM_ARRAYSIZE(name), "%04d", active_tabs[n]); + if (ImGui::BeginTabItem(name, &open, ImGuiTabItemFlags_None)) + { + ImGui::Text("This is the %s tab!", name); + ImGui::EndTabItem(); + } + + if (!open) + active_tabs.erase(active_tabs.Data + n); + else + n++; + } + + ImGui::EndTabBar(); + } + ImGui::Separator(); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // Plot/Graph widgets are not very good. + // Consider using a third-party library such as ImPlot: https://github.com/epezent/implot + // (see others https://github.com/ocornut/imgui/wiki/Useful-Extensions) + IMGUI_DEMO_MARKER("Widgets/Plotting"); + if (ImGui::TreeNode("Plotting")) + { + static bool animate = true; + ImGui::Checkbox("Animate", &animate); + + // Plot as lines and plot as histogram + IMGUI_DEMO_MARKER("Widgets/Plotting/PlotLines, PlotHistogram"); + static float arr[] = { 0.6f, 0.1f, 1.0f, 0.5f, 0.92f, 0.1f, 0.2f }; + ImGui::PlotLines("Frame Times", arr, IM_ARRAYSIZE(arr)); + ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0, 80.0f)); + + // Fill an array of contiguous float values to plot + // Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float + // and the sizeof() of your structure in the "stride" parameter. + static float values[90] = {}; + static int values_offset = 0; + static double refresh_time = 0.0; + if (!animate || refresh_time == 0.0) + refresh_time = ImGui::GetTime(); + while (refresh_time < ImGui::GetTime()) // Create data at fixed 60 Hz rate for the demo + { + static float phase = 0.0f; + values[values_offset] = cosf(phase); + values_offset = (values_offset + 1) % IM_ARRAYSIZE(values); + phase += 0.10f * values_offset; + refresh_time += 1.0f / 60.0f; + } + + // Plots can display overlay texts + // (in this example, we will display an average value) + { + float average = 0.0f; + for (int n = 0; n < IM_ARRAYSIZE(values); n++) + average += values[n]; + average /= (float)IM_ARRAYSIZE(values); + char overlay[32]; + sprintf(overlay, "avg %f", average); + ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0, 80.0f)); + } + + // Use functions to generate output + // FIXME: This is actually VERY awkward because current plot API only pass in indices. + // We probably want an API passing floats and user provide sample rate/count. + struct Funcs + { + static float Sin(void*, int i) { return sinf(i * 0.1f); } + static float Saw(void*, int i) { return (i & 1) ? 1.0f : -1.0f; } + }; + static int func_type = 0, display_count = 70; + ImGui::SeparatorText("Functions"); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::Combo("func", &func_type, "Sin\0Saw\0"); + ImGui::SameLine(); + ImGui::SliderInt("Sample count", &display_count, 1, 400); + float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw; + ImGui::PlotLines("Lines", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::PlotHistogram("Histogram", func, NULL, display_count, 0, NULL, -1.0f, 1.0f, ImVec2(0, 80)); + ImGui::Separator(); + + // Animate a simple progress bar + IMGUI_DEMO_MARKER("Widgets/Plotting/ProgressBar"); + static float progress = 0.0f, progress_dir = 1.0f; + if (animate) + { + progress += progress_dir * 0.4f * ImGui::GetIO().DeltaTime; + if (progress >= +1.1f) { progress = +1.1f; progress_dir *= -1.0f; } + if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; } + } + + // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width, + // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth. + ImGui::ProgressBar(progress, ImVec2(0.0f, 0.0f)); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Text("Progress Bar"); + + float progress_saturated = IM_CLAMP(progress, 0.0f, 1.0f); + char buf[32]; + sprintf(buf, "%d/%d", (int)(progress_saturated * 1753), 1753); + ImGui::ProgressBar(progress, ImVec2(0.f, 0.f), buf); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Color"); + if (ImGui::TreeNode("Color/Picker Widgets")) + { + static ImVec4 color = ImVec4(114.0f / 255.0f, 144.0f / 255.0f, 154.0f / 255.0f, 200.0f / 255.0f); + + static bool alpha_preview = true; + static bool alpha_half_preview = false; + static bool drag_and_drop = true; + static bool options_menu = true; + static bool hdr = false; + ImGui::SeparatorText("Options"); + ImGui::Checkbox("With Alpha Preview", &alpha_preview); + ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview); + ImGui::Checkbox("With Drag and Drop", &drag_and_drop); + ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options."); + ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets."); + ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit"); + ImGui::SeparatorText("Inline color editor"); + ImGui::Text("Color widget:"); + ImGui::SameLine(); HelpMarker( + "Click on the color square to open a color picker.\n" + "CTRL+click on individual component to input value.\n"); + ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (HSV, with Alpha)"); + ImGui::Text("Color widget HSV with Alpha:"); + ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorEdit (float display)"); + ImGui::Text("Color widget with Float Display:"); + ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with Picker)"); + ImGui::Text("Color button with Picker:"); + ImGui::SameLine(); HelpMarker( + "With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\n" + "With the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only " + "be used for the tooltip and picker popup."); + ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (with custom Picker popup)"); + ImGui::Text("Color button with Custom Picker Popup:"); + + // Generate a default palette. The palette will persist and can be edited. + static bool saved_palette_init = true; + static ImVec4 saved_palette[32] = {}; + if (saved_palette_init) + { + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, + saved_palette[n].x, saved_palette[n].y, saved_palette[n].z); + saved_palette[n].w = 1.0f; // Alpha + } + saved_palette_init = false; + } + + static ImVec4 backup_color; + bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags); + ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x); + open_popup |= ImGui::Button("Palette"); + if (open_popup) + { + ImGui::OpenPopup("mypicker"); + backup_color = color; + } + if (ImGui::BeginPopup("mypicker")) + { + ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!"); + ImGui::Separator(); + ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview); + ImGui::SameLine(); + + ImGui::BeginGroup(); // Lock X position + ImGui::Text("Current"); + ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40)); + ImGui::Text("Previous"); + if (ImGui::ColorButton("##previous", backup_color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60, 40))) + color = backup_color; + ImGui::Separator(); + ImGui::Text("Palette"); + for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++) + { + ImGui::PushID(n); + if ((n % 8) != 0) + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemSpacing.y); + + ImGuiColorEditFlags palette_button_flags = ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip; + if (ImGui::ColorButton("##palette", saved_palette[n], palette_button_flags, ImVec2(20, 20))) + color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha! + + // Allow user to drop colors into each palette entry. Note that ColorButton() is already a + // drag source by default, unless specifying the ImGuiColorEditFlags_NoDragDrop flag. + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 3); + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + memcpy((float*)&saved_palette[n], payload->Data, sizeof(float) * 4); + ImGui::EndDragDropTarget(); + } + + ImGui::PopID(); + } + ImGui::EndGroup(); + ImGui::EndPopup(); + } + + IMGUI_DEMO_MARKER("Widgets/Color/ColorButton (simple)"); + ImGui::Text("Color button only:"); + static bool no_border = false; + ImGui::Checkbox("ImGuiColorEditFlags_NoBorder", &no_border); + ImGui::ColorButton("MyColor##3c", *(ImVec4*)&color, misc_flags | (no_border ? ImGuiColorEditFlags_NoBorder : 0), ImVec2(80, 80)); + + IMGUI_DEMO_MARKER("Widgets/Color/ColorPicker"); + ImGui::SeparatorText("Color picker"); + static bool alpha = true; + static bool alpha_bar = true; + static bool side_preview = true; + static bool ref_color = false; + static ImVec4 ref_color_v(1.0f, 0.0f, 1.0f, 0.5f); + static int display_mode = 0; + static int picker_mode = 0; + ImGui::Checkbox("With Alpha", &alpha); + ImGui::Checkbox("With Alpha Bar", &alpha_bar); + ImGui::Checkbox("With Side Preview", &side_preview); + if (side_preview) + { + ImGui::SameLine(); + ImGui::Checkbox("With Ref Color", &ref_color); + if (ref_color) + { + ImGui::SameLine(); + ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags); + } + } + ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0"); + ImGui::SameLine(); HelpMarker( + "ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, " + "but the user can change it with a right-click on those inputs.\n\nColorPicker defaults to displaying RGB+HSV+Hex " + "if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions()."); + ImGui::SameLine(); HelpMarker("When not specified explicitly (Auto/Current mode), user can right-click the picker to change mode."); + ImGuiColorEditFlags flags = misc_flags; + if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4() + if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar; + if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview; + if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar; + if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel; + if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays + if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode + if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV; + if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex; + ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL); + + ImGui::Text("Set defaults in code:"); + ImGui::SameLine(); HelpMarker( + "SetColorEditOptions() is designed to allow you to set boot-time default.\n" + "We don't have Push/Pop functions because you can force options on a per-widget basis if needed," + "and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid" + "encouraging you to persistently save values that aren't forward-compatible."); + if (ImGui::Button("Default: Uint8 + HSV + Hue Bar")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar); + if (ImGui::Button("Default: Float + HDR + Hue Wheel")) + ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel); + + // Always both a small version of both types of pickers (to make it more visible in the demo to people who are skimming quickly through it) + ImGui::Text("Both types:"); + float w = (ImGui::GetContentRegionAvail().x - ImGui::GetStyle().ItemSpacing.y) * 0.40f; + ImGui::SetNextItemWidth(w); + ImGui::ColorPicker3("##MyColor##5", (float*)&color, ImGuiColorEditFlags_PickerHueBar | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); + ImGui::SameLine(); + ImGui::SetNextItemWidth(w); + ImGui::ColorPicker3("##MyColor##6", (float*)&color, ImGuiColorEditFlags_PickerHueWheel | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoAlpha); + + // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0) + static ImVec4 color_hsv(0.23f, 1.0f, 1.0f, 1.0f); // Stored as HSV! + ImGui::Spacing(); + ImGui::Text("HSV encoded colors"); + ImGui::SameLine(); HelpMarker( + "By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV" + "allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the" + "added benefit that you can manipulate hue values with the picker even when saturation or value are zero."); + ImGui::Text("Color widget with InputHSV:"); + ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float); + ImGui::DragFloat4("Raw HSV values", (float*)&color_hsv, 0.01f, 0.0f, 1.0f); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and Slider Flags"); + if (ImGui::TreeNode("Drag/Slider Flags")) + { + // Demonstrate using advanced flags for DragXXX and SliderXXX functions. Note that the flags are the same! + static ImGuiSliderFlags flags = ImGuiSliderFlags_None; + ImGui::CheckboxFlags("ImGuiSliderFlags_AlwaysClamp", &flags, ImGuiSliderFlags_AlwaysClamp); + ImGui::SameLine(); HelpMarker("Always clamp value to min/max bounds (if any) when input manually with CTRL+Click."); + ImGui::CheckboxFlags("ImGuiSliderFlags_Logarithmic", &flags, ImGuiSliderFlags_Logarithmic); + ImGui::SameLine(); HelpMarker("Enable logarithmic editing (more precision for small values)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoRoundToFormat", &flags, ImGuiSliderFlags_NoRoundToFormat); + ImGui::SameLine(); HelpMarker("Disable rounding underlying value to match precision of the format string (e.g. %.3f values are rounded to those 3 digits)."); + ImGui::CheckboxFlags("ImGuiSliderFlags_NoInput", &flags, ImGuiSliderFlags_NoInput); + ImGui::SameLine(); HelpMarker("Disable CTRL+Click or Enter key allowing to input text directly into the widget."); + + // Drags + static float drag_f = 0.5f; + static int drag_i = 50; + ImGui::Text("Underlying float value: %f", drag_f); + ImGui::DragFloat("DragFloat (0 -> 1)", &drag_f, 0.005f, 0.0f, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (0 -> +inf)", &drag_f, 0.005f, 0.0f, FLT_MAX, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> 1)", &drag_f, 0.005f, -FLT_MAX, 1.0f, "%.3f", flags); + ImGui::DragFloat("DragFloat (-inf -> +inf)", &drag_f, 0.005f, -FLT_MAX, +FLT_MAX, "%.3f", flags); + ImGui::DragInt("DragInt (0 -> 100)", &drag_i, 0.5f, 0, 100, "%d", flags); + + // Sliders + static float slider_f = 0.5f; + static int slider_i = 50; + ImGui::Text("Underlying float value: %f", slider_f); + ImGui::SliderFloat("SliderFloat (0 -> 1)", &slider_f, 0.0f, 1.0f, "%.3f", flags); + ImGui::SliderInt("SliderInt (0 -> 100)", &slider_i, 0, 100, "%d", flags); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Range Widgets"); + if (ImGui::TreeNode("Range Widgets")) + { + static float begin = 10, end = 90; + static int begin_i = 100, end_i = 1000; + ImGui::DragFloatRange2("range float", &begin, &end, 0.25f, 0.0f, 100.0f, "Min: %.1f %%", "Max: %.1f %%", ImGuiSliderFlags_AlwaysClamp); + ImGui::DragIntRange2("range int", &begin_i, &end_i, 5, 0, 1000, "Min: %d units", "Max: %d units"); + ImGui::DragIntRange2("range int (no bounds)", &begin_i, &end_i, 5, 0, 0, "Min: %d units", "Max: %d units"); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Data Types"); + if (ImGui::TreeNode("Data Types")) + { + // DragScalar/InputScalar/SliderScalar functions allow various data types + // - signed/unsigned + // - 8/16/32/64-bits + // - integer/float/double + // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum + // to pass the type, and passing all arguments by pointer. + // This is the reason the test code below creates local variables to hold "zero" "one" etc. for each type. + // In practice, if you frequently use a given type that is not covered by the normal API entry points, + // you can wrap it yourself inside a 1 line function which can take typed argument as value instead of void*, + // and then pass their address to the generic function. For example: + // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld") + // { + // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format); + // } + + // Setup limits (as helper variables so we can take their address, as explained above) + // Note: SliderScalar() functions have a maximum usable range of half the natural type maximum, hence the /2. + #ifndef LLONG_MIN + ImS64 LLONG_MIN = -9223372036854775807LL - 1; + ImS64 LLONG_MAX = 9223372036854775807LL; + ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1); + #endif + const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127; + const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255; + const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767; + const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535; + const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2; + const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2; + const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2; + const ImU64 u64_zero = 0, u64_one = 1, u64_fifty = 50, u64_min = 0, u64_max = ULLONG_MAX/2, u64_hi_a = ULLONG_MAX/2 - 100, u64_hi_b = ULLONG_MAX/2; + const float f32_zero = 0.f, f32_one = 1.f, f32_lo_a = -10000000000.0f, f32_hi_a = +10000000000.0f; + const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0; + + // State + static char s8_v = 127; + static ImU8 u8_v = 255; + static short s16_v = 32767; + static ImU16 u16_v = 65535; + static ImS32 s32_v = -1; + static ImU32 u32_v = (ImU32)-1; + static ImS64 s64_v = -1; + static ImU64 u64_v = (ImU64)-1; + static float f32_v = 0.123f; + static double f64_v = 90000.01234567890123456789; + + const float drag_speed = 0.2f; + static bool drag_clamp = false; + IMGUI_DEMO_MARKER("Widgets/Data Types/Drags"); + ImGui::SeparatorText("Drags"); + ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); + ImGui::SameLine(); HelpMarker( + "As with every widget in dear imgui, we never modify values unless there is a user interaction.\n" + "You can override the clamping limits by using CTRL+Click to input a value."); + ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL); + ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL); + ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL); + ImGui::DragScalar("drag s32 hex", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL, "0x%08X"); + ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms"); + ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL); + ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL); + ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f"); + ImGui::DragScalar("drag float log", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", ImGuiSliderFlags_Logarithmic); + ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams"); + ImGui::DragScalar("drag double log",ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", ImGuiSliderFlags_Logarithmic); + + IMGUI_DEMO_MARKER("Widgets/Data Types/Sliders"); + ImGui::SeparatorText("Sliders"); + ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d"); + ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u"); + ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d"); + ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u"); + ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d"); + ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d"); + ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d"); + ImGui::SliderScalar("slider s32 hex", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty, "0x%04X"); + ImGui::SliderScalar("slider u32 low", ImGuiDataType_U32, &u32_v, &u32_zero, &u32_fifty,"%u"); + ImGui::SliderScalar("slider u32 high", ImGuiDataType_U32, &u32_v, &u32_hi_a, &u32_hi_b, "%u"); + ImGui::SliderScalar("slider u32 full", ImGuiDataType_U32, &u32_v, &u32_min, &u32_max, "%u"); + ImGui::SliderScalar("slider s64 low", ImGuiDataType_S64, &s64_v, &s64_zero, &s64_fifty,"%" IM_PRId64); + ImGui::SliderScalar("slider s64 high", ImGuiDataType_S64, &s64_v, &s64_hi_a, &s64_hi_b, "%" IM_PRId64); + ImGui::SliderScalar("slider s64 full", ImGuiDataType_S64, &s64_v, &s64_min, &s64_max, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 low", ImGuiDataType_U64, &u64_v, &u64_zero, &u64_fifty,"%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 high", ImGuiDataType_U64, &u64_v, &u64_hi_a, &u64_hi_b, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider u64 full", ImGuiDataType_U64, &u64_v, &u64_min, &u64_max, "%" IM_PRIu64 " ms"); + ImGui::SliderScalar("slider float low", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one); + ImGui::SliderScalar("slider float low log", ImGuiDataType_Float, &f32_v, &f32_zero, &f32_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider float high", ImGuiDataType_Float, &f32_v, &f32_lo_a, &f32_hi_a, "%e"); + ImGui::SliderScalar("slider double low", ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f grams"); + ImGui::SliderScalar("slider double low log",ImGuiDataType_Double, &f64_v, &f64_zero, &f64_one, "%.10f", ImGuiSliderFlags_Logarithmic); + ImGui::SliderScalar("slider double high", ImGuiDataType_Double, &f64_v, &f64_lo_a, &f64_hi_a, "%e grams"); + + ImGui::SeparatorText("Sliders (reverse)"); + ImGui::SliderScalar("slider s8 reverse", ImGuiDataType_S8, &s8_v, &s8_max, &s8_min, "%d"); + ImGui::SliderScalar("slider u8 reverse", ImGuiDataType_U8, &u8_v, &u8_max, &u8_min, "%u"); + ImGui::SliderScalar("slider s32 reverse", ImGuiDataType_S32, &s32_v, &s32_fifty, &s32_zero, "%d"); + ImGui::SliderScalar("slider u32 reverse", ImGuiDataType_U32, &u32_v, &u32_fifty, &u32_zero, "%u"); + ImGui::SliderScalar("slider s64 reverse", ImGuiDataType_S64, &s64_v, &s64_fifty, &s64_zero, "%" IM_PRId64); + ImGui::SliderScalar("slider u64 reverse", ImGuiDataType_U64, &u64_v, &u64_fifty, &u64_zero, "%" IM_PRIu64 " ms"); + + IMGUI_DEMO_MARKER("Widgets/Data Types/Inputs"); + static bool inputs_step = true; + ImGui::SeparatorText("Inputs"); + ImGui::Checkbox("Show step buttons", &inputs_step); + ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d"); + ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u"); + ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d"); + ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%04X"); + ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u"); + ImGui::InputScalar("input u32 hex", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%08X"); + ImGui::InputScalar("input s64", ImGuiDataType_S64, &s64_v, inputs_step ? &s64_one : NULL); + ImGui::InputScalar("input u64", ImGuiDataType_U64, &u64_v, inputs_step ? &u64_one : NULL); + ImGui::InputScalar("input float", ImGuiDataType_Float, &f32_v, inputs_step ? &f32_one : NULL); + ImGui::InputScalar("input double", ImGuiDataType_Double, &f64_v, inputs_step ? &f64_one : NULL); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Multi-component Widgets"); + if (ImGui::TreeNode("Multi-component Widgets")) + { + static float vec4f[4] = { 0.10f, 0.20f, 0.30f, 0.44f }; + static int vec4i[4] = { 1, 5, 100, 255 }; + + ImGui::SeparatorText("2-wide"); + ImGui::InputFloat2("input float2", vec4f); + ImGui::DragFloat2("drag float2", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat2("slider float2", vec4f, 0.0f, 1.0f); + ImGui::InputInt2("input int2", vec4i); + ImGui::DragInt2("drag int2", vec4i, 1, 0, 255); + ImGui::SliderInt2("slider int2", vec4i, 0, 255); + + ImGui::SeparatorText("3-wide"); + ImGui::InputFloat3("input float3", vec4f); + ImGui::DragFloat3("drag float3", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat3("slider float3", vec4f, 0.0f, 1.0f); + ImGui::InputInt3("input int3", vec4i); + ImGui::DragInt3("drag int3", vec4i, 1, 0, 255); + ImGui::SliderInt3("slider int3", vec4i, 0, 255); + + ImGui::SeparatorText("4-wide"); + ImGui::InputFloat4("input float4", vec4f); + ImGui::DragFloat4("drag float4", vec4f, 0.01f, 0.0f, 1.0f); + ImGui::SliderFloat4("slider float4", vec4f, 0.0f, 1.0f); + ImGui::InputInt4("input int4", vec4i); + ImGui::DragInt4("drag int4", vec4i, 1, 0, 255); + ImGui::SliderInt4("slider int4", vec4i, 0, 255); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Vertical Sliders"); + if (ImGui::TreeNode("Vertical Sliders")) + { + const float spacing = 4; + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(spacing, spacing)); + + static int int_value = 0; + ImGui::VSliderInt("##int", ImVec2(18, 160), &int_value, 0, 5); + ImGui::SameLine(); + + static float values[7] = { 0.0f, 0.60f, 0.35f, 0.9f, 0.70f, 0.20f, 0.0f }; + ImGui::PushID("set1"); + for (int i = 0; i < 7; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleColor(ImGuiCol_FrameBg, (ImVec4)ImColor::HSV(i / 7.0f, 0.5f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgHovered, (ImVec4)ImColor::HSV(i / 7.0f, 0.6f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_FrameBgActive, (ImVec4)ImColor::HSV(i / 7.0f, 0.7f, 0.5f)); + ImGui::PushStyleColor(ImGuiCol_SliderGrab, (ImVec4)ImColor::HSV(i / 7.0f, 0.9f, 0.9f)); + ImGui::VSliderFloat("##v", ImVec2(18, 160), &values[i], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values[i]); + ImGui::PopStyleColor(4); + ImGui::PopID(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set2"); + static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f }; + const int rows = 3; + const ImVec2 small_slider_size(18, (float)(int)((160.0f - (rows - 1) * spacing) / rows)); + for (int nx = 0; nx < 4; nx++) + { + if (nx > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + for (int ny = 0; ny < rows; ny++) + { + ImGui::PushID(nx * rows + ny); + ImGui::VSliderFloat("##v", small_slider_size, &values2[nx], 0.0f, 1.0f, ""); + if (ImGui::IsItemActive() || ImGui::IsItemHovered()) + ImGui::SetTooltip("%.3f", values2[nx]); + ImGui::PopID(); + } + ImGui::EndGroup(); + } + ImGui::PopID(); + + ImGui::SameLine(); + ImGui::PushID("set3"); + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::PushStyleVar(ImGuiStyleVar_GrabMinSize, 40); + ImGui::VSliderFloat("##v", ImVec2(40, 160), &values[i], 0.0f, 1.0f, "%.2f\nsec"); + ImGui::PopStyleVar(); + ImGui::PopID(); + } + ImGui::PopID(); + ImGui::PopStyleVar(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and drop"); + if (ImGui::TreeNode("Drag and Drop")) + { + IMGUI_DEMO_MARKER("Widgets/Drag and drop/Standard widgets"); + if (ImGui::TreeNode("Drag and drop in standard widgets")) + { + // ColorEdit widgets automatically act as drag source and drag target. + // They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F + // to allow your own widgets to use colors in their drag and drop interaction. + // Also see 'Demo->Widgets->Color/Picker Widgets->Palette' demo. + HelpMarker("You can drag from the color squares."); + static float col1[3] = { 1.0f, 0.0f, 0.2f }; + static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::ColorEdit3("color 1", col1); + ImGui::ColorEdit4("color 2", col2); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and drop/Copy-swap items"); + if (ImGui::TreeNode("Drag and drop to copy/swap items")) + { + enum Mode + { + Mode_Copy, + Mode_Move, + Mode_Swap + }; + static int mode = 0; + if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine(); + if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine(); + if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; } + static const char* names[9] = + { + "Bobby", "Beatrice", "Betty", + "Brianna", "Barry", "Bernard", + "Bibi", "Blaine", "Bryn" + }; + for (int n = 0; n < IM_ARRAYSIZE(names); n++) + { + ImGui::PushID(n); + if ((n % 3) != 0) + ImGui::SameLine(); + ImGui::Button(names[n], ImVec2(60, 60)); + + // Our buttons are both drag sources and drag targets here! + if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) + { + // Set payload to carry the index of our item (could be anything) + ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); + + // Display preview (could be anything, e.g. when dragging an image we could decide to display + // the filename and a small preview of the image, etc.) + if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } + if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); } + if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); } + ImGui::EndDragDropSource(); + } + if (ImGui::BeginDragDropTarget()) + { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("DND_DEMO_CELL")) + { + IM_ASSERT(payload->DataSize == sizeof(int)); + int payload_n = *(const int*)payload->Data; + if (mode == Mode_Copy) + { + names[n] = names[payload_n]; + } + if (mode == Mode_Move) + { + names[n] = names[payload_n]; + names[payload_n] = ""; + } + if (mode == Mode_Swap) + { + const char* tmp = names[n]; + names[n] = names[payload_n]; + names[payload_n] = tmp; + } + } + ImGui::EndDragDropTarget(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Drag and Drop/Drag to reorder items (simple)"); + if (ImGui::TreeNode("Drag to reorder items (simple)")) + { + // Simple reordering + HelpMarker( + "We don't use the drag and drop api at all here! " + "Instead we query when the item is held but not hovered, and order items accordingly."); + static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" }; + for (int n = 0; n < IM_ARRAYSIZE(item_names); n++) + { + const char* item = item_names[n]; + ImGui::Selectable(item); + + if (ImGui::IsItemActive() && !ImGui::IsItemHovered()) + { + int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1); + if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names)) + { + item_names[n] = item_names[n_next]; + item_names[n_next] = item; + ImGui::ResetMouseDragDelta(); + } + } + } + ImGui::TreePop(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Querying Item Status (Edited,Active,Hovered etc.)"); + if (ImGui::TreeNode("Querying Item Status (Edited/Active/Hovered etc.)")) + { + // Select an item type + const char* item_names[] = + { + "Text", "Button", "Button (w/ repeat)", "Checkbox", "SliderFloat", "InputText", "InputTextMultiline", "InputFloat", + "InputFloat3", "ColorEdit4", "Selectable", "MenuItem", "TreeNode", "TreeNode (w/ double-click)", "Combo", "ListBox" + }; + static int item_type = 4; + static bool item_disabled = false; + ImGui::Combo("Item Type", &item_type, item_names, IM_ARRAYSIZE(item_names), IM_ARRAYSIZE(item_names)); + ImGui::SameLine(); + HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions. Note that the bool return value of most ImGui function is generally equivalent to calling ImGui::IsItemHovered()."); + ImGui::Checkbox("Item Disabled", &item_disabled); + + // Submit selected items so we can query their status in the code following it. + bool ret = false; + static bool b = false; + static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f }; + static char str[16] = {}; + if (item_disabled) + ImGui::BeginDisabled(true); + if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction + if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button + if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater) + if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox + if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item + if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing) + if (item_type == 6) { ret = ImGui::InputTextMultiline("ITEM: InputTextMultiline", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which uses a child window) + if (item_type == 7) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input + if (item_type == 8) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 9) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged) + if (item_type == 10){ ret = ImGui::Selectable("ITEM: Selectable"); } // Testing selectable item + if (item_type == 11){ ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy) + if (item_type == 12){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node + if (item_type == 13){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy. + if (item_type == 14){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::Combo("ITEM: Combo", ¤t, items, IM_ARRAYSIZE(items)); } + if (item_type == 15){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", ¤t, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); } + + bool hovered_delay_none = ImGui::IsItemHovered(); + bool hovered_delay_short = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayShort); + bool hovered_delay_normal = ImGui::IsItemHovered(ImGuiHoveredFlags_DelayNormal); + + // Display the values of IsItemHovered() and other common item state functions. + // Note that the ImGuiHoveredFlags_XXX flags can be combined. + // Because BulletText is an item itself and that would affect the output of IsItemXXX functions, + // we query every state in a single call to avoid storing them and to simplify the code. + ImGui::BulletText( + "Return value = %d\n" + "IsItemFocused() = %d\n" + "IsItemHovered() = %d\n" + "IsItemHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsItemHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsItemHovered(_AllowWhenOverlapped) = %d\n" + "IsItemHovered(_AllowWhenDisabled) = %d\n" + "IsItemHovered(_RectOnly) = %d\n" + "IsItemActive() = %d\n" + "IsItemEdited() = %d\n" + "IsItemActivated() = %d\n" + "IsItemDeactivated() = %d\n" + "IsItemDeactivatedAfterEdit() = %d\n" + "IsItemVisible() = %d\n" + "IsItemClicked() = %d\n" + "IsItemToggledOpen() = %d\n" + "GetItemRectMin() = (%.1f, %.1f)\n" + "GetItemRectMax() = (%.1f, %.1f)\n" + "GetItemRectSize() = (%.1f, %.1f)", + ret, + ImGui::IsItemFocused(), + ImGui::IsItemHovered(), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenOverlapped), + ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled), + ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly), + ImGui::IsItemActive(), + ImGui::IsItemEdited(), + ImGui::IsItemActivated(), + ImGui::IsItemDeactivated(), + ImGui::IsItemDeactivatedAfterEdit(), + ImGui::IsItemVisible(), + ImGui::IsItemClicked(), + ImGui::IsItemToggledOpen(), + ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y, + ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y, + ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y + ); + ImGui::BulletText( + "w/ Hovering Delay: None = %d, Fast %d, Normal = %d", hovered_delay_none, hovered_delay_short, hovered_delay_normal); + + if (item_disabled) + ImGui::EndDisabled(); + + char buf[1] = ""; + ImGui::InputText("unused", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_ReadOnly); + ImGui::SameLine(); + HelpMarker("This widget is only here to be able to tab-out of the widgets above and see e.g. Deactivated() status."); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Querying Window Status (Focused,Hovered etc.)"); + if (ImGui::TreeNode("Querying Window Status (Focused/Hovered etc.)")) + { + static bool embed_all_inside_a_child_window = false; + ImGui::Checkbox("Embed everything inside a child window for testing _RootWindow flag.", &embed_all_inside_a_child_window); + if (embed_all_inside_a_child_window) + ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20.0f), true); + + // Testing IsWindowFocused() function with its various flags. + ImGui::BulletText( + "IsWindowFocused() = %d\n" + "IsWindowFocused(_ChildWindows) = %d\n" + "IsWindowFocused(_ChildWindows|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_ChildWindows|_RootWindow) = %d\n" + "IsWindowFocused(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_RootWindow) = %d\n" + "IsWindowFocused(_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowFocused(_AnyWindow) = %d\n", + ImGui::IsWindowFocused(), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_ChildWindows | ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow), + ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_NoPopupHierarchy), + ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow)); + + // Testing IsWindowHovered() function with its various flags. + ImGui::BulletText( + "IsWindowHovered() = %d\n" + "IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n" + "IsWindowHovered(_ChildWindows) = %d\n" + "IsWindowHovered(_ChildWindows|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_ChildWindows|_RootWindow) = %d\n" + "IsWindowHovered(_ChildWindows|_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_RootWindow) = %d\n" + "IsWindowHovered(_RootWindow|_NoPopupHierarchy) = %d\n" + "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n" + "IsWindowHovered(_AnyWindow) = %d\n", + ImGui::IsWindowHovered(), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow), + ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_NoPopupHierarchy), + ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup), + ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow)); + + ImGui::BeginChild("child", ImVec2(0, 50), true); + ImGui::Text("This is another child window for testing the _ChildWindows flag."); + ImGui::EndChild(); + if (embed_all_inside_a_child_window) + ImGui::EndChild(); + + // Calling IsItemHovered() after begin returns the hovered status of the title bar. + // This is useful in particular if you want to create a context menu associated to the title bar of a window. + static bool test_window = false; + ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window); + if (test_window) + { + ImGui::Begin("Title bar Hovered/Active tests", &test_window); + if (ImGui::BeginPopupContextItem()) // <-- This is using IsItemHovered() + { + if (ImGui::MenuItem("Close")) { test_window = false; } + ImGui::EndPopup(); + } + ImGui::Text( + "IsItemHovered() after begin = %d (== is title bar hovered)\n" + "IsItemActive() after begin = %d (== is window being clicked/moved)\n", + ImGui::IsItemHovered(), ImGui::IsItemActive()); + ImGui::End(); + } + + ImGui::TreePop(); + } + + // Demonstrate BeginDisabled/EndDisabled using a checkbox located at the bottom of the section (which is a bit odd: + // logically we'd have this checkbox at the top of the section, but we don't want this feature to steal that space) + if (disable_all) + ImGui::EndDisabled(); + + IMGUI_DEMO_MARKER("Widgets/Disable Block"); + if (ImGui::TreeNode("Disable block")) + { + ImGui::Checkbox("Disable entire section above", &disable_all); + ImGui::SameLine(); HelpMarker("Demonstrate using BeginDisabled()/EndDisabled() across this section."); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Widgets/Text Filter"); + if (ImGui::TreeNode("Text Filter")) + { + // Helper class to easy setup a text filter. + // You may want to implement a more feature-full filtering scheme in your own application. + HelpMarker("Not a widget per-se, but ImGuiTextFilter is a helper to perform simple filtering on text strings."); + static ImGuiTextFilter filter; + ImGui::Text("Filter usage:\n" + " \"\" display all lines\n" + " \"xxx\" display lines containing \"xxx\"\n" + " \"xxx,yyy\" display lines containing \"xxx\" or \"yyy\"\n" + " \"-xxx\" hide lines containing \"xxx\""); + filter.Draw(); + const char* lines[] = { "aaa1.c", "bbb1.c", "ccc1.c", "aaa2.cpp", "bbb2.cpp", "ccc2.cpp", "abc.h", "hello, world" }; + for (int i = 0; i < IM_ARRAYSIZE(lines); i++) + if (filter.PassFilter(lines[i])) + ImGui::BulletText("%s", lines[i]); + ImGui::TreePop(); + } +} + +static void ShowDemoWindowLayout() +{ + IMGUI_DEMO_MARKER("Layout"); + if (!ImGui::CollapsingHeader("Layout & Scrolling")) + return; + + IMGUI_DEMO_MARKER("Layout/Child windows"); + if (ImGui::TreeNode("Child windows")) + { + ImGui::SeparatorText("Child windows"); + + HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window."); + static bool disable_mouse_wheel = false; + static bool disable_menu = false; + ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel); + ImGui::Checkbox("Disable Menu", &disable_menu); + + // Child 1: no border, enable horizontal scrollbar + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + ImGui::BeginChild("ChildL", ImVec2(ImGui::GetContentRegionAvail().x * 0.5f, 260), false, window_flags); + for (int i = 0; i < 100; i++) + ImGui::Text("%04d: scrollable region", i); + ImGui::EndChild(); + } + + ImGui::SameLine(); + + // Child 2: rounded border + { + ImGuiWindowFlags window_flags = ImGuiWindowFlags_None; + if (disable_mouse_wheel) + window_flags |= ImGuiWindowFlags_NoScrollWithMouse; + if (!disable_menu) + window_flags |= ImGuiWindowFlags_MenuBar; + ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f); + ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags); + if (!disable_menu && ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("Menu")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_Resizable | ImGuiTableFlags_NoSavedSettings)) + { + for (int i = 0; i < 100; i++) + { + char buf[32]; + sprintf(buf, "%03d", i); + ImGui::TableNextColumn(); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + ImGui::EndTable(); + } + ImGui::EndChild(); + ImGui::PopStyleVar(); + } + + ImGui::SeparatorText("Misc/Advanced"); + + // Demonstrate a few extra things + // - Changing ImGuiCol_ChildBg (which is transparent black in default styles) + // - Using SetCursorPos() to position child window (the child window is an item from the POV of parent window) + // You can also call SetNextWindowPos() to position the child window. The parent window will effectively + // layout from this position. + // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from + // the POV of the parent window). See 'Demo->Querying Status (Edited/Active/Hovered etc.)' for details. + { + static int offset_x = 0; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("Offset X", &offset_x, 1.0f, -1000, 1000); + + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + (float)offset_x); + ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100)); + ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None); + for (int n = 0; n < 50; n++) + ImGui::Text("Some test %d", n); + ImGui::EndChild(); + bool child_is_hovered = ImGui::IsItemHovered(); + ImVec2 child_rect_min = ImGui::GetItemRectMin(); + ImVec2 child_rect_max = ImGui::GetItemRectMax(); + ImGui::PopStyleColor(); + ImGui::Text("Hovered: %d", child_is_hovered); + ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Widgets Width"); + if (ImGui::TreeNode("Widgets Width")) + { + static float f = 0.0f; + static bool show_indented_items = true; + ImGui::Checkbox("Show indented items", &show_indented_items); + + // Use SetNextItemWidth() to set the width of a single upcoming item. + // Use PushItemWidth()/PopItemWidth() to set the width of a group of items. + // In real code use you'll probably want to choose width values that are proportional to your font size + // e.g. Using '20.0f * GetFontSize()' as width instead of '200.0f', etc. + + ImGui::Text("SetNextItemWidth/PushItemWidth(100)"); + ImGui::SameLine(); HelpMarker("Fixed width."); + ImGui::PushItemWidth(100); + ImGui::DragFloat("float##1b", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##1b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-100)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus 100"); + ImGui::PushItemWidth(-100); + ImGui::DragFloat("float##2a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##2b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)"); + ImGui::PushItemWidth(ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##3a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##3b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::Text("SetNextItemWidth/PushItemWidth(-GetContentRegionAvail().x * 0.5f)"); + ImGui::SameLine(); HelpMarker("Align to right edge minus half"); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::DragFloat("float##4a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##4b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + // Demonstrate using PushItemWidth to surround three items. + // Calling SetNextItemWidth() before each of them would have the same effect. + ImGui::Text("SetNextItemWidth/PushItemWidth(-FLT_MIN)"); + ImGui::SameLine(); HelpMarker("Align to right edge"); + ImGui::PushItemWidth(-FLT_MIN); + ImGui::DragFloat("##float5a", &f); + if (show_indented_items) + { + ImGui::Indent(); + ImGui::DragFloat("float (indented)##5b", &f); + ImGui::Unindent(); + } + ImGui::PopItemWidth(); + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout"); + if (ImGui::TreeNode("Basic Horizontal Layout")) + { + ImGui::TextWrapped("(Use ImGui::SameLine() to keep adding items to the right of the preceding item)"); + + // Text + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine"); + ImGui::Text("Two items: Hello"); ImGui::SameLine(); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Adjust spacing + ImGui::Text("More spacing: Hello"); ImGui::SameLine(0, 20); + ImGui::TextColored(ImVec4(1,1,0,1), "Sailor"); + + // Button + ImGui::AlignTextToFramePadding(); + ImGui::Text("Normal buttons"); ImGui::SameLine(); + ImGui::Button("Banana"); ImGui::SameLine(); + ImGui::Button("Apple"); ImGui::SameLine(); + ImGui::Button("Corniflower"); + + // Button + ImGui::Text("Small buttons"); ImGui::SameLine(); + ImGui::SmallButton("Like this one"); ImGui::SameLine(); + ImGui::Text("can fit within a text block."); + + // Aligned to arbitrary position. Easy/cheap column. + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (with offset)"); + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::Text("x=150"); + ImGui::SameLine(300); ImGui::Text("x=300"); + ImGui::Text("Aligned"); + ImGui::SameLine(150); ImGui::SmallButton("x=150"); + ImGui::SameLine(300); ImGui::SmallButton("x=300"); + + // Checkbox + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/SameLine (more)"); + static bool c1 = false, c2 = false, c3 = false, c4 = false; + ImGui::Checkbox("My", &c1); ImGui::SameLine(); + ImGui::Checkbox("Tailor", &c2); ImGui::SameLine(); + ImGui::Checkbox("Is", &c3); ImGui::SameLine(); + ImGui::Checkbox("Rich", &c4); + + // Various + static float f0 = 1.0f, f1 = 2.0f, f2 = 3.0f; + ImGui::PushItemWidth(80); + const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD" }; + static int item = -1; + ImGui::Combo("Combo", &item, items, IM_ARRAYSIZE(items)); ImGui::SameLine(); + ImGui::SliderFloat("X", &f0, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Y", &f1, 0.0f, 5.0f); ImGui::SameLine(); + ImGui::SliderFloat("Z", &f2, 0.0f, 5.0f); + ImGui::PopItemWidth(); + + ImGui::PushItemWidth(80); + ImGui::Text("Lists:"); + static int selection[4] = { 0, 1, 2, 3 }; + for (int i = 0; i < 4; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::PushID(i); + ImGui::ListBox("", &selection[i], items, IM_ARRAYSIZE(items)); + ImGui::PopID(); + //if (ImGui::IsItemHovered()) ImGui::SetTooltip("ListBox %d hovered", i); + } + ImGui::PopItemWidth(); + + // Dummy + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Dummy"); + ImVec2 button_sz(40, 40); + ImGui::Button("A", button_sz); ImGui::SameLine(); + ImGui::Dummy(button_sz); ImGui::SameLine(); + ImGui::Button("B", button_sz); + + // Manually wrapping + // (we should eventually provide this as an automatic layout feature, but for now you can do it manually) + IMGUI_DEMO_MARKER("Layout/Basic Horizontal Layout/Manual wrapping"); + ImGui::Text("Manual wrapping:"); + ImGuiStyle& style = ImGui::GetStyle(); + int buttons_count = 20; + float window_visible_x2 = ImGui::GetWindowPos().x + ImGui::GetWindowContentRegionMax().x; + for (int n = 0; n < buttons_count; n++) + { + ImGui::PushID(n); + ImGui::Button("Box", button_sz); + float last_button_x2 = ImGui::GetItemRectMax().x; + float next_button_x2 = last_button_x2 + style.ItemSpacing.x + button_sz.x; // Expected position if next button was on same line + if (n + 1 < buttons_count && next_button_x2 < window_visible_x2) + ImGui::SameLine(); + ImGui::PopID(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Groups"); + if (ImGui::TreeNode("Groups")) + { + HelpMarker( + "BeginGroup() basically locks the horizontal position for new line. " + "EndGroup() bundles the whole group so that you can use \"item\" functions such as " + "IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group."); + ImGui::BeginGroup(); + { + ImGui::BeginGroup(); + ImGui::Button("AAA"); + ImGui::SameLine(); + ImGui::Button("BBB"); + ImGui::SameLine(); + ImGui::BeginGroup(); + ImGui::Button("CCC"); + ImGui::Button("DDD"); + ImGui::EndGroup(); + ImGui::SameLine(); + ImGui::Button("EEE"); + ImGui::EndGroup(); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("First group hovered"); + } + // Capture the group size and create widgets using the same size + ImVec2 size = ImGui::GetItemRectSize(); + const float values[5] = { 0.5f, 0.20f, 0.80f, 0.60f, 0.25f }; + ImGui::PlotHistogram("##values", values, IM_ARRAYSIZE(values), 0, NULL, 0.0f, 1.0f, size); + + ImGui::Button("ACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::SameLine(); + ImGui::Button("REACTION", ImVec2((size.x - ImGui::GetStyle().ItemSpacing.x) * 0.5f, size.y)); + ImGui::EndGroup(); + ImGui::SameLine(); + + ImGui::Button("LEVERAGE\nBUZZWORD", size); + ImGui::SameLine(); + + if (ImGui::BeginListBox("List", size)) + { + ImGui::Selectable("Selected", true); + ImGui::Selectable("Not Selected", false); + ImGui::EndListBox(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Text Baseline Alignment"); + if (ImGui::TreeNode("Text Baseline Alignment")) + { + { + ImGui::BulletText("Text baseline:"); + ImGui::SameLine(); HelpMarker( + "This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. " + "Lines only composed of text or \"small\" widgets use less vertical space than lines with framed widgets."); + ImGui::Indent(); + + ImGui::Text("KO Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("Baseline of button will look misaligned with text.."); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + // (because we don't know what's coming after the Text() statement, we need to move the text baseline + // down by FramePadding.y ahead of time) + ImGui::AlignTextToFramePadding(); + ImGui::Text("OK Blahblah"); ImGui::SameLine(); + ImGui::Button("Some framed item"); ImGui::SameLine(); + HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y"); + + // SmallButton() uses the same vertical padding as Text + ImGui::Button("TEST##1"); ImGui::SameLine(); + ImGui::Text("TEST"); ImGui::SameLine(); + ImGui::SmallButton("TEST##2"); + + // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets. + ImGui::AlignTextToFramePadding(); + ImGui::Text("Text aligned to framed item"); ImGui::SameLine(); + ImGui::Button("Item##1"); ImGui::SameLine(); + ImGui::Text("Item"); ImGui::SameLine(); + ImGui::SmallButton("Item##2"); ImGui::SameLine(); + ImGui::Button("Item##3"); + + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Multi-line text:"); + ImGui::Indent(); + ImGui::Text("One\nTwo\nThree"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("One\nTwo\nThree"); + + ImGui::Button("HOP##1"); ImGui::SameLine(); + ImGui::Text("Banana"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + + ImGui::Button("HOP##2"); ImGui::SameLine(); + ImGui::Text("Hello\nWorld"); ImGui::SameLine(); + ImGui::Text("Banana"); + ImGui::Unindent(); + } + + ImGui::Spacing(); + + { + ImGui::BulletText("Misc items:"); + ImGui::Indent(); + + // SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button. + ImGui::Button("80x80", ImVec2(80, 80)); + ImGui::SameLine(); + ImGui::Button("50x50", ImVec2(50, 50)); + ImGui::SameLine(); + ImGui::Button("Button()"); + ImGui::SameLine(); + ImGui::SmallButton("SmallButton()"); + + // Tree + const float spacing = ImGui::GetStyle().ItemInnerSpacing.x; + ImGui::Button("Button##1"); + ImGui::SameLine(0.0f, spacing); + if (ImGui::TreeNode("Node##1")) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. + // Otherwise you can use SmallButton() (smaller fit). + ImGui::AlignTextToFramePadding(); + + // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add + // other contents below the node. + bool node_open = ImGui::TreeNode("Node##2"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2"); + if (node_open) + { + // Placeholder tree data + for (int i = 0; i < 6; i++) + ImGui::BulletText("Item %d..", i); + ImGui::TreePop(); + } + + // Bullet + ImGui::Button("Button##3"); + ImGui::SameLine(0.0f, spacing); + ImGui::BulletText("Bullet text"); + + ImGui::AlignTextToFramePadding(); + ImGui::BulletText("Node"); + ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4"); + ImGui::Unindent(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Scrolling"); + if (ImGui::TreeNode("Scrolling")) + { + // Vertical scroll functions + IMGUI_DEMO_MARKER("Layout/Scrolling/Vertical"); + HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position."); + + static int track_item = 50; + static bool enable_track = true; + static bool enable_extra_decorations = false; + static float scroll_to_off_px = 0.0f; + static float scroll_to_pos_px = 200.0f; + + ImGui::Checkbox("Decoration", &enable_extra_decorations); + + ImGui::Checkbox("Track", &enable_track); + ImGui::PushItemWidth(100); + ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d"); + + bool scroll_to_off = ImGui::Button("Scroll Offset"); + ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px"); + + bool scroll_to_pos = ImGui::Button("Scroll To Pos"); + ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px"); + ImGui::PopItemWidth(); + + if (scroll_to_off || scroll_to_pos) + enable_track = false; + + ImGuiStyle& style = ImGui::GetStyle(); + float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5; + if (child_w < 1.0f) + child_w = 1.0f; + ImGui::PushID("##VerticalScrolling"); + for (int i = 0; i < 5; i++) + { + if (i > 0) ImGui::SameLine(); + ImGui::BeginGroup(); + const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" }; + ImGui::TextUnformatted(names[i]); + + const ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0; + const ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + const bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(child_w, 200.0f), true, child_flags); + if (ImGui::BeginMenuBar()) + { + ImGui::TextUnformatted("abc"); + ImGui::EndMenuBar(); + } + if (scroll_to_off) + ImGui::SetScrollY(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom + } + else + { + ImGui::Text("Item %d", item); + } + } + } + float scroll_y = ImGui::GetScrollY(); + float scroll_max_y = ImGui::GetScrollMaxY(); + ImGui::EndChild(); + ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y); + ImGui::EndGroup(); + } + ImGui::PopID(); + + // Horizontal scroll functions + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal"); + ImGui::Spacing(); + HelpMarker( + "Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\n" + "Because the clipping rectangle of most window hides half worth of WindowPadding on the " + "left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the " + "equivalent SetScrollFromPosY(+1) wouldn't."); + ImGui::PushID("##HorizontalScrolling"); + for (int i = 0; i < 5; i++) + { + float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f; + ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0); + ImGuiID child_id = ImGui::GetID((void*)(intptr_t)i); + bool child_is_visible = ImGui::BeginChild(child_id, ImVec2(-100, child_height), true, child_flags); + if (scroll_to_off) + ImGui::SetScrollX(scroll_to_off_px); + if (scroll_to_pos) + ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f); + if (child_is_visible) // Avoid calling SetScrollHereY when running with culled items + { + for (int item = 0; item < 100; item++) + { + if (item > 0) + ImGui::SameLine(); + if (enable_track && item == track_item) + { + ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item); + ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right + } + else + { + ImGui::Text("Item %d", item); + } + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::SameLine(); + const char* names[] = { "Left", "25%", "Center", "75%", "Right" }; + ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x); + ImGui::Spacing(); + } + ImGui::PopID(); + + // Miscellaneous Horizontal Scrolling Demo + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal (more)"); + HelpMarker( + "Horizontal scrolling for a window is enabled via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\n" + "You may want to also explicitly specify content width by using SetNextWindowContentWidth() before Begin()."); + static int lines = 7; + ImGui::SliderInt("Lines", &lines, 1, 15); + ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2.0f, 1.0f)); + ImVec2 scrolling_child_size = ImVec2(0, ImGui::GetFrameHeightWithSpacing() * 7 + 30); + ImGui::BeginChild("scrolling", scrolling_child_size, true, ImGuiWindowFlags_HorizontalScrollbar); + for (int line = 0; line < lines; line++) + { + // Display random stuff. For the sake of this trivial demo we are using basic Button() + SameLine() + // If you want to create your own time line for a real application you may be better off manipulating + // the cursor position yourself, aka using SetCursorPos/SetCursorScreenPos to position the widgets + // yourself. You may also want to use the lower-level ImDrawList API. + int num_buttons = 10 + ((line & 1) ? line * 9 : line * 3); + for (int n = 0; n < num_buttons; n++) + { + if (n > 0) ImGui::SameLine(); + ImGui::PushID(n + line * 1000); + char num_buf[16]; + sprintf(num_buf, "%d", n); + const char* label = (!(n % 15)) ? "FizzBuzz" : (!(n % 3)) ? "Fizz" : (!(n % 5)) ? "Buzz" : num_buf; + float hue = n * 0.05f; + ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(hue, 0.6f, 0.6f)); + ImGui::PushStyleColor(ImGuiCol_ButtonHovered, (ImVec4)ImColor::HSV(hue, 0.7f, 0.7f)); + ImGui::PushStyleColor(ImGuiCol_ButtonActive, (ImVec4)ImColor::HSV(hue, 0.8f, 0.8f)); + ImGui::Button(label, ImVec2(40.0f + sinf((float)(line + n)) * 20.0f, 0.0f)); + ImGui::PopStyleColor(3); + ImGui::PopID(); + } + } + float scroll_x = ImGui::GetScrollX(); + float scroll_max_x = ImGui::GetScrollMaxX(); + ImGui::EndChild(); + ImGui::PopStyleVar(2); + float scroll_x_delta = 0.0f; + ImGui::SmallButton("<<"); + if (ImGui::IsItemActive()) + scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("Scroll from code"); ImGui::SameLine(); + ImGui::SmallButton(">>"); + if (ImGui::IsItemActive()) + scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; + ImGui::SameLine(); + ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x); + if (scroll_x_delta != 0.0f) + { + // Demonstrate a trick: you can use Begin to set yourself in the context of another window + // (here we are already out of your child window) + ImGui::BeginChild("scrolling"); + ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta); + ImGui::EndChild(); + } + ImGui::Spacing(); + + static bool show_horizontal_contents_size_demo_window = false; + ImGui::Checkbox("Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window); + + if (show_horizontal_contents_size_demo_window) + { + static bool show_h_scrollbar = true; + static bool show_button = true; + static bool show_tree_nodes = true; + static bool show_text_wrapped = false; + static bool show_columns = true; + static bool show_tab_bar = true; + static bool show_child = false; + static bool explicit_content_size = false; + static float contents_size_x = 300.0f; + if (explicit_content_size) + ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f)); + ImGui::Begin("Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0); + IMGUI_DEMO_MARKER("Layout/Scrolling/Horizontal contents size demo window"); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0)); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0)); + HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles."); + ImGui::Checkbox("H-scrollbar", &show_h_scrollbar); + ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten) + ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width + ImGui::Checkbox("Text wrapped", &show_text_wrapped);// Will grow and use contents size + ImGui::Checkbox("Columns", &show_columns); // Will use contents size + ImGui::Checkbox("Tab bar", &show_tab_bar); // Will use contents size + ImGui::Checkbox("Child", &show_child); // Will grow and use contents size + ImGui::Checkbox("Explicit content size", &explicit_content_size); + ImGui::Text("Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY()); + if (explicit_content_size) + { + ImGui::SameLine(); + ImGui::SetNextItemWidth(100); + ImGui::DragFloat("##csx", &contents_size_x); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE); + ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE); + ImGui::Dummy(ImVec2(0, 10)); + } + ImGui::PopStyleVar(2); + ImGui::Separator(); + if (show_button) + { + ImGui::Button("this is a 300-wide button", ImVec2(300, 0)); + } + if (show_tree_nodes) + { + bool open = true; + if (ImGui::TreeNode("this is a tree node")) + { + if (ImGui::TreeNode("another one of those tree node...")) + { + ImGui::Text("Some tree contents"); + ImGui::TreePop(); + } + ImGui::TreePop(); + } + ImGui::CollapsingHeader("CollapsingHeader", &open); + } + if (show_text_wrapped) + { + ImGui::TextWrapped("This text should automatically wrap on the edge of the work rectangle."); + } + if (show_columns) + { + ImGui::Text("Tables:"); + if (ImGui::BeginTable("table", 4, ImGuiTableFlags_Borders)) + { + for (int n = 0; n < 4; n++) + { + ImGui::TableNextColumn(); + ImGui::Text("Width %.2f", ImGui::GetContentRegionAvail().x); + } + ImGui::EndTable(); + } + ImGui::Text("Columns:"); + ImGui::Columns(4); + for (int n = 0; n < 4; n++) + { + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::NextColumn(); + } + ImGui::Columns(1); + } + if (show_tab_bar && ImGui::BeginTabBar("Hello")) + { + if (ImGui::BeginTabItem("OneOneOne")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("TwoTwoTwo")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("ThreeThreeThree")) { ImGui::EndTabItem(); } + if (ImGui::BeginTabItem("FourFourFour")) { ImGui::EndTabItem(); } + ImGui::EndTabBar(); + } + if (show_child) + { + ImGui::BeginChild("child", ImVec2(0, 0), true); + ImGui::EndChild(); + } + ImGui::End(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Layout/Clipping"); + if (ImGui::TreeNode("Clipping")) + { + static ImVec2 size(100.0f, 100.0f); + static ImVec2 offset(30.0f, 30.0f); + ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f"); + ImGui::TextWrapped("(Click and drag to scroll)"); + + HelpMarker( + "(Left) Using ImGui::PushClipRect():\n" + "Will alter ImGui hit-testing logic + ImDrawList rendering.\n" + "(use this if you want your clipping rectangle to affect interactions)\n\n" + "(Center) Using ImDrawList::PushClipRect():\n" + "Will alter ImDrawList rendering only.\n" + "(use this as a shortcut if you are only using ImDrawList calls)\n\n" + "(Right) Using ImDrawList::AddText() with a fine ClipRect:\n" + "Will alter only this specific ImDrawList::AddText() rendering.\n" + "This is often used internally to avoid altering the clipping rectangle and minimize draw calls."); + + for (int n = 0; n < 3; n++) + { + if (n > 0) + ImGui::SameLine(); + + ImGui::PushID(n); + ImGui::InvisibleButton("##canvas", size); + if (ImGui::IsItemActive() && ImGui::IsMouseDragging(ImGuiMouseButton_Left)) + { + offset.x += ImGui::GetIO().MouseDelta.x; + offset.y += ImGui::GetIO().MouseDelta.y; + } + ImGui::PopID(); + if (!ImGui::IsItemVisible()) // Skip rendering as ImDrawList elements are not clipped. + continue; + + const ImVec2 p0 = ImGui::GetItemRectMin(); + const ImVec2 p1 = ImGui::GetItemRectMax(); + const char* text_str = "Line 1 hello\nLine 2 clip me!"; + const ImVec2 text_pos = ImVec2(p0.x + offset.x, p0.y + offset.y); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + switch (n) + { + case 0: + ImGui::PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + ImGui::PopClipRect(); + break; + case 1: + draw_list->PushClipRect(p0, p1, true); + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(text_pos, IM_COL32_WHITE, text_str); + draw_list->PopClipRect(); + break; + case 2: + ImVec4 clip_rect(p0.x, p0.y, p1.x, p1.y); // AddText() takes a ImVec4* here so let's convert. + draw_list->AddRectFilled(p0, p1, IM_COL32(90, 90, 120, 255)); + draw_list->AddText(ImGui::GetFont(), ImGui::GetFontSize(), text_pos, IM_COL32_WHITE, text_str, NULL, 0.0f, &clip_rect); + break; + } + } + + ImGui::TreePop(); + } +} + +static void ShowDemoWindowPopups() +{ + IMGUI_DEMO_MARKER("Popups"); + if (!ImGui::CollapsingHeader("Popups & Modal windows")) + return; + + // The properties of popups windows are: + // - They block normal mouse hovering detection outside them. (*) + // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE. + // - Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as + // we are used to with regular Begin() calls. User can manipulate the visibility state by calling OpenPopup(). + // (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even + // when normally blocked by a popup. + // Those three properties are connected. The library needs to hold their visibility state BECAUSE it can close + // popups at any time. + + // Typical use for regular windows: + // bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End(); + // Typical use for popups: + // if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); } + + // With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state. + // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below. + + IMGUI_DEMO_MARKER("Popups/Popups"); + if (ImGui::TreeNode("Popups")) + { + ImGui::TextWrapped( + "When a popup is active, it inhibits interacting with windows that are behind the popup. " + "Clicking outside the popup closes it."); + + static int selected_fish = -1; + const char* names[] = { "Bream", "Haddock", "Mackerel", "Pollock", "Tilefish" }; + static bool toggles[] = { true, false, false, false, false }; + + // Simple selection popup (if you want to show the current selection inside the Button itself, + // you may want to build a string using the "###" operator to preserve a constant ID with a variable label) + if (ImGui::Button("Select..")) + ImGui::OpenPopup("my_select_popup"); + ImGui::SameLine(); + ImGui::TextUnformatted(selected_fish == -1 ? "" : names[selected_fish]); + if (ImGui::BeginPopup("my_select_popup")) + { + ImGui::SeparatorText("Aquarium"); + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + if (ImGui::Selectable(names[i])) + selected_fish = i; + ImGui::EndPopup(); + } + + // Showing a menu with toggles + if (ImGui::Button("Toggle..")) + ImGui::OpenPopup("my_toggle_popup"); + if (ImGui::BeginPopup("my_toggle_popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + ImGui::EndMenu(); + } + + ImGui::Separator(); + ImGui::Text("Tooltip here"); + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("I am a tooltip over a popup"); + + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + for (int i = 0; i < IM_ARRAYSIZE(names); i++) + ImGui::MenuItem(names[i], "", &toggles[i]); + if (ImGui::BeginMenu("Sub-menu")) + { + ImGui::MenuItem("Click me"); + if (ImGui::Button("Stacked Popup")) + ImGui::OpenPopup("another popup"); + if (ImGui::BeginPopup("another popup")) + { + ImGui::Text("I am the last one here."); + ImGui::EndPopup(); + } + ImGui::EndMenu(); + } + ImGui::EndPopup(); + } + ImGui::EndPopup(); + } + + // Call the more complete ShowExampleMenuFile which we use in various places of this demo + if (ImGui::Button("With a menu..")) + ImGui::OpenPopup("my_file_popup"); + if (ImGui::BeginPopup("my_file_popup", ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Edit")) + { + ImGui::MenuItem("Dummy"); + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + ImGui::Text("Hello from popup!"); + ImGui::Button("This is a dummy button.."); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Context menus"); + if (ImGui::TreeNode("Context menus")) + { + HelpMarker("\"Context\" functions are simple helpers to associate a Popup to a given Item or Window identifier."); + + // BeginPopupContextItem() is a helper to provide common/simple popup behavior of essentially doing: + // if (id == 0) + // id = GetItemID(); // Use last item id + // if (IsItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + // OpenPopup(id); + // return BeginPopup(id); + // For advanced uses you may want to replicate and customize this code. + // See more details in BeginPopupContextItem(). + + // Example 1 + // When used after an item that has an ID (e.g. Button), we can skip providing an ID to BeginPopupContextItem(), + // and BeginPopupContextItem() will use the last item ID as the popup ID. + { + const char* names[5] = { "Label1", "Label2", "Label3", "Label4", "Label5" }; + static int selected = -1; + for (int n = 0; n < 5; n++) + { + if (ImGui::Selectable(names[n], selected == n)) + selected = n; + if (ImGui::BeginPopupContextItem()) // <-- use last item id as popup id + { + selected = n; + ImGui::Text("This a popup for \"%s\"!", names[n]); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Right-click to open popup"); + } + } + + // Example 2 + // Popup on a Text() element which doesn't have an identifier: we need to provide an identifier to BeginPopupContextItem(). + // Using an explicit identifier is also convenient if you want to activate the popups from different locations. + { + HelpMarker("Text() elements don't have stable identifiers so we need to provide one."); + static float value = 0.5f; + ImGui::Text("Value = %.3f <-- (1) right-click this text", value); + if (ImGui::BeginPopupContextItem("my popup")) + { + if (ImGui::Selectable("Set to zero")) value = 0.0f; + if (ImGui::Selectable("Set to PI")) value = 3.1415f; + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f); + ImGui::EndPopup(); + } + + // We can also use OpenPopupOnItemClick() to toggle the visibility of a given popup. + // Here we make it that right-clicking this other text element opens the same popup as above. + // The popup itself will be submitted by the code above. + ImGui::Text("(2) Or right-click this text"); + ImGui::OpenPopupOnItemClick("my popup", ImGuiPopupFlags_MouseButtonRight); + + // Back to square one: manually open the same popup. + if (ImGui::Button("(3) Or click this button")) + ImGui::OpenPopup("my popup"); + } + + // Example 3 + // When using BeginPopupContextItem() with an implicit identifier (NULL == use last item ID), + // we need to make sure your item identifier is stable. + // In this example we showcase altering the item label while preserving its identifier, using the ### operator (see FAQ). + { + HelpMarker("Showcase using a popup ID linked to item ID, with the item having a changing label + stable ID using the ### operator."); + static char name[32] = "Label1"; + char buf[64]; + sprintf(buf, "Button: %s###Button", name); // ### operator override ID ignoring the preceding label + ImGui::Button(buf); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("Edit name:"); + ImGui::InputText("##edit", name, IM_ARRAYSIZE(name)); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::SameLine(); ImGui::Text("(<-- right-click here)"); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Modals"); + if (ImGui::TreeNode("Modals")) + { + ImGui::TextWrapped("Modal windows are like popups but the user cannot close them by clicking outside."); + + if (ImGui::Button("Delete..")) + ImGui::OpenPopup("Delete?"); + + // Always center this window when appearing + ImVec2 center = ImGui::GetMainViewport()->GetCenter(); + ImGui::SetNextWindowPos(center, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f)); + + if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!"); + ImGui::Separator(); + + //static int unused_i = 0; + //ImGui::Combo("Combo", &unused_i, "Delete\0Delete harder\0"); + + static bool dont_ask_me_next_time = false; + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("Don't ask me next time", &dont_ask_me_next_time); + ImGui::PopStyleVar(); + + if (ImGui::Button("OK", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::SetItemDefaultFocus(); + ImGui::SameLine(); + if (ImGui::Button("Cancel", ImVec2(120, 0))) { ImGui::CloseCurrentPopup(); } + ImGui::EndPopup(); + } + + if (ImGui::Button("Stacked modals..")) + ImGui::OpenPopup("Stacked 1"); + if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar)) + { + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Some menu item")) {} + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it."); + + // Testing behavior of widgets stacking their own regular popups over the modal. + static int item = 1; + static float color[4] = { 0.4f, 0.7f, 0.0f, 0.5f }; + ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0"); + ImGui::ColorEdit4("color", color); + + if (ImGui::Button("Add another modal..")) + ImGui::OpenPopup("Stacked 2"); + + // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which + // will close the popup. Note that the visibility state of popups is owned by imgui, so the input value + // of the bool actually doesn't matter here. + bool unused_open = true; + if (ImGui::BeginPopupModal("Stacked 2", &unused_open)) + { + ImGui::Text("Hello from Stacked The Second!"); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Popups/Menus inside a regular window"); + if (ImGui::TreeNode("Menus inside a regular window")) + { + ImGui::TextWrapped("Below we are testing adding menu items to a regular window. It's rather unusual but should work!"); + ImGui::Separator(); + + ImGui::MenuItem("Menu item", "CTRL+M"); + if (ImGui::BeginMenu("Menu inside a regular window")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::Separator(); + ImGui::TreePop(); + } +} + +// Dummy data structure that we use for the Table demo. +// (pre-C++11 doesn't allow us to instantiate ImVector template if this structure is defined inside the demo function) +namespace +{ +// We are passing our own identifier to TableSetupColumn() to facilitate identifying columns in the sorting code. +// This identifier will be passed down into ImGuiTableSortSpec::ColumnUserID. +// But it is possible to omit the user id parameter of TableSetupColumn() and just use the column index instead! (ImGuiTableSortSpec::ColumnIndex) +// If you don't use sorting, you will generally never care about giving column an ID! +enum MyItemColumnID +{ + MyItemColumnID_ID, + MyItemColumnID_Name, + MyItemColumnID_Action, + MyItemColumnID_Quantity, + MyItemColumnID_Description +}; + +struct MyItem +{ + int ID; + const char* Name; + int Quantity; + + // We have a problem which is affecting _only this demo_ and should not affect your code: + // As we don't rely on std:: or other third-party library to compile dear imgui, we only have reliable access to qsort(), + // however qsort doesn't allow passing user data to comparing function. + // As a workaround, we are storing the sort specs in a static/global for the comparing function to access. + // In your own use case you would probably pass the sort specs to your sorting/comparing functions directly and not use a global. + // We could technically call ImGui::TableGetSortSpecs() in CompareWithSortSpecs(), but considering that this function is called + // very often by the sorting algorithm it would be a little wasteful. + static const ImGuiTableSortSpecs* s_current_sort_specs; + + // Compare function to be used by qsort() + static int IMGUI_CDECL CompareWithSortSpecs(const void* lhs, const void* rhs) + { + const MyItem* a = (const MyItem*)lhs; + const MyItem* b = (const MyItem*)rhs; + for (int n = 0; n < s_current_sort_specs->SpecsCount; n++) + { + // Here we identify columns using the ColumnUserID value that we ourselves passed to TableSetupColumn() + // We could also choose to identify columns based on their index (sort_spec->ColumnIndex), which is simpler! + const ImGuiTableColumnSortSpecs* sort_spec = &s_current_sort_specs->Specs[n]; + int delta = 0; + switch (sort_spec->ColumnUserID) + { + case MyItemColumnID_ID: delta = (a->ID - b->ID); break; + case MyItemColumnID_Name: delta = (strcmp(a->Name, b->Name)); break; + case MyItemColumnID_Quantity: delta = (a->Quantity - b->Quantity); break; + case MyItemColumnID_Description: delta = (strcmp(a->Name, b->Name)); break; + default: IM_ASSERT(0); break; + } + if (delta > 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? +1 : -1; + if (delta < 0) + return (sort_spec->SortDirection == ImGuiSortDirection_Ascending) ? -1 : +1; + } + + // qsort() is instable so always return a way to differenciate items. + // Your own compare function may want to avoid fallback on implicit sort specs e.g. a Name compare if it wasn't already part of the sort specs. + return (a->ID - b->ID); + } +}; +const ImGuiTableSortSpecs* MyItem::s_current_sort_specs = NULL; +} + +// Make the UI compact because there are so many fields +static void PushStyleCompact() +{ + ImGuiStyle& style = ImGui::GetStyle(); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(style.FramePadding.x, (float)(int)(style.FramePadding.y * 0.60f))); + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x, (float)(int)(style.ItemSpacing.y * 0.60f))); +} + +static void PopStyleCompact() +{ + ImGui::PopStyleVar(2); +} + +// Show a combo box with a choice of sizing policies +static void EditTableSizingFlags(ImGuiTableFlags* p_flags) +{ + struct EnumDesc { ImGuiTableFlags Value; const char* Name; const char* Tooltip; }; + static const EnumDesc policies[] = + { + { ImGuiTableFlags_None, "Default", "Use default sizing policy:\n- ImGuiTableFlags_SizingFixedFit if ScrollX is on or if host window has ImGuiWindowFlags_AlwaysAutoResize.\n- ImGuiTableFlags_SizingStretchSame otherwise." }, + { ImGuiTableFlags_SizingFixedFit, "ImGuiTableFlags_SizingFixedFit", "Columns default to _WidthFixed (if resizable) or _WidthAuto (if not resizable), matching contents width." }, + { ImGuiTableFlags_SizingFixedSame, "ImGuiTableFlags_SizingFixedSame", "Columns are all the same width, matching the maximum contents width.\nImplicitly disable ImGuiTableFlags_Resizable and enable ImGuiTableFlags_NoKeepColumnsVisible." }, + { ImGuiTableFlags_SizingStretchProp, "ImGuiTableFlags_SizingStretchProp", "Columns default to _WidthStretch with weights proportional to their widths." }, + { ImGuiTableFlags_SizingStretchSame, "ImGuiTableFlags_SizingStretchSame", "Columns default to _WidthStretch with same weights." } + }; + int idx; + for (idx = 0; idx < IM_ARRAYSIZE(policies); idx++) + if (policies[idx].Value == (*p_flags & ImGuiTableFlags_SizingMask_)) + break; + const char* preview_text = (idx < IM_ARRAYSIZE(policies)) ? policies[idx].Name + (idx > 0 ? strlen("ImGuiTableFlags") : 0) : ""; + if (ImGui::BeginCombo("Sizing Policy", preview_text)) + { + for (int n = 0; n < IM_ARRAYSIZE(policies); n++) + if (ImGui::Selectable(policies[n].Name, idx == n)) + *p_flags = (*p_flags & ~ImGuiTableFlags_SizingMask_) | policies[n].Value; + ImGui::EndCombo(); + } + ImGui::SameLine(); + ImGui::TextDisabled("(?)"); + if (ImGui::IsItemHovered() && ImGui::BeginTooltip()) + { + ImGui::PushTextWrapPos(ImGui::GetFontSize() * 50.0f); + for (int m = 0; m < IM_ARRAYSIZE(policies); m++) + { + ImGui::Separator(); + ImGui::Text("%s:", policies[m].Name); + ImGui::Separator(); + ImGui::SetCursorPosX(ImGui::GetCursorPosX() + ImGui::GetStyle().IndentSpacing * 0.5f); + ImGui::TextUnformatted(policies[m].Tooltip); + } + ImGui::PopTextWrapPos(); + ImGui::EndTooltip(); + } +} + +static void EditTableColumnsFlags(ImGuiTableColumnFlags* p_flags) +{ + ImGui::CheckboxFlags("_Disabled", p_flags, ImGuiTableColumnFlags_Disabled); ImGui::SameLine(); HelpMarker("Master disable flag (also hide from context menu)"); + ImGui::CheckboxFlags("_DefaultHide", p_flags, ImGuiTableColumnFlags_DefaultHide); + ImGui::CheckboxFlags("_DefaultSort", p_flags, ImGuiTableColumnFlags_DefaultSort); + if (ImGui::CheckboxFlags("_WidthStretch", p_flags, ImGuiTableColumnFlags_WidthStretch)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthStretch); + if (ImGui::CheckboxFlags("_WidthFixed", p_flags, ImGuiTableColumnFlags_WidthFixed)) + *p_flags &= ~(ImGuiTableColumnFlags_WidthMask_ ^ ImGuiTableColumnFlags_WidthFixed); + ImGui::CheckboxFlags("_NoResize", p_flags, ImGuiTableColumnFlags_NoResize); + ImGui::CheckboxFlags("_NoReorder", p_flags, ImGuiTableColumnFlags_NoReorder); + ImGui::CheckboxFlags("_NoHide", p_flags, ImGuiTableColumnFlags_NoHide); + ImGui::CheckboxFlags("_NoClip", p_flags, ImGuiTableColumnFlags_NoClip); + ImGui::CheckboxFlags("_NoSort", p_flags, ImGuiTableColumnFlags_NoSort); + ImGui::CheckboxFlags("_NoSortAscending", p_flags, ImGuiTableColumnFlags_NoSortAscending); + ImGui::CheckboxFlags("_NoSortDescending", p_flags, ImGuiTableColumnFlags_NoSortDescending); + ImGui::CheckboxFlags("_NoHeaderLabel", p_flags, ImGuiTableColumnFlags_NoHeaderLabel); + ImGui::CheckboxFlags("_NoHeaderWidth", p_flags, ImGuiTableColumnFlags_NoHeaderWidth); + ImGui::CheckboxFlags("_PreferSortAscending", p_flags, ImGuiTableColumnFlags_PreferSortAscending); + ImGui::CheckboxFlags("_PreferSortDescending", p_flags, ImGuiTableColumnFlags_PreferSortDescending); + ImGui::CheckboxFlags("_IndentEnable", p_flags, ImGuiTableColumnFlags_IndentEnable); ImGui::SameLine(); HelpMarker("Default for column 0"); + ImGui::CheckboxFlags("_IndentDisable", p_flags, ImGuiTableColumnFlags_IndentDisable); ImGui::SameLine(); HelpMarker("Default for column >0"); +} + +static void ShowTableColumnsStatusFlags(ImGuiTableColumnFlags flags) +{ + ImGui::CheckboxFlags("_IsEnabled", &flags, ImGuiTableColumnFlags_IsEnabled); + ImGui::CheckboxFlags("_IsVisible", &flags, ImGuiTableColumnFlags_IsVisible); + ImGui::CheckboxFlags("_IsSorted", &flags, ImGuiTableColumnFlags_IsSorted); + ImGui::CheckboxFlags("_IsHovered", &flags, ImGuiTableColumnFlags_IsHovered); +} + +static void ShowDemoWindowTables() +{ + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); + IMGUI_DEMO_MARKER("Tables"); + if (!ImGui::CollapsingHeader("Tables & Columns")) + return; + + // Using those as a base value to create width/height that are factor of the size of our font + const float TEXT_BASE_WIDTH = ImGui::CalcTextSize("A").x; + const float TEXT_BASE_HEIGHT = ImGui::GetTextLineHeightWithSpacing(); + + ImGui::PushID("Tables"); + + int open_action = -1; + if (ImGui::Button("Open all")) + open_action = 1; + ImGui::SameLine(); + if (ImGui::Button("Close all")) + open_action = 0; + ImGui::SameLine(); + + // Options + static bool disable_indent = false; + ImGui::Checkbox("Disable tree indentation", &disable_indent); + ImGui::SameLine(); + HelpMarker("Disable the indenting of tree nodes so demo tables can use the full window width."); + ImGui::Separator(); + if (disable_indent) + ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f); + + // About Styling of tables + // Most settings are configured on a per-table basis via the flags passed to BeginTable() and TableSetupColumns APIs. + // There are however a few settings that a shared and part of the ImGuiStyle structure: + // style.CellPadding // Padding within each cell + // style.Colors[ImGuiCol_TableHeaderBg] // Table header background + // style.Colors[ImGuiCol_TableBorderStrong] // Table outer and header borders + // style.Colors[ImGuiCol_TableBorderLight] // Table inner borders + // style.Colors[ImGuiCol_TableRowBg] // Table row background when ImGuiTableFlags_RowBg is enabled (even rows) + // style.Colors[ImGuiCol_TableRowBgAlt] // Table row background when ImGuiTableFlags_RowBg is enabled (odds rows) + + // Demos + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Basic"); + if (ImGui::TreeNode("Basic")) + { + // Here we will showcase three different ways to output a table. + // They are very simple variations of a same thing! + + // [Method 1] Using TableNextRow() to create a new row, and TableSetColumnIndex() to select the column. + // In many situations, this is the most flexible and easy to use pattern. + HelpMarker("Using TableNextRow() + calling TableSetColumnIndex() _before_ each cell, in a loop."); + if (ImGui::BeginTable("table1", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Row %d Column %d", row, column); + } + } + ImGui::EndTable(); + } + + // [Method 2] Using TableNextColumn() called multiple times, instead of using a for loop + TableSetColumnIndex(). + // This is generally more convenient when you have code manually submitting the contents of each column. + HelpMarker("Using TableNextRow() + calling TableNextColumn() _before_ each cell, manually."); + if (ImGui::BeginTable("table2", 3)) + { + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("Row %d", row); + ImGui::TableNextColumn(); + ImGui::Text("Some contents"); + ImGui::TableNextColumn(); + ImGui::Text("123.456"); + } + ImGui::EndTable(); + } + + // [Method 3] We call TableNextColumn() _before_ each cell. We never call TableNextRow(), + // as TableNextColumn() will automatically wrap around and create new rows as needed. + // This is generally more convenient when your cells all contains the same type of data. + HelpMarker( + "Only using TableNextColumn(), which tends to be convenient for tables where every cell contains the same type of contents.\n" + "This is also more similar to the old NextColumn() function of the Columns API, and provided to facilitate the Columns->Tables API transition."); + if (ImGui::BeginTable("table3", 3)) + { + for (int item = 0; item < 14; item++) + { + ImGui::TableNextColumn(); + ImGui::Text("Item %d", item); + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Borders, background"); + if (ImGui::TreeNode("Borders, background")) + { + // Expose a few Borders related flags interactively + enum ContentsType { CT_Text, CT_FillButton }; + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static bool display_headers = false; + static int contents_type = CT_Text; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_Borders\n = ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterV\n | ImGuiTableFlags_BordersInnerV\n | ImGuiTableFlags_BordersOuterH"); + ImGui::Indent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::Unindent(); + + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags, ImGuiTableFlags_BordersInner); + ImGui::Unindent(); + + ImGui::AlignTextToFramePadding(); ImGui::Text("Cell contents:"); + ImGui::SameLine(); ImGui::RadioButton("Text", &contents_type, CT_Text); + ImGui::SameLine(); ImGui::RadioButton("FillButton", &contents_type, CT_FillButton); + ImGui::Checkbox("Display headers", &display_headers); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Display headers so we can inspect their interaction with borders. + // (Headers are not the main purpose of this section of the demo, so we are not elaborating on them too much. See other sections for details) + if (display_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + if (contents_type == CT_Text) + ImGui::TextUnformatted(buf); + else if (contents_type == CT_FillButton) + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, stretch"); + if (ImGui::TreeNode("Resizable, stretch")) + { + // By default, if we don't enable ScrollX the sizing policy for each column is "Stretch" + // All columns maintain a sizing weight, and they will occupy all available width. + static ImGuiTableFlags flags = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::SameLine(); HelpMarker("Using the _Resizable flag automatically enables the _BordersInnerV flag as well, this is why the resize borders are still showing when unchecking this."); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, fixed"); + if (ImGui::TreeNode("Resizable, fixed")) + { + // Here we use ImGuiTableFlags_SizingFixedFit (even though _ScrollX is not set) + // So columns will adopt the "Fixed" policy and will maintain a fixed width regardless of the whole available width (unless table is small) + // If there is not enough available width to fit all columns, they will however be resized down. + // FIXME-TABLE: Providing a stretch-on-init would make sense especially for tables which don't have saved settings + HelpMarker( + "Using _Resizable + _SizingFixedFit flags.\n" + "Fixed-width columns generally makes more sense if you want to use horizontal scrolling.\n\n" + "Double-click a column border to auto-fit the column to its contents."); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_ContextMenuInBody; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Resizable, mixed"); + if (ImGui::TreeNode("Resizable, mixed")) + { + HelpMarker( + "Using TableSetupColumn() to alter resizing policy on a per-column basis.\n\n" + "When combining Fixed and Stretch columns, generally you only want one, maybe two trailing columns to use _WidthStretch."); + static ImGuiTableFlags flags = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + if (ImGui::BeginTable("table1", 3, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column == 2) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 6, flags)) + { + ImGui::TableSetupColumn("AAA", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("BBB", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("CCC", ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableSetupColumn("DDD", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("EEE", ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("FFF", ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_DefaultHide); + ImGui::TableHeadersRow(); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 6; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %d,%d", (column >= 3) ? "Stretch" : "Fixed", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Reorderable, hideable, with headers"); + if (ImGui::TreeNode("Reorderable, hideable, with headers")) + { + HelpMarker( + "Click and drag column headers to reorder columns.\n\n" + "Right-click on a header to open a context menu."); + static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)"); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 3, flags)) + { + // Submit columns name with TableSetupColumn() and call TableHeadersRow() to create a row with a header in each column. + // (Later we will show how TableSetupColumn() has other uses, optional flags, sizing weight etc.) + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Use outer_size.x == 0.0f instead of default to make the table as tight as possible (only valid when no scrolling and no stretch column) + if (ImGui::BeginTable("table2", 3, flags | ImGuiTableFlags_SizingFixedFit, ImVec2(0.0f, 0.0f))) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Fixed %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Padding"); + if (ImGui::TreeNode("Padding")) + { + // First example: showcase use of padding flags and effect of BorderOuterV/BorderInnerV on X padding. + // We don't expose BorderOuterH/BorderInnerH here because they have no effect on X padding. + HelpMarker( + "We often want outer padding activated when any using features which makes the edges of a column visible:\n" + "e.g.:\n" + "- BorderOuterV\n" + "- any form of row selection\n" + "Because of this, activating BorderOuterV sets the default to PadOuterX. Using PadOuterX or NoPadOuterX you can override the default.\n\n" + "Actual padding values are using style.CellPadding.\n\n" + "In this demo we don't show horizontal borders to emphasize how they don't affect default horizontal padding."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags1, ImGuiTableFlags_PadOuterX); + ImGui::SameLine(); HelpMarker("Enable outer-most padding (default if ImGuiTableFlags_BordersOuterV is set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags1, ImGuiTableFlags_NoPadOuterX); + ImGui::SameLine(); HelpMarker("Disable outer-most padding (default if ImGuiTableFlags_BordersOuterV is not set)"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags1, ImGuiTableFlags_NoPadInnerX); + ImGui::SameLine(); HelpMarker("Disable inner padding between columns (double inner padding if BordersOuterV is on, single inner padding if BordersOuterV is off)"); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags1, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags1, ImGuiTableFlags_BordersInnerV); + static bool show_headers = false; + ImGui::Checkbox("show_headers", &show_headers); + PopStyleCompact(); + + if (ImGui::BeginTable("table_padding", 3, flags1)) + { + if (show_headers) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + { + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + } + else + { + char buf[32]; + sprintf(buf, "Hello %d,%d", column, row); + ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f)); + } + //if (ImGui::TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) + // ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, IM_COL32(0, 100, 0, 255)); + } + } + ImGui::EndTable(); + } + + // Second example: set style.CellPadding to (0.0) or a custom value. + // FIXME-TABLE: Vertical border effectively not displayed the same way as horizontal one... + HelpMarker("Setting style.CellPadding to (0,0) or a custom value."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg; + static ImVec2 cell_padding(0.0f, 0.0f); + static bool show_widget_frame_bg = true; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags2, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags2, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags2, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInner", &flags2, ImGuiTableFlags_BordersInner); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuter", &flags2, ImGuiTableFlags_BordersOuter); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags2, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags2, ImGuiTableFlags_Resizable); + ImGui::Checkbox("show_widget_frame_bg", &show_widget_frame_bg); + ImGui::SliderFloat2("CellPadding", &cell_padding.x, 0.0f, 10.0f, "%.0f"); + PopStyleCompact(); + + ImGui::PushStyleVar(ImGuiStyleVar_CellPadding, cell_padding); + if (ImGui::BeginTable("table_padding_2", 3, flags2)) + { + static char text_bufs[3 * 5][16]; // Mini text storage for 3x5 cells + static bool init = true; + if (!show_widget_frame_bg) + ImGui::PushStyleColor(ImGuiCol_FrameBg, 0); + for (int cell = 0; cell < 3 * 5; cell++) + { + ImGui::TableNextColumn(); + if (init) + strcpy(text_bufs[cell], "edit me"); + ImGui::SetNextItemWidth(-FLT_MIN); + ImGui::PushID(cell); + ImGui::InputText("##cell", text_bufs[cell], IM_ARRAYSIZE(text_bufs[cell])); + ImGui::PopID(); + } + if (!show_widget_frame_bg) + ImGui::PopStyleColor(); + init = false; + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Explicit widths"); + if (ImGui::TreeNode("Sizing policies")) + { + static ImGuiTableFlags flags1 = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags1, ImGuiTableFlags_NoHostExtendX); + PopStyleCompact(); + + static ImGuiTableFlags sizing_policy_flags[4] = { ImGuiTableFlags_SizingFixedFit, ImGuiTableFlags_SizingFixedSame, ImGuiTableFlags_SizingStretchProp, ImGuiTableFlags_SizingStretchSame }; + for (int table_n = 0; table_n < 4; table_n++) + { + ImGui::PushID(table_n); + ImGui::SetNextItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&sizing_policy_flags[table_n]); + + // To make it easier to understand the different sizing policy, + // For each policy: we display one table where the columns have equal contents width, and one where the columns have different contents width. + if (ImGui::BeginTable("table1", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + ImGui::TableNextColumn(); ImGui::Text("Oh dear"); + } + ImGui::EndTable(); + } + if (ImGui::BeginTable("table2", 3, sizing_policy_flags[table_n] | flags1)) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); ImGui::Text("AAAA"); + ImGui::TableNextColumn(); ImGui::Text("BBBBBBBB"); + ImGui::TableNextColumn(); ImGui::Text("CCCCCCCCCCCC"); + } + ImGui::EndTable(); + } + ImGui::PopID(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Advanced"); + ImGui::SameLine(); + HelpMarker("This section allows you to interact and see the effect of various sizing policies depending on whether Scroll is enabled and the contents of your columns."); + + enum ContentsType { CT_ShowWidth, CT_ShortText, CT_LongText, CT_Button, CT_FillButton, CT_InputText }; + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg | ImGuiTableFlags_Resizable; + static int contents_type = CT_ShowWidth; + static int column_count = 3; + + PushStyleCompact(); + ImGui::PushID("Advanced"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + EditTableSizingFlags(&flags); + ImGui::Combo("Contents", &contents_type, "Show width\0Short Text\0Long Text\0Button\0Fill Button\0InputText\0"); + if (contents_type == CT_FillButton) + { + ImGui::SameLine(); + HelpMarker("Be mindful that using right-alignment (e.g. size.x = -FLT_MIN) creates a feedback loop where contents width can feed into auto-column width can feed into contents width."); + } + ImGui::DragInt("Columns", &column_count, 0.1f, 1, 64, "%d", ImGuiSliderFlags_AlwaysClamp); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + + if (ImGui::BeginTable("table2", column_count, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 7))) + { + for (int cell = 0; cell < 10 * column_count; cell++) + { + ImGui::TableNextColumn(); + int column = ImGui::TableGetColumnIndex(); + int row = ImGui::TableGetRowIndex(); + + ImGui::PushID(cell); + char label[32]; + static char text_buf[32] = ""; + sprintf(label, "Hello %d,%d", column, row); + switch (contents_type) + { + case CT_ShortText: ImGui::TextUnformatted(label); break; + case CT_LongText: ImGui::Text("Some %s text %d,%d\nOver two lines..", column == 0 ? "long" : "longeeer", column, row); break; + case CT_ShowWidth: ImGui::Text("W: %.1f", ImGui::GetContentRegionAvail().x); break; + case CT_Button: ImGui::Button(label); break; + case CT_FillButton: ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); break; + case CT_InputText: ImGui::SetNextItemWidth(-FLT_MIN); ImGui::InputText("##", text_buf, IM_ARRAYSIZE(text_buf)); break; + } + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Vertical scrolling, with clipping"); + if (ImGui::TreeNode("Vertical scrolling, with clipping")) + { + HelpMarker("Here we activate ScrollY, which will create a child window container to allow hosting scrollable contents.\n\nWe also demonstrate using ImGuiListClipper to virtualize the submission of many items."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrolly", 3, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(0, 1); // Make top row always visible + ImGui::TableSetupColumn("One", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Two", ImGuiTableColumnFlags_None); + ImGui::TableSetupColumn("Three", ImGuiTableColumnFlags_None); + ImGui::TableHeadersRow(); + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(1000); + while (clipper.Step()) + { + for (int row = clipper.DisplayStart; row < clipper.DisplayEnd; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Hello %d,%d", column, row); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Horizontal scrolling"); + if (ImGui::TreeNode("Horizontal scrolling")) + { + HelpMarker( + "When ScrollX is enabled, the default sizing policy becomes ImGuiTableFlags_SizingFixedFit, " + "as automatically stretching columns doesn't make much sense with horizontal scrolling.\n\n" + "Also note that as of the current version, you will almost always want to enable ScrollY along with ScrollX," + "because the container window won't automatically extend vertically to fix contents (this may be improved in future versions)."); + static ImGuiTableFlags flags = ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable; + static int freeze_cols = 1; + static int freeze_rows = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + PopStyleCompact(); + + // When using ScrollX or ScrollY we need to specify a size for our table container! + // Otherwise by default the table will fit all available space, like a BeginChild() call. + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 8); + if (ImGui::BeginTable("table_scrollx", 7, flags, outer_size)) + { + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + ImGui::TableSetupColumn("Line #", ImGuiTableColumnFlags_NoHide); // Make the first column not hideable to match our use of TableSetupScrollFreeze() + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableSetupColumn("Four"); + ImGui::TableSetupColumn("Five"); + ImGui::TableSetupColumn("Six"); + ImGui::TableHeadersRow(); + for (int row = 0; row < 20; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 7; column++) + { + // Both TableNextColumn() and TableSetColumnIndex() return true when a column is visible or performing width measurement. + // Because here we know that: + // - A) all our columns are contributing the same to row height + // - B) column 0 is always visible, + // We only always submit this one column and can skip others. + // More advanced per-column clipping behaviors may benefit from polling the status flags via TableGetColumnFlags(). + if (!ImGui::TableSetColumnIndex(column) && column > 0) + continue; + if (column == 0) + ImGui::Text("Line %d", row); + else + ImGui::Text("Hello world %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::Spacing(); + ImGui::TextUnformatted("Stretch + ScrollX"); + ImGui::SameLine(); + HelpMarker( + "Showcase using Stretch columns + ScrollX together: " + "this is rather unusual and only makes sense when specifying an 'inner_width' for the table!\n" + "Without an explicit value, inner_width is == outer_size.x and therefore using Stretch columns + ScrollX together doesn't make sense."); + static ImGuiTableFlags flags2 = ImGuiTableFlags_SizingStretchSame | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_RowBg | ImGuiTableFlags_ContextMenuInBody; + static float inner_width = 1000.0f; + PushStyleCompact(); + ImGui::PushID("flags3"); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 30); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags2, ImGuiTableFlags_ScrollX); + ImGui::DragFloat("inner_width", &inner_width, 1.0f, 0.0f, FLT_MAX, "%.1f"); + ImGui::PopItemWidth(); + ImGui::PopID(); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 7, flags2, outer_size, inner_width)) + { + for (int cell = 0; cell < 20 * 7; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("Hello world %d,%d", ImGui::TableGetColumnIndex(), ImGui::TableGetRowIndex()); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Columns flags"); + if (ImGui::TreeNode("Columns flags")) + { + // Create a first table just to show all the options/flags we want to make visible in our example! + const int column_count = 3; + const char* column_names[column_count] = { "One", "Two", "Three" }; + static ImGuiTableColumnFlags column_flags[column_count] = { ImGuiTableColumnFlags_DefaultSort, ImGuiTableColumnFlags_None, ImGuiTableColumnFlags_DefaultHide }; + static ImGuiTableColumnFlags column_flags_out[column_count] = { 0, 0, 0 }; // Output from TableGetColumnFlags() + + if (ImGui::BeginTable("table_columns_flags_checkboxes", column_count, ImGuiTableFlags_None)) + { + PushStyleCompact(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableNextColumn(); + ImGui::PushID(column); + ImGui::AlignTextToFramePadding(); // FIXME-TABLE: Workaround for wrong text baseline propagation across columns + ImGui::Text("'%s'", column_names[column]); + ImGui::Spacing(); + ImGui::Text("Input flags:"); + EditTableColumnsFlags(&column_flags[column]); + ImGui::Spacing(); + ImGui::Text("Output flags:"); + ImGui::BeginDisabled(); + ShowTableColumnsStatusFlags(column_flags_out[column]); + ImGui::EndDisabled(); + ImGui::PopID(); + } + PopStyleCompact(); + ImGui::EndTable(); + } + + // Create the real table we care about for the example! + // We use a scrolling table to be able to showcase the difference between the _IsEnabled and _IsVisible flags above, otherwise in + // a non-scrolling table columns are always visible (unless using ImGuiTableFlags_NoKeepColumnsVisible + resizing the parent window down) + const ImGuiTableFlags flags + = ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV + | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable; + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 9); + if (ImGui::BeginTable("table_columns_flags", column_count, flags, outer_size)) + { + for (int column = 0; column < column_count; column++) + ImGui::TableSetupColumn(column_names[column], column_flags[column]); + ImGui::TableHeadersRow(); + for (int column = 0; column < column_count; column++) + column_flags_out[column] = ImGui::TableGetColumnFlags(column); + float indent_step = (float)((int)TEXT_BASE_WIDTH / 2); + for (int row = 0; row < 8; row++) + { + ImGui::Indent(indent_step); // Add some indentation to demonstrate usage of per-column IndentEnable/IndentDisable flags. + ImGui::TableNextRow(); + for (int column = 0; column < column_count; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%s %s", (column == 0) ? "Indented" : "Hello", ImGui::TableGetColumnName(column)); + } + } + ImGui::Unindent(indent_step * 8.0f); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Columns widths"); + if (ImGui::TreeNode("Columns widths")) + { + HelpMarker("Using TableSetupColumn() to setup default width."); + + static ImGuiTableFlags flags1 = ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBodyUntilResize; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags1, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags1, ImGuiTableFlags_NoBordersInBodyUntilResize); + PopStyleCompact(); + if (ImGui::BeginTable("table1", 3, flags1)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("one", ImGuiTableColumnFlags_WidthFixed, 100.0f); // Default to 100.0f + ImGui::TableSetupColumn("two", ImGuiTableColumnFlags_WidthFixed, 200.0f); // Default to 200.0f + ImGui::TableSetupColumn("three", ImGuiTableColumnFlags_WidthFixed); // Default to auto + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + HelpMarker("Using TableSetupColumn() to setup explicit width.\n\nUnless _NoKeepColumnsVisible is set, fixed columns with set width may still be shrunk down if there's not enough space in the host."); + + static ImGuiTableFlags flags2 = ImGuiTableFlags_None; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags2, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags2, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags2, ImGuiTableFlags_BordersOuterV); + PopStyleCompact(); + if (ImGui::BeginTable("table2", 4, flags2)) + { + // We could also set ImGuiTableFlags_SizingFixedFit on the table and all columns will default to ImGuiTableColumnFlags_WidthFixed. + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, 100.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 30.0f); + ImGui::TableSetupColumn("", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 15.0f); + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 4; column++) + { + ImGui::TableSetColumnIndex(column); + if (row == 0) + ImGui::Text("(w: %5.1f)", ImGui::GetContentRegionAvail().x); + else + ImGui::Text("Hello %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Nested tables"); + if (ImGui::TreeNode("Nested tables")) + { + HelpMarker("This demonstrates embedding a table into another table cell."); + + if (ImGui::BeginTable("table_nested1", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("A0"); + ImGui::TableSetupColumn("A1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextColumn(); + ImGui::Text("A0 Row 0"); + { + float rows_height = TEXT_BASE_HEIGHT * 2; + if (ImGui::BeginTable("table_nested2", 2, ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("B0"); + ImGui::TableSetupColumn("B1"); + ImGui::TableHeadersRow(); + + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 0"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 0"); + ImGui::TableNextRow(ImGuiTableRowFlags_None, rows_height); + ImGui::TableNextColumn(); + ImGui::Text("B0 Row 1"); + ImGui::TableNextColumn(); + ImGui::Text("B1 Row 1"); + + ImGui::EndTable(); + } + } + ImGui::TableNextColumn(); ImGui::Text("A1 Row 0"); + ImGui::TableNextColumn(); ImGui::Text("A0 Row 1"); + ImGui::TableNextColumn(); ImGui::Text("A1 Row 1"); + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Row height"); + if (ImGui::TreeNode("Row height")) + { + HelpMarker("You can pass a 'min_row_height' to TableNextRow().\n\nRows are padded with 'style.CellPadding.y' on top and bottom, so effectively the minimum row height will always be >= 'style.CellPadding.y * 2.0f'.\n\nWe cannot honor a _maximum_ row height as that would require a unique clipping rectangle per row."); + if (ImGui::BeginTable("table_row_height", 1, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersInnerV)) + { + for (int row = 0; row < 10; row++) + { + float min_row_height = (float)(int)(TEXT_BASE_HEIGHT * 0.30f * row); + ImGui::TableNextRow(ImGuiTableRowFlags_None, min_row_height); + ImGui::TableNextColumn(); + ImGui::Text("min_row_height = %.2f", min_row_height); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Outer size"); + if (ImGui::TreeNode("Outer size")) + { + // Showcasing use of ImGuiTableFlags_NoHostExtendX and ImGuiTableFlags_NoHostExtendY + // Important to that note how the two flags have slightly different behaviors! + ImGui::Text("Using NoHostExtendX and NoHostExtendY:"); + PushStyleCompact(); + static ImGuiTableFlags flags = ImGuiTableFlags_Borders | ImGuiTableFlags_Resizable | ImGuiTableFlags_ContextMenuInBody | ImGuiTableFlags_RowBg | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoHostExtendX; + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + PopStyleCompact(); + + ImVec2 outer_size = ImVec2(0.0f, TEXT_BASE_HEIGHT * 5.5f); + if (ImGui::BeginTable("table1", 3, flags, outer_size)) + { + for (int row = 0; row < 10; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + ImGui::Text("Hello!"); + + ImGui::Spacing(); + + ImGui::Text("Using explicit size:"); + if (ImGui::BeginTable("table2", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + ImGui::SameLine(); + if (ImGui::BeginTable("table3", 3, ImGuiTableFlags_Borders | ImGuiTableFlags_RowBg, ImVec2(TEXT_BASE_WIDTH * 30, 0.0f))) + { + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(0, TEXT_BASE_HEIGHT * 1.5f); + for (int column = 0; column < 3; column++) + { + ImGui::TableNextColumn(); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Background color"); + if (ImGui::TreeNode("Background color")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_RowBg; + static int row_bg_type = 1; + static int row_bg_target = 1; + static int cell_bg_type = 1; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_Borders", &flags, ImGuiTableFlags_Borders); + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::SameLine(); HelpMarker("ImGuiTableFlags_RowBg automatically sets RowBg0 to alternative colors pulled from the Style."); + ImGui::Combo("row bg type", (int*)&row_bg_type, "None\0Red\0Gradient\0"); + ImGui::Combo("row bg target", (int*)&row_bg_target, "RowBg0\0RowBg1\0"); ImGui::SameLine(); HelpMarker("Target RowBg0 to override the alternating odd/even colors,\nTarget RowBg1 to blend with them."); + ImGui::Combo("cell bg type", (int*)&cell_bg_type, "None\0Blue\0"); ImGui::SameLine(); HelpMarker("We are colorizing cells to B1->C2 here."); + IM_ASSERT(row_bg_type >= 0 && row_bg_type <= 2); + IM_ASSERT(row_bg_target >= 0 && row_bg_target <= 1); + IM_ASSERT(cell_bg_type >= 0 && cell_bg_type <= 1); + PopStyleCompact(); + + if (ImGui::BeginTable("table1", 5, flags)) + { + for (int row = 0; row < 6; row++) + { + ImGui::TableNextRow(); + + // Demonstrate setting a row background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBgX, ...)' + // We use a transparent color so we can see the one behind in case our target is RowBg1 and RowBg0 was already targeted by the ImGuiTableFlags_RowBg flag. + if (row_bg_type != 0) + { + ImU32 row_bg_color = ImGui::GetColorU32(row_bg_type == 1 ? ImVec4(0.7f, 0.3f, 0.3f, 0.65f) : ImVec4(0.2f + row * 0.1f, 0.2f, 0.2f, 0.65f)); // Flat or Gradient? + ImGui::TableSetBgColor(ImGuiTableBgTarget_RowBg0 + row_bg_target, row_bg_color); + } + + // Fill cells + for (int column = 0; column < 5; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("%c%c", 'A' + row, '0' + column); + + // Change background of Cells B1->C2 + // Demonstrate setting a cell background color with 'ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, ...)' + // (the CellBg color will be blended over the RowBg and ColumnBg colors) + // We can also pass a column number as a third parameter to TableSetBgColor() and do this outside the column loop. + if (row >= 1 && row <= 2 && column >= 1 && column <= 2 && cell_bg_type == 1) + { + ImU32 cell_bg_color = ImGui::GetColorU32(ImVec4(0.3f, 0.3f, 0.7f, 0.65f)); + ImGui::TableSetBgColor(ImGuiTableBgTarget_CellBg, cell_bg_color); + } + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Tree view"); + if (ImGui::TreeNode("Tree view")) + { + static ImGuiTableFlags flags = ImGuiTableFlags_BordersV | ImGuiTableFlags_BordersOuterH | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg | ImGuiTableFlags_NoBordersInBody; + + if (ImGui::BeginTable("3ways", 3, flags)) + { + // The first column will use the default _WidthStretch when ScrollX is Off and _WidthFixed when ScrollX is On + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoHide); + ImGui::TableSetupColumn("Size", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 12.0f); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_WidthFixed, TEXT_BASE_WIDTH * 18.0f); + ImGui::TableHeadersRow(); + + // Simple storage to output a dummy file-system. + struct MyTreeNode + { + const char* Name; + const char* Type; + int Size; + int ChildIdx; + int ChildCount; + static void DisplayNode(const MyTreeNode* node, const MyTreeNode* all_nodes) + { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + const bool is_folder = (node->ChildCount > 0); + if (is_folder) + { + bool open = ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::TextDisabled("--"); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + if (open) + { + for (int child_n = 0; child_n < node->ChildCount; child_n++) + DisplayNode(&all_nodes[node->ChildIdx + child_n], all_nodes); + ImGui::TreePop(); + } + } + else + { + ImGui::TreeNodeEx(node->Name, ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_Bullet | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_SpanFullWidth); + ImGui::TableNextColumn(); + ImGui::Text("%d", node->Size); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(node->Type); + } + } + }; + static const MyTreeNode nodes[] = + { + { "Root", "Folder", -1, 1, 3 }, // 0 + { "Music", "Folder", -1, 4, 2 }, // 1 + { "Textures", "Folder", -1, 6, 3 }, // 2 + { "desktop.ini", "System file", 1024, -1,-1 }, // 3 + { "File1_a.wav", "Audio file", 123000, -1,-1 }, // 4 + { "File1_b.wav", "Audio file", 456000, -1,-1 }, // 5 + { "Image001.png", "Image file", 203128, -1,-1 }, // 6 + { "Copy of Image001.png", "Image file", 203256, -1,-1 }, // 7 + { "Copy of Image001 (Final2).png","Image file", 203512, -1,-1 }, // 8 + }; + + MyTreeNode::DisplayNode(&nodes[0], nodes); + + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Item width"); + if (ImGui::TreeNode("Item width")) + { + HelpMarker( + "Showcase using PushItemWidth() and how it is preserved on a per-column basis.\n\n" + "Note that on auto-resizing non-resizable fixed columns, querying the content width for e.g. right-alignment doesn't make sense."); + if (ImGui::BeginTable("table_item_width", 3, ImGuiTableFlags_Borders)) + { + ImGui::TableSetupColumn("small"); + ImGui::TableSetupColumn("half"); + ImGui::TableSetupColumn("right-align"); + ImGui::TableHeadersRow(); + + for (int row = 0; row < 3; row++) + { + ImGui::TableNextRow(); + if (row == 0) + { + // Setup ItemWidth once (instead of setting up every time, which is also possible but less efficient) + ImGui::TableSetColumnIndex(0); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 3.0f); // Small + ImGui::TableSetColumnIndex(1); + ImGui::PushItemWidth(-ImGui::GetContentRegionAvail().x * 0.5f); + ImGui::TableSetColumnIndex(2); + ImGui::PushItemWidth(-FLT_MIN); // Right-aligned + } + + // Draw our contents + static float dummy_f = 0.0f; + ImGui::PushID(row); + ImGui::TableSetColumnIndex(0); + ImGui::SliderFloat("float0", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(1); + ImGui::SliderFloat("float1", &dummy_f, 0.0f, 1.0f); + ImGui::TableSetColumnIndex(2); + ImGui::SliderFloat("##float2", &dummy_f, 0.0f, 1.0f); // No visible label since right-aligned + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate using TableHeader() calls instead of TableHeadersRow() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Custom headers"); + if (ImGui::TreeNode("Custom headers")) + { + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_custom_headers", COLUMNS_COUNT, ImGuiTableFlags_Borders | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + ImGui::TableSetupColumn("Apricot"); + ImGui::TableSetupColumn("Banana"); + ImGui::TableSetupColumn("Cherry"); + + // Dummy entire-column selection storage + // FIXME: It would be nice to actually demonstrate full-featured selection using those checkbox. + static bool column_selected[3] = {}; + + // Instead of calling TableHeadersRow() we'll submit custom headers ourselves + ImGui::TableNextRow(ImGuiTableRowFlags_Headers); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + const char* column_name = ImGui::TableGetColumnName(column); // Retrieve name passed to TableSetupColumn() + ImGui::PushID(column); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + ImGui::Checkbox("##checkall", &column_selected[column]); + ImGui::PopStyleVar(); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::TableHeader(column_name); + ImGui::PopID(); + } + + for (int row = 0; row < 5; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < 3; column++) + { + char buf[32]; + sprintf(buf, "Cell %d,%d", column, row); + ImGui::TableSetColumnIndex(column); + ImGui::Selectable(buf, column_selected[column]); + } + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // Demonstrate creating custom context menus inside columns, while playing it nice with context menus provided by TableHeadersRow()/TableHeader() + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Context menus"); + if (ImGui::TreeNode("Context menus")) + { + HelpMarker("By default, right-clicking over a TableHeadersRow()/TableHeader() line will open the default context-menu.\nUsing ImGuiTableFlags_ContextMenuInBody we also allow right-clicking over columns body."); + static ImGuiTableFlags flags1 = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_ContextMenuInBody; + + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags1, ImGuiTableFlags_ContextMenuInBody); + PopStyleCompact(); + + // Context Menus: first example + // [1.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [1.2] Right-click in columns also open the default table context menu (if ImGuiTableFlags_ContextMenuInBody is set) + const int COLUMNS_COUNT = 3; + if (ImGui::BeginTable("table_context_menu", COLUMNS_COUNT, flags1)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [1.1]] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + + // Submit dummy contents + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + } + } + ImGui::EndTable(); + } + + // Context Menus: second example + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + // [2.2] Right-click on the ".." to open a custom popup + // [2.3] Right-click in columns to open another custom popup + HelpMarker("Demonstrate mixing table context menu (over header), item context button (over button) and custom per-colum context menu (over column body)."); + ImGuiTableFlags flags2 = ImGuiTableFlags_Resizable | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders; + if (ImGui::BeginTable("table_context_menu_2", COLUMNS_COUNT, flags2)) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + + // [2.1] Right-click on the TableHeadersRow() line to open the default table context menu. + ImGui::TableHeadersRow(); + for (int row = 0; row < 4; row++) + { + ImGui::TableNextRow(); + for (int column = 0; column < COLUMNS_COUNT; column++) + { + // Submit dummy contents + ImGui::TableSetColumnIndex(column); + ImGui::Text("Cell %d,%d", column, row); + ImGui::SameLine(); + + // [2.2] Right-click on the ".." to open a custom popup + ImGui::PushID(row * COLUMNS_COUNT + column); + ImGui::SmallButton(".."); + if (ImGui::BeginPopupContextItem()) + { + ImGui::Text("This is the popup for Button(\"..\") in Cell %d,%d", column, row); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + } + + // [2.3] Right-click anywhere in columns to open another custom popup + // (instead of testing for !IsAnyItemHovered() we could also call OpenPopup() with ImGuiPopupFlags_NoOpenOverExistingPopup + // to manage popup priority as the popups triggers, here "are we hovering a column" are overlapping) + int hovered_column = -1; + for (int column = 0; column < COLUMNS_COUNT + 1; column++) + { + ImGui::PushID(column); + if (ImGui::TableGetColumnFlags(column) & ImGuiTableColumnFlags_IsHovered) + hovered_column = column; + if (hovered_column == column && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(1)) + ImGui::OpenPopup("MyPopup"); + if (ImGui::BeginPopup("MyPopup")) + { + if (column == COLUMNS_COUNT) + ImGui::Text("This is a custom popup for unused space after the last column."); + else + ImGui::Text("This is a custom popup for Column %d", column); + if (ImGui::Button("Close")) + ImGui::CloseCurrentPopup(); + ImGui::EndPopup(); + } + ImGui::PopID(); + } + + ImGui::EndTable(); + ImGui::Text("Hovered column: %d", hovered_column); + } + ImGui::TreePop(); + } + + // Demonstrate creating multiple tables with the same ID + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Synced instances"); + if (ImGui::TreeNode("Synced instances")) + { + HelpMarker("Multiple tables with the same identifier will share their settings, width, visibility, order etc."); + + static ImGuiTableFlags flags = ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_NoSavedSettings; + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::CheckboxFlags("ImGuiTableFlags_SizingFixedFit", &flags, ImGuiTableFlags_SizingFixedFit); + for (int n = 0; n < 3; n++) + { + char buf[32]; + sprintf(buf, "Synced Table %d", n); + bool open = ImGui::CollapsingHeader(buf, ImGuiTreeNodeFlags_DefaultOpen); + if (open && ImGui::BeginTable("Table", 3, flags, ImVec2(0.0f, ImGui::GetTextLineHeightWithSpacing() * 5))) + { + ImGui::TableSetupColumn("One"); + ImGui::TableSetupColumn("Two"); + ImGui::TableSetupColumn("Three"); + ImGui::TableHeadersRow(); + const int cell_count = (n == 1) ? 27 : 9; // Make second table have a scrollbar to verify that additional decoration is not affecting column positions. + for (int cell = 0; cell < cell_count; cell++) + { + ImGui::TableNextColumn(); + ImGui::Text("this cell %d", cell); + } + ImGui::EndTable(); + } + } + ImGui::TreePop(); + } + + // Demonstrate using Sorting facilities + // This is a simplified version of the "Advanced" example, where we mostly focus on the code necessary to handle sorting. + // Note that the "Advanced" example also showcase manually triggering a sort (e.g. if item quantities have been modified) + static const char* template_items_names[] = + { + "Banana", "Apple", "Cherry", "Watermelon", "Grapefruit", "Strawberry", "Mango", + "Kiwi", "Orange", "Pineapple", "Blueberry", "Plum", "Coconut", "Pear", "Apricot" + }; + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Sorting"); + if (ImGui::TreeNode("Sorting")) + { + // Create item list + static ImVector items; + if (items.Size == 0) + { + items.resize(50, MyItem()); + for (int n = 0; n < items.Size; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (n * n - n) % 20; // Assign default quantities + } + } + + // Options + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersOuter | ImGuiTableFlags_BordersV | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollY; + PushStyleCompact(); + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + PopStyleCompact(); + + if (ImGui::BeginTable("table_sorting", 4, flags, ImVec2(0.0f, TEXT_BASE_HEIGHT * 15), 0.0f)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + // Demonstrate using a mixture of flags among available sort-related flags: + // - ImGuiTableColumnFlags_DefaultSort + // - ImGuiTableColumnFlags_NoSort / ImGuiTableColumnFlags_NoSortAscending / ImGuiTableColumnFlags_NoSortDescending + // - ImGuiTableColumnFlags_PreferSortAscending / ImGuiTableColumnFlags_PreferSortDescending + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending | ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupScrollFreeze(0, 1); // Make row always visible + ImGui::TableHeadersRow(); + + // Sort our data if sort specs have been changed! + if (ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs()) + if (sorts_specs->SpecsDirty) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + if (items.Size > 1) + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) + { + // Display a data item + MyItem* item = &items[row_n]; + ImGui::PushID(item->ID); + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("%04d", item->ID); + ImGui::TableNextColumn(); + ImGui::TextUnformatted(item->Name); + ImGui::TableNextColumn(); + ImGui::SmallButton("None"); + ImGui::TableNextColumn(); + ImGui::Text("%d", item->Quantity); + ImGui::PopID(); + } + ImGui::EndTable(); + } + ImGui::TreePop(); + } + + // In this example we'll expose most table flags and settings. + // For specific flags and settings refer to the corresponding section for more detailed explanation. + // This section is mostly useful to experiment with combining certain flags or settings with each others. + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // [DEBUG] + if (open_action != -1) + ImGui::SetNextItemOpen(open_action != 0); + IMGUI_DEMO_MARKER("Tables/Advanced"); + if (ImGui::TreeNode("Advanced")) + { + static ImGuiTableFlags flags = + ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable + | ImGuiTableFlags_Sortable | ImGuiTableFlags_SortMulti + | ImGuiTableFlags_RowBg | ImGuiTableFlags_Borders | ImGuiTableFlags_NoBordersInBody + | ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY + | ImGuiTableFlags_SizingFixedFit; + + enum ContentsType { CT_Text, CT_Button, CT_SmallButton, CT_FillButton, CT_Selectable, CT_SelectableSpanRow }; + static int contents_type = CT_SelectableSpanRow; + const char* contents_type_names[] = { "Text", "Button", "SmallButton", "FillButton", "Selectable", "Selectable (span row)" }; + static int freeze_cols = 1; + static int freeze_rows = 1; + static int items_count = IM_ARRAYSIZE(template_items_names) * 2; + static ImVec2 outer_size_value = ImVec2(0.0f, TEXT_BASE_HEIGHT * 12); + static float row_min_height = 0.0f; // Auto + static float inner_width_with_scroll = 0.0f; // Auto-extend + static bool outer_size_enabled = true; + static bool show_headers = true; + static bool show_wrapped_text = false; + //static ImGuiTextFilter filter; + //ImGui::SetNextItemOpen(true, ImGuiCond_Once); // FIXME-TABLE: Enabling this results in initial clipped first pass on table which tend to affect column sizing + if (ImGui::TreeNode("Options")) + { + // Make the UI compact because there are so many fields + PushStyleCompact(); + ImGui::PushItemWidth(TEXT_BASE_WIDTH * 28.0f); + + if (ImGui::TreeNodeEx("Features:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_Resizable", &flags, ImGuiTableFlags_Resizable); + ImGui::CheckboxFlags("ImGuiTableFlags_Reorderable", &flags, ImGuiTableFlags_Reorderable); + ImGui::CheckboxFlags("ImGuiTableFlags_Hideable", &flags, ImGuiTableFlags_Hideable); + ImGui::CheckboxFlags("ImGuiTableFlags_Sortable", &flags, ImGuiTableFlags_Sortable); + ImGui::CheckboxFlags("ImGuiTableFlags_NoSavedSettings", &flags, ImGuiTableFlags_NoSavedSettings); + ImGui::CheckboxFlags("ImGuiTableFlags_ContextMenuInBody", &flags, ImGuiTableFlags_ContextMenuInBody); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Decorations:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_RowBg", &flags, ImGuiTableFlags_RowBg); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersV", &flags, ImGuiTableFlags_BordersV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterV", &flags, ImGuiTableFlags_BordersOuterV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerV", &flags, ImGuiTableFlags_BordersInnerV); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersH", &flags, ImGuiTableFlags_BordersH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersOuterH", &flags, ImGuiTableFlags_BordersOuterH); + ImGui::CheckboxFlags("ImGuiTableFlags_BordersInnerH", &flags, ImGuiTableFlags_BordersInnerH); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBody", &flags, ImGuiTableFlags_NoBordersInBody); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body (borders will always appear in Headers"); + ImGui::CheckboxFlags("ImGuiTableFlags_NoBordersInBodyUntilResize", &flags, ImGuiTableFlags_NoBordersInBodyUntilResize); ImGui::SameLine(); HelpMarker("Disable vertical borders in columns Body until hovered for resize (borders will always appear in Headers)"); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sizing:", ImGuiTreeNodeFlags_DefaultOpen)) + { + EditTableSizingFlags(&flags); + ImGui::SameLine(); HelpMarker("In the Advanced demo we override the policy of each column so those table-wide settings have less effect that typical."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendX", &flags, ImGuiTableFlags_NoHostExtendX); + ImGui::SameLine(); HelpMarker("Make outer width auto-fit to columns, overriding outer_size.x value.\n\nOnly available when ScrollX/ScrollY are disabled and Stretch columns are not used."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoHostExtendY", &flags, ImGuiTableFlags_NoHostExtendY); + ImGui::SameLine(); HelpMarker("Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit).\n\nOnly available when ScrollX/ScrollY are disabled. Data below the limit will be clipped and not visible."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoKeepColumnsVisible", &flags, ImGuiTableFlags_NoKeepColumnsVisible); + ImGui::SameLine(); HelpMarker("Only available if ScrollX is disabled."); + ImGui::CheckboxFlags("ImGuiTableFlags_PreciseWidths", &flags, ImGuiTableFlags_PreciseWidths); + ImGui::SameLine(); HelpMarker("Disable distributing remainder width to stretched columns (width allocation on a 100-wide table with 3 columns: Without this flag: 33,33,34. With this flag: 33,33,33). With larger number of columns, resizing will appear to be less smooth."); + ImGui::CheckboxFlags("ImGuiTableFlags_NoClip", &flags, ImGuiTableFlags_NoClip); + ImGui::SameLine(); HelpMarker("Disable clipping rectangle for every individual columns (reduce draw command count, items will be able to overflow into other columns). Generally incompatible with ScrollFreeze options."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Padding:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_PadOuterX", &flags, ImGuiTableFlags_PadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadOuterX", &flags, ImGuiTableFlags_NoPadOuterX); + ImGui::CheckboxFlags("ImGuiTableFlags_NoPadInnerX", &flags, ImGuiTableFlags_NoPadInnerX); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Scrolling:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollX", &flags, ImGuiTableFlags_ScrollX); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_cols", &freeze_cols, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::CheckboxFlags("ImGuiTableFlags_ScrollY", &flags, ImGuiTableFlags_ScrollY); + ImGui::SameLine(); + ImGui::SetNextItemWidth(ImGui::GetFrameHeight()); + ImGui::DragInt("freeze_rows", &freeze_rows, 0.2f, 0, 9, NULL, ImGuiSliderFlags_NoInput); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Sorting:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::CheckboxFlags("ImGuiTableFlags_SortMulti", &flags, ImGuiTableFlags_SortMulti); + ImGui::SameLine(); HelpMarker("When sorting is enabled: hold shift when clicking headers to sort on multiple column. TableGetSortSpecs() may return specs where (SpecsCount > 1)."); + ImGui::CheckboxFlags("ImGuiTableFlags_SortTristate", &flags, ImGuiTableFlags_SortTristate); + ImGui::SameLine(); HelpMarker("When sorting is enabled: allow no sorting, disable default sorting. TableGetSortSpecs() may return specs where (SpecsCount == 0)."); + ImGui::TreePop(); + } + + if (ImGui::TreeNodeEx("Other:", ImGuiTreeNodeFlags_DefaultOpen)) + { + ImGui::Checkbox("show_headers", &show_headers); + ImGui::Checkbox("show_wrapped_text", &show_wrapped_text); + + ImGui::DragFloat2("##OuterSize", &outer_size_value.x); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + ImGui::Checkbox("outer_size", &outer_size_enabled); + ImGui::SameLine(); + HelpMarker("If scrolling is disabled (ScrollX and ScrollY not set):\n" + "- The table is output directly in the parent window.\n" + "- OuterSize.x < 0.0f will right-align the table.\n" + "- OuterSize.x = 0.0f will narrow fit the table unless there are any Stretch columns.\n" + "- OuterSize.y then becomes the minimum size for the table, which will extend vertically if there are more rows (unless NoHostExtendY is set)."); + + // From a user point of view we will tend to use 'inner_width' differently depending on whether our table is embedding scrolling. + // To facilitate toying with this demo we will actually pass 0.0f to the BeginTable() when ScrollX is disabled. + ImGui::DragFloat("inner_width (when ScrollX active)", &inner_width_with_scroll, 1.0f, 0.0f, FLT_MAX); + + ImGui::DragFloat("row_min_height", &row_min_height, 1.0f, 0.0f, FLT_MAX); + ImGui::SameLine(); HelpMarker("Specify height of the Selectable item."); + + ImGui::DragInt("items_count", &items_count, 0.1f, 0, 9999); + ImGui::Combo("items_type (first column)", &contents_type, contents_type_names, IM_ARRAYSIZE(contents_type_names)); + //filter.Draw("filter"); + ImGui::TreePop(); + } + + ImGui::PopItemWidth(); + PopStyleCompact(); + ImGui::Spacing(); + ImGui::TreePop(); + } + + // Update item list if we changed the number of items + static ImVector items; + static ImVector selection; + static bool items_need_sort = false; + if (items.Size != items_count) + { + items.resize(items_count, MyItem()); + for (int n = 0; n < items_count; n++) + { + const int template_n = n % IM_ARRAYSIZE(template_items_names); + MyItem& item = items[n]; + item.ID = n; + item.Name = template_items_names[template_n]; + item.Quantity = (template_n == 3) ? 10 : (template_n == 4) ? 20 : 0; // Assign default quantities + } + } + + const ImDrawList* parent_draw_list = ImGui::GetWindowDrawList(); + const int parent_draw_list_draw_cmd_count = parent_draw_list->CmdBuffer.Size; + ImVec2 table_scroll_cur, table_scroll_max; // For debug display + const ImDrawList* table_draw_list = NULL; // " + + // Submit table + const float inner_width_to_use = (flags & ImGuiTableFlags_ScrollX) ? inner_width_with_scroll : 0.0f; + if (ImGui::BeginTable("table_advanced", 6, flags, outer_size_enabled ? outer_size_value : ImVec2(0, 0), inner_width_to_use)) + { + // Declare columns + // We use the "user_id" parameter of TableSetupColumn() to specify a user id that will be stored in the sort specifications. + // This is so our sort function can identify a column given our own identifier. We could also identify them based on their index! + ImGui::TableSetupColumn("ID", ImGuiTableColumnFlags_DefaultSort | ImGuiTableColumnFlags_WidthFixed | ImGuiTableColumnFlags_NoHide, 0.0f, MyItemColumnID_ID); + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Name); + ImGui::TableSetupColumn("Action", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed, 0.0f, MyItemColumnID_Action); + ImGui::TableSetupColumn("Quantity", ImGuiTableColumnFlags_PreferSortDescending, 0.0f, MyItemColumnID_Quantity); + ImGui::TableSetupColumn("Description", (flags & ImGuiTableFlags_NoHostExtendX) ? 0 : ImGuiTableColumnFlags_WidthStretch, 0.0f, MyItemColumnID_Description); + ImGui::TableSetupColumn("Hidden", ImGuiTableColumnFlags_DefaultHide | ImGuiTableColumnFlags_NoSort); + ImGui::TableSetupScrollFreeze(freeze_cols, freeze_rows); + + // Sort our data if sort specs have been changed! + ImGuiTableSortSpecs* sorts_specs = ImGui::TableGetSortSpecs(); + if (sorts_specs && sorts_specs->SpecsDirty) + items_need_sort = true; + if (sorts_specs && items_need_sort && items.Size > 1) + { + MyItem::s_current_sort_specs = sorts_specs; // Store in variable accessible by the sort function. + qsort(&items[0], (size_t)items.Size, sizeof(items[0]), MyItem::CompareWithSortSpecs); + MyItem::s_current_sort_specs = NULL; + sorts_specs->SpecsDirty = false; + } + items_need_sort = false; + + // Take note of whether we are currently sorting based on the Quantity field, + // we will use this to trigger sorting when we know the data of this column has been modified. + const bool sorts_specs_using_quantity = (ImGui::TableGetColumnFlags(3) & ImGuiTableColumnFlags_IsSorted) != 0; + + // Show headers + if (show_headers) + ImGui::TableHeadersRow(); + + // Show data + // FIXME-TABLE FIXME-NAV: How we can get decent up/down even though we have the buttons here? + ImGui::PushButtonRepeat(true); +#if 1 + // Demonstrate using clipper for large vertical lists + ImGuiListClipper clipper; + clipper.Begin(items.Size); + while (clipper.Step()) + { + for (int row_n = clipper.DisplayStart; row_n < clipper.DisplayEnd; row_n++) +#else + // Without clipper + { + for (int row_n = 0; row_n < items.Size; row_n++) +#endif + { + MyItem* item = &items[row_n]; + //if (!filter.PassFilter(item->Name)) + // continue; + + const bool item_is_selected = selection.contains(item->ID); + ImGui::PushID(item->ID); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_min_height); + + // For the demo purpose we can select among different type of items submitted in the first column + ImGui::TableSetColumnIndex(0); + char label[32]; + sprintf(label, "%04d", item->ID); + if (contents_type == CT_Text) + ImGui::TextUnformatted(label); + else if (contents_type == CT_Button) + ImGui::Button(label); + else if (contents_type == CT_SmallButton) + ImGui::SmallButton(label); + else if (contents_type == CT_FillButton) + ImGui::Button(label, ImVec2(-FLT_MIN, 0.0f)); + else if (contents_type == CT_Selectable || contents_type == CT_SelectableSpanRow) + { + ImGuiSelectableFlags selectable_flags = (contents_type == CT_SelectableSpanRow) ? ImGuiSelectableFlags_SpanAllColumns | ImGuiSelectableFlags_AllowItemOverlap : ImGuiSelectableFlags_None; + if (ImGui::Selectable(label, item_is_selected, selectable_flags, ImVec2(0, row_min_height))) + { + if (ImGui::GetIO().KeyCtrl) + { + if (item_is_selected) + selection.find_erase_unsorted(item->ID); + else + selection.push_back(item->ID); + } + else + { + selection.clear(); + selection.push_back(item->ID); + } + } + } + + if (ImGui::TableSetColumnIndex(1)) + ImGui::TextUnformatted(item->Name); + + // Here we demonstrate marking our data set as needing to be sorted again if we modified a quantity, + // and we are currently sorting on the column showing the Quantity. + // To avoid triggering a sort while holding the button, we only trigger it when the button has been released. + // You will probably need a more advanced system in your code if you want to automatically sort when a specific entry changes. + if (ImGui::TableSetColumnIndex(2)) + { + if (ImGui::SmallButton("Chop")) { item->Quantity += 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + ImGui::SameLine(); + if (ImGui::SmallButton("Eat")) { item->Quantity -= 1; } + if (sorts_specs_using_quantity && ImGui::IsItemDeactivated()) { items_need_sort = true; } + } + + if (ImGui::TableSetColumnIndex(3)) + ImGui::Text("%d", item->Quantity); + + ImGui::TableSetColumnIndex(4); + if (show_wrapped_text) + ImGui::TextWrapped("Lorem ipsum dolor sit amet"); + else + ImGui::Text("Lorem ipsum dolor sit amet"); + + if (ImGui::TableSetColumnIndex(5)) + ImGui::Text("1234"); + + ImGui::PopID(); + } + } + ImGui::PopButtonRepeat(); + + // Store some info to display debug details below + table_scroll_cur = ImVec2(ImGui::GetScrollX(), ImGui::GetScrollY()); + table_scroll_max = ImVec2(ImGui::GetScrollMaxX(), ImGui::GetScrollMaxY()); + table_draw_list = ImGui::GetWindowDrawList(); + ImGui::EndTable(); + } + static bool show_debug_details = false; + ImGui::Checkbox("Debug details", &show_debug_details); + if (show_debug_details && table_draw_list) + { + ImGui::SameLine(0.0f, 0.0f); + const int table_draw_list_draw_cmd_count = table_draw_list->CmdBuffer.Size; + if (table_draw_list == parent_draw_list) + ImGui::Text(": DrawCmd: +%d (in same window)", + table_draw_list_draw_cmd_count - parent_draw_list_draw_cmd_count); + else + ImGui::Text(": DrawCmd: +%d (in child window), Scroll: (%.f/%.f) (%.f/%.f)", + table_draw_list_draw_cmd_count - 1, table_scroll_cur.x, table_scroll_max.x, table_scroll_cur.y, table_scroll_max.y); + } + ImGui::TreePop(); + } + + ImGui::PopID(); + + ShowDemoWindowColumns(); + + if (disable_indent) + ImGui::PopStyleVar(); +} + +// Demonstrate old/legacy Columns API! +// [2020: Columns are under-featured and not maintained. Prefer using the more flexible and powerful BeginTable() API!] +static void ShowDemoWindowColumns() +{ + IMGUI_DEMO_MARKER("Columns (legacy API)"); + bool open = ImGui::TreeNode("Legacy Columns API"); + ImGui::SameLine(); + HelpMarker("Columns() is an old API! Prefer using the more flexible and powerful BeginTable() API!"); + if (!open) + return; + + // Basic columns + IMGUI_DEMO_MARKER("Columns (legacy API)/Basic"); + if (ImGui::TreeNode("Basic")) + { + ImGui::Text("Without border:"); + ImGui::Columns(3, "mycolumns3", false); // 3-ways, no border + ImGui::Separator(); + for (int n = 0; n < 14; n++) + { + char label[32]; + sprintf(label, "Item %d", n); + if (ImGui::Selectable(label)) {} + //if (ImGui::Button(label, ImVec2(-FLT_MIN,0.0f))) {} + ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + + ImGui::Text("With border:"); + ImGui::Columns(4, "mycolumns"); // 4-ways, with border + ImGui::Separator(); + ImGui::Text("ID"); ImGui::NextColumn(); + ImGui::Text("Name"); ImGui::NextColumn(); + ImGui::Text("Path"); ImGui::NextColumn(); + ImGui::Text("Hovered"); ImGui::NextColumn(); + ImGui::Separator(); + const char* names[3] = { "One", "Two", "Three" }; + const char* paths[3] = { "/path/one", "/path/two", "/path/three" }; + static int selected = -1; + for (int i = 0; i < 3; i++) + { + char label[32]; + sprintf(label, "%04d", i); + if (ImGui::Selectable(label, selected == i, ImGuiSelectableFlags_SpanAllColumns)) + selected = i; + bool hovered = ImGui::IsItemHovered(); + ImGui::NextColumn(); + ImGui::Text(names[i]); ImGui::NextColumn(); + ImGui::Text(paths[i]); ImGui::NextColumn(); + ImGui::Text("%d", hovered); ImGui::NextColumn(); + } + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Borders"); + if (ImGui::TreeNode("Borders")) + { + // NB: Future columns API should allow automatic horizontal borders. + static bool h_borders = true; + static bool v_borders = true; + static int columns_count = 4; + const int lines_count = 3; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragInt("##columns_count", &columns_count, 0.1f, 2, 10, "%d columns"); + if (columns_count < 2) + columns_count = 2; + ImGui::SameLine(); + ImGui::Checkbox("horizontal", &h_borders); + ImGui::SameLine(); + ImGui::Checkbox("vertical", &v_borders); + ImGui::Columns(columns_count, NULL, v_borders); + for (int i = 0; i < columns_count * lines_count; i++) + { + if (h_borders && ImGui::GetColumnIndex() == 0) + ImGui::Separator(); + ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i); + ImGui::Text("Width %.2f", ImGui::GetColumnWidth()); + ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x); + ImGui::Text("Offset %.2f", ImGui::GetColumnOffset()); + ImGui::Text("Long text that is likely to clip"); + ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f)); + ImGui::NextColumn(); + } + ImGui::Columns(1); + if (h_borders) + ImGui::Separator(); + ImGui::TreePop(); + } + + // Create multiple items in a same cell before switching to next column + IMGUI_DEMO_MARKER("Columns (legacy API)/Mixed items"); + if (ImGui::TreeNode("Mixed items")) + { + ImGui::Columns(3, "mixed"); + ImGui::Separator(); + + ImGui::Text("Hello"); + ImGui::Button("Banana"); + ImGui::NextColumn(); + + ImGui::Text("ImGui"); + ImGui::Button("Apple"); + static float foo = 1.0f; + ImGui::InputFloat("red", &foo, 0.05f, 0, "%.3f"); + ImGui::Text("An extra line here."); + ImGui::NextColumn(); + + ImGui::Text("Sailor"); + ImGui::Button("Corniflower"); + static float bar = 1.0f; + ImGui::InputFloat("blue", &bar, 0.05f, 0, "%.3f"); + ImGui::NextColumn(); + + if (ImGui::CollapsingHeader("Category A")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category B")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + if (ImGui::CollapsingHeader("Category C")) { ImGui::Text("Blah blah blah"); } ImGui::NextColumn(); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + // Word wrapping + IMGUI_DEMO_MARKER("Columns (legacy API)/Word-wrapping"); + if (ImGui::TreeNode("Word-wrapping")) + { + ImGui::Columns(2, "word-wrapping"); + ImGui::Separator(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Left"); + ImGui::NextColumn(); + ImGui::TextWrapped("The quick brown fox jumps over the lazy dog."); + ImGui::TextWrapped("Hello Right"); + ImGui::Columns(1); + ImGui::Separator(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Horizontal Scrolling"); + if (ImGui::TreeNode("Horizontal Scrolling")) + { + ImGui::SetNextWindowContentSize(ImVec2(1500.0f, 0.0f)); + ImVec2 child_size = ImVec2(0, ImGui::GetFontSize() * 20.0f); + ImGui::BeginChild("##ScrollingRegion", child_size, false, ImGuiWindowFlags_HorizontalScrollbar); + ImGui::Columns(10); + + // Also demonstrate using clipper for large vertical lists + int ITEMS_COUNT = 2000; + ImGuiListClipper clipper; + clipper.Begin(ITEMS_COUNT); + while (clipper.Step()) + { + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + for (int j = 0; j < 10; j++) + { + ImGui::Text("Line %d Column %d...", i, j); + ImGui::NextColumn(); + } + } + ImGui::Columns(1); + ImGui::EndChild(); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Columns (legacy API)/Tree"); + if (ImGui::TreeNode("Tree")) + { + ImGui::Columns(2, "tree", true); + for (int x = 0; x < 3; x++) + { + bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + ImGui::NextColumn(); + if (open1) + { + for (int y = 0; y < 3; y++) + { + bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y); + ImGui::NextColumn(); + ImGui::Text("Node contents"); + if (open2) + { + ImGui::Text("Even more contents"); + if (ImGui::TreeNode("Tree in column")) + { + ImGui::Text("The quick brown fox jumps over the lazy dog"); + ImGui::TreePop(); + } + } + ImGui::NextColumn(); + if (open2) + ImGui::TreePop(); + } + ImGui::TreePop(); + } + } + ImGui::Columns(1); + ImGui::TreePop(); + } + + ImGui::TreePop(); +} + +namespace ImGui { extern ImGuiKeyData* GetKeyData(ImGuiKey key); } + +static void ShowDemoWindowInputs() +{ + IMGUI_DEMO_MARKER("Inputs & Focus"); + if (ImGui::CollapsingHeader("Inputs & Focus")) + { + ImGuiIO& io = ImGui::GetIO(); + + // Display inputs submitted to ImGuiIO + IMGUI_DEMO_MARKER("Inputs & Focus/Inputs"); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode("Inputs")) + { + HelpMarker( + "This is a simplified view. See more detailed input state:\n" + "- in 'Tools->Metrics/Debugger->Inputs'.\n" + "- in 'Tools->Debug Log->IO'."); + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse pos: (%g, %g)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse pos: "); + ImGui::Text("Mouse delta: (%g, %g)", io.MouseDelta.x, io.MouseDelta.y); + ImGui::Text("Mouse down:"); + for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseDown(i)) { ImGui::SameLine(); ImGui::Text("b%d (%.02f secs)", i, io.MouseDownDuration[i]); } + ImGui::Text("Mouse wheel: %.1f", io.MouseWheel); + + // We iterate both legacy native range and named ImGuiKey ranges, which is a little odd but this allows displaying the data for old/new backends. + // User code should never have to go through such hoops! You can generally iterate between ImGuiKey_NamedKey_BEGIN and ImGuiKey_NamedKey_END. +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey) { return false; } }; + ImGuiKey start_key = ImGuiKey_NamedKey_BEGIN; +#else + struct funcs { static bool IsLegacyNativeDupe(ImGuiKey key) { return key < 512 && ImGui::GetIO().KeyMap[key] != -1; } }; // Hide Native<>ImGuiKey duplicates when both exists in the array + ImGuiKey start_key = (ImGuiKey)0; +#endif + ImGui::Text("Keys down:"); for (ImGuiKey key = start_key; key < ImGuiKey_NamedKey_END; key = (ImGuiKey)(key + 1)) { if (funcs::IsLegacyNativeDupe(key) || !ImGui::IsKeyDown(key)) continue; ImGui::SameLine(); ImGui::Text((key < ImGuiKey_NamedKey_BEGIN) ? "\"%s\"" : "\"%s\" %d", ImGui::GetKeyName(key), key); ImGui::SameLine(); ImGui::Text("(%.02f)", ImGui::GetKeyData(key)->DownDuration); } + ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : ""); + ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public. + + ImGui::TreePop(); + } + + // Display ImGuiIO output flags + IMGUI_DEMO_MARKER("Inputs & Focus/Outputs"); + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode("Outputs")) + { + HelpMarker( + "The value of io.WantCaptureMouse and io.WantCaptureKeyboard are normally set by Dear ImGui " + "to instruct your application of how to route inputs. Typically, when a value is true, it means " + "Dear ImGui wants the corresponding inputs and we expect the underlying application to ignore them.\n\n" + "The most typical case is: when hovering a window, Dear ImGui set io.WantCaptureMouse to true, " + "and underlying application should ignore mouse inputs (in practice there are many and more subtle " + "rules leading to how those flags are set)."); + ImGui::Text("io.WantCaptureMouse: %d", io.WantCaptureMouse); + ImGui::Text("io.WantCaptureMouseUnlessPopupClose: %d", io.WantCaptureMouseUnlessPopupClose); + ImGui::Text("io.WantCaptureKeyboard: %d", io.WantCaptureKeyboard); + ImGui::Text("io.WantTextInput: %d", io.WantTextInput); + ImGui::Text("io.WantSetMousePos: %d", io.WantSetMousePos); + ImGui::Text("io.NavActive: %d, io.NavVisible: %d", io.NavActive, io.NavVisible); + + IMGUI_DEMO_MARKER("Inputs & Focus/Outputs/WantCapture override"); + if (ImGui::TreeNode("WantCapture override")) + { + HelpMarker( + "Hovering the colored canvas will override io.WantCaptureXXX fields.\n" + "Notice how normally (when set to none), the value of io.WantCaptureKeyboard would be false when hovering and true when clicking."); + static int capture_override_mouse = -1; + static int capture_override_keyboard = -1; + const char* capture_override_desc[] = { "None", "Set to false", "Set to true" }; + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderInt("SetNextFrameWantCaptureMouse() on hover", &capture_override_mouse, -1, +1, capture_override_desc[capture_override_mouse + 1], ImGuiSliderFlags_AlwaysClamp); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15); + ImGui::SliderInt("SetNextFrameWantCaptureKeyboard() on hover", &capture_override_keyboard, -1, +1, capture_override_desc[capture_override_keyboard + 1], ImGuiSliderFlags_AlwaysClamp); + + ImGui::ColorButton("##panel", ImVec4(0.7f, 0.1f, 0.7f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, ImVec2(128.0f, 96.0f)); // Dummy item + if (ImGui::IsItemHovered() && capture_override_mouse != -1) + ImGui::SetNextFrameWantCaptureMouse(capture_override_mouse == 1); + if (ImGui::IsItemHovered() && capture_override_keyboard != -1) + ImGui::SetNextFrameWantCaptureKeyboard(capture_override_keyboard == 1); + + ImGui::TreePop(); + } + ImGui::TreePop(); + } + + // Display mouse cursors + IMGUI_DEMO_MARKER("Inputs & Focus/Mouse Cursors"); + if (ImGui::TreeNode("Mouse Cursors")) + { + const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" }; + IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT); + + ImGuiMouseCursor current = ImGui::GetMouseCursor(); + ImGui::Text("Current mouse cursor = %d: %s", current, mouse_cursors_names[current]); + ImGui::BeginDisabled(true); + ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", &io.BackendFlags, ImGuiBackendFlags_HasMouseCursors); + ImGui::EndDisabled(); + + ImGui::Text("Hover to see mouse cursors:"); + ImGui::SameLine(); HelpMarker( + "Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. " + "If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, " + "otherwise your backend needs to handle it."); + for (int i = 0; i < ImGuiMouseCursor_COUNT; i++) + { + char label[32]; + sprintf(label, "Mouse cursor %d: %s", i, mouse_cursors_names[i]); + ImGui::Bullet(); ImGui::Selectable(label, false); + if (ImGui::IsItemHovered()) + ImGui::SetMouseCursor(i); + } + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs & Focus/Tabbing"); + if (ImGui::TreeNode("Tabbing")) + { + ImGui::Text("Use TAB/SHIFT+TAB to cycle through keyboard editable fields."); + static char buf[32] = "hello"; + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + ImGui::InputText("3", buf, IM_ARRAYSIZE(buf)); + ImGui::PushTabStop(false); + ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf)); + ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); + ImGui::PopTabStop(); + ImGui::InputText("5", buf, IM_ARRAYSIZE(buf)); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs & Focus/Focus from code"); + if (ImGui::TreeNode("Focus from code")) + { + bool focus_1 = ImGui::Button("Focus on 1"); ImGui::SameLine(); + bool focus_2 = ImGui::Button("Focus on 2"); ImGui::SameLine(); + bool focus_3 = ImGui::Button("Focus on 3"); + int has_focus = 0; + static char buf[128] = "click on a button to set focus"; + + if (focus_1) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("1", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 1; + + if (focus_2) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("2", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 2; + + ImGui::PushTabStop(false); + if (focus_3) ImGui::SetKeyboardFocusHere(); + ImGui::InputText("3 (tab skip)", buf, IM_ARRAYSIZE(buf)); + if (ImGui::IsItemActive()) has_focus = 3; + ImGui::SameLine(); HelpMarker("Item won't be cycled through when using TAB or Shift+Tab."); + ImGui::PopTabStop(); + + if (has_focus) + ImGui::Text("Item with focus: %d", has_focus); + else + ImGui::Text("Item with focus: "); + + // Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item + static float f3[3] = { 0.0f, 0.0f, 0.0f }; + int focus_ahead = -1; + if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine(); + if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine(); + if (ImGui::Button("Focus on Z")) { focus_ahead = 2; } + if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead); + ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f); + + ImGui::TextWrapped("NB: Cursor & selection are preserved when refocusing last used item in code."); + ImGui::TreePop(); + } + + IMGUI_DEMO_MARKER("Inputs & Focus/Dragging"); + if (ImGui::TreeNode("Dragging")) + { + ImGui::TextWrapped("You can use ImGui::GetMouseDragDelta(0) to query for the dragged amount on any widget."); + for (int button = 0; button < 3; button++) + { + ImGui::Text("IsMouseDragging(%d):", button); + ImGui::Text(" w/ default threshold: %d,", ImGui::IsMouseDragging(button)); + ImGui::Text(" w/ zero threshold: %d,", ImGui::IsMouseDragging(button, 0.0f)); + ImGui::Text(" w/ large threshold: %d,", ImGui::IsMouseDragging(button, 20.0f)); + } + + ImGui::Button("Drag Me"); + if (ImGui::IsItemActive()) + ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor + + // Drag operations gets "unlocked" when the mouse has moved past a certain threshold + // (the default threshold is stored in io.MouseDragThreshold). You can request a lower or higher + // threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta(). + ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f); + ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0); + ImVec2 mouse_delta = io.MouseDelta; + ImGui::Text("GetMouseDragDelta(0):"); + ImGui::Text(" w/ default threshold: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y); + ImGui::Text(" w/ zero threshold: (%.1f, %.1f)", value_raw.x, value_raw.y); + ImGui::Text("io.MouseDelta: (%.1f, %.1f)", mouse_delta.x, mouse_delta.y); + ImGui::TreePop(); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] About Window / ShowAboutWindow() +// Access from Dear ImGui Demo -> Tools -> About +//----------------------------------------------------------------------------- + +void ImGui::ShowAboutWindow(bool* p_open) +{ + if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Tools/About Dear ImGui"); + ImGui::Text("Dear ImGui %s", ImGui::GetVersion()); + ImGui::Separator(); + ImGui::Text("By Omar Cornut and all Dear ImGui contributors."); + ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information."); + + static bool show_config_info = false; + ImGui::Checkbox("Config/Build Information", &show_config_info); + if (show_config_info) + { + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle& style = ImGui::GetStyle(); + + bool copy_to_clipboard = ImGui::Button("Copy to clipboard"); + ImVec2 child_size = ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18); + ImGui::BeginChildFrame(ImGui::GetID("cfg_infos"), child_size, ImGuiWindowFlags_NoMove); + if (copy_to_clipboard) + { + ImGui::LogToClipboard(); + ImGui::LogText("```\n"); // Back quotes will make text appears without formatting when pasting on GitHub + } + + ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM); + ImGui::Separator(); + ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert)); + ImGui::Text("define: __cplusplus=%d", (int)__cplusplus); +#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_OBSOLETE_KEYIO + ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_KEYIO"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS + ImGui::Text("define: IMGUI_DISABLE_FILE_FUNCTIONS"); +#endif +#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS + ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS"); +#endif +#ifdef IMGUI_USE_BGRA_PACKED_COLOR + ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR"); +#endif +#ifdef _WIN32 + ImGui::Text("define: _WIN32"); +#endif +#ifdef _WIN64 + ImGui::Text("define: _WIN64"); +#endif +#ifdef __linux__ + ImGui::Text("define: __linux__"); +#endif +#ifdef __APPLE__ + ImGui::Text("define: __APPLE__"); +#endif +#ifdef _MSC_VER + ImGui::Text("define: _MSC_VER=%d", _MSC_VER); +#endif +#ifdef _MSVC_LANG + ImGui::Text("define: _MSVC_LANG=%d", (int)_MSVC_LANG); +#endif +#ifdef __MINGW32__ + ImGui::Text("define: __MINGW32__"); +#endif +#ifdef __MINGW64__ + ImGui::Text("define: __MINGW64__"); +#endif +#ifdef __GNUC__ + ImGui::Text("define: __GNUC__=%d", (int)__GNUC__); +#endif +#ifdef __clang_version__ + ImGui::Text("define: __clang_version__=%s", __clang_version__); +#endif +#ifdef __EMSCRIPTEN__ + ImGui::Text("define: __EMSCRIPTEN__"); +#endif + ImGui::Separator(); + ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL"); + ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL"); + ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad"); + if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos"); + if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse"); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange"); + if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor"); + if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors"); + if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink"); + if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges"); + if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly"); + if (io.ConfigMemoryCompactTimer >= 0.0f) ImGui::Text("io.ConfigMemoryCompactTimer = %.1f", io.ConfigMemoryCompactTimer); + ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags); + if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad"); + if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors"); + if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos"); + if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset"); + ImGui::Separator(); + ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight); + ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y); + ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); + ImGui::Separator(); + ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y); + ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize); + ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y); + ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding); + ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize); + ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y); + ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y); + + if (copy_to_clipboard) + { + ImGui::LogText("\n```\n"); + ImGui::LogFinish(); + } + ImGui::EndChildFrame(); + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Style Editor / ShowStyleEditor() +//----------------------------------------------------------------------------- +// - ShowFontSelector() +// - ShowStyleSelector() +// - ShowStyleEditor() +//----------------------------------------------------------------------------- + +// Forward declare ShowFontAtlas() which isn't worth putting in public API yet +namespace ImGui { IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); } + +// Demo helper function to select among loaded fonts. +// Here we use the regular BeginCombo()/EndCombo() api which is the more flexible one. +void ImGui::ShowFontSelector(const char* label) +{ + ImGuiIO& io = ImGui::GetIO(); + ImFont* font_current = ImGui::GetFont(); + if (ImGui::BeginCombo(label, font_current->GetDebugName())) + { + for (int n = 0; n < io.Fonts->Fonts.Size; n++) + { + ImFont* font = io.Fonts->Fonts[n]; + ImGui::PushID((void*)font); + if (ImGui::Selectable(font->GetDebugName(), font == font_current)) + io.FontDefault = font; + ImGui::PopID(); + } + ImGui::EndCombo(); + } + ImGui::SameLine(); + HelpMarker( + "- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n" + "- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n" + "- Read FAQ and docs/FONTS.md for more details.\n" + "- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame()."); +} + +// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options. +// Here we use the simplified Combo() api that packs items into a single literal string. +// Useful for quick combo boxes where the choices are known locally. +bool ImGui::ShowStyleSelector(const char* label) +{ + static int style_idx = -1; + if (ImGui::Combo(label, &style_idx, "Dark\0Light\0Classic\0")) + { + switch (style_idx) + { + case 0: ImGui::StyleColorsDark(); break; + case 1: ImGui::StyleColorsLight(); break; + case 2: ImGui::StyleColorsClassic(); break; + } + return true; + } + return false; +} + +void ImGui::ShowStyleEditor(ImGuiStyle* ref) +{ + IMGUI_DEMO_MARKER("Tools/Style Editor"); + // You can pass in a reference ImGuiStyle structure to compare to, revert to and save to + // (without a reference style pointer, we will use one compared locally as a reference) + ImGuiStyle& style = ImGui::GetStyle(); + static ImGuiStyle ref_saved_style; + + // Default to using internal storage as reference + static bool init = true; + if (init && ref == NULL) + ref_saved_style = style; + init = false; + if (ref == NULL) + ref = &ref_saved_style; + + ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.50f); + + if (ImGui::ShowStyleSelector("Colors##Selector")) + ref_saved_style = style; + ImGui::ShowFontSelector("Fonts##Selector"); + + // Simplified Settings (expose floating-pointer border sizes as boolean representing 0.0f or 1.0f) + if (ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f")) + style.GrabRounding = style.FrameRounding; // Make GrabRounding always the same value as FrameRounding + { bool border = (style.WindowBorderSize > 0.0f); if (ImGui::Checkbox("WindowBorder", &border)) { style.WindowBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.FrameBorderSize > 0.0f); if (ImGui::Checkbox("FrameBorder", &border)) { style.FrameBorderSize = border ? 1.0f : 0.0f; } } + ImGui::SameLine(); + { bool border = (style.PopupBorderSize > 0.0f); if (ImGui::Checkbox("PopupBorder", &border)) { style.PopupBorderSize = border ? 1.0f : 0.0f; } } + + // Save/Revert button + if (ImGui::Button("Save Ref")) + *ref = ref_saved_style = style; + ImGui::SameLine(); + if (ImGui::Button("Revert Ref")) + style = *ref; + ImGui::SameLine(); + HelpMarker( + "Save/Revert in local non-persistent storage. Default Colors definition are not affected. " + "Use \"Export\" below to save them somewhere."); + + ImGui::Separator(); + + if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Sizes")) + { + ImGui::SeparatorText("Main"); + ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("CellPadding", (float*)&style.CellPadding, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f"); + ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f"); + ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f"); + ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f"); + + ImGui::SeparatorText("Borders"); + ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f"); + ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f"); + + ImGui::SeparatorText("Rounding"); + ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f"); + ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f"); + + ImGui::SeparatorText("Widgets"); + ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f"); + int window_menu_button_position = style.WindowMenuButtonPosition + 1; + if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0")) + style.WindowMenuButtonPosition = window_menu_button_position - 1; + ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0"); + ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content."); + ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content."); + ImGui::SliderFloat("SeparatorTextBorderSize", &style.SeparatorTextBorderSize, 0.0f, 10.0f, "%.0f"); + ImGui::SliderFloat2("SeparatorTextAlign", (float*)&style.SeparatorTextAlign, 0.0f, 1.0f, "%.2f"); + ImGui::SliderFloat2("SeparatorTextPadding", (float*)&style.SeparatorTextPadding, 0.0f, 40.0f, "%0.f"); + ImGui::SliderFloat("LogSliderDeadzone", &style.LogSliderDeadzone, 0.0f, 12.0f, "%.0f"); + + ImGui::SeparatorText("Misc"); + ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f"); ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured)."); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Colors")) + { + static int output_dest = 0; + static bool output_only_modified = true; + if (ImGui::Button("Export")) + { + if (output_dest == 0) + ImGui::LogToClipboard(); + else + ImGui::LogToTTY(); + ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const ImVec4& col = style.Colors[i]; + const char* name = ImGui::GetStyleColorName(i); + if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0) + ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, + name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w); + } + ImGui::LogFinish(); + } + ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); + ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified); + + static ImGuiTextFilter filter; + filter.Draw("Filter colors", ImGui::GetFontSize() * 16); + + static ImGuiColorEditFlags alpha_flags = 0; + if (ImGui::RadioButton("Opaque", alpha_flags == ImGuiColorEditFlags_None)) { alpha_flags = ImGuiColorEditFlags_None; } ImGui::SameLine(); + if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine(); + if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine(); + HelpMarker( + "In the color list:\n" + "Left-click on color square to open color picker,\n" + "Right-click to open edit options menu."); + + ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened); + ImGui::PushItemWidth(-160); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName(i); + if (!filter.PassFilter(name)) + continue; + ImGui::PushID(i); + ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags); + if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0) + { + // Tips: in a real user application, you may want to merge and use an icon font into the main font, + // so instead of "Save"/"Revert" you'd use icons! + // Read the FAQ and docs/FONTS.md about using icon fonts. It's really easy and super convenient! + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) { ref->Colors[i] = style.Colors[i]; } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) { style.Colors[i] = ref->Colors[i]; } + } + ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); + ImGui::TextUnformatted(name); + ImGui::PopID(); + } + ImGui::PopItemWidth(); + ImGui::EndChild(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Fonts")) + { + ImGuiIO& io = ImGui::GetIO(); + ImFontAtlas* atlas = io.Fonts; + HelpMarker("Read FAQ and docs/FONTS.md for details on font loading."); + ImGui::ShowFontAtlas(atlas); + + // Post-baking font scaling. Note that this is NOT the nice way of scaling fonts, read below. + // (we enforce hard clamping manually as by default DragFloat/SliderFloat allows CTRL+Click text to get out of bounds). + const float MIN_SCALE = 0.3f; + const float MAX_SCALE = 2.0f; + HelpMarker( + "Those are old settings provided for convenience.\n" + "However, the _correct_ way of scaling your UI is currently to reload your font at the designed size, " + "rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.\n" + "Using those settings here will give you poor quality results."); + static float window_scale = 1.0f; + ImGui::PushItemWidth(ImGui::GetFontSize() * 8); + if (ImGui::DragFloat("window scale", &window_scale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp)) // Scale only this window + ImGui::SetWindowFontScale(window_scale); + ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Rendering")) + { + ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); + ImGui::SameLine(); + HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well."); + + ImGui::Checkbox("Anti-aliased lines use texture", &style.AntiAliasedLinesUseTex); + ImGui::SameLine(); + HelpMarker("Faster lines using texture data. Require backend to render with bilinear filtering (not point/nearest filtering)."); + + ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill); + ImGui::PushItemWidth(ImGui::GetFontSize() * 8); + ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f"); + if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f; + + // When editing the "Circle Segment Max Error" value, draw a preview of its effect on auto-tessellated circles. + ImGui::DragFloat("Circle Tessellation Max Error", &style.CircleTessellationMaxError , 0.005f, 0.10f, 5.0f, "%.2f", ImGuiSliderFlags_AlwaysClamp); + const bool show_samples = ImGui::IsItemActive(); + if (show_samples) + ImGui::SetNextWindowPos(ImGui::GetCursorScreenPos()); + if (show_samples && ImGui::BeginTooltip()) + { + ImGui::TextUnformatted("(R = radius, N = number of segments)"); + ImGui::Spacing(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + const float min_widget_width = ImGui::CalcTextSize("N: MMM\nR: MMM").x; + for (int n = 0; n < 8; n++) + { + const float RAD_MIN = 5.0f; + const float RAD_MAX = 70.0f; + const float rad = RAD_MIN + (RAD_MAX - RAD_MIN) * (float)n / (8.0f - 1.0f); + + ImGui::BeginGroup(); + + ImGui::Text("R: %.f\nN: %d", rad, draw_list->_CalcCircleAutoSegmentCount(rad)); + + const float canvas_width = IM_MAX(min_widget_width, rad * 2.0f); + const float offset_x = floorf(canvas_width * 0.5f); + const float offset_y = floorf(RAD_MAX); + + const ImVec2 p1 = ImGui::GetCursorScreenPos(); + draw_list->AddCircle(ImVec2(p1.x + offset_x, p1.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + + /* + const ImVec2 p2 = ImGui::GetCursorScreenPos(); + draw_list->AddCircleFilled(ImVec2(p2.x + offset_x, p2.y + offset_y), rad, ImGui::GetColorU32(ImGuiCol_Text)); + ImGui::Dummy(ImVec2(canvas_width, RAD_MAX * 2)); + */ + + ImGui::EndGroup(); + ImGui::SameLine(); + } + ImGui::EndTooltip(); + } + ImGui::SameLine(); + HelpMarker("When drawing circle primitives with \"num_segments == 0\" tesselation will be calculated automatically."); + + ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero. + ImGui::DragFloat("Disabled Alpha", &style.DisabledAlpha, 0.005f, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Additional alpha multiplier for disabled items (multiply over current value of Alpha)."); + ImGui::PopItemWidth(); + + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::PopItemWidth(); +} + +//----------------------------------------------------------------------------- +// [SECTION] User Guide / ShowUserGuide() +//----------------------------------------------------------------------------- + +void ImGui::ShowUserGuide() +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui::BulletText("Double-click on title bar to collapse window."); + ImGui::BulletText( + "Click and drag on lower corner to resize window\n" + "(double-click to auto fit window to its contents)."); + ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text."); + ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields."); + ImGui::BulletText("CTRL+Tab to select a window."); + if (io.FontAllowUserScaling) + ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents."); + ImGui::BulletText("While inputing text:\n"); + ImGui::Indent(); + ImGui::BulletText("CTRL+Left/Right to word jump."); + ImGui::BulletText("CTRL+A or double-click to select all."); + ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste."); + ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo."); + ImGui::BulletText("ESCAPE to revert."); + ImGui::Unindent(); + ImGui::BulletText("With keyboard navigation enabled:"); + ImGui::Indent(); + ImGui::BulletText("Arrow keys to navigate."); + ImGui::BulletText("Space to activate a widget."); + ImGui::BulletText("Return to input text into a widget."); + ImGui::BulletText("Escape to deactivate a widget, close popup, exit child window."); + ImGui::BulletText("Alt to jump to the menu layer of a window."); + ImGui::Unindent(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar() +//----------------------------------------------------------------------------- +// - ShowExampleAppMainMenuBar() +// - ShowExampleMenuFile() +//----------------------------------------------------------------------------- + +// Demonstrate creating a "main" fullscreen menu bar and populating it. +// Note the difference between BeginMainMenuBar() and BeginMenuBar(): +// - BeginMenuBar() = menu-bar inside current window (which needs the ImGuiWindowFlags_MenuBar flag!) +// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it. +static void ShowExampleAppMainMenuBar() +{ + if (ImGui::BeginMainMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + if (ImGui::BeginMenu("Edit")) + { + if (ImGui::MenuItem("Undo", "CTRL+Z")) {} + if (ImGui::MenuItem("Redo", "CTRL+Y", false, false)) {} // Disabled item + ImGui::Separator(); + if (ImGui::MenuItem("Cut", "CTRL+X")) {} + if (ImGui::MenuItem("Copy", "CTRL+C")) {} + if (ImGui::MenuItem("Paste", "CTRL+V")) {} + ImGui::EndMenu(); + } + ImGui::EndMainMenuBar(); + } +} + +// Note that shortcuts are currently provided for display only +// (future version will add explicit flags to BeginMenu() to request processing shortcuts) +static void ShowExampleMenuFile() +{ + IMGUI_DEMO_MARKER("Examples/Menu"); + ImGui::MenuItem("(demo menu)", NULL, false, false); + if (ImGui::MenuItem("New")) {} + if (ImGui::MenuItem("Open", "Ctrl+O")) {} + if (ImGui::BeginMenu("Open Recent")) + { + ImGui::MenuItem("fish_hat.c"); + ImGui::MenuItem("fish_hat.inl"); + ImGui::MenuItem("fish_hat.h"); + if (ImGui::BeginMenu("More..")) + { + ImGui::MenuItem("Hello"); + ImGui::MenuItem("Sailor"); + if (ImGui::BeginMenu("Recurse..")) + { + ShowExampleMenuFile(); + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Save", "Ctrl+S")) {} + if (ImGui::MenuItem("Save As..")) {} + + ImGui::Separator(); + IMGUI_DEMO_MARKER("Examples/Menu/Options"); + if (ImGui::BeginMenu("Options")) + { + static bool enabled = true; + ImGui::MenuItem("Enabled", "", &enabled); + ImGui::BeginChild("child", ImVec2(0, 60), true); + for (int i = 0; i < 10; i++) + ImGui::Text("Scrolling Text %d", i); + ImGui::EndChild(); + static float f = 0.5f; + static int n = 0; + ImGui::SliderFloat("Value", &f, 0.0f, 1.0f); + ImGui::InputFloat("Input", &f, 0.1f); + ImGui::Combo("Combo", &n, "Yes\0No\0Maybe\0\0"); + ImGui::EndMenu(); + } + + IMGUI_DEMO_MARKER("Examples/Menu/Colors"); + if (ImGui::BeginMenu("Colors")) + { + float sz = ImGui::GetTextLineHeight(); + for (int i = 0; i < ImGuiCol_COUNT; i++) + { + const char* name = ImGui::GetStyleColorName((ImGuiCol)i); + ImVec2 p = ImGui::GetCursorScreenPos(); + ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + sz, p.y + sz), ImGui::GetColorU32((ImGuiCol)i)); + ImGui::Dummy(ImVec2(sz, sz)); + ImGui::SameLine(); + ImGui::MenuItem(name); + } + ImGui::EndMenu(); + } + + // Here we demonstrate appending again to the "Options" menu (which we already created above) + // Of course in this demo it is a little bit silly that this function calls BeginMenu("Options") twice. + // In a real code-base using it would make senses to use this feature from very different code locations. + if (ImGui::BeginMenu("Options")) // <-- Append! + { + IMGUI_DEMO_MARKER("Examples/Menu/Append to an existing menu"); + static bool b = true; + ImGui::Checkbox("SomeOption", &b); + ImGui::EndMenu(); + } + + if (ImGui::BeginMenu("Disabled", false)) // Disabled + { + IM_ASSERT(0); + } + if (ImGui::MenuItem("Checked", NULL, true)) {} + ImGui::Separator(); + if (ImGui::MenuItem("Quit", "Alt+F4")) {} +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Console / ShowExampleAppConsole() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple console window, with scrolling, filtering, completion and history. +// For the console example, we are using a more C++ like approach of declaring a class to hold both data and functions. +struct ExampleAppConsole +{ + char InputBuf[256]; + ImVector Items; + ImVector Commands; + ImVector History; + int HistoryPos; // -1: new line, 0..History.Size-1 browsing history. + ImGuiTextFilter Filter; + bool AutoScroll; + bool ScrollToBottom; + + ExampleAppConsole() + { + IMGUI_DEMO_MARKER("Examples/Console"); + ClearLog(); + memset(InputBuf, 0, sizeof(InputBuf)); + HistoryPos = -1; + + // "CLASSIFY" is here to provide the test case where "C"+[tab] completes to "CL" and display multiple matches. + Commands.push_back("HELP"); + Commands.push_back("HISTORY"); + Commands.push_back("CLEAR"); + Commands.push_back("CLASSIFY"); + AutoScroll = true; + ScrollToBottom = false; + AddLog("Welcome to Dear ImGui!"); + } + ~ExampleAppConsole() + { + ClearLog(); + for (int i = 0; i < History.Size; i++) + free(History[i]); + } + + // Portable helpers + static int Stricmp(const char* s1, const char* s2) { int d; while ((d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; } return d; } + static int Strnicmp(const char* s1, const char* s2, int n) { int d = 0; while (n > 0 && (d = toupper(*s2) - toupper(*s1)) == 0 && *s1) { s1++; s2++; n--; } return d; } + static char* Strdup(const char* s) { IM_ASSERT(s); size_t len = strlen(s) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)s, len); } + static void Strtrim(char* s) { char* str_end = s + strlen(s); while (str_end > s && str_end[-1] == ' ') str_end--; *str_end = 0; } + + void ClearLog() + { + for (int i = 0; i < Items.Size; i++) + free(Items[i]); + Items.clear(); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + // FIXME-OPT + char buf[1024]; + va_list args; + va_start(args, fmt); + vsnprintf(buf, IM_ARRAYSIZE(buf), fmt, args); + buf[IM_ARRAYSIZE(buf)-1] = 0; + va_end(args); + Items.push_back(Strdup(buf)); + } + + void Draw(const char* title, bool* p_open) + { + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // As a specific feature guaranteed by the library, after calling Begin() the last Item represent the title bar. + // So e.g. IsItemHovered() will return true when hovering the title bar. + // Here we create a context menu only available from the title bar. + if (ImGui::BeginPopupContextItem()) + { + if (ImGui::MenuItem("Close Console")) + *p_open = false; + ImGui::EndPopup(); + } + + ImGui::TextWrapped( + "This example implements a console with basic coloring, completion (TAB key) and history (Up/Down keys). A more elaborate " + "implementation may want to store entries along with extra data such as timestamp, emitter, etc."); + ImGui::TextWrapped("Enter 'HELP' for help."); + + // TODO: display items starting from the bottom + + if (ImGui::SmallButton("Add Debug Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Add Debug Error")) { AddLog("[error] something went wrong"); } + ImGui::SameLine(); + if (ImGui::SmallButton("Clear")) { ClearLog(); } + ImGui::SameLine(); + bool copy_to_clipboard = ImGui::SmallButton("Copy"); + //static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); } + + ImGui::Separator(); + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Options, Filter + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180); + ImGui::Separator(); + + // Reserve enough left-over height for 1 separator + 1 input text + const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); + if (ImGui::BeginChild("ScrollingRegion", ImVec2(0, -footer_height_to_reserve), false, ImGuiWindowFlags_HorizontalScrollbar)) + { + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::Selectable("Clear")) ClearLog(); + ImGui::EndPopup(); + } + + // Display every line as a separate entry so we can change their color or add custom widgets. + // If you only want raw text you can use ImGui::TextUnformatted(log.begin(), log.end()); + // NB- if you have thousands of entries this approach may be too inefficient and may require user-side clipping + // to only process visible items. The clipper will automatically measure the height of your first item and then + // "seek" to display only items in the visible area. + // To use the clipper we can replace your standard loop: + // for (int i = 0; i < Items.Size; i++) + // With: + // ImGuiListClipper clipper; + // clipper.Begin(Items.Size); + // while (clipper.Step()) + // for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + // - That your items are evenly spaced (same height) + // - That you have cheap random access to your elements (you can access them given their index, + // without processing all the ones before) + // You cannot this code as-is if a filter is active because it breaks the 'cheap random-access' property. + // We would need random-access on the post-filtered list. + // A typical application wanting coarse clipping and filtering may want to pre-compute an array of indices + // or offsets of items that passed the filtering test, recomputing this array when user changes the filter, + // and appending newly elements as they are inserted. This is left as a task to the user until we can manage + // to improve this example code! + // If your items are of variable height: + // - Split them into same height items would be simpler and facilitate random-seeking into your list. + // - Consider using manual call to IsRectVisible() and skipping extraneous decoration from your items. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4, 1)); // Tighten spacing + if (copy_to_clipboard) + ImGui::LogToClipboard(); + for (int i = 0; i < Items.Size; i++) + { + const char* item = Items[i]; + if (!Filter.PassFilter(item)) + continue; + + // Normally you would store more information in your item than just a string. + // (e.g. make Items[] an array of structure, store color/type etc.) + ImVec4 color; + bool has_color = false; + if (strstr(item, "[error]")) { color = ImVec4(1.0f, 0.4f, 0.4f, 1.0f); has_color = true; } + else if (strncmp(item, "# ", 2) == 0) { color = ImVec4(1.0f, 0.8f, 0.6f, 1.0f); has_color = true; } + if (has_color) + ImGui::PushStyleColor(ImGuiCol_Text, color); + ImGui::TextUnformatted(item); + if (has_color) + ImGui::PopStyleColor(); + } + if (copy_to_clipboard) + ImGui::LogFinish(); + + // Keep up at the bottom of the scroll region if we were already at the bottom at the beginning of the frame. + // Using a scrollbar or mouse-wheel will take away from the bottom edge. + if (ScrollToBottom || (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())) + ImGui::SetScrollHereY(1.0f); + ScrollToBottom = false; + + ImGui::PopStyleVar(); + } + ImGui::EndChild(); + ImGui::Separator(); + + // Command-line + bool reclaim_focus = false; + ImGuiInputTextFlags input_text_flags = ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_EscapeClearsAll | ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory; + if (ImGui::InputText("Input", InputBuf, IM_ARRAYSIZE(InputBuf), input_text_flags, &TextEditCallbackStub, (void*)this)) + { + char* s = InputBuf; + Strtrim(s); + if (s[0]) + ExecCommand(s); + strcpy(s, ""); + reclaim_focus = true; + } + + // Auto-focus on window apparition + ImGui::SetItemDefaultFocus(); + if (reclaim_focus) + ImGui::SetKeyboardFocusHere(-1); // Auto focus previous widget + + ImGui::End(); + } + + void ExecCommand(const char* command_line) + { + AddLog("# %s\n", command_line); + + // Insert into history. First find match and delete it so it can be pushed to the back. + // This isn't trying to be smart or optimal. + HistoryPos = -1; + for (int i = History.Size - 1; i >= 0; i--) + if (Stricmp(History[i], command_line) == 0) + { + free(History[i]); + History.erase(History.begin() + i); + break; + } + History.push_back(Strdup(command_line)); + + // Process command + if (Stricmp(command_line, "CLEAR") == 0) + { + ClearLog(); + } + else if (Stricmp(command_line, "HELP") == 0) + { + AddLog("Commands:"); + for (int i = 0; i < Commands.Size; i++) + AddLog("- %s", Commands[i]); + } + else if (Stricmp(command_line, "HISTORY") == 0) + { + int first = History.Size - 10; + for (int i = first > 0 ? first : 0; i < History.Size; i++) + AddLog("%3d: %s\n", i, History[i]); + } + else + { + AddLog("Unknown command: '%s'\n", command_line); + } + + // On command input, we scroll to bottom even if AutoScroll==false + ScrollToBottom = true; + } + + // In C++11 you'd be better off using lambdas for this sort of forwarding callbacks + static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) + { + ExampleAppConsole* console = (ExampleAppConsole*)data->UserData; + return console->TextEditCallback(data); + } + + int TextEditCallback(ImGuiInputTextCallbackData* data) + { + //AddLog("cursor: %d, selection: %d-%d", data->CursorPos, data->SelectionStart, data->SelectionEnd); + switch (data->EventFlag) + { + case ImGuiInputTextFlags_CallbackCompletion: + { + // Example of TEXT COMPLETION + + // Locate beginning of current word + const char* word_end = data->Buf + data->CursorPos; + const char* word_start = word_end; + while (word_start > data->Buf) + { + const char c = word_start[-1]; + if (c == ' ' || c == '\t' || c == ',' || c == ';') + break; + word_start--; + } + + // Build a list of candidates + ImVector candidates; + for (int i = 0; i < Commands.Size; i++) + if (Strnicmp(Commands[i], word_start, (int)(word_end - word_start)) == 0) + candidates.push_back(Commands[i]); + + if (candidates.Size == 0) + { + // No match + AddLog("No match for \"%.*s\"!\n", (int)(word_end - word_start), word_start); + } + else if (candidates.Size == 1) + { + // Single match. Delete the beginning of the word and replace it entirely so we've got nice casing. + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0]); + data->InsertChars(data->CursorPos, " "); + } + else + { + // Multiple matches. Complete as much as we can.. + // So inputing "C"+Tab will complete to "CL" then display "CLEAR" and "CLASSIFY" as matches. + int match_len = (int)(word_end - word_start); + for (;;) + { + int c = 0; + bool all_candidates_matches = true; + for (int i = 0; i < candidates.Size && all_candidates_matches; i++) + if (i == 0) + c = toupper(candidates[i][match_len]); + else if (c == 0 || c != toupper(candidates[i][match_len])) + all_candidates_matches = false; + if (!all_candidates_matches) + break; + match_len++; + } + + if (match_len > 0) + { + data->DeleteChars((int)(word_start - data->Buf), (int)(word_end - word_start)); + data->InsertChars(data->CursorPos, candidates[0], candidates[0] + match_len); + } + + // List matches + AddLog("Possible matches:\n"); + for (int i = 0; i < candidates.Size; i++) + AddLog("- %s\n", candidates[i]); + } + + break; + } + case ImGuiInputTextFlags_CallbackHistory: + { + // Example of HISTORY + const int prev_history_pos = HistoryPos; + if (data->EventKey == ImGuiKey_UpArrow) + { + if (HistoryPos == -1) + HistoryPos = History.Size - 1; + else if (HistoryPos > 0) + HistoryPos--; + } + else if (data->EventKey == ImGuiKey_DownArrow) + { + if (HistoryPos != -1) + if (++HistoryPos >= History.Size) + HistoryPos = -1; + } + + // A better implementation would preserve the data on the current input line along with cursor position. + if (prev_history_pos != HistoryPos) + { + const char* history_str = (HistoryPos >= 0) ? History[HistoryPos] : ""; + data->DeleteChars(0, data->BufTextLen); + data->InsertChars(0, history_str); + } + } + } + return 0; + } +}; + +static void ShowExampleAppConsole(bool* p_open) +{ + static ExampleAppConsole console; + console.Draw("Example: Console", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Debug Log / ShowExampleAppLog() +//----------------------------------------------------------------------------- + +// Usage: +// static ExampleAppLog my_log; +// my_log.AddLog("Hello %d world\n", 123); +// my_log.Draw("title"); +struct ExampleAppLog +{ + ImGuiTextBuffer Buf; + ImGuiTextFilter Filter; + ImVector LineOffsets; // Index to lines offset. We maintain this with AddLog() calls. + bool AutoScroll; // Keep scrolling if already at the bottom. + + ExampleAppLog() + { + AutoScroll = true; + Clear(); + } + + void Clear() + { + Buf.clear(); + LineOffsets.clear(); + LineOffsets.push_back(0); + } + + void AddLog(const char* fmt, ...) IM_FMTARGS(2) + { + int old_size = Buf.size(); + va_list args; + va_start(args, fmt); + Buf.appendfv(fmt, args); + va_end(args); + for (int new_size = Buf.size(); old_size < new_size; old_size++) + if (Buf[old_size] == '\n') + LineOffsets.push_back(old_size + 1); + } + + void Draw(const char* title, bool* p_open = NULL) + { + if (!ImGui::Begin(title, p_open)) + { + ImGui::End(); + return; + } + + // Options menu + if (ImGui::BeginPopup("Options")) + { + ImGui::Checkbox("Auto-scroll", &AutoScroll); + ImGui::EndPopup(); + } + + // Main window + if (ImGui::Button("Options")) + ImGui::OpenPopup("Options"); + ImGui::SameLine(); + bool clear = ImGui::Button("Clear"); + ImGui::SameLine(); + bool copy = ImGui::Button("Copy"); + ImGui::SameLine(); + Filter.Draw("Filter", -100.0f); + + ImGui::Separator(); + + if (ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar)) + { + if (clear) + Clear(); + if (copy) + ImGui::LogToClipboard(); + + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + const char* buf = Buf.begin(); + const char* buf_end = Buf.end(); + if (Filter.IsActive()) + { + // In this example we don't use the clipper when Filter is enabled. + // This is because we don't have random access to the result of our filter. + // A real application processing logs with ten of thousands of entries may want to store the result of + // search/filter.. especially if the filtering function is not trivial (e.g. reg-exp). + for (int line_no = 0; line_no < LineOffsets.Size; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + if (Filter.PassFilter(line_start, line_end)) + ImGui::TextUnformatted(line_start, line_end); + } + } + else + { + // The simplest and easy way to display the entire buffer: + // ImGui::TextUnformatted(buf_begin, buf_end); + // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward + // to skip non-visible lines. Here we instead demonstrate using the clipper to only process lines that are + // within the visible area. + // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them + // on your side is recommended. Using ImGuiListClipper requires + // - A) random access into your data + // - B) items all being the same height, + // both of which we can handle since we have an array pointing to the beginning of each line of text. + // When using the filter (in the block of code above) we don't have random access into the data to display + // anymore, which is why we don't use the clipper. Storing or skimming through the search result would make + // it possible (and would be recommended if you want to search through tens of thousands of entries). + ImGuiListClipper clipper; + clipper.Begin(LineOffsets.Size); + while (clipper.Step()) + { + for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++) + { + const char* line_start = buf + LineOffsets[line_no]; + const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end; + ImGui::TextUnformatted(line_start, line_end); + } + } + clipper.End(); + } + ImGui::PopStyleVar(); + + // Keep up at the bottom of the scroll region if we were already at the bottom at the beginning of the frame. + // Using a scrollbar or mouse-wheel will take away from the bottom edge. + if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()) + ImGui::SetScrollHereY(1.0f); + } + ImGui::EndChild(); + ImGui::End(); + } +}; + +// Demonstrate creating a simple log window with basic filtering. +static void ShowExampleAppLog(bool* p_open) +{ + static ExampleAppLog log; + + // For the demo: add a debug button _BEFORE_ the normal log window contents + // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window. + // Most of the contents of the window will be added by the log.Draw() call. + ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver); + ImGui::Begin("Example: Log", p_open); + IMGUI_DEMO_MARKER("Examples/Log"); + if (ImGui::SmallButton("[Debug] Add 5 entries")) + { + static int counter = 0; + const char* categories[3] = { "info", "warn", "error" }; + const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" }; + for (int n = 0; n < 5; n++) + { + const char* category = categories[counter % IM_ARRAYSIZE(categories)]; + const char* word = words[counter % IM_ARRAYSIZE(words)]; + log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n", + ImGui::GetFrameCount(), category, ImGui::GetTime(), word); + counter++; + } + } + ImGui::End(); + + // Actually call in the regular Log helper (which will Begin() into the same window as we just did) + log.Draw("Example: Log", p_open); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple Layout / ShowExampleAppLayout() +//----------------------------------------------------------------------------- + +// Demonstrate create a window with multiple child windows. +static void ShowExampleAppLayout(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver); + if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar)) + { + IMGUI_DEMO_MARKER("Examples/Simple layout"); + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + if (ImGui::MenuItem("Close", "Ctrl+W")) { *p_open = false; } + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // Left + static int selected = 0; + { + ImGui::BeginChild("left pane", ImVec2(150, 0), true); + for (int i = 0; i < 100; i++) + { + // FIXME: Good candidate to use ImGuiSelectableFlags_SelectOnNav + char label[128]; + sprintf(label, "MyObject %d", i); + if (ImGui::Selectable(label, selected == i)) + selected = i; + } + ImGui::EndChild(); + } + ImGui::SameLine(); + + // Right + { + ImGui::BeginGroup(); + ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us + ImGui::Text("MyObject: %d", selected); + ImGui::Separator(); + if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None)) + { + if (ImGui::BeginTabItem("Description")) + { + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); + ImGui::EndTabItem(); + } + if (ImGui::BeginTabItem("Details")) + { + ImGui::Text("ID: 0123456789"); + ImGui::EndTabItem(); + } + ImGui::EndTabBar(); + } + ImGui::EndChild(); + if (ImGui::Button("Revert")) {} + ImGui::SameLine(); + if (ImGui::Button("Save")) {} + ImGui::EndGroup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Property Editor / ShowExampleAppPropertyEditor() +//----------------------------------------------------------------------------- + +static void ShowPlaceholderObject(const char* prefix, int uid) +{ + // Use object uid as identifier. Most commonly you could also use the object pointer as a base ID. + ImGui::PushID(uid); + + // Text and Tree nodes are less high than framed widgets, using AlignTextToFramePadding() we add vertical spacing to make the tree lines equal high. + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + bool node_open = ImGui::TreeNode("Object", "%s_%u", prefix, uid); + ImGui::TableSetColumnIndex(1); + ImGui::Text("my sailor is rich"); + + if (node_open) + { + static float placeholder_members[8] = { 0.0f, 0.0f, 1.0f, 3.1416f, 100.0f, 999.0f }; + for (int i = 0; i < 8; i++) + { + ImGui::PushID(i); // Use field index as identifier. + if (i < 2) + { + ShowPlaceholderObject("Child", 424242); + } + else + { + // Here we use a TreeNode to highlight on hover (we could use e.g. Selectable as well) + ImGui::TableNextRow(); + ImGui::TableSetColumnIndex(0); + ImGui::AlignTextToFramePadding(); + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet; + ImGui::TreeNodeEx("Field", flags, "Field_%d", i); + + ImGui::TableSetColumnIndex(1); + ImGui::SetNextItemWidth(-FLT_MIN); + if (i >= 5) + ImGui::InputFloat("##value", &placeholder_members[i], 1.0f); + else + ImGui::DragFloat("##value", &placeholder_members[i], 0.01f); + ImGui::NextColumn(); + } + ImGui::PopID(); + } + ImGui::TreePop(); + } + ImGui::PopID(); +} + +// Demonstrate create a simple property editor. +static void ShowExampleAppPropertyEditor(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(430, 450), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Property editor", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Property Editor"); + + HelpMarker( + "This example shows how you may implement a property editor using two columns.\n" + "All objects/fields data are dummies here.\n" + "Remember that in many simple cases, you can use ImGui::SameLine(xxx) to position\n" + "your cursor horizontally instead of using the Columns() API."); + + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 2)); + if (ImGui::BeginTable("split", 2, ImGuiTableFlags_BordersOuter | ImGuiTableFlags_Resizable)) + { + // Iterate placeholder objects (all the same data) + for (int obj_i = 0; obj_i < 4; obj_i++) + { + ShowPlaceholderObject("Object", obj_i); + //ImGui::Separator(); + } + ImGui::EndTable(); + } + ImGui::PopStyleVar(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Long Text / ShowExampleAppLongText() +//----------------------------------------------------------------------------- + +// Demonstrate/test rendering huge amount of text, and the incidence of clipping. +static void ShowExampleAppLongText(bool* p_open) +{ + ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); + if (!ImGui::Begin("Example: Long text display", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Long text display"); + + static int test_type = 0; + static ImGuiTextBuffer log; + static int lines = 0; + ImGui::Text("Printing unusually long amount of text."); + ImGui::Combo("Test type", &test_type, + "Single call to TextUnformatted()\0" + "Multiple calls to Text(), clipped\0" + "Multiple calls to Text(), not clipped (slow)\0"); + ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size()); + if (ImGui::Button("Clear")) { log.clear(); lines = 0; } + ImGui::SameLine(); + if (ImGui::Button("Add 1000 lines")) + { + for (int i = 0; i < 1000; i++) + log.appendf("%i The quick brown fox jumps over the lazy dog\n", lines + i); + lines += 1000; + } + ImGui::BeginChild("Log"); + switch (test_type) + { + case 0: + // Single call to TextUnformatted() with a big buffer + ImGui::TextUnformatted(log.begin(), log.end()); + break; + case 1: + { + // Multiple calls to Text(), manually coarsely clipped - demonstrate how to use the ImGuiListClipper helper. + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + ImGuiListClipper clipper; + clipper.Begin(lines); + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + case 2: + // Multiple calls to Text(), not clipped (slow) + ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + for (int i = 0; i < lines; i++) + ImGui::Text("%i The quick brown fox jumps over the lazy dog", i); + ImGui::PopStyleVar(); + break; + } + ImGui::EndChild(); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Auto Resize / ShowExampleAppAutoResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window which gets auto-resized according to its content. +static void ShowExampleAppAutoResize(bool* p_open) +{ + if (!ImGui::Begin("Example: Auto-resizing window", p_open, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Auto-resizing window"); + + static int lines = 10; + ImGui::TextUnformatted( + "Window will resize every-frame to the size of its content.\n" + "Note that you probably don't want to query the window size to\n" + "output your content because that would create a feedback loop."); + ImGui::SliderInt("Number of lines", &lines, 1, 20); + for (int i = 0; i < lines; i++) + ImGui::Text("%*sThis is line %d", i * 4, "", i); // Pad with space to extend size horizontally + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Constrained Resize / ShowExampleAppConstrainedResize() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window with custom resize constraints. +// Note that size constraints currently don't work on a docked window (when in 'docking' branch) +static void ShowExampleAppConstrainedResize(bool* p_open) +{ + struct CustomConstraints + { + // Helper functions to demonstrate programmatic constraints + // FIXME: This doesn't take account of decoration size (e.g. title bar), library should make this easier. + static void AspectRatio(ImGuiSizeCallbackData* data) { float aspect_ratio = *(float*)data->UserData; data->DesiredSize.x = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); data->DesiredSize.y = (float)(int)(data->DesiredSize.x / aspect_ratio); } + static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = IM_MAX(data->CurrentSize.x, data->CurrentSize.y); } + static void Step(ImGuiSizeCallbackData* data) { float step = *(float*)data->UserData; data->DesiredSize = ImVec2((int)(data->CurrentSize.x / step + 0.5f) * step, (int)(data->CurrentSize.y / step + 0.5f) * step); } + }; + + const char* test_desc[] = + { + "Between 100x100 and 500x500", + "At least 100x100", + "Resize vertical only", + "Resize horizontal only", + "Width Between 400 and 500", + "Custom: Aspect Ratio 16:9", + "Custom: Always Square", + "Custom: Fixed Steps (100)", + }; + + // Options + static bool auto_resize = false; + static bool window_padding = true; + static int type = 5; // Aspect Ratio + static int display_lines = 10; + + // Submit constraint + float aspect_ratio = 16.0f / 9.0f; + float fixed_step = 100.0f; + if (type == 0) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(500, 500)); // Between 100x100 and 500x500 + if (type == 1) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100 + if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 0), ImVec2(-1, FLT_MAX)); // Vertical only + if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(0, -1), ImVec2(FLT_MAX, -1)); // Horizontal only + if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width Between and 400 and 500 + if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::AspectRatio, (void*)&aspect_ratio); // Aspect ratio + if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square + if (type == 7) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)&fixed_step); // Fixed Step + + // Submit window + if (!window_padding) + ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); + const ImGuiWindowFlags window_flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0; + const bool window_open = ImGui::Begin("Example: Constrained Resize", p_open, window_flags); + if (!window_padding) + ImGui::PopStyleVar(); + if (window_open) + { + IMGUI_DEMO_MARKER("Examples/Constrained Resizing window"); + if (ImGui::GetIO().KeyShift) + { + // Display a dummy viewport (in your real app you would likely use ImageButton() to display a texture. + ImVec2 avail_size = ImGui::GetContentRegionAvail(); + ImVec2 pos = ImGui::GetCursorScreenPos(); + ImGui::ColorButton("viewport", ImVec4(0.5f, 0.2f, 0.5f, 1.0f), ImGuiColorEditFlags_NoTooltip | ImGuiColorEditFlags_NoDragDrop, avail_size); + ImGui::SetCursorScreenPos(ImVec2(pos.x + 10, pos.y + 10)); + ImGui::Text("%.2f x %.2f", avail_size.x, avail_size.y); + } + else + { + ImGui::Text("(Hold SHIFT to display a dummy viewport)"); + if (ImGui::Button("Set 200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine(); + if (ImGui::Button("Set 500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine(); + if (ImGui::Button("Set 800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); } + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20); + ImGui::Combo("Constraint", &type, test_desc, IM_ARRAYSIZE(test_desc)); + ImGui::SetNextItemWidth(ImGui::GetFontSize() * 20); + ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100); + ImGui::Checkbox("Auto-resize", &auto_resize); + ImGui::Checkbox("Window padding", &window_padding); + for (int i = 0; i < display_lines; i++) + ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, ""); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Simple overlay / ShowExampleAppSimpleOverlay() +//----------------------------------------------------------------------------- + +// Demonstrate creating a simple static window with no decoration +// + a context-menu to choose which corner of the screen to use. +static void ShowExampleAppSimpleOverlay(bool* p_open) +{ + static int location = 0; + ImGuiIO& io = ImGui::GetIO(); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav; + if (location >= 0) + { + const float PAD = 10.0f; + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImVec2 work_pos = viewport->WorkPos; // Use work area to avoid menu-bar/task-bar, if any! + ImVec2 work_size = viewport->WorkSize; + ImVec2 window_pos, window_pos_pivot; + window_pos.x = (location & 1) ? (work_pos.x + work_size.x - PAD) : (work_pos.x + PAD); + window_pos.y = (location & 2) ? (work_pos.y + work_size.y - PAD) : (work_pos.y + PAD); + window_pos_pivot.x = (location & 1) ? 1.0f : 0.0f; + window_pos_pivot.y = (location & 2) ? 1.0f : 0.0f; + ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot); + window_flags |= ImGuiWindowFlags_NoMove; + } + else if (location == -2) + { + // Center window + ImGui::SetNextWindowPos(ImGui::GetMainViewport()->GetCenter(), ImGuiCond_Always, ImVec2(0.5f, 0.5f)); + window_flags |= ImGuiWindowFlags_NoMove; + } + ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background + if (ImGui::Begin("Example: Simple overlay", p_open, window_flags)) + { + IMGUI_DEMO_MARKER("Examples/Simple Overlay"); + ImGui::Text("Simple overlay\n" "(right-click to change position)"); + ImGui::Separator(); + if (ImGui::IsMousePosValid()) + ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y); + else + ImGui::Text("Mouse Position: "); + if (ImGui::BeginPopupContextWindow()) + { + if (ImGui::MenuItem("Custom", NULL, location == -1)) location = -1; + if (ImGui::MenuItem("Center", NULL, location == -2)) location = -2; + if (ImGui::MenuItem("Top-left", NULL, location == 0)) location = 0; + if (ImGui::MenuItem("Top-right", NULL, location == 1)) location = 1; + if (ImGui::MenuItem("Bottom-left", NULL, location == 2)) location = 2; + if (ImGui::MenuItem("Bottom-right", NULL, location == 3)) location = 3; + if (p_open && ImGui::MenuItem("Close")) *p_open = false; + ImGui::EndPopup(); + } + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Fullscreen window / ShowExampleAppFullscreen() +//----------------------------------------------------------------------------- + +// Demonstrate creating a window covering the entire screen/viewport +static void ShowExampleAppFullscreen(bool* p_open) +{ + static bool use_work_area = true; + static ImGuiWindowFlags flags = ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoSavedSettings; + + // We demonstrate using the full viewport area or the work area (without menu-bars, task-bars etc.) + // Based on your use case you may want one of the other. + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(use_work_area ? viewport->WorkPos : viewport->Pos); + ImGui::SetNextWindowSize(use_work_area ? viewport->WorkSize : viewport->Size); + + if (ImGui::Begin("Example: Fullscreen window", p_open, flags)) + { + ImGui::Checkbox("Use work area instead of main area", &use_work_area); + ImGui::SameLine(); + HelpMarker("Main Area = entire viewport,\nWork Area = entire viewport minus sections used by the main menu bars, task bars etc.\n\nEnable the main-menu bar in Examples menu to see the difference."); + + ImGui::CheckboxFlags("ImGuiWindowFlags_NoBackground", &flags, ImGuiWindowFlags_NoBackground); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoDecoration", &flags, ImGuiWindowFlags_NoDecoration); + ImGui::Indent(); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoTitleBar", &flags, ImGuiWindowFlags_NoTitleBar); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoCollapse", &flags, ImGuiWindowFlags_NoCollapse); + ImGui::CheckboxFlags("ImGuiWindowFlags_NoScrollbar", &flags, ImGuiWindowFlags_NoScrollbar); + ImGui::Unindent(); + + if (p_open && ImGui::Button("Close this window")) + *p_open = false; + } + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles() +//----------------------------------------------------------------------------- + +// Demonstrate the use of "##" and "###" in identifiers to manipulate ID generation. +// This applies to all regular items as well. +// Read FAQ section "How can I have multiple widgets with the same label?" for details. +static void ShowExampleAppWindowTitles(bool*) +{ + const ImGuiViewport* viewport = ImGui::GetMainViewport(); + const ImVec2 base_pos = viewport->Pos; + + // By default, Windows are uniquely identified by their title. + // You can use the "##" and "###" markers to manipulate the display/ID. + + // Using "##" to display same title but have unique identifier. + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 100), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##1"); + IMGUI_DEMO_MARKER("Examples/Manipulating window titles"); + ImGui::Text("This is window 1.\nMy title is the same as window 2, but my identifier is unique."); + ImGui::End(); + + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 200), ImGuiCond_FirstUseEver); + ImGui::Begin("Same title as another window##2"); + ImGui::Text("This is window 2.\nMy title is the same as window 1, but my identifier is unique."); + ImGui::End(); + + // Using "###" to display a changing title but keep a static identifier "AnimatedTitle" + char buf[128]; + sprintf(buf, "Animated title %c %d###AnimatedTitle", "|/-\\"[(int)(ImGui::GetTime() / 0.25f) & 3], ImGui::GetFrameCount()); + ImGui::SetNextWindowPos(ImVec2(base_pos.x + 100, base_pos.y + 300), ImGuiCond_FirstUseEver); + ImGui::Begin(buf); + ImGui::Text("This window has a changing title."); + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering() +//----------------------------------------------------------------------------- + +// Demonstrate using the low-level ImDrawList to draw custom shapes. +static void ShowExampleAppCustomRendering(bool* p_open) +{ + if (!ImGui::Begin("Example: Custom rendering", p_open)) + { + ImGui::End(); + return; + } + IMGUI_DEMO_MARKER("Examples/Custom Rendering"); + + // Tip: If you do a lot of custom rendering, you probably want to use your own geometrical types and benefit of + // overloaded operators, etc. Define IM_VEC2_CLASS_EXTRA in imconfig.h to create implicit conversions between your + // types and ImVec2/ImVec4. Dear ImGui defines overloaded operators but they are internal to imgui.cpp and not + // exposed outside (to avoid messing with your types) In this example we are not using the maths operators! + + if (ImGui::BeginTabBar("##TabBar")) + { + if (ImGui::BeginTabItem("Primitives")) + { + ImGui::PushItemWidth(-ImGui::GetFontSize() * 15); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + + // Draw gradients + // (note that those are currently exacerbating our sRGB/Linear issues) + // Calling ImGui::GetColorU32() multiplies the given colors by the current Style Alpha, but you may pass the IM_COL32() directly as well.. + ImGui::Text("Gradients"); + ImVec2 gradient_size = ImVec2(ImGui::CalcItemWidth(), ImGui::GetFrameHeight()); + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 0, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 255, 255, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient1", gradient_size); + } + { + ImVec2 p0 = ImGui::GetCursorScreenPos(); + ImVec2 p1 = ImVec2(p0.x + gradient_size.x, p0.y + gradient_size.y); + ImU32 col_a = ImGui::GetColorU32(IM_COL32(0, 255, 0, 255)); + ImU32 col_b = ImGui::GetColorU32(IM_COL32(255, 0, 0, 255)); + draw_list->AddRectFilledMultiColor(p0, p1, col_a, col_b, col_b, col_a); + ImGui::InvisibleButton("##gradient2", gradient_size); + } + + // Draw a bunch of primitives + ImGui::Text("All primitives"); + static float sz = 36.0f; + static float thickness = 3.0f; + static int ngon_sides = 6; + static bool circle_segments_override = false; + static int circle_segments_override_v = 12; + static bool curve_segments_override = false; + static int curve_segments_override_v = 8; + static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f); + ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 100.0f, "%.0f"); + ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f"); + ImGui::SliderInt("N-gon sides", &ngon_sides, 3, 12); + ImGui::Checkbox("##circlesegmentoverride", &circle_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + circle_segments_override |= ImGui::SliderInt("Circle segments override", &circle_segments_override_v, 3, 40); + ImGui::Checkbox("##curvessegmentoverride", &curve_segments_override); + ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x); + curve_segments_override |= ImGui::SliderInt("Curves segments override", &curve_segments_override_v, 3, 40); + ImGui::ColorEdit4("Color", &colf.x); + + const ImVec2 p = ImGui::GetCursorScreenPos(); + const ImU32 col = ImColor(colf); + const float spacing = 10.0f; + const ImDrawFlags corners_tl_br = ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomRight; + const float rounding = sz / 5.0f; + const int circle_segments = circle_segments_override ? circle_segments_override_v : 0; + const int curve_segments = curve_segments_override ? curve_segments_override_v : 0; + float x = p.x + 4.0f; + float y = p.y + 4.0f; + for (int n = 0; n < 2; n++) + { + // First line uses a thickness of 1.0f, second line uses the configurable thickness + float th = (n == 0) ? 1.0f : thickness; + draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon + draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, ImDrawFlags_None, th); x += sz + spacing; // Square + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, ImDrawFlags_None, th); x += sz + spacing; // Square with all rounded corners + draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, rounding, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th);x += sz + spacing; // Triangle + //draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th);x+= sz*0.4f + spacing; // Thin triangle + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!) + draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line + + // Quadratic Bezier Curve (3 control points) + ImVec2 cp3[3] = { ImVec2(x, y + sz * 0.6f), ImVec2(x + sz * 0.5f, y - sz * 0.4f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierQuadratic(cp3[0], cp3[1], cp3[2], col, th, curve_segments); x += sz + spacing; + + // Cubic Bezier Curve (4 control points) + ImVec2 cp4[4] = { ImVec2(x, y), ImVec2(x + sz * 1.3f, y + sz * 0.3f), ImVec2(x + sz - sz * 1.3f, y + sz - sz * 0.3f), ImVec2(x + sz, y + sz) }; + draw_list->AddBezierCubic(cp4[0], cp4[1], cp4[2], cp4[3], col, th, curve_segments); + + x = p.x + 4; + y += sz + spacing; + } + draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon + draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments); x += sz + spacing; // Circle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners + draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle + //draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing * 2.0f;// Vertical line (faster than AddLine, but only handle integer thickness) + draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine) + draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255)); + + ImGui::Dummy(ImVec2((sz + spacing) * 10.2f, (sz + spacing) * 3.0f)); + ImGui::PopItemWidth(); + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("Canvas")) + { + static ImVector points; + static ImVec2 scrolling(0.0f, 0.0f); + static bool opt_enable_grid = true; + static bool opt_enable_context_menu = true; + static bool adding_line = false; + + ImGui::Checkbox("Enable grid", &opt_enable_grid); + ImGui::Checkbox("Enable context menu", &opt_enable_context_menu); + ImGui::Text("Mouse Left: drag to add lines,\nMouse Right: drag to scroll, click for context menu."); + + // Typically you would use a BeginChild()/EndChild() pair to benefit from a clipping region + own scrolling. + // Here we demonstrate that this can be replaced by simple offsetting + custom drawing + PushClipRect/PopClipRect() calls. + // To use a child window instead we could use, e.g: + // ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Disable padding + // ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(50, 50, 50, 255)); // Set a background color + // ImGui::BeginChild("canvas", ImVec2(0.0f, 0.0f), true, ImGuiWindowFlags_NoMove); + // ImGui::PopStyleColor(); + // ImGui::PopStyleVar(); + // [...] + // ImGui::EndChild(); + + // Using InvisibleButton() as a convenience 1) it will advance the layout cursor and 2) allows us to use IsItemHovered()/IsItemActive() + ImVec2 canvas_p0 = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates! + ImVec2 canvas_sz = ImGui::GetContentRegionAvail(); // Resize canvas to what's available + if (canvas_sz.x < 50.0f) canvas_sz.x = 50.0f; + if (canvas_sz.y < 50.0f) canvas_sz.y = 50.0f; + ImVec2 canvas_p1 = ImVec2(canvas_p0.x + canvas_sz.x, canvas_p0.y + canvas_sz.y); + + // Draw border and background color + ImGuiIO& io = ImGui::GetIO(); + ImDrawList* draw_list = ImGui::GetWindowDrawList(); + draw_list->AddRectFilled(canvas_p0, canvas_p1, IM_COL32(50, 50, 50, 255)); + draw_list->AddRect(canvas_p0, canvas_p1, IM_COL32(255, 255, 255, 255)); + + // This will catch our interactions + ImGui::InvisibleButton("canvas", canvas_sz, ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight); + const bool is_hovered = ImGui::IsItemHovered(); // Hovered + const bool is_active = ImGui::IsItemActive(); // Held + const ImVec2 origin(canvas_p0.x + scrolling.x, canvas_p0.y + scrolling.y); // Lock scrolled origin + const ImVec2 mouse_pos_in_canvas(io.MousePos.x - origin.x, io.MousePos.y - origin.y); + + // Add first and second point + if (is_hovered && !adding_line && ImGui::IsMouseClicked(ImGuiMouseButton_Left)) + { + points.push_back(mouse_pos_in_canvas); + points.push_back(mouse_pos_in_canvas); + adding_line = true; + } + if (adding_line) + { + points.back() = mouse_pos_in_canvas; + if (!ImGui::IsMouseDown(ImGuiMouseButton_Left)) + adding_line = false; + } + + // Pan (we use a zero mouse threshold when there's no context menu) + // You may decide to make that threshold dynamic based on whether the mouse is hovering something etc. + const float mouse_threshold_for_pan = opt_enable_context_menu ? -1.0f : 0.0f; + if (is_active && ImGui::IsMouseDragging(ImGuiMouseButton_Right, mouse_threshold_for_pan)) + { + scrolling.x += io.MouseDelta.x; + scrolling.y += io.MouseDelta.y; + } + + // Context menu (under default mouse threshold) + ImVec2 drag_delta = ImGui::GetMouseDragDelta(ImGuiMouseButton_Right); + if (opt_enable_context_menu && drag_delta.x == 0.0f && drag_delta.y == 0.0f) + ImGui::OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + if (ImGui::BeginPopup("context")) + { + if (adding_line) + points.resize(points.size() - 2); + adding_line = false; + if (ImGui::MenuItem("Remove one", NULL, false, points.Size > 0)) { points.resize(points.size() - 2); } + if (ImGui::MenuItem("Remove all", NULL, false, points.Size > 0)) { points.clear(); } + ImGui::EndPopup(); + } + + // Draw grid + all lines in the canvas + draw_list->PushClipRect(canvas_p0, canvas_p1, true); + if (opt_enable_grid) + { + const float GRID_STEP = 64.0f; + for (float x = fmodf(scrolling.x, GRID_STEP); x < canvas_sz.x; x += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x + x, canvas_p0.y), ImVec2(canvas_p0.x + x, canvas_p1.y), IM_COL32(200, 200, 200, 40)); + for (float y = fmodf(scrolling.y, GRID_STEP); y < canvas_sz.y; y += GRID_STEP) + draw_list->AddLine(ImVec2(canvas_p0.x, canvas_p0.y + y), ImVec2(canvas_p1.x, canvas_p0.y + y), IM_COL32(200, 200, 200, 40)); + } + for (int n = 0; n < points.Size; n += 2) + draw_list->AddLine(ImVec2(origin.x + points[n].x, origin.y + points[n].y), ImVec2(origin.x + points[n + 1].x, origin.y + points[n + 1].y), IM_COL32(255, 255, 0, 255), 2.0f); + draw_list->PopClipRect(); + + ImGui::EndTabItem(); + } + + if (ImGui::BeginTabItem("BG/FG draw lists")) + { + static bool draw_bg = true; + static bool draw_fg = true; + ImGui::Checkbox("Draw in Background draw list", &draw_bg); + ImGui::SameLine(); HelpMarker("The Background draw list will be rendered below every Dear ImGui windows."); + ImGui::Checkbox("Draw in Foreground draw list", &draw_fg); + ImGui::SameLine(); HelpMarker("The Foreground draw list will be rendered over every Dear ImGui windows."); + ImVec2 window_pos = ImGui::GetWindowPos(); + ImVec2 window_size = ImGui::GetWindowSize(); + ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f); + if (draw_bg) + ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 0, 10 + 4); + if (draw_fg) + ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 0, 10); + ImGui::EndTabItem(); + } + + ImGui::EndTabBar(); + } + + ImGui::End(); +} + +//----------------------------------------------------------------------------- +// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments() +//----------------------------------------------------------------------------- + +// Simplified structure to mimic a Document model +struct MyDocument +{ + const char* Name; // Document title + bool Open; // Set when open (we keep an array of all available documents to simplify demo code!) + bool OpenPrev; // Copy of Open from last update. + bool Dirty; // Set when the document has been modified + bool WantClose; // Set when the document + ImVec4 Color; // An arbitrary variable associated to the document + + MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f, 1.0f, 1.0f, 1.0f)) + { + Name = name; + Open = OpenPrev = open; + Dirty = false; + WantClose = false; + Color = color; + } + void DoOpen() { Open = true; } + void DoQueueClose() { WantClose = true; } + void DoForceClose() { Open = false; Dirty = false; } + void DoSave() { Dirty = false; } + + // Display placeholder contents for the Document + static void DisplayContents(MyDocument* doc) + { + ImGui::PushID(doc); + ImGui::Text("Document \"%s\"", doc->Name); + ImGui::PushStyleColor(ImGuiCol_Text, doc->Color); + ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."); + ImGui::PopStyleColor(); + if (ImGui::Button("Modify", ImVec2(100, 0))) + doc->Dirty = true; + ImGui::SameLine(); + if (ImGui::Button("Save", ImVec2(100, 0))) + doc->DoSave(); + ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior. + ImGui::PopID(); + } + + // Display context menu for the Document + static void DisplayContextMenu(MyDocument* doc) + { + if (!ImGui::BeginPopupContextItem()) + return; + + char buf[256]; + sprintf(buf, "Save %s", doc->Name); + if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open)) + doc->DoSave(); + if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open)) + doc->DoQueueClose(); + ImGui::EndPopup(); + } +}; + +struct ExampleAppDocuments +{ + ImVector Documents; + + ExampleAppDocuments() + { + Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f))); + Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f))); + Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f))); + Documents.push_back(MyDocument("A Rather Long Title", false)); + Documents.push_back(MyDocument("Some Document", false)); + } +}; + +// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface. +// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, +// as opposed to clicking on the regular tab closing button) and stops being submitted, it will take a frame for +// the tab bar to notice its absence. During this frame there will be a gap in the tab bar, and if the tab that has +// disappeared was the selected one, the tab bar will report no selected tab during the frame. This will effectively +// give the impression of a flicker for one frame. +// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch. +// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag. +static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app) +{ + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open && doc->OpenPrev) + ImGui::SetTabItemClosed(doc->Name); + doc->OpenPrev = doc->Open; + } +} + +void ShowExampleAppDocuments(bool* p_open) +{ + static ExampleAppDocuments app; + + // Options + static bool opt_reorderable = true; + static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_; + + bool window_contents_visible = ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar); + if (!window_contents_visible) + { + ImGui::End(); + return; + } + + // Menu + if (ImGui::BeginMenuBar()) + { + if (ImGui::BeginMenu("File")) + { + int open_count = 0; + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + open_count += app.Documents[doc_n].Open ? 1 : 0; + + if (ImGui::BeginMenu("Open", open_count < app.Documents.Size)) + { + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + if (ImGui::MenuItem(doc->Name)) + doc->DoOpen(); + } + ImGui::EndMenu(); + } + if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0)) + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + app.Documents[doc_n].DoQueueClose(); + if (ImGui::MenuItem("Exit", "Ctrl+F4") && p_open) + *p_open = false; + ImGui::EndMenu(); + } + ImGui::EndMenuBar(); + } + + // [Debug] List documents with one checkbox for each + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc_n > 0) + ImGui::SameLine(); + ImGui::PushID(doc); + if (ImGui::Checkbox(doc->Name, &doc->Open)) + if (!doc->Open) + doc->DoForceClose(); + ImGui::PopID(); + } + + ImGui::Separator(); + + // About the ImGuiWindowFlags_UnsavedDocument / ImGuiTabItemFlags_UnsavedDocument flags. + // They have multiple effects: + // - Display a dot next to the title. + // - Tab is selected when clicking the X close button. + // - Closure is not assumed (will wait for user to stop submitting the tab). + // Otherwise closure is assumed when pressing the X, so if you keep submitting the tab may reappear at end of tab bar. + // We need to assume closure by default otherwise waiting for "lack of submission" on the next frame would leave an empty + // hole for one-frame, both in the tab-bar and in tab-contents when closing a tab/window. + // The rarely used SetTabItemClosed() function is a way to notify of programmatic closure to avoid the one-frame hole. + + // Submit Tab Bar and Tabs + { + ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0); + if (ImGui::BeginTabBar("##tabs", tab_bar_flags)) + { + if (opt_reorderable) + NotifyOfDocumentsClosedElsewhere(app); + + // [DEBUG] Stress tests + //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on. + //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway.. + + // Submit Tabs + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (!doc->Open) + continue; + + ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0); + bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags); + + // Cancel attempt to close when unsaved add to save queue so we can display a popup. + if (!doc->Open && doc->Dirty) + { + doc->Open = true; + doc->DoQueueClose(); + } + + MyDocument::DisplayContextMenu(doc); + if (visible) + { + MyDocument::DisplayContents(doc); + ImGui::EndTabItem(); + } + } + + ImGui::EndTabBar(); + } + } + + // Update closing queue + static ImVector close_queue; + if (close_queue.empty()) + { + // Close queue is locked once we started a popup + for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++) + { + MyDocument* doc = &app.Documents[doc_n]; + if (doc->WantClose) + { + doc->WantClose = false; + close_queue.push_back(doc); + } + } + } + + // Display closing confirmation UI + if (!close_queue.empty()) + { + int close_queue_unsaved_documents = 0; + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + close_queue_unsaved_documents++; + + if (close_queue_unsaved_documents == 0) + { + // Close documents when all are unsaved + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + } + else + { + if (!ImGui::IsPopupOpen("Save?")) + ImGui::OpenPopup("Save?"); + if (ImGui::BeginPopupModal("Save?", NULL, ImGuiWindowFlags_AlwaysAutoResize)) + { + ImGui::Text("Save change to the following items?"); + float item_height = ImGui::GetTextLineHeightWithSpacing(); + if (ImGui::BeginChildFrame(ImGui::GetID("frame"), ImVec2(-FLT_MIN, 6.25f * item_height))) + { + for (int n = 0; n < close_queue.Size; n++) + if (close_queue[n]->Dirty) + ImGui::Text("%s", close_queue[n]->Name); + ImGui::EndChildFrame(); + } + + ImVec2 button_size(ImGui::GetFontSize() * 7.0f, 0.0f); + if (ImGui::Button("Yes", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + { + if (close_queue[n]->Dirty) + close_queue[n]->DoSave(); + close_queue[n]->DoForceClose(); + } + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("No", button_size)) + { + for (int n = 0; n < close_queue.Size; n++) + close_queue[n]->DoForceClose(); + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::SameLine(); + if (ImGui::Button("Cancel", button_size)) + { + close_queue.clear(); + ImGui::CloseCurrentPopup(); + } + ImGui::EndPopup(); + } + } + } + + ImGui::End(); +} + +// End of Demo code +#else + +void ImGui::ShowAboutWindow(bool*) {} +void ImGui::ShowDemoWindow(bool*) {} +void ImGui::ShowUserGuide() {} +void ImGui::ShowStyleEditor(ImGuiStyle*) {} + +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui_draw.cpp b/ImGui/imgui_draw.cpp new file mode 100644 index 0000000..be2058e --- /dev/null +++ b/ImGui/imgui_draw.cpp @@ -0,0 +1,4174 @@ +// dear imgui, v1.89.4 WIP +// (drawing and font code) + +/* + +Index of this file: + +// [SECTION] STB libraries implementation +// [SECTION] Style functions +// [SECTION] ImDrawList +// [SECTION] ImDrawListSplitter +// [SECTION] ImDrawData +// [SECTION] Helpers ShadeVertsXXX functions +// [SECTION] ImFontConfig +// [SECTION] ImFontAtlas +// [SECTION] ImFontAtlas glyph ranges helpers +// [SECTION] ImFontGlyphRangesBuilder +// [SECTION] ImFont +// [SECTION] ImGui Internal Render Helpers +// [SECTION] Decompression code +// [SECTION] Default font data (ProggyClean.ttf) + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE +#include "imgui_internal.h" +#ifdef IMGUI_ENABLE_FREETYPE +#include "misc/freetype/imgui_freetype.h" +#endif + +#include // vsnprintf, sscanf, printf + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff) +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok. +#pragma clang diagnostic ignored "-Wglobal-constructors" // warning: declaration requires a global destructor // similar to above, not sure what the exact difference is. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wcomma" // warning: possible misuse of comma operator here +#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning: macro name is a reserved identifier +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used +#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function +#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value +#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//------------------------------------------------------------------------- +// [SECTION] STB libraries implementation (for stb_truetype and stb_rect_pack) +//------------------------------------------------------------------------- + +// Compile time options: +//#define IMGUI_STB_NAMESPACE ImStb +//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h" +//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h" +//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION +//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION + +#ifdef IMGUI_STB_NAMESPACE +namespace IMGUI_STB_NAMESPACE +{ +#endif + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration +#pragma warning (disable: 6011) // (stb_rectpack) Dereferencing NULL pointer 'cur->next'. +#pragma warning (disable: 6385) // (stb_truetype) Reading invalid data from 'buffer': the readable size is '_Old_3`kernel_width' bytes, but '3' bytes may be read. +#pragma warning (disable: 28182) // (stb_rectpack) Dereferencing NULL pointer. 'cur' contains the same NULL value as 'cur->next' did. +#endif + +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-function" +#pragma clang diagnostic ignored "-Wmissing-prototypes" +#pragma clang diagnostic ignored "-Wimplicit-fallthrough" +#pragma clang diagnostic ignored "-Wcast-qual" // warning: cast from 'const xxxx *' to 'xxx *' drops const qualifier +#endif + +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits] +#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers +#endif + +#ifndef STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) +#ifndef IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION // in case the user already have an implementation in another compilation unit +#define STBRP_STATIC +#define STBRP_ASSERT(x) do { IM_ASSERT(x); } while (0) +#define STBRP_SORT ImQsort +#define STB_RECT_PACK_IMPLEMENTATION +#endif +#ifdef IMGUI_STB_RECT_PACK_FILENAME +#include IMGUI_STB_RECT_PACK_FILENAME +#else +#include "imstb_rectpack.h" +#endif +#endif + +#ifdef IMGUI_ENABLE_STB_TRUETYPE +#ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds) +#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in another compilation unit +#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x)) +#define STBTT_free(x,u) ((void)(u), IM_FREE(x)) +#define STBTT_assert(x) do { IM_ASSERT(x); } while(0) +#define STBTT_fmod(x,y) ImFmod(x,y) +#define STBTT_sqrt(x) ImSqrt(x) +#define STBTT_pow(x,y) ImPow(x,y) +#define STBTT_fabs(x) ImFabs(x) +#define STBTT_ifloor(x) ((int)ImFloorSigned(x)) +#define STBTT_iceil(x) ((int)ImCeil(x)) +#define STBTT_STATIC +#define STB_TRUETYPE_IMPLEMENTATION +#else +#define STBTT_DEF extern +#endif +#ifdef IMGUI_STB_TRUETYPE_FILENAME +#include IMGUI_STB_TRUETYPE_FILENAME +#else +#include "imstb_truetype.h" +#endif +#endif +#endif // IMGUI_ENABLE_STB_TRUETYPE + +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + +#if defined(_MSC_VER) +#pragma warning (pop) +#endif + +#ifdef IMGUI_STB_NAMESPACE +} // namespace ImStb +using namespace IMGUI_STB_NAMESPACE; +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Style functions +//----------------------------------------------------------------------------- + +void ImGui::StyleColorsDark(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f); + colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(0.16f, 0.29f, 0.48f, 0.54f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_TitleBg] = ImVec4(0.04f, 0.04f, 0.04f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.16f, 0.29f, 0.48f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.00f, 0.00f, 0.00f, 0.51f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.14f, 0.14f, 0.14f, 1.00f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.02f, 0.02f, 0.02f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.31f, 0.31f, 0.31f, 1.00f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.41f, 0.41f, 0.41f, 1.00f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.51f, 0.51f, 0.51f, 1.00f); + colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.24f, 0.52f, 0.88f, 1.00f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Separator] = colors[ImGuiCol_Border]; + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.10f, 0.40f, 0.75f, 0.78f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.10f, 0.40f, 0.75f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.20f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.19f, 0.19f, 0.20f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.35f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.23f, 0.23f, 0.25f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.06f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.35f); +} + +void ImGui::StyleColorsClassic(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(0.90f, 0.90f, 0.90f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.85f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(0.11f, 0.11f, 0.14f, 0.92f); + colors[ImGuiCol_Border] = ImVec4(0.50f, 0.50f, 0.50f, 0.50f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(0.43f, 0.43f, 0.43f, 0.39f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.47f, 0.47f, 0.69f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.42f, 0.41f, 0.64f, 0.69f); + colors[ImGuiCol_TitleBg] = ImVec4(0.27f, 0.27f, 0.54f, 0.83f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.32f, 0.32f, 0.63f, 0.87f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(0.40f, 0.40f, 0.80f, 0.20f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.40f, 0.40f, 0.55f, 0.80f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.20f, 0.25f, 0.30f, 0.60f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.40f, 0.40f, 0.80f, 0.30f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.40f, 0.40f, 0.80f, 0.40f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); + colors[ImGuiCol_CheckMark] = ImVec4(0.90f, 0.90f, 0.90f, 0.50f); + colors[ImGuiCol_SliderGrab] = ImVec4(1.00f, 1.00f, 1.00f, 0.30f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.41f, 0.39f, 0.80f, 0.60f); + colors[ImGuiCol_Button] = ImVec4(0.35f, 0.40f, 0.61f, 0.62f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.40f, 0.48f, 0.71f, 0.79f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.46f, 0.54f, 0.80f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f); + colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.10f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.60f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.27f, 0.27f, 0.38f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.31f, 0.31f, 0.45f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.26f, 0.26f, 0.28f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(1.00f, 1.00f, 1.00f, 0.07f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.00f, 0.00f, 1.00f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(1.00f, 1.00f, 0.00f, 0.90f); + colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(1.00f, 1.00f, 1.00f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.80f, 0.80f, 0.80f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); +} + +// Those light colors are better suited with a thicker font than the default one + FrameBorder +void ImGui::StyleColorsLight(ImGuiStyle* dst) +{ + ImGuiStyle* style = dst ? dst : &ImGui::GetStyle(); + ImVec4* colors = style->Colors; + + colors[ImGuiCol_Text] = ImVec4(0.00f, 0.00f, 0.00f, 1.00f); + colors[ImGuiCol_TextDisabled] = ImVec4(0.60f, 0.60f, 0.60f, 1.00f); + colors[ImGuiCol_WindowBg] = ImVec4(0.94f, 0.94f, 0.94f, 1.00f); + colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_PopupBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.98f); + colors[ImGuiCol_Border] = ImVec4(0.00f, 0.00f, 0.00f, 0.30f); + colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_FrameBg] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f); + colors[ImGuiCol_FrameBgHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_FrameBgActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_TitleBg] = ImVec4(0.96f, 0.96f, 0.96f, 1.00f); + colors[ImGuiCol_TitleBgActive] = ImVec4(0.82f, 0.82f, 0.82f, 1.00f); + colors[ImGuiCol_TitleBgCollapsed] = ImVec4(1.00f, 1.00f, 1.00f, 0.51f); + colors[ImGuiCol_MenuBarBg] = ImVec4(0.86f, 0.86f, 0.86f, 1.00f); + colors[ImGuiCol_ScrollbarBg] = ImVec4(0.98f, 0.98f, 0.98f, 0.53f); + colors[ImGuiCol_ScrollbarGrab] = ImVec4(0.69f, 0.69f, 0.69f, 0.80f); + colors[ImGuiCol_ScrollbarGrabHovered] = ImVec4(0.49f, 0.49f, 0.49f, 0.80f); + colors[ImGuiCol_ScrollbarGrabActive] = ImVec4(0.49f, 0.49f, 0.49f, 1.00f); + colors[ImGuiCol_CheckMark] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_SliderGrab] = ImVec4(0.26f, 0.59f, 0.98f, 0.78f); + colors[ImGuiCol_SliderGrabActive] = ImVec4(0.46f, 0.54f, 0.80f, 0.60f); + colors[ImGuiCol_Button] = ImVec4(0.26f, 0.59f, 0.98f, 0.40f); + colors[ImGuiCol_ButtonHovered] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_ButtonActive] = ImVec4(0.06f, 0.53f, 0.98f, 1.00f); + colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f); + colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f); + colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f); + colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f); + colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f); + colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f); + colors[ImGuiCol_ResizeGrip] = ImVec4(0.35f, 0.35f, 0.35f, 0.17f); + colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f); + colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f); + colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f); + colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f); + colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f); + colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f); + colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f); + colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f); + colors[ImGuiCol_PlotHistogramHovered] = ImVec4(1.00f, 0.45f, 0.00f, 1.00f); + colors[ImGuiCol_TableHeaderBg] = ImVec4(0.78f, 0.87f, 0.98f, 1.00f); + colors[ImGuiCol_TableBorderStrong] = ImVec4(0.57f, 0.57f, 0.64f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableBorderLight] = ImVec4(0.68f, 0.68f, 0.74f, 1.00f); // Prefer using Alpha=1.0 here + colors[ImGuiCol_TableRowBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f); + colors[ImGuiCol_TableRowBgAlt] = ImVec4(0.30f, 0.30f, 0.30f, 0.09f); + colors[ImGuiCol_TextSelectedBg] = ImVec4(0.26f, 0.59f, 0.98f, 0.35f); + colors[ImGuiCol_DragDropTarget] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f); + colors[ImGuiCol_NavHighlight] = colors[ImGuiCol_HeaderHovered]; + colors[ImGuiCol_NavWindowingHighlight] = ImVec4(0.70f, 0.70f, 0.70f, 0.70f); + colors[ImGuiCol_NavWindowingDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.20f); + colors[ImGuiCol_ModalWindowDimBg] = ImVec4(0.20f, 0.20f, 0.20f, 0.35f); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawList +//----------------------------------------------------------------------------- + +ImDrawListSharedData::ImDrawListSharedData() +{ + memset(this, 0, sizeof(*this)); + for (int i = 0; i < IM_ARRAYSIZE(ArcFastVtx); i++) + { + const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(ArcFastVtx); + ArcFastVtx[i] = ImVec2(ImCos(a), ImSin(a)); + } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); +} + +void ImDrawListSharedData::SetCircleTessellationMaxError(float max_error) +{ + if (CircleSegmentMaxError == max_error) + return; + + IM_ASSERT(max_error > 0.0f); + CircleSegmentMaxError = max_error; + for (int i = 0; i < IM_ARRAYSIZE(CircleSegmentCounts); i++) + { + const float radius = (float)i; + CircleSegmentCounts[i] = (ImU8)((i > 0) ? IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, CircleSegmentMaxError) : IM_DRAWLIST_ARCFAST_SAMPLE_MAX); + } + ArcFastRadiusCutoff = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(IM_DRAWLIST_ARCFAST_SAMPLE_MAX, CircleSegmentMaxError); +} + +// Initialize before use in a new frame. We always have a command ready in the buffer. +void ImDrawList::_ResetForNewFrame() +{ + // Verify that the ImDrawCmd fields we want to memcmp() are contiguous in memory. + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, ClipRect) == 0); + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, TextureId) == sizeof(ImVec4)); + IM_STATIC_ASSERT(IM_OFFSETOF(ImDrawCmd, VtxOffset) == sizeof(ImVec4) + sizeof(ImTextureID)); + if (_Splitter._Count > 1) + _Splitter.Merge(this); + + CmdBuffer.resize(0); + IdxBuffer.resize(0); + VtxBuffer.resize(0); + Flags = _Data->InitialFlags; + memset(&_CmdHeader, 0, sizeof(_CmdHeader)); + _VtxCurrentIdx = 0; + _VtxWritePtr = NULL; + _IdxWritePtr = NULL; + _ClipRectStack.resize(0); + _TextureIdStack.resize(0); + _Path.resize(0); + _Splitter.Clear(); + CmdBuffer.push_back(ImDrawCmd()); + _FringeScale = 1.0f; +} + +void ImDrawList::_ClearFreeMemory() +{ + CmdBuffer.clear(); + IdxBuffer.clear(); + VtxBuffer.clear(); + Flags = ImDrawListFlags_None; + _VtxCurrentIdx = 0; + _VtxWritePtr = NULL; + _IdxWritePtr = NULL; + _ClipRectStack.clear(); + _TextureIdStack.clear(); + _Path.clear(); + _Splitter.ClearFreeMemory(); +} + +ImDrawList* ImDrawList::CloneOutput() const +{ + ImDrawList* dst = IM_NEW(ImDrawList(_Data)); + dst->CmdBuffer = CmdBuffer; + dst->IdxBuffer = IdxBuffer; + dst->VtxBuffer = VtxBuffer; + dst->Flags = Flags; + return dst; +} + +void ImDrawList::AddDrawCmd() +{ + ImDrawCmd draw_cmd; + draw_cmd.ClipRect = _CmdHeader.ClipRect; // Same as calling ImDrawCmd_HeaderCopy() + draw_cmd.TextureId = _CmdHeader.TextureId; + draw_cmd.VtxOffset = _CmdHeader.VtxOffset; + draw_cmd.IdxOffset = IdxBuffer.Size; + + IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w); + CmdBuffer.push_back(draw_cmd); +} + +// Pop trailing draw command (used before merging or presenting to user) +// Note that this leaves the ImDrawList in a state unfit for further commands, as most code assume that CmdBuffer.Size > 0 && CmdBuffer.back().UserCallback == NULL +void ImDrawList::_PopUnusedDrawCmd() +{ + while (CmdBuffer.Size > 0) + { + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 || curr_cmd->UserCallback != NULL) + return;// break; + CmdBuffer.pop_back(); + } +} + +void ImDrawList::AddCallback(ImDrawCallback callback, void* callback_data) +{ + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + IM_ASSERT(curr_cmd->UserCallback == NULL); + if (curr_cmd->ElemCount != 0) + { + AddDrawCmd(); + curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + } + curr_cmd->UserCallback = callback; + curr_cmd->UserCallbackData = callback_data; + + AddDrawCmd(); // Force a new command after us (see comment below) +} + +// Compare ClipRect, TextureId and VtxOffset with a single memcmp() +#define ImDrawCmd_HeaderSize (IM_OFFSETOF(ImDrawCmd, VtxOffset) + sizeof(unsigned int)) +#define ImDrawCmd_HeaderCompare(CMD_LHS, CMD_RHS) (memcmp(CMD_LHS, CMD_RHS, ImDrawCmd_HeaderSize)) // Compare ClipRect, TextureId, VtxOffset +#define ImDrawCmd_HeaderCopy(CMD_DST, CMD_SRC) (memcpy(CMD_DST, CMD_SRC, ImDrawCmd_HeaderSize)) // Copy ClipRect, TextureId, VtxOffset +#define ImDrawCmd_AreSequentialIdxOffset(CMD_0, CMD_1) (CMD_0->IdxOffset + CMD_0->ElemCount == CMD_1->IdxOffset) + +// Try to merge two last draw commands +void ImDrawList::_TryMergeDrawCmds() +{ + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (ImDrawCmd_HeaderCompare(curr_cmd, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && curr_cmd->UserCallback == NULL && prev_cmd->UserCallback == NULL) + { + prev_cmd->ElemCount += curr_cmd->ElemCount; + CmdBuffer.pop_back(); + } +} + +// Our scheme may appears a bit unusual, basically we want the most-common calls AddLine AddRect etc. to not have to perform any check so we always have a command ready in the stack. +// The cost of figuring out if a new command has to be added or if we can merge is paid in those Update** functions only. +void ImDrawList::_OnChangedClipRect() +{ + // If current command is used with different settings we need to add a new command + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && memcmp(&curr_cmd->ClipRect, &_CmdHeader.ClipRect, sizeof(ImVec4)) != 0) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + + // Try to merge with previous command if it matches, else use current command + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) + { + CmdBuffer.pop_back(); + return; + } + + curr_cmd->ClipRect = _CmdHeader.ClipRect; +} + +void ImDrawList::_OnChangedTextureID() +{ + // If current command is used with different settings we need to add a new command + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount != 0 && curr_cmd->TextureId != _CmdHeader.TextureId) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + + // Try to merge with previous command if it matches, else use current command + ImDrawCmd* prev_cmd = curr_cmd - 1; + if (curr_cmd->ElemCount == 0 && CmdBuffer.Size > 1 && ImDrawCmd_HeaderCompare(&_CmdHeader, prev_cmd) == 0 && ImDrawCmd_AreSequentialIdxOffset(prev_cmd, curr_cmd) && prev_cmd->UserCallback == NULL) + { + CmdBuffer.pop_back(); + return; + } + + curr_cmd->TextureId = _CmdHeader.TextureId; +} + +void ImDrawList::_OnChangedVtxOffset() +{ + // We don't need to compare curr_cmd->VtxOffset != _CmdHeader.VtxOffset because we know it'll be different at the time we call this. + _VtxCurrentIdx = 0; + IM_ASSERT_PARANOID(CmdBuffer.Size > 0); + ImDrawCmd* curr_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + //IM_ASSERT(curr_cmd->VtxOffset != _CmdHeader.VtxOffset); // See #3349 + if (curr_cmd->ElemCount != 0) + { + AddDrawCmd(); + return; + } + IM_ASSERT(curr_cmd->UserCallback == NULL); + curr_cmd->VtxOffset = _CmdHeader.VtxOffset; +} + +int ImDrawList::_CalcCircleAutoSegmentCount(float radius) const +{ + // Automatic segment count + const int radius_idx = (int)(radius + 0.999999f); // ceil to never reduce accuracy + if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts)) + return _Data->CircleSegmentCounts[radius_idx]; // Use cached value + else + return IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError); +} + +// Render-level scissoring. This is passed down to your render function but not used for CPU-side coarse clipping. Prefer using higher-level ImGui::PushClipRect() to affect logic (hit-testing and widget culling) +void ImDrawList::PushClipRect(const ImVec2& cr_min, const ImVec2& cr_max, bool intersect_with_current_clip_rect) +{ + ImVec4 cr(cr_min.x, cr_min.y, cr_max.x, cr_max.y); + if (intersect_with_current_clip_rect) + { + ImVec4 current = _CmdHeader.ClipRect; + if (cr.x < current.x) cr.x = current.x; + if (cr.y < current.y) cr.y = current.y; + if (cr.z > current.z) cr.z = current.z; + if (cr.w > current.w) cr.w = current.w; + } + cr.z = ImMax(cr.x, cr.z); + cr.w = ImMax(cr.y, cr.w); + + _ClipRectStack.push_back(cr); + _CmdHeader.ClipRect = cr; + _OnChangedClipRect(); +} + +void ImDrawList::PushClipRectFullScreen() +{ + PushClipRect(ImVec2(_Data->ClipRectFullscreen.x, _Data->ClipRectFullscreen.y), ImVec2(_Data->ClipRectFullscreen.z, _Data->ClipRectFullscreen.w)); +} + +void ImDrawList::PopClipRect() +{ + _ClipRectStack.pop_back(); + _CmdHeader.ClipRect = (_ClipRectStack.Size == 0) ? _Data->ClipRectFullscreen : _ClipRectStack.Data[_ClipRectStack.Size - 1]; + _OnChangedClipRect(); +} + +void ImDrawList::PushTextureID(ImTextureID texture_id) +{ + _TextureIdStack.push_back(texture_id); + _CmdHeader.TextureId = texture_id; + _OnChangedTextureID(); +} + +void ImDrawList::PopTextureID() +{ + _TextureIdStack.pop_back(); + _CmdHeader.TextureId = (_TextureIdStack.Size == 0) ? (ImTextureID)NULL : _TextureIdStack.Data[_TextureIdStack.Size - 1]; + _OnChangedTextureID(); +} + +// Reserve space for a number of vertices and indices. +// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or +// submit the intermediate results. PrimUnreserve() can be used to release unused allocations. +void ImDrawList::PrimReserve(int idx_count, int vtx_count) +{ + // Large mesh support (when enabled) + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset)) + { + // FIXME: In theory we should be testing that vtx_count <64k here. + // In practice, RenderText() relies on reserving ahead for a worst case scenario so it is currently useful for us + // to not make that check until we rework the text functions to handle clipping and large horizontal lines better. + _CmdHeader.VtxOffset = VtxBuffer.Size; + _OnChangedVtxOffset(); + } + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount += idx_count; + + int vtx_buffer_old_size = VtxBuffer.Size; + VtxBuffer.resize(vtx_buffer_old_size + vtx_count); + _VtxWritePtr = VtxBuffer.Data + vtx_buffer_old_size; + + int idx_buffer_old_size = IdxBuffer.Size; + IdxBuffer.resize(idx_buffer_old_size + idx_count); + _IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size; +} + +// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve(). +void ImDrawList::PrimUnreserve(int idx_count, int vtx_count) +{ + IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0); + + ImDrawCmd* draw_cmd = &CmdBuffer.Data[CmdBuffer.Size - 1]; + draw_cmd->ElemCount -= idx_count; + VtxBuffer.shrink(VtxBuffer.Size - vtx_count); + IdxBuffer.shrink(IdxBuffer.Size - idx_count); +} + +// Fully unrolled with inline call to keep our debug builds decently fast. +void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col) +{ + ImVec2 b(c.x, a.y), d(a.x, c.y), uv(_Data->TexUvWhitePixel); + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +void ImDrawList::PrimRectUV(const ImVec2& a, const ImVec2& c, const ImVec2& uv_a, const ImVec2& uv_c, ImU32 col) +{ + ImVec2 b(c.x, a.y), d(a.x, c.y), uv_b(uv_c.x, uv_a.y), uv_d(uv_a.x, uv_c.y); + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col) +{ + ImDrawIdx idx = (ImDrawIdx)_VtxCurrentIdx; + _IdxWritePtr[0] = idx; _IdxWritePtr[1] = (ImDrawIdx)(idx+1); _IdxWritePtr[2] = (ImDrawIdx)(idx+2); + _IdxWritePtr[3] = idx; _IdxWritePtr[4] = (ImDrawIdx)(idx+2); _IdxWritePtr[5] = (ImDrawIdx)(idx+3); + _VtxWritePtr[0].pos = a; _VtxWritePtr[0].uv = uv_a; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos = b; _VtxWritePtr[1].uv = uv_b; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = c; _VtxWritePtr[2].uv = uv_c; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = d; _VtxWritePtr[3].uv = uv_d; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + _VtxCurrentIdx += 4; + _IdxWritePtr += 6; +} + +// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superfluous function calls to optimize debug/non-inlined builds. +// - Those macros expects l-values and need to be used as their own statement. +// - Those macros are intentionally not surrounded by the 'do {} while (0)' idiom because even that translates to runtime with debug compilers. +#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = ImRsqrt(d2); VX *= inv_len; VY *= inv_len; } } (void)0 +#define IM_FIXNORMAL2F_MAX_INVLEN2 100.0f // 500.0f (see #4053, #3366) +#define IM_FIXNORMAL2F(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.000001f) { float inv_len2 = 1.0f / d2; if (inv_len2 > IM_FIXNORMAL2F_MAX_INVLEN2) inv_len2 = IM_FIXNORMAL2F_MAX_INVLEN2; VX *= inv_len2; VY *= inv_len2; } } (void)0 + +// TODO: Thickness anti-aliased lines cap are missing their AA fringe. +// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds. +void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, ImDrawFlags flags, float thickness) +{ + if (points_count < 2 || (col & IM_COL32_A_MASK) == 0) + return; + + const bool closed = (flags & ImDrawFlags_Closed) != 0; + const ImVec2 opaque_uv = _Data->TexUvWhitePixel; + const int count = closed ? points_count : points_count - 1; // The number of line segments we need to draw + const bool thick_line = (thickness > _FringeScale); + + if (Flags & ImDrawListFlags_AntiAliasedLines) + { + // Anti-aliased stroke + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + + // Thicknesses <1.0 should behave like thickness 1.0 + thickness = ImMax(thickness, 1.0f); + const int integer_thickness = (int)thickness; + const float fractional_thickness = thickness - integer_thickness; + + // Do we want to draw this line using a texture? + // - For now, only draw integer-width lines using textures to avoid issues with the way scaling occurs, could be improved. + // - If AA_SIZE is not 1.0f we cannot use the texture path. + const bool use_texture = (Flags & ImDrawListFlags_AntiAliasedLinesUseTex) && (integer_thickness < IM_DRAWLIST_TEX_LINES_WIDTH_MAX) && (fractional_thickness <= 0.00001f) && (AA_SIZE == 1.0f); + + // We should never hit this, because NewFrame() doesn't set ImDrawListFlags_AntiAliasedLinesUseTex unless ImFontAtlasFlags_NoBakedLines is off + IM_ASSERT_PARANOID(!use_texture || !(_Data->Font->ContainerAtlas->Flags & ImFontAtlasFlags_NoBakedLines)); + + const int idx_count = use_texture ? (count * 6) : (thick_line ? count * 18 : count * 12); + const int vtx_count = use_texture ? (points_count * 2) : (thick_line ? points_count * 4 : points_count * 3); + PrimReserve(idx_count, vtx_count); + + // Temporary buffer + // The first items are normals at each line point, then after that there are either 2 or 4 temp points for each line point + _Data->TempBuffer.reserve_discard(points_count * ((use_texture || !thick_line) ? 3 : 5)); + ImVec2* temp_normals = _Data->TempBuffer.Data; + ImVec2* temp_points = temp_normals + points_count; + + // Calculate normals (tangents) for each line segment + for (int i1 = 0; i1 < count; i1++) + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; + float dx = points[i2].x - points[i1].x; + float dy = points[i2].y - points[i1].y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i1].x = dy; + temp_normals[i1].y = -dx; + } + if (!closed) + temp_normals[points_count - 1] = temp_normals[points_count - 2]; + + // If we are drawing a one-pixel-wide line without a texture, or a textured line of any width, we only need 2 or 3 vertices per point + if (use_texture || !thick_line) + { + // [PATH 1] Texture-based lines (thick or non-thick) + // [PATH 2] Non texture-based lines (non-thick) + + // The width of the geometry we need to draw - this is essentially pixels for the line itself, plus "one pixel" for AA. + // - In the texture-based path, we don't use AA_SIZE here because the +1 is tied to the generated texture + // (see ImFontAtlasBuildRenderLinesTexData() function), and so alternate values won't work without changes to that code. + // - In the non texture-based paths, we would allow AA_SIZE to potentially be != 1.0f with a patch (e.g. fringe_scale patch to + // allow scaling geometry while preserving one-screen-pixel AA fringe). + const float half_draw_size = use_texture ? ((thickness * 0.5f) + 1) : AA_SIZE; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend + if (!closed) + { + temp_points[0] = points[0] + temp_normals[0] * half_draw_size; + temp_points[1] = points[0] - temp_normals[0] * half_draw_size; + temp_points[(points_count-1)*2+0] = points[points_count-1] + temp_normals[points_count-1] * half_draw_size; + temp_points[(points_count-1)*2+1] = points[points_count-1] - temp_normals[points_count-1] * half_draw_size; + } + + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) + // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; // i2 is the second point of the line segment + const unsigned int idx2 = ((i1 + 1) == points_count) ? _VtxCurrentIdx : (idx1 + (use_texture ? 2 : 3)); // Vertex index for end of segment + + // Average normals + float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; + float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= half_draw_size; // dm_x, dm_y are offset to the outer edge of the AA area + dm_y *= half_draw_size; + + // Add temporary vertexes for the outer edges + ImVec2* out_vtx = &temp_points[i2 * 2]; + out_vtx[0].x = points[i2].x + dm_x; + out_vtx[0].y = points[i2].y + dm_y; + out_vtx[1].x = points[i2].x - dm_x; + out_vtx[1].y = points[i2].y - dm_y; + + if (use_texture) + { + // Add indices for two triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 1); // Right tri + _IdxWritePtr[3] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[4] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Left tri + _IdxWritePtr += 6; + } + else + { + // Add indexes for four triangles + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); // Right tri 1 + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 0); // Right tri 2 + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); // Left tri 1 + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); // Left tri 2 + _IdxWritePtr += 12; + } + + idx1 = idx2; + } + + // Add vertexes for each point on the line + if (use_texture) + { + // If we're using textures we only need to emit the left/right edge vertices + ImVec4 tex_uvs = _Data->TexUvLines[integer_thickness]; + /*if (fractional_thickness != 0.0f) // Currently always zero when use_texture==false! + { + const ImVec4 tex_uvs_1 = _Data->TexUvLines[integer_thickness + 1]; + tex_uvs.x = tex_uvs.x + (tex_uvs_1.x - tex_uvs.x) * fractional_thickness; // inlined ImLerp() + tex_uvs.y = tex_uvs.y + (tex_uvs_1.y - tex_uvs.y) * fractional_thickness; + tex_uvs.z = tex_uvs.z + (tex_uvs_1.z - tex_uvs.z) * fractional_thickness; + tex_uvs.w = tex_uvs.w + (tex_uvs_1.w - tex_uvs.w) * fractional_thickness; + }*/ + ImVec2 tex_uv0(tex_uvs.x, tex_uvs.y); + ImVec2 tex_uv1(tex_uvs.z, tex_uvs.w); + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = temp_points[i * 2 + 0]; _VtxWritePtr[0].uv = tex_uv0; _VtxWritePtr[0].col = col; // Left-side outer edge + _VtxWritePtr[1].pos = temp_points[i * 2 + 1]; _VtxWritePtr[1].uv = tex_uv1; _VtxWritePtr[1].col = col; // Right-side outer edge + _VtxWritePtr += 2; + } + } + else + { + // If we're not using a texture, we need the center vertex as well + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; // Center of line + _VtxWritePtr[1].pos = temp_points[i * 2 + 0]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col_trans; // Left-side outer edge + _VtxWritePtr[2].pos = temp_points[i * 2 + 1]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col_trans; // Right-side outer edge + _VtxWritePtr += 3; + } + } + } + else + { + // [PATH 2] Non texture-based lines (thick): we need to draw the solid line core and thus require four vertices per point + const float half_inner_thickness = (thickness - AA_SIZE) * 0.5f; + + // If line is not closed, the first and last points need to be generated differently as there are no normals to blend + if (!closed) + { + const int points_last = points_count - 1; + temp_points[0] = points[0] + temp_normals[0] * (half_inner_thickness + AA_SIZE); + temp_points[1] = points[0] + temp_normals[0] * (half_inner_thickness); + temp_points[2] = points[0] - temp_normals[0] * (half_inner_thickness); + temp_points[3] = points[0] - temp_normals[0] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 0] = points[points_last] + temp_normals[points_last] * (half_inner_thickness + AA_SIZE); + temp_points[points_last * 4 + 1] = points[points_last] + temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 2] = points[points_last] - temp_normals[points_last] * (half_inner_thickness); + temp_points[points_last * 4 + 3] = points[points_last] - temp_normals[points_last] * (half_inner_thickness + AA_SIZE); + } + + // Generate the indices to form a number of triangles for each line segment, and the vertices for the line edges + // This takes points n and n+1 and writes into n+1, with the first point in a closed line being generated from the final one (as n+1 wraps) + // FIXME-OPT: Merge the different loops, possibly remove the temporary buffer. + unsigned int idx1 = _VtxCurrentIdx; // Vertex index for start of line segment + for (int i1 = 0; i1 < count; i1++) // i1 is the first point of the line segment + { + const int i2 = (i1 + 1) == points_count ? 0 : (i1 + 1); // i2 is the second point of the line segment + const unsigned int idx2 = (i1 + 1) == points_count ? _VtxCurrentIdx : (idx1 + 4); // Vertex index for end of segment + + // Average normals + float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f; + float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + float dm_out_x = dm_x * (half_inner_thickness + AA_SIZE); + float dm_out_y = dm_y * (half_inner_thickness + AA_SIZE); + float dm_in_x = dm_x * half_inner_thickness; + float dm_in_y = dm_y * half_inner_thickness; + + // Add temporary vertices + ImVec2* out_vtx = &temp_points[i2 * 4]; + out_vtx[0].x = points[i2].x + dm_out_x; + out_vtx[0].y = points[i2].y + dm_out_y; + out_vtx[1].x = points[i2].x + dm_in_x; + out_vtx[1].y = points[i2].y + dm_in_y; + out_vtx[2].x = points[i2].x - dm_in_x; + out_vtx[2].y = points[i2].y - dm_in_y; + out_vtx[3].x = points[i2].x - dm_out_x; + out_vtx[3].y = points[i2].y - dm_out_y; + + // Add indexes + _IdxWritePtr[0] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[1] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[2] = (ImDrawIdx)(idx1 + 2); + _IdxWritePtr[3] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[4] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[5] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[6] = (ImDrawIdx)(idx2 + 1); _IdxWritePtr[7] = (ImDrawIdx)(idx1 + 1); _IdxWritePtr[8] = (ImDrawIdx)(idx1 + 0); + _IdxWritePtr[9] = (ImDrawIdx)(idx1 + 0); _IdxWritePtr[10] = (ImDrawIdx)(idx2 + 0); _IdxWritePtr[11] = (ImDrawIdx)(idx2 + 1); + _IdxWritePtr[12] = (ImDrawIdx)(idx2 + 2); _IdxWritePtr[13] = (ImDrawIdx)(idx1 + 2); _IdxWritePtr[14] = (ImDrawIdx)(idx1 + 3); + _IdxWritePtr[15] = (ImDrawIdx)(idx1 + 3); _IdxWritePtr[16] = (ImDrawIdx)(idx2 + 3); _IdxWritePtr[17] = (ImDrawIdx)(idx2 + 2); + _IdxWritePtr += 18; + + idx1 = idx2; + } + + // Add vertices + for (int i = 0; i < points_count; i++) + { + _VtxWritePtr[0].pos = temp_points[i * 4 + 0]; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col_trans; + _VtxWritePtr[1].pos = temp_points[i * 4 + 1]; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos = temp_points[i * 4 + 2]; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos = temp_points[i * 4 + 3]; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col_trans; + _VtxWritePtr += 4; + } + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // [PATH 4] Non texture-based, Non anti-aliased lines + const int idx_count = count * 6; + const int vtx_count = count * 4; // FIXME-OPT: Not sharing edges + PrimReserve(idx_count, vtx_count); + + for (int i1 = 0; i1 < count; i1++) + { + const int i2 = (i1 + 1) == points_count ? 0 : i1 + 1; + const ImVec2& p1 = points[i1]; + const ImVec2& p2 = points[i2]; + + float dx = p2.x - p1.x; + float dy = p2.y - p1.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + dx *= (thickness * 0.5f); + dy *= (thickness * 0.5f); + + _VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = opaque_uv; _VtxWritePtr[0].col = col; + _VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = opaque_uv; _VtxWritePtr[1].col = col; + _VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = opaque_uv; _VtxWritePtr[2].col = col; + _VtxWritePtr[3].pos.x = p1.x - dy; _VtxWritePtr[3].pos.y = p1.y + dx; _VtxWritePtr[3].uv = opaque_uv; _VtxWritePtr[3].col = col; + _VtxWritePtr += 4; + + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + 2); + _IdxWritePtr[3] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[4] = (ImDrawIdx)(_VtxCurrentIdx + 2); _IdxWritePtr[5] = (ImDrawIdx)(_VtxCurrentIdx + 3); + _IdxWritePtr += 6; + _VtxCurrentIdx += 4; + } + } +} + +// - We intentionally avoid using ImVec2 and its math operators here to reduce cost to a minimum for debug/non-inlined builds. +// - Filled shapes must always use clockwise winding order. The anti-aliasing fringe depends on it. Counter-clockwise shapes will have "inward" anti-aliasing. +void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col) +{ + if (points_count < 3 || (col & IM_COL32_A_MASK) == 0) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + + if (Flags & ImDrawListFlags_AntiAliasedFill) + { + // Anti-aliased Fill + const float AA_SIZE = _FringeScale; + const ImU32 col_trans = col & ~IM_COL32_A_MASK; + const int idx_count = (points_count - 2)*3 + points_count * 6; + const int vtx_count = (points_count * 2); + PrimReserve(idx_count, vtx_count); + + // Add indexes for fill + unsigned int vtx_inner_idx = _VtxCurrentIdx; + unsigned int vtx_outer_idx = _VtxCurrentIdx + 1; + for (int i = 2; i < points_count; i++) + { + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + ((i - 1) << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_inner_idx + (i << 1)); + _IdxWritePtr += 3; + } + + // Compute normals + _Data->TempBuffer.reserve_discard(points_count); + ImVec2* temp_normals = _Data->TempBuffer.Data; + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + const ImVec2& p0 = points[i0]; + const ImVec2& p1 = points[i1]; + float dx = p1.x - p0.x; + float dy = p1.y - p0.y; + IM_NORMALIZE2F_OVER_ZERO(dx, dy); + temp_normals[i0].x = dy; + temp_normals[i0].y = -dx; + } + + for (int i0 = points_count - 1, i1 = 0; i1 < points_count; i0 = i1++) + { + // Average normals + const ImVec2& n0 = temp_normals[i0]; + const ImVec2& n1 = temp_normals[i1]; + float dm_x = (n0.x + n1.x) * 0.5f; + float dm_y = (n0.y + n1.y) * 0.5f; + IM_FIXNORMAL2F(dm_x, dm_y); + dm_x *= AA_SIZE * 0.5f; + dm_y *= AA_SIZE * 0.5f; + + // Add vertices + _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner + _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer + _VtxWritePtr += 2; + + // Add indexes for fringes + _IdxWritePtr[0] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); _IdxWritePtr[1] = (ImDrawIdx)(vtx_inner_idx + (i0 << 1)); _IdxWritePtr[2] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); + _IdxWritePtr[3] = (ImDrawIdx)(vtx_outer_idx + (i0 << 1)); _IdxWritePtr[4] = (ImDrawIdx)(vtx_outer_idx + (i1 << 1)); _IdxWritePtr[5] = (ImDrawIdx)(vtx_inner_idx + (i1 << 1)); + _IdxWritePtr += 6; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } + else + { + // Non Anti-aliased Fill + const int idx_count = (points_count - 2)*3; + const int vtx_count = points_count; + PrimReserve(idx_count, vtx_count); + for (int i = 0; i < vtx_count; i++) + { + _VtxWritePtr[0].pos = points[i]; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; + _VtxWritePtr++; + } + for (int i = 2; i < points_count; i++) + { + _IdxWritePtr[0] = (ImDrawIdx)(_VtxCurrentIdx); _IdxWritePtr[1] = (ImDrawIdx)(_VtxCurrentIdx + i - 1); _IdxWritePtr[2] = (ImDrawIdx)(_VtxCurrentIdx + i); + _IdxWritePtr += 3; + } + _VtxCurrentIdx += (ImDrawIdx)vtx_count; + } +} + +void ImDrawList::_PathArcToFastEx(const ImVec2& center, float radius, int a_min_sample, int a_max_sample, int a_step) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + // Calculate arc auto segment step size + if (a_step <= 0) + a_step = IM_DRAWLIST_ARCFAST_SAMPLE_MAX / _CalcCircleAutoSegmentCount(radius); + + // Make sure we never do steps larger than one quarter of the circle + a_step = ImClamp(a_step, 1, IM_DRAWLIST_ARCFAST_TABLE_SIZE / 4); + + const int sample_range = ImAbs(a_max_sample - a_min_sample); + const int a_next_step = a_step; + + int samples = sample_range + 1; + bool extra_max_sample = false; + if (a_step > 1) + { + samples = sample_range / a_step + 1; + const int overstep = sample_range % a_step; + + if (overstep > 0) + { + extra_max_sample = true; + samples++; + + // When we have overstep to avoid awkwardly looking one long line and one tiny one at the end, + // distribute first step range evenly between them by reducing first step size. + if (sample_range > 0) + a_step -= (a_step - overstep) / 2; + } + } + + _Path.resize(_Path.Size + samples); + ImVec2* out_ptr = _Path.Data + (_Path.Size - samples); + + int sample_index = a_min_sample; + if (sample_index < 0 || sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) + { + sample_index = sample_index % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (sample_index < 0) + sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + } + + if (a_max_sample >= a_min_sample) + { + for (int a = a_min_sample; a <= a_max_sample; a += a_step, sample_index += a_step, a_step = a_next_step) + { + // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more + if (sample_index >= IM_DRAWLIST_ARCFAST_SAMPLE_MAX) + sample_index -= IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[sample_index]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + } + else + { + for (int a = a_min_sample; a >= a_max_sample; a -= a_step, sample_index -= a_step, a_step = a_next_step) + { + // a_step is clamped to IM_DRAWLIST_ARCFAST_SAMPLE_MAX, so we have guaranteed that it will not wrap over range twice or more + if (sample_index < 0) + sample_index += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[sample_index]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + } + + if (extra_max_sample) + { + int normalized_max_sample = a_max_sample % IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + if (normalized_max_sample < 0) + normalized_max_sample += IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + + const ImVec2 s = _Data->ArcFastVtx[normalized_max_sample]; + out_ptr->x = center.x + s.x * radius; + out_ptr->y = center.y + s.y * radius; + out_ptr++; + } + + IM_ASSERT_PARANOID(_Path.Data + _Path.Size == out_ptr); +} + +void ImDrawList::_PathArcToN(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + // Note that we are adding a point at both a_min and a_max. + // If you are trying to draw a full closed circle you don't want the overlapping points! + _Path.reserve(_Path.Size + (num_segments + 1)); + for (int i = 0; i <= num_segments; i++) + { + const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); + _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius)); + } +} + +// 0: East, 3: South, 6: West, 9: North, 12: East +void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + _PathArcToFastEx(center, radius, a_min_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, a_max_of_12 * IM_DRAWLIST_ARCFAST_SAMPLE_MAX / 12, 0); +} + +void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments) +{ + if (radius < 0.5f) + { + _Path.push_back(center); + return; + } + + if (num_segments > 0) + { + _PathArcToN(center, radius, a_min, a_max, num_segments); + return; + } + + // Automatic segment count + if (radius <= _Data->ArcFastRadiusCutoff) + { + const bool a_is_reverse = a_max < a_min; + + // We are going to use precomputed values for mid samples. + // Determine first and last sample in lookup table that belong to the arc. + const float a_min_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_min / (IM_PI * 2.0f); + const float a_max_sample_f = IM_DRAWLIST_ARCFAST_SAMPLE_MAX * a_max / (IM_PI * 2.0f); + + const int a_min_sample = a_is_reverse ? (int)ImFloorSigned(a_min_sample_f) : (int)ImCeil(a_min_sample_f); + const int a_max_sample = a_is_reverse ? (int)ImCeil(a_max_sample_f) : (int)ImFloorSigned(a_max_sample_f); + const int a_mid_samples = a_is_reverse ? ImMax(a_min_sample - a_max_sample, 0) : ImMax(a_max_sample - a_min_sample, 0); + + const float a_min_segment_angle = a_min_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const float a_max_segment_angle = a_max_sample * IM_PI * 2.0f / IM_DRAWLIST_ARCFAST_SAMPLE_MAX; + const bool a_emit_start = ImAbs(a_min_segment_angle - a_min) >= 1e-5f; + const bool a_emit_end = ImAbs(a_max - a_max_segment_angle) >= 1e-5f; + + _Path.reserve(_Path.Size + (a_mid_samples + 1 + (a_emit_start ? 1 : 0) + (a_emit_end ? 1 : 0))); + if (a_emit_start) + _Path.push_back(ImVec2(center.x + ImCos(a_min) * radius, center.y + ImSin(a_min) * radius)); + if (a_mid_samples > 0) + _PathArcToFastEx(center, radius, a_min_sample, a_max_sample, 0); + if (a_emit_end) + _Path.push_back(ImVec2(center.x + ImCos(a_max) * radius, center.y + ImSin(a_max) * radius)); + } + else + { + const float arc_length = ImAbs(a_max - a_min); + const int circle_segment_count = _CalcCircleAutoSegmentCount(radius); + const int arc_segment_count = ImMax((int)ImCeil(circle_segment_count * arc_length / (IM_PI * 2.0f)), (int)(2.0f * IM_PI / arc_length)); + _PathArcToN(center, radius, a_min, a_max, arc_segment_count); + } +} + +ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t) +{ + float u = 1.0f - t; + float w1 = u * u * u; + float w2 = 3 * u * u * t; + float w3 = 3 * u * t * t; + float w4 = t * t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x + w4 * p4.x, w1 * p1.y + w2 * p2.y + w3 * p3.y + w4 * p4.y); +} + +ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t) +{ + float u = 1.0f - t; + float w1 = u * u; + float w2 = 2 * u * t; + float w3 = t * t; + return ImVec2(w1 * p1.x + w2 * p2.x + w3 * p3.x, w1 * p1.y + w2 * p2.y + w3 * p3.y); +} + +// Closely mimics ImBezierCubicClosestPointCasteljau() in imgui.cpp +static void PathBezierCubicCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level) +{ + float dx = x4 - x1; + float dy = y4 - y1; + float d2 = (x2 - x4) * dy - (y2 - y4) * dx; + float d3 = (x3 - x4) * dy - (y3 - y4) * dx; + d2 = (d2 >= 0) ? d2 : -d2; + d3 = (d3 >= 0) ? d3 : -d3; + if ((d2 + d3) * (d2 + d3) < tess_tol * (dx * dx + dy * dy)) + { + path->push_back(ImVec2(x4, y4)); + } + else if (level < 10) + { + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x34 = (x3 + x4) * 0.5f, y34 = (y3 + y4) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + float x234 = (x23 + x34) * 0.5f, y234 = (y23 + y34) * 0.5f; + float x1234 = (x123 + x234) * 0.5f, y1234 = (y123 + y234) * 0.5f; + PathBezierCubicCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1); + PathBezierCubicCurveToCasteljau(path, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1); + } +} + +static void PathBezierQuadraticCurveToCasteljau(ImVector* path, float x1, float y1, float x2, float y2, float x3, float y3, float tess_tol, int level) +{ + float dx = x3 - x1, dy = y3 - y1; + float det = (x2 - x3) * dy - (y2 - y3) * dx; + if (det * det * 4.0f < tess_tol * (dx * dx + dy * dy)) + { + path->push_back(ImVec2(x3, y3)); + } + else if (level < 10) + { + float x12 = (x1 + x2) * 0.5f, y12 = (y1 + y2) * 0.5f; + float x23 = (x2 + x3) * 0.5f, y23 = (y2 + y3) * 0.5f; + float x123 = (x12 + x23) * 0.5f, y123 = (y12 + y23) * 0.5f; + PathBezierQuadraticCurveToCasteljau(path, x1, y1, x12, y12, x123, y123, tess_tol, level + 1); + PathBezierQuadraticCurveToCasteljau(path, x123, y123, x23, y23, x3, y3, tess_tol, level + 1); + } +} + +void ImDrawList::PathBezierCubicCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments) +{ + ImVec2 p1 = _Path.back(); + if (num_segments == 0) + { + IM_ASSERT(_Data->CurveTessellationTol > 0.0f); + PathBezierCubicCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); // Auto-tessellated + } + else + { + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + _Path.push_back(ImBezierCubicCalc(p1, p2, p3, p4, t_step * i_step)); + } +} + +void ImDrawList::PathBezierQuadraticCurveTo(const ImVec2& p2, const ImVec2& p3, int num_segments) +{ + ImVec2 p1 = _Path.back(); + if (num_segments == 0) + { + IM_ASSERT(_Data->CurveTessellationTol > 0.0f); + PathBezierQuadraticCurveToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, _Data->CurveTessellationTol, 0);// Auto-tessellated + } + else + { + float t_step = 1.0f / (float)num_segments; + for (int i_step = 1; i_step <= num_segments; i_step++) + _Path.push_back(ImBezierQuadraticCalc(p1, p2, p3, t_step * i_step)); + } +} + +IM_STATIC_ASSERT(ImDrawFlags_RoundCornersTopLeft == (1 << 4)); +static inline ImDrawFlags FixRectCornerFlags(ImDrawFlags flags) +{ +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + // Obsoleted in 1.82 (from February 2021) + // Legacy Support for hard coded ~0 (used to be a suggested equivalent to ImDrawCornerFlags_All) + // ~0 --> ImDrawFlags_RoundCornersAll or 0 + if (flags == ~0) + return ImDrawFlags_RoundCornersAll; + + // Legacy Support for hard coded 0x01 to 0x0F (matching 15 out of 16 old flags combinations) + // 0x01 --> ImDrawFlags_RoundCornersTopLeft (VALUE 0x01 OVERLAPS ImDrawFlags_Closed but ImDrawFlags_Closed is never valid in this path!) + // 0x02 --> ImDrawFlags_RoundCornersTopRight + // 0x03 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight + // 0x04 --> ImDrawFlags_RoundCornersBotLeft + // 0x05 --> ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBotLeft + // ... + // 0x0F --> ImDrawFlags_RoundCornersAll or 0 + // (See all values in ImDrawCornerFlags_) + if (flags >= 0x01 && flags <= 0x0F) + return (flags << 4); + + // We cannot support hard coded 0x00 with 'float rounding > 0.0f' --> replace with ImDrawFlags_RoundCornersNone or use 'float rounding = 0.0f' +#endif + + // If this triggers, please update your code replacing hardcoded values with new ImDrawFlags_RoundCorners* values. + // Note that ImDrawFlags_Closed (== 0x01) is an invalid flag for AddRect(), AddRectFilled(), PathRect() etc... + IM_ASSERT((flags & 0x0F) == 0 && "Misuse of legacy hardcoded ImDrawCornerFlags values!"); + + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags |= ImDrawFlags_RoundCornersAll; + + return flags; +} + +void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawFlags flags) +{ + flags = FixRectCornerFlags(flags); + rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((flags & ImDrawFlags_RoundCornersTop) == ImDrawFlags_RoundCornersTop) || ((flags & ImDrawFlags_RoundCornersBottom) == ImDrawFlags_RoundCornersBottom) ? 0.5f : 1.0f ) - 1.0f); + rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((flags & ImDrawFlags_RoundCornersLeft) == ImDrawFlags_RoundCornersLeft) || ((flags & ImDrawFlags_RoundCornersRight) == ImDrawFlags_RoundCornersRight) ? 0.5f : 1.0f ) - 1.0f); + + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + PathLineTo(a); + PathLineTo(ImVec2(b.x, a.y)); + PathLineTo(b); + PathLineTo(ImVec2(a.x, b.y)); + } + else + { + const float rounding_tl = (flags & ImDrawFlags_RoundCornersTopLeft) ? rounding : 0.0f; + const float rounding_tr = (flags & ImDrawFlags_RoundCornersTopRight) ? rounding : 0.0f; + const float rounding_br = (flags & ImDrawFlags_RoundCornersBottomRight) ? rounding : 0.0f; + const float rounding_bl = (flags & ImDrawFlags_RoundCornersBottomLeft) ? rounding : 0.0f; + PathArcToFast(ImVec2(a.x + rounding_tl, a.y + rounding_tl), rounding_tl, 6, 9); + PathArcToFast(ImVec2(b.x - rounding_tr, a.y + rounding_tr), rounding_tr, 9, 12); + PathArcToFast(ImVec2(b.x - rounding_br, b.y - rounding_br), rounding_br, 0, 3); + PathArcToFast(ImVec2(a.x + rounding_bl, b.y - rounding_bl), rounding_bl, 3, 6); + } +} + +void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + PathLineTo(p1 + ImVec2(0.5f, 0.5f)); + PathLineTo(p2 + ImVec2(0.5f, 0.5f)); + PathStroke(col, 0, thickness); +} + +// p_min = upper-left, p_max = lower-right +// Note we don't render 1 pixels sized rectangles properly. +void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + if (Flags & ImDrawListFlags_AntiAliasedLines) + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.50f, 0.50f), rounding, flags); + else + PathRect(p_min + ImVec2(0.50f, 0.50f), p_max - ImVec2(0.49f, 0.49f), rounding, flags); // Better looking lower-right corner and rounded non-AA shapes. + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawFlags flags) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + PrimReserve(6, 4); + PrimRect(p_min, p_max, col); + } + else + { + PathRect(p_min, p_max, rounding, flags); + PathFillConvex(col); + } +} + +// p_min = upper-left, p_max = lower-right +void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left) +{ + if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0) + return; + + const ImVec2 uv = _Data->TexUvWhitePixel; + PrimReserve(6, 4); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); + PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx + 3)); + PrimWriteVtx(p_min, uv, col_upr_left); + PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right); + PrimWriteVtx(p_max, uv, col_bot_right); + PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left); +} + +void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathLineTo(p4); + PathFillConvex(col); +} + +void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathLineTo(p2); + PathLineTo(p3); + PathFillConvex(col); +} + +void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) + return; + + if (num_segments <= 0) + { + // Use arc with automatic segment count + _PathArcToFastEx(center, radius - 0.5f, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); + _Path.Size--; + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + } + + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0 || radius < 0.5f) + return; + + if (num_segments <= 0) + { + // Use arc with automatic segment count + _PathArcToFastEx(center, radius, 0, IM_DRAWLIST_ARCFAST_SAMPLE_MAX, 0); + _Path.Size--; + } + else + { + // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes) + num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX); + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); + } + + PathFillConvex(col); +} + +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness) +{ + if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) + return; + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1); + PathStroke(col, ImDrawFlags_Closed, thickness); +} + +// Guaranteed to honor 'num_segments' +void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2) + return; + + // Because we are filling a closed shape we remove 1 from the count of segments/points + const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments; + PathArcTo(center, radius, 0.0f, a_max, num_segments - 1); + PathFillConvex(col); +} + +// Cubic Bezier takes 4 controls points +void ImDrawList::AddBezierCubic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathBezierCubicCurveTo(p2, p3, p4, num_segments); + PathStroke(col, 0, thickness); +} + +// Quadratic Bezier takes 3 controls points +void ImDrawList::AddBezierQuadratic(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness, int num_segments) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + PathLineTo(p1); + PathBezierQuadraticCurveTo(p2, p3, num_segments); + PathStroke(col, 0, thickness); +} + +void ImDrawList::AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end, float wrap_width, const ImVec4* cpu_fine_clip_rect) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + if (text_end == NULL) + text_end = text_begin + strlen(text_begin); + if (text_begin == text_end) + return; + + // Pull default font/size from the shared ImDrawListSharedData instance + if (font == NULL) + font = _Data->Font; + if (font_size == 0.0f) + font_size = _Data->FontSize; + + IM_ASSERT(font->ContainerAtlas->TexID == _CmdHeader.TextureId); // Use high-level ImGui::PushFont() or low-level ImDrawList::PushTextureId() to change font. + + ImVec4 clip_rect = _CmdHeader.ClipRect; + if (cpu_fine_clip_rect) + { + clip_rect.x = ImMax(clip_rect.x, cpu_fine_clip_rect->x); + clip_rect.y = ImMax(clip_rect.y, cpu_fine_clip_rect->y); + clip_rect.z = ImMin(clip_rect.z, cpu_fine_clip_rect->z); + clip_rect.w = ImMin(clip_rect.w, cpu_fine_clip_rect->w); + } + font->RenderText(this, font_size, pos, col, clip_rect, text_begin, text_end, wrap_width, cpu_fine_clip_rect != NULL); +} + +void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end) +{ + AddText(NULL, 0.0f, pos, col, text_begin, text_end); +} + +void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + PrimReserve(6, 4); + PrimRectUV(p_min, p_max, uv_min, uv_max, col); + + if (push_texture_id) + PopTextureID(); +} + +void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + PrimReserve(6, 4); + PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col); + + if (push_texture_id) + PopTextureID(); +} + +void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawFlags flags) +{ + if ((col & IM_COL32_A_MASK) == 0) + return; + + flags = FixRectCornerFlags(flags); + if (rounding < 0.5f || (flags & ImDrawFlags_RoundCornersMask_) == ImDrawFlags_RoundCornersNone) + { + AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col); + return; + } + + const bool push_texture_id = user_texture_id != _CmdHeader.TextureId; + if (push_texture_id) + PushTextureID(user_texture_id); + + int vert_start_idx = VtxBuffer.Size; + PathRect(p_min, p_max, rounding, flags); + PathFillConvex(col); + int vert_end_idx = VtxBuffer.Size; + ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true); + + if (push_texture_id) + PopTextureID(); +} + + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawListSplitter +//----------------------------------------------------------------------------- +// FIXME: This may be a little confusing, trying to be a little too low-level/optimal instead of just doing vector swap.. +//----------------------------------------------------------------------------- + +void ImDrawListSplitter::ClearFreeMemory() +{ + for (int i = 0; i < _Channels.Size; i++) + { + if (i == _Current) + memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again + _Channels[i]._CmdBuffer.clear(); + _Channels[i]._IdxBuffer.clear(); + } + _Current = 0; + _Count = 1; + _Channels.clear(); +} + +void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count) +{ + IM_UNUSED(draw_list); + IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter."); + int old_channels_count = _Channels.Size; + if (old_channels_count < channels_count) + { + _Channels.reserve(channels_count); // Avoid over reserving since this is likely to stay stable + _Channels.resize(channels_count); + } + _Count = channels_count; + + // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer + // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to. + // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer + memset(&_Channels[0], 0, sizeof(ImDrawChannel)); + for (int i = 1; i < channels_count; i++) + { + if (i >= old_channels_count) + { + IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel(); + } + else + { + _Channels[i]._CmdBuffer.resize(0); + _Channels[i]._IdxBuffer.resize(0); + } + } +} + +void ImDrawListSplitter::Merge(ImDrawList* draw_list) +{ + // Note that we never use or rely on _Channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use. + if (_Count <= 1) + return; + + SetCurrentChannel(draw_list, 0); + draw_list->_PopUnusedDrawCmd(); + + // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command. + int new_cmd_buffer_count = 0; + int new_idx_buffer_count = 0; + ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL; + int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0 && ch._CmdBuffer.back().UserCallback == NULL) // Equivalent of PopUnusedDrawCmd() + ch._CmdBuffer.pop_back(); + + if (ch._CmdBuffer.Size > 0 && last_cmd != NULL) + { + // Do not include ImDrawCmd_AreSequentialIdxOffset() in the compare as we rebuild IdxOffset values ourselves. + // Manipulating IdxOffset (e.g. by reordering draw commands like done by RenderDimmedBackgroundBehindWindow()) is not supported within a splitter. + ImDrawCmd* next_cmd = &ch._CmdBuffer[0]; + if (ImDrawCmd_HeaderCompare(last_cmd, next_cmd) == 0 && last_cmd->UserCallback == NULL && next_cmd->UserCallback == NULL) + { + // Merge previous channel last draw command with current channel first draw command if matching. + last_cmd->ElemCount += next_cmd->ElemCount; + idx_offset += next_cmd->ElemCount; + ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges. + } + } + if (ch._CmdBuffer.Size > 0) + last_cmd = &ch._CmdBuffer.back(); + new_cmd_buffer_count += ch._CmdBuffer.Size; + new_idx_buffer_count += ch._IdxBuffer.Size; + for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++) + { + ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset; + idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount; + } + } + draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count); + draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count); + + // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices) + ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count; + ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count; + for (int i = 1; i < _Count; i++) + { + ImDrawChannel& ch = _Channels[i]; + if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; } + if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; } + } + draw_list->_IdxWritePtr = idx_write; + + // Ensure there's always a non-callback draw command trailing the command-buffer + if (draw_list->CmdBuffer.Size == 0 || draw_list->CmdBuffer.back().UserCallback != NULL) + draw_list->AddDrawCmd(); + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); + + _Count = 1; +} + +void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx) +{ + IM_ASSERT(idx >= 0 && idx < _Count); + if (_Current == idx) + return; + + // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap() + memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer)); + _Current = idx; + memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer)); + memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer)); + draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size; + + // If current command is used with different settings we need to add a new command + ImDrawCmd* curr_cmd = (draw_list->CmdBuffer.Size == 0) ? NULL : &draw_list->CmdBuffer.Data[draw_list->CmdBuffer.Size - 1]; + if (curr_cmd == NULL) + draw_list->AddDrawCmd(); + else if (curr_cmd->ElemCount == 0) + ImDrawCmd_HeaderCopy(curr_cmd, &draw_list->_CmdHeader); // Copy ClipRect, TextureId, VtxOffset + else if (ImDrawCmd_HeaderCompare(curr_cmd, &draw_list->_CmdHeader) != 0) + draw_list->AddDrawCmd(); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawData +//----------------------------------------------------------------------------- + +// For backward compatibility: convert all buffers from indexed to de-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering! +void ImDrawData::DeIndexAllBuffers() +{ + ImVector new_vtx_buffer; + TotalVtxCount = TotalIdxCount = 0; + for (int i = 0; i < CmdListsCount; i++) + { + ImDrawList* cmd_list = CmdLists[i]; + if (cmd_list->IdxBuffer.empty()) + continue; + new_vtx_buffer.resize(cmd_list->IdxBuffer.Size); + for (int j = 0; j < cmd_list->IdxBuffer.Size; j++) + new_vtx_buffer[j] = cmd_list->VtxBuffer[cmd_list->IdxBuffer[j]]; + cmd_list->VtxBuffer.swap(new_vtx_buffer); + cmd_list->IdxBuffer.resize(0); + TotalVtxCount += cmd_list->VtxBuffer.Size; + } +} + +// Helper to scale the ClipRect field of each ImDrawCmd. +// Use if your final output buffer is at a different scale than draw_data->DisplaySize, +// or if there is a difference between your window resolution and framebuffer resolution. +void ImDrawData::ScaleClipRects(const ImVec2& fb_scale) +{ + for (int i = 0; i < CmdListsCount; i++) + { + ImDrawList* cmd_list = CmdLists[i]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i]; + cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Helpers ShadeVertsXXX functions +//----------------------------------------------------------------------------- + +// Generic linear color gradient, write to RGB fields, leave A untouched. +void ImGui::ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1) +{ + ImVec2 gradient_extent = gradient_p1 - gradient_p0; + float gradient_inv_length2 = 1.0f / ImLengthSqr(gradient_extent); + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + const int col0_r = (int)(col0 >> IM_COL32_R_SHIFT) & 0xFF; + const int col0_g = (int)(col0 >> IM_COL32_G_SHIFT) & 0xFF; + const int col0_b = (int)(col0 >> IM_COL32_B_SHIFT) & 0xFF; + const int col_delta_r = ((int)(col1 >> IM_COL32_R_SHIFT) & 0xFF) - col0_r; + const int col_delta_g = ((int)(col1 >> IM_COL32_G_SHIFT) & 0xFF) - col0_g; + const int col_delta_b = ((int)(col1 >> IM_COL32_B_SHIFT) & 0xFF) - col0_b; + for (ImDrawVert* vert = vert_start; vert < vert_end; vert++) + { + float d = ImDot(vert->pos - gradient_p0, gradient_extent); + float t = ImClamp(d * gradient_inv_length2, 0.0f, 1.0f); + int r = (int)(col0_r + col_delta_r * t); + int g = (int)(col0_g + col_delta_g * t); + int b = (int)(col0_b + col_delta_b * t); + vert->col = (r << IM_COL32_R_SHIFT) | (g << IM_COL32_G_SHIFT) | (b << IM_COL32_B_SHIFT) | (vert->col & IM_COL32_A_MASK); + } +} + +// Distribute UV over (a, b) rectangle +void ImGui::ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp) +{ + const ImVec2 size = b - a; + const ImVec2 uv_size = uv_b - uv_a; + const ImVec2 scale = ImVec2( + size.x != 0.0f ? (uv_size.x / size.x) : 0.0f, + size.y != 0.0f ? (uv_size.y / size.y) : 0.0f); + + ImDrawVert* vert_start = draw_list->VtxBuffer.Data + vert_start_idx; + ImDrawVert* vert_end = draw_list->VtxBuffer.Data + vert_end_idx; + if (clamp) + { + const ImVec2 min = ImMin(uv_a, uv_b); + const ImVec2 max = ImMax(uv_a, uv_b); + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->uv = ImClamp(uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale), min, max); + } + else + { + for (ImDrawVert* vertex = vert_start; vertex < vert_end; ++vertex) + vertex->uv = uv_a + ImMul(ImVec2(vertex->pos.x, vertex->pos.y) - a, scale); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontConfig +//----------------------------------------------------------------------------- + +ImFontConfig::ImFontConfig() +{ + memset(this, 0, sizeof(*this)); + FontDataOwnedByAtlas = true; + OversampleH = 3; // FIXME: 2 may be a better default? + OversampleV = 1; + GlyphMaxAdvanceX = FLT_MAX; + RasterizerMultiply = 1.0f; + EllipsisChar = (ImWchar)-1; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontAtlas +//----------------------------------------------------------------------------- + +// A work of art lies ahead! (. = white layer, X = black layer, others are blank) +// The 2x2 white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes. +// (This is used when io.MouseDrawCursor = true) +const int FONT_ATLAS_DEFAULT_TEX_DATA_W = 122; // Actual texture will be 2 times that + 1 spacing. +const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27; +static const char FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS[FONT_ATLAS_DEFAULT_TEX_DATA_W * FONT_ATLAS_DEFAULT_TEX_DATA_H + 1] = +{ + "..- -XXXXXXX- X - X -XXXXXXX - XXXXXXX- XX - XX XX " + "..- -X.....X- X.X - X.X -X.....X - X.....X- X..X -X..X X..X" + "--- -XXX.XXX- X...X - X...X -X....X - X....X- X..X -X...X X...X" + "X - X.X - X.....X - X.....X -X...X - X...X- X..X - X...X X...X " + "XX - X.X -X.......X- X.......X -X..X.X - X.X..X- X..X - X...X...X " + "X.X - X.X -XXXX.XXXX- XXXX.XXXX -X.X X.X - X.X X.X- X..XXX - X.....X " + "X..X - X.X - X.X - X.X -XX X.X - X.X XX- X..X..XXX - X...X " + "X...X - X.X - X.X - XX X.X XX - X.X - X.X - X..X..X..XX - X.X " + "X....X - X.X - X.X - X.X X.X X.X - X.X - X.X - X..X..X..X.X - X...X " + "X.....X - X.X - X.X - X..X X.X X..X - X.X - X.X -XXX X..X..X..X..X- X.....X " + "X......X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X XX-XX X.X -X..XX........X..X- X...X...X " + "X.......X - X.X - X.X -X.....................X- X.X X.X-X.X X.X -X...X...........X- X...X X...X " + "X........X - X.X - X.X - X...XXXXXX.XXXXXX...X - X.X..X-X..X.X - X..............X-X...X X...X" + "X.........X -XXX.XXX- X.X - X..X X.X X..X - X...X-X...X - X.............X-X..X X..X" + "X..........X-X.....X- X.X - X.X X.X X.X - X....X-X....X - X.............X- XX XX " + "X......XXXXX-XXXXXXX- X.X - XX X.X XX - X.....X-X.....X - X............X--------------" + "X...X..X --------- X.X - X.X - XXXXXXX-XXXXXXX - X...........X - " + "X..X X..X - -XXXX.XXXX- XXXX.XXXX ------------------------------------- X..........X - " + "X.X X..X - -X.......X- X.......X - XX XX - - X..........X - " + "XX X..X - - X.....X - X.....X - X.X X.X - - X........X - " + " X..X - - X...X - X...X - X..X X..X - - X........X - " + " XX - - X.X - X.X - X...XXXXXXXXXXXXX...X - - XXXXXXXXXX - " + "------------- - X - X -X.....................X- ------------------- " + " ----------------------------------- X...XXXXXXXXXXXXX...X - " + " - X..X X..X - " + " - X.X X.X - " + " - XX XX - " +}; + +static const ImVec2 FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[ImGuiMouseCursor_COUNT][3] = +{ + // Pos ........ Size ......... Offset ...... + { ImVec2( 0,3), ImVec2(12,19), ImVec2( 0, 0) }, // ImGuiMouseCursor_Arrow + { ImVec2(13,0), ImVec2( 7,16), ImVec2( 1, 8) }, // ImGuiMouseCursor_TextInput + { ImVec2(31,0), ImVec2(23,23), ImVec2(11,11) }, // ImGuiMouseCursor_ResizeAll + { ImVec2(21,0), ImVec2( 9,23), ImVec2( 4,11) }, // ImGuiMouseCursor_ResizeNS + { ImVec2(55,18),ImVec2(23, 9), ImVec2(11, 4) }, // ImGuiMouseCursor_ResizeEW + { ImVec2(73,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNESW + { ImVec2(55,0), ImVec2(17,17), ImVec2( 8, 8) }, // ImGuiMouseCursor_ResizeNWSE + { ImVec2(91,0), ImVec2(17,22), ImVec2( 5, 0) }, // ImGuiMouseCursor_Hand + { ImVec2(109,0),ImVec2(13,15), ImVec2( 6, 7) }, // ImGuiMouseCursor_NotAllowed +}; + +ImFontAtlas::ImFontAtlas() +{ + memset(this, 0, sizeof(*this)); + TexGlyphPadding = 1; + PackIdMouseCursors = PackIdLines = -1; +} + +ImFontAtlas::~ImFontAtlas() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + Clear(); +} + +void ImFontAtlas::ClearInputData() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + for (int i = 0; i < ConfigData.Size; i++) + if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas) + { + IM_FREE(ConfigData[i].FontData); + ConfigData[i].FontData = NULL; + } + + // When clearing this we lose access to the font name and other information used to build the font. + for (int i = 0; i < Fonts.Size; i++) + if (Fonts[i]->ConfigData >= ConfigData.Data && Fonts[i]->ConfigData < ConfigData.Data + ConfigData.Size) + { + Fonts[i]->ConfigData = NULL; + Fonts[i]->ConfigDataCount = 0; + } + ConfigData.clear(); + CustomRects.clear(); + PackIdMouseCursors = PackIdLines = -1; + // Important: we leave TexReady untouched +} + +void ImFontAtlas::ClearTexData() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + if (TexPixelsAlpha8) + IM_FREE(TexPixelsAlpha8); + if (TexPixelsRGBA32) + IM_FREE(TexPixelsRGBA32); + TexPixelsAlpha8 = NULL; + TexPixelsRGBA32 = NULL; + TexPixelsUseColors = false; + // Important: we leave TexReady untouched +} + +void ImFontAtlas::ClearFonts() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + Fonts.clear_delete(); + TexReady = false; +} + +void ImFontAtlas::Clear() +{ + ClearInputData(); + ClearTexData(); + ClearFonts(); +} + +void ImFontAtlas::GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) +{ + // Build atlas on demand + if (TexPixelsAlpha8 == NULL) + Build(); + + *out_pixels = TexPixelsAlpha8; + if (out_width) *out_width = TexWidth; + if (out_height) *out_height = TexHeight; + if (out_bytes_per_pixel) *out_bytes_per_pixel = 1; +} + +void ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel) +{ + // Convert to RGBA32 format on demand + // Although it is likely to be the most commonly used format, our font rendering is 1 channel / 8 bpp + if (!TexPixelsRGBA32) + { + unsigned char* pixels = NULL; + GetTexDataAsAlpha8(&pixels, NULL, NULL); + if (pixels) + { + TexPixelsRGBA32 = (unsigned int*)IM_ALLOC((size_t)TexWidth * (size_t)TexHeight * 4); + const unsigned char* src = pixels; + unsigned int* dst = TexPixelsRGBA32; + for (int n = TexWidth * TexHeight; n > 0; n--) + *dst++ = IM_COL32(255, 255, 255, (unsigned int)(*src++)); + } + } + + *out_pixels = (unsigned char*)TexPixelsRGBA32; + if (out_width) *out_width = TexWidth; + if (out_height) *out_height = TexHeight; + if (out_bytes_per_pixel) *out_bytes_per_pixel = 4; +} + +ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + IM_ASSERT(font_cfg->FontData != NULL && font_cfg->FontDataSize > 0); + IM_ASSERT(font_cfg->SizePixels > 0.0f); + + // Create new font + if (!font_cfg->MergeMode) + Fonts.push_back(IM_NEW(ImFont)); + else + IM_ASSERT(!Fonts.empty() && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font. + + ConfigData.push_back(*font_cfg); + ImFontConfig& new_font_cfg = ConfigData.back(); + if (new_font_cfg.DstFont == NULL) + new_font_cfg.DstFont = Fonts.back(); + if (!new_font_cfg.FontDataOwnedByAtlas) + { + new_font_cfg.FontData = IM_ALLOC(new_font_cfg.FontDataSize); + new_font_cfg.FontDataOwnedByAtlas = true; + memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize); + } + + if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1) + new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar; + + // Invalidate texture + TexReady = false; + ClearTexData(); + return new_font_cfg.DstFont; +} + +// Default font TTF is compressed with stb_compress then base85 encoded (see misc/fonts/binary_to_compressed_c.cpp for encoder) +static unsigned int stb_decompress_length(const unsigned char* input); +static unsigned int stb_decompress(unsigned char* output, const unsigned char* input, unsigned int length); +static const char* GetDefaultCompressedFontDataTTFBase85(); +static unsigned int Decode85Byte(char c) { return c >= '\\' ? c-36 : c-35; } +static void Decode85(const unsigned char* src, unsigned char* dst) +{ + while (*src) + { + unsigned int tmp = Decode85Byte(src[0]) + 85 * (Decode85Byte(src[1]) + 85 * (Decode85Byte(src[2]) + 85 * (Decode85Byte(src[3]) + 85 * Decode85Byte(src[4])))); + dst[0] = ((tmp >> 0) & 0xFF); dst[1] = ((tmp >> 8) & 0xFF); dst[2] = ((tmp >> 16) & 0xFF); dst[3] = ((tmp >> 24) & 0xFF); // We can't assume little-endianness. + src += 5; + dst += 4; + } +} + +// Load embedded ProggyClean.ttf at size 13, disable oversampling +ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template) +{ + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + if (!font_cfg_template) + { + font_cfg.OversampleH = font_cfg.OversampleV = 1; + font_cfg.PixelSnapH = true; + } + if (font_cfg.SizePixels <= 0.0f) + font_cfg.SizePixels = 13.0f * 1.0f; + if (font_cfg.Name[0] == '\0') + ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels); + font_cfg.EllipsisChar = (ImWchar)0x0085; + font_cfg.GlyphOffset.y = 1.0f * IM_FLOOR(font_cfg.SizePixels / 13.0f); // Add +1 offset per 13 units + + const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85(); + const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault(); + ImFont* font = AddFontFromMemoryCompressedBase85TTF(ttf_compressed_base85, font_cfg.SizePixels, &font_cfg, glyph_ranges); + return font; +} + +ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + size_t data_size = 0; + void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0); + if (!data) + { + IM_ASSERT_USER_ERROR(0, "Could not load font file!"); + return NULL; + } + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + if (font_cfg.Name[0] == '\0') + { + // Store a short copy of filename into into the font name for convenience + const char* p; + for (p = filename + strlen(filename); p > filename && p[-1] != '/' && p[-1] != '\\'; p--) {} + ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "%s, %.0fpx", p, size_pixels); + } + return AddFontFromMemoryTTF(data, (int)data_size, size_pixels, &font_cfg, glyph_ranges); +} + +// NB: Transfer ownership of 'ttf_data' to ImFontAtlas, unless font_cfg_template->FontDataOwnedByAtlas == false. Owned TTF buffer will be deleted after Build(). +ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + IM_ASSERT(font_cfg.FontData == NULL); + font_cfg.FontData = ttf_data; + font_cfg.FontDataSize = ttf_size; + font_cfg.SizePixels = size_pixels > 0.0f ? size_pixels : font_cfg.SizePixels; + if (glyph_ranges) + font_cfg.GlyphRanges = glyph_ranges; + return AddFont(&font_cfg); +} + +ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges) +{ + const unsigned int buf_decompressed_size = stb_decompress_length((const unsigned char*)compressed_ttf_data); + unsigned char* buf_decompressed_data = (unsigned char*)IM_ALLOC(buf_decompressed_size); + stb_decompress(buf_decompressed_data, (const unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size); + + ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig(); + IM_ASSERT(font_cfg.FontData == NULL); + font_cfg.FontDataOwnedByAtlas = true; + return AddFontFromMemoryTTF(buf_decompressed_data, (int)buf_decompressed_size, size_pixels, &font_cfg, glyph_ranges); +} + +ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) +{ + int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4; + void* compressed_ttf = IM_ALLOC((size_t)compressed_ttf_size); + Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf); + ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges); + IM_FREE(compressed_ttf); + return font; +} + +int ImFontAtlas::AddCustomRectRegular(int width, int height) +{ + IM_ASSERT(width > 0 && width <= 0xFFFF); + IM_ASSERT(height > 0 && height <= 0xFFFF); + ImFontAtlasCustomRect r; + r.Width = (unsigned short)width; + r.Height = (unsigned short)height; + CustomRects.push_back(r); + return CustomRects.Size - 1; // Return index +} + +int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset) +{ +#ifdef IMGUI_USE_WCHAR32 + IM_ASSERT(id <= IM_UNICODE_CODEPOINT_MAX); +#endif + IM_ASSERT(font != NULL); + IM_ASSERT(width > 0 && width <= 0xFFFF); + IM_ASSERT(height > 0 && height <= 0xFFFF); + ImFontAtlasCustomRect r; + r.Width = (unsigned short)width; + r.Height = (unsigned short)height; + r.GlyphID = id; + r.GlyphAdvanceX = advance_x; + r.GlyphOffset = offset; + r.Font = font; + CustomRects.push_back(r); + return CustomRects.Size - 1; // Return index +} + +void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const +{ + IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates + IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed + *out_uv_min = ImVec2((float)rect->X * TexUvScale.x, (float)rect->Y * TexUvScale.y); + *out_uv_max = ImVec2((float)(rect->X + rect->Width) * TexUvScale.x, (float)(rect->Y + rect->Height) * TexUvScale.y); +} + +bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]) +{ + if (cursor_type <= ImGuiMouseCursor_None || cursor_type >= ImGuiMouseCursor_COUNT) + return false; + if (Flags & ImFontAtlasFlags_NoMouseCursors) + return false; + + IM_ASSERT(PackIdMouseCursors != -1); + ImFontAtlasCustomRect* r = GetCustomRectByIndex(PackIdMouseCursors); + ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r->X, (float)r->Y); + ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1]; + *out_size = size; + *out_offset = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][2]; + out_uv_border[0] = (pos) * TexUvScale; + out_uv_border[1] = (pos + size) * TexUvScale; + pos.x += FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; + out_uv_fill[0] = (pos) * TexUvScale; + out_uv_fill[1] = (pos + size) * TexUvScale; + return true; +} + +bool ImFontAtlas::Build() +{ + IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!"); + + // Default font is none are specified + if (ConfigData.Size == 0) + AddFontDefault(); + + // Select builder + // - Note that we do not reassign to atlas->FontBuilderIO, since it is likely to point to static data which + // may mess with some hot-reloading schemes. If you need to assign to this (for dynamic selection) AND are + // using a hot-reloading scheme that messes up static data, store your own instance of ImFontBuilderIO somewhere + // and point to it instead of pointing directly to return value of the GetBuilderXXX functions. + const ImFontBuilderIO* builder_io = FontBuilderIO; + if (builder_io == NULL) + { +#ifdef IMGUI_ENABLE_FREETYPE + builder_io = ImGuiFreeType::GetBuilderForFreeType(); +#elif defined(IMGUI_ENABLE_STB_TRUETYPE) + builder_io = ImFontAtlasGetBuilderForStbTruetype(); +#else + IM_ASSERT(0); // Invalid Build function +#endif + } + + // Build + return builder_io->FontBuilder_Build(this); +} + +void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_brighten_factor) +{ + for (unsigned int i = 0; i < 256; i++) + { + unsigned int value = (unsigned int)(i * in_brighten_factor); + out_table[i] = value > 255 ? 255 : (value & 0xFF); + } +} + +void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride) +{ + IM_ASSERT_PARANOID(w <= stride); + unsigned char* data = pixels + x + y * stride; + for (int j = h; j > 0; j--, data += stride - w) + for (int i = w; i > 0; i--, data++) + *data = table[*data]; +} + +#ifdef IMGUI_ENABLE_STB_TRUETYPE +// Temporary data for one source font (multiple source fonts can be merged into one destination ImFont) +// (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.) +struct ImFontBuildSrcData +{ + stbtt_fontinfo FontInfo; + stbtt_pack_range PackRange; // Hold the list of codepoints to pack (essentially points to Codepoints.Data) + stbrp_rect* Rects; // Rectangle to pack. We first fill in their size and the packer will give us their position. + stbtt_packedchar* PackedChars; // Output glyphs + const ImWchar* SrcRanges; // Ranges as requested by user (user is allowed to request too much, e.g. 0x0020..0xFFFF) + int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[] + int GlyphsHighest; // Highest requested codepoint + int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font) + ImBitVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB) + ImVector GlyphsList; // Glyph codepoints list (flattened version of GlyphsSet) +}; + +// Temporary data for one destination ImFont* (multiple source fonts can be merged into one destination ImFont) +struct ImFontBuildDstData +{ + int SrcCount; // Number of source fonts targeting this destination font. + int GlyphsHighest; + int GlyphsCount; + ImBitVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font. +}; + +static void UnpackBitVectorToFlatIndexList(const ImBitVector* in, ImVector* out) +{ + IM_ASSERT(sizeof(in->Storage.Data[0]) == sizeof(int)); + const ImU32* it_begin = in->Storage.begin(); + const ImU32* it_end = in->Storage.end(); + for (const ImU32* it = it_begin; it < it_end; it++) + if (ImU32 entries_32 = *it) + for (ImU32 bit_n = 0; bit_n < 32; bit_n++) + if (entries_32 & ((ImU32)1 << bit_n)) + out->push_back((int)(((it - it_begin) << 5) + bit_n)); +} + +static bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas) +{ + IM_ASSERT(atlas->ConfigData.Size > 0); + + ImFontAtlasBuildInit(atlas); + + // Clear atlas + atlas->TexID = (ImTextureID)NULL; + atlas->TexWidth = atlas->TexHeight = 0; + atlas->TexUvScale = ImVec2(0.0f, 0.0f); + atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f); + atlas->ClearTexData(); + + // Temporary storage for building + ImVector src_tmp_array; + ImVector dst_tmp_array; + src_tmp_array.resize(atlas->ConfigData.Size); + dst_tmp_array.resize(atlas->Fonts.Size); + memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes()); + memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes()); + + // 1. Initialize font loading structure, check font data validity + for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + ImFontConfig& cfg = atlas->ConfigData[src_i]; + IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas)); + + // Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices) + src_tmp.DstIndex = -1; + for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++) + if (cfg.DstFont == atlas->Fonts[output_i]) + src_tmp.DstIndex = output_i; + if (src_tmp.DstIndex == -1) + { + IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array? + return false; + } + // Initialize helper structure for font loading and verify that the TTF/OTF data is correct + const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo); + IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found."); + if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset)) + return false; + + // Measure highest codepoints + ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; + src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault(); + for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) + { + // Check for valid range. This may also help detect *some* dangling pointers, because a common + // user error is to setup ImFontConfig::GlyphRanges with a pointer to data that isn't persistent. + IM_ASSERT(src_range[0] <= src_range[1]); + src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]); + } + dst_tmp.SrcCount++; + dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest); + } + + // 2. For every requested codepoint, check for their presence in the font data, and handle redundancy or overlaps between source fonts to avoid unused glyphs. + int total_glyphs_count = 0; + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex]; + src_tmp.GlyphsSet.Create(src_tmp.GlyphsHighest + 1); + if (dst_tmp.GlyphsSet.Storage.empty()) + dst_tmp.GlyphsSet.Create(dst_tmp.GlyphsHighest + 1); + + for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2) + for (unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++) + { + if (dst_tmp.GlyphsSet.TestBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true) + continue; + if (!stbtt_FindGlyphIndex(&src_tmp.FontInfo, codepoint)) // It is actually in the font? + continue; + + // Add to avail set/counters + src_tmp.GlyphsCount++; + dst_tmp.GlyphsCount++; + src_tmp.GlyphsSet.SetBit(codepoint); + dst_tmp.GlyphsSet.SetBit(codepoint); + total_glyphs_count++; + } + } + + // 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another) + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount); + UnpackBitVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList); + src_tmp.GlyphsSet.Clear(); + IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount); + } + for (int dst_i = 0; dst_i < dst_tmp_array.Size; dst_i++) + dst_tmp_array[dst_i].GlyphsSet.Clear(); + dst_tmp_array.clear(); + + // Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0) + // (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity) + ImVector buf_rects; + ImVector buf_packedchars; + buf_rects.resize(total_glyphs_count); + buf_packedchars.resize(total_glyphs_count); + memset(buf_rects.Data, 0, (size_t)buf_rects.size_in_bytes()); + memset(buf_packedchars.Data, 0, (size_t)buf_packedchars.size_in_bytes()); + + // 4. Gather glyphs sizes so we can pack them in our virtual canvas. + int total_surface = 0; + int buf_rects_out_n = 0; + int buf_packedchars_out_n = 0; + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + src_tmp.Rects = &buf_rects[buf_rects_out_n]; + src_tmp.PackedChars = &buf_packedchars[buf_packedchars_out_n]; + buf_rects_out_n += src_tmp.GlyphsCount; + buf_packedchars_out_n += src_tmp.GlyphsCount; + + // Convert our ranges in the format stb_truetype wants + ImFontConfig& cfg = atlas->ConfigData[src_i]; + src_tmp.PackRange.font_size = cfg.SizePixels; + src_tmp.PackRange.first_unicode_codepoint_in_range = 0; + src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data; + src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size; + src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars; + src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH; + src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV; + + // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects) + const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels); + const int padding = atlas->TexGlyphPadding; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++) + { + int x0, y0, x1, y1; + const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]); + IM_ASSERT(glyph_index_in_font != 0); + stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1); + src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + padding + cfg.OversampleH - 1); + src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + padding + cfg.OversampleV - 1); + total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h; + } + } + + // We need a width for the skyline algorithm, any width! + // The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height. + // User can override TexDesiredWidth and TexGlyphPadding if they wish, otherwise we use a simple heuristic to select the width based on expected surface. + const int surface_sqrt = (int)ImSqrt((float)total_surface) + 1; + atlas->TexHeight = 0; + if (atlas->TexDesiredWidth > 0) + atlas->TexWidth = atlas->TexDesiredWidth; + else + atlas->TexWidth = (surface_sqrt >= 4096 * 0.7f) ? 4096 : (surface_sqrt >= 2048 * 0.7f) ? 2048 : (surface_sqrt >= 1024 * 0.7f) ? 1024 : 512; + + // 5. Start packing + // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values). + const int TEX_HEIGHT_MAX = 1024 * 32; + stbtt_pack_context spc = {}; + stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, atlas->TexGlyphPadding, NULL); + ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info); + + // 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point. + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + stbrp_pack_rects((stbrp_context*)spc.pack_info, src_tmp.Rects, src_tmp.GlyphsCount); + + // Extend texture height and mark missing glyphs as non-packed so we won't render them. + // FIXME: We are not handling packing failure here (would happen if we got off TEX_HEIGHT_MAX or if a single if larger than TexWidth?) + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) + if (src_tmp.Rects[glyph_i].was_packed) + atlas->TexHeight = ImMax(atlas->TexHeight, src_tmp.Rects[glyph_i].y + src_tmp.Rects[glyph_i].h); + } + + // 7. Allocate texture + atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight); + atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight); + atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight); + memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight); + spc.pixels = atlas->TexPixelsAlpha8; + spc.height = atlas->TexHeight; + + // 8. Render/rasterize font characters into the texture + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontConfig& cfg = atlas->ConfigData[src_i]; + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + stbtt_PackFontRangesRenderIntoRects(&spc, &src_tmp.FontInfo, &src_tmp.PackRange, 1, src_tmp.Rects); + + // Apply multiply operator + if (cfg.RasterizerMultiply != 1.0f) + { + unsigned char multiply_table[256]; + ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply); + stbrp_rect* r = &src_tmp.Rects[0]; + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++, r++) + if (r->was_packed) + ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, atlas->TexPixelsAlpha8, r->x, r->y, r->w, r->h, atlas->TexWidth * 1); + } + src_tmp.Rects = NULL; + } + + // End packing + stbtt_PackEnd(&spc); + buf_rects.clear(); + + // 9. Setup ImFont and glyphs for runtime + for (int src_i = 0; src_i < src_tmp_array.Size; src_i++) + { + ImFontBuildSrcData& src_tmp = src_tmp_array[src_i]; + if (src_tmp.GlyphsCount == 0) + continue; + + // When merging fonts with MergeMode=true: + // - We can have multiple input fonts writing into a same destination font. + // - dst_font->ConfigData is != from cfg which is our source configuration. + ImFontConfig& cfg = atlas->ConfigData[src_i]; + ImFont* dst_font = cfg.DstFont; + + const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels); + int unscaled_ascent, unscaled_descent, unscaled_line_gap; + stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap); + + const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1)); + const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1)); + ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent); + const float font_off_x = cfg.GlyphOffset.x; + const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent); + + for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++) + { + // Register glyph + const int codepoint = src_tmp.GlyphsList[glyph_i]; + const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i]; + stbtt_aligned_quad q; + float unused_x = 0.0f, unused_y = 0.0f; + stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &unused_x, &unused_y, &q, 0); + dst_font->AddGlyph(&cfg, (ImWchar)codepoint, q.x0 + font_off_x, q.y0 + font_off_y, q.x1 + font_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, pc.xadvance); + } + } + + // Cleanup + src_tmp_array.clear_destruct(); + + ImFontAtlasBuildFinish(atlas); + return true; +} + +const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype() +{ + static ImFontBuilderIO io; + io.FontBuilder_Build = ImFontAtlasBuildWithStbTruetype; + return &io; +} + +#endif // IMGUI_ENABLE_STB_TRUETYPE + +void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent) +{ + if (!font_config->MergeMode) + { + font->ClearOutputData(); + font->FontSize = font_config->SizePixels; + font->ConfigData = font_config; + font->ConfigDataCount = 0; + font->ContainerAtlas = atlas; + font->Ascent = ascent; + font->Descent = descent; + } + font->ConfigDataCount++; +} + +void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque) +{ + stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque; + IM_ASSERT(pack_context != NULL); + + ImVector& user_rects = atlas->CustomRects; + IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong. + + ImVector pack_rects; + pack_rects.resize(user_rects.Size); + memset(pack_rects.Data, 0, (size_t)pack_rects.size_in_bytes()); + for (int i = 0; i < user_rects.Size; i++) + { + pack_rects[i].w = user_rects[i].Width; + pack_rects[i].h = user_rects[i].Height; + } + stbrp_pack_rects(pack_context, &pack_rects[0], pack_rects.Size); + for (int i = 0; i < pack_rects.Size; i++) + if (pack_rects[i].was_packed) + { + user_rects[i].X = (unsigned short)pack_rects[i].x; + user_rects[i].Y = (unsigned short)pack_rects[i].y; + IM_ASSERT(pack_rects[i].w == user_rects[i].Width && pack_rects[i].h == user_rects[i].Height); + atlas->TexHeight = ImMax(atlas->TexHeight, pack_rects[i].y + pack_rects[i].h); + } +} + +void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned char* out_pixel = atlas->TexPixelsAlpha8 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : 0x00; +} + +void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value) +{ + IM_ASSERT(x >= 0 && x + w <= atlas->TexWidth); + IM_ASSERT(y >= 0 && y + h <= atlas->TexHeight); + unsigned int* out_pixel = atlas->TexPixelsRGBA32 + x + (y * atlas->TexWidth); + for (int off_y = 0; off_y < h; off_y++, out_pixel += atlas->TexWidth, in_str += w) + for (int off_x = 0; off_x < w; off_x++) + out_pixel[off_x] = (in_str[off_x] == in_marker_char) ? in_marker_pixel_value : IM_COL32_BLACK_TRANS; +} + +static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas) +{ + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdMouseCursors); + IM_ASSERT(r->IsPacked()); + + const int w = atlas->TexWidth; + if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) + { + // Render/copy pixels + IM_ASSERT(r->Width == FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1 && r->Height == FONT_ATLAS_DEFAULT_TEX_DATA_H); + const int x_for_white = r->X; + const int x_for_black = r->X + FONT_ATLAS_DEFAULT_TEX_DATA_W + 1; + if (atlas->TexPixelsAlpha8 != NULL) + { + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', 0xFF); + ImFontAtlasBuildRender8bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', 0xFF); + } + else + { + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_white, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, '.', IM_COL32_WHITE); + ImFontAtlasBuildRender32bppRectFromString(atlas, x_for_black, r->Y, FONT_ATLAS_DEFAULT_TEX_DATA_W, FONT_ATLAS_DEFAULT_TEX_DATA_H, FONT_ATLAS_DEFAULT_TEX_DATA_PIXELS, 'X', IM_COL32_WHITE); + } + } + else + { + // Render 4 white pixels + IM_ASSERT(r->Width == 2 && r->Height == 2); + const int offset = (int)r->X + (int)r->Y * w; + if (atlas->TexPixelsAlpha8 != NULL) + { + atlas->TexPixelsAlpha8[offset] = atlas->TexPixelsAlpha8[offset + 1] = atlas->TexPixelsAlpha8[offset + w] = atlas->TexPixelsAlpha8[offset + w + 1] = 0xFF; + } + else + { + atlas->TexPixelsRGBA32[offset] = atlas->TexPixelsRGBA32[offset + 1] = atlas->TexPixelsRGBA32[offset + w] = atlas->TexPixelsRGBA32[offset + w + 1] = IM_COL32_WHITE; + } + } + atlas->TexUvWhitePixel = ImVec2((r->X + 0.5f) * atlas->TexUvScale.x, (r->Y + 0.5f) * atlas->TexUvScale.y); +} + +static void ImFontAtlasBuildRenderLinesTexData(ImFontAtlas* atlas) +{ + if (atlas->Flags & ImFontAtlasFlags_NoBakedLines) + return; + + // This generates a triangular shape in the texture, with the various line widths stacked on top of each other to allow interpolation between them + ImFontAtlasCustomRect* r = atlas->GetCustomRectByIndex(atlas->PackIdLines); + IM_ASSERT(r->IsPacked()); + for (unsigned int n = 0; n < IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1; n++) // +1 because of the zero-width row + { + // Each line consists of at least two empty pixels at the ends, with a line of solid pixels in the middle + unsigned int y = n; + unsigned int line_width = n; + unsigned int pad_left = (r->Width - line_width) / 2; + unsigned int pad_right = r->Width - (pad_left + line_width); + + // Write each slice + IM_ASSERT(pad_left + line_width + pad_right == r->Width && y < r->Height); // Make sure we're inside the texture bounds before we start writing pixels + if (atlas->TexPixelsAlpha8 != NULL) + { + unsigned char* write_ptr = &atlas->TexPixelsAlpha8[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = 0x00; + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = 0xFF; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = 0x00; + } + else + { + unsigned int* write_ptr = &atlas->TexPixelsRGBA32[r->X + ((r->Y + y) * atlas->TexWidth)]; + for (unsigned int i = 0; i < pad_left; i++) + *(write_ptr + i) = IM_COL32(255, 255, 255, 0); + + for (unsigned int i = 0; i < line_width; i++) + *(write_ptr + pad_left + i) = IM_COL32_WHITE; + + for (unsigned int i = 0; i < pad_right; i++) + *(write_ptr + pad_left + line_width + i) = IM_COL32(255, 255, 255, 0); + } + + // Calculate UVs for this line + ImVec2 uv0 = ImVec2((float)(r->X + pad_left - 1), (float)(r->Y + y)) * atlas->TexUvScale; + ImVec2 uv1 = ImVec2((float)(r->X + pad_left + line_width + 1), (float)(r->Y + y + 1)) * atlas->TexUvScale; + float half_v = (uv0.y + uv1.y) * 0.5f; // Calculate a constant V in the middle of the row to avoid sampling artifacts + atlas->TexUvLines[n] = ImVec4(uv0.x, half_v, uv1.x, half_v); + } +} + +// Note: this is called / shared by both the stb_truetype and the FreeType builder +void ImFontAtlasBuildInit(ImFontAtlas* atlas) +{ + // Register texture region for mouse cursors or standard white pixels + if (atlas->PackIdMouseCursors < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoMouseCursors)) + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(FONT_ATLAS_DEFAULT_TEX_DATA_W * 2 + 1, FONT_ATLAS_DEFAULT_TEX_DATA_H); + else + atlas->PackIdMouseCursors = atlas->AddCustomRectRegular(2, 2); + } + + // Register texture region for thick lines + // The +2 here is to give space for the end caps, whilst height +1 is to accommodate the fact we have a zero-width row + if (atlas->PackIdLines < 0) + { + if (!(atlas->Flags & ImFontAtlasFlags_NoBakedLines)) + atlas->PackIdLines = atlas->AddCustomRectRegular(IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 2, IM_DRAWLIST_TEX_LINES_WIDTH_MAX + 1); + } +} + +// This is called/shared by both the stb_truetype and the FreeType builder. +void ImFontAtlasBuildFinish(ImFontAtlas* atlas) +{ + // Render into our custom data blocks + IM_ASSERT(atlas->TexPixelsAlpha8 != NULL || atlas->TexPixelsRGBA32 != NULL); + ImFontAtlasBuildRenderDefaultTexData(atlas); + ImFontAtlasBuildRenderLinesTexData(atlas); + + // Register custom rectangle glyphs + for (int i = 0; i < atlas->CustomRects.Size; i++) + { + const ImFontAtlasCustomRect* r = &atlas->CustomRects[i]; + if (r->Font == NULL || r->GlyphID == 0) + continue; + + // Will ignore ImFontConfig settings: GlyphMinAdvanceX, GlyphMinAdvanceY, GlyphExtraSpacing, PixelSnapH + IM_ASSERT(r->Font->ContainerAtlas == atlas); + ImVec2 uv0, uv1; + atlas->CalcCustomRectUV(r, &uv0, &uv1); + r->Font->AddGlyph(NULL, (ImWchar)r->GlyphID, r->GlyphOffset.x, r->GlyphOffset.y, r->GlyphOffset.x + r->Width, r->GlyphOffset.y + r->Height, uv0.x, uv0.y, uv1.x, uv1.y, r->GlyphAdvanceX); + } + + // Build all fonts lookup tables + for (int i = 0; i < atlas->Fonts.Size; i++) + if (atlas->Fonts[i]->DirtyLookupTables) + atlas->Fonts[i]->BuildLookupTable(); + + atlas->TexReady = true; +} + +// Retrieve list of range (2 int per range, values are inclusive) +const ImWchar* ImFontAtlas::GetGlyphRangesDefault() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesGreek() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x0370, 0x03FF, // Greek and Coptic + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesKorean() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x3131, 0x3163, // Korean alphabets + 0xAC00, 0xD7A3, // Korean characters + 0xFFFD, 0xFFFD, // Invalid + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesChineseFull() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x2000, 0x206F, // General Punctuation + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD, // Invalid + 0x4e00, 0x9FAF, // CJK Ideograms + 0, + }; + return &ranges[0]; +} + +static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short* accumulative_offsets, int accumulative_offsets_count, ImWchar* out_ranges) +{ + for (int n = 0; n < accumulative_offsets_count; n++, out_ranges += 2) + { + out_ranges[0] = out_ranges[1] = (ImWchar)(base_codepoint + accumulative_offsets[n]); + base_codepoint += accumulative_offsets[n]; + } + out_ranges[0] = 0; +} + +//------------------------------------------------------------------------- +// [SECTION] ImFontAtlas glyph ranges helpers +//------------------------------------------------------------------------- + +const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon() +{ + // Store 2500 regularly used characters for Simplified Chinese. + // Sourced from https://zh.wiktionary.org/wiki/%E9%99%84%E5%BD%95:%E7%8E%B0%E4%BB%A3%E6%B1%89%E8%AF%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E8%A1%A8 + // This table covers 97.97% of all characters used during the month in July, 1987. + // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. + // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) + static const short accumulative_offsets_from_0x4E00[] = + { + 0,1,2,4,1,1,1,1,2,1,3,2,1,2,2,1,1,1,1,1,5,2,1,2,3,3,3,2,2,4,1,1,1,2,1,5,2,3,1,2,1,2,1,1,2,1,1,2,2,1,4,1,1,1,1,5,10,1,2,19,2,1,2,1,2,1,2,1,2, + 1,5,1,6,3,2,1,2,2,1,1,1,4,8,5,1,1,4,1,1,3,1,2,1,5,1,2,1,1,1,10,1,1,5,2,4,6,1,4,2,2,2,12,2,1,1,6,1,1,1,4,1,1,4,6,5,1,4,2,2,4,10,7,1,1,4,2,4, + 2,1,4,3,6,10,12,5,7,2,14,2,9,1,1,6,7,10,4,7,13,1,5,4,8,4,1,1,2,28,5,6,1,1,5,2,5,20,2,2,9,8,11,2,9,17,1,8,6,8,27,4,6,9,20,11,27,6,68,2,2,1,1, + 1,2,1,2,2,7,6,11,3,3,1,1,3,1,2,1,1,1,1,1,3,1,1,8,3,4,1,5,7,2,1,4,4,8,4,2,1,2,1,1,4,5,6,3,6,2,12,3,1,3,9,2,4,3,4,1,5,3,3,1,3,7,1,5,1,1,1,1,2, + 3,4,5,2,3,2,6,1,1,2,1,7,1,7,3,4,5,15,2,2,1,5,3,22,19,2,1,1,1,1,2,5,1,1,1,6,1,1,12,8,2,9,18,22,4,1,1,5,1,16,1,2,7,10,15,1,1,6,2,4,1,2,4,1,6, + 1,1,3,2,4,1,6,4,5,1,2,1,1,2,1,10,3,1,3,2,1,9,3,2,5,7,2,19,4,3,6,1,1,1,1,1,4,3,2,1,1,1,2,5,3,1,1,1,2,2,1,1,2,1,1,2,1,3,1,1,1,3,7,1,4,1,1,2,1, + 1,2,1,2,4,4,3,8,1,1,1,2,1,3,5,1,3,1,3,4,6,2,2,14,4,6,6,11,9,1,15,3,1,28,5,2,5,5,3,1,3,4,5,4,6,14,3,2,3,5,21,2,7,20,10,1,2,19,2,4,28,28,2,3, + 2,1,14,4,1,26,28,42,12,40,3,52,79,5,14,17,3,2,2,11,3,4,6,3,1,8,2,23,4,5,8,10,4,2,7,3,5,1,1,6,3,1,2,2,2,5,28,1,1,7,7,20,5,3,29,3,17,26,1,8,4, + 27,3,6,11,23,5,3,4,6,13,24,16,6,5,10,25,35,7,3,2,3,3,14,3,6,2,6,1,4,2,3,8,2,1,1,3,3,3,4,1,1,13,2,2,4,5,2,1,14,14,1,2,2,1,4,5,2,3,1,14,3,12, + 3,17,2,16,5,1,2,1,8,9,3,19,4,2,2,4,17,25,21,20,28,75,1,10,29,103,4,1,2,1,1,4,2,4,1,2,3,24,2,2,2,1,1,2,1,3,8,1,1,1,2,1,1,3,1,1,1,6,1,5,3,1,1, + 1,3,4,1,1,5,2,1,5,6,13,9,16,1,1,1,1,3,2,3,2,4,5,2,5,2,2,3,7,13,7,2,2,1,1,1,1,2,3,3,2,1,6,4,9,2,1,14,2,14,2,1,18,3,4,14,4,11,41,15,23,15,23, + 176,1,3,4,1,1,1,1,5,3,1,2,3,7,3,1,1,2,1,2,4,4,6,2,4,1,9,7,1,10,5,8,16,29,1,1,2,2,3,1,3,5,2,4,5,4,1,1,2,2,3,3,7,1,6,10,1,17,1,44,4,6,2,1,1,6, + 5,4,2,10,1,6,9,2,8,1,24,1,2,13,7,8,8,2,1,4,1,3,1,3,3,5,2,5,10,9,4,9,12,2,1,6,1,10,1,1,7,7,4,10,8,3,1,13,4,3,1,6,1,3,5,2,1,2,17,16,5,2,16,6, + 1,4,2,1,3,3,6,8,5,11,11,1,3,3,2,4,6,10,9,5,7,4,7,4,7,1,1,4,2,1,3,6,8,7,1,6,11,5,5,3,24,9,4,2,7,13,5,1,8,82,16,61,1,1,1,4,2,2,16,10,3,8,1,1, + 6,4,2,1,3,1,1,1,4,3,8,4,2,2,1,1,1,1,1,6,3,5,1,1,4,6,9,2,1,1,1,2,1,7,2,1,6,1,5,4,4,3,1,8,1,3,3,1,3,2,2,2,2,3,1,6,1,2,1,2,1,3,7,1,8,2,1,2,1,5, + 2,5,3,5,10,1,2,1,1,3,2,5,11,3,9,3,5,1,1,5,9,1,2,1,5,7,9,9,8,1,3,3,3,6,8,2,3,2,1,1,32,6,1,2,15,9,3,7,13,1,3,10,13,2,14,1,13,10,2,1,3,10,4,15, + 2,15,15,10,1,3,9,6,9,32,25,26,47,7,3,2,3,1,6,3,4,3,2,8,5,4,1,9,4,2,2,19,10,6,2,3,8,1,2,2,4,2,1,9,4,4,4,6,4,8,9,2,3,1,1,1,1,3,5,5,1,3,8,4,6, + 2,1,4,12,1,5,3,7,13,2,5,8,1,6,1,2,5,14,6,1,5,2,4,8,15,5,1,23,6,62,2,10,1,1,8,1,2,2,10,4,2,2,9,2,1,1,3,2,3,1,5,3,3,2,1,3,8,1,1,1,11,3,1,1,4, + 3,7,1,14,1,2,3,12,5,2,5,1,6,7,5,7,14,11,1,3,1,8,9,12,2,1,11,8,4,4,2,6,10,9,13,1,1,3,1,5,1,3,2,4,4,1,18,2,3,14,11,4,29,4,2,7,1,3,13,9,2,2,5, + 3,5,20,7,16,8,5,72,34,6,4,22,12,12,28,45,36,9,7,39,9,191,1,1,1,4,11,8,4,9,2,3,22,1,1,1,1,4,17,1,7,7,1,11,31,10,2,4,8,2,3,2,1,4,2,16,4,32,2, + 3,19,13,4,9,1,5,2,14,8,1,1,3,6,19,6,5,1,16,6,2,10,8,5,1,2,3,1,5,5,1,11,6,6,1,3,3,2,6,3,8,1,1,4,10,7,5,7,7,5,8,9,2,1,3,4,1,1,3,1,3,3,2,6,16, + 1,4,6,3,1,10,6,1,3,15,2,9,2,10,25,13,9,16,6,2,2,10,11,4,3,9,1,2,6,6,5,4,30,40,1,10,7,12,14,33,6,3,6,7,3,1,3,1,11,14,4,9,5,12,11,49,18,51,31, + 140,31,2,2,1,5,1,8,1,10,1,4,4,3,24,1,10,1,3,6,6,16,3,4,5,2,1,4,2,57,10,6,22,2,22,3,7,22,6,10,11,36,18,16,33,36,2,5,5,1,1,1,4,10,1,4,13,2,7, + 5,2,9,3,4,1,7,43,3,7,3,9,14,7,9,1,11,1,1,3,7,4,18,13,1,14,1,3,6,10,73,2,2,30,6,1,11,18,19,13,22,3,46,42,37,89,7,3,16,34,2,2,3,9,1,7,1,1,1,2, + 2,4,10,7,3,10,3,9,5,28,9,2,6,13,7,3,1,3,10,2,7,2,11,3,6,21,54,85,2,1,4,2,2,1,39,3,21,2,2,5,1,1,1,4,1,1,3,4,15,1,3,2,4,4,2,3,8,2,20,1,8,7,13, + 4,1,26,6,2,9,34,4,21,52,10,4,4,1,5,12,2,11,1,7,2,30,12,44,2,30,1,1,3,6,16,9,17,39,82,2,2,24,7,1,7,3,16,9,14,44,2,1,2,1,2,3,5,2,4,1,6,7,5,3, + 2,6,1,11,5,11,2,1,18,19,8,1,3,24,29,2,1,3,5,2,2,1,13,6,5,1,46,11,3,5,1,1,5,8,2,10,6,12,6,3,7,11,2,4,16,13,2,5,1,1,2,2,5,2,28,5,2,23,10,8,4, + 4,22,39,95,38,8,14,9,5,1,13,5,4,3,13,12,11,1,9,1,27,37,2,5,4,4,63,211,95,2,2,2,1,3,5,2,1,1,2,2,1,1,1,3,2,4,1,2,1,1,5,2,2,1,1,2,3,1,3,1,1,1, + 3,1,4,2,1,3,6,1,1,3,7,15,5,3,2,5,3,9,11,4,2,22,1,6,3,8,7,1,4,28,4,16,3,3,25,4,4,27,27,1,4,1,2,2,7,1,3,5,2,28,8,2,14,1,8,6,16,25,3,3,3,14,3, + 3,1,1,2,1,4,6,3,8,4,1,1,1,2,3,6,10,6,2,3,18,3,2,5,5,4,3,1,5,2,5,4,23,7,6,12,6,4,17,11,9,5,1,1,10,5,12,1,1,11,26,33,7,3,6,1,17,7,1,5,12,1,11, + 2,4,1,8,14,17,23,1,2,1,7,8,16,11,9,6,5,2,6,4,16,2,8,14,1,11,8,9,1,1,1,9,25,4,11,19,7,2,15,2,12,8,52,7,5,19,2,16,4,36,8,1,16,8,24,26,4,6,2,9, + 5,4,36,3,28,12,25,15,37,27,17,12,59,38,5,32,127,1,2,9,17,14,4,1,2,1,1,8,11,50,4,14,2,19,16,4,17,5,4,5,26,12,45,2,23,45,104,30,12,8,3,10,2,2, + 3,3,1,4,20,7,2,9,6,15,2,20,1,3,16,4,11,15,6,134,2,5,59,1,2,2,2,1,9,17,3,26,137,10,211,59,1,2,4,1,4,1,1,1,2,6,2,3,1,1,2,3,2,3,1,3,4,4,2,3,3, + 1,4,3,1,7,2,2,3,1,2,1,3,3,3,2,2,3,2,1,3,14,6,1,3,2,9,6,15,27,9,34,145,1,1,2,1,1,1,1,2,1,1,1,1,2,2,2,3,1,2,1,1,1,2,3,5,8,3,5,2,4,1,3,2,2,2,12, + 4,1,1,1,10,4,5,1,20,4,16,1,15,9,5,12,2,9,2,5,4,2,26,19,7,1,26,4,30,12,15,42,1,6,8,172,1,1,4,2,1,1,11,2,2,4,2,1,2,1,10,8,1,2,1,4,5,1,2,5,1,8, + 4,1,3,4,2,1,6,2,1,3,4,1,2,1,1,1,1,12,5,7,2,4,3,1,1,1,3,3,6,1,2,2,3,3,3,2,1,2,12,14,11,6,6,4,12,2,8,1,7,10,1,35,7,4,13,15,4,3,23,21,28,52,5, + 26,5,6,1,7,10,2,7,53,3,2,1,1,1,2,163,532,1,10,11,1,3,3,4,8,2,8,6,2,2,23,22,4,2,2,4,2,1,3,1,3,3,5,9,8,2,1,2,8,1,10,2,12,21,20,15,105,2,3,1,1, + 3,2,3,1,1,2,5,1,4,15,11,19,1,1,1,1,5,4,5,1,1,2,5,3,5,12,1,2,5,1,11,1,1,15,9,1,4,5,3,26,8,2,1,3,1,1,15,19,2,12,1,2,5,2,7,2,19,2,20,6,26,7,5, + 2,2,7,34,21,13,70,2,128,1,1,2,1,1,2,1,1,3,2,2,2,15,1,4,1,3,4,42,10,6,1,49,85,8,1,2,1,1,4,4,2,3,6,1,5,7,4,3,211,4,1,2,1,2,5,1,2,4,2,2,6,5,6, + 10,3,4,48,100,6,2,16,296,5,27,387,2,2,3,7,16,8,5,38,15,39,21,9,10,3,7,59,13,27,21,47,5,21,6 + }; + static ImWchar base_ranges[] = // not zero-terminated + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x2000, 0x206F, // General Punctuation + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD // Invalid + }; + static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00) * 2 + 1] = { 0 }; + if (!full_ranges[0]) + { + memcpy(full_ranges, base_ranges, sizeof(base_ranges)); + UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); + } + return &full_ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesJapanese() +{ + // 2999 ideograms code points for Japanese + // - 2136 Joyo (meaning "for regular use" or "for common use") Kanji code points + // - 863 Jinmeiyo (meaning "for personal name") Kanji code points + // - Sourced from official information provided by the government agencies of Japan: + // - List of Joyo Kanji by the Agency for Cultural Affairs + // - https://www.bunka.go.jp/kokugo_nihongo/sisaku/joho/joho/kijun/naikaku/kanji/ + // - List of Jinmeiyo Kanji by the Ministry of Justice + // - http://www.moj.go.jp/MINJI/minji86.html + // - Available under the terms of the Creative Commons Attribution 4.0 International (CC BY 4.0). + // - https://creativecommons.org/licenses/by/4.0/legalcode + // - You can generate this code by the script at: + // - https://github.com/vaiorabbit/everyday_use_kanji + // - References: + // - List of Joyo Kanji + // - (Wikipedia) https://en.wikipedia.org/wiki/List_of_j%C5%8Dy%C5%8D_kanji + // - List of Jinmeiyo Kanji + // - (Wikipedia) https://en.wikipedia.org/wiki/Jinmeiy%C5%8D_kanji + // - Missing 1 Joyo Kanji: U+20B9F (Kun'yomi: Shikaru, On'yomi: Shitsu,shichi), see https://github.com/ocornut/imgui/pull/3627 for details. + // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters. + // (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.) + static const short accumulative_offsets_from_0x4E00[] = + { + 0,1,2,4,1,1,1,1,2,1,3,3,2,2,1,5,3,5,7,5,6,1,2,1,7,2,6,3,1,8,1,1,4,1,1,18,2,11,2,6,2,1,2,1,5,1,2,1,3,1,2,1,2,3,3,1,1,2,3,1,1,1,12,7,9,1,4,5,1, + 1,2,1,10,1,1,9,2,2,4,5,6,9,3,1,1,1,1,9,3,18,5,2,2,2,2,1,6,3,7,1,1,1,1,2,2,4,2,1,23,2,10,4,3,5,2,4,10,2,4,13,1,6,1,9,3,1,1,6,6,7,6,3,1,2,11,3, + 2,2,3,2,15,2,2,5,4,3,6,4,1,2,5,2,12,16,6,13,9,13,2,1,1,7,16,4,7,1,19,1,5,1,2,2,7,7,8,2,6,5,4,9,18,7,4,5,9,13,11,8,15,2,1,1,1,2,1,2,2,1,2,2,8, + 2,9,3,3,1,1,4,4,1,1,1,4,9,1,4,3,5,5,2,7,5,3,4,8,2,1,13,2,3,3,1,14,1,1,4,5,1,3,6,1,5,2,1,1,3,3,3,3,1,1,2,7,6,6,7,1,4,7,6,1,1,1,1,1,12,3,3,9,5, + 2,6,1,5,6,1,2,3,18,2,4,14,4,1,3,6,1,1,6,3,5,5,3,2,2,2,2,12,3,1,4,2,3,2,3,11,1,7,4,1,2,1,3,17,1,9,1,24,1,1,4,2,2,4,1,2,7,1,1,1,3,1,2,2,4,15,1, + 1,2,1,1,2,1,5,2,5,20,2,5,9,1,10,8,7,6,1,1,1,1,1,1,6,2,1,2,8,1,1,1,1,5,1,1,3,1,1,1,1,3,1,1,12,4,1,3,1,1,1,1,1,10,3,1,7,5,13,1,2,3,4,6,1,1,30, + 2,9,9,1,15,38,11,3,1,8,24,7,1,9,8,10,2,1,9,31,2,13,6,2,9,4,49,5,2,15,2,1,10,2,1,1,1,2,2,6,15,30,35,3,14,18,8,1,16,10,28,12,19,45,38,1,3,2,3, + 13,2,1,7,3,6,5,3,4,3,1,5,7,8,1,5,3,18,5,3,6,1,21,4,24,9,24,40,3,14,3,21,3,2,1,2,4,2,3,1,15,15,6,5,1,1,3,1,5,6,1,9,7,3,3,2,1,4,3,8,21,5,16,4, + 5,2,10,11,11,3,6,3,2,9,3,6,13,1,2,1,1,1,1,11,12,6,6,1,4,2,6,5,2,1,1,3,3,6,13,3,1,1,5,1,2,3,3,14,2,1,2,2,2,5,1,9,5,1,1,6,12,3,12,3,4,13,2,14, + 2,8,1,17,5,1,16,4,2,2,21,8,9,6,23,20,12,25,19,9,38,8,3,21,40,25,33,13,4,3,1,4,1,2,4,1,2,5,26,2,1,1,2,1,3,6,2,1,1,1,1,1,1,2,3,1,1,1,9,2,3,1,1, + 1,3,6,3,2,1,1,6,6,1,8,2,2,2,1,4,1,2,3,2,7,3,2,4,1,2,1,2,2,1,1,1,1,1,3,1,2,5,4,10,9,4,9,1,1,1,1,1,1,5,3,2,1,6,4,9,6,1,10,2,31,17,8,3,7,5,40,1, + 7,7,1,6,5,2,10,7,8,4,15,39,25,6,28,47,18,10,7,1,3,1,1,2,1,1,1,3,3,3,1,1,1,3,4,2,1,4,1,3,6,10,7,8,6,2,2,1,3,3,2,5,8,7,9,12,2,15,1,1,4,1,2,1,1, + 1,3,2,1,3,3,5,6,2,3,2,10,1,4,2,8,1,1,1,11,6,1,21,4,16,3,1,3,1,4,2,3,6,5,1,3,1,1,3,3,4,6,1,1,10,4,2,7,10,4,7,4,2,9,4,3,1,1,1,4,1,8,3,4,1,3,1, + 6,1,4,2,1,4,7,2,1,8,1,4,5,1,1,2,2,4,6,2,7,1,10,1,1,3,4,11,10,8,21,4,6,1,3,5,2,1,2,28,5,5,2,3,13,1,2,3,1,4,2,1,5,20,3,8,11,1,3,3,3,1,8,10,9,2, + 10,9,2,3,1,1,2,4,1,8,3,6,1,7,8,6,11,1,4,29,8,4,3,1,2,7,13,1,4,1,6,2,6,12,12,2,20,3,2,3,6,4,8,9,2,7,34,5,1,18,6,1,1,4,4,5,7,9,1,2,2,4,3,4,1,7, + 2,2,2,6,2,3,25,5,3,6,1,4,6,7,4,2,1,4,2,13,6,4,4,3,1,5,3,4,4,3,2,1,1,4,1,2,1,1,3,1,11,1,6,3,1,7,3,6,2,8,8,6,9,3,4,11,3,2,10,12,2,5,11,1,6,4,5, + 3,1,8,5,4,6,6,3,5,1,1,3,2,1,2,2,6,17,12,1,10,1,6,12,1,6,6,19,9,6,16,1,13,4,4,15,7,17,6,11,9,15,12,6,7,2,1,2,2,15,9,3,21,4,6,49,18,7,3,2,3,1, + 6,8,2,2,6,2,9,1,3,6,4,4,1,2,16,2,5,2,1,6,2,3,5,3,1,2,5,1,2,1,9,3,1,8,6,4,8,11,3,1,1,1,1,3,1,13,8,4,1,3,2,2,1,4,1,11,1,5,2,1,5,2,5,8,6,1,1,7, + 4,3,8,3,2,7,2,1,5,1,5,2,4,7,6,2,8,5,1,11,4,5,3,6,18,1,2,13,3,3,1,21,1,1,4,1,4,1,1,1,8,1,2,2,7,1,2,4,2,2,9,2,1,1,1,4,3,6,3,12,5,1,1,1,5,6,3,2, + 4,8,2,2,4,2,7,1,8,9,5,2,3,2,1,3,2,13,7,14,6,5,1,1,2,1,4,2,23,2,1,1,6,3,1,4,1,15,3,1,7,3,9,14,1,3,1,4,1,1,5,8,1,3,8,3,8,15,11,4,14,4,4,2,5,5, + 1,7,1,6,14,7,7,8,5,15,4,8,6,5,6,2,1,13,1,20,15,11,9,2,5,6,2,11,2,6,2,5,1,5,8,4,13,19,25,4,1,1,11,1,34,2,5,9,14,6,2,2,6,1,1,14,1,3,14,13,1,6, + 12,21,14,14,6,32,17,8,32,9,28,1,2,4,11,8,3,1,14,2,5,15,1,1,1,1,3,6,4,1,3,4,11,3,1,1,11,30,1,5,1,4,1,5,8,1,1,3,2,4,3,17,35,2,6,12,17,3,1,6,2, + 1,1,12,2,7,3,3,2,1,16,2,8,3,6,5,4,7,3,3,8,1,9,8,5,1,2,1,3,2,8,1,2,9,12,1,1,2,3,8,3,24,12,4,3,7,5,8,3,3,3,3,3,3,1,23,10,3,1,2,2,6,3,1,16,1,16, + 22,3,10,4,11,6,9,7,7,3,6,2,2,2,4,10,2,1,1,2,8,7,1,6,4,1,3,3,3,5,10,12,12,2,3,12,8,15,1,1,16,6,6,1,5,9,11,4,11,4,2,6,12,1,17,5,13,1,4,9,5,1,11, + 2,1,8,1,5,7,28,8,3,5,10,2,17,3,38,22,1,2,18,12,10,4,38,18,1,4,44,19,4,1,8,4,1,12,1,4,31,12,1,14,7,75,7,5,10,6,6,13,3,2,11,11,3,2,5,28,15,6,18, + 18,5,6,4,3,16,1,7,18,7,36,3,5,3,1,7,1,9,1,10,7,2,4,2,6,2,9,7,4,3,32,12,3,7,10,2,23,16,3,1,12,3,31,4,11,1,3,8,9,5,1,30,15,6,12,3,2,2,11,19,9, + 14,2,6,2,3,19,13,17,5,3,3,25,3,14,1,1,1,36,1,3,2,19,3,13,36,9,13,31,6,4,16,34,2,5,4,2,3,3,5,1,1,1,4,3,1,17,3,2,3,5,3,1,3,2,3,5,6,3,12,11,1,3, + 1,2,26,7,12,7,2,14,3,3,7,7,11,25,25,28,16,4,36,1,2,1,6,2,1,9,3,27,17,4,3,4,13,4,1,3,2,2,1,10,4,2,4,6,3,8,2,1,18,1,1,24,2,2,4,33,2,3,63,7,1,6, + 40,7,3,4,4,2,4,15,18,1,16,1,1,11,2,41,14,1,3,18,13,3,2,4,16,2,17,7,15,24,7,18,13,44,2,2,3,6,1,1,7,5,1,7,1,4,3,3,5,10,8,2,3,1,8,1,1,27,4,2,1, + 12,1,2,1,10,6,1,6,7,5,2,3,7,11,5,11,3,6,6,2,3,15,4,9,1,1,2,1,2,11,2,8,12,8,5,4,2,3,1,5,2,2,1,14,1,12,11,4,1,11,17,17,4,3,2,5,5,7,3,1,5,9,9,8, + 2,5,6,6,13,13,2,1,2,6,1,2,2,49,4,9,1,2,10,16,7,8,4,3,2,23,4,58,3,29,1,14,19,19,11,11,2,7,5,1,3,4,6,2,18,5,12,12,17,17,3,3,2,4,1,6,2,3,4,3,1, + 1,1,1,5,1,1,9,1,3,1,3,6,1,8,1,1,2,6,4,14,3,1,4,11,4,1,3,32,1,2,4,13,4,1,2,4,2,1,3,1,11,1,4,2,1,4,4,6,3,5,1,6,5,7,6,3,23,3,5,3,5,3,3,13,3,9,10, + 1,12,10,2,3,18,13,7,160,52,4,2,2,3,2,14,5,4,12,4,6,4,1,20,4,11,6,2,12,27,1,4,1,2,2,7,4,5,2,28,3,7,25,8,3,19,3,6,10,2,2,1,10,2,5,4,1,3,4,1,5, + 3,2,6,9,3,6,2,16,3,3,16,4,5,5,3,2,1,2,16,15,8,2,6,21,2,4,1,22,5,8,1,1,21,11,2,1,11,11,19,13,12,4,2,3,2,3,6,1,8,11,1,4,2,9,5,2,1,11,2,9,1,1,2, + 14,31,9,3,4,21,14,4,8,1,7,2,2,2,5,1,4,20,3,3,4,10,1,11,9,8,2,1,4,5,14,12,14,2,17,9,6,31,4,14,1,20,13,26,5,2,7,3,6,13,2,4,2,19,6,2,2,18,9,3,5, + 12,12,14,4,6,2,3,6,9,5,22,4,5,25,6,4,8,5,2,6,27,2,35,2,16,3,7,8,8,6,6,5,9,17,2,20,6,19,2,13,3,1,1,1,4,17,12,2,14,7,1,4,18,12,38,33,2,10,1,1, + 2,13,14,17,11,50,6,33,20,26,74,16,23,45,50,13,38,33,6,6,7,4,4,2,1,3,2,5,8,7,8,9,3,11,21,9,13,1,3,10,6,7,1,2,2,18,5,5,1,9,9,2,68,9,19,13,2,5, + 1,4,4,7,4,13,3,9,10,21,17,3,26,2,1,5,2,4,5,4,1,7,4,7,3,4,2,1,6,1,1,20,4,1,9,2,2,1,3,3,2,3,2,1,1,1,20,2,3,1,6,2,3,6,2,4,8,1,3,2,10,3,5,3,4,4, + 3,4,16,1,6,1,10,2,4,2,1,1,2,10,11,2,2,3,1,24,31,4,10,10,2,5,12,16,164,15,4,16,7,9,15,19,17,1,2,1,1,5,1,1,1,1,1,3,1,4,3,1,3,1,3,1,2,1,1,3,3,7, + 2,8,1,2,2,2,1,3,4,3,7,8,12,92,2,10,3,1,3,14,5,25,16,42,4,7,7,4,2,21,5,27,26,27,21,25,30,31,2,1,5,13,3,22,5,6,6,11,9,12,1,5,9,7,5,5,22,60,3,5, + 13,1,1,8,1,1,3,3,2,1,9,3,3,18,4,1,2,3,7,6,3,1,2,3,9,1,3,1,3,2,1,3,1,1,1,2,1,11,3,1,6,9,1,3,2,3,1,2,1,5,1,1,4,3,4,1,2,2,4,4,1,7,2,1,2,2,3,5,13, + 18,3,4,14,9,9,4,16,3,7,5,8,2,6,48,28,3,1,1,4,2,14,8,2,9,2,1,15,2,4,3,2,10,16,12,8,7,1,1,3,1,1,1,2,7,4,1,6,4,38,39,16,23,7,15,15,3,2,12,7,21, + 37,27,6,5,4,8,2,10,8,8,6,5,1,2,1,3,24,1,16,17,9,23,10,17,6,1,51,55,44,13,294,9,3,6,2,4,2,2,15,1,1,1,13,21,17,68,14,8,9,4,1,4,9,3,11,7,1,1,1, + 5,6,3,2,1,1,1,2,3,8,1,2,2,4,1,5,5,2,1,4,3,7,13,4,1,4,1,3,1,1,1,5,5,10,1,6,1,5,2,1,5,2,4,1,4,5,7,3,18,2,9,11,32,4,3,3,2,4,7,11,16,9,11,8,13,38, + 32,8,4,2,1,1,2,1,2,4,4,1,1,1,4,1,21,3,11,1,16,1,1,6,1,3,2,4,9,8,57,7,44,1,3,3,13,3,10,1,1,7,5,2,7,21,47,63,3,15,4,7,1,16,1,1,2,8,2,3,42,15,4, + 1,29,7,22,10,3,78,16,12,20,18,4,67,11,5,1,3,15,6,21,31,32,27,18,13,71,35,5,142,4,10,1,2,50,19,33,16,35,37,16,19,27,7,1,133,19,1,4,8,7,20,1,4, + 4,1,10,3,1,6,1,2,51,5,40,15,24,43,22928,11,1,13,154,70,3,1,1,7,4,10,1,2,1,1,2,1,2,1,2,2,1,1,2,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1, + 3,2,1,1,1,1,2,1,1, + }; + static ImWchar base_ranges[] = // not zero-terminated + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana + 0x31F0, 0x31FF, // Katakana Phonetic Extensions + 0xFF00, 0xFFEF, // Half-width characters + 0xFFFD, 0xFFFD // Invalid + }; + static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00)*2 + 1] = { 0 }; + if (!full_ranges[0]) + { + memcpy(full_ranges, base_ranges, sizeof(base_ranges)); + UnpackAccumulativeOffsetsIntoRanges(0x4E00, accumulative_offsets_from_0x4E00, IM_ARRAYSIZE(accumulative_offsets_from_0x4E00), full_ranges + IM_ARRAYSIZE(base_ranges)); + } + return &full_ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesCyrillic() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + Latin Supplement + 0x0400, 0x052F, // Cyrillic + Cyrillic Supplement + 0x2DE0, 0x2DFF, // Cyrillic Extended-A + 0xA640, 0xA69F, // Cyrillic Extended-B + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesThai() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + 0x2010, 0x205E, // Punctuations + 0x0E00, 0x0E7F, // Thai + 0, + }; + return &ranges[0]; +} + +const ImWchar* ImFontAtlas::GetGlyphRangesVietnamese() +{ + static const ImWchar ranges[] = + { + 0x0020, 0x00FF, // Basic Latin + 0x0102, 0x0103, + 0x0110, 0x0111, + 0x0128, 0x0129, + 0x0168, 0x0169, + 0x01A0, 0x01A1, + 0x01AF, 0x01B0, + 0x1EA0, 0x1EF9, + 0, + }; + return &ranges[0]; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFontGlyphRangesBuilder +//----------------------------------------------------------------------------- + +void ImFontGlyphRangesBuilder::AddText(const char* text, const char* text_end) +{ + while (text_end ? (text < text_end) : *text) + { + unsigned int c = 0; + int c_len = ImTextCharFromUtf8(&c, text, text_end); + text += c_len; + if (c_len == 0) + break; + AddChar((ImWchar)c); + } +} + +void ImFontGlyphRangesBuilder::AddRanges(const ImWchar* ranges) +{ + for (; ranges[0]; ranges += 2) + for (unsigned int c = ranges[0]; c <= ranges[1] && c <= IM_UNICODE_CODEPOINT_MAX; c++) //-V560 + AddChar((ImWchar)c); +} + +void ImFontGlyphRangesBuilder::BuildRanges(ImVector* out_ranges) +{ + const int max_codepoint = IM_UNICODE_CODEPOINT_MAX; + for (int n = 0; n <= max_codepoint; n++) + if (GetBit(n)) + { + out_ranges->push_back((ImWchar)n); + while (n < max_codepoint && GetBit(n + 1)) + n++; + out_ranges->push_back((ImWchar)n); + } + out_ranges->push_back(0); +} + +//----------------------------------------------------------------------------- +// [SECTION] ImFont +//----------------------------------------------------------------------------- + +ImFont::ImFont() +{ + FontSize = 0.0f; + FallbackAdvanceX = 0.0f; + FallbackChar = (ImWchar)-1; + EllipsisChar = (ImWchar)-1; + EllipsisWidth = EllipsisCharStep = 0.0f; + EllipsisCharCount = 0; + FallbackGlyph = NULL; + ContainerAtlas = NULL; + ConfigData = NULL; + ConfigDataCount = 0; + DirtyLookupTables = false; + Scale = 1.0f; + Ascent = Descent = 0.0f; + MetricsTotalSurface = 0; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); +} + +ImFont::~ImFont() +{ + ClearOutputData(); +} + +void ImFont::ClearOutputData() +{ + FontSize = 0.0f; + FallbackAdvanceX = 0.0f; + Glyphs.clear(); + IndexAdvanceX.clear(); + IndexLookup.clear(); + FallbackGlyph = NULL; + ContainerAtlas = NULL; + DirtyLookupTables = true; + Ascent = Descent = 0.0f; + MetricsTotalSurface = 0; +} + +static ImWchar FindFirstExistingGlyph(ImFont* font, const ImWchar* candidate_chars, int candidate_chars_count) +{ + for (int n = 0; n < candidate_chars_count; n++) + if (font->FindGlyphNoFallback(candidate_chars[n]) != NULL) + return candidate_chars[n]; + return (ImWchar)-1; +} + +void ImFont::BuildLookupTable() +{ + int max_codepoint = 0; + for (int i = 0; i != Glyphs.Size; i++) + max_codepoint = ImMax(max_codepoint, (int)Glyphs[i].Codepoint); + + // Build lookup table + IM_ASSERT(Glyphs.Size < 0xFFFF); // -1 is reserved + IndexAdvanceX.clear(); + IndexLookup.clear(); + DirtyLookupTables = false; + memset(Used4kPagesMap, 0, sizeof(Used4kPagesMap)); + GrowIndex(max_codepoint + 1); + for (int i = 0; i < Glyphs.Size; i++) + { + int codepoint = (int)Glyphs[i].Codepoint; + IndexAdvanceX[codepoint] = Glyphs[i].AdvanceX; + IndexLookup[codepoint] = (ImWchar)i; + + // Mark 4K page as used + const int page_n = codepoint / 4096; + Used4kPagesMap[page_n >> 3] |= 1 << (page_n & 7); + } + + // Create a glyph to handle TAB + // FIXME: Needs proper TAB handling but it needs to be contextualized (or we could arbitrary say that each string starts at "column 0" ?) + if (FindGlyph((ImWchar)' ')) + { + if (Glyphs.back().Codepoint != '\t') // So we can call this function multiple times (FIXME: Flaky) + Glyphs.resize(Glyphs.Size + 1); + ImFontGlyph& tab_glyph = Glyphs.back(); + tab_glyph = *FindGlyph((ImWchar)' '); + tab_glyph.Codepoint = '\t'; + tab_glyph.AdvanceX *= IM_TABSIZE; + IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX; + IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size - 1); + } + + // Mark special glyphs as not visible (note that AddGlyph already mark as non-visible glyphs with zero-size polygons) + SetGlyphVisible((ImWchar)' ', false); + SetGlyphVisible((ImWchar)'\t', false); + + // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis). + // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character. + // FIXME: Note that 0x2026 is rarely included in our font ranges. Because of this we are more likely to use three individual dots. + const ImWchar ellipsis_chars[] = { (ImWchar)0x2026, (ImWchar)0x0085 }; + const ImWchar dots_chars[] = { (ImWchar)'.', (ImWchar)0xFF0E }; + if (EllipsisChar == (ImWchar)-1) + EllipsisChar = FindFirstExistingGlyph(this, ellipsis_chars, IM_ARRAYSIZE(ellipsis_chars)); + const ImWchar dot_char = FindFirstExistingGlyph(this, dots_chars, IM_ARRAYSIZE(dots_chars)); + if (EllipsisChar != (ImWchar)-1) + { + EllipsisCharCount = 1; + EllipsisWidth = EllipsisCharStep = FindGlyph(EllipsisChar)->X1; + } + else if (dot_char != (ImWchar)-1) + { + const ImFontGlyph* glyph = FindGlyph(dot_char); + EllipsisChar = dot_char; + EllipsisCharCount = 3; + EllipsisCharStep = (glyph->X1 - glyph->X0) + 1.0f; + EllipsisWidth = EllipsisCharStep * 3.0f - 1.0f; + } + + // Setup fallback character + const ImWchar fallback_chars[] = { (ImWchar)IM_UNICODE_CODEPOINT_INVALID, (ImWchar)'?', (ImWchar)' ' }; + FallbackGlyph = FindGlyphNoFallback(FallbackChar); + if (FallbackGlyph == NULL) + { + FallbackChar = FindFirstExistingGlyph(this, fallback_chars, IM_ARRAYSIZE(fallback_chars)); + FallbackGlyph = FindGlyphNoFallback(FallbackChar); + if (FallbackGlyph == NULL) + { + FallbackGlyph = &Glyphs.back(); + FallbackChar = (ImWchar)FallbackGlyph->Codepoint; + } + } + + FallbackAdvanceX = FallbackGlyph->AdvanceX; + for (int i = 0; i < max_codepoint + 1; i++) + if (IndexAdvanceX[i] < 0.0f) + IndexAdvanceX[i] = FallbackAdvanceX; +} + +// API is designed this way to avoid exposing the 4K page size +// e.g. use with IsGlyphRangeUnused(0, 255) +bool ImFont::IsGlyphRangeUnused(unsigned int c_begin, unsigned int c_last) +{ + unsigned int page_begin = (c_begin / 4096); + unsigned int page_last = (c_last / 4096); + for (unsigned int page_n = page_begin; page_n <= page_last; page_n++) + if ((page_n >> 3) < sizeof(Used4kPagesMap)) + if (Used4kPagesMap[page_n >> 3] & (1 << (page_n & 7))) + return false; + return true; +} + +void ImFont::SetGlyphVisible(ImWchar c, bool visible) +{ + if (ImFontGlyph* glyph = (ImFontGlyph*)(void*)FindGlyph((ImWchar)c)) + glyph->Visible = visible ? 1 : 0; +} + +void ImFont::GrowIndex(int new_size) +{ + IM_ASSERT(IndexAdvanceX.Size == IndexLookup.Size); + if (new_size <= IndexLookup.Size) + return; + IndexAdvanceX.resize(new_size, -1.0f); + IndexLookup.resize(new_size, (ImWchar)-1); +} + +// x0/y0/x1/y1 are offset from the character upper-left layout position, in pixels. Therefore x0/y0 are often fairly close to zero. +// Not to be mistaken with texture coordinates, which are held by u0/v0/u1/v1 in normalized format (0.0..1.0 on each texture axis). +// 'cfg' is not necessarily == 'this->ConfigData' because multiple source fonts+configs can be used to build one target font. +void ImFont::AddGlyph(const ImFontConfig* cfg, ImWchar codepoint, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x) +{ + if (cfg != NULL) + { + // Clamp & recenter if needed + const float advance_x_original = advance_x; + advance_x = ImClamp(advance_x, cfg->GlyphMinAdvanceX, cfg->GlyphMaxAdvanceX); + if (advance_x != advance_x_original) + { + float char_off_x = cfg->PixelSnapH ? ImFloor((advance_x - advance_x_original) * 0.5f) : (advance_x - advance_x_original) * 0.5f; + x0 += char_off_x; + x1 += char_off_x; + } + + // Snap to pixel + if (cfg->PixelSnapH) + advance_x = IM_ROUND(advance_x); + + // Bake spacing + advance_x += cfg->GlyphExtraSpacing.x; + } + + Glyphs.resize(Glyphs.Size + 1); + ImFontGlyph& glyph = Glyphs.back(); + glyph.Codepoint = (unsigned int)codepoint; + glyph.Visible = (x0 != x1) && (y0 != y1); + glyph.Colored = false; + glyph.X0 = x0; + glyph.Y0 = y0; + glyph.X1 = x1; + glyph.Y1 = y1; + glyph.U0 = u0; + glyph.V0 = v0; + glyph.U1 = u1; + glyph.V1 = v1; + glyph.AdvanceX = advance_x; + + // Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round) + // We use (U1-U0)*TexWidth instead of X1-X0 to account for oversampling. + float pad = ContainerAtlas->TexGlyphPadding + 0.99f; + DirtyLookupTables = true; + MetricsTotalSurface += (int)((glyph.U1 - glyph.U0) * ContainerAtlas->TexWidth + pad) * (int)((glyph.V1 - glyph.V0) * ContainerAtlas->TexHeight + pad); +} + +void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst) +{ + IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function. + unsigned int index_size = (unsigned int)IndexLookup.Size; + + if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists + return; + if (src >= index_size && dst >= index_size) // both 'dst' and 'src' don't exist -> no-op + return; + + GrowIndex(dst + 1); + IndexLookup[dst] = (src < index_size) ? IndexLookup.Data[src] : (ImWchar)-1; + IndexAdvanceX[dst] = (src < index_size) ? IndexAdvanceX.Data[src] : 1.0f; +} + +const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const +{ + if (c >= (size_t)IndexLookup.Size) + return FallbackGlyph; + const ImWchar i = IndexLookup.Data[c]; + if (i == (ImWchar)-1) + return FallbackGlyph; + return &Glyphs.Data[i]; +} + +const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const +{ + if (c >= (size_t)IndexLookup.Size) + return NULL; + const ImWchar i = IndexLookup.Data[c]; + if (i == (ImWchar)-1) + return NULL; + return &Glyphs.Data[i]; +} + +// Wrapping skips upcoming blanks +static inline const char* CalcWordWrapNextLineStartA(const char* text, const char* text_end) +{ + while (text < text_end && ImCharIsBlankA(*text)) + text++; + if (*text == '\n') + text++; + return text; +} + +// Simple word-wrapping for English, not full-featured. Please submit failing cases! +// This will return the next location to wrap from. If no wrapping if necessary, this will fast-forward to e.g. text_end. +// FIXME: Much possible improvements (don't cut things like "word !", "word!!!" but cut within "word,,,,", more sensible support for punctuations, support for Unicode punctuations, etc.) +const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const char* text_end, float wrap_width) const +{ + // For references, possible wrap point marked with ^ + // "aaa bbb, ccc,ddd. eee fff. ggg!" + // ^ ^ ^ ^ ^__ ^ ^ + + // List of hardcoded separators: .,;!?'" + + // Skip extra blanks after a line returns (that includes not counting them in width computation) + // e.g. "Hello world" --> "Hello" "World" + + // Cut words that cannot possibly fit within one line. + // e.g.: "The tropical fish" with ~5 characters worth of width --> "The tr" "opical" "fish" + float line_width = 0.0f; + float word_width = 0.0f; + float blank_width = 0.0f; + wrap_width /= scale; // We work with unscaled widths to avoid scaling every characters + + const char* word_end = text; + const char* prev_word_end = NULL; + bool inside_word = true; + + const char* s = text; + IM_ASSERT(text_end != NULL); + while (s < text_end) + { + unsigned int c = (unsigned int)*s; + const char* next_s; + if (c < 0x80) + next_s = s + 1; + else + next_s = s + ImTextCharFromUtf8(&c, s, text_end); + + if (c < 32) + { + if (c == '\n') + { + line_width = word_width = blank_width = 0.0f; + inside_word = true; + s = next_s; + continue; + } + if (c == '\r') + { + s = next_s; + continue; + } + } + + const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX); + if (ImCharIsBlankW(c)) + { + if (inside_word) + { + line_width += blank_width; + blank_width = 0.0f; + word_end = s; + } + blank_width += char_width; + inside_word = false; + } + else + { + word_width += char_width; + if (inside_word) + { + word_end = next_s; + } + else + { + prev_word_end = word_end; + line_width += word_width + blank_width; + word_width = blank_width = 0.0f; + } + + // Allow wrapping after punctuation. + inside_word = (c != '.' && c != ',' && c != ';' && c != '!' && c != '?' && c != '\"'); + } + + // We ignore blank width at the end of the line (they can be skipped) + if (line_width + word_width > wrap_width) + { + // Words that cannot possibly fit within an entire line will be cut anywhere. + if (word_width < wrap_width) + s = prev_word_end ? prev_word_end : word_end; + break; + } + + s = next_s; + } + + // Wrap_width is too small to fit anything. Force displaying 1 character to minimize the height discontinuity. + // +1 may not be a character start point in UTF-8 but it's ok because caller loops use (text >= word_wrap_eol). + if (s == text && text < text_end) + return s + 1; + return s; +} + +ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, const char* text_begin, const char* text_end, const char** remaining) const +{ + if (!text_end) + text_end = text_begin + strlen(text_begin); // FIXME-OPT: Need to avoid this. + + const float line_height = size; + const float scale = size / FontSize; + + ImVec2 text_size = ImVec2(0, 0); + float line_width = 0.0f; + + const bool word_wrap_enabled = (wrap_width > 0.0f); + const char* word_wrap_eol = NULL; + + const char* s = text_begin; + while (s < text_end) + { + if (word_wrap_enabled) + { + // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. + if (!word_wrap_eol) + word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - line_width); + + if (s >= word_wrap_eol) + { + if (text_size.x < line_width) + text_size.x = line_width; + text_size.y += line_height; + line_width = 0.0f; + word_wrap_eol = NULL; + s = CalcWordWrapNextLineStartA(s, text_end); // Wrapping skips upcoming blanks + continue; + } + } + + // Decode and advance source + const char* prev_s = s; + unsigned int c = (unsigned int)*s; + if (c < 0x80) + s += 1; + else + s += ImTextCharFromUtf8(&c, s, text_end); + + if (c < 32) + { + if (c == '\n') + { + text_size.x = ImMax(text_size.x, line_width); + text_size.y += line_height; + line_width = 0.0f; + continue; + } + if (c == '\r') + continue; + } + + const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale; + if (line_width + char_width >= max_width) + { + s = prev_s; + break; + } + + line_width += char_width; + } + + if (text_size.x < line_width) + text_size.x = line_width; + + if (line_width > 0 || text_size.y == 0.0f) + text_size.y += line_height; + + if (remaining) + *remaining = s; + + return text_size; +} + +// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. +void ImFont::RenderChar(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, ImWchar c) const +{ + const ImFontGlyph* glyph = FindGlyph(c); + if (!glyph || !glyph->Visible) + return; + if (glyph->Colored) + col |= ~IM_COL32_A_MASK; + float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f; + float x = IM_FLOOR(pos.x); + float y = IM_FLOOR(pos.y); + draw_list->PrimReserve(6, 4); + draw_list->PrimRectUV(ImVec2(x + glyph->X0 * scale, y + glyph->Y0 * scale), ImVec2(x + glyph->X1 * scale, y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col); +} + +// Note: as with every ImDrawList drawing function, this expects that the font atlas texture is bound. +void ImFont::RenderText(ImDrawList* draw_list, float size, const ImVec2& pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const +{ + if (!text_end) + text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls. + + // Align to be pixel perfect + float x = IM_FLOOR(pos.x); + float y = IM_FLOOR(pos.y); + if (y > clip_rect.w) + return; + + const float start_x = x; + const float scale = size / FontSize; + const float line_height = FontSize * scale; + const bool word_wrap_enabled = (wrap_width > 0.0f); + + // Fast-forward to first visible line + const char* s = text_begin; + if (y + line_height < clip_rect.y) + while (y + line_height < clip_rect.y && s < text_end) + { + const char* line_end = (const char*)memchr(s, '\n', text_end - s); + if (word_wrap_enabled) + { + // FIXME-OPT: This is not optimal as do first do a search for \n before calling CalcWordWrapPositionA(). + // If the specs for CalcWordWrapPositionA() were reworked to optionally return on \n we could combine both. + // However it is still better than nothing performing the fast-forward! + s = CalcWordWrapPositionA(scale, s, line_end ? line_end : text_end, wrap_width); + s = CalcWordWrapNextLineStartA(s, text_end); + } + else + { + s = line_end ? line_end + 1 : text_end; + } + y += line_height; + } + + // For large text, scan for the last visible line in order to avoid over-reserving in the call to PrimReserve() + // Note that very large horizontal line will still be affected by the issue (e.g. a one megabyte string buffer without a newline will likely crash atm) + if (text_end - s > 10000 && !word_wrap_enabled) + { + const char* s_end = s; + float y_end = y; + while (y_end < clip_rect.w && s_end < text_end) + { + s_end = (const char*)memchr(s_end, '\n', text_end - s_end); + s_end = s_end ? s_end + 1 : text_end; + y_end += line_height; + } + text_end = s_end; + } + if (s == text_end) + return; + + // Reserve vertices for remaining worse case (over-reserving is useful and easily amortized) + const int vtx_count_max = (int)(text_end - s) * 4; + const int idx_count_max = (int)(text_end - s) * 6; + const int idx_expected_size = draw_list->IdxBuffer.Size + idx_count_max; + draw_list->PrimReserve(idx_count_max, vtx_count_max); + ImDrawVert* vtx_write = draw_list->_VtxWritePtr; + ImDrawIdx* idx_write = draw_list->_IdxWritePtr; + unsigned int vtx_index = draw_list->_VtxCurrentIdx; + + const ImU32 col_untinted = col | ~IM_COL32_A_MASK; + const char* word_wrap_eol = NULL; + + while (s < text_end) + { + if (word_wrap_enabled) + { + // Calculate how far we can render. Requires two passes on the string data but keeps the code simple and not intrusive for what's essentially an uncommon feature. + if (!word_wrap_eol) + word_wrap_eol = CalcWordWrapPositionA(scale, s, text_end, wrap_width - (x - start_x)); + + if (s >= word_wrap_eol) + { + x = start_x; + y += line_height; + word_wrap_eol = NULL; + s = CalcWordWrapNextLineStartA(s, text_end); // Wrapping skips upcoming blanks + continue; + } + } + + // Decode and advance source + unsigned int c = (unsigned int)*s; + if (c < 0x80) + s += 1; + else + s += ImTextCharFromUtf8(&c, s, text_end); + + if (c < 32) + { + if (c == '\n') + { + x = start_x; + y += line_height; + if (y > clip_rect.w) + break; // break out of main loop + continue; + } + if (c == '\r') + continue; + } + + const ImFontGlyph* glyph = FindGlyph((ImWchar)c); + if (glyph == NULL) + continue; + + float char_width = glyph->AdvanceX * scale; + if (glyph->Visible) + { + // We don't do a second finer clipping test on the Y axis as we've already skipped anything before clip_rect.y and exit once we pass clip_rect.w + float x1 = x + glyph->X0 * scale; + float x2 = x + glyph->X1 * scale; + float y1 = y + glyph->Y0 * scale; + float y2 = y + glyph->Y1 * scale; + if (x1 <= clip_rect.z && x2 >= clip_rect.x) + { + // Render a character + float u1 = glyph->U0; + float v1 = glyph->V0; + float u2 = glyph->U1; + float v2 = glyph->V1; + + // CPU side clipping used to fit text in their frame when the frame is too small. Only does clipping for axis aligned quads. + if (cpu_fine_clip) + { + if (x1 < clip_rect.x) + { + u1 = u1 + (1.0f - (x2 - clip_rect.x) / (x2 - x1)) * (u2 - u1); + x1 = clip_rect.x; + } + if (y1 < clip_rect.y) + { + v1 = v1 + (1.0f - (y2 - clip_rect.y) / (y2 - y1)) * (v2 - v1); + y1 = clip_rect.y; + } + if (x2 > clip_rect.z) + { + u2 = u1 + ((clip_rect.z - x1) / (x2 - x1)) * (u2 - u1); + x2 = clip_rect.z; + } + if (y2 > clip_rect.w) + { + v2 = v1 + ((clip_rect.w - y1) / (y2 - y1)) * (v2 - v1); + y2 = clip_rect.w; + } + if (y1 >= y2) + { + x += char_width; + continue; + } + } + + // Support for untinted glyphs + ImU32 glyph_col = glyph->Colored ? col_untinted : col; + + // We are NOT calling PrimRectUV() here because non-inlined causes too much overhead in a debug builds. Inlined here: + { + vtx_write[0].pos.x = x1; vtx_write[0].pos.y = y1; vtx_write[0].col = glyph_col; vtx_write[0].uv.x = u1; vtx_write[0].uv.y = v1; + vtx_write[1].pos.x = x2; vtx_write[1].pos.y = y1; vtx_write[1].col = glyph_col; vtx_write[1].uv.x = u2; vtx_write[1].uv.y = v1; + vtx_write[2].pos.x = x2; vtx_write[2].pos.y = y2; vtx_write[2].col = glyph_col; vtx_write[2].uv.x = u2; vtx_write[2].uv.y = v2; + vtx_write[3].pos.x = x1; vtx_write[3].pos.y = y2; vtx_write[3].col = glyph_col; vtx_write[3].uv.x = u1; vtx_write[3].uv.y = v2; + idx_write[0] = (ImDrawIdx)(vtx_index); idx_write[1] = (ImDrawIdx)(vtx_index + 1); idx_write[2] = (ImDrawIdx)(vtx_index + 2); + idx_write[3] = (ImDrawIdx)(vtx_index); idx_write[4] = (ImDrawIdx)(vtx_index + 2); idx_write[5] = (ImDrawIdx)(vtx_index + 3); + vtx_write += 4; + vtx_index += 4; + idx_write += 6; + } + } + } + x += char_width; + } + + // Give back unused vertices (clipped ones, blanks) ~ this is essentially a PrimUnreserve() action. + draw_list->VtxBuffer.Size = (int)(vtx_write - draw_list->VtxBuffer.Data); // Same as calling shrink() + draw_list->IdxBuffer.Size = (int)(idx_write - draw_list->IdxBuffer.Data); + draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size); + draw_list->_VtxWritePtr = vtx_write; + draw_list->_IdxWritePtr = idx_write; + draw_list->_VtxCurrentIdx = vtx_index; +} + +//----------------------------------------------------------------------------- +// [SECTION] ImGui Internal Render Helpers +//----------------------------------------------------------------------------- +// Vaguely redesigned to stop accessing ImGui global state: +// - RenderArrow() +// - RenderBullet() +// - RenderCheckMark() +// - RenderArrowPointingAt() +// - RenderRectFilledRangeH() +// - RenderRectFilledWithHole() +//----------------------------------------------------------------------------- +// Function in need of a redesign (legacy mess) +// - RenderColorRectWithAlphaCheckerboard() +//----------------------------------------------------------------------------- + +// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state +void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale) +{ + const float h = draw_list->_Data->FontSize * 1.00f; + float r = h * 0.40f * scale; + ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale); + + ImVec2 a, b, c; + switch (dir) + { + case ImGuiDir_Up: + case ImGuiDir_Down: + if (dir == ImGuiDir_Up) r = -r; + a = ImVec2(+0.000f, +0.750f) * r; + b = ImVec2(-0.866f, -0.750f) * r; + c = ImVec2(+0.866f, -0.750f) * r; + break; + case ImGuiDir_Left: + case ImGuiDir_Right: + if (dir == ImGuiDir_Left) r = -r; + a = ImVec2(+0.750f, +0.000f) * r; + b = ImVec2(-0.750f, +0.866f) * r; + c = ImVec2(-0.750f, -0.866f) * r; + break; + case ImGuiDir_None: + case ImGuiDir_COUNT: + IM_ASSERT(0); + break; + } + draw_list->AddTriangleFilled(center + a, center + b, center + c, col); +} + +void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col) +{ + draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8); +} + +void ImGui::RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz) +{ + float thickness = ImMax(sz / 5.0f, 1.0f); + sz -= thickness * 0.5f; + pos += ImVec2(thickness * 0.25f, thickness * 0.25f); + + float third = sz / 3.0f; + float bx = pos.x + third; + float by = pos.y + sz - third * 0.5f; + draw_list->PathLineTo(ImVec2(bx - third, by - third)); + draw_list->PathLineTo(ImVec2(bx, by)); + draw_list->PathLineTo(ImVec2(bx + third * 2.0f, by - third * 2.0f)); + draw_list->PathStroke(col, 0, thickness); +} + +// Render an arrow. 'pos' is position of the arrow tip. half_sz.x is length from base to tip. half_sz.y is length on each side. +void ImGui::RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col) +{ + switch (direction) + { + case ImGuiDir_Left: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), pos, col); return; + case ImGuiDir_Right: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), pos, col); return; + case ImGuiDir_Up: draw_list->AddTriangleFilled(ImVec2(pos.x + half_sz.x, pos.y + half_sz.y), ImVec2(pos.x - half_sz.x, pos.y + half_sz.y), pos, col); return; + case ImGuiDir_Down: draw_list->AddTriangleFilled(ImVec2(pos.x - half_sz.x, pos.y - half_sz.y), ImVec2(pos.x + half_sz.x, pos.y - half_sz.y), pos, col); return; + case ImGuiDir_None: case ImGuiDir_COUNT: break; // Fix warnings + } +} + +static inline float ImAcos01(float x) +{ + if (x <= 0.0f) return IM_PI * 0.5f; + if (x >= 1.0f) return 0.0f; + return ImAcos(x); + //return (-0.69813170079773212f * x * x - 0.87266462599716477f) * x + 1.5707963267948966f; // Cheap approximation, may be enough for what we do. +} + +// FIXME: Cleanup and move code to ImDrawList. +void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding) +{ + if (x_end_norm == x_start_norm) + return; + if (x_start_norm > x_end_norm) + ImSwap(x_start_norm, x_end_norm); + + ImVec2 p0 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_start_norm), rect.Min.y); + ImVec2 p1 = ImVec2(ImLerp(rect.Min.x, rect.Max.x, x_end_norm), rect.Max.y); + if (rounding == 0.0f) + { + draw_list->AddRectFilled(p0, p1, col, 0.0f); + return; + } + + rounding = ImClamp(ImMin((rect.Max.x - rect.Min.x) * 0.5f, (rect.Max.y - rect.Min.y) * 0.5f) - 1.0f, 0.0f, rounding); + const float inv_rounding = 1.0f / rounding; + const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding); + const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding); + const float half_pi = IM_PI * 0.5f; // We will == compare to this because we know this is the exact value ImAcos01 can return. + const float x0 = ImMax(p0.x, rect.Min.x + rounding); + if (arc0_b == arc0_e) + { + draw_list->PathLineTo(ImVec2(x0, p1.y)); + draw_list->PathLineTo(ImVec2(x0, p0.y)); + } + else if (arc0_b == 0.0f && arc0_e == half_pi) + { + draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL + draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR + } + else + { + draw_list->PathArcTo(ImVec2(x0, p1.y - rounding), rounding, IM_PI - arc0_e, IM_PI - arc0_b, 3); // BL + draw_list->PathArcTo(ImVec2(x0, p0.y + rounding), rounding, IM_PI + arc0_b, IM_PI + arc0_e, 3); // TR + } + if (p1.x > rect.Min.x + rounding) + { + const float arc1_b = ImAcos01(1.0f - (rect.Max.x - p1.x) * inv_rounding); + const float arc1_e = ImAcos01(1.0f - (rect.Max.x - p0.x) * inv_rounding); + const float x1 = ImMin(p1.x, rect.Max.x - rounding); + if (arc1_b == arc1_e) + { + draw_list->PathLineTo(ImVec2(x1, p0.y)); + draw_list->PathLineTo(ImVec2(x1, p1.y)); + } + else if (arc1_b == 0.0f && arc1_e == half_pi) + { + draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR + draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3); // BR + } + else + { + draw_list->PathArcTo(ImVec2(x1, p0.y + rounding), rounding, -arc1_e, -arc1_b, 3); // TR + draw_list->PathArcTo(ImVec2(x1, p1.y - rounding), rounding, +arc1_b, +arc1_e, 3); // BR + } + } + draw_list->PathFillConvex(col); +} + +void ImGui::RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding) +{ + const bool fill_L = (inner.Min.x > outer.Min.x); + const bool fill_R = (inner.Max.x < outer.Max.x); + const bool fill_U = (inner.Min.y > outer.Min.y); + const bool fill_D = (inner.Max.y < outer.Max.y); + if (fill_L) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Min.y), ImVec2(inner.Min.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomLeft)); + if (fill_R) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Min.y), ImVec2(outer.Max.x, inner.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_U ? 0 : ImDrawFlags_RoundCornersTopRight) | (fill_D ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_U) draw_list->AddRectFilled(ImVec2(inner.Min.x, outer.Min.y), ImVec2(inner.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersTopLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersTopRight)); + if (fill_D) draw_list->AddRectFilled(ImVec2(inner.Min.x, inner.Max.y), ImVec2(inner.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersNone | (fill_L ? 0 : ImDrawFlags_RoundCornersBottomLeft) | (fill_R ? 0 : ImDrawFlags_RoundCornersBottomRight)); + if (fill_L && fill_U) draw_list->AddRectFilled(ImVec2(outer.Min.x, outer.Min.y), ImVec2(inner.Min.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopLeft); + if (fill_R && fill_U) draw_list->AddRectFilled(ImVec2(inner.Max.x, outer.Min.y), ImVec2(outer.Max.x, inner.Min.y), col, rounding, ImDrawFlags_RoundCornersTopRight); + if (fill_L && fill_D) draw_list->AddRectFilled(ImVec2(outer.Min.x, inner.Max.y), ImVec2(inner.Min.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomLeft); + if (fill_R && fill_D) draw_list->AddRectFilled(ImVec2(inner.Max.x, inner.Max.y), ImVec2(outer.Max.x, outer.Max.y), col, rounding, ImDrawFlags_RoundCornersBottomRight); +} + +// Helper for ColorPicker4() +// NB: This is rather brittle and will show artifact when rounding this enabled if rounded corners overlap multiple cells. Caller currently responsible for avoiding that. +// Spent a non reasonable amount of time trying to getting this right for ColorButton with rounding+anti-aliasing+ImGuiColorEditFlags_HalfAlphaPreview flag + various grid sizes and offsets, and eventually gave up... probably more reasonable to disable rounding altogether. +// FIXME: uses ImGui::GetColorU32 +void ImGui::RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 col, float grid_step, ImVec2 grid_off, float rounding, ImDrawFlags flags) +{ + if ((flags & ImDrawFlags_RoundCornersMask_) == 0) + flags = ImDrawFlags_RoundCornersDefault_; + if (((col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT) < 0xFF) + { + ImU32 col_bg1 = GetColorU32(ImAlphaBlendColors(IM_COL32(204, 204, 204, 255), col)); + ImU32 col_bg2 = GetColorU32(ImAlphaBlendColors(IM_COL32(128, 128, 128, 255), col)); + draw_list->AddRectFilled(p_min, p_max, col_bg1, rounding, flags); + + int yi = 0; + for (float y = p_min.y + grid_off.y; y < p_max.y; y += grid_step, yi++) + { + float y1 = ImClamp(y, p_min.y, p_max.y), y2 = ImMin(y + grid_step, p_max.y); + if (y2 <= y1) + continue; + for (float x = p_min.x + grid_off.x + (yi & 1) * grid_step; x < p_max.x; x += grid_step * 2.0f) + { + float x1 = ImClamp(x, p_min.x, p_max.x), x2 = ImMin(x + grid_step, p_max.x); + if (x2 <= x1) + continue; + ImDrawFlags cell_flags = ImDrawFlags_RoundCornersNone; + if (y1 <= p_min.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersTopLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersTopRight; } + if (y2 >= p_max.y) { if (x1 <= p_min.x) cell_flags |= ImDrawFlags_RoundCornersBottomLeft; if (x2 >= p_max.x) cell_flags |= ImDrawFlags_RoundCornersBottomRight; } + + // Combine flags + cell_flags = (flags == ImDrawFlags_RoundCornersNone || cell_flags == ImDrawFlags_RoundCornersNone) ? ImDrawFlags_RoundCornersNone : (cell_flags & flags); + draw_list->AddRectFilled(ImVec2(x1, y1), ImVec2(x2, y2), col_bg2, rounding, cell_flags); + } + } + } + else + { + draw_list->AddRectFilled(p_min, p_max, col, rounding, flags); + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Decompression code +//----------------------------------------------------------------------------- +// Compressed with stb_compress() then converted to a C array and encoded as base85. +// Use the program in misc/fonts/binary_to_compressed_c.cpp to create the array from a TTF file. +// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. +// Decompression from stb.h (public domain) by Sean Barrett https://github.com/nothings/stb/blob/master/stb.h +//----------------------------------------------------------------------------- + +static unsigned int stb_decompress_length(const unsigned char *input) +{ + return (input[8] << 24) + (input[9] << 16) + (input[10] << 8) + input[11]; +} + +static unsigned char *stb__barrier_out_e, *stb__barrier_out_b; +static const unsigned char *stb__barrier_in_b; +static unsigned char *stb__dout; +static void stb__match(const unsigned char *data, unsigned int length) +{ + // INVERSE of memmove... write each byte before copying the next... + IM_ASSERT(stb__dout + length <= stb__barrier_out_e); + if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } + if (data < stb__barrier_out_b) { stb__dout = stb__barrier_out_e+1; return; } + while (length--) *stb__dout++ = *data++; +} + +static void stb__lit(const unsigned char *data, unsigned int length) +{ + IM_ASSERT(stb__dout + length <= stb__barrier_out_e); + if (stb__dout + length > stb__barrier_out_e) { stb__dout += length; return; } + if (data < stb__barrier_in_b) { stb__dout = stb__barrier_out_e+1; return; } + memcpy(stb__dout, data, length); + stb__dout += length; +} + +#define stb__in2(x) ((i[x] << 8) + i[(x)+1]) +#define stb__in3(x) ((i[x] << 16) + stb__in2((x)+1)) +#define stb__in4(x) ((i[x] << 24) + stb__in3((x)+1)) + +static const unsigned char *stb_decompress_token(const unsigned char *i) +{ + if (*i >= 0x20) { // use fewer if's for cases that expand small + if (*i >= 0x80) stb__match(stb__dout-i[1]-1, i[0] - 0x80 + 1), i += 2; + else if (*i >= 0x40) stb__match(stb__dout-(stb__in2(0) - 0x4000 + 1), i[2]+1), i += 3; + else /* *i >= 0x20 */ stb__lit(i+1, i[0] - 0x20 + 1), i += 1 + (i[0] - 0x20 + 1); + } else { // more ifs for cases that expand large, since overhead is amortized + if (*i >= 0x18) stb__match(stb__dout-(stb__in3(0) - 0x180000 + 1), i[3]+1), i += 4; + else if (*i >= 0x10) stb__match(stb__dout-(stb__in3(0) - 0x100000 + 1), stb__in2(3)+1), i += 5; + else if (*i >= 0x08) stb__lit(i+2, stb__in2(0) - 0x0800 + 1), i += 2 + (stb__in2(0) - 0x0800 + 1); + else if (*i == 0x07) stb__lit(i+3, stb__in2(1) + 1), i += 3 + (stb__in2(1) + 1); + else if (*i == 0x06) stb__match(stb__dout-(stb__in3(1)+1), i[4]+1), i += 5; + else if (*i == 0x04) stb__match(stb__dout-(stb__in3(1)+1), stb__in2(4)+1), i += 6; + } + return i; +} + +static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, unsigned int buflen) +{ + const unsigned long ADLER_MOD = 65521; + unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16; + unsigned long blocklen = buflen % 5552; + + unsigned long i; + while (buflen) { + for (i=0; i + 7 < blocklen; i += 8) { + s1 += buffer[0], s2 += s1; + s1 += buffer[1], s2 += s1; + s1 += buffer[2], s2 += s1; + s1 += buffer[3], s2 += s1; + s1 += buffer[4], s2 += s1; + s1 += buffer[5], s2 += s1; + s1 += buffer[6], s2 += s1; + s1 += buffer[7], s2 += s1; + + buffer += 8; + } + + for (; i < blocklen; ++i) + s1 += *buffer++, s2 += s1; + + s1 %= ADLER_MOD, s2 %= ADLER_MOD; + buflen -= blocklen; + blocklen = 5552; + } + return (unsigned int)(s2 << 16) + (unsigned int)s1; +} + +static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/) +{ + if (stb__in4(0) != 0x57bC0000) return 0; + if (stb__in4(4) != 0) return 0; // error! stream is > 4GB + const unsigned int olen = stb_decompress_length(i); + stb__barrier_in_b = i; + stb__barrier_out_e = output + olen; + stb__barrier_out_b = output; + i += 16; + + stb__dout = output; + for (;;) { + const unsigned char *old_i = i; + i = stb_decompress_token(i); + if (i == old_i) { + if (*i == 0x05 && i[1] == 0xfa) { + IM_ASSERT(stb__dout == output + olen); + if (stb__dout != output + olen) return 0; + if (stb_adler32(1, output, olen) != (unsigned int) stb__in4(2)) + return 0; + return olen; + } else { + IM_ASSERT(0); /* NOTREACHED */ + return 0; + } + } + IM_ASSERT(stb__dout <= output + olen); + if (stb__dout > output + olen) + return 0; + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Default font data (ProggyClean.ttf) +//----------------------------------------------------------------------------- +// ProggyClean.ttf +// Copyright (c) 2004, 2005 Tristan Grimmer +// MIT license (see License.txt in http://www.upperbounds.net/download/ProggyClean.ttf.zip) +// Download and more information at http://upperbounds.net +//----------------------------------------------------------------------------- +// File: 'ProggyClean.ttf' (41208 bytes) +// Exported using misc/fonts/binary_to_compressed_c.cpp (with compression + base85 string encoding). +// The purpose of encoding as base85 instead of "0x00,0x01,..." style is only save on _source code_ size. +//----------------------------------------------------------------------------- +static const char proggy_clean_ttf_compressed_data_base85[11980 + 1] = + "7])#######hV0qs'/###[),##/l:$#Q6>##5[n42>c-TH`->>#/e>11NNV=Bv(*:.F?uu#(gRU.o0XGH`$vhLG1hxt9?W`#,5LsCp#-i>.r$<$6pD>Lb';9Crc6tgXmKVeU2cD4Eo3R/" + "2*>]b(MC;$jPfY.;h^`IWM9Qo#t'X#(v#Y9w0#1D$CIf;W'#pWUPXOuxXuU(H9M(1=Ke$$'5F%)]0^#0X@U.a$FBjVQTSDgEKnIS7EM9>ZY9w0#L;>>#Mx&4Mvt//L[MkA#W@lK.N'[0#7RL_&#w+F%HtG9M#XL`N&.,GM4Pg;--VsM.M0rJfLH2eTM`*oJMHRC`N" + "kfimM2J,W-jXS:)r0wK#@Fge$U>`w'N7G#$#fB#$E^$#:9:hk+eOe--6x)F7*E%?76%^GMHePW-Z5l'&GiF#$956:rS?dA#fiK:)Yr+`�j@'DbG&#^$PG.Ll+DNa&VZ>1i%h1S9u5o@YaaW$e+bROPOpxTO7Stwi1::iB1q)C_=dV26J;2,]7op$]uQr@_V7$q^%lQwtuHY]=DX,n3L#0PHDO4f9>dC@O>HBuKPpP*E,N+b3L#lpR/MrTEH.IAQk.a>D[.e;mc." + "x]Ip.PH^'/aqUO/$1WxLoW0[iLAw=4h(9.`G" + "CRUxHPeR`5Mjol(dUWxZa(>STrPkrJiWx`5U7F#.g*jrohGg`cg:lSTvEY/EV_7H4Q9[Z%cnv;JQYZ5q.l7Zeas:HOIZOB?Ggv:[7MI2k).'2($5FNP&EQ(,)" + "U]W]+fh18.vsai00);D3@4ku5P?DP8aJt+;qUM]=+b'8@;mViBKx0DE[-auGl8:PJ&Dj+M6OC]O^((##]`0i)drT;-7X`=-H3[igUnPG-NZlo.#k@h#=Ork$m>a>$-?Tm$UV(?#P6YY#" + "'/###xe7q.73rI3*pP/$1>s9)W,JrM7SN]'/4C#v$U`0#V.[0>xQsH$fEmPMgY2u7Kh(G%siIfLSoS+MK2eTM$=5,M8p`A.;_R%#u[K#$x4AG8.kK/HSB==-'Ie/QTtG?-.*^N-4B/ZM" + "_3YlQC7(p7q)&](`6_c)$/*JL(L-^(]$wIM`dPtOdGA,U3:w2M-0+WomX2u7lqM2iEumMTcsF?-aT=Z-97UEnXglEn1K-bnEO`gu" + "Ft(c%=;Am_Qs@jLooI&NX;]0#j4#F14;gl8-GQpgwhrq8'=l_f-b49'UOqkLu7-##oDY2L(te+Mch&gLYtJ,MEtJfLh'x'M=$CS-ZZ%P]8bZ>#S?YY#%Q&q'3^Fw&?D)UDNrocM3A76/" + "/oL?#h7gl85[qW/NDOk%16ij;+:1a'iNIdb-ou8.P*w,v5#EI$TWS>Pot-R*H'-SEpA:g)f+O$%%`kA#G=8RMmG1&O`>to8bC]T&$,n.LoO>29sp3dt-52U%VM#q7'DHpg+#Z9%H[Ket`e;)f#Km8&+DC$I46>#Kr]]u-[=99tts1.qb#q72g1WJO81q+eN'03'eM>&1XxY-caEnO" + "j%2n8)),?ILR5^.Ibn<-X-Mq7[a82Lq:F&#ce+S9wsCK*x`569E8ew'He]h:sI[2LM$[guka3ZRd6:t%IG:;$%YiJ:Nq=?eAw;/:nnDq0(CYcMpG)qLN4$##&J-XTt,%OVU4)S1+R-#dg0/Nn?Ku1^0f$B*P:Rowwm-`0PKjYDDM'3]d39VZHEl4,.j']Pk-M.h^&:0FACm$maq-&sgw0t7/6(^xtk%" + "LuH88Fj-ekm>GA#_>568x6(OFRl-IZp`&b,_P'$MhLbxfc$mj`,O;&%W2m`Zh:/)Uetw:aJ%]K9h:TcF]u_-Sj9,VK3M.*'&0D[Ca]J9gp8,kAW]" + "%(?A%R$f<->Zts'^kn=-^@c4%-pY6qI%J%1IGxfLU9CP8cbPlXv);C=b),<2mOvP8up,UVf3839acAWAW-W?#ao/^#%KYo8fRULNd2.>%m]UK:n%r$'sw]J;5pAoO_#2mO3n,'=H5(et" + "Hg*`+RLgv>=4U8guD$I%D:W>-r5V*%j*W:Kvej.Lp$'?;++O'>()jLR-^u68PHm8ZFWe+ej8h:9r6L*0//c&iH&R8pRbA#Kjm%upV1g:" + "a_#Ur7FuA#(tRh#.Y5K+@?3<-8m0$PEn;J:rh6?I6uG<-`wMU'ircp0LaE_OtlMb&1#6T.#FDKu#1Lw%u%+GM+X'e?YLfjM[VO0MbuFp7;>Q&#WIo)0@F%q7c#4XAXN-U&VBpqB>0ie&jhZ[?iLR@@_AvA-iQC(=ksRZRVp7`.=+NpBC%rh&3]R:8XDmE5^V8O(x<-+k?'(^](H.aREZSi,#1:[IXaZFOm<-ui#qUq2$##Ri;u75OK#(RtaW-K-F`S+cF]uN`-KMQ%rP/Xri.LRcB##=YL3BgM/3M" + "D?@f&1'BW-)Ju#bmmWCMkk&#TR`C,5d>g)F;t,4:@_l8G/5h4vUd%&%950:VXD'QdWoY-F$BtUwmfe$YqL'8(PWX(" + "P?^@Po3$##`MSs?DWBZ/S>+4%>fX,VWv/w'KD`LP5IbH;rTV>n3cEK8U#bX]l-/V+^lj3;vlMb&[5YQ8#pekX9JP3XUC72L,,?+Ni&co7ApnO*5NK,((W-i:$,kp'UDAO(G0Sq7MVjJs" + "bIu)'Z,*[>br5fX^:FPAWr-m2KgLQ_nN6'8uTGT5g)uLv:873UpTLgH+#FgpH'_o1780Ph8KmxQJ8#H72L4@768@Tm&Q" + "h4CB/5OvmA&,Q&QbUoi$a_%3M01H)4x7I^&KQVgtFnV+;[Pc>[m4k//,]1?#`VY[Jr*3&&slRfLiVZJ:]?=K3Sw=[$=uRB?3xk48@aege0jT6'N#(q%.O=?2S]u*(m<-" + "V8J'(1)G][68hW$5'q[GC&5j`TE?m'esFGNRM)j,ffZ?-qx8;->g4t*:CIP/[Qap7/9'#(1sao7w-.qNUdkJ)tCF&#B^;xGvn2r9FEPFFFcL@.iFNkTve$m%#QvQS8U@)2Z+3K:AKM5i" + "sZ88+dKQ)W6>J%CL`.d*(B`-n8D9oK-XV1q['-5k'cAZ69e;D_?$ZPP&s^+7])$*$#@QYi9,5P r+$%CE=68>K8r0=dSC%%(@p7" + ".m7jilQ02'0-VWAgTlGW'b)Tq7VT9q^*^$$.:&N@@" + "$&)WHtPm*5_rO0&e%K&#-30j(E4#'Zb.o/(Tpm$>K'f@[PvFl,hfINTNU6u'0pao7%XUp9]5.>%h`8_=VYbxuel.NTSsJfLacFu3B'lQSu/m6-Oqem8T+oE--$0a/k]uj9EwsG>%veR*" + "hv^BFpQj:K'#SJ,sB-'#](j.Lg92rTw-*n%@/;39rrJF,l#qV%OrtBeC6/,;qB3ebNW[?,Hqj2L.1NP&GjUR=1D8QaS3Up&@*9wP?+lo7b?@%'k4`p0Z$22%K3+iCZj?XJN4Nm&+YF]u" + "@-W$U%VEQ/,,>>#)D#%8cY#YZ?=,`Wdxu/ae&#" + "w6)R89tI#6@s'(6Bf7a&?S=^ZI_kS&ai`&=tE72L_D,;^R)7[$so8lKN%5/$(vdfq7+ebA#" + "u1p]ovUKW&Y%q]'>$1@-[xfn$7ZTp7mM,G,Ko7a&Gu%G[RMxJs[0MM%wci.LFDK)(%:_i2B5CsR8&9Z&#=mPEnm0f`<&c)QL5uJ#%u%lJj+D-r;BoFDoS97h5g)E#o:&S4weDF,9^Hoe`h*L+_a*NrLW-1pG_&2UdB8" + "6e%B/:=>)N4xeW.*wft-;$'58-ESqr#U`'6AQ]m&6/`Z>#S?YY#Vc;r7U2&326d=w&H####?TZ`*4?&.MK?LP8Vxg>$[QXc%QJv92.(Db*B)gb*BM9dM*hJMAo*c&#" + "b0v=Pjer]$gG&JXDf->'StvU7505l9$AFvgYRI^&<^b68?j#q9QX4SM'RO#&sL1IM.rJfLUAj221]d##DW=m83u5;'bYx,*Sl0hL(W;;$doB&O/TQ:(Z^xBdLjLV#*8U_72Lh+2Q8Cj0i:6hp&$C/:p(HK>T8Y[gHQ4`4)'$Ab(Nof%V'8hL&#SfD07&6D@M.*J:;$-rv29'M]8qMv-tLp,'886iaC=Hb*YJoKJ,(j%K=H`K.v9HggqBIiZu'QvBT.#=)0ukruV&.)3=(^1`o*Pj4<-#MJ+gLq9-##@HuZPN0]u:h7.T..G:;$/Usj(T7`Q8tT72LnYl<-qx8;-HV7Q-&Xdx%1a,hC=0u+HlsV>nuIQL-5" + "_>@kXQtMacfD.m-VAb8;IReM3$wf0''hra*so568'Ip&vRs849'MRYSp%:t:h5qSgwpEr$B>Q,;s(C#$)`svQuF$##-D,##,g68@2[T;.XSdN9Qe)rpt._K-#5wF)sP'##p#C0c%-Gb%" + "hd+<-j'Ai*x&&HMkT]C'OSl##5RG[JXaHN;d'uA#x._U;.`PU@(Z3dt4r152@:v,'R.Sj'w#0<-;kPI)FfJ&#AYJ&#//)>-k=m=*XnK$>=)72L]0I%>.G690a:$##<,);?;72#?x9+d;" + "^V'9;jY@;)br#q^YQpx:X#Te$Z^'=-=bGhLf:D6&bNwZ9-ZD#n^9HhLMr5G;']d&6'wYmTFmLq9wI>P(9mI[>kC-ekLC/R&CH+s'B;K-M6$EB%is00:" + "+A4[7xks.LrNk0&E)wILYF@2L'0Nb$+pv<(2.768/FrY&h$^3i&@+G%JT'<-,v`3;_)I9M^AE]CN?Cl2AZg+%4iTpT3$U4O]GKx'm9)b@p7YsvK3w^YR-" + "CdQ*:Ir<($u&)#(&?L9Rg3H)4fiEp^iI9O8KnTj,]H?D*r7'M;PwZ9K0E^k&-cpI;.p/6_vwoFMV<->#%Xi.LxVnrU(4&8/P+:hLSKj$#U%]49t'I:rgMi'FL@a:0Y-uA[39',(vbma*" + "hU%<-SRF`Tt:542R_VV$p@[p8DV[A,?1839FWdFTi1O*H&#(AL8[_P%.M>v^-))qOT*F5Cq0`Ye%+$B6i:7@0IXSsDiWP,##P`%/L-" + "S(qw%sf/@%#B6;/U7K]uZbi^Oc^2n%t<)'mEVE''n`WnJra$^TKvX5B>;_aSEK',(hwa0:i4G?.Bci.(X[?b*($,=-n<.Q%`(X=?+@Am*Js0&=3bh8K]mL69=Lb,OcZV/);TTm8VI;?%OtJ<(b4mq7M6:u?KRdFl*:xP?Yb.5)%w_I?7uk5JC+FS(m#i'k.'a0i)9<7b'fs'59hq$*5Uhv##pi^8+hIEBF`nvo`;'l0.^S1<-wUK2/Coh58KKhLj" + "M=SO*rfO`+qC`W-On.=AJ56>>i2@2LH6A:&5q`?9I3@@'04&p2/LVa*T-4<-i3;M9UvZd+N7>b*eIwg:CC)c<>nO&#$(>.Z-I&J(Q0Hd5Q%7Co-b`-cP)hI;*_F]u`Rb[.j8_Q/<&>uu+VsH$sM9TA%?)(vmJ80),P7E>)tjD%2L=-t#fK[%`v=Q8WlA2);Sa" + ">gXm8YB`1d@K#n]76-a$U,mF%Ul:#/'xoFM9QX-$.QN'>" + "[%$Z$uF6pA6Ki2O5:8w*vP1<-1`[G,)-m#>0`P&#eb#.3i)rtB61(o'$?X3B2Qft^ae_5tKL9MUe9b*sLEQ95C&`=G?@Mj=wh*'3E>=-<)Gt*Iw)'QG:`@I" + "wOf7&]1i'S01B+Ev/Nac#9S;=;YQpg_6U`*kVY39xK,[/6Aj7:'1Bm-_1EYfa1+o&o4hp7KN_Q(OlIo@S%;jVdn0'1h19w,WQhLI)3S#f$2(eb,jr*b;3Vw]*7NH%$c4Vs,eD9>XW8?N]o+(*pgC%/72LV-uW%iewS8W6m2rtCpo'RS1R84=@paTKt)>=%&1[)*vp'u+x,VrwN;&]kuO9JDbg=pO$J*.jVe;u'm0dr9l,<*wMK*Oe=g8lV_KEBFkO'oU]^=[-792#ok,)" + "i]lR8qQ2oA8wcRCZ^7w/Njh;?.stX?Q1>S1q4Bn$)K1<-rGdO'$Wr.Lc.CG)$/*JL4tNR/,SVO3,aUw'DJN:)Ss;wGn9A32ijw%FL+Z0Fn.U9;reSq)bmI32U==5ALuG&#Vf1398/pVo" + "1*c-(aY168o<`JsSbk-,1N;$>0:OUas(3:8Z972LSfF8eb=c-;>SPw7.6hn3m`9^Xkn(r.qS[0;T%&Qc=+STRxX'q1BNk3&*eu2;&8q$&x>Q#Q7^Tf+6<(d%ZVmj2bDi%.3L2n+4W'$P" + "iDDG)g,r%+?,$@?uou5tSe2aN_AQU*'IAO" + "URQ##V^Fv-XFbGM7Fl(N<3DhLGF%q.1rC$#:T__&Pi68%0xi_&[qFJ(77j_&JWoF.V735&T,[R*:xFR*K5>>#`bW-?4Ne_&6Ne_&6Ne_&n`kr-#GJcM6X;uM6X;uM(.a..^2TkL%oR(#" + ";u.T%fAr%4tJ8&><1=GHZ_+m9/#H1F^R#SC#*N=BA9(D?v[UiFY>>^8p,KKF.W]L29uLkLlu/+4T" + "w$)F./^n3+rlo+DB;5sIYGNk+i1t-69Jg--0pao7Sm#K)pdHW&;LuDNH@H>#/X-TI(;P>#,Gc>#0Su>#4`1?#8lC?#xL$#B.`$#F:r$#JF.%#NR@%#R_R%#Vke%#Zww%#_-4^Rh%Sflr-k'MS.o?.5/sWel/wpEM0%3'/1)K^f1-d>G21&v(35>V`39V7A4=onx4" + "A1OY5EI0;6Ibgr6M$HS7Q<)58C5w,;WoA*#[%T*#`1g*#d=#+#hI5+#lUG+#pbY+#tnl+#x$),#&1;,#*=M,#.I`,#2Ur,#6b.-#;w[H#iQtA#m^0B#qjBB#uvTB##-hB#'9$C#+E6C#" + "/QHC#3^ZC#7jmC#;v)D#?,)4kMYD4lVu`4m`:&5niUA5@(A5BA1]PBB:xlBCC=2CDLXMCEUtiCf&0g2'tN?PGT4CPGT4CPGT4CPGT4CPGT4CPGT4CPGT4CP" + "GT4CPGT4CPGT4CPGT4CPGT4CPGT4CP-qekC`.9kEg^+F$kwViFJTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5KTB&5o,^<-28ZI'O?;xp" + "O?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xpO?;xp;7q-#lLYI:xvD=#"; + +static const char* GetDefaultCompressedFontDataTTFBase85() +{ + return proggy_clean_ttf_compressed_data_base85; +} + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui_impl_dx11.cpp b/ImGui/imgui_impl_dx11.cpp new file mode 100644 index 0000000..43fe814 --- /dev/null +++ b/ImGui/imgui_impl_dx11.cpp @@ -0,0 +1,596 @@ +// dear imgui: Renderer Backend for DirectX11 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-05-19: DirectX11: Replaced direct access to ImDrawCmd::TextureId with a call to ImDrawCmd::GetTexID(). (will become a requirement) +// 2021-02-18: DirectX11: Change blending equation to preserve alpha in output buffer. +// 2019-08-01: DirectX11: Fixed code querying the Geometry Shader state (would generally error with Debug layer enabled). +// 2019-07-21: DirectX11: Backup, clear and restore Geometry Shader is any is bound when calling ImGui_ImplDX10_RenderDrawData. Clearing Hull/Domain/Compute shaders without backup/restore. +// 2019-05-29: DirectX11: Added support for large mesh (64K+ vertices), enable ImGuiBackendFlags_RendererHasVtxOffset flag. +// 2019-04-30: DirectX11: Added support for special ImDrawCallback_ResetRenderState callback to reset render state. +// 2018-12-03: Misc: Added #pragma comment statement to automatically link with d3dcompiler.lib when using D3DCompile(). +// 2018-11-30: Misc: Setting up io.BackendRendererName so it can be displayed in the About Window. +// 2018-08-01: DirectX11: Querying for IDXGIFactory instead of IDXGIFactory1 to increase compatibility. +// 2018-07-13: DirectX11: Fixed unreleased resources in Init and Shutdown functions. +// 2018-06-08: Misc: Extracted imgui_impl_dx11.cpp/.h away from the old combined DX11+Win32 example. +// 2018-06-08: DirectX11: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle. +// 2018-02-16: Misc: Obsoleted the io.RenderDrawListsFn callback and exposed ImGui_ImplDX11_RenderDrawData() in the .h file so you can call it yourself. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2016-05-07: DirectX11: Disabling depth-write. + +#include "imgui.h" +#include "imgui_impl_dx11.h" + +// DirectX +#include +#include +#include +#ifdef _MSC_VER +#pragma comment(lib, "d3dcompiler") // Automatically link with d3dcompiler.lib as we are using D3DCompile() below. +#endif + +// DirectX11 data +struct ImGui_ImplDX11_Data +{ + ID3D11Device* pd3dDevice; + ID3D11DeviceContext* pd3dDeviceContext; + IDXGIFactory* pFactory; + ID3D11Buffer* pVB; + ID3D11Buffer* pIB; + ID3D11VertexShader* pVertexShader; + ID3D11InputLayout* pInputLayout; + ID3D11Buffer* pVertexConstantBuffer; + ID3D11PixelShader* pPixelShader; + ID3D11SamplerState* pFontSampler; + ID3D11ShaderResourceView* pFontTextureView; + ID3D11RasterizerState* pRasterizerState; + ID3D11BlendState* pBlendState; + ID3D11DepthStencilState* pDepthStencilState; + int VertexBufferSize; + int IndexBufferSize; + + ImGui_ImplDX11_Data() { memset((void*)this, 0, sizeof(*this)); VertexBufferSize = 5000; IndexBufferSize = 10000; } +}; + +struct VERTEX_CONSTANT_BUFFER_DX11 +{ + float mvp[4][4]; +}; + +// Backend data stored in io.BackendRendererUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +static ImGui_ImplDX11_Data* ImGui_ImplDX11_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplDX11_Data*)ImGui::GetIO().BackendRendererUserData : nullptr; +} + +// Functions +static void ImGui_ImplDX11_SetupRenderState(ImDrawData* draw_data, ID3D11DeviceContext* ctx) +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + + // Setup viewport + D3D11_VIEWPORT vp; + memset(&vp, 0, sizeof(D3D11_VIEWPORT)); + vp.Width = draw_data->DisplaySize.x; + vp.Height = draw_data->DisplaySize.y; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = vp.TopLeftY = 0; + ctx->RSSetViewports(1, &vp); + + // Setup shader and vertex buffers + unsigned int stride = sizeof(ImDrawVert); + unsigned int offset = 0; + ctx->IASetInputLayout(bd->pInputLayout); + ctx->IASetVertexBuffers(0, 1, &bd->pVB, &stride, &offset); + ctx->IASetIndexBuffer(bd->pIB, sizeof(ImDrawIdx) == 2 ? DXGI_FORMAT_R16_UINT : DXGI_FORMAT_R32_UINT, 0); + ctx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ctx->VSSetShader(bd->pVertexShader, nullptr, 0); + ctx->VSSetConstantBuffers(0, 1, &bd->pVertexConstantBuffer); + ctx->PSSetShader(bd->pPixelShader, nullptr, 0); + ctx->PSSetSamplers(0, 1, &bd->pFontSampler); + ctx->GSSetShader(nullptr, nullptr, 0); + ctx->HSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + ctx->DSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + ctx->CSSetShader(nullptr, nullptr, 0); // In theory we should backup and restore this as well.. very infrequently used.. + + // Setup blend state + const float blend_factor[4] = { 0.f, 0.f, 0.f, 0.f }; + ctx->OMSetBlendState(bd->pBlendState, blend_factor, 0xffffffff); + ctx->OMSetDepthStencilState(bd->pDepthStencilState, 0); + ctx->RSSetState(bd->pRasterizerState); +} + +// Render function +void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data) +{ + // Avoid rendering when minimized + if (draw_data->DisplaySize.x <= 0.0f || draw_data->DisplaySize.y <= 0.0f) + return; + + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + ID3D11DeviceContext* ctx = bd->pd3dDeviceContext; + + // Create and grow vertex/index buffers if needed + if (!bd->pVB || bd->VertexBufferSize < draw_data->TotalVtxCount) + { + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + bd->VertexBufferSize = draw_data->TotalVtxCount + 5000; + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = bd->VertexBufferSize * sizeof(ImDrawVert); + desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVB) < 0) + return; + } + if (!bd->pIB || bd->IndexBufferSize < draw_data->TotalIdxCount) + { + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + bd->IndexBufferSize = draw_data->TotalIdxCount + 10000; + D3D11_BUFFER_DESC desc; + memset(&desc, 0, sizeof(D3D11_BUFFER_DESC)); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.ByteWidth = bd->IndexBufferSize * sizeof(ImDrawIdx); + desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + if (bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pIB) < 0) + return; + } + + // Upload vertex/index data into a single contiguous GPU buffer + D3D11_MAPPED_SUBRESOURCE vtx_resource, idx_resource; + if (ctx->Map(bd->pVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &vtx_resource) != S_OK) + return; + if (ctx->Map(bd->pIB, 0, D3D11_MAP_WRITE_DISCARD, 0, &idx_resource) != S_OK) + return; + ImDrawVert* vtx_dst = (ImDrawVert*)vtx_resource.pData; + ImDrawIdx* idx_dst = (ImDrawIdx*)idx_resource.pData; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + memcpy(vtx_dst, cmd_list->VtxBuffer.Data, cmd_list->VtxBuffer.Size * sizeof(ImDrawVert)); + memcpy(idx_dst, cmd_list->IdxBuffer.Data, cmd_list->IdxBuffer.Size * sizeof(ImDrawIdx)); + vtx_dst += cmd_list->VtxBuffer.Size; + idx_dst += cmd_list->IdxBuffer.Size; + } + ctx->Unmap(bd->pVB, 0); + ctx->Unmap(bd->pIB, 0); + + // Setup orthographic projection matrix into our constant buffer + // Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps. + { + D3D11_MAPPED_SUBRESOURCE mapped_resource; + if (ctx->Map(bd->pVertexConstantBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped_resource) != S_OK) + return; + VERTEX_CONSTANT_BUFFER_DX11* constant_buffer = (VERTEX_CONSTANT_BUFFER_DX11*)mapped_resource.pData; + float L = draw_data->DisplayPos.x; + float R = draw_data->DisplayPos.x + draw_data->DisplaySize.x; + float T = draw_data->DisplayPos.y; + float B = draw_data->DisplayPos.y + draw_data->DisplaySize.y; + float mvp[4][4] = + { + { 2.0f/(R-L), 0.0f, 0.0f, 0.0f }, + { 0.0f, 2.0f/(T-B), 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.5f, 0.0f }, + { (R+L)/(L-R), (T+B)/(B-T), 0.5f, 1.0f }, + }; + memcpy(&constant_buffer->mvp, mvp, sizeof(mvp)); + ctx->Unmap(bd->pVertexConstantBuffer, 0); + } + + // Backup DX state that will be modified to restore it afterwards (unfortunately this is very ugly looking and verbose. Close your eyes!) + struct BACKUP_DX11_STATE + { + UINT ScissorRectsCount, ViewportsCount; + D3D11_RECT ScissorRects[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + D3D11_VIEWPORT Viewports[D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE]; + ID3D11RasterizerState* RS; + ID3D11BlendState* BlendState; + FLOAT BlendFactor[4]; + UINT SampleMask; + UINT StencilRef; + ID3D11DepthStencilState* DepthStencilState; + ID3D11ShaderResourceView* PSShaderResource; + ID3D11SamplerState* PSSampler; + ID3D11PixelShader* PS; + ID3D11VertexShader* VS; + ID3D11GeometryShader* GS; + UINT PSInstancesCount, VSInstancesCount, GSInstancesCount; + ID3D11ClassInstance *PSInstances[256], *VSInstances[256], *GSInstances[256]; // 256 is max according to PSSetShader documentation + D3D11_PRIMITIVE_TOPOLOGY PrimitiveTopology; + ID3D11Buffer* IndexBuffer, *VertexBuffer, *VSConstantBuffer; + UINT IndexBufferOffset, VertexBufferStride, VertexBufferOffset; + DXGI_FORMAT IndexBufferFormat; + ID3D11InputLayout* InputLayout; + }; + BACKUP_DX11_STATE old = {}; + old.ScissorRectsCount = old.ViewportsCount = D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE; + ctx->RSGetScissorRects(&old.ScissorRectsCount, old.ScissorRects); + ctx->RSGetViewports(&old.ViewportsCount, old.Viewports); + ctx->RSGetState(&old.RS); + ctx->OMGetBlendState(&old.BlendState, old.BlendFactor, &old.SampleMask); + ctx->OMGetDepthStencilState(&old.DepthStencilState, &old.StencilRef); + ctx->PSGetShaderResources(0, 1, &old.PSShaderResource); + ctx->PSGetSamplers(0, 1, &old.PSSampler); + old.PSInstancesCount = old.VSInstancesCount = old.GSInstancesCount = 256; + ctx->PSGetShader(&old.PS, old.PSInstances, &old.PSInstancesCount); + ctx->VSGetShader(&old.VS, old.VSInstances, &old.VSInstancesCount); + ctx->VSGetConstantBuffers(0, 1, &old.VSConstantBuffer); + ctx->GSGetShader(&old.GS, old.GSInstances, &old.GSInstancesCount); + + ctx->IAGetPrimitiveTopology(&old.PrimitiveTopology); + ctx->IAGetIndexBuffer(&old.IndexBuffer, &old.IndexBufferFormat, &old.IndexBufferOffset); + ctx->IAGetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); + ctx->IAGetInputLayout(&old.InputLayout); + + // Setup desired DX state + ImGui_ImplDX11_SetupRenderState(draw_data, ctx); + + // Render command lists + // (Because we merged all buffers into a single one, we maintain our own offset into them) + int global_idx_offset = 0; + int global_vtx_offset = 0; + ImVec2 clip_off = draw_data->DisplayPos; + for (int n = 0; n < draw_data->CmdListsCount; n++) + { + const ImDrawList* cmd_list = draw_data->CmdLists[n]; + for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++) + { + const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i]; + if (pcmd->UserCallback != nullptr) + { + // User callback, registered via ImDrawList::AddCallback() + // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) + if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) + ImGui_ImplDX11_SetupRenderState(draw_data, ctx); + else + pcmd->UserCallback(cmd_list, pcmd); + } + else + { + // Project scissor/clipping rectangles into framebuffer space + ImVec2 clip_min(pcmd->ClipRect.x - clip_off.x, pcmd->ClipRect.y - clip_off.y); + ImVec2 clip_max(pcmd->ClipRect.z - clip_off.x, pcmd->ClipRect.w - clip_off.y); + if (clip_max.x <= clip_min.x || clip_max.y <= clip_min.y) + continue; + + // Apply scissor/clipping rectangle + const D3D11_RECT r = { (LONG)clip_min.x, (LONG)clip_min.y, (LONG)clip_max.x, (LONG)clip_max.y }; + ctx->RSSetScissorRects(1, &r); + + // Bind texture, Draw + ID3D11ShaderResourceView* texture_srv = (ID3D11ShaderResourceView*)pcmd->GetTexID(); + ctx->PSSetShaderResources(0, 1, &texture_srv); + ctx->DrawIndexed(pcmd->ElemCount, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset); + } + } + global_idx_offset += cmd_list->IdxBuffer.Size; + global_vtx_offset += cmd_list->VtxBuffer.Size; + } + + // Restore modified DX state + ctx->RSSetScissorRects(old.ScissorRectsCount, old.ScissorRects); + ctx->RSSetViewports(old.ViewportsCount, old.Viewports); + ctx->RSSetState(old.RS); if (old.RS) old.RS->Release(); + ctx->OMSetBlendState(old.BlendState, old.BlendFactor, old.SampleMask); if (old.BlendState) old.BlendState->Release(); + ctx->OMSetDepthStencilState(old.DepthStencilState, old.StencilRef); if (old.DepthStencilState) old.DepthStencilState->Release(); + ctx->PSSetShaderResources(0, 1, &old.PSShaderResource); if (old.PSShaderResource) old.PSShaderResource->Release(); + ctx->PSSetSamplers(0, 1, &old.PSSampler); if (old.PSSampler) old.PSSampler->Release(); + ctx->PSSetShader(old.PS, old.PSInstances, old.PSInstancesCount); if (old.PS) old.PS->Release(); + for (UINT i = 0; i < old.PSInstancesCount; i++) if (old.PSInstances[i]) old.PSInstances[i]->Release(); + ctx->VSSetShader(old.VS, old.VSInstances, old.VSInstancesCount); if (old.VS) old.VS->Release(); + ctx->VSSetConstantBuffers(0, 1, &old.VSConstantBuffer); if (old.VSConstantBuffer) old.VSConstantBuffer->Release(); + ctx->GSSetShader(old.GS, old.GSInstances, old.GSInstancesCount); if (old.GS) old.GS->Release(); + for (UINT i = 0; i < old.VSInstancesCount; i++) if (old.VSInstances[i]) old.VSInstances[i]->Release(); + ctx->IASetPrimitiveTopology(old.PrimitiveTopology); + ctx->IASetIndexBuffer(old.IndexBuffer, old.IndexBufferFormat, old.IndexBufferOffset); if (old.IndexBuffer) old.IndexBuffer->Release(); + ctx->IASetVertexBuffers(0, 1, &old.VertexBuffer, &old.VertexBufferStride, &old.VertexBufferOffset); if (old.VertexBuffer) old.VertexBuffer->Release(); + ctx->IASetInputLayout(old.InputLayout); if (old.InputLayout) old.InputLayout->Release(); +} + +static void ImGui_ImplDX11_CreateFontsTexture() +{ + // Build texture atlas + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + unsigned char* pixels; + int width, height; + io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + + // Upload texture to graphics system + { + D3D11_TEXTURE2D_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Width = width; + desc.Height = height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + + ID3D11Texture2D* pTexture = nullptr; + D3D11_SUBRESOURCE_DATA subResource; + subResource.pSysMem = pixels; + subResource.SysMemPitch = desc.Width * 4; + subResource.SysMemSlicePitch = 0; + bd->pd3dDevice->CreateTexture2D(&desc, &subResource, &pTexture); + IM_ASSERT(pTexture != nullptr); + + // Create texture view + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; + ZeroMemory(&srvDesc, sizeof(srvDesc)); + srvDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srvDesc.Texture2D.MipLevels = desc.MipLevels; + srvDesc.Texture2D.MostDetailedMip = 0; + bd->pd3dDevice->CreateShaderResourceView(pTexture, &srvDesc, &bd->pFontTextureView); + pTexture->Release(); + } + + // Store our identifier + io.Fonts->SetTexID((ImTextureID)bd->pFontTextureView); + + // Create texture sampler + // (Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling) + { + D3D11_SAMPLER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; + desc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + desc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + desc.MipLODBias = 0.f; + desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS; + desc.MinLOD = 0.f; + desc.MaxLOD = 0.f; + bd->pd3dDevice->CreateSamplerState(&desc, &bd->pFontSampler); + } +} + +bool ImGui_ImplDX11_CreateDeviceObjects() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + if (!bd->pd3dDevice) + return false; + if (bd->pFontSampler) + ImGui_ImplDX11_InvalidateDeviceObjects(); + + // By using D3DCompile() from / d3dcompiler.lib, we introduce a dependency to a given version of d3dcompiler_XX.dll (see D3DCOMPILER_DLL_A) + // If you would like to use this DX11 sample code but remove this dependency you can: + // 1) compile once, save the compiled shader blobs into a file or source code and pass them to CreateVertexShader()/CreatePixelShader() [preferred solution] + // 2) use code to detect any version of the DLL and grab a pointer to D3DCompile from the DLL. + // See https://github.com/ocornut/imgui/pull/638 for sources and details. + + // Create the vertex shader + { + static const char* vertexShader = + "cbuffer vertexBuffer : register(b0) \ + {\ + float4x4 ProjectionMatrix; \ + };\ + struct VS_INPUT\ + {\ + float2 pos : POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + \ + PS_INPUT main(VS_INPUT input)\ + {\ + PS_INPUT output;\ + output.pos = mul( ProjectionMatrix, float4(input.pos.xy, 0.f, 1.f));\ + output.col = input.col;\ + output.uv = input.uv;\ + return output;\ + }"; + + ID3DBlob* vertexShaderBlob; + if (FAILED(D3DCompile(vertexShader, strlen(vertexShader), nullptr, nullptr, nullptr, "main", "vs_4_0", 0, 0, &vertexShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreateVertexShader(vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), nullptr, &bd->pVertexShader) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + + // Create the input layout + D3D11_INPUT_ELEMENT_DESC local_layout[] = + { + { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, pos), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, (UINT)IM_OFFSETOF(ImDrawVert, uv), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + { "COLOR", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, (UINT)IM_OFFSETOF(ImDrawVert, col), D3D11_INPUT_PER_VERTEX_DATA, 0 }, + }; + if (bd->pd3dDevice->CreateInputLayout(local_layout, 3, vertexShaderBlob->GetBufferPointer(), vertexShaderBlob->GetBufferSize(), &bd->pInputLayout) != S_OK) + { + vertexShaderBlob->Release(); + return false; + } + vertexShaderBlob->Release(); + + // Create the constant buffer + { + D3D11_BUFFER_DESC desc; + desc.ByteWidth = sizeof(VERTEX_CONSTANT_BUFFER_DX11); + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.MiscFlags = 0; + bd->pd3dDevice->CreateBuffer(&desc, nullptr, &bd->pVertexConstantBuffer); + } + } + + // Create the pixel shader + { + static const char* pixelShader = + "struct PS_INPUT\ + {\ + float4 pos : SV_POSITION;\ + float4 col : COLOR0;\ + float2 uv : TEXCOORD0;\ + };\ + sampler sampler0;\ + Texture2D texture0;\ + \ + float4 main(PS_INPUT input) : SV_Target\ + {\ + float4 out_col = input.col * texture0.Sample(sampler0, input.uv); \ + return out_col; \ + }"; + + ID3DBlob* pixelShaderBlob; + if (FAILED(D3DCompile(pixelShader, strlen(pixelShader), nullptr, nullptr, nullptr, "main", "ps_4_0", 0, 0, &pixelShaderBlob, nullptr))) + return false; // NB: Pass ID3DBlob* pErrorBlob to D3DCompile() to get error showing in (const char*)pErrorBlob->GetBufferPointer(). Make sure to Release() the blob! + if (bd->pd3dDevice->CreatePixelShader(pixelShaderBlob->GetBufferPointer(), pixelShaderBlob->GetBufferSize(), nullptr, &bd->pPixelShader) != S_OK) + { + pixelShaderBlob->Release(); + return false; + } + pixelShaderBlob->Release(); + } + + // Create the blending setup + { + D3D11_BLEND_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.AlphaToCoverageEnable = false; + desc.RenderTarget[0].BlendEnable = true; + desc.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; + desc.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; + desc.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA; + desc.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; + desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; + bd->pd3dDevice->CreateBlendState(&desc, &bd->pBlendState); + } + + // Create the rasterizer state + { + D3D11_RASTERIZER_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.FillMode = D3D11_FILL_SOLID; + desc.CullMode = D3D11_CULL_NONE; + desc.ScissorEnable = true; + desc.DepthClipEnable = true; + bd->pd3dDevice->CreateRasterizerState(&desc, &bd->pRasterizerState); + } + + // Create depth-stencil State + { + D3D11_DEPTH_STENCIL_DESC desc; + ZeroMemory(&desc, sizeof(desc)); + desc.DepthEnable = false; + desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; + desc.DepthFunc = D3D11_COMPARISON_ALWAYS; + desc.StencilEnable = false; + desc.FrontFace.StencilFailOp = desc.FrontFace.StencilDepthFailOp = desc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP; + desc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS; + desc.BackFace = desc.FrontFace; + bd->pd3dDevice->CreateDepthStencilState(&desc, &bd->pDepthStencilState); + } + + ImGui_ImplDX11_CreateFontsTexture(); + + return true; +} + +void ImGui_ImplDX11_InvalidateDeviceObjects() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + if (!bd->pd3dDevice) + return; + + if (bd->pFontSampler) { bd->pFontSampler->Release(); bd->pFontSampler = nullptr; } + if (bd->pFontTextureView) { bd->pFontTextureView->Release(); bd->pFontTextureView = nullptr; ImGui::GetIO().Fonts->SetTexID(0); } // We copied data->pFontTextureView to io.Fonts->TexID so let's clear that as well. + if (bd->pIB) { bd->pIB->Release(); bd->pIB = nullptr; } + if (bd->pVB) { bd->pVB->Release(); bd->pVB = nullptr; } + if (bd->pBlendState) { bd->pBlendState->Release(); bd->pBlendState = nullptr; } + if (bd->pDepthStencilState) { bd->pDepthStencilState->Release(); bd->pDepthStencilState = nullptr; } + if (bd->pRasterizerState) { bd->pRasterizerState->Release(); bd->pRasterizerState = nullptr; } + if (bd->pPixelShader) { bd->pPixelShader->Release(); bd->pPixelShader = nullptr; } + if (bd->pVertexConstantBuffer) { bd->pVertexConstantBuffer->Release(); bd->pVertexConstantBuffer = nullptr; } + if (bd->pInputLayout) { bd->pInputLayout->Release(); bd->pInputLayout = nullptr; } + if (bd->pVertexShader) { bd->pVertexShader->Release(); bd->pVertexShader = nullptr; } +} + +bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendRendererUserData == nullptr && "Already initialized a renderer backend!"); + + // Setup backend capabilities flags + ImGui_ImplDX11_Data* bd = IM_NEW(ImGui_ImplDX11_Data)(); + io.BackendRendererUserData = (void*)bd; + io.BackendRendererName = "imgui_impl_dx11"; + io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. + + // Get factory from device + IDXGIDevice* pDXGIDevice = nullptr; + IDXGIAdapter* pDXGIAdapter = nullptr; + IDXGIFactory* pFactory = nullptr; + + if (device->QueryInterface(IID_PPV_ARGS(&pDXGIDevice)) == S_OK) + if (pDXGIDevice->GetParent(IID_PPV_ARGS(&pDXGIAdapter)) == S_OK) + if (pDXGIAdapter->GetParent(IID_PPV_ARGS(&pFactory)) == S_OK) + { + bd->pd3dDevice = device; + bd->pd3dDeviceContext = device_context; + bd->pFactory = pFactory; + } + if (pDXGIDevice) pDXGIDevice->Release(); + if (pDXGIAdapter) pDXGIAdapter->Release(); + bd->pd3dDevice->AddRef(); + bd->pd3dDeviceContext->AddRef(); + + return true; +} + +void ImGui_ImplDX11_Shutdown() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + IM_ASSERT(bd != nullptr && "No renderer backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + ImGui_ImplDX11_InvalidateDeviceObjects(); + if (bd->pFactory) { bd->pFactory->Release(); } + if (bd->pd3dDevice) { bd->pd3dDevice->Release(); } + if (bd->pd3dDeviceContext) { bd->pd3dDeviceContext->Release(); } + io.BackendRendererName = nullptr; + io.BackendRendererUserData = nullptr; + IM_DELETE(bd); +} + +void ImGui_ImplDX11_NewFrame() +{ + ImGui_ImplDX11_Data* bd = ImGui_ImplDX11_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplDX11_Init()?"); + + if (!bd->pFontSampler) + ImGui_ImplDX11_CreateDeviceObjects(); +} diff --git a/ImGui/imgui_impl_dx11.h b/ImGui/imgui_impl_dx11.h new file mode 100644 index 0000000..f12d718 --- /dev/null +++ b/ImGui/imgui_impl_dx11.h @@ -0,0 +1,26 @@ +// dear imgui: Renderer Backend for DirectX11 +// This needs to be used along with a Platform Backend (e.g. Win32) + +// Implemented features: +// [X] Renderer: User texture binding. Use 'ID3D11ShaderResourceView*' as ImTextureID. Read the FAQ about ImTextureID! +// [X] Renderer: Large meshes support (64k+ vertices) with 16-bit indices. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct ID3D11Device; +struct ID3D11DeviceContext; + +IMGUI_IMPL_API bool ImGui_ImplDX11_Init(ID3D11Device* device, ID3D11DeviceContext* device_context); +IMGUI_IMPL_API void ImGui_ImplDX11_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplDX11_NewFrame(); +IMGUI_IMPL_API void ImGui_ImplDX11_RenderDrawData(ImDrawData* draw_data); + +// Use if you want to reset your rendering device without losing Dear ImGui state. +IMGUI_IMPL_API void ImGui_ImplDX11_InvalidateDeviceObjects(); +IMGUI_IMPL_API bool ImGui_ImplDX11_CreateDeviceObjects(); diff --git a/ImGui/imgui_impl_sdl2.cpp b/ImGui/imgui_impl_sdl2.cpp new file mode 100644 index 0000000..86be801 --- /dev/null +++ b/ImGui/imgui_impl_sdl2.cpp @@ -0,0 +1,634 @@ +// dear imgui: Platform Backend for SDL2 +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) +// (Prefer SDL 2.0.5+ for full feature support.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +// CHANGELOG +// (minor and older changes stripped away, please see git history for details) +// 2023-02-23: Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. (#6189, #6114, #3644) +// 2023-02-07: Implement IME handler (io.SetPlatformImeDataFn will call SDL_SetTextInputRect()/SDL_StartTextInput()). +// 2023-02-07: *BREAKING CHANGE* Renamed this backend file from imgui_impl_sdl.cpp/.h to imgui_impl_sdl2.cpp/.h in prevision for the future release of SDL3. +// 2023-02-02: Avoid calling SDL_SetCursor() when cursor has not changed, as the function is surprisingly costly on Mac with latest SDL (may be fixed in next SDL version). +// 2023-02-02: Added support for SDL 2.0.18+ preciseX/preciseY mouse wheel data for smooth scrolling + Scaling X value on Emscripten (bug?). (#4019, #6096) +// 2023-02-02: Removed SDL_MOUSEWHEEL value clamping, as values seem correct in latest Emscripten. (#4019) +// 2023-02-01: Flipping SDL_MOUSEWHEEL 'wheel.x' value to match other backends and offer consistent horizontal scrolling direction. (#4019, #6096, #1463) +// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11. +// 2022-09-26: Inputs: Disable SDL 2.0.22 new "auto capture" (SDL_HINT_MOUSE_AUTO_CAPTURE) which prevents drag and drop across windows for multi-viewport support + don't capture when drag and dropping. (#5710) +// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported). +// 2022-03-22: Inputs: Fix mouse position issues when dragging outside of boundaries. SDL_CaptureMouse() erroneously still gives out LEAVE events when hovering OS decorations. +// 2022-03-22: Inputs: Added support for extra mouse buttons (SDL_BUTTON_X1/SDL_BUTTON_X2). +// 2022-02-04: Added SDL_Renderer* parameter to ImGui_ImplSDL2_InitForSDLRenderer(), so we can use SDL_GetRendererOutputSize() instead of SDL_GL_GetDrawableSize() when bound to a SDL_Renderer. +// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion. +// 2021-01-20: Inputs: calling new io.AddKeyAnalogEvent() for gamepad support, instead of writing directly to io.NavInputs[]. +// 2022-01-17: Inputs: calling new io.AddMousePosEvent(), io.AddMouseButtonEvent(), io.AddMouseWheelEvent() API (1.87+). +// 2022-01-17: Inputs: always update key mods next and before key event (not in NewFrame) to fix input queue with very low framerates. +// 2022-01-12: Update mouse inputs using SDL_MOUSEMOTION/SDL_WINDOWEVENT_LEAVE + fallback to provide it when focused but not hovered/captured. More standard and will allow us to pass it to future input queue API. +// 2022-01-12: Maintain our own copy of MouseButtonsDown mask instead of using ImGui::IsAnyMouseDown() which will be obsoleted. +// 2022-01-10: Inputs: calling new io.AddKeyEvent(), io.AddKeyModsEvent() + io.SetKeyEventNativeData() API (1.87+). Support for full ImGuiKey range. +// 2021-08-17: Calling io.AddFocusEvent() on SDL_WINDOWEVENT_FOCUS_GAINED/SDL_WINDOWEVENT_FOCUS_LOST. +// 2021-07-29: Inputs: MousePos is correctly reported when the host platform window is hovered but not focused (using SDL_GetMouseFocus() + SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, requires SDL 2.0.5+) +// 2021-06-29: *BREAKING CHANGE* Removed 'SDL_Window* window' parameter to ImGui_ImplSDL2_NewFrame() which was unnecessary. +// 2021-06-29: Reorganized backend to pull data from a single structure to facilitate usage with multiple-contexts (all g_XXXX access changed to bd->XXXX). +// 2021-03-22: Rework global mouse pos availability check listing supported platforms explicitly, effectively fixing mouse access on Raspberry Pi. (#2837, #3950) +// 2020-05-25: Misc: Report a zero display-size when window is minimized, to be consistent with other backends. +// 2020-02-20: Inputs: Fixed mapping for ImGuiKey_KeyPadEnter (using SDL_SCANCODE_KP_ENTER instead of SDL_SCANCODE_RETURN2). +// 2019-12-17: Inputs: On Wayland, use SDL_GetMouseState (because there is no global mouse state). +// 2019-12-05: Inputs: Added support for ImGuiMouseCursor_NotAllowed mouse cursor. +// 2019-07-21: Inputs: Added mapping for ImGuiKey_KeyPadEnter. +// 2019-04-23: Inputs: Added support for SDL_GameController (if ImGuiConfigFlags_NavEnableGamepad is set by user application). +// 2019-03-12: Misc: Preserve DisplayFramebufferScale when main window is minimized. +// 2018-12-21: Inputs: Workaround for Android/iOS which don't seem to handle focus related calls. +// 2018-11-30: Misc: Setting up io.BackendPlatformName so it can be displayed in the About Window. +// 2018-11-14: Changed the signature of ImGui_ImplSDL2_ProcessEvent() to take a 'const SDL_Event*'. +// 2018-08-01: Inputs: Workaround for Emscripten which doesn't seem to handle focus related calls. +// 2018-06-29: Inputs: Added support for the ImGuiMouseCursor_Hand cursor. +// 2018-06-08: Misc: Extracted imgui_impl_sdl.cpp/.h away from the old combined SDL2+OpenGL/Vulkan examples. +// 2018-06-08: Misc: ImGui_ImplSDL2_InitForOpenGL() now takes a SDL_GLContext parameter. +// 2018-05-09: Misc: Fixed clipboard paste memory leak (we didn't call SDL_FreeMemory on the data returned by SDL_GetClipboardText). +// 2018-03-20: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag. +// 2018-02-16: Inputs: Added support for mouse cursors, honoring ImGui::GetMouseCursor() value. +// 2018-02-06: Misc: Removed call to ImGui::Shutdown() which is not available from 1.60 WIP, user needs to call CreateContext/DestroyContext themselves. +// 2018-02-06: Inputs: Added mapping for ImGuiKey_Space. +// 2018-02-05: Misc: Using SDL_GetPerformanceCounter() instead of SDL_GetTicks() to be able to handle very high framerate (1000+ FPS). +// 2018-02-05: Inputs: Keyboard mapping is using scancodes everywhere instead of a confusing mixture of keycodes and scancodes. +// 2018-01-20: Inputs: Added Horizontal Mouse Wheel support. +// 2018-01-19: Inputs: When available (SDL 2.0.4+) using SDL_CaptureMouse() to retrieve coordinates outside of client area when dragging. Otherwise (SDL 2.0.3 and before) testing for SDL_WINDOW_INPUT_FOCUS instead of SDL_WINDOW_MOUSE_FOCUS. +// 2018-01-18: Inputs: Added mapping for ImGuiKey_Insert. +// 2017-08-25: Inputs: MousePos set to -FLT_MAX,-FLT_MAX when mouse is unavailable/missing (instead of -1,-1). +// 2016-10-15: Misc: Added a void* user_data parameter to Clipboard function handlers. + +#include "imgui.h" +#include "imgui_impl_sdl2.h" + +// SDL +#include +#include +#if defined(__APPLE__) +#include +#endif + +#if SDL_VERSION_ATLEAST(2,0,4) && !defined(__EMSCRIPTEN__) && !defined(__ANDROID__) && !(defined(__APPLE__) && TARGET_OS_IOS) && !defined(__amigaos4__) +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 1 +#else +#define SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE 0 +#endif +#define SDL_HAS_VULKAN SDL_VERSION_ATLEAST(2,0,6) + +// SDL Data +struct ImGui_ImplSDL2_Data +{ + SDL_Window* Window; + SDL_Renderer* Renderer; + Uint64 Time; + Uint32 MouseWindowID; + int MouseButtonsDown; + SDL_Cursor* MouseCursors[ImGuiMouseCursor_COUNT]; + SDL_Cursor* LastMouseCursor; + int PendingMouseLeaveFrame; + char* ClipboardTextData; + bool MouseCanUseGlobalState; + + ImGui_ImplSDL2_Data() { memset((void*)this, 0, sizeof(*this)); } +}; + +// Backend data stored in io.BackendPlatformUserData to allow support for multiple Dear ImGui contexts +// It is STRONGLY preferred that you use docking branch with multi-viewports (== single Dear ImGui context + multiple windows) instead of multiple Dear ImGui contexts. +// FIXME: multi-context support is not well tested and probably dysfunctional in this backend. +// FIXME: some shared resources (mouse cursor shape, gamepad) are mishandled when using multi-context. +static ImGui_ImplSDL2_Data* ImGui_ImplSDL2_GetBackendData() +{ + return ImGui::GetCurrentContext() ? (ImGui_ImplSDL2_Data*)ImGui::GetIO().BackendPlatformUserData : nullptr; +} + +// Functions +static const char* ImGui_ImplSDL2_GetClipboardText(void*) +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + bd->ClipboardTextData = SDL_GetClipboardText(); + return bd->ClipboardTextData; +} + +static void ImGui_ImplSDL2_SetClipboardText(void*, const char* text) +{ + SDL_SetClipboardText(text); +} + +// Note: native IME will only display if user calls SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1") _before_ SDL_CreateWindow(). +static void ImGui_ImplSDL2_SetPlatformImeData(ImGuiViewport*, ImGuiPlatformImeData* data) +{ + if (data->WantVisible) + { + SDL_Rect r; + r.x = (int)data->InputPos.x; + r.y = (int)data->InputPos.y; + r.w = 1; + r.h = (int)data->InputLineHeight; + SDL_SetTextInputRect(&r); + SDL_StartTextInput(); + } + else + { + SDL_StopTextInput(); + } +} + +static ImGuiKey ImGui_ImplSDL2_KeycodeToImGuiKey(int keycode) +{ + switch (keycode) + { + case SDLK_TAB: return ImGuiKey_Tab; + case SDLK_LEFT: return ImGuiKey_LeftArrow; + case SDLK_RIGHT: return ImGuiKey_RightArrow; + case SDLK_UP: return ImGuiKey_UpArrow; + case SDLK_DOWN: return ImGuiKey_DownArrow; + case SDLK_PAGEUP: return ImGuiKey_PageUp; + case SDLK_PAGEDOWN: return ImGuiKey_PageDown; + case SDLK_HOME: return ImGuiKey_Home; + case SDLK_END: return ImGuiKey_End; + case SDLK_INSERT: return ImGuiKey_Insert; + case SDLK_DELETE: return ImGuiKey_Delete; + case SDLK_BACKSPACE: return ImGuiKey_Backspace; + case SDLK_SPACE: return ImGuiKey_Space; + case SDLK_RETURN: return ImGuiKey_Enter; + case SDLK_ESCAPE: return ImGuiKey_Escape; + case SDLK_QUOTE: return ImGuiKey_Apostrophe; + case SDLK_COMMA: return ImGuiKey_Comma; + case SDLK_MINUS: return ImGuiKey_Minus; + case SDLK_PERIOD: return ImGuiKey_Period; + case SDLK_SLASH: return ImGuiKey_Slash; + case SDLK_SEMICOLON: return ImGuiKey_Semicolon; + case SDLK_EQUALS: return ImGuiKey_Equal; + case SDLK_LEFTBRACKET: return ImGuiKey_LeftBracket; + case SDLK_BACKSLASH: return ImGuiKey_Backslash; + case SDLK_RIGHTBRACKET: return ImGuiKey_RightBracket; + case SDLK_BACKQUOTE: return ImGuiKey_GraveAccent; + case SDLK_CAPSLOCK: return ImGuiKey_CapsLock; + case SDLK_SCROLLLOCK: return ImGuiKey_ScrollLock; + case SDLK_NUMLOCKCLEAR: return ImGuiKey_NumLock; + case SDLK_PRINTSCREEN: return ImGuiKey_PrintScreen; + case SDLK_PAUSE: return ImGuiKey_Pause; + case SDLK_KP_0: return ImGuiKey_Keypad0; + case SDLK_KP_1: return ImGuiKey_Keypad1; + case SDLK_KP_2: return ImGuiKey_Keypad2; + case SDLK_KP_3: return ImGuiKey_Keypad3; + case SDLK_KP_4: return ImGuiKey_Keypad4; + case SDLK_KP_5: return ImGuiKey_Keypad5; + case SDLK_KP_6: return ImGuiKey_Keypad6; + case SDLK_KP_7: return ImGuiKey_Keypad7; + case SDLK_KP_8: return ImGuiKey_Keypad8; + case SDLK_KP_9: return ImGuiKey_Keypad9; + case SDLK_KP_PERIOD: return ImGuiKey_KeypadDecimal; + case SDLK_KP_DIVIDE: return ImGuiKey_KeypadDivide; + case SDLK_KP_MULTIPLY: return ImGuiKey_KeypadMultiply; + case SDLK_KP_MINUS: return ImGuiKey_KeypadSubtract; + case SDLK_KP_PLUS: return ImGuiKey_KeypadAdd; + case SDLK_KP_ENTER: return ImGuiKey_KeypadEnter; + case SDLK_KP_EQUALS: return ImGuiKey_KeypadEqual; + case SDLK_LCTRL: return ImGuiKey_LeftCtrl; + case SDLK_LSHIFT: return ImGuiKey_LeftShift; + case SDLK_LALT: return ImGuiKey_LeftAlt; + case SDLK_LGUI: return ImGuiKey_LeftSuper; + case SDLK_RCTRL: return ImGuiKey_RightCtrl; + case SDLK_RSHIFT: return ImGuiKey_RightShift; + case SDLK_RALT: return ImGuiKey_RightAlt; + case SDLK_RGUI: return ImGuiKey_RightSuper; + case SDLK_APPLICATION: return ImGuiKey_Menu; + case SDLK_0: return ImGuiKey_0; + case SDLK_1: return ImGuiKey_1; + case SDLK_2: return ImGuiKey_2; + case SDLK_3: return ImGuiKey_3; + case SDLK_4: return ImGuiKey_4; + case SDLK_5: return ImGuiKey_5; + case SDLK_6: return ImGuiKey_6; + case SDLK_7: return ImGuiKey_7; + case SDLK_8: return ImGuiKey_8; + case SDLK_9: return ImGuiKey_9; + case SDLK_a: return ImGuiKey_A; + case SDLK_b: return ImGuiKey_B; + case SDLK_c: return ImGuiKey_C; + case SDLK_d: return ImGuiKey_D; + case SDLK_e: return ImGuiKey_E; + case SDLK_f: return ImGuiKey_F; + case SDLK_g: return ImGuiKey_G; + case SDLK_h: return ImGuiKey_H; + case SDLK_i: return ImGuiKey_I; + case SDLK_j: return ImGuiKey_J; + case SDLK_k: return ImGuiKey_K; + case SDLK_l: return ImGuiKey_L; + case SDLK_m: return ImGuiKey_M; + case SDLK_n: return ImGuiKey_N; + case SDLK_o: return ImGuiKey_O; + case SDLK_p: return ImGuiKey_P; + case SDLK_q: return ImGuiKey_Q; + case SDLK_r: return ImGuiKey_R; + case SDLK_s: return ImGuiKey_S; + case SDLK_t: return ImGuiKey_T; + case SDLK_u: return ImGuiKey_U; + case SDLK_v: return ImGuiKey_V; + case SDLK_w: return ImGuiKey_W; + case SDLK_x: return ImGuiKey_X; + case SDLK_y: return ImGuiKey_Y; + case SDLK_z: return ImGuiKey_Z; + case SDLK_F1: return ImGuiKey_F1; + case SDLK_F2: return ImGuiKey_F2; + case SDLK_F3: return ImGuiKey_F3; + case SDLK_F4: return ImGuiKey_F4; + case SDLK_F5: return ImGuiKey_F5; + case SDLK_F6: return ImGuiKey_F6; + case SDLK_F7: return ImGuiKey_F7; + case SDLK_F8: return ImGuiKey_F8; + case SDLK_F9: return ImGuiKey_F9; + case SDLK_F10: return ImGuiKey_F10; + case SDLK_F11: return ImGuiKey_F11; + case SDLK_F12: return ImGuiKey_F12; + } + return ImGuiKey_None; +} + +static void ImGui_ImplSDL2_UpdateKeyModifiers(SDL_Keymod sdl_key_mods) +{ + ImGuiIO& io = ImGui::GetIO(); + io.AddKeyEvent(ImGuiMod_Ctrl, (sdl_key_mods & KMOD_CTRL) != 0); + io.AddKeyEvent(ImGuiMod_Shift, (sdl_key_mods & KMOD_SHIFT) != 0); + io.AddKeyEvent(ImGuiMod_Alt, (sdl_key_mods & KMOD_ALT) != 0); + io.AddKeyEvent(ImGuiMod_Super, (sdl_key_mods & KMOD_GUI) != 0); +} + +// You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. +// - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. +// - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. +// Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. +// If you have multiple SDL events and some of them are not meant to be used by dear imgui, you may need to filter events based on their windowID field. +bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event) +{ + ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + + switch (event->type) + { + case SDL_MOUSEMOTION: + { + ImVec2 mouse_pos((float)event->motion.x, (float)event->motion.y); + io.AddMousePosEvent(mouse_pos.x, mouse_pos.y); + return true; + } + case SDL_MOUSEWHEEL: + { + //IMGUI_DEBUG_LOG("wheel %.2f %.2f, precise %.2f %.2f\n", (float)event->wheel.x, (float)event->wheel.y, event->wheel.preciseX, event->wheel.preciseY); +#if SDL_VERSION_ATLEAST(2,0,18) // If this fails to compile on Emscripten: update to latest Emscripten! + float wheel_x = -event->wheel.preciseX; + float wheel_y = event->wheel.preciseY; +#else + float wheel_x = -(float)event->wheel.x; + float wheel_y = (float)event->wheel.y; +#endif +#ifdef __EMSCRIPTEN__ + wheel_x /= 100.0f; +#endif + io.AddMouseWheelEvent(wheel_x, wheel_y); + return true; + } + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + { + int mouse_button = -1; + if (event->button.button == SDL_BUTTON_LEFT) { mouse_button = 0; } + if (event->button.button == SDL_BUTTON_RIGHT) { mouse_button = 1; } + if (event->button.button == SDL_BUTTON_MIDDLE) { mouse_button = 2; } + if (event->button.button == SDL_BUTTON_X1) { mouse_button = 3; } + if (event->button.button == SDL_BUTTON_X2) { mouse_button = 4; } + if (mouse_button == -1) + break; + io.AddMouseButtonEvent(mouse_button, (event->type == SDL_MOUSEBUTTONDOWN)); + bd->MouseButtonsDown = (event->type == SDL_MOUSEBUTTONDOWN) ? (bd->MouseButtonsDown | (1 << mouse_button)) : (bd->MouseButtonsDown & ~(1 << mouse_button)); + return true; + } + case SDL_TEXTINPUT: + { + io.AddInputCharactersUTF8(event->text.text); + return true; + } + case SDL_KEYDOWN: + case SDL_KEYUP: + { + ImGui_ImplSDL2_UpdateKeyModifiers((SDL_Keymod)event->key.keysym.mod); + ImGuiKey key = ImGui_ImplSDL2_KeycodeToImGuiKey(event->key.keysym.sym); + io.AddKeyEvent(key, (event->type == SDL_KEYDOWN)); + io.SetKeyEventNativeData(key, event->key.keysym.sym, event->key.keysym.scancode, event->key.keysym.scancode); // To support legacy indexing (<1.87 user code). Legacy backend uses SDLK_*** as indices to IsKeyXXX() functions. + return true; + } + case SDL_WINDOWEVENT: + { + // - When capturing mouse, SDL will send a bunch of conflicting LEAVE/ENTER event on every mouse move, but the final ENTER tends to be right. + // - However we won't get a correct LEAVE event for a captured window. + // - In some cases, when detaching a window from main viewport SDL may send SDL_WINDOWEVENT_ENTER one frame too late, + // causing SDL_WINDOWEVENT_LEAVE on previous frame to interrupt drag operation by clear mouse position. This is why + // we delay process the SDL_WINDOWEVENT_LEAVE events by one frame. See issue #5012 for details. + Uint8 window_event = event->window.event; + if (window_event == SDL_WINDOWEVENT_ENTER) + { + bd->MouseWindowID = event->window.windowID; + bd->PendingMouseLeaveFrame = 0; + } + if (window_event == SDL_WINDOWEVENT_LEAVE) + bd->PendingMouseLeaveFrame = ImGui::GetFrameCount() + 1; + if (window_event == SDL_WINDOWEVENT_FOCUS_GAINED) + io.AddFocusEvent(true); + else if (event->window.event == SDL_WINDOWEVENT_FOCUS_LOST) + io.AddFocusEvent(false); + return true; + } + } + return false; +} + +static bool ImGui_ImplSDL2_Init(SDL_Window* window, SDL_Renderer* renderer) +{ + ImGuiIO& io = ImGui::GetIO(); + IM_ASSERT(io.BackendPlatformUserData == nullptr && "Already initialized a platform backend!"); + + // Check and store if we are on a SDL backend that supports global mouse position + // ("wayland" and "rpi" don't support it, but we chose to use a white-list instead of a black-list) + bool mouse_can_use_global_state = false; +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + const char* sdl_backend = SDL_GetCurrentVideoDriver(); + const char* global_mouse_whitelist[] = { "windows", "cocoa", "x11", "DIVE", "VMAN" }; + for (int n = 0; n < IM_ARRAYSIZE(global_mouse_whitelist); n++) + if (strncmp(sdl_backend, global_mouse_whitelist[n], strlen(global_mouse_whitelist[n])) == 0) + mouse_can_use_global_state = true; +#endif + + // Setup backend capabilities flags + ImGui_ImplSDL2_Data* bd = IM_NEW(ImGui_ImplSDL2_Data)(); + io.BackendPlatformUserData = (void*)bd; + io.BackendPlatformName = "imgui_impl_sdl2"; + io.BackendFlags |= ImGuiBackendFlags_HasMouseCursors; // We can honor GetMouseCursor() values (optional) + io.BackendFlags |= ImGuiBackendFlags_HasSetMousePos; // We can honor io.WantSetMousePos requests (optional, rarely used) + + bd->Window = window; + bd->Renderer = renderer; + bd->MouseCanUseGlobalState = mouse_can_use_global_state; + + io.SetClipboardTextFn = ImGui_ImplSDL2_SetClipboardText; + io.GetClipboardTextFn = ImGui_ImplSDL2_GetClipboardText; + io.ClipboardUserData = nullptr; + io.SetPlatformImeDataFn = ImGui_ImplSDL2_SetPlatformImeData; + + // Load mouse cursors + bd->MouseCursors[ImGuiMouseCursor_Arrow] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW); + bd->MouseCursors[ImGuiMouseCursor_TextInput] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_IBEAM); + bd->MouseCursors[ImGuiMouseCursor_ResizeAll] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEALL); + bd->MouseCursors[ImGuiMouseCursor_ResizeNS] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENS); + bd->MouseCursors[ImGuiMouseCursor_ResizeEW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); + bd->MouseCursors[ImGuiMouseCursor_ResizeNESW] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENESW); + bd->MouseCursors[ImGuiMouseCursor_ResizeNWSE] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZENWSE); + bd->MouseCursors[ImGuiMouseCursor_Hand] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); + bd->MouseCursors[ImGuiMouseCursor_NotAllowed] = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_NO); + + // Set platform dependent data in viewport + // Our mouse update function expect PlatformHandle to be filled for the main viewport + ImGuiViewport* main_viewport = ImGui::GetMainViewport(); + main_viewport->PlatformHandleRaw = nullptr; + SDL_SysWMinfo info; + SDL_VERSION(&info.version); + if (SDL_GetWindowWMInfo(window, &info)) + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + main_viewport->PlatformHandleRaw = (void*)info.info.win.window; +#elif defined(__APPLE__) && defined(SDL_VIDEO_DRIVER_COCOA) + main_viewport->PlatformHandleRaw = (void*)info.info.cocoa.window; +#endif + } + + // From 2.0.5: Set SDL hint to receive mouse click events on window focus, otherwise SDL doesn't emit the event. + // Without this, when clicking to gain focus, our widgets wouldn't activate even though they showed as hovered. + // (This is unfortunately a global SDL setting, so enabling it might have a side-effect on your application. + // It is unlikely to make a difference, but if your app absolutely needs to ignore the initial on-focus click: + // you can ignore SDL_MOUSEBUTTONDOWN events coming right after a SDL_WINDOWEVENT_FOCUS_GAINED) +#ifdef SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH + SDL_SetHint(SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH, "1"); +#endif + + // From 2.0.18: Enable native IME. + // IMPORTANT: This is used at the time of SDL_CreateWindow() so this will only affects secondary windows, if any. + // For the main window to be affected, your application needs to call this manually before calling SDL_CreateWindow(). +#ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); +#endif + + // From 2.0.22: Disable auto-capture, this is preventing drag and drop across multiple windows (see #5710) +#ifdef SDL_HINT_MOUSE_AUTO_CAPTURE + SDL_SetHint(SDL_HINT_MOUSE_AUTO_CAPTURE, "0"); +#endif + + return true; +} + +bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context) +{ + IM_UNUSED(sdl_gl_context); // Viewport branch will need this. + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window) +{ +#if !SDL_HAS_VULKAN + IM_ASSERT(0 && "Unsupported"); +#endif + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window) +{ +#if !defined(_WIN32) + IM_ASSERT(0 && "Unsupported"); +#endif + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window) +{ + return ImGui_ImplSDL2_Init(window, nullptr); +} + +bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer) +{ + return ImGui_ImplSDL2_Init(window, renderer); +} + +void ImGui_ImplSDL2_Shutdown() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "No platform backend to shutdown, or already shutdown?"); + ImGuiIO& io = ImGui::GetIO(); + + if (bd->ClipboardTextData) + SDL_free(bd->ClipboardTextData); + for (ImGuiMouseCursor cursor_n = 0; cursor_n < ImGuiMouseCursor_COUNT; cursor_n++) + SDL_FreeCursor(bd->MouseCursors[cursor_n]); + bd->LastMouseCursor = NULL; + + io.BackendPlatformName = nullptr; + io.BackendPlatformUserData = nullptr; + IM_DELETE(bd); +} + +static void ImGui_ImplSDL2_UpdateMouseData() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + ImGuiIO& io = ImGui::GetIO(); + + // We forward mouse input when hovered or captured (via SDL_MOUSEMOTION) or when focused (below) +#if SDL_HAS_CAPTURE_AND_GLOBAL_MOUSE + // SDL_CaptureMouse() let the OS know e.g. that our imgui drag outside the SDL window boundaries shouldn't e.g. trigger other operations outside + SDL_CaptureMouse((bd->MouseButtonsDown != 0) ? SDL_TRUE : SDL_FALSE); + SDL_Window* focused_window = SDL_GetKeyboardFocus(); + const bool is_app_focused = (bd->Window == focused_window); +#else + const bool is_app_focused = (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_INPUT_FOCUS) != 0; // SDL 2.0.3 and non-windowed systems: single-viewport only +#endif + if (is_app_focused) + { + // (Optional) Set OS mouse position from Dear ImGui if requested (rarely used, only when ImGuiConfigFlags_NavEnableSetMousePos is enabled by user) + if (io.WantSetMousePos) + SDL_WarpMouseInWindow(bd->Window, (int)io.MousePos.x, (int)io.MousePos.y); + + // (Optional) Fallback to provide mouse position when focused (SDL_MOUSEMOTION already provides this when hovered or captured) + if (bd->MouseCanUseGlobalState && bd->MouseButtonsDown == 0) + { + int window_x, window_y, mouse_x_global, mouse_y_global; + SDL_GetGlobalMouseState(&mouse_x_global, &mouse_y_global); + SDL_GetWindowPosition(bd->Window, &window_x, &window_y); + io.AddMousePosEvent((float)(mouse_x_global - window_x), (float)(mouse_y_global - window_y)); + } + } +} + +static void ImGui_ImplSDL2_UpdateMouseCursor() +{ + ImGuiIO& io = ImGui::GetIO(); + if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) + return; + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + + ImGuiMouseCursor imgui_cursor = ImGui::GetMouseCursor(); + if (io.MouseDrawCursor || imgui_cursor == ImGuiMouseCursor_None) + { + // Hide OS mouse cursor if imgui is drawing it or if it wants no cursor + SDL_ShowCursor(SDL_FALSE); + } + else + { + // Show OS mouse cursor + SDL_Cursor* expected_cursor = bd->MouseCursors[imgui_cursor] ? bd->MouseCursors[imgui_cursor] : bd->MouseCursors[ImGuiMouseCursor_Arrow]; + if (bd->LastMouseCursor != expected_cursor) + { + SDL_SetCursor(expected_cursor); // SDL function doesn't have an early out (see #6113) + bd->LastMouseCursor = expected_cursor; + } + SDL_ShowCursor(SDL_TRUE); + } +} + +static void ImGui_ImplSDL2_UpdateGamepads() +{ + ImGuiIO& io = ImGui::GetIO(); + if ((io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) == 0) // FIXME: Technically feeding gamepad shouldn't depend on this now that they are regular inputs. + return; + + // Get gamepad + io.BackendFlags &= ~ImGuiBackendFlags_HasGamepad; + SDL_GameController* game_controller = SDL_GameControllerOpen(0); + if (!game_controller) + return; + io.BackendFlags |= ImGuiBackendFlags_HasGamepad; + + // Update gamepad inputs + #define IM_SATURATE(V) (V < 0.0f ? 0.0f : V > 1.0f ? 1.0f : V) + #define MAP_BUTTON(KEY_NO, BUTTON_NO) { io.AddKeyEvent(KEY_NO, SDL_GameControllerGetButton(game_controller, BUTTON_NO) != 0); } + #define MAP_ANALOG(KEY_NO, AXIS_NO, V0, V1) { float vn = (float)(SDL_GameControllerGetAxis(game_controller, AXIS_NO) - V0) / (float)(V1 - V0); vn = IM_SATURATE(vn); io.AddKeyAnalogEvent(KEY_NO, vn > 0.1f, vn); } + const int thumb_dead_zone = 8000; // SDL_gamecontroller.h suggests using this value. + MAP_BUTTON(ImGuiKey_GamepadStart, SDL_CONTROLLER_BUTTON_START); + MAP_BUTTON(ImGuiKey_GamepadBack, SDL_CONTROLLER_BUTTON_BACK); + MAP_BUTTON(ImGuiKey_GamepadFaceLeft, SDL_CONTROLLER_BUTTON_X); // Xbox X, PS Square + MAP_BUTTON(ImGuiKey_GamepadFaceRight, SDL_CONTROLLER_BUTTON_B); // Xbox B, PS Circle + MAP_BUTTON(ImGuiKey_GamepadFaceUp, SDL_CONTROLLER_BUTTON_Y); // Xbox Y, PS Triangle + MAP_BUTTON(ImGuiKey_GamepadFaceDown, SDL_CONTROLLER_BUTTON_A); // Xbox A, PS Cross + MAP_BUTTON(ImGuiKey_GamepadDpadLeft, SDL_CONTROLLER_BUTTON_DPAD_LEFT); + MAP_BUTTON(ImGuiKey_GamepadDpadRight, SDL_CONTROLLER_BUTTON_DPAD_RIGHT); + MAP_BUTTON(ImGuiKey_GamepadDpadUp, SDL_CONTROLLER_BUTTON_DPAD_UP); + MAP_BUTTON(ImGuiKey_GamepadDpadDown, SDL_CONTROLLER_BUTTON_DPAD_DOWN); + MAP_BUTTON(ImGuiKey_GamepadL1, SDL_CONTROLLER_BUTTON_LEFTSHOULDER); + MAP_BUTTON(ImGuiKey_GamepadR1, SDL_CONTROLLER_BUTTON_RIGHTSHOULDER); + MAP_ANALOG(ImGuiKey_GamepadL2, SDL_CONTROLLER_AXIS_TRIGGERLEFT, 0.0f, 32767); + MAP_ANALOG(ImGuiKey_GamepadR2, SDL_CONTROLLER_AXIS_TRIGGERRIGHT, 0.0f, 32767); + MAP_BUTTON(ImGuiKey_GamepadL3, SDL_CONTROLLER_BUTTON_LEFTSTICK); + MAP_BUTTON(ImGuiKey_GamepadR3, SDL_CONTROLLER_BUTTON_RIGHTSTICK); + MAP_ANALOG(ImGuiKey_GamepadLStickLeft, SDL_CONTROLLER_AXIS_LEFTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickRight, SDL_CONTROLLER_AXIS_LEFTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadLStickUp, SDL_CONTROLLER_AXIS_LEFTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadLStickDown, SDL_CONTROLLER_AXIS_LEFTY, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickLeft, SDL_CONTROLLER_AXIS_RIGHTX, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickRight, SDL_CONTROLLER_AXIS_RIGHTX, +thumb_dead_zone, +32767); + MAP_ANALOG(ImGuiKey_GamepadRStickUp, SDL_CONTROLLER_AXIS_RIGHTY, -thumb_dead_zone, -32768); + MAP_ANALOG(ImGuiKey_GamepadRStickDown, SDL_CONTROLLER_AXIS_RIGHTY, +thumb_dead_zone, +32767); + #undef MAP_BUTTON + #undef MAP_ANALOG +} + +void ImGui_ImplSDL2_NewFrame() +{ + ImGui_ImplSDL2_Data* bd = ImGui_ImplSDL2_GetBackendData(); + IM_ASSERT(bd != nullptr && "Did you call ImGui_ImplSDL2_Init()?"); + ImGuiIO& io = ImGui::GetIO(); + + // Setup display size (every frame to accommodate for window resizing) + int w, h; + int display_w, display_h; + SDL_GetWindowSize(bd->Window, &w, &h); + if (SDL_GetWindowFlags(bd->Window) & SDL_WINDOW_MINIMIZED) + w = h = 0; + if (bd->Renderer != nullptr) + SDL_GetRendererOutputSize(bd->Renderer, &display_w, &display_h); + else + SDL_GL_GetDrawableSize(bd->Window, &display_w, &display_h); + io.DisplaySize = ImVec2((float)w, (float)h); + if (w > 0 && h > 0) + io.DisplayFramebufferScale = ImVec2((float)display_w / w, (float)display_h / h); + + // Setup time step (we don't use SDL_GetTicks() because it is using millisecond resolution) + // (Accept SDL_GetPerformanceCounter() not returning a monotonically increasing value. Happens in VMs and Emscripten, see #6189, #6114, #3644) + static Uint64 frequency = SDL_GetPerformanceFrequency(); + Uint64 current_time = SDL_GetPerformanceCounter(); + if (current_time <= bd->Time) + current_time = bd->Time + 1; + io.DeltaTime = bd->Time > 0 ? (float)((double)(current_time - bd->Time) / frequency) : (float)(1.0f / 60.0f); + bd->Time = current_time; + + if (bd->PendingMouseLeaveFrame && bd->PendingMouseLeaveFrame >= ImGui::GetFrameCount() && bd->MouseButtonsDown == 0) + { + bd->MouseWindowID = 0; + bd->PendingMouseLeaveFrame = 0; + io.AddMousePosEvent(-FLT_MAX, -FLT_MAX); + } + + ImGui_ImplSDL2_UpdateMouseData(); + ImGui_ImplSDL2_UpdateMouseCursor(); + + // Update game controllers (if enabled and available) + ImGui_ImplSDL2_UpdateGamepads(); +} diff --git a/ImGui/imgui_impl_sdl2.h b/ImGui/imgui_impl_sdl2.h new file mode 100644 index 0000000..68da36a --- /dev/null +++ b/ImGui/imgui_impl_sdl2.h @@ -0,0 +1,35 @@ +// dear imgui: Platform Backend for SDL2 +// This needs to be used along with a Renderer (e.g. DirectX11, OpenGL3, Vulkan..) +// (Info: SDL2 is a cross-platform general purpose library for handling windows, inputs, graphics context creation, etc.) + +// Implemented features: +// [X] Platform: Clipboard support. +// [X] Platform: Keyboard support. Since 1.87 we are using the io.AddKeyEvent() function. Pass ImGuiKey values to all key functions e.g. ImGui::IsKeyPressed(ImGuiKey_Space). [Legacy SDL_SCANCODE_* values will also be supported unless IMGUI_DISABLE_OBSOLETE_KEYIO is set] +// [X] Platform: Gamepad support. Enabled with 'io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad'. +// [X] Platform: Mouse cursor shape and visibility. Disable with 'io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange'. +// [X] Platform: Basic IME support. App needs to call 'SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1");' before SDL_CreateWindow()!. + +// You can use unmodified imgui_impl_* files in your project. See examples/ folder for examples of using this. +// Prefer including the entire imgui/ repository into your project (either as a copy or as a submodule), and only build the backends you need. +// If you are new to Dear ImGui, read documentation from the docs/ folder + read the top of imgui.cpp. +// Read online: https://github.com/ocornut/imgui/tree/master/docs + +#pragma once +#include "imgui.h" // IMGUI_IMPL_API + +struct SDL_Window; +struct SDL_Renderer; +typedef union SDL_Event SDL_Event; + +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForOpenGL(SDL_Window* window, void* sdl_gl_context); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForVulkan(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForD3D(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForMetal(SDL_Window* window); +IMGUI_IMPL_API bool ImGui_ImplSDL2_InitForSDLRenderer(SDL_Window* window, SDL_Renderer* renderer); +IMGUI_IMPL_API void ImGui_ImplSDL2_Shutdown(); +IMGUI_IMPL_API void ImGui_ImplSDL2_NewFrame(); +IMGUI_IMPL_API bool ImGui_ImplSDL2_ProcessEvent(const SDL_Event* event); + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +static inline void ImGui_ImplSDL2_NewFrame(SDL_Window*) { ImGui_ImplSDL2_NewFrame(); } // 1.84: removed unnecessary parameter +#endif diff --git a/ImGui/imgui_internal.h b/ImGui/imgui_internal.h new file mode 100644 index 0000000..dd15219 --- /dev/null +++ b/ImGui/imgui_internal.h @@ -0,0 +1,3262 @@ +// dear imgui, v1.89.4 WIP +// (internal structures/api) + +// You may use this file to debug, understand or extend Dear ImGui features but we don't provide any guarantee of forward compatibility. +// To implement maths operators for ImVec2 (disabled by default to not conflict with using IM_VEC2_CLASS_EXTRA with your own math types+operators), use: +/* +#define IMGUI_DEFINE_MATH_OPERATORS +#include "imgui_internal.h" +*/ + +/* + +Index of this file: + +// [SECTION] Header mess +// [SECTION] Forward declarations +// [SECTION] Context pointer +// [SECTION] STB libraries includes +// [SECTION] Macros +// [SECTION] Generic helpers +// [SECTION] ImDrawList support +// [SECTION] Widgets support: flags, enums, data structures +// [SECTION] Inputs support +// [SECTION] Clipper support +// [SECTION] Navigation support +// [SECTION] Columns support +// [SECTION] Multi-select support +// [SECTION] Docking support +// [SECTION] Viewport support +// [SECTION] Settings support +// [SECTION] Localization support +// [SECTION] Metrics, Debug tools +// [SECTION] Generic context hooks +// [SECTION] ImGuiContext (main imgui context) +// [SECTION] ImGuiWindowTempData, ImGuiWindow +// [SECTION] Tab bar, Tab item support +// [SECTION] Table support +// [SECTION] ImGui internal API +// [SECTION] ImFontAtlas internal API +// [SECTION] Test Engine specific hooks (imgui_test_engine) + +*/ + +#pragma once +#ifndef IMGUI_DISABLE + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#ifndef IMGUI_VERSION +#include "imgui.h" +#endif + +#include // FILE*, sscanf +#include // NULL, malloc, free, qsort, atoi, atof +#include // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf +#include // INT_MIN, INT_MAX + +// Enable SSE intrinsics if available +#if (defined __SSE__ || defined __x86_64__ || defined _M_X64 || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))) && !defined(IMGUI_DISABLE_SSE) +#define IMGUI_ENABLE_SSE +#include +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport) +#pragma warning (disable: 26812) // The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). [MSVC Static Analyzer) +#pragma warning (disable: 26495) // [Static Analyzer] Variable 'XXX' is uninitialized. Always initialize a member variable (type.6). +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#pragma clang diagnostic push +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants ok, for ImFloorSigned() +#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h +#pragma clang diagnostic ignored "-Wold-style-cast" +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#pragma clang diagnostic ignored "-Wdouble-promotion" +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#pragma clang diagnostic ignored "-Wmissing-noreturn" // warning: function 'xxx' could be declared with attribute 'noreturn' +#elif defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +// In 1.89.4, we moved the implementation of "courtesy maths operators" from imgui_internal.h in imgui.h +// As they are frequently requested, we do not want to encourage to many people using imgui_internal.h +#if defined(IMGUI_DEFINE_MATH_OPERATORS) && !defined(IMGUI_DEFINE_MATH_OPERATORS_IMPLEMENTED) +#error Please '#define IMGUI_DEFINE_MATH_OPERATORS' _BEFORE_ including imgui.h! +#endif + +// Legacy defines +#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +#endif +#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74 +#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#endif + +// Enable stb_truetype by default unless FreeType is enabled. +// You can compile with both by defining both IMGUI_ENABLE_FREETYPE and IMGUI_ENABLE_STB_TRUETYPE together. +#ifndef IMGUI_ENABLE_FREETYPE +#define IMGUI_ENABLE_STB_TRUETYPE +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Forward declarations +//----------------------------------------------------------------------------- + +struct ImBitVector; // Store 1-bit per value +struct ImRect; // An axis-aligned rectangle (2 points) +struct ImDrawDataBuilder; // Helper to build a ImDrawData instance +struct ImDrawListSharedData; // Data shared between all ImDrawList instances +struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it +struct ImGuiContext; // Main Dear ImGui context +struct ImGuiContextHook; // Hook for extensions like ImGuiTestEngine +struct ImGuiDataVarInfo; // Variable information (e.g. to avoid style variables from an enum) +struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum +struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup() +struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box +struct ImGuiLastItemData; // Status storage for last submitted items +struct ImGuiLocEntry; // A localization entry. +struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only +struct ImGuiNavItemData; // Result of a gamepad/keyboard directional navigation move query result +struct ImGuiMetricsConfig; // Storage for ShowMetricsWindow() and DebugNodeXXX() functions +struct ImGuiNextWindowData; // Storage for SetNextWindow** functions +struct ImGuiNextItemData; // Storage for SetNextItem** functions +struct ImGuiOldColumnData; // Storage data for a single column for legacy Columns() api +struct ImGuiOldColumns; // Storage data for a columns set for legacy Columns() api +struct ImGuiPopupData; // Storage for current popup stack +struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file +struct ImGuiStackSizes; // Storage of stack sizes for debugging/asserting +struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it +struct ImGuiTabBar; // Storage for a tab bar +struct ImGuiTabItem; // Storage for a tab item (within a tab bar) +struct ImGuiTable; // Storage for a table +struct ImGuiTableColumn; // Storage for one column of a table +struct ImGuiTableInstanceData; // Storage for one instance of a same table +struct ImGuiTableTempData; // Temporary storage for one table (one per table in the stack), shared between tables. +struct ImGuiTableSettings; // Storage for a table .ini settings +struct ImGuiTableColumnsSettings; // Storage for a column .ini settings +struct ImGuiWindow; // Storage for one window +struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame, in practice we currently keep it for each window) +struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session) + +// Enumerations +// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists. +enum ImGuiLocKey : int; // -> enum ImGuiLocKey // Enum: a localization entry for translation. +typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical + +// Flags +typedef int ImGuiActivateFlags; // -> enum ImGuiActivateFlags_ // Flags: for navigation/focus function (will be for ActivateItem() later) +typedef int ImGuiDebugLogFlags; // -> enum ImGuiDebugLogFlags_ // Flags: for ShowDebugLogWindow(), g.DebugLogFlags +typedef int ImGuiInputFlags; // -> enum ImGuiInputFlags_ // Flags: for IsKeyPressed(), IsMouseClicked(), SetKeyOwner(), SetItemKeyOwner() etc. +typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag(), g.LastItemData.InFlags +typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for g.LastItemData.StatusFlags +typedef int ImGuiOldColumnFlags; // -> enum ImGuiOldColumnFlags_ // Flags: for BeginColumns() +typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight() +typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests +typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions +typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions +typedef int ImGuiScrollFlags; // -> enum ImGuiScrollFlags_ // Flags: for ScrollToItem() and navigation requests +typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx() +typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx() +typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx() + +typedef void (*ImGuiErrorLogCallback)(void* user_data, const char* fmt, ...); + +//----------------------------------------------------------------------------- +// [SECTION] Context pointer +// See implementation of this variable in imgui.cpp for comments and details. +//----------------------------------------------------------------------------- + +#ifndef GImGui +extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer +#endif + +//------------------------------------------------------------------------- +// [SECTION] STB libraries includes +//------------------------------------------------------------------------- + +namespace ImStb +{ + +#undef STB_TEXTEDIT_STRING +#undef STB_TEXTEDIT_CHARTYPE +#define STB_TEXTEDIT_STRING ImGuiInputTextState +#define STB_TEXTEDIT_CHARTYPE ImWchar +#define STB_TEXTEDIT_GETWIDTH_NEWLINE (-1.0f) +#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#include "imstb_textedit.h" + +} // namespace ImStb + +//----------------------------------------------------------------------------- +// [SECTION] Macros +//----------------------------------------------------------------------------- + +// Debug Printing Into TTY +// (since IMGUI_VERSION_NUM >= 18729: IMGUI_DEBUG_LOG was reworked into IMGUI_DEBUG_PRINTF (and removed framecount from it). If you were using a #define IMGUI_DEBUG_LOG please rename) +#ifndef IMGUI_DEBUG_PRINTF +#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS +#define IMGUI_DEBUG_PRINTF(_FMT,...) printf(_FMT, __VA_ARGS__) +#else +#define IMGUI_DEBUG_PRINTF(_FMT,...) ((void)0) +#endif +#endif + +// Debug Logging for ShowDebugLogWindow(). This is designed for relatively rare events so please don't spam. +#ifndef IMGUI_DISABLE_DEBUG_TOOLS +#define IMGUI_DEBUG_LOG(...) ImGui::DebugLog(__VA_ARGS__) +#else +#define IMGUI_DEBUG_LOG(...) ((void)0) +#endif +#define IMGUI_DEBUG_LOG_ACTIVEID(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventActiveId) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_FOCUS(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventFocus) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_POPUP(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventPopup) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_NAV(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventNav) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_CLIPPER(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventClipper) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) +#define IMGUI_DEBUG_LOG_IO(...) do { if (g.DebugLogFlags & ImGuiDebugLogFlags_EventIO) IMGUI_DEBUG_LOG(__VA_ARGS__); } while (0) + +// Static Asserts +#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "") + +// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much. +// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code. +//#define IMGUI_DEBUG_PARANOID +#ifdef IMGUI_DEBUG_PARANOID +#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR) +#else +#define IM_ASSERT_PARANOID(_EXPR) +#endif + +// Error handling +// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults. +#ifndef IM_ASSERT_USER_ERROR +#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error +#endif + +// Misc Macros +#define IM_PI 3.14159265358979323846f +#ifdef _WIN32 +#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!) +#else +#define IM_NEWLINE "\n" +#endif +#ifndef IM_TABSIZE // Until we move this to runtime and/or add proper tab support, at least allow users to compile-time override +#define IM_TABSIZE (4) +#endif +#define IM_MEMALIGN(_OFF,_ALIGN) (((_OFF) + ((_ALIGN) - 1)) & ~((_ALIGN) - 1)) // Memory align e.g. IM_ALIGN(0,4)=0, IM_ALIGN(1,4)=4, IM_ALIGN(4,4)=4, IM_ALIGN(5,4)=8 +#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose +#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255 +#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds +#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) // + +// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall +#ifdef _MSC_VER +#define IMGUI_CDECL __cdecl +#else +#define IMGUI_CDECL +#endif + +// Warnings +#if defined(_MSC_VER) && !defined(__clang__) +#define IM_MSVC_WARNING_SUPPRESS(XXXX) __pragma(warning(suppress: XXXX)) +#else +#define IM_MSVC_WARNING_SUPPRESS(XXXX) +#endif + +// Debug Tools +// Use 'Metrics/Debugger->Tools->Item Picker' to break into the call-stack of a specific item. +// This will call IM_DEBUG_BREAK() which you may redefine yourself. See https://github.com/scottt/debugbreak for more reference. +#ifndef IM_DEBUG_BREAK +#if defined (_MSC_VER) +#define IM_DEBUG_BREAK() __debugbreak() +#elif defined(__clang__) +#define IM_DEBUG_BREAK() __builtin_debugtrap() +#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) +#define IM_DEBUG_BREAK() __asm__ volatile("int $0x03") +#elif defined(__GNUC__) && defined(__thumb__) +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xde01") +#elif defined(__GNUC__) && defined(__arm__) && !defined(__thumb__) +#define IM_DEBUG_BREAK() __asm__ volatile(".inst 0xe7f001f0"); +#else +#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger! +#endif +#endif // #ifndef IM_DEBUG_BREAK + +//----------------------------------------------------------------------------- +// [SECTION] Generic helpers +// Note that the ImXXX helpers functions are lower-level than ImGui functions. +// ImGui functions or the ImGui context are never called/used from other ImXXX functions. +//----------------------------------------------------------------------------- +// - Helpers: Hashing +// - Helpers: Sorting +// - Helpers: Bit manipulation +// - Helpers: String +// - Helpers: Formatting +// - Helpers: UTF-8 <> wchar conversions +// - Helpers: ImVec2/ImVec4 operators +// - Helpers: Maths +// - Helpers: Geometry +// - Helper: ImVec1 +// - Helper: ImVec2ih +// - Helper: ImRect +// - Helper: ImBitArray +// - Helper: ImBitVector +// - Helper: ImSpan<>, ImSpanAllocator<> +// - Helper: ImPool<> +// - Helper: ImChunkStream<> +// - Helper: ImGuiTextIndex +//----------------------------------------------------------------------------- + +// Helpers: Hashing +IMGUI_API ImGuiID ImHashData(const void* data, size_t data_size, ImGuiID seed = 0); +IMGUI_API ImGuiID ImHashStr(const char* data, size_t data_size = 0, ImGuiID seed = 0); + +// Helpers: Sorting +#ifndef ImQsort +static inline void ImQsort(void* base, size_t count, size_t size_of_element, int(IMGUI_CDECL *compare_func)(void const*, void const*)) { if (count > 1) qsort(base, count, size_of_element, compare_func); } +#endif + +// Helpers: Color Blending +IMGUI_API ImU32 ImAlphaBlendColors(ImU32 col_a, ImU32 col_b); + +// Helpers: Bit manipulation +static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; } +static inline bool ImIsPowerOfTwo(ImU64 v) { return v != 0 && (v & (v - 1)) == 0; } +static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; } + +// Helpers: String +IMGUI_API int ImStricmp(const char* str1, const char* str2); +IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count); +IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count); +IMGUI_API char* ImStrdup(const char* str); +IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str); +IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c); +IMGUI_API int ImStrlenW(const ImWchar* str); +IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line +IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line +IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end); +IMGUI_API void ImStrTrimBlanks(char* str); +IMGUI_API const char* ImStrSkipBlank(const char* str); +IM_MSVC_RUNTIME_CHECKS_OFF +static inline char ImToUpper(char c) { return (c >= 'a' && c <= 'z') ? c &= ~32 : c; } +static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; } +static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; } +IM_MSVC_RUNTIME_CHECKS_RESTORE + +// Helpers: Formatting +IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3); +IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3); +IMGUI_API void ImFormatStringToTempBuffer(const char** out_buf, const char** out_buf_end, const char* fmt, ...) IM_FMTARGS(3); +IMGUI_API void ImFormatStringToTempBufferV(const char** out_buf, const char** out_buf_end, const char* fmt, va_list args) IM_FMTLIST(3); +IMGUI_API const char* ImParseFormatFindStart(const char* format); +IMGUI_API const char* ImParseFormatFindEnd(const char* format); +IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size); +IMGUI_API void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size); +IMGUI_API const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size); +IMGUI_API int ImParseFormatPrecision(const char* format, int default_value); + +// Helpers: UTF-8 <> wchar conversions +IMGUI_API const char* ImTextCharToUtf8(char out_buf[5], unsigned int c); // return out_buf +IMGUI_API int ImTextStrToUtf8(char* out_buf, int out_buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count +IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count +IMGUI_API int ImTextStrFromUtf8(ImWchar* out_buf, int out_buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count +IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count) +IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8 +IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8 + +// Helpers: File System +#ifdef IMGUI_DISABLE_FILE_FUNCTIONS +#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef void* ImFileHandle; +static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; } +static inline bool ImFileClose(ImFileHandle) { return false; } +static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; } +static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; } +static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; } +#endif +#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS +typedef FILE* ImFileHandle; +IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode); +IMGUI_API bool ImFileClose(ImFileHandle file); +IMGUI_API ImU64 ImFileGetSize(ImFileHandle file); +IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file); +IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file); +#else +#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions +#endif +IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0); + +// Helpers: Maths +IM_MSVC_RUNTIME_CHECKS_OFF +// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy) +#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS +#define ImFabs(X) fabsf(X) +#define ImSqrt(X) sqrtf(X) +#define ImFmod(X, Y) fmodf((X), (Y)) +#define ImCos(X) cosf(X) +#define ImSin(X) sinf(X) +#define ImAcos(X) acosf(X) +#define ImAtan2(Y, X) atan2f((Y), (X)) +#define ImAtof(STR) atof(STR) +//#define ImFloorStd(X) floorf(X) // We use our own, see ImFloor() and ImFloorSigned() +#define ImCeil(X) ceilf(X) +static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision +static inline double ImPow(double x, double y) { return pow(x, y); } +static inline float ImLog(float x) { return logf(x); } // DragBehaviorT/SliderBehaviorT uses ImLog with either float/double and need the precision +static inline double ImLog(double x) { return log(x); } +static inline int ImAbs(int x) { return x < 0 ? -x : x; } +static inline float ImAbs(float x) { return fabsf(x); } +static inline double ImAbs(double x) { return fabs(x); } +static inline float ImSign(float x) { return (x < 0.0f) ? -1.0f : (x > 0.0f) ? 1.0f : 0.0f; } // Sign operator - returns -1, 0 or 1 based on sign of argument +static inline double ImSign(double x) { return (x < 0.0) ? -1.0 : (x > 0.0) ? 1.0 : 0.0; } +#ifdef IMGUI_ENABLE_SSE +static inline float ImRsqrt(float x) { return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ss(x))); } +#else +static inline float ImRsqrt(float x) { return 1.0f / sqrtf(x); } +#endif +static inline double ImRsqrt(double x) { return 1.0 / sqrt(x); } +#endif +// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double +// (Exceptionally using templates here but we could also redefine them for those types) +template static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; } +template static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; } +template static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; } +template static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); } +template static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; } +template static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; } +template static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; } +// - Misc maths helpers +static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); } +static inline ImVec2 ImClamp(const ImVec2& v, const ImVec2& mn, ImVec2 mx) { return ImVec2((v.x < mn.x) ? mn.x : (v.x > mx.x) ? mx.x : v.x, (v.y < mn.y) ? mn.y : (v.y > mx.y) ? mx.y : v.y); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, float t) { return ImVec2(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); } +static inline ImVec2 ImLerp(const ImVec2& a, const ImVec2& b, const ImVec2& t) { return ImVec2(a.x + (b.x - a.x) * t.x, a.y + (b.y - a.y) * t.y); } +static inline ImVec4 ImLerp(const ImVec4& a, const ImVec4& b, float t) { return ImVec4(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t, a.z + (b.z - a.z) * t, a.w + (b.w - a.w) * t); } +static inline float ImSaturate(float f) { return (f < 0.0f) ? 0.0f : (f > 1.0f) ? 1.0f : f; } +static inline float ImLengthSqr(const ImVec2& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y); } +static inline float ImLengthSqr(const ImVec4& lhs) { return (lhs.x * lhs.x) + (lhs.y * lhs.y) + (lhs.z * lhs.z) + (lhs.w * lhs.w); } +static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = (lhs.x * lhs.x) + (lhs.y * lhs.y); if (d > 0.0f) return ImRsqrt(d); return fail_value; } +static inline float ImFloor(float f) { return (float)(int)(f); } +static inline float ImFloorSigned(float f) { return (float)((f >= 0 || (float)(int)f == f) ? (int)f : (int)f - 1); } // Decent replacement for floorf() +static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); } +static inline ImVec2 ImFloorSigned(const ImVec2& v) { return ImVec2(ImFloorSigned(v.x), ImFloorSigned(v.y)); } +static inline int ImModPositive(int a, int b) { return (a + b) % b; } +static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; } +static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); } +static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; } +static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); } +static inline bool ImIsFloatAboveGuaranteedIntegerPrecision(float f) { return f <= -16777216 || f >= 16777216; } +static inline float ImExponentialMovingAverage(float avg, float sample, int n) { avg -= avg / n; avg += sample / n; return avg; } +IM_MSVC_RUNTIME_CHECKS_RESTORE + +// Helpers: Geometry +IMGUI_API ImVec2 ImBezierCubicCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); +IMGUI_API ImVec2 ImBezierCubicClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments +IMGUI_API ImVec2 ImBezierCubicClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol +IMGUI_API ImVec2 ImBezierQuadraticCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, float t); +IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p); +IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p); +IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w); +inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; } +IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy); + +// Helper: ImVec1 (1D vector) +// (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches) +IM_MSVC_RUNTIME_CHECKS_OFF +struct ImVec1 +{ + float x; + constexpr ImVec1() : x(0.0f) { } + constexpr ImVec1(float _x) : x(_x) { } +}; + +// Helper: ImVec2ih (2D vector, half-size integer, for long-term packed storage) +struct ImVec2ih +{ + short x, y; + constexpr ImVec2ih() : x(0), y(0) {} + constexpr ImVec2ih(short _x, short _y) : x(_x), y(_y) {} + constexpr explicit ImVec2ih(const ImVec2& rhs) : x((short)rhs.x), y((short)rhs.y) {} +}; + +// Helper: ImRect (2D axis aligned bounding-box) +// NB: we can't rely on ImVec2 math operators being available here! +struct IMGUI_API ImRect +{ + ImVec2 Min; // Upper-left + ImVec2 Max; // Lower-right + + constexpr ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {} + constexpr ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {} + constexpr ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {} + constexpr ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {} + + ImVec2 GetCenter() const { return ImVec2((Min.x + Max.x) * 0.5f, (Min.y + Max.y) * 0.5f); } + ImVec2 GetSize() const { return ImVec2(Max.x - Min.x, Max.y - Min.y); } + float GetWidth() const { return Max.x - Min.x; } + float GetHeight() const { return Max.y - Min.y; } + float GetArea() const { return (Max.x - Min.x) * (Max.y - Min.y); } + ImVec2 GetTL() const { return Min; } // Top-left + ImVec2 GetTR() const { return ImVec2(Max.x, Min.y); } // Top-right + ImVec2 GetBL() const { return ImVec2(Min.x, Max.y); } // Bottom-left + ImVec2 GetBR() const { return Max; } // Bottom-right + bool Contains(const ImVec2& p) const { return p.x >= Min.x && p.y >= Min.y && p.x < Max.x && p.y < Max.y; } + bool Contains(const ImRect& r) const { return r.Min.x >= Min.x && r.Min.y >= Min.y && r.Max.x <= Max.x && r.Max.y <= Max.y; } + bool Overlaps(const ImRect& r) const { return r.Min.y < Max.y && r.Max.y > Min.y && r.Min.x < Max.x && r.Max.x > Min.x; } + void Add(const ImVec2& p) { if (Min.x > p.x) Min.x = p.x; if (Min.y > p.y) Min.y = p.y; if (Max.x < p.x) Max.x = p.x; if (Max.y < p.y) Max.y = p.y; } + void Add(const ImRect& r) { if (Min.x > r.Min.x) Min.x = r.Min.x; if (Min.y > r.Min.y) Min.y = r.Min.y; if (Max.x < r.Max.x) Max.x = r.Max.x; if (Max.y < r.Max.y) Max.y = r.Max.y; } + void Expand(const float amount) { Min.x -= amount; Min.y -= amount; Max.x += amount; Max.y += amount; } + void Expand(const ImVec2& amount) { Min.x -= amount.x; Min.y -= amount.y; Max.x += amount.x; Max.y += amount.y; } + void Translate(const ImVec2& d) { Min.x += d.x; Min.y += d.y; Max.x += d.x; Max.y += d.y; } + void TranslateX(float dx) { Min.x += dx; Max.x += dx; } + void TranslateY(float dy) { Min.y += dy; Max.y += dy; } + void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display. + void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped. + void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); } + bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; } + ImVec4 ToVec4() const { return ImVec4(Min.x, Min.y, Max.x, Max.y); } +}; + +// Helper: ImBitArray +#define IM_BITARRAY_TESTBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] & ((ImU32)1 << ((_N) & 31))) != 0) // Macro version of ImBitArrayTestBit(): ensure args have side-effect or are costly! +#define IM_BITARRAY_CLEARBIT(_ARRAY, _N) ((_ARRAY[(_N) >> 5] &= ~((ImU32)1 << ((_N) & 31)))) // Macro version of ImBitArrayClearBit(): ensure args have side-effect or are costly! +inline size_t ImBitArrayGetStorageSizeInBytes(int bitcount) { return (size_t)((bitcount + 31) >> 5) << 2; } +inline void ImBitArrayClearAllBits(ImU32* arr, int bitcount){ memset(arr, 0, ImBitArrayGetStorageSizeInBytes(bitcount)); } +inline bool ImBitArrayTestBit(const ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); return (arr[n >> 5] & mask) != 0; } +inline void ImBitArrayClearBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] &= ~mask; } +inline void ImBitArraySetBit(ImU32* arr, int n) { ImU32 mask = (ImU32)1 << (n & 31); arr[n >> 5] |= mask; } +inline void ImBitArraySetBitRange(ImU32* arr, int n, int n2) // Works on range [n..n2) +{ + n2--; + while (n <= n2) + { + int a_mod = (n & 31); + int b_mod = (n2 > (n | 31) ? 31 : (n2 & 31)) + 1; + ImU32 mask = (ImU32)(((ImU64)1 << b_mod) - 1) & ~(ImU32)(((ImU64)1 << a_mod) - 1); + arr[n >> 5] |= mask; + n = (n + 32) & ~31; + } +} + +typedef ImU32* ImBitArrayPtr; // Name for use in structs + +// Helper: ImBitArray class (wrapper over ImBitArray functions) +// Store 1-bit per value. +template +struct ImBitArray +{ + ImU32 Storage[(BITCOUNT + 31) >> 5]; + ImBitArray() { ClearAllBits(); } + void ClearAllBits() { memset(Storage, 0, sizeof(Storage)); } + void SetAllBits() { memset(Storage, 255, sizeof(Storage)); } + bool TestBit(int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); } + void SetBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArraySetBit(Storage, n); } + void ClearBit(int n) { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); ImBitArrayClearBit(Storage, n); } + void SetBitRange(int n, int n2) { n += OFFSET; n2 += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT && n2 > n && n2 <= BITCOUNT); ImBitArraySetBitRange(Storage, n, n2); } // Works on range [n..n2) + bool operator[](int n) const { n += OFFSET; IM_ASSERT(n >= 0 && n < BITCOUNT); return IM_BITARRAY_TESTBIT(Storage, n); } +}; + +// Helper: ImBitVector +// Store 1-bit per value. +struct IMGUI_API ImBitVector +{ + ImVector Storage; + void Create(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); } + void Clear() { Storage.clear(); } + bool TestBit(int n) const { IM_ASSERT(n < (Storage.Size << 5)); return IM_BITARRAY_TESTBIT(Storage.Data, n); } + void SetBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArraySetBit(Storage.Data, n); } + void ClearBit(int n) { IM_ASSERT(n < (Storage.Size << 5)); ImBitArrayClearBit(Storage.Data, n); } +}; +IM_MSVC_RUNTIME_CHECKS_RESTORE + +// Helper: ImSpan<> +// Pointing to a span of data we don't own. +template +struct ImSpan +{ + T* Data; + T* DataEnd; + + // Constructors, destructor + inline ImSpan() { Data = DataEnd = NULL; } + inline ImSpan(T* data, int size) { Data = data; DataEnd = data + size; } + inline ImSpan(T* data, T* data_end) { Data = data; DataEnd = data_end; } + + inline void set(T* data, int size) { Data = data; DataEnd = data + size; } + inline void set(T* data, T* data_end) { Data = data; DataEnd = data_end; } + inline int size() const { return (int)(ptrdiff_t)(DataEnd - Data); } + inline int size_in_bytes() const { return (int)(ptrdiff_t)(DataEnd - Data) * (int)sizeof(T); } + inline T& operator[](int i) { T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + inline const T& operator[](int i) const { const T* p = Data + i; IM_ASSERT(p >= Data && p < DataEnd); return *p; } + + inline T* begin() { return Data; } + inline const T* begin() const { return Data; } + inline T* end() { return DataEnd; } + inline const T* end() const { return DataEnd; } + + // Utilities + inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < DataEnd); const ptrdiff_t off = it - Data; return (int)off; } +}; + +// Helper: ImSpanAllocator<> +// Facilitate storing multiple chunks into a single large block (the "arena") +// - Usage: call Reserve() N times, allocate GetArenaSizeInBytes() worth, pass it to SetArenaBasePtr(), call GetSpan() N times to retrieve the aligned ranges. +template +struct ImSpanAllocator +{ + char* BasePtr; + int CurrOff; + int CurrIdx; + int Offsets[CHUNKS]; + int Sizes[CHUNKS]; + + ImSpanAllocator() { memset(this, 0, sizeof(*this)); } + inline void Reserve(int n, size_t sz, int a=4) { IM_ASSERT(n == CurrIdx && n < CHUNKS); CurrOff = IM_MEMALIGN(CurrOff, a); Offsets[n] = CurrOff; Sizes[n] = (int)sz; CurrIdx++; CurrOff += (int)sz; } + inline int GetArenaSizeInBytes() { return CurrOff; } + inline void SetArenaBasePtr(void* base_ptr) { BasePtr = (char*)base_ptr; } + inline void* GetSpanPtrBegin(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n]); } + inline void* GetSpanPtrEnd(int n) { IM_ASSERT(n >= 0 && n < CHUNKS && CurrIdx == CHUNKS); return (void*)(BasePtr + Offsets[n] + Sizes[n]); } + template + inline void GetSpan(int n, ImSpan* span) { span->set((T*)GetSpanPtrBegin(n), (T*)GetSpanPtrEnd(n)); } +}; + +// Helper: ImPool<> +// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer, +// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object. +typedef int ImPoolIdx; +template +struct ImPool +{ + ImVector Buf; // Contiguous data + ImGuiStorage Map; // ID->Index + ImPoolIdx FreeIdx; // Next free idx to use + ImPoolIdx AliveCount; // Number of active/alive items (for display purpose) + + ImPool() { FreeIdx = AliveCount = 0; } + ~ImPool() { Clear(); } + T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; } + T* GetByIndex(ImPoolIdx n) { return &Buf[n]; } + ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); } + T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); } + bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); } + void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = AliveCount = 0; } + T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); AliveCount++; return &Buf[idx]; } + void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); } + void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); AliveCount--; } + void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); } + + // To iterate a ImPool: for (int n = 0; n < pool.GetMapSize(); n++) if (T* t = pool.TryGetMapData(n)) { ... } + // Can be avoided if you know .Remove() has never been called on the pool, or AliveCount == GetMapSize() + int GetAliveCount() const { return AliveCount; } // Number of active/alive items in the pool (for display purpose) + int GetBufSize() const { return Buf.Size; } + int GetMapSize() const { return Map.Data.Size; } // It is the map we need iterate to find valid items, since we don't have "alive" storage anywhere + T* TryGetMapData(ImPoolIdx n) { int idx = Map.Data[n].val_i; if (idx == -1) return NULL; return GetByIndex(idx); } +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + int GetSize() { return GetMapSize(); } // For ImPlot: should use GetMapSize() from (IMGUI_VERSION_NUM >= 18304) +#endif +}; + +// Helper: ImChunkStream<> +// Build and iterate a contiguous stream of variable-sized structures. +// This is used by Settings to store persistent data while reducing allocation count. +// We store the chunk size first, and align the final size on 4 bytes boundaries. +// The tedious/zealous amount of casting is to avoid -Wcast-align warnings. +template +struct ImChunkStream +{ + ImVector Buf; + + void clear() { Buf.clear(); } + bool empty() const { return Buf.Size == 0; } + int size() const { return Buf.Size; } + T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = IM_MEMALIGN(HDR_SZ + sz, 4u); int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); } + T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); } + T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; } + int chunk_size(const T* p) { return ((const int*)p)[-1]; } + T* end() { return (T*)(void*)(Buf.Data + Buf.Size); } + int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; } + T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); } + void swap(ImChunkStream& rhs) { rhs.Buf.swap(Buf); } + +}; + +// Helper: ImGuiTextIndex<> +// Maintain a line index for a text buffer. This is a strong candidate to be moved into the public API. +struct ImGuiTextIndex +{ + ImVector LineOffsets; + int EndOffset = 0; // Because we don't own text buffer we need to maintain EndOffset (may bake in LineOffsets?) + + void clear() { LineOffsets.clear(); EndOffset = 0; } + int size() { return LineOffsets.Size; } + const char* get_line_begin(const char* base, int n) { return base + LineOffsets[n]; } + const char* get_line_end(const char* base, int n) { return base + (n + 1 < LineOffsets.Size ? (LineOffsets[n + 1] - 1) : EndOffset); } + void append(const char* base, int old_size, int new_size); +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImDrawList support +//----------------------------------------------------------------------------- + +// ImDrawList: Helper function to calculate a circle's segment count given its radius and a "maximum error" value. +// Estimation of number of circle segment based on error is derived using method described in https://stackoverflow.com/a/2244088/15194693 +// Number of segments (N) is calculated using equation: +// N = ceil ( pi / acos(1 - error / r) ) where r > 0, error <= r +// Our equation is significantly simpler that one in the post thanks for choosing segment that is +// perpendicular to X axis. Follow steps in the article from this starting condition and you will +// will get this result. +// +// Rendering circles with an odd number of segments, while mathematically correct will produce +// asymmetrical results on the raster grid. Therefore we're rounding N to next even number (7->8, 8->8, 9->10 etc.) +#define IM_ROUNDUP_TO_EVEN(_V) ((((_V) + 1) / 2) * 2) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 4 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512 +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp(IM_ROUNDUP_TO_EVEN((int)ImCeil(IM_PI / ImAcos(1 - ImMin((_MAXERROR), (_RAD)) / (_RAD)))), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX) + +// Raw equation from IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC rewritten for 'r' and 'error'. +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_R(_N,_MAXERROR) ((_MAXERROR) / (1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI)))) +#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC_ERROR(_N,_RAD) ((1 - ImCos(IM_PI / ImMax((float)(_N), IM_PI))) / (_RAD)) + +// ImDrawList: Lookup table size for adaptive arc drawing, cover full circle. +#ifndef IM_DRAWLIST_ARCFAST_TABLE_SIZE +#define IM_DRAWLIST_ARCFAST_TABLE_SIZE 48 // Number of samples in lookup table. +#endif +#define IM_DRAWLIST_ARCFAST_SAMPLE_MAX IM_DRAWLIST_ARCFAST_TABLE_SIZE // Sample index _PathArcToFastEx() for 360 angle. + +// Data shared between all ImDrawList instances +// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure. +struct IMGUI_API ImDrawListSharedData +{ + ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas + ImFont* Font; // Current/default font (optional, for simplified AddText overload) + float FontSize; // Current/default font size (optional, for simplified AddText overload) + float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() + float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc + ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen() + ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards) + + // [Internal] Temp write buffer + ImVector TempBuffer; + + // [Internal] Lookup tables + ImVec2 ArcFastVtx[IM_DRAWLIST_ARCFAST_TABLE_SIZE]; // Sample points on the quarter of the circle. + float ArcFastRadiusCutoff; // Cutoff radius after which arc drawing will fallback to slower PathArcTo() + ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius before we calculate it dynamically (to avoid calculation overhead) + const ImVec4* TexUvLines; // UV of anti-aliased lines in the atlas + + ImDrawListSharedData(); + void SetCircleTessellationMaxError(float max_error); +}; + +struct ImDrawDataBuilder +{ + ImVector Layers[2]; // Global layers for: regular, tooltip + + void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].resize(0); } + void ClearFreeMemory() { for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) Layers[n].clear(); } + int GetDrawListCount() const { int count = 0; for (int n = 0; n < IM_ARRAYSIZE(Layers); n++) count += Layers[n].Size; return count; } + IMGUI_API void FlattenIntoSingleLayer(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Widgets support: flags, enums, data structures +//----------------------------------------------------------------------------- + +// Flags used by upcoming items +// - input: PushItemFlag() manipulates g.CurrentItemFlags, ItemAdd() calls may add extra flags. +// - output: stored in g.LastItemData.InFlags +// Current window shared by all windows. +// This is going to be exposed in imgui.h when stabilized enough. +enum ImGuiItemFlags_ +{ + // Controlled by user + ImGuiItemFlags_None = 0, + ImGuiItemFlags_NoTabStop = 1 << 0, // false // Disable keyboard tabbing. This is a "lighter" version of ImGuiItemFlags_NoNav. + ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings. + ImGuiItemFlags_Disabled = 1 << 2, // false // Disable interactions but doesn't affect visuals. See BeginDisabled()/EndDisabled(). See github.com/ocornut/imgui/issues/211 + ImGuiItemFlags_NoNav = 1 << 3, // false // Disable any form of focusing (keyboard/gamepad directional navigation and SetKeyboardFocusHere() calls) + ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false // Disable item being a candidate for default focus (e.g. used by title bar items) + ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // Disable MenuItem/Selectable() automatically closing their popup window + ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets) + ImGuiItemFlags_ReadOnly = 1 << 7, // false // [ALPHA] Allow hovering interactions but underlying value is not changed. + ImGuiItemFlags_NoWindowHoverableCheck = 1 << 8, // false // Disable hoverable check in ItemHoverable() + + // Controlled by widget code + ImGuiItemFlags_Inputable = 1 << 10, // false // [WIP] Auto-activate input mode when tab focused. Currently only used and supported by a few items before it becomes a generic feature. +}; + +// Status flags for an already submitted item +// - output: stored in g.LastItemData.StatusFlags +enum ImGuiItemStatusFlags_ +{ + ImGuiItemStatusFlags_None = 0, + ImGuiItemStatusFlags_HoveredRect = 1 << 0, // Mouse position is within item rectangle (does NOT mean that the window is in correct z-order and can be hovered!, this is only one part of the most-common IsItemHovered test) + ImGuiItemStatusFlags_HasDisplayRect = 1 << 1, // g.LastItemData.DisplayRect is valid + ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets) + ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected", only state changes, in order to easily handle clipping with less issues. + ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state. + ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag. + ImGuiItemStatusFlags_Deactivated = 1 << 6, // Only valid if ImGuiItemStatusFlags_HasDeactivated is set. + ImGuiItemStatusFlags_HoveredWindow = 1 << 7, // Override the HoveredWindow test to allow cross-window hover testing. + ImGuiItemStatusFlags_FocusedByTabbing = 1 << 8, // Set when the Focusable item just got focused by Tabbing (FIXME: to be removed soon) + ImGuiItemStatusFlags_Visible = 1 << 9, // [WIP] Set when item is overlapping the current clipping rectangle (Used internally. Please don't use yet: API/system will change as we refactor Itemadd()). + + // Additional status + semantic for ImGuiTestEngine +#ifdef IMGUI_ENABLE_TEST_ENGINE + ImGuiItemStatusFlags_Openable = 1 << 20, // Item is an openable (e.g. TreeNode) + ImGuiItemStatusFlags_Opened = 1 << 21, // Opened status + ImGuiItemStatusFlags_Checkable = 1 << 22, // Item is a checkable (e.g. CheckBox, MenuItem) + ImGuiItemStatusFlags_Checked = 1 << 23, // Checked status + ImGuiItemStatusFlags_Inputable = 1 << 24, // Item is a text-inputable (e.g. InputText, SliderXXX, DragXXX) +#endif +}; + +// Extend ImGuiInputTextFlags_ +enum ImGuiInputTextFlagsPrivate_ +{ + // [Internal] + ImGuiInputTextFlags_Multiline = 1 << 26, // For internal use by InputTextMultiline() + ImGuiInputTextFlags_NoMarkEdited = 1 << 27, // For internal use by functions using InputText() before reformatting data + ImGuiInputTextFlags_MergedItem = 1 << 28, // For internal use by TempInputText(), will skip calling ItemAdd(). Require bounding-box to strictly match. +}; + +// Extend ImGuiButtonFlags_ +enum ImGuiButtonFlagsPrivate_ +{ + ImGuiButtonFlags_PressedOnClick = 1 << 4, // return true on click (mouse down event) + ImGuiButtonFlags_PressedOnClickRelease = 1 << 5, // [Default] return true on click + release on same item <-- this is what the majority of Button are using + ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 6, // return true on click + release even if the release event is not done while hovering the item + ImGuiButtonFlags_PressedOnRelease = 1 << 7, // return true on release (default requires click+release) + ImGuiButtonFlags_PressedOnDoubleClick = 1 << 8, // return true on double-click (default requires click+release) + ImGuiButtonFlags_PressedOnDragDropHold = 1 << 9, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers) + ImGuiButtonFlags_Repeat = 1 << 10, // hold to repeat + ImGuiButtonFlags_FlattenChildren = 1 << 11, // allow interactions even if a child window is overlapping + ImGuiButtonFlags_AllowItemOverlap = 1 << 12, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap() + ImGuiButtonFlags_DontClosePopups = 1 << 13, // disable automatically closing parent popup on press // [UNUSED] + //ImGuiButtonFlags_Disabled = 1 << 14, // disable interactions -> use BeginDisabled() or ImGuiItemFlags_Disabled + ImGuiButtonFlags_AlignTextBaseLine = 1 << 15, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine + ImGuiButtonFlags_NoKeyModifiers = 1 << 16, // disable mouse interaction if a key modifier is held + ImGuiButtonFlags_NoHoldingActiveId = 1 << 17, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only) + ImGuiButtonFlags_NoNavFocus = 1 << 18, // don't override navigation focus when activated (FIXME: this is essentially used everytime an item uses ImGuiItemFlags_NoNav, but because legacy specs don't requires LastItemData to be set ButtonBehavior(), we can't poll g.LastItemData.InFlags) + ImGuiButtonFlags_NoHoveredOnFocus = 1 << 19, // don't report as hovered when nav focus is on this item + ImGuiButtonFlags_NoSetKeyOwner = 1 << 20, // don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) + ImGuiButtonFlags_NoTestKeyOwner = 1 << 21, // don't test key/input owner when polling the key (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) + ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold, + ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease, +}; + +// Extend ImGuiComboFlags_ +enum ImGuiComboFlagsPrivate_ +{ + ImGuiComboFlags_CustomPreview = 1 << 20, // enable BeginComboPreview() +}; + +// Extend ImGuiSliderFlags_ +enum ImGuiSliderFlagsPrivate_ +{ + ImGuiSliderFlags_Vertical = 1 << 20, // Should this slider be orientated vertically? + ImGuiSliderFlags_ReadOnly = 1 << 21, +}; + +// Extend ImGuiSelectableFlags_ +enum ImGuiSelectableFlagsPrivate_ +{ + // NB: need to be in sync with last value of ImGuiSelectableFlags_ + ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20, + ImGuiSelectableFlags_SelectOnNav = 1 << 21, // (WIP) Auto-select when moved into. This is not exposed in public API as to handle multi-select and modifiers we will need user to explicitly control focus scope. May be replaced with a BeginSelection() API. + ImGuiSelectableFlags_SelectOnClick = 1 << 22, // Override button behavior to react on Click (default is Click+Release) + ImGuiSelectableFlags_SelectOnRelease = 1 << 23, // Override button behavior to react on Release (default is Click+Release) + ImGuiSelectableFlags_SpanAvailWidth = 1 << 24, // Span all avail width even if we declared less for layout purpose. FIXME: We may be able to remove this (added in 6251d379, 2bcafc86 for menus) + ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25, // Set Nav/Focus ID on mouse hover (used by MenuItem) + ImGuiSelectableFlags_NoPadWithHalfSpacing = 1 << 26, // Disable padding each side with ItemSpacing * 0.5f + ImGuiSelectableFlags_NoSetKeyOwner = 1 << 27, // Don't set key/input owner on the initial click (note: mouse buttons are keys! often, the key in question will be ImGuiKey_MouseLeft!) +}; + +// Extend ImGuiTreeNodeFlags_ +enum ImGuiTreeNodeFlagsPrivate_ +{ + ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20, +}; + +enum ImGuiSeparatorFlags_ +{ + ImGuiSeparatorFlags_None = 0, + ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar + ImGuiSeparatorFlags_Vertical = 1 << 1, + ImGuiSeparatorFlags_SpanAllColumns = 1 << 2, +}; + +enum ImGuiTextFlags_ +{ + ImGuiTextFlags_None = 0, + ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0, +}; + +enum ImGuiTooltipFlags_ +{ + ImGuiTooltipFlags_None = 0, + ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0, // Override will clear/ignore previously submitted tooltip (defaults to append) +}; + +// FIXME: this is in development, not exposed/functional as a generic feature yet. +// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiLayoutType_ +{ + ImGuiLayoutType_Horizontal = 0, + ImGuiLayoutType_Vertical = 1 +}; + +enum ImGuiLogType +{ + ImGuiLogType_None = 0, + ImGuiLogType_TTY, + ImGuiLogType_File, + ImGuiLogType_Buffer, + ImGuiLogType_Clipboard, +}; + +// X/Y enums are fixed to 0/1 so they may be used to index ImVec2 +enum ImGuiAxis +{ + ImGuiAxis_None = -1, + ImGuiAxis_X = 0, + ImGuiAxis_Y = 1 +}; + +enum ImGuiPlotType +{ + ImGuiPlotType_Lines, + ImGuiPlotType_Histogram, +}; + +enum ImGuiPopupPositionPolicy +{ + ImGuiPopupPositionPolicy_Default, + ImGuiPopupPositionPolicy_ComboBox, + ImGuiPopupPositionPolicy_Tooltip, +}; + +struct ImGuiDataVarInfo +{ + ImGuiDataType Type; + ImU32 Count; // 1+ + ImU32 Offset; // Offset in parent structure + void* GetVarPtr(void* parent) const { return (void*)((unsigned char*)parent + Offset); } +}; + +struct ImGuiDataTypeTempStorage +{ + ImU8 Data[8]; // Can fit any data up to ImGuiDataType_COUNT +}; + +// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo(). +struct ImGuiDataTypeInfo +{ + size_t Size; // Size in bytes + const char* Name; // Short descriptive name for the type, for debugging + const char* PrintFmt; // Default printf format for the type + const char* ScanFmt; // Default scanf format for the type +}; + +// Extend ImGuiDataType_ +enum ImGuiDataTypePrivate_ +{ + ImGuiDataType_String = ImGuiDataType_COUNT + 1, + ImGuiDataType_Pointer, + ImGuiDataType_ID, +}; + +// Stacked color modifier, backup of modified data so we can restore it +struct ImGuiColorMod +{ + ImGuiCol Col; + ImVec4 BackupValue; +}; + +// Stacked style modifier, backup of modified data so we can restore it. Data type inferred from the variable. +struct ImGuiStyleMod +{ + ImGuiStyleVar VarIdx; + union { int BackupInt[2]; float BackupFloat[2]; }; + ImGuiStyleMod(ImGuiStyleVar idx, int v) { VarIdx = idx; BackupInt[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, float v) { VarIdx = idx; BackupFloat[0] = v; } + ImGuiStyleMod(ImGuiStyleVar idx, ImVec2 v) { VarIdx = idx; BackupFloat[0] = v.x; BackupFloat[1] = v.y; } +}; + +// Storage data for BeginComboPreview()/EndComboPreview() +struct IMGUI_API ImGuiComboPreviewData +{ + ImRect PreviewRect; + ImVec2 BackupCursorPos; + ImVec2 BackupCursorMaxPos; + ImVec2 BackupCursorPosPrevLine; + float BackupPrevLineTextBaseOffset; + ImGuiLayoutType BackupLayout; + + ImGuiComboPreviewData() { memset(this, 0, sizeof(*this)); } +}; + +// Stacked storage data for BeginGroup()/EndGroup() +struct IMGUI_API ImGuiGroupData +{ + ImGuiID WindowID; + ImVec2 BackupCursorPos; + ImVec2 BackupCursorMaxPos; + ImVec1 BackupIndent; + ImVec1 BackupGroupOffset; + ImVec2 BackupCurrLineSize; + float BackupCurrLineTextBaseOffset; + ImGuiID BackupActiveIdIsAlive; + bool BackupActiveIdPreviousFrameIsAlive; + bool BackupHoveredIdIsAlive; + bool EmitItem; +}; + +// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper. +struct IMGUI_API ImGuiMenuColumns +{ + ImU32 TotalWidth; + ImU32 NextTotalWidth; + ImU16 Spacing; + ImU16 OffsetIcon; // Always zero for now + ImU16 OffsetLabel; // Offsets are locked in Update() + ImU16 OffsetShortcut; + ImU16 OffsetMark; + ImU16 Widths[4]; // Width of: Icon, Label, Shortcut, Mark (accumulators for current frame) + + ImGuiMenuColumns() { memset(this, 0, sizeof(*this)); } + void Update(float spacing, bool window_reappearing); + float DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark); + void CalcNextTotalWidth(bool update_offsets); +}; + +// Internal state of the currently focused/edited text input box +// For a given item ID, access with ImGui::GetInputTextState() +struct IMGUI_API ImGuiInputTextState +{ + ImGuiContext* Ctx; // parent UI context (needs to be set explicitly by parent). + ImGuiID ID; // widget id owning the text state + int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 length is valid even if TextA is not. + ImVector TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer. + ImVector TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity. + ImVector InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered) + bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument) + int BufCapacityA; // end-user buffer capacity + float ScrollX; // horizontal scrolling/offset + ImStb::STB_TexteditState Stb; // state for stb_textedit.h + float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately + bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!) + bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection + bool Edited; // edited this frame + ImGuiInputTextFlags Flags; // copy of InputText() flags. may be used to check if e.g. ImGuiInputTextFlags_Password is set. + + ImGuiInputTextState() { memset(this, 0, sizeof(*this)); } + void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); } + void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); } + int GetUndoAvailCount() const { return Stb.undostate.undo_point; } + int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; } + void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation + + // Cursor & Selection + void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking + void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); } + bool HasSelection() const { return Stb.select_start != Stb.select_end; } + void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; } + int GetCursorPos() const { return Stb.cursor; } + int GetSelectionStart() const { return Stb.select_start; } + int GetSelectionEnd() const { return Stb.select_end; } + void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; } +}; + +// Storage for current popup stack +struct ImGuiPopupData +{ + ImGuiID PopupId; // Set on OpenPopup() + ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup() + ImGuiWindow* BackupNavWindow;// Set on OpenPopup(), a NavWindow that will be restored on popup close + int ParentNavLayer; // Resolved on BeginPopup(). Actually a ImGuiNavLayer type (declared down below), initialized to -1 which is not part of an enum, but serves well-enough as "not any of layers" value + int OpenFrameCount; // Set on OpenPopup() + ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items) + ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse) + ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup + + ImGuiPopupData() { memset(this, 0, sizeof(*this)); ParentNavLayer = OpenFrameCount = -1; } +}; + +enum ImGuiNextWindowDataFlags_ +{ + ImGuiNextWindowDataFlags_None = 0, + ImGuiNextWindowDataFlags_HasPos = 1 << 0, + ImGuiNextWindowDataFlags_HasSize = 1 << 1, + ImGuiNextWindowDataFlags_HasContentSize = 1 << 2, + ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3, + ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4, + ImGuiNextWindowDataFlags_HasFocus = 1 << 5, + ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6, + ImGuiNextWindowDataFlags_HasScroll = 1 << 7, +}; + +// Storage for SetNexWindow** functions +struct ImGuiNextWindowData +{ + ImGuiNextWindowDataFlags Flags; + ImGuiCond PosCond; + ImGuiCond SizeCond; + ImGuiCond CollapsedCond; + ImVec2 PosVal; + ImVec2 PosPivotVal; + ImVec2 SizeVal; + ImVec2 ContentSizeVal; + ImVec2 ScrollVal; + bool CollapsedVal; + ImRect SizeConstraintRect; + ImGuiSizeCallback SizeCallback; + void* SizeCallbackUserData; + float BgAlphaVal; // Override background alpha + ImVec2 MenuBarOffsetMinVal; // (Always on) This is not exposed publicly, so we don't clear it and it doesn't have a corresponding flag (could we? for consistency?) + + ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; } +}; + +enum ImGuiNextItemDataFlags_ +{ + ImGuiNextItemDataFlags_None = 0, + ImGuiNextItemDataFlags_HasWidth = 1 << 0, + ImGuiNextItemDataFlags_HasOpen = 1 << 1, +}; + +struct ImGuiNextItemData +{ + ImGuiNextItemDataFlags Flags; + float Width; // Set by SetNextItemWidth() + ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging) + ImGuiCond OpenCond; + bool OpenVal; // Set by SetNextItemOpen() + + ImGuiNextItemData() { memset(this, 0, sizeof(*this)); } + inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()! +}; + +// Status storage for the last submitted item +struct ImGuiLastItemData +{ + ImGuiID ID; + ImGuiItemFlags InFlags; // See ImGuiItemFlags_ + ImGuiItemStatusFlags StatusFlags; // See ImGuiItemStatusFlags_ + ImRect Rect; // Full rectangle + ImRect NavRect; // Navigation scoring rectangle (not displayed) + ImRect DisplayRect; // Display rectangle (only if ImGuiItemStatusFlags_HasDisplayRect is set) + + ImGuiLastItemData() { memset(this, 0, sizeof(*this)); } +}; + +struct IMGUI_API ImGuiStackSizes +{ + short SizeOfIDStack; + short SizeOfColorStack; + short SizeOfStyleVarStack; + short SizeOfFontStack; + short SizeOfFocusScopeStack; + short SizeOfGroupStack; + short SizeOfItemFlagsStack; + short SizeOfBeginPopupStack; + short SizeOfDisabledStack; + + ImGuiStackSizes() { memset(this, 0, sizeof(*this)); } + void SetToContextState(ImGuiContext* ctx); + void CompareWithContextState(ImGuiContext* ctx); +}; + +// Data saved for each window pushed into the stack +struct ImGuiWindowStackData +{ + ImGuiWindow* Window; + ImGuiLastItemData ParentLastItemDataBackup; + ImGuiStackSizes StackSizesOnBegin; // Store size of various stacks for asserting +}; + +struct ImGuiShrinkWidthItem +{ + int Index; + float Width; + float InitialWidth; +}; + +struct ImGuiPtrOrIndex +{ + void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool. + int Index; // Usually index in a main pool. + + ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; } + ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Inputs support +//----------------------------------------------------------------------------- + +// Bit array for named keys +typedef ImBitArray ImBitArrayForNamedKeys; + +// [Internal] Key ranges +#define ImGuiKey_LegacyNativeKey_BEGIN 0 +#define ImGuiKey_LegacyNativeKey_END 512 +#define ImGuiKey_Keyboard_BEGIN (ImGuiKey_NamedKey_BEGIN) +#define ImGuiKey_Keyboard_END (ImGuiKey_GamepadStart) +#define ImGuiKey_Gamepad_BEGIN (ImGuiKey_GamepadStart) +#define ImGuiKey_Gamepad_END (ImGuiKey_GamepadRStickDown + 1) +#define ImGuiKey_Mouse_BEGIN (ImGuiKey_MouseLeft) +#define ImGuiKey_Mouse_END (ImGuiKey_MouseWheelY + 1) +#define ImGuiKey_Aliases_BEGIN (ImGuiKey_Mouse_BEGIN) +#define ImGuiKey_Aliases_END (ImGuiKey_Mouse_END) + +// [Internal] Named shortcuts for Navigation +#define ImGuiKey_NavKeyboardTweakSlow ImGuiMod_Ctrl +#define ImGuiKey_NavKeyboardTweakFast ImGuiMod_Shift +#define ImGuiKey_NavGamepadTweakSlow ImGuiKey_GamepadL1 +#define ImGuiKey_NavGamepadTweakFast ImGuiKey_GamepadR1 +#define ImGuiKey_NavGamepadActivate ImGuiKey_GamepadFaceDown +#define ImGuiKey_NavGamepadCancel ImGuiKey_GamepadFaceRight +#define ImGuiKey_NavGamepadMenu ImGuiKey_GamepadFaceLeft +#define ImGuiKey_NavGamepadInput ImGuiKey_GamepadFaceUp + +enum ImGuiInputEventType +{ + ImGuiInputEventType_None = 0, + ImGuiInputEventType_MousePos, + ImGuiInputEventType_MouseWheel, + ImGuiInputEventType_MouseButton, + ImGuiInputEventType_Key, + ImGuiInputEventType_Text, + ImGuiInputEventType_Focus, + ImGuiInputEventType_COUNT +}; + +enum ImGuiInputSource +{ + ImGuiInputSource_None = 0, + ImGuiInputSource_Mouse, + ImGuiInputSource_Keyboard, + ImGuiInputSource_Gamepad, + ImGuiInputSource_Clipboard, // Currently only used by InputText() + ImGuiInputSource_Nav, // Stored in g.ActiveIdSource only + ImGuiInputSource_COUNT +}; + +// FIXME: Structures in the union below need to be declared as anonymous unions appears to be an extension? +// Using ImVec2() would fail on Clang 'union member 'MousePos' has a non-trivial default constructor' +struct ImGuiInputEventMousePos { float PosX, PosY; }; +struct ImGuiInputEventMouseWheel { float WheelX, WheelY; }; +struct ImGuiInputEventMouseButton { int Button; bool Down; }; +struct ImGuiInputEventKey { ImGuiKey Key; bool Down; float AnalogValue; }; +struct ImGuiInputEventText { unsigned int Char; }; +struct ImGuiInputEventAppFocused { bool Focused; }; + +struct ImGuiInputEvent +{ + ImGuiInputEventType Type; + ImGuiInputSource Source; + union + { + ImGuiInputEventMousePos MousePos; // if Type == ImGuiInputEventType_MousePos + ImGuiInputEventMouseWheel MouseWheel; // if Type == ImGuiInputEventType_MouseWheel + ImGuiInputEventMouseButton MouseButton; // if Type == ImGuiInputEventType_MouseButton + ImGuiInputEventKey Key; // if Type == ImGuiInputEventType_Key + ImGuiInputEventText Text; // if Type == ImGuiInputEventType_Text + ImGuiInputEventAppFocused AppFocused; // if Type == ImGuiInputEventType_Focus + }; + bool AddedByTestEngine; + + ImGuiInputEvent() { memset(this, 0, sizeof(*this)); } +}; + +// Input function taking an 'ImGuiID owner_id' argument defaults to (ImGuiKeyOwner_Any == 0) aka don't test ownership, which matches legacy behavior. +#define ImGuiKeyOwner_Any ((ImGuiID)0) // Accept key that have an owner, UNLESS a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. +#define ImGuiKeyOwner_None ((ImGuiID)-1) // Require key to have no owner. + +typedef ImS16 ImGuiKeyRoutingIndex; + +// Routing table entry (sizeof() == 16 bytes) +struct ImGuiKeyRoutingData +{ + ImGuiKeyRoutingIndex NextEntryIndex; + ImU16 Mods; // Technically we'd only need 4-bits but for simplify we store ImGuiMod_ values which need 16-bits. ImGuiMod_Shortcut is already translated to Ctrl/Super. + ImU8 RoutingNextScore; // Lower is better (0: perfect score) + ImGuiID RoutingCurr; + ImGuiID RoutingNext; + + ImGuiKeyRoutingData() { NextEntryIndex = -1; Mods = 0; RoutingNextScore = 255; RoutingCurr = RoutingNext = ImGuiKeyOwner_None; } +}; + +// Routing table: maintain a desired owner for each possible key-chord (key + mods), and setup owner in NewFrame() when mods are matching. +// Stored in main context (1 instance) +struct ImGuiKeyRoutingTable +{ + ImGuiKeyRoutingIndex Index[ImGuiKey_NamedKey_COUNT]; // Index of first entry in Entries[] + ImVector Entries; + ImVector EntriesNext; // Double-buffer to avoid reallocation (could use a shared buffer) + + ImGuiKeyRoutingTable() { Clear(); } + void Clear() { for (int n = 0; n < IM_ARRAYSIZE(Index); n++) Index[n] = -1; Entries.clear(); EntriesNext.clear(); } +}; + +// This extends ImGuiKeyData but only for named keys (legacy keys don't support the new features) +// Stored in main context (1 per named key). In the future it might be merged into ImGuiKeyData. +struct ImGuiKeyOwnerData +{ + ImGuiID OwnerCurr; + ImGuiID OwnerNext; + bool LockThisFrame; // Reading this key requires explicit owner id (until end of frame). Set by ImGuiInputFlags_LockThisFrame. + bool LockUntilRelease; // Reading this key requires explicit owner id (until key is released). Set by ImGuiInputFlags_LockUntilRelease. When this is true LockThisFrame is always true as well. + + ImGuiKeyOwnerData() { OwnerCurr = OwnerNext = ImGuiKeyOwner_None; LockThisFrame = LockUntilRelease = false; } +}; + +// Flags for extended versions of IsKeyPressed(), IsMouseClicked(), Shortcut(), SetKeyOwner(), SetItemKeyOwner() +// Don't mistake with ImGuiInputTextFlags! (for ImGui::InputText() function) +enum ImGuiInputFlags_ +{ + // Flags for IsKeyPressed(), IsMouseClicked(), Shortcut() + ImGuiInputFlags_None = 0, + ImGuiInputFlags_Repeat = 1 << 0, // Return true on successive repeats. Default for legacy IsKeyPressed(). NOT Default for legacy IsMouseClicked(). MUST BE == 1. + ImGuiInputFlags_RepeatRateDefault = 1 << 1, // Repeat rate: Regular (default) + ImGuiInputFlags_RepeatRateNavMove = 1 << 2, // Repeat rate: Fast + ImGuiInputFlags_RepeatRateNavTweak = 1 << 3, // Repeat rate: Faster + ImGuiInputFlags_RepeatRateMask_ = ImGuiInputFlags_RepeatRateDefault | ImGuiInputFlags_RepeatRateNavMove | ImGuiInputFlags_RepeatRateNavTweak, + + // Flags for SetItemKeyOwner() + ImGuiInputFlags_CondHovered = 1 << 4, // Only set if item is hovered (default to both) + ImGuiInputFlags_CondActive = 1 << 5, // Only set if item is active (default to both) + ImGuiInputFlags_CondDefault_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, + ImGuiInputFlags_CondMask_ = ImGuiInputFlags_CondHovered | ImGuiInputFlags_CondActive, + + // Flags for SetKeyOwner(), SetItemKeyOwner() + ImGuiInputFlags_LockThisFrame = 1 << 6, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared at end of frame. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. + ImGuiInputFlags_LockUntilRelease = 1 << 7, // Access to key data will require EXPLICIT owner ID (ImGuiKeyOwner_Any/0 will NOT accepted for polling). Cleared when the key is released or at end of each frame if key is released. This is useful to make input-owner-aware code steal keys from non-input-owner-aware code. + + // Routing policies for Shortcut() + low-level SetShortcutRouting() + // - The general idea is that several callers register interest in a shortcut, and only one owner gets it. + // - When a policy (other than _RouteAlways) is set, Shortcut() will register itself with SetShortcutRouting(), + // allowing the system to decide where to route the input among other route-aware calls. + // - Shortcut() uses ImGuiInputFlags_RouteFocused by default: meaning that a simple Shortcut() poll + // will register a route and only succeed when parent window is in the focus stack and if no-one + // with a higher priority is claiming the shortcut. + // - Using ImGuiInputFlags_RouteAlways is roughly equivalent to doing e.g. IsKeyPressed(key) + testing mods. + // - Priorities: GlobalHigh > Focused (when owner is active item) > Global > Focused (when focused window) > GlobalLow. + // - Can select only 1 policy among all available. + ImGuiInputFlags_RouteFocused = 1 << 8, // (Default) Register focused route: Accept inputs if window is in focus stack. Deep-most focused window takes inputs. ActiveId takes inputs over deep-most focused window. + ImGuiInputFlags_RouteGlobalLow = 1 << 9, // Register route globally (lowest priority: unless a focused window or active item registered the route) -> recommended Global priority. + ImGuiInputFlags_RouteGlobal = 1 << 10, // Register route globally (medium priority: unless an active item registered the route, e.g. CTRL+A registered by InputText). + ImGuiInputFlags_RouteGlobalHigh = 1 << 11, // Register route globally (highest priority: unlikely you need to use that: will interfere with every active items) + ImGuiInputFlags_RouteMask_ = ImGuiInputFlags_RouteFocused | ImGuiInputFlags_RouteGlobal | ImGuiInputFlags_RouteGlobalLow | ImGuiInputFlags_RouteGlobalHigh, // _Always not part of this! + ImGuiInputFlags_RouteAlways = 1 << 12, // Do not register route, poll keys directly. + ImGuiInputFlags_RouteUnlessBgFocused= 1 << 13, // Global routes will not be applied if underlying background/void is focused (== no Dear ImGui windows are focused). Useful for overlay applications. + ImGuiInputFlags_RouteExtraMask_ = ImGuiInputFlags_RouteAlways | ImGuiInputFlags_RouteUnlessBgFocused, + + // [Internal] Mask of which function support which flags + ImGuiInputFlags_SupportedByIsKeyPressed = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_, + ImGuiInputFlags_SupportedByShortcut = ImGuiInputFlags_Repeat | ImGuiInputFlags_RepeatRateMask_ | ImGuiInputFlags_RouteMask_ | ImGuiInputFlags_RouteExtraMask_, + ImGuiInputFlags_SupportedBySetKeyOwner = ImGuiInputFlags_LockThisFrame | ImGuiInputFlags_LockUntilRelease, + ImGuiInputFlags_SupportedBySetItemKeyOwner = ImGuiInputFlags_SupportedBySetKeyOwner | ImGuiInputFlags_CondMask_, +}; + +//----------------------------------------------------------------------------- +// [SECTION] Clipper support +//----------------------------------------------------------------------------- + +struct ImGuiListClipperRange +{ + int Min; + int Max; + bool PosToIndexConvert; // Begin/End are absolute position (will be converted to indices later) + ImS8 PosToIndexOffsetMin; // Add to Min after converting to indices + ImS8 PosToIndexOffsetMax; // Add to Min after converting to indices + + static ImGuiListClipperRange FromIndices(int min, int max) { ImGuiListClipperRange r = { min, max, false, 0, 0 }; return r; } + static ImGuiListClipperRange FromPositions(float y1, float y2, int off_min, int off_max) { ImGuiListClipperRange r = { (int)y1, (int)y2, true, (ImS8)off_min, (ImS8)off_max }; return r; } +}; + +// Temporary clipper data, buffers shared/reused between instances +struct ImGuiListClipperData +{ + ImGuiListClipper* ListClipper; + float LossynessOffset; + int StepNo; + int ItemsFrozen; + ImVector Ranges; + + ImGuiListClipperData() { memset(this, 0, sizeof(*this)); } + void Reset(ImGuiListClipper* clipper) { ListClipper = clipper; StepNo = ItemsFrozen = 0; Ranges.resize(0); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Navigation support +//----------------------------------------------------------------------------- + +enum ImGuiActivateFlags_ +{ + ImGuiActivateFlags_None = 0, + ImGuiActivateFlags_PreferInput = 1 << 0, // Favor activation that requires keyboard text input (e.g. for Slider/Drag). Default for Enter key. + ImGuiActivateFlags_PreferTweak = 1 << 1, // Favor activation for tweaking with arrows or gamepad (e.g. for Slider/Drag). Default for Space key and if keyboard is not used. + ImGuiActivateFlags_TryToPreserveState = 1 << 2, // Request widget to preserve state if it can (e.g. InputText will try to preserve cursor/selection) +}; + +// Early work-in-progress API for ScrollToItem() +enum ImGuiScrollFlags_ +{ + ImGuiScrollFlags_None = 0, + ImGuiScrollFlags_KeepVisibleEdgeX = 1 << 0, // If item is not visible: scroll as little as possible on X axis to bring item back into view [default for X axis] + ImGuiScrollFlags_KeepVisibleEdgeY = 1 << 1, // If item is not visible: scroll as little as possible on Y axis to bring item back into view [default for Y axis for windows that are already visible] + ImGuiScrollFlags_KeepVisibleCenterX = 1 << 2, // If item is not visible: scroll to make the item centered on X axis [rarely used] + ImGuiScrollFlags_KeepVisibleCenterY = 1 << 3, // If item is not visible: scroll to make the item centered on Y axis + ImGuiScrollFlags_AlwaysCenterX = 1 << 4, // Always center the result item on X axis [rarely used] + ImGuiScrollFlags_AlwaysCenterY = 1 << 5, // Always center the result item on Y axis [default for Y axis for appearing window) + ImGuiScrollFlags_NoScrollParent = 1 << 6, // Disable forwarding scrolling to parent window if required to keep item/rect visible (only scroll window the function was applied to). + ImGuiScrollFlags_MaskX_ = ImGuiScrollFlags_KeepVisibleEdgeX | ImGuiScrollFlags_KeepVisibleCenterX | ImGuiScrollFlags_AlwaysCenterX, + ImGuiScrollFlags_MaskY_ = ImGuiScrollFlags_KeepVisibleEdgeY | ImGuiScrollFlags_KeepVisibleCenterY | ImGuiScrollFlags_AlwaysCenterY, +}; + +enum ImGuiNavHighlightFlags_ +{ + ImGuiNavHighlightFlags_None = 0, + ImGuiNavHighlightFlags_TypeDefault = 1 << 0, + ImGuiNavHighlightFlags_TypeThin = 1 << 1, + ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse. + ImGuiNavHighlightFlags_NoRounding = 1 << 3, +}; + +enum ImGuiNavMoveFlags_ +{ + ImGuiNavMoveFlags_None = 0, + ImGuiNavMoveFlags_LoopX = 1 << 0, // On failed request, restart from opposite side + ImGuiNavMoveFlags_LoopY = 1 << 1, + ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left) + ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful but provided for completeness + ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place) + ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisible that only comprise elements that are already fully visible (used by PageUp/PageDown) + ImGuiNavMoveFlags_ScrollToEdgeY = 1 << 6, // Force scrolling to min/max (used by Home/End) // FIXME-NAV: Aim to remove or reword, probably unnecessary + ImGuiNavMoveFlags_Forwarded = 1 << 7, + ImGuiNavMoveFlags_DebugNoResult = 1 << 8, // Dummy scoring for debug purpose, don't apply result + ImGuiNavMoveFlags_FocusApi = 1 << 9, + ImGuiNavMoveFlags_Tabbing = 1 << 10, // == Focus + Activate if item is Inputable + DontChangeNavHighlight + ImGuiNavMoveFlags_Activate = 1 << 11, + ImGuiNavMoveFlags_DontSetNavHighlight = 1 << 12, // Do not alter the visible state of keyboard vs mouse nav highlight +}; + +enum ImGuiNavLayer +{ + ImGuiNavLayer_Main = 0, // Main scrolling layer + ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt) + ImGuiNavLayer_COUNT +}; + +struct ImGuiNavItemData +{ + ImGuiWindow* Window; // Init,Move // Best candidate window (result->ItemWindow->RootWindowForNav == request->Window) + ImGuiID ID; // Init,Move // Best candidate item ID + ImGuiID FocusScopeId; // Init,Move // Best candidate focus scope ID + ImRect RectRel; // Init,Move // Best candidate bounding box in window relative space + ImGuiItemFlags InFlags; // ????,Move // Best candidate item flags + float DistBox; // Move // Best candidate box distance to current NavId + float DistCenter; // Move // Best candidate center distance to current NavId + float DistAxial; // Move // Best candidate axial distance to current NavId + + ImGuiNavItemData() { Clear(); } + void Clear() { Window = NULL; ID = FocusScopeId = 0; InFlags = 0; DistBox = DistCenter = DistAxial = FLT_MAX; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Columns support +//----------------------------------------------------------------------------- + +// Flags for internal's BeginColumns(). Prefix using BeginTable() nowadays! +enum ImGuiOldColumnFlags_ +{ + ImGuiOldColumnFlags_None = 0, + ImGuiOldColumnFlags_NoBorder = 1 << 0, // Disable column dividers + ImGuiOldColumnFlags_NoResize = 1 << 1, // Disable resizing columns when clicking on the dividers + ImGuiOldColumnFlags_NoPreserveWidths = 1 << 2, // Disable column width preservation when adjusting columns + ImGuiOldColumnFlags_NoForceWithinWindow = 1 << 3, // Disable forcing columns to fit within window + ImGuiOldColumnFlags_GrowParentContentsSize = 1 << 4, // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove. + + // Obsolete names (will be removed) +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + ImGuiColumnsFlags_None = ImGuiOldColumnFlags_None, + ImGuiColumnsFlags_NoBorder = ImGuiOldColumnFlags_NoBorder, + ImGuiColumnsFlags_NoResize = ImGuiOldColumnFlags_NoResize, + ImGuiColumnsFlags_NoPreserveWidths = ImGuiOldColumnFlags_NoPreserveWidths, + ImGuiColumnsFlags_NoForceWithinWindow = ImGuiOldColumnFlags_NoForceWithinWindow, + ImGuiColumnsFlags_GrowParentContentsSize = ImGuiOldColumnFlags_GrowParentContentsSize, +#endif +}; + +struct ImGuiOldColumnData +{ + float OffsetNorm; // Column start offset, normalized 0.0 (far left) -> 1.0 (far right) + float OffsetNormBeforeResize; + ImGuiOldColumnFlags Flags; // Not exposed + ImRect ClipRect; + + ImGuiOldColumnData() { memset(this, 0, sizeof(*this)); } +}; + +struct ImGuiOldColumns +{ + ImGuiID ID; + ImGuiOldColumnFlags Flags; + bool IsFirstFrame; + bool IsBeingResized; + int Current; + int Count; + float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x + float LineMinY, LineMaxY; + float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns() + float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns() + ImRect HostInitialClipRect; // Backup of ClipRect at the time of BeginColumns() + ImRect HostBackupClipRect; // Backup of ClipRect during PushColumnsBackground()/PopColumnsBackground() + ImRect HostBackupParentWorkRect;//Backup of WorkRect at the time of BeginColumns() + ImVector Columns; + ImDrawListSplitter Splitter; + + ImGuiOldColumns() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Multi-select support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_MULTI_SELECT +// +#endif // #ifdef IMGUI_HAS_MULTI_SELECT + +//----------------------------------------------------------------------------- +// [SECTION] Docking support +//----------------------------------------------------------------------------- + +#ifdef IMGUI_HAS_DOCK +// +#endif // #ifdef IMGUI_HAS_DOCK + +//----------------------------------------------------------------------------- +// [SECTION] Viewport support +//----------------------------------------------------------------------------- + +// ImGuiViewport Private/Internals fields (cardinal sin: we are using inheritance!) +// Every instance of ImGuiViewport is in fact a ImGuiViewportP. +struct ImGuiViewportP : public ImGuiViewport +{ + int DrawListsLastFrame[2]; // Last frame number the background (0) and foreground (1) draw lists were used + ImDrawList* DrawLists[2]; // Convenience background (0) and foreground (1) draw lists. We use them to draw software mouser cursor when io.MouseDrawCursor is set and to draw most debug overlays. + ImDrawData DrawDataP; + ImDrawDataBuilder DrawDataBuilder; + + ImVec2 WorkOffsetMin; // Work Area: Offset from Pos to top-left corner of Work Area. Generally (0,0) or (0,+main_menu_bar_height). Work Area is Full Area but without menu-bars/status-bars (so WorkArea always fit inside Pos/Size!) + ImVec2 WorkOffsetMax; // Work Area: Offset from Pos+Size to bottom-right corner of Work Area. Generally (0,0) or (0,-status_bar_height). + ImVec2 BuildWorkOffsetMin; // Work Area: Offset being built during current frame. Generally >= 0.0f. + ImVec2 BuildWorkOffsetMax; // Work Area: Offset being built during current frame. Generally <= 0.0f. + + ImGuiViewportP() { DrawListsLastFrame[0] = DrawListsLastFrame[1] = -1; DrawLists[0] = DrawLists[1] = NULL; } + ~ImGuiViewportP() { if (DrawLists[0]) IM_DELETE(DrawLists[0]); if (DrawLists[1]) IM_DELETE(DrawLists[1]); } + + // Calculate work rect pos/size given a set of offset (we have 1 pair of offset for rect locked from last frame data, and 1 pair for currently building rect) + ImVec2 CalcWorkRectPos(const ImVec2& off_min) const { return ImVec2(Pos.x + off_min.x, Pos.y + off_min.y); } + ImVec2 CalcWorkRectSize(const ImVec2& off_min, const ImVec2& off_max) const { return ImVec2(ImMax(0.0f, Size.x - off_min.x + off_max.x), ImMax(0.0f, Size.y - off_min.y + off_max.y)); } + void UpdateWorkRect() { WorkPos = CalcWorkRectPos(WorkOffsetMin); WorkSize = CalcWorkRectSize(WorkOffsetMin, WorkOffsetMax); } // Update public fields + + // Helpers to retrieve ImRect (we don't need to store BuildWorkRect as every access tend to change it, hence the code asymmetry) + ImRect GetMainRect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + ImRect GetWorkRect() const { return ImRect(WorkPos.x, WorkPos.y, WorkPos.x + WorkSize.x, WorkPos.y + WorkSize.y); } + ImRect GetBuildWorkRect() const { ImVec2 pos = CalcWorkRectPos(BuildWorkOffsetMin); ImVec2 size = CalcWorkRectSize(BuildWorkOffsetMin, BuildWorkOffsetMax); return ImRect(pos.x, pos.y, pos.x + size.x, pos.y + size.y); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Settings support +//----------------------------------------------------------------------------- + +// Windows data saved in imgui.ini file +// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily. +// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure) +struct ImGuiWindowSettings +{ + ImGuiID ID; + ImVec2ih Pos; + ImVec2ih Size; + bool Collapsed; + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + bool WantDelete; // Set to invalidate/delete the settings entry + + ImGuiWindowSettings() { memset(this, 0, sizeof(*this)); } + char* GetName() { return (char*)(this + 1); } +}; + +struct ImGuiSettingsHandler +{ + const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']' + ImGuiID TypeHash; // == ImHashStr(TypeName) + void (*ClearAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Clear all settings data + void (*ReadInitFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called before reading (in registration order) + void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]" + void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry + void (*ApplyAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler); // Read: Called after reading (in registration order) + void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf' + void* UserData; + + ImGuiSettingsHandler() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Localization support +//----------------------------------------------------------------------------- + +// This is experimental and not officially supported, it'll probably fall short of features, if/when it does we may backtrack. +enum ImGuiLocKey : int +{ + ImGuiLocKey_TableSizeOne, + ImGuiLocKey_TableSizeAllFit, + ImGuiLocKey_TableSizeAllDefault, + ImGuiLocKey_TableResetOrder, + ImGuiLocKey_WindowingMainMenuBar, + ImGuiLocKey_WindowingPopup, + ImGuiLocKey_WindowingUntitled, + ImGuiLocKey_COUNT +}; + +struct ImGuiLocEntry +{ + ImGuiLocKey Key; + const char* Text; +}; + + +//----------------------------------------------------------------------------- +// [SECTION] Metrics, Debug Tools +//----------------------------------------------------------------------------- + +enum ImGuiDebugLogFlags_ +{ + // Event types + ImGuiDebugLogFlags_None = 0, + ImGuiDebugLogFlags_EventActiveId = 1 << 0, + ImGuiDebugLogFlags_EventFocus = 1 << 1, + ImGuiDebugLogFlags_EventPopup = 1 << 2, + ImGuiDebugLogFlags_EventNav = 1 << 3, + ImGuiDebugLogFlags_EventClipper = 1 << 4, + ImGuiDebugLogFlags_EventIO = 1 << 5, + ImGuiDebugLogFlags_EventMask_ = ImGuiDebugLogFlags_EventActiveId | ImGuiDebugLogFlags_EventFocus | ImGuiDebugLogFlags_EventPopup | ImGuiDebugLogFlags_EventNav | ImGuiDebugLogFlags_EventClipper | ImGuiDebugLogFlags_EventIO, + ImGuiDebugLogFlags_OutputToTTY = 1 << 10, // Also send output to TTY +}; + +struct ImGuiMetricsConfig +{ + bool ShowDebugLog = false; + bool ShowStackTool = false; + bool ShowWindowsRects = false; + bool ShowWindowsBeginOrder = false; + bool ShowTablesRects = false; + bool ShowDrawCmdMesh = true; + bool ShowDrawCmdBoundingBoxes = true; + bool ShowAtlasTintedWithTextColor = false; + int ShowWindowsRectsType = -1; + int ShowTablesRectsType = -1; +}; + +struct ImGuiStackLevelInfo +{ + ImGuiID ID; + ImS8 QueryFrameCount; // >= 1: Query in progress + bool QuerySuccess; // Obtained result from DebugHookIdInfo() + ImGuiDataType DataType : 8; + char Desc[57]; // Arbitrarily sized buffer to hold a result (FIXME: could replace Results[] with a chunk stream?) FIXME: Now that we added CTRL+C this should be fixed. + + ImGuiStackLevelInfo() { memset(this, 0, sizeof(*this)); } +}; + +// State for Stack tool queries +struct ImGuiStackTool +{ + int LastActiveFrame; + int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level + ImGuiID QueryId; // ID to query details for + ImVector Results; + bool CopyToClipboardOnCtrlC; + float CopyToClipboardLastTime; + + ImGuiStackTool() { memset(this, 0, sizeof(*this)); CopyToClipboardLastTime = -FLT_MAX; } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Generic context hooks +//----------------------------------------------------------------------------- + +typedef void (*ImGuiContextHookCallback)(ImGuiContext* ctx, ImGuiContextHook* hook); +enum ImGuiContextHookType { ImGuiContextHookType_NewFramePre, ImGuiContextHookType_NewFramePost, ImGuiContextHookType_EndFramePre, ImGuiContextHookType_EndFramePost, ImGuiContextHookType_RenderPre, ImGuiContextHookType_RenderPost, ImGuiContextHookType_Shutdown, ImGuiContextHookType_PendingRemoval_ }; + +struct ImGuiContextHook +{ + ImGuiID HookId; // A unique ID assigned by AddContextHook() + ImGuiContextHookType Type; + ImGuiID Owner; + ImGuiContextHookCallback Callback; + void* UserData; + + ImGuiContextHook() { memset(this, 0, sizeof(*this)); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiContext (main Dear ImGui context) +//----------------------------------------------------------------------------- + +struct ImGuiContext +{ + bool Initialized; + bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it. + ImGuiIO IO; + ImVector InputEventsQueue; // Input events which will be tricked/written into IO structure. + ImVector InputEventsTrail; // Past input events processed in NewFrame(). This is to allow domain-specific application to access e.g mouse/pen trail. + ImGuiStyle Style; + ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back() + float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window. + float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height. + ImDrawListSharedData DrawListSharedData; + double Time; + int FrameCount; + int FrameCountEnded; + int FrameCountRendered; + bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame() + bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed + bool WithinEndChild; // Set within EndChild() + bool GcCompactAll; // Request full GC + bool TestEngineHookItems; // Will call test engine hooks: ImGuiTestEngineHook_ItemAdd(), ImGuiTestEngineHook_ItemInfo(), ImGuiTestEngineHook_Log() + void* TestEngine; // Test engine user data + + // Windows state + ImVector Windows; // Windows, sorted in display order, back to front + ImVector WindowsFocusOrder; // Root windows, sorted in focus order, back to front. + ImVector WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child + ImVector CurrentWindowStack; + ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow* + int WindowsActiveCount; // Number of unique windows submitted by frame + ImVec2 WindowsHoverPadding; // Padding around resizable windows for which hovering on counts as hovering the window == ImMax(style.TouchExtraPadding, WINDOWS_HOVER_PADDING) + ImGuiWindow* CurrentWindow; // Window being drawn into + ImGuiWindow* HoveredWindow; // Window the mouse is hovering. Will typically catch mouse inputs. + ImGuiWindow* HoveredWindowUnderMovingWindow; // Hovered window ignoring MovingWindow. Only set if MovingWindow is set. + ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actual window that is moved is generally MovingWindow->RootWindow. + ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window. + ImVec2 WheelingWindowRefMousePos; + int WheelingWindowStartFrame; // This may be set one frame before WheelingWindow is != NULL + float WheelingWindowReleaseTimer; + ImVec2 WheelingWindowWheelRemainder; + ImVec2 WheelingAxisAvg; + + // Item/widgets state and tracking information + ImGuiID DebugHookIdInfo; // Will call core hooks: DebugHookIdInfo() from GetID functions, used by Stack Tool [next HoveredId/ActiveId to not pull in an extra cache-line] + ImGuiID HoveredId; // Hovered widget, filled during the frame + ImGuiID HoveredIdPreviousFrame; + bool HoveredIdAllowOverlap; + bool HoveredIdDisabled; // At least one widget passed the rect test, but has been discarded by disabled flag or popup inhibit. May be true even if HoveredId == 0. + float HoveredIdTimer; // Measure contiguous hovering time + float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active + ImGuiID ActiveId; // Active widget + ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame) + float ActiveIdTimer; + bool ActiveIdIsJustActivated; // Set at the time of activation for one frame + bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always) + bool ActiveIdNoClearOnFocusLoss; // Disable losing active id if the active id window gets unfocused. + bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch. + bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state. + bool ActiveIdHasBeenEditedThisFrame; + ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior) + ImGuiWindow* ActiveIdWindow; + ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard) + int ActiveIdMouseButton; + ImGuiID ActiveIdPreviousFrame; + bool ActiveIdPreviousFrameIsAlive; + bool ActiveIdPreviousFrameHasBeenEditedBefore; + ImGuiWindow* ActiveIdPreviousFrameWindow; + ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation. + float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation. + + // [EXPERIMENTAL] Key/Input Ownership + Shortcut Routing system + // - The idea is that instead of "eating" a given key, we can link to an owner. + // - Input query can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Routing is requested ahead of time for a given chord (Key + Mods) and granted in NewFrame(). + ImGuiKeyOwnerData KeysOwnerData[ImGuiKey_NamedKey_COUNT]; + ImGuiKeyRoutingTable KeysRoutingTable; + ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those nav move requests (e.g. can activate a button and move away from it) + bool ActiveIdUsingAllKeyboardKeys; // Active widget will want to read all keyboard keys inputs. (FIXME: This is a shortcut for not taking ownership of 100+ keys but perhaps best to not have the inconsistency) +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + ImU32 ActiveIdUsingNavInputMask; // If you used this. Since (IMGUI_VERSION_NUM >= 18804) : 'g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);' becomes 'SetKeyOwner(ImGuiKey_Escape, g.ActiveId) and/or SetKeyOwner(ImGuiKey_NavGamepadCancel, g.ActiveId);' +#endif + + // Next window/item data + ImGuiID CurrentFocusScopeId; // == g.FocusScopeStack.back() + ImGuiItemFlags CurrentItemFlags; // == g.ItemFlagsStack.back() + ImGuiID DebugLocateId; // Storage for DebugLocateItemOnHover() feature: this is read by ItemAdd() so we keep it in a hot/cached location + ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions + ImGuiLastItemData LastItemData; // Storage for last submitted item (setup by ItemAdd) + ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions + + // Shared stacks + ImVector ColorStack; // Stack for PushStyleColor()/PopStyleColor() - inherited by Begin() + ImVector StyleVarStack; // Stack for PushStyleVar()/PopStyleVar() - inherited by Begin() + ImVector FontStack; // Stack for PushFont()/PopFont() - inherited by Begin() + ImVector FocusScopeStack; // Stack for PushFocusScope()/PopFocusScope() - inherited by BeginChild(), pushed into by Begin() + ImVectorItemFlagsStack; // Stack for PushItemFlag()/PopItemFlag() - inherited by Begin() + ImVectorGroupStack; // Stack for BeginGroup()/EndGroup() - not inherited by Begin() + ImVectorOpenPopupStack; // Which popups are open (persistent) + ImVectorBeginPopupStack; // Which level of BeginPopup() we are in (reset every frame) + int BeginMenuCount; + + // Viewports + ImVector Viewports; // Active viewports (Size==1 in 'master' branch). Each viewports hold their copy of ImDrawData. + + // Gamepad/keyboard Navigation + ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusedWindow' + ImGuiID NavId; // Focused item for navigation + ImGuiID NavFocusScopeId; // Identify a selection scope (selection code often wants to "clear other items" when landing on an item of the selection set) + ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && (IsKeyPressed(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate)) ? NavId : 0, also set when calling ActivateItem() + ImGuiID NavActivateDownId; // ~~ IsKeyDown(ImGuiKey_Space) || IsKeyDown(ImGuiKey_Enter) || IsKeyDown(ImGuiKey_NavGamepadActivate) ? NavId : 0 + ImGuiID NavActivatePressedId; // ~~ IsKeyPressed(ImGuiKey_Space) || IsKeyPressed(ImGuiKey_Enter) || IsKeyPressed(ImGuiKey_NavGamepadActivate) ? NavId : 0 (no repeat) + ImGuiActivateFlags NavActivateFlags; + ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest). + ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest). + ImGuiKeyChord NavJustMovedToKeyMods; + ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame. + ImGuiActivateFlags NavNextActivateFlags; + ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard. + ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later. + bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRectRel is valid + bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default) + bool NavDisableHighlight; // When user starts using mouse, we hide gamepad/keyboard highlight (NB: but they are still available, which is why NavDisableHighlight isn't always != NavDisableMouseHover) + bool NavDisableMouseHover; // When user starts using gamepad/keyboard, we hide mouse hovering highlight until mouse is touched again. + + // Navigation: Init & Move Requests + bool NavAnyRequest; // ~~ NavMoveRequest || NavInitRequest this is to perform early out in ItemAdd() + bool NavInitRequest; // Init request for appearing window to select first item + bool NavInitRequestFromMove; + ImGuiID NavInitResultId; // Init request result (first item of the window, or one for which SetItemDefaultFocus() was called) + ImRect NavInitResultRectRel; // Init request result rectangle (relative to parent window) + bool NavMoveSubmitted; // Move request submitted, will process result on next NewFrame() + bool NavMoveScoringItems; // Move request submitted, still scoring incoming items + bool NavMoveForwardToNextFrame; + ImGuiNavMoveFlags NavMoveFlags; + ImGuiScrollFlags NavMoveScrollFlags; + ImGuiKeyChord NavMoveKeyMods; + ImGuiDir NavMoveDir; // Direction of the move request (left/right/up/down) + ImGuiDir NavMoveDirForDebug; + ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename? + ImRect NavScoringRect; // Rectangle used for scoring, in screen space. Based of window->NavRectRel[], modified for directional navigation scoring. + ImRect NavScoringNoClipRect; // Some nav operations (such as PageUp/PageDown) enforce a region which clipper will attempt to always keep submitted + int NavScoringDebugCount; // Metrics for debugging + int NavTabbingDir; // Generally -1 or +1, 0 when tabbing without a nav id + int NavTabbingCounter; // >0 when counting items for tabbing + ImGuiNavItemData NavMoveResultLocal; // Best move request candidate within NavWindow + ImGuiNavItemData NavMoveResultLocalVisible; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag) + ImGuiNavItemData NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag) + ImGuiNavItemData NavTabbingResultFirst; // First tabbing request candidate within NavWindow and flattened hierarchy + + // Navigation: Windowing (CTRL+TAB for list, or Menu button + keys or directional pads to move/resize) + ImGuiKeyChord ConfigNavWindowingKeyNext; // = ImGuiMod_Ctrl | ImGuiKey_Tab, for reconfiguration (see #4828) + ImGuiKeyChord ConfigNavWindowingKeyPrev; // = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab + ImGuiWindow* NavWindowingTarget; // Target window when doing CTRL+Tab (or Pad Menu + FocusPrev/Next), this window is temporarily displayed top-most! + ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f, so the fade-out can stay on it. + ImGuiWindow* NavWindowingListWindow; // Internal window actually listing the CTRL+Tab contents + float NavWindowingTimer; + float NavWindowingHighlightAlpha; + bool NavWindowingToggleLayer; + ImVec2 NavWindowingAccumDeltaPos; + ImVec2 NavWindowingAccumDeltaSize; + + // Render + float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list) + ImGuiMouseCursor MouseCursor; + + // Drag and Drop + bool DragDropActive; + bool DragDropWithinSource; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag source. + bool DragDropWithinTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block for a drag target. + ImGuiDragDropFlags DragDropSourceFlags; + int DragDropSourceFrameCount; + int DragDropMouseButton; + ImGuiPayload DragDropPayload; + ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping) + ImGuiID DragDropTargetId; + ImGuiDragDropFlags DragDropAcceptFlags; + float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface) + ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload) + ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets) + int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source + ImGuiID DragDropHoldJustPressedId; // Set when holding a payload just made ButtonBehavior() return a press. + ImVector DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size + unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads + + // Clipper + int ClipperTempDataStacked; + ImVector ClipperTempData; + + // Tables + ImGuiTable* CurrentTable; + int TablesTempDataStacked; // Temporary table data size (because we leave previous instances undestructed, we generally don't use TablesTempData.Size) + ImVector TablesTempData; // Temporary table data (buffers reused/shared across instances, support nesting) + ImPool Tables; // Persistent table data + ImVector TablesLastTimeActive; // Last used timestamp of each tables (SOA, for efficient GC) + ImVector DrawChannelsTempMergeBuffer; + + // Tab bars + ImGuiTabBar* CurrentTabBar; + ImPool TabBars; + ImVector CurrentTabBarStack; + ImVector ShrinkWidthBuffer; + + // Hover Delay system + ImGuiID HoverDelayId; + ImGuiID HoverDelayIdPreviousFrame; + float HoverDelayTimer; // Currently used IsItemHovered(), generally inferred from g.HoveredIdTimer but kept uncleared until clear timer elapse. + float HoverDelayClearTimer; // Currently used IsItemHovered(): grace time before g.TooltipHoverTimer gets cleared. + + // Widget state + ImVec2 MouseLastValidPos; + ImGuiInputTextState InputTextState; + ImFont InputTextPasswordFont; + ImGuiID TempInputId; // Temporary text input when CTRL+clicking on a slider, etc. + ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets + ImGuiID ColorEditCurrentID; // Set temporarily while inside of the parent-most ColorEdit4/ColorPicker4 (because they call each others). + ImGuiID ColorEditSavedID; // ID we are saving/restoring HS for + float ColorEditSavedHue; // Backup of last Hue associated to LastColor, so we can restore Hue in lossy RGB<>HSV round trips + float ColorEditSavedSat; // Backup of last Saturation associated to LastColor, so we can restore Saturation in lossy RGB<>HSV round trips + ImU32 ColorEditSavedColor; // RGB value with alpha set to 0. + ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker. + ImGuiComboPreviewData ComboPreviewData; + float SliderGrabClickOffset; + float SliderCurrentAccum; // Accumulated slider delta when using navigation controls. + bool SliderCurrentAccumDirty; // Has the accumulated slider delta changed since last time we tried to apply it? + bool DragCurrentAccumDirty; + float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings + float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio + float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage? + float DisabledAlphaBackup; // Backup for style.Alpha for BeginDisabled() + short DisabledStackSize; + short TooltipOverrideCount; + ImVector ClipboardHandlerData; // If no custom clipboard handler is defined + ImVector MenusIdSubmittedThisFrame; // A list of menu IDs that were rendered at least once + + // Platform support + ImGuiPlatformImeData PlatformImeData; // Data updated by current frame + ImGuiPlatformImeData PlatformImeDataPrev; // Previous frame data (when changing we will call io.SetPlatformImeDataFn + char PlatformLocaleDecimalPoint; // '.' or *localeconv()->decimal_point + + // Settings + bool SettingsLoaded; + float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero + ImGuiTextBuffer SettingsIniData; // In memory .ini settings + ImVector SettingsHandlers; // List of .ini settings handlers + ImChunkStream SettingsWindows; // ImGuiWindow .ini settings entries + ImChunkStream SettingsTables; // ImGuiTable .ini settings entries + ImVector Hooks; // Hooks for extensions (e.g. test engine) + ImGuiID HookIdNext; // Next available HookId + + // Localization + const char* LocalizationTable[ImGuiLocKey_COUNT]; + + // Capture/Logging + bool LogEnabled; // Currently capturing + ImGuiLogType LogType; // Capture target + ImFileHandle LogFile; // If != NULL log to stdout/ file + ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators. + const char* LogNextPrefix; + const char* LogNextSuffix; + float LogLinePosY; + bool LogLineFirstItem; + int LogDepthRef; + int LogDepthToExpand; + int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call. + + // Debug Tools + ImGuiDebugLogFlags DebugLogFlags; + ImGuiTextBuffer DebugLogBuf; + ImGuiTextIndex DebugLogIndex; + ImU8 DebugLogClipperAutoDisableFrames; + ImU8 DebugLocateFrames; // For DebugLocateItemOnHover(). This is used together with DebugLocateId which is in a hot/cached spot above. + bool DebugItemPickerActive; // Item picker is active (started with DebugStartItemPicker()) + ImU8 DebugItemPickerMouseButton; + ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this ID + ImGuiMetricsConfig DebugMetricsConfig; + ImGuiStackTool DebugStackTool; + + // Misc + float FramerateSecPerFrame[60]; // Calculate estimate of framerate for user over the last 60 frames.. + int FramerateSecPerFrameIdx; + int FramerateSecPerFrameCount; + float FramerateSecPerFrameAccum; + int WantCaptureMouseNextFrame; // Explicit capture override via SetNextFrameWantCaptureMouse()/SetNextFrameWantCaptureKeyboard(). Default to -1. + int WantCaptureKeyboardNextFrame; // " + int WantTextInputNextFrame; + ImVector TempBuffer; // Temporary text buffer + + ImGuiContext(ImFontAtlas* shared_font_atlas) + { + IO.Ctx = this; + InputTextState.Ctx = this; + + Initialized = false; + FontAtlasOwnedByContext = shared_font_atlas ? false : true; + Font = NULL; + FontSize = FontBaseSize = 0.0f; + IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)(); + Time = 0.0f; + FrameCount = 0; + FrameCountEnded = FrameCountRendered = -1; + WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false; + GcCompactAll = false; + TestEngineHookItems = false; + TestEngine = NULL; + + WindowsActiveCount = 0; + CurrentWindow = NULL; + HoveredWindow = NULL; + HoveredWindowUnderMovingWindow = NULL; + MovingWindow = NULL; + WheelingWindow = NULL; + WheelingWindowStartFrame = -1; + WheelingWindowReleaseTimer = 0.0f; + + DebugHookIdInfo = 0; + HoveredId = HoveredIdPreviousFrame = 0; + HoveredIdAllowOverlap = false; + HoveredIdDisabled = false; + HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f; + ActiveId = 0; + ActiveIdIsAlive = 0; + ActiveIdTimer = 0.0f; + ActiveIdIsJustActivated = false; + ActiveIdAllowOverlap = false; + ActiveIdNoClearOnFocusLoss = false; + ActiveIdHasBeenPressedBefore = false; + ActiveIdHasBeenEditedBefore = false; + ActiveIdHasBeenEditedThisFrame = false; + ActiveIdClickOffset = ImVec2(-1, -1); + ActiveIdWindow = NULL; + ActiveIdSource = ImGuiInputSource_None; + ActiveIdMouseButton = -1; + ActiveIdPreviousFrame = 0; + ActiveIdPreviousFrameIsAlive = false; + ActiveIdPreviousFrameHasBeenEditedBefore = false; + ActiveIdPreviousFrameWindow = NULL; + LastActiveId = 0; + LastActiveIdTimer = 0.0f; + + ActiveIdUsingNavDirMask = 0x00; + ActiveIdUsingAllKeyboardKeys = false; +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + ActiveIdUsingNavInputMask = 0x00; +#endif + + CurrentFocusScopeId = 0; + CurrentItemFlags = ImGuiItemFlags_None; + BeginMenuCount = 0; + + NavWindow = NULL; + NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = 0; + NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0; + NavActivateFlags = NavNextActivateFlags = ImGuiActivateFlags_None; + NavJustMovedToKeyMods = ImGuiMod_None; + NavInputSource = ImGuiInputSource_None; + NavLayer = ImGuiNavLayer_Main; + NavIdIsAlive = false; + NavMousePosDirty = false; + NavDisableHighlight = true; + NavDisableMouseHover = false; + NavAnyRequest = false; + NavInitRequest = false; + NavInitRequestFromMove = false; + NavInitResultId = 0; + NavMoveSubmitted = false; + NavMoveScoringItems = false; + NavMoveForwardToNextFrame = false; + NavMoveFlags = ImGuiNavMoveFlags_None; + NavMoveScrollFlags = ImGuiScrollFlags_None; + NavMoveKeyMods = ImGuiMod_None; + NavMoveDir = NavMoveDirForDebug = NavMoveClipDir = ImGuiDir_None; + NavScoringDebugCount = 0; + NavTabbingDir = 0; + NavTabbingCounter = 0; + + ConfigNavWindowingKeyNext = ImGuiMod_Ctrl | ImGuiKey_Tab; + ConfigNavWindowingKeyPrev = ImGuiMod_Ctrl | ImGuiMod_Shift | ImGuiKey_Tab; + NavWindowingTarget = NavWindowingTargetAnim = NavWindowingListWindow = NULL; + NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f; + NavWindowingToggleLayer = false; + + DimBgRatio = 0.0f; + MouseCursor = ImGuiMouseCursor_Arrow; + + DragDropActive = DragDropWithinSource = DragDropWithinTarget = false; + DragDropSourceFlags = ImGuiDragDropFlags_None; + DragDropSourceFrameCount = -1; + DragDropMouseButton = -1; + DragDropTargetId = 0; + DragDropAcceptFlags = ImGuiDragDropFlags_None; + DragDropAcceptIdCurrRectSurface = 0.0f; + DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0; + DragDropAcceptFrameCount = -1; + DragDropHoldJustPressedId = 0; + memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal)); + + ClipperTempDataStacked = 0; + + CurrentTable = NULL; + TablesTempDataStacked = 0; + CurrentTabBar = NULL; + + HoverDelayId = HoverDelayIdPreviousFrame = 0; + HoverDelayTimer = HoverDelayClearTimer = 0.0f; + + TempInputId = 0; + ColorEditOptions = ImGuiColorEditFlags_DefaultOptions_; + ColorEditCurrentID = ColorEditSavedID = 0; + ColorEditSavedHue = ColorEditSavedSat = 0.0f; + ColorEditSavedColor = 0; + SliderGrabClickOffset = 0.0f; + SliderCurrentAccum = 0.0f; + SliderCurrentAccumDirty = false; + DragCurrentAccumDirty = false; + DragCurrentAccum = 0.0f; + DragSpeedDefaultRatio = 1.0f / 100.0f; + ScrollbarClickDeltaToGrabCenter = 0.0f; + DisabledAlphaBackup = 0.0f; + DisabledStackSize = 0; + TooltipOverrideCount = 0; + + PlatformImeData.InputPos = ImVec2(0.0f, 0.0f); + PlatformImeDataPrev.InputPos = ImVec2(-1.0f, -1.0f); // Different to ensure initial submission + PlatformLocaleDecimalPoint = '.'; + + SettingsLoaded = false; + SettingsDirtyTimer = 0.0f; + HookIdNext = 0; + + memset(LocalizationTable, 0, sizeof(LocalizationTable)); + + LogEnabled = false; + LogType = ImGuiLogType_None; + LogNextPrefix = LogNextSuffix = NULL; + LogFile = NULL; + LogLinePosY = FLT_MAX; + LogLineFirstItem = false; + LogDepthRef = 0; + LogDepthToExpand = LogDepthToExpandDefault = 2; + + DebugLogFlags = ImGuiDebugLogFlags_OutputToTTY; + DebugLocateId = 0; + DebugLogClipperAutoDisableFrames = 0; + DebugLocateFrames = 0; + DebugItemPickerActive = false; + DebugItemPickerMouseButton = ImGuiMouseButton_Left; + DebugItemPickerBreakId = 0; + + memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame)); + FramerateSecPerFrameIdx = FramerateSecPerFrameCount = 0; + FramerateSecPerFrameAccum = 0.0f; + WantCaptureMouseNextFrame = WantCaptureKeyboardNextFrame = WantTextInputNextFrame = -1; + } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGuiWindowTempData, ImGuiWindow +//----------------------------------------------------------------------------- + +// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow. +// (That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered..) +// (This doesn't need a constructor because we zero-clear it as part of ImGuiWindow and all frame-temporary data are setup on Begin) +struct IMGUI_API ImGuiWindowTempData +{ + // Layout + ImVec2 CursorPos; // Current emitting position, in absolute coordinates. + ImVec2 CursorPosPrevLine; + ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding. + ImVec2 CursorMaxPos; // Used to implicitly calculate ContentSize at the beginning of next frame, for scrolling range and auto-resize. Always growing during the frame. + ImVec2 IdealMaxPos; // Used to implicitly calculate ContentSizeIdeal at the beginning of next frame, for auto-resize only. Always growing during the frame. + ImVec2 CurrLineSize; + ImVec2 PrevLineSize; + float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added). + float PrevLineTextBaseOffset; + bool IsSameLine; + bool IsSetPos; + ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.) + ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API. + ImVec1 GroupOffset; + ImVec2 CursorStartPosLossyness;// Record the loss of precision of CursorStartPos due to really large scrolling amount. This is used by clipper to compensentate and fix the most common use case of large scroll area. + + // Keyboard/Gamepad navigation + ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1) + short NavLayersActiveMask; // Which layers have been written to (result from previous frame) + short NavLayersActiveMaskNext;// Which layers have been written to (accumulator for current frame) + bool NavHideHighlightOneFrame; + bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f) + + // Miscellaneous + bool MenuBarAppending; // FIXME: Remove this + ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs. + ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement + int TreeDepth; // Current tree depth. + ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary. + ImVector ChildWindows; + ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state) + ImGuiOldColumns* CurrentColumns; // Current columns set + int CurrentTableIdx; // Current table index (into g.Tables) + ImGuiLayoutType LayoutType; + ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin() + + // Local parameters stacks + // We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings. + float ItemWidth; // Current item width (>0.0: width in pixels, <0.0: align xx pixels to the right of window). + float TextWrapPos; // Current text wrap pos. + ImVector ItemWidthStack; // Store item widths to restore (attention: .back() is not == ItemWidth) + ImVector TextWrapPosStack; // Store text wrap pos to restore (attention: .back() is not == TextWrapPos) +}; + +// Storage for one window +struct IMGUI_API ImGuiWindow +{ + ImGuiContext* Ctx; // Parent UI context (needs to be set explicitly by parent). + char* Name; // Window name, owned by the window. + ImGuiID ID; // == ImHashStr(Name) + ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_ + ImGuiViewportP* Viewport; // Always set in Begin(). Inactive windows may have a NULL value here if their viewport was discarded. + ImVec2 Pos; // Position (always rounded-up to nearest pixel) + ImVec2 Size; // Current size (==SizeFull or collapsed title bar size) + ImVec2 SizeFull; // Size when non collapsed + ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding. + ImVec2 ContentSizeIdeal; + ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize(). + ImVec2 WindowPadding; // Window padding at the time of Begin(). + float WindowRounding; // Window rounding at the time of Begin(). May be clamped lower to avoid rendering artifacts with title bar, menu bar etc. + float WindowBorderSize; // Window border size at the time of Begin(). + float DecoOuterSizeX1, DecoOuterSizeY1; // Left/Up offsets. Sum of non-scrolling outer decorations (X1 generally == 0.0f. Y1 generally = TitleBarHeight + MenuBarHeight). Locked during Begin(). + float DecoOuterSizeX2, DecoOuterSizeY2; // Right/Down offsets (X2 generally == ScrollbarSize.x, Y2 == ScrollbarSizes.y). + float DecoInnerSizeX1, DecoInnerSizeY1; // Applied AFTER/OVER InnerRect. Specialized for Tables as they use specialized form of clipping and frozen rows/columns are inside InnerRect (and not part of regular decoration sizes). + int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)! + ImGuiID MoveId; // == window->GetID("#MOVE") + ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window) + ImVec2 Scroll; + ImVec2 ScrollMax; + ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change) + ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered + ImVec2 ScrollTargetEdgeSnapDist; // 0.0f = no snapping, >0.0f snapping threshold + ImVec2 ScrollbarSizes; // Size taken by each scrollbars on their smaller axis. Pay attention! ScrollbarSizes.x == width of the vertical scrollbar, ScrollbarSizes.y = height of the horizontal scrollbar. + bool ScrollbarX, ScrollbarY; // Are scrollbars visible? + bool Active; // Set to true on Begin(), unless Collapsed + bool WasActive; + bool WriteAccessed; // Set to true when any widget access the current window + bool Collapsed; // Set when collapsing window to become only title-bar + bool WantCollapseToggle; + bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed) + bool Appearing; // Set during the frame where the window is appearing (or re-appearing) + bool Hidden; // Do not display (== HiddenFrames*** > 0) + bool IsFallbackWindow; // Set on the "Debug##Default" window. + bool IsExplicitChild; // Set when passed _ChildWindow, left to false by BeginDocked() + bool HasCloseButton; // Set when the window has a close button (p_open != NULL) + signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3) + short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs) + short BeginCountPreviousFrame; // Number of Begin() during the previous frame + short BeginOrderWithinParent; // Begin() order within immediate parent window, if we are a child window. Otherwise 0. + short BeginOrderWithinContext; // Begin() order within entire imgui context. This is mostly used for debugging submission order related issues. + short FocusOrder; // Order within WindowsFocusOrder[], altered when windows are focused. + ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling) + ImS8 AutoFitFramesX, AutoFitFramesY; + ImS8 AutoFitChildAxises; + bool AutoFitOnlyGrows; + ImGuiDir AutoPosLastDirection; + ImS8 HiddenFramesCanSkipItems; // Hide the window for N frames + ImS8 HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size + ImS8 HiddenFramesForRenderOnly; // Hide the window until frame N at Render() time only + ImS8 DisableInputsFrames; // Disable window interactions for N frames + ImGuiCond SetWindowPosAllowFlags : 8; // store acceptable condition flags for SetNextWindowPos() use. + ImGuiCond SetWindowSizeAllowFlags : 8; // store acceptable condition flags for SetNextWindowSize() use. + ImGuiCond SetWindowCollapsedAllowFlags : 8; // store acceptable condition flags for SetNextWindowCollapsed() use. + ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size) + ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0, 0) when positioning from top-left corner; ImVec2(0.5f, 0.5f) for centering; ImVec2(1, 1) for bottom right. + + ImVector IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure) + ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name. + + // The best way to understand what those rectangles are is to use the 'Metrics->Tools->Show Windows Rectangles' viewer. + // The main 'OuterRect', omitted as a field, is window->Rect(). + ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window. + ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar) + ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect. + ImRect WorkRect; // Initially covers the whole scrolling region. Reduced by containers e.g columns/tables when active. Shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward). + ImRect ParentWorkRect; // Backup of WorkRect before entering a container such as columns/tables. Used by e.g. SpanAllColumns functions to easily access. Stacked containers are responsible for maintaining this. // FIXME-WORKRECT: Could be a stack? + ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back(). + ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on. + ImVec2ih HitTestHoleSize; // Define an optional rectangular hole where mouse will pass-through the window. + ImVec2ih HitTestHoleOffset; + + int LastFrameActive; // Last frame number the window was Active. + float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there) + float ItemWidthDefault; + ImGuiStorage StateStorage; + ImVector ColumnsStorage; + float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale() + int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back) + + ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer) + ImDrawList DrawListInst; + ImGuiWindow* ParentWindow; // If we are a child _or_ popup _or_ docked window, this is pointing to our parent. Otherwise NULL. + ImGuiWindow* ParentWindowInBeginStack; + ImGuiWindow* RootWindow; // Point to ourself or first ancestor that is not a child window. Doesn't cross through popups/dock nodes. + ImGuiWindow* RootWindowPopupTree; // Point to ourself or first ancestor that is not a child window. Cross through popups parent<>child. + ImGuiWindow* RootWindowForTitleBarHighlight; // Point to ourself or first ancestor which will display TitleBgActive color when this window is active. + ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag. + + ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.) + ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1) + ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space + ImGuiID NavRootFocusScopeId; // Focus Scope ID at the time of Begin() + + int MemoryDrawListIdxCapacity; // Backup of last idx/vtx count, so when waking up the window we can preallocate and avoid iterative alloc/copy + int MemoryDrawListVtxCapacity; + bool MemoryCompacted; // Set when window extraneous data have been garbage collected + +public: + ImGuiWindow(ImGuiContext* context, const char* name); + ~ImGuiWindow(); + + ImGuiID GetID(const char* str, const char* str_end = NULL); + ImGuiID GetID(const void* ptr); + ImGuiID GetID(int n); + ImGuiID GetIDFromRectangle(const ImRect& r_abs); + + // We don't use g.FontSize because the window may be != g.CurrentWindow. + ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x + Size.x, Pos.y + Size.y); } + float CalcFontSize() const { ImGuiContext& g = *Ctx; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; } + float TitleBarHeight() const { ImGuiContext& g = *Ctx; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; } + ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); } + float MenuBarHeight() const { ImGuiContext& g = *Ctx; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; } + ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] Tab bar, Tab item support +//----------------------------------------------------------------------------- + +// Extend ImGuiTabBarFlags_ +enum ImGuiTabBarFlagsPrivate_ +{ + ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around] + ImGuiTabBarFlags_IsFocused = 1 << 21, + ImGuiTabBarFlags_SaveSettings = 1 << 22, // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs +}; + +// Extend ImGuiTabItemFlags_ +enum ImGuiTabItemFlagsPrivate_ +{ + ImGuiTabItemFlags_SectionMask_ = ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing, + ImGuiTabItemFlags_NoCloseButton = 1 << 20, // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout) + ImGuiTabItemFlags_Button = 1 << 21, // Used by TabItemButton, change the tab item behavior to mimic a button +}; + +// Storage for one active tab item (sizeof() 40 bytes) +struct ImGuiTabItem +{ + ImGuiID ID; + ImGuiTabItemFlags Flags; + int LastFrameVisible; + int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance + float Offset; // Position relative to beginning of tab + float Width; // Width currently displayed + float ContentWidth; // Width of label, stored during BeginTabItem() call + float RequestedWidth; // Width optionally requested by caller, -1.0f is unused + ImS32 NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames + ImS16 BeginOrder; // BeginTabItem() order, used to re-order tabs after toggling ImGuiTabBarFlags_Reorderable + ImS16 IndexDuringLayout; // Index only used during TabBarLayout(). Tabs gets reordered so 'Tabs[n].IndexDuringLayout == n' but may mismatch during additions. + bool WantClose; // Marked as closed by SetTabItemClosed() + + ImGuiTabItem() { memset(this, 0, sizeof(*this)); LastFrameVisible = LastFrameSelected = -1; RequestedWidth = -1.0f; NameOffset = -1; BeginOrder = IndexDuringLayout = -1; } +}; + +// Storage for a tab bar (sizeof() 152 bytes) +struct IMGUI_API ImGuiTabBar +{ + ImVector Tabs; + ImGuiTabBarFlags Flags; + ImGuiID ID; // Zero for tab-bars used by docking + ImGuiID SelectedTabId; // Selected tab/window + ImGuiID NextSelectedTabId; // Next selected tab/window. Will also trigger a scrolling animation + ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview) + int CurrFrameVisible; + int PrevFrameVisible; + ImRect BarRect; + float CurrTabsContentsHeight; + float PrevTabsContentsHeight; // Record the height of contents submitted below the tab bar + float WidthAllTabs; // Actual width of all tabs (locked during layout) + float WidthAllTabsIdeal; // Ideal width if all tabs were visible and not clipped + float ScrollingAnim; + float ScrollingTarget; + float ScrollingTargetDistToVisibility; + float ScrollingSpeed; + float ScrollingRectMinX; + float ScrollingRectMaxX; + ImGuiID ReorderRequestTabId; + ImS16 ReorderRequestOffset; + ImS8 BeginCount; + bool WantLayout; + bool VisibleTabWasSubmitted; + bool TabsAddedNew; // Set to true when a new tab item or button has been added to the tab bar during last frame + ImS16 TabsActiveCount; // Number of tabs submitted this frame. + ImS16 LastTabItemIdx; // Index of last BeginTabItem() tab for use by EndTabItem() + float ItemSpacingY; + ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar() + ImVec2 BackupCursorPos; + ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer. + + ImGuiTabBar(); +}; + +//----------------------------------------------------------------------------- +// [SECTION] Table support +//----------------------------------------------------------------------------- + +#define IM_COL32_DISABLE IM_COL32(0,0,0,1) // Special sentinel code which cannot be used as a regular color. +#define IMGUI_TABLE_MAX_COLUMNS 512 // May be further lifted + +// Our current column maximum is 64 but we may raise that in the future. +typedef ImS16 ImGuiTableColumnIdx; +typedef ImU16 ImGuiTableDrawChannelIdx; + +// [Internal] sizeof() ~ 104 +// We use the terminology "Enabled" to refer to a column that is not Hidden by user/api. +// We use the terminology "Clipped" to refer to a column that is out of sight because of scrolling/clipping. +// This is in contrast with some user-facing api such as IsItemVisible() / IsRectVisible() which use "Visible" to mean "not clipped". +struct ImGuiTableColumn +{ + ImGuiTableColumnFlags Flags; // Flags after some patching (not directly same as provided by user). See ImGuiTableColumnFlags_ + float WidthGiven; // Final/actual width visible == (MaxX - MinX), locked in TableUpdateLayout(). May be > WidthRequest to honor minimum width, may be < WidthRequest to honor shrinking columns down in tight space. + float MinX; // Absolute positions + float MaxX; + float WidthRequest; // Master width absolute value when !(Flags & _WidthStretch). When Stretch this is derived every frame from StretchWeight in TableUpdateLayout() + float WidthAuto; // Automatic width + float StretchWeight; // Master width weight when (Flags & _WidthStretch). Often around ~1.0f initially. + float InitStretchWeightOrWidth; // Value passed to TableSetupColumn(). For Width it is a content width (_without padding_). + ImRect ClipRect; // Clipping rectangle for the column + ImGuiID UserID; // Optional, value passed to TableSetupColumn() + float WorkMinX; // Contents region min ~(MinX + CellPaddingX + CellSpacingX1) == cursor start position when entering column + float WorkMaxX; // Contents region max ~(MaxX - CellPaddingX - CellSpacingX2) + float ItemWidth; // Current item width for the column, preserved across rows + float ContentMaxXFrozen; // Contents maximum position for frozen rows (apart from headers), from which we can infer content width. + float ContentMaxXUnfrozen; + float ContentMaxXHeadersUsed; // Contents maximum position for headers rows (regardless of freezing). TableHeader() automatically softclip itself + report ideal desired size, to avoid creating extraneous draw calls + float ContentMaxXHeadersIdeal; + ImS16 NameOffset; // Offset into parent ColumnsNames[] + ImGuiTableColumnIdx DisplayOrder; // Index within Table's IndexToDisplayOrder[] (column may be reordered by users) + ImGuiTableColumnIdx IndexWithinEnabledSet; // Index within enabled/visible set (<= IndexToDisplayOrder) + ImGuiTableColumnIdx PrevEnabledColumn; // Index of prev enabled/visible column within Columns[], -1 if first enabled/visible column + ImGuiTableColumnIdx NextEnabledColumn; // Index of next enabled/visible column within Columns[], -1 if last enabled/visible column + ImGuiTableColumnIdx SortOrder; // Index of this column within sort specs, -1 if not sorting on this column, 0 for single-sort, may be >0 on multi-sort + ImGuiTableDrawChannelIdx DrawChannelCurrent; // Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx DrawChannelFrozen; // Draw channels for frozen rows (often headers) + ImGuiTableDrawChannelIdx DrawChannelUnfrozen; // Draw channels for unfrozen rows + bool IsEnabled; // IsUserEnabled && (Flags & ImGuiTableColumnFlags_Disabled) == 0 + bool IsUserEnabled; // Is the column not marked Hidden by the user? (unrelated to being off view, e.g. clipped by scrolling). + bool IsUserEnabledNextFrame; + bool IsVisibleX; // Is actually in view (e.g. overlapping the host window clipping rectangle, not scrolled). + bool IsVisibleY; + bool IsRequestOutput; // Return value for TableSetColumnIndex() / TableNextColumn(): whether we request user to output contents or not. + bool IsSkipItems; // Do we want item submissions to this column to be completely ignored (no layout will happen). + bool IsPreserveWidthAuto; + ImS8 NavLayerCurrent; // ImGuiNavLayer in 1 byte + ImU8 AutoFitQueue; // Queue of 8 values for the next 8 frames to request auto-fit + ImU8 CannotSkipItemsQueue; // Queue of 8 values for the next 8 frames to disable Clipped/SkipItem + ImU8 SortDirection : 2; // ImGuiSortDirection_Ascending or ImGuiSortDirection_Descending + ImU8 SortDirectionsAvailCount : 2; // Number of available sort directions (0 to 3) + ImU8 SortDirectionsAvailMask : 4; // Mask of available sort directions (1-bit each) + ImU8 SortDirectionsAvailList; // Ordered of available sort directions (2-bits each) + + ImGuiTableColumn() + { + memset(this, 0, sizeof(*this)); + StretchWeight = WidthRequest = -1.0f; + NameOffset = -1; + DisplayOrder = IndexWithinEnabledSet = -1; + PrevEnabledColumn = NextEnabledColumn = -1; + SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + DrawChannelCurrent = DrawChannelFrozen = DrawChannelUnfrozen = (ImU8)-1; + } +}; + +// Transient cell data stored per row. +// sizeof() ~ 6 +struct ImGuiTableCellData +{ + ImU32 BgColor; // Actual color + ImGuiTableColumnIdx Column; // Column number +}; + +// Per-instance data that needs preserving across frames (seemingly most others do not need to be preserved aside from debug needs. Does that means they could be moved to ImGuiTableTempData?) +struct ImGuiTableInstanceData +{ + ImGuiID TableInstanceID; + float LastOuterHeight; // Outer height from last frame + float LastFirstRowHeight; // Height of first row from last frame (FIXME: this is used as "header height" and may be reworked) + float LastFrozenHeight; // Height of frozen section from last frame + + ImGuiTableInstanceData() { TableInstanceID = 0; LastOuterHeight = LastFirstRowHeight = LastFrozenHeight = 0.0f; } +}; + +// FIXME-TABLE: more transient data could be stored in a stacked ImGuiTableTempData: e.g. SortSpecs, incoming RowData +struct IMGUI_API ImGuiTable +{ + ImGuiID ID; + ImGuiTableFlags Flags; + void* RawData; // Single allocation to hold Columns[], DisplayOrderToIndex[] and RowCellData[] + ImGuiTableTempData* TempData; // Transient data while table is active. Point within g.CurrentTableStack[] + ImSpan Columns; // Point within RawData[] + ImSpan DisplayOrderToIndex; // Point within RawData[]. Store display order of columns (when not reordered, the values are 0...Count-1) + ImSpan RowCellData; // Point within RawData[]. Store cells background requests for current row. + ImBitArrayPtr EnabledMaskByDisplayOrder; // Column DisplayOrder -> IsEnabled map + ImBitArrayPtr EnabledMaskByIndex; // Column Index -> IsEnabled map (== not hidden by user/api) in a format adequate for iterating column without touching cold data + ImBitArrayPtr VisibleMaskByIndex; // Column Index -> IsVisibleX|IsVisibleY map (== not hidden by user/api && not hidden by scrolling/cliprect) + ImGuiTableFlags SettingsLoadedFlags; // Which data were loaded from the .ini file (e.g. when order is not altered we won't save order) + int SettingsOffset; // Offset in g.SettingsTables + int LastFrameActive; + int ColumnsCount; // Number of columns declared in BeginTable() + int CurrentRow; + int CurrentColumn; + ImS16 InstanceCurrent; // Count of BeginTable() calls with same ID in the same frame (generally 0). This is a little bit similar to BeginCount for a window, but multiple table with same ID look are multiple tables, they are just synched. + ImS16 InstanceInteracted; // Mark which instance (generally 0) of the same ID is being interacted with + float RowPosY1; + float RowPosY2; + float RowMinHeight; // Height submitted to TableNextRow() + float RowTextBaseline; + float RowIndentOffsetX; + ImGuiTableRowFlags RowFlags : 16; // Current row flags, see ImGuiTableRowFlags_ + ImGuiTableRowFlags LastRowFlags : 16; + int RowBgColorCounter; // Counter for alternating background colors (can be fast-forwarded by e.g clipper), not same as CurrentRow because header rows typically don't increase this. + ImU32 RowBgColor[2]; // Background color override for current row. + ImU32 BorderColorStrong; + ImU32 BorderColorLight; + float BorderX1; + float BorderX2; + float HostIndentX; + float MinColumnWidth; + float OuterPaddingX; + float CellPaddingX; // Padding from each borders + float CellPaddingY; + float CellSpacingX1; // Spacing between non-bordered cells + float CellSpacingX2; + float InnerWidth; // User value passed to BeginTable(), see comments at the top of BeginTable() for details. + float ColumnsGivenWidth; // Sum of current column width + float ColumnsAutoFitWidth; // Sum of ideal column width in order nothing to be clipped, used for auto-fitting and content width submission in outer window + float ColumnsStretchSumWeights; // Sum of weight of all enabled stretching columns + float ResizedColumnNextWidth; + float ResizeLockMinContentsX2; // Lock minimum contents width while resizing down in order to not create feedback loops. But we allow growing the table. + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImRect OuterRect; // Note: for non-scrolling table, OuterRect.Max.y is often FLT_MAX until EndTable(), unless a height has been specified in BeginTable(). + ImRect InnerRect; // InnerRect but without decoration. As with OuterRect, for non-scrolling tables, InnerRect.Max.y is + ImRect WorkRect; + ImRect InnerClipRect; + ImRect BgClipRect; // We use this to cpu-clip cell background color fill, evolve during the frame as we cross frozen rows boundaries + ImRect Bg0ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG0/1 channel. This tends to be == OuterWindow->ClipRect at BeginTable() because output in BG0/BG1 is cpu-clipped + ImRect Bg2ClipRectForDrawCmd; // Actual ImDrawCmd clip rect for BG2 channel. This tends to be a correct, tight-fit, because output to BG2 are done by widgets relying on regular ClipRect. + ImRect HostClipRect; // This is used to check if we can eventually merge our columns draw calls into the current draw call of the current window. + ImRect HostBackupInnerClipRect; // Backup of InnerWindow->ClipRect during PushTableBackground()/PopTableBackground() + ImGuiWindow* OuterWindow; // Parent window for the table + ImGuiWindow* InnerWindow; // Window holding the table data (== OuterWindow or a child window) + ImGuiTextBuffer ColumnsNames; // Contiguous buffer holding columns names + ImDrawListSplitter* DrawSplitter; // Shortcut to TempData->DrawSplitter while in table. Isolate draw commands per columns to avoid switching clip rect constantly + ImGuiTableInstanceData InstanceDataFirst; + ImVector InstanceDataExtra; // FIXME-OPT: Using a small-vector pattern would be good. + ImGuiTableColumnSortSpecs SortSpecsSingle; + ImVector SortSpecsMulti; // FIXME-OPT: Using a small-vector pattern would be good. + ImGuiTableSortSpecs SortSpecs; // Public facing sorts specs, this is what we return in TableGetSortSpecs() + ImGuiTableColumnIdx SortSpecsCount; + ImGuiTableColumnIdx ColumnsEnabledCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx ColumnsEnabledFixedCount; // Number of enabled columns (<= ColumnsCount) + ImGuiTableColumnIdx DeclColumnsCount; // Count calls to TableSetupColumn() + ImGuiTableColumnIdx HoveredColumnBody; // Index of column whose visible region is being hovered. Important: == ColumnsCount when hovering empty region after the right-most column! + ImGuiTableColumnIdx HoveredColumnBorder; // Index of column whose right-border is being hovered (for resizing). + ImGuiTableColumnIdx AutoFitSingleColumn; // Index of single column requesting auto-fit. + ImGuiTableColumnIdx ResizedColumn; // Index of column being resized. Reset when InstanceCurrent==0. + ImGuiTableColumnIdx LastResizedColumn; // Index of column being resized from previous frame. + ImGuiTableColumnIdx HeldHeaderColumn; // Index of column header being held. + ImGuiTableColumnIdx ReorderColumn; // Index of column being reordered. (not cleared) + ImGuiTableColumnIdx ReorderColumnDir; // -1 or +1 + ImGuiTableColumnIdx LeftMostEnabledColumn; // Index of left-most non-hidden column. + ImGuiTableColumnIdx RightMostEnabledColumn; // Index of right-most non-hidden column. + ImGuiTableColumnIdx LeftMostStretchedColumn; // Index of left-most stretched column. + ImGuiTableColumnIdx RightMostStretchedColumn; // Index of right-most stretched column. + ImGuiTableColumnIdx ContextPopupColumn; // Column right-clicked on, of -1 if opening context menu from a neutral/empty spot + ImGuiTableColumnIdx FreezeRowsRequest; // Requested frozen rows count + ImGuiTableColumnIdx FreezeRowsCount; // Actual frozen row count (== FreezeRowsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx FreezeColumnsRequest; // Requested frozen columns count + ImGuiTableColumnIdx FreezeColumnsCount; // Actual frozen columns count (== FreezeColumnsRequest, or == 0 when no scrolling offset) + ImGuiTableColumnIdx RowCellDataCurrent; // Index of current RowCellData[] entry in current row + ImGuiTableDrawChannelIdx DummyDrawChannel; // Redirect non-visible columns here. + ImGuiTableDrawChannelIdx Bg2DrawChannelCurrent; // For Selectable() and other widgets drawing across columns after the freezing line. Index within DrawSplitter.Channels[] + ImGuiTableDrawChannelIdx Bg2DrawChannelUnfrozen; + bool IsLayoutLocked; // Set by TableUpdateLayout() which is called when beginning the first row. + bool IsInsideRow; // Set when inside TableBeginRow()/TableEndRow(). + bool IsInitializing; + bool IsSortSpecsDirty; + bool IsUsingHeaders; // Set when the first row had the ImGuiTableRowFlags_Headers flag. + bool IsContextPopupOpen; // Set when default context menu is open (also see: ContextPopupColumn, InstanceInteracted). + bool IsSettingsRequestLoad; + bool IsSettingsDirty; // Set when table settings have changed and needs to be reported into ImGuiTableSetttings data. + bool IsDefaultDisplayOrder; // Set when display order is unchanged from default (DisplayOrder contains 0...Count-1) + bool IsResetAllRequest; + bool IsResetDisplayOrderRequest; + bool IsUnfrozenRows; // Set when we got past the frozen row. + bool IsDefaultSizingPolicy; // Set if user didn't explicitly set a sizing policy in BeginTable() + bool HasScrollbarYCurr; // Whether ANY instance of this table had a vertical scrollbar during the current frame. + bool HasScrollbarYPrev; // Whether ANY instance of this table had a vertical scrollbar during the previous. + bool MemoryCompacted; + bool HostSkipItems; // Backup of InnerWindow->SkipItem at the end of BeginTable(), because we will overwrite InnerWindow->SkipItem on a per-column basis + + ImGuiTable() { memset(this, 0, sizeof(*this)); LastFrameActive = -1; } + ~ImGuiTable() { IM_FREE(RawData); } +}; + +// Transient data that are only needed between BeginTable() and EndTable(), those buffers are shared (1 per level of stacked table). +// - Accessing those requires chasing an extra pointer so for very frequently used data we leave them in the main table structure. +// - We also leave out of this structure data that tend to be particularly useful for debugging/metrics. +struct IMGUI_API ImGuiTableTempData +{ + int TableIndex; // Index in g.Tables.Buf[] pool + float LastTimeActive; // Last timestamp this structure was used + + ImVec2 UserOuterSize; // outer_size.x passed to BeginTable() + ImDrawListSplitter DrawSplitter; + + ImRect HostBackupWorkRect; // Backup of InnerWindow->WorkRect at the end of BeginTable() + ImRect HostBackupParentWorkRect; // Backup of InnerWindow->ParentWorkRect at the end of BeginTable() + ImVec2 HostBackupPrevLineSize; // Backup of InnerWindow->DC.PrevLineSize at the end of BeginTable() + ImVec2 HostBackupCurrLineSize; // Backup of InnerWindow->DC.CurrLineSize at the end of BeginTable() + ImVec2 HostBackupCursorMaxPos; // Backup of InnerWindow->DC.CursorMaxPos at the end of BeginTable() + ImVec1 HostBackupColumnsOffset; // Backup of OuterWindow->DC.ColumnsOffset at the end of BeginTable() + float HostBackupItemWidth; // Backup of OuterWindow->DC.ItemWidth at the end of BeginTable() + int HostBackupItemWidthStackSize;//Backup of OuterWindow->DC.ItemWidthStack.Size at the end of BeginTable() + + ImGuiTableTempData() { memset(this, 0, sizeof(*this)); LastTimeActive = -1.0f; } +}; + +// sizeof() ~ 12 +struct ImGuiTableColumnSettings +{ + float WidthOrWeight; + ImGuiID UserID; + ImGuiTableColumnIdx Index; + ImGuiTableColumnIdx DisplayOrder; + ImGuiTableColumnIdx SortOrder; + ImU8 SortDirection : 2; + ImU8 IsEnabled : 1; // "Visible" in ini file + ImU8 IsStretch : 1; + + ImGuiTableColumnSettings() + { + WidthOrWeight = 0.0f; + UserID = 0; + Index = -1; + DisplayOrder = SortOrder = -1; + SortDirection = ImGuiSortDirection_None; + IsEnabled = 1; + IsStretch = 0; + } +}; + +// This is designed to be stored in a single ImChunkStream (1 header followed by N ImGuiTableColumnSettings, etc.) +struct ImGuiTableSettings +{ + ImGuiID ID; // Set to 0 to invalidate/delete the setting + ImGuiTableFlags SaveFlags; // Indicate data we want to save using the Resizable/Reorderable/Sortable/Hideable flags (could be using its own flags..) + float RefScale; // Reference scale to be able to rescale columns on font/dpi changes. + ImGuiTableColumnIdx ColumnsCount; + ImGuiTableColumnIdx ColumnsCountMax; // Maximum number of columns this settings instance can store, we can recycle a settings instance with lower number of columns but not higher + bool WantApply; // Set when loaded from .ini data (to enable merging/loading .ini data into an already running context) + + ImGuiTableSettings() { memset(this, 0, sizeof(*this)); } + ImGuiTableColumnSettings* GetColumnSettings() { return (ImGuiTableColumnSettings*)(this + 1); } +}; + +//----------------------------------------------------------------------------- +// [SECTION] ImGui internal API +// No guarantee of forward compatibility here! +//----------------------------------------------------------------------------- + +namespace ImGui +{ + // Windows + // We should always have a CurrentWindow in the stack (there is an implicit "Debug" window) + // If this ever crash because g.CurrentWindow is NULL it means that either + // - ImGui::NewFrame() has never been called, which is illegal. + // - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal. + inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; } + inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; } + IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id); + IMGUI_API ImGuiWindow* FindWindowByName(const char* name); + IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window); + IMGUI_API ImVec2 CalcWindowNextAutoFitSize(ImGuiWindow* window); + IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent, bool popup_hierarchy); + IMGUI_API bool IsWindowWithinBeginStackOf(ImGuiWindow* window, ImGuiWindow* potential_parent); + IMGUI_API bool IsWindowAbove(ImGuiWindow* potential_above, ImGuiWindow* potential_below); + IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window); + IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0); + IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0); + IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0); + IMGUI_API void SetWindowHitTestHole(ImGuiWindow* window, const ImVec2& pos, const ImVec2& size); + IMGUI_API void SetWindowHiddendAndSkipItemsForCurrentFrame(ImGuiWindow* window); + inline ImRect WindowRectAbsToRel(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x - off.x, r.Min.y - off.y, r.Max.x - off.x, r.Max.y - off.y); } + inline ImRect WindowRectRelToAbs(ImGuiWindow* window, const ImRect& r) { ImVec2 off = window->DC.CursorStartPos; return ImRect(r.Min.x + off.x, r.Min.y + off.y, r.Max.x + off.x, r.Max.y + off.y); } + + // Windows: Display Order and Focus Order + IMGUI_API void FocusWindow(ImGuiWindow* window); + IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window); + IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window); + IMGUI_API void BringWindowToDisplayBehind(ImGuiWindow* window, ImGuiWindow* above_window); + IMGUI_API int FindWindowDisplayIndex(ImGuiWindow* window); + IMGUI_API ImGuiWindow* FindBottomMostVisibleWindowWithinBeginStack(ImGuiWindow* window); + + // Fonts, drawing + IMGUI_API void SetCurrentFont(ImFont* font); + inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; } + inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); return GetForegroundDrawList(); } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches. + IMGUI_API ImDrawList* GetBackgroundDrawList(ImGuiViewport* viewport); // get background draw list for the given viewport. this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. + IMGUI_API ImDrawList* GetForegroundDrawList(ImGuiViewport* viewport); // get foreground draw list for the given viewport. this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. + + // Init + IMGUI_API void Initialize(); + IMGUI_API void Shutdown(); // Since 1.60 this is a _private_ function. You can call DestroyContext() to destroy the context created by CreateContext(). + + // NewFrame + IMGUI_API void UpdateInputEvents(bool trickle_fast_inputs); + IMGUI_API void UpdateHoveredWindowAndCaptureFlags(); + IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window); + IMGUI_API void UpdateMouseMovingWindowNewFrame(); + IMGUI_API void UpdateMouseMovingWindowEndFrame(); + + // Generic context hooks + IMGUI_API ImGuiID AddContextHook(ImGuiContext* context, const ImGuiContextHook* hook); + IMGUI_API void RemoveContextHook(ImGuiContext* context, ImGuiID hook_to_remove); + IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type); + + // Viewports + IMGUI_API void SetWindowViewport(ImGuiWindow* window, ImGuiViewportP* viewport); + + // Settings + IMGUI_API void MarkIniSettingsDirty(); + IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window); + IMGUI_API void ClearIniSettings(); + IMGUI_API void AddSettingsHandler(const ImGuiSettingsHandler* handler); + IMGUI_API void RemoveSettingsHandler(const char* type_name); + IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name); + + // Settings - Windows + IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name); + IMGUI_API ImGuiWindowSettings* FindWindowSettingsByID(ImGuiID id); + IMGUI_API ImGuiWindowSettings* FindWindowSettingsByWindow(ImGuiWindow* window); + IMGUI_API void ClearWindowSettings(const char* name); + + // Localization + IMGUI_API void LocalizeRegisterEntries(const ImGuiLocEntry* entries, int count); + inline const char* LocalizeGetMsg(ImGuiLocKey key) { ImGuiContext& g = *GImGui; const char* msg = g.LocalizationTable[key]; return msg ? msg : "*Missing Text*"; } + + // Scrolling + IMGUI_API void SetScrollX(ImGuiWindow* window, float scroll_x); + IMGUI_API void SetScrollY(ImGuiWindow* window, float scroll_y); + IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio); + IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio); + + // Early work-in-progress API (ScrollToItem() will become public) + IMGUI_API void ScrollToItem(ImGuiScrollFlags flags = 0); + IMGUI_API void ScrollToRect(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); + IMGUI_API ImVec2 ScrollToRectEx(ImGuiWindow* window, const ImRect& rect, ImGuiScrollFlags flags = 0); +//#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& rect) { ScrollToRect(window, rect, ImGuiScrollFlags_KeepVisibleEdgeY); } +//#endif + + // Basic Accessors + inline ImGuiItemStatusFlags GetItemStatusFlags(){ ImGuiContext& g = *GImGui; return g.LastItemData.StatusFlags; } + inline ImGuiItemFlags GetItemFlags() { ImGuiContext& g = *GImGui; return g.LastItemData.InFlags; } + inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; } + inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; } + IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void SetFocusID(ImGuiID id, ImGuiWindow* window); + IMGUI_API void ClearActiveID(); + IMGUI_API ImGuiID GetHoveredID(); + IMGUI_API void SetHoveredID(ImGuiID id); + IMGUI_API void KeepAliveID(ImGuiID id); + IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function. + IMGUI_API void PushOverrideID(ImGuiID id); // Push given value as-is at the top of the ID stack (whereas PushID combines old and new hashes) + IMGUI_API ImGuiID GetIDWithSeed(const char* str_id_begin, const char* str_id_end, ImGuiID seed); + IMGUI_API ImGuiID GetIDWithSeed(int n, ImGuiID seed); + + // Basic Helpers for widget code + IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f); + inline void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f) { ItemSize(bb.GetSize(), text_baseline_y); } // FIXME: This is a misleading API since we expect CursorPos to be bb.Min. + IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL, ImGuiItemFlags extra_flags = 0); + IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id); + IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id); + IMGUI_API void SetLastItemData(ImGuiID item_id, ImGuiItemFlags in_flags, ImGuiItemStatusFlags status_flags, const ImRect& item_rect); + IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h); + IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x); + IMGUI_API void PushMultiItemsWidths(int components, float width_full); + IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly) + IMGUI_API ImVec2 GetContentRegionMaxAbs(); + IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess); + + // Parameter stacks (shared) + IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled); + IMGUI_API void PopItemFlag(); + IMGUI_API const ImGuiDataVarInfo* GetStyleVarInfo(ImGuiStyleVar idx); + + // Logging/Capture + IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name. + IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer + IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL); + IMGUI_API void LogSetNextTextDecoration(const char* prefix, const char* suffix); + + // Popups, Modals, Tooltips + IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags); + IMGUI_API void OpenPopupEx(ImGuiID id, ImGuiPopupFlags popup_flags = ImGuiPopupFlags_None); + IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup); + IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup); + IMGUI_API void ClosePopupsExceptModals(); + IMGUI_API bool IsPopupOpen(ImGuiID id, ImGuiPopupFlags popup_flags); + IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags); + IMGUI_API bool BeginTooltipEx(ImGuiTooltipFlags tooltip_flags, ImGuiWindowFlags extra_window_flags); + IMGUI_API ImRect GetPopupAllowedExtentRect(ImGuiWindow* window); + IMGUI_API ImGuiWindow* GetTopMostPopupModal(); + IMGUI_API ImGuiWindow* GetTopMostAndVisiblePopupModal(); + IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window); + IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy); + + // Menus + IMGUI_API bool BeginViewportSideBar(const char* name, ImGuiViewport* viewport, ImGuiDir dir, float size, ImGuiWindowFlags window_flags); + IMGUI_API bool BeginMenuEx(const char* label, const char* icon, bool enabled = true); + IMGUI_API bool MenuItemEx(const char* label, const char* icon, const char* shortcut = NULL, bool selected = false, bool enabled = true); + + // Combos + IMGUI_API bool BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags); + IMGUI_API bool BeginComboPreview(); + IMGUI_API void EndComboPreview(); + + // Gamepad/Keyboard Navigation + IMGUI_API void NavInitWindow(ImGuiWindow* window, bool force_reinit); + IMGUI_API void NavInitRequestApplyResult(); + IMGUI_API bool NavMoveRequestButNoResultYet(); + IMGUI_API void NavMoveRequestSubmit(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); + IMGUI_API void NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, ImGuiNavMoveFlags move_flags, ImGuiScrollFlags scroll_flags); + IMGUI_API void NavMoveRequestResolveWithLastItem(ImGuiNavItemData* result); + IMGUI_API void NavMoveRequestCancel(); + IMGUI_API void NavMoveRequestApplyResult(); + IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags); + IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again. + IMGUI_API void SetNavWindow(ImGuiWindow* window); + IMGUI_API void SetNavID(ImGuiID id, ImGuiNavLayer nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel); + + // Inputs + // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions. + inline bool IsNamedKey(ImGuiKey key) { return key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END; } + inline bool IsNamedKeyOrModKey(ImGuiKey key) { return (key >= ImGuiKey_NamedKey_BEGIN && key < ImGuiKey_NamedKey_END) || key == ImGuiMod_Ctrl || key == ImGuiMod_Shift || key == ImGuiMod_Alt || key == ImGuiMod_Super || key == ImGuiMod_Shortcut; } + inline bool IsLegacyKey(ImGuiKey key) { return key >= ImGuiKey_LegacyNativeKey_BEGIN && key < ImGuiKey_LegacyNativeKey_END; } + inline bool IsKeyboardKey(ImGuiKey key) { return key >= ImGuiKey_Keyboard_BEGIN && key < ImGuiKey_Keyboard_END; } + inline bool IsGamepadKey(ImGuiKey key) { return key >= ImGuiKey_Gamepad_BEGIN && key < ImGuiKey_Gamepad_END; } + inline bool IsMouseKey(ImGuiKey key) { return key >= ImGuiKey_Mouse_BEGIN && key < ImGuiKey_Mouse_END; } + inline bool IsAliasKey(ImGuiKey key) { return key >= ImGuiKey_Aliases_BEGIN && key < ImGuiKey_Aliases_END; } + inline ImGuiKeyChord ConvertShortcutMod(ImGuiKeyChord key_chord) { ImGuiContext& g = *GImGui; IM_ASSERT_PARANOID(key_chord & ImGuiMod_Shortcut); return (key_chord & ~ImGuiMod_Shortcut) | (g.IO.ConfigMacOSXBehaviors ? ImGuiMod_Super : ImGuiMod_Ctrl); } + inline ImGuiKey ConvertSingleModFlagToKey(ImGuiKey key) + { + ImGuiContext& g = *GImGui; + if (key == ImGuiMod_Ctrl) return ImGuiKey_ReservedForModCtrl; + if (key == ImGuiMod_Shift) return ImGuiKey_ReservedForModShift; + if (key == ImGuiMod_Alt) return ImGuiKey_ReservedForModAlt; + if (key == ImGuiMod_Super) return ImGuiKey_ReservedForModSuper; + if (key == ImGuiMod_Shortcut) return (g.IO.ConfigMacOSXBehaviors ? ImGuiKey_ReservedForModSuper : ImGuiKey_ReservedForModCtrl); + return key; + } + + IMGUI_API ImGuiKeyData* GetKeyData(ImGuiKey key); + IMGUI_API void GetKeyChordName(ImGuiKeyChord key_chord, char* out_buf, int out_buf_size); + inline ImGuiKey MouseButtonToKey(ImGuiMouseButton button) { IM_ASSERT(button >= 0 && button < ImGuiMouseButton_COUNT); return (ImGuiKey)(ImGuiKey_MouseLeft + button); } + IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f); + IMGUI_API ImVec2 GetKeyMagnitude2d(ImGuiKey key_left, ImGuiKey key_right, ImGuiKey key_up, ImGuiKey key_down); + IMGUI_API float GetNavTweakPressedAmount(ImGuiAxis axis); + IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate); + IMGUI_API void GetTypematicRepeatRate(ImGuiInputFlags flags, float* repeat_delay, float* repeat_rate); + IMGUI_API void SetActiveIdUsingAllKeyboardKeys(); + inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; } + + // [EXPERIMENTAL] Low-Level: Key/Input Ownership + // - The idea is that instead of "eating" a given input, we can link to an owner id. + // - Ownership is most often claimed as a result of reacting to a press/down event (but occasionally may be claimed ahead). + // - Input queries can then read input by specifying ImGuiKeyOwner_Any (== 0), ImGuiKeyOwner_None (== -1) or a custom ID. + // - Legacy input queries (without specifying an owner or _Any or _None) are equivalent to using ImGuiKeyOwner_Any (== 0). + // - Input ownership is automatically released on the frame after a key is released. Therefore: + // - for ownership registration happening as a result of a down/press event, the SetKeyOwner() call may be done once (common case). + // - for ownership registration happening ahead of a down/press event, the SetKeyOwner() call needs to be made every frame (happens if e.g. claiming ownership on hover). + // - SetItemKeyOwner() is a shortcut for common simple case. A custom widget will probably want to call SetKeyOwner() multiple times directly based on its interaction state. + // - This is marked experimental because not all widgets are fully honoring the Set/Test idioms. We will need to move forward step by step. + // Please open a GitHub Issue to submit your usage scenario or if there's a use case you need solved. + IMGUI_API ImGuiID GetKeyOwner(ImGuiKey key); + IMGUI_API void SetKeyOwner(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API void SetItemKeyOwner(ImGuiKey key, ImGuiInputFlags flags = 0); // Set key owner to last item if it is hovered or active. Equivalent to 'if (IsItemHovered() || IsItemActive()) { SetKeyOwner(key, GetItemID());'. + IMGUI_API bool TestKeyOwner(ImGuiKey key, ImGuiID owner_id); // Test that key is either not owned, either owned by 'owner_id' + inline ImGuiKeyOwnerData* GetKeyOwnerData(ImGuiKey key) { if (key & ImGuiMod_Mask_) key = ConvertSingleModFlagToKey(key); IM_ASSERT(IsNamedKey(key)); return &GImGui->KeysOwnerData[key - ImGuiKey_NamedKey_BEGIN]; } + + // [EXPERIMENTAL] High-Level: Input Access functions w/ support for Key/Input Ownership + // - Important: legacy IsKeyPressed(ImGuiKey, bool repeat=true) _DEFAULTS_ to repeat, new IsKeyPressed() requires _EXPLICIT_ ImGuiInputFlags_Repeat flag. + // - Expected to be later promoted to public API, the prototypes are designed to replace existing ones (since owner_id can default to Any == 0) + // - Specifying a value for 'ImGuiID owner' will test that EITHER the key is NOT owned (UNLESS locked), EITHER the key is owned by 'owner'. + // Legacy functions use ImGuiKeyOwner_Any meaning that they typically ignore ownership, unless a call to SetKeyOwner() explicitly used ImGuiInputFlags_LockThisFrame or ImGuiInputFlags_LockUntilRelease. + // - Binding generators may want to ignore those for now, or suffix them with Ex() until we decide if this gets moved into public API. + IMGUI_API bool IsKeyDown(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsKeyPressed(ImGuiKey key, ImGuiID owner_id, ImGuiInputFlags flags = 0); // Important: when transitioning from old to new IsKeyPressed(): old API has "bool repeat = true", so would default to repeat. New API requiress explicit ImGuiInputFlags_Repeat. + IMGUI_API bool IsKeyReleased(ImGuiKey key, ImGuiID owner_id); + IMGUI_API bool IsMouseDown(ImGuiMouseButton button, ImGuiID owner_id); + IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, ImGuiID owner_id, ImGuiInputFlags flags = 0); + IMGUI_API bool IsMouseReleased(ImGuiMouseButton button, ImGuiID owner_id); + + // [EXPERIMENTAL] Shortcut Routing + // - ImGuiKeyChord = a ImGuiKey optionally OR-red with ImGuiMod_Alt/ImGuiMod_Ctrl/ImGuiMod_Shift/ImGuiMod_Super. + // ImGuiKey_C (accepted by functions taking ImGuiKey or ImGuiKeyChord) + // ImGuiKey_C | ImGuiMod_Ctrl (accepted by functions taking ImGuiKeyChord) + // ONLY ImGuiMod_XXX values are legal to 'OR' with an ImGuiKey. You CANNOT 'OR' two ImGuiKey values. + // - When using one of the routing flags (e.g. ImGuiInputFlags_RouteFocused): routes requested ahead of time given a chord (key + modifiers) and a routing policy. + // - Routes are resolved during NewFrame(): if keyboard modifiers are matching current ones: SetKeyOwner() is called + route is granted for the frame. + // - Route is granted to a single owner. When multiple requests are made we have policies to select the winning route. + // - Multiple read sites may use the same owner id and will all get the granted route. + // - For routing: when owner_id is 0 we use the current Focus Scope ID as a default owner in order to identify our location. + IMGUI_API bool Shortcut(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); + IMGUI_API bool SetShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id = 0, ImGuiInputFlags flags = 0); + IMGUI_API bool TestShortcutRouting(ImGuiKeyChord key_chord, ImGuiID owner_id); + IMGUI_API ImGuiKeyRoutingData* GetShortcutRoutingData(ImGuiKeyChord key_chord); + + // [EXPERIMENTAL] Focus Scope + // This is generally used to identify a unique input location (for e.g. a selection set) + // There is one per window (automatically set in Begin), but: + // - Selection patterns generally need to react (e.g. clear a selection) when landing on one item of the set. + // So in order to identify a set multiple lists in same window may each need a focus scope. + // If you imagine an hypothetical BeginSelectionGroup()/EndSelectionGroup() api, it would likely call PushFocusScope()/EndFocusScope() + // - Shortcut routing also use focus scope as a default location identifier if an owner is not provided. + // We don't use the ID Stack for this as it is common to want them separate. + IMGUI_API void PushFocusScope(ImGuiID id); + IMGUI_API void PopFocusScope(); + inline ImGuiID GetCurrentFocusScope() { ImGuiContext& g = *GImGui; return g.CurrentFocusScopeId; } // Focus scope we are outputting into, set by PushFocusScope() + + // Drag and Drop + IMGUI_API bool IsDragDropActive(); + IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id); + IMGUI_API void ClearDragDrop(); + IMGUI_API bool IsDragDropPayloadBeingAccepted(); + IMGUI_API void RenderDragDropTargetRect(const ImRect& bb); + + // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables API) + IMGUI_API void SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect); + IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiOldColumnFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns(). + IMGUI_API void EndColumns(); // close columns + IMGUI_API void PushColumnClipRect(int column_index); + IMGUI_API void PushColumnsBackground(); + IMGUI_API void PopColumnsBackground(); + IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count); + IMGUI_API ImGuiOldColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id); + IMGUI_API float GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm); + IMGUI_API float GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset); + + // Tables: Candidates for public API + IMGUI_API void TableOpenContextMenu(int column_n = -1); + IMGUI_API void TableSetColumnWidth(int column_n, float width); + IMGUI_API void TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs); + IMGUI_API int TableGetHoveredColumn(); // May use (TableGetColumnFlags() & ImGuiTableColumnFlags_IsHovered) instead. Return hovered column. return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. + IMGUI_API float TableGetHeaderRowHeight(); + IMGUI_API void TablePushBackgroundChannel(); + IMGUI_API void TablePopBackgroundChannel(); + + // Tables: Internals + inline ImGuiTable* GetCurrentTable() { ImGuiContext& g = *GImGui; return g.CurrentTable; } + IMGUI_API ImGuiTable* TableFindByID(ImGuiID id); + IMGUI_API bool BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags = 0, const ImVec2& outer_size = ImVec2(0, 0), float inner_width = 0.0f); + IMGUI_API void TableBeginInitMemory(ImGuiTable* table, int columns_count); + IMGUI_API void TableBeginApplyRequests(ImGuiTable* table); + IMGUI_API void TableSetupDrawChannels(ImGuiTable* table); + IMGUI_API void TableUpdateLayout(ImGuiTable* table); + IMGUI_API void TableUpdateBorders(ImGuiTable* table); + IMGUI_API void TableUpdateColumnsWeightFromWidth(ImGuiTable* table); + IMGUI_API void TableDrawBorders(ImGuiTable* table); + IMGUI_API void TableDrawContextMenu(ImGuiTable* table); + IMGUI_API bool TableBeginContextMenuPopup(ImGuiTable* table); + IMGUI_API void TableMergeDrawChannels(ImGuiTable* table); + inline ImGuiTableInstanceData* TableGetInstanceData(ImGuiTable* table, int instance_no) { if (instance_no == 0) return &table->InstanceDataFirst; return &table->InstanceDataExtra[instance_no - 1]; } + inline ImGuiID TableGetInstanceID(ImGuiTable* table, int instance_no) { return TableGetInstanceData(table, instance_no)->TableInstanceID; } + IMGUI_API void TableSortSpecsSanitize(ImGuiTable* table); + IMGUI_API void TableSortSpecsBuild(ImGuiTable* table); + IMGUI_API ImGuiSortDirection TableGetColumnNextSortDirection(ImGuiTableColumn* column); + IMGUI_API void TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API float TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column); + IMGUI_API void TableBeginRow(ImGuiTable* table); + IMGUI_API void TableEndRow(ImGuiTable* table); + IMGUI_API void TableBeginCell(ImGuiTable* table, int column_n); + IMGUI_API void TableEndCell(ImGuiTable* table); + IMGUI_API ImRect TableGetCellBgRect(const ImGuiTable* table, int column_n); + IMGUI_API const char* TableGetColumnName(const ImGuiTable* table, int column_n); + IMGUI_API ImGuiID TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no = 0); + IMGUI_API float TableGetMaxColumnWidth(const ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n); + IMGUI_API void TableSetColumnWidthAutoAll(ImGuiTable* table); + IMGUI_API void TableRemove(ImGuiTable* table); + IMGUI_API void TableGcCompactTransientBuffers(ImGuiTable* table); + IMGUI_API void TableGcCompactTransientBuffers(ImGuiTableTempData* table); + IMGUI_API void TableGcCompactSettings(); + + // Tables: Settings + IMGUI_API void TableLoadSettings(ImGuiTable* table); + IMGUI_API void TableSaveSettings(ImGuiTable* table); + IMGUI_API void TableResetSettings(ImGuiTable* table); + IMGUI_API ImGuiTableSettings* TableGetBoundSettings(ImGuiTable* table); + IMGUI_API void TableSettingsAddSettingsHandler(); + IMGUI_API ImGuiTableSettings* TableSettingsCreate(ImGuiID id, int columns_count); + IMGUI_API ImGuiTableSettings* TableSettingsFindByID(ImGuiID id); + + // Tab Bars + inline ImGuiTabBar* GetCurrentTabBar() { ImGuiContext& g = *GImGui; return g.CurrentTabBar; } + IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags); + IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API ImGuiTabItem* TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order); + IMGUI_API ImGuiTabItem* TabBarGetCurrentTab(ImGuiTabBar* tab_bar); + inline int TabBarGetTabOrder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) { return tab_bar->Tabs.index_from_ptr(tab); } + IMGUI_API const char* TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id); + IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + IMGUI_API void TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab); + IMGUI_API void TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset); + IMGUI_API void TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, ImVec2 mouse_pos); + IMGUI_API bool TabBarProcessReorder(ImGuiTabBar* tab_bar); + IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window); + IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker); + IMGUI_API ImVec2 TabItemCalcSize(ImGuiWindow* window); + IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col); + IMGUI_API void TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped); + + // Render helpers + // AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT. + // NB: All position are in absolute pixels coordinates (we are never using window coordinates internally) + IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true); + IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width); + IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL); + IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known); + IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f); + IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f); + IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImDrawList* draw_list, ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, ImDrawFlags flags = 0); + IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight + IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text. + IMGUI_API void RenderMouseCursor(ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow); + + // Render helpers (those functions don't access any ImGui state!) + IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f); + IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col); + IMGUI_API void RenderCheckMark(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz); + IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col); + IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding); + IMGUI_API void RenderRectFilledWithHole(ImDrawList* draw_list, const ImRect& outer, const ImRect& inner, ImU32 col, float rounding); + + // Widgets + IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0); + IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0, 0), ImGuiButtonFlags flags = 0); + IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0); + IMGUI_API bool ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags = 0); + IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags); + IMGUI_API void SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_width); + IMGUI_API bool CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value); + IMGUI_API bool CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value); + + // Widgets: Window Decorations + IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos); + IMGUI_API void Scrollbar(ImGuiAxis axis); + IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 avail_v, ImS64 contents_v, ImDrawFlags flags); + IMGUI_API ImRect GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis); + IMGUI_API ImGuiID GetWindowResizeCornerID(ImGuiWindow* window, int n); // 0..3: corners + IMGUI_API ImGuiID GetWindowResizeBorderID(ImGuiWindow* window, ImGuiDir dir); + + // Widgets low-level behaviors + IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0); + IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags); + IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f, ImU32 bg_col = 0); + IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL); + IMGUI_API void TreePushOverrideID(ImGuiID id); + IMGUI_API void TreeNodeSetOpen(ImGuiID id, bool open); + IMGUI_API bool TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags); // Return open state. Consume previous SetNextItemOpen() data, if any. May return true when logging. + + // Template functions are instantiated in imgui_widgets.cpp for a finite number of types. + // To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036). + // e.g. " extern template IMGUI_API float RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, float v); " + template IMGUI_API float ScaleRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template IMGUI_API T ScaleValueFromRatioT(ImGuiDataType data_type, float t, T v_min, T v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_size); + template IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, ImGuiSliderFlags flags); + template IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb); + template IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v); + template IMGUI_API bool CheckboxFlagsT(const char* label, T* flags, T flags_value); + + // Data type helpers + IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type); + IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format); + IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format); + IMGUI_API int DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2); + IMGUI_API bool DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max); + + // InputText + IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL); + IMGUI_API bool TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags); + IMGUI_API bool TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min = NULL, const void* p_clamp_max = NULL); + inline bool TempInputIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputId == id); } + inline ImGuiInputTextState* GetInputTextState(ImGuiID id) { ImGuiContext& g = *GImGui; return (id != 0 && g.InputTextState.ID == id) ? &g.InputTextState : NULL; } // Get input text state if active + + // Color + IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags); + IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags); + + // Plot + IMGUI_API int PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg); + + // Shade functions (write over already created vertices) + IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1); + IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp); + + // Garbage collection + IMGUI_API void GcCompactTransientMiscBuffers(); + IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window); + IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window); + + // Debug Log + IMGUI_API void DebugLog(const char* fmt, ...) IM_FMTARGS(1); + IMGUI_API void DebugLogV(const char* fmt, va_list args) IM_FMTLIST(1); + + // Debug Tools + IMGUI_API void ErrorCheckEndFrameRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); + IMGUI_API void ErrorCheckEndWindowRecover(ImGuiErrorLogCallback log_callback, void* user_data = NULL); + IMGUI_API void ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + IMGUI_API void DebugLocateItem(ImGuiID target_id); // Call sparingly: only 1 at the same time! + IMGUI_API void DebugLocateItemOnHover(ImGuiID target_id); // Only call on reaction to a mouse Hover: because only 1 at the same time! + IMGUI_API void DebugLocateItemResolveWithLastItem(); + inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(g.LastItemData.Rect.Min, g.LastItemData.Rect.Max, col); } + inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; } + IMGUI_API void ShowFontAtlas(ImFontAtlas* atlas); + IMGUI_API void DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* data_id, const void* data_id_end); + IMGUI_API void DebugNodeColumns(ImGuiOldColumns* columns); + IMGUI_API void DebugNodeDrawList(ImGuiWindow* window, const ImDrawList* draw_list, const char* label); + IMGUI_API void DebugNodeDrawCmdShowMeshAndBoundingBox(ImDrawList* out_draw_list, const ImDrawList* draw_list, const ImDrawCmd* draw_cmd, bool show_mesh, bool show_aabb); + IMGUI_API void DebugNodeFont(ImFont* font); + IMGUI_API void DebugNodeFontGlyph(ImFont* font, const ImFontGlyph* glyph); + IMGUI_API void DebugNodeStorage(ImGuiStorage* storage, const char* label); + IMGUI_API void DebugNodeTabBar(ImGuiTabBar* tab_bar, const char* label); + IMGUI_API void DebugNodeTable(ImGuiTable* table); + IMGUI_API void DebugNodeTableSettings(ImGuiTableSettings* settings); + IMGUI_API void DebugNodeInputTextState(ImGuiInputTextState* state); + IMGUI_API void DebugNodeWindow(ImGuiWindow* window, const char* label); + IMGUI_API void DebugNodeWindowSettings(ImGuiWindowSettings* settings); + IMGUI_API void DebugNodeWindowsList(ImVector* windows, const char* label); + IMGUI_API void DebugNodeWindowsListByBeginStackParent(ImGuiWindow** windows, int windows_size, ImGuiWindow* parent_in_begin_stack); + IMGUI_API void DebugNodeViewport(ImGuiViewportP* viewport); + IMGUI_API void DebugRenderKeyboardPreview(ImDrawList* draw_list); + IMGUI_API void DebugRenderViewportThumbnail(ImDrawList* draw_list, ImGuiViewportP* viewport, const ImRect& bb); + + // Obsolete functions +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + inline void SetItemUsingMouseWheel() { SetItemKeyOwner(ImGuiKey_MouseWheelY); } // Changed in 1.89 + inline bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0) { return TreeNodeUpdateNextOpen(id, flags); } // Renamed in 1.89 + + // Refactored focus/nav/tabbing system in 1.82 and 1.84. If you have old/custom copy-and-pasted widgets that used FocusableItemRegister(): + // (Old) IMGUI_VERSION_NUM < 18209: using 'ItemAdd(....)' and 'bool tab_focused = FocusableItemRegister(...)' + // (Old) IMGUI_VERSION_NUM >= 18209: using 'ItemAdd(..., ImGuiItemAddFlags_Focusable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_Focused) != 0' + // (New) IMGUI_VERSION_NUM >= 18413: using 'ItemAdd(..., ImGuiItemFlags_Inputable)' and 'bool tab_focused = (GetItemStatusFlags() & ImGuiItemStatusFlags_FocusedTabbing) != 0 || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))' (WIP) + // Widget code are simplified as there's no need to call FocusableItemUnregister() while managing the transition from regular widget to TempInputText() + inline bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id) { IM_ASSERT(0); IM_UNUSED(window); IM_UNUSED(id); return false; } // -> pass ImGuiItemAddFlags_Inputable flag to ItemAdd() + inline void FocusableItemUnregister(ImGuiWindow* window) { IM_ASSERT(0); IM_UNUSED(window); } // -> unnecessary: TempInputText() uses ImGuiInputTextFlags_MergedItem +#endif +#ifndef IMGUI_DISABLE_OBSOLETE_KEYIO + inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { IM_ASSERT(IsNamedKey(key)); return IsKeyPressed(key, repeat); } // Removed in 1.87: Mapping from named key is always identity! +#endif + +} // namespace ImGui + + +//----------------------------------------------------------------------------- +// [SECTION] ImFontAtlas internal API +//----------------------------------------------------------------------------- + +// This structure is likely to evolve as we add support for incremental atlas updates +struct ImFontBuilderIO +{ + bool (*FontBuilder_Build)(ImFontAtlas* atlas); +}; + +// Helper for font builder +#ifdef IMGUI_ENABLE_STB_TRUETYPE +IMGUI_API const ImFontBuilderIO* ImFontAtlasGetBuilderForStbTruetype(); +#endif +IMGUI_API void ImFontAtlasBuildInit(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent); +IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque); +IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas); +IMGUI_API void ImFontAtlasBuildRender8bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned char in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildRender32bppRectFromString(ImFontAtlas* atlas, int x, int y, int w, int h, const char* in_str, char in_marker_char, unsigned int in_marker_pixel_value); +IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor); +IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride); + +//----------------------------------------------------------------------------- +// [SECTION] Test Engine specific hooks (imgui_test_engine) +//----------------------------------------------------------------------------- + +#ifdef IMGUI_ENABLE_TEST_ENGINE +extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, ImGuiID id, const ImRect& bb, const ImGuiLastItemData* item_data); // item_data may be NULL +extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags); +extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...); +extern const char* ImGuiTestEngine_FindItemDebugLabel(ImGuiContext* ctx, ImGuiID id); + +// In IMGUI_VERSION_NUM >= 18934: changed IMGUI_TEST_ENGINE_ITEM_ADD(bb,id) to IMGUI_TEST_ENGINE_ITEM_ADD(id,bb,item_data); +#define IMGUI_TEST_ENGINE_ITEM_ADD(_ID,_BB,_ITEM_DATA) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemAdd(&g, _ID, _BB, _ITEM_DATA) // Register item bounding box +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) if (g.TestEngineHookItems) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional) +#define IMGUI_TEST_ENGINE_LOG(_FMT,...) if (g.TestEngineHookItems) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log +#else +#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB,_ID) ((void)0) +#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID,_LABEL,_FLAGS) ((void)g) +#endif + +//----------------------------------------------------------------------------- + +#if defined(__clang__) +#pragma clang diagnostic pop +#elif defined(__GNUC__) +#pragma GCC diagnostic pop +#endif + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui_tables.cpp b/ImGui/imgui_tables.cpp new file mode 100644 index 0000000..0c247fa --- /dev/null +++ b/ImGui/imgui_tables.cpp @@ -0,0 +1,4117 @@ +// dear imgui, v1.89.4 WIP +// (tables and columns code) + +/* + +Index of this file: + +// [SECTION] Commentary +// [SECTION] Header mess +// [SECTION] Tables: Main code +// [SECTION] Tables: Simple accessors +// [SECTION] Tables: Row changes +// [SECTION] Tables: Columns changes +// [SECTION] Tables: Columns width management +// [SECTION] Tables: Drawing +// [SECTION] Tables: Sorting +// [SECTION] Tables: Headers +// [SECTION] Tables: Context Menu +// [SECTION] Tables: Settings (.ini data) +// [SECTION] Tables: Garbage Collection +// [SECTION] Tables: Debugging +// [SECTION] Columns, BeginColumns, EndColumns, etc. + +*/ + +// Navigating this file: +// - In Visual Studio IDE: CTRL+comma ("Edit.GoToAll") can follow symbols in comments, whereas CTRL+F12 ("Edit.GoToImplementation") cannot. +// - With Visual Assist installed: ALT+G ("VAssistX.GoToImplementation") can also follow symbols in comments. + +//----------------------------------------------------------------------------- +// [SECTION] Commentary +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// Typical tables call flow: (root level is generally public API): +//----------------------------------------------------------------------------- +// - BeginTable() user begin into a table +// | BeginChild() - (if ScrollX/ScrollY is set) +// | TableBeginInitMemory() - first time table is used +// | TableResetSettings() - on settings reset +// | TableLoadSettings() - on settings load +// | TableBeginApplyRequests() - apply queued resizing/reordering/hiding requests +// | - TableSetColumnWidth() - apply resizing width (for mouse resize, often requested by previous frame) +// | - TableUpdateColumnsWeightFromWidth()- recompute columns weights (of stretch columns) from their respective width +// - TableSetupColumn() user submit columns details (optional) +// - TableSetupScrollFreeze() user submit scroll freeze information (optional) +//----------------------------------------------------------------------------- +// - TableUpdateLayout() [Internal] followup to BeginTable(): setup everything: widths, columns positions, clipping rectangles. Automatically called by the FIRST call to TableNextRow() or TableHeadersRow(). +// | TableSetupDrawChannels() - setup ImDrawList channels +// | TableUpdateBorders() - detect hovering columns for resize, ahead of contents submission +// | TableDrawContextMenu() - draw right-click context menu +//----------------------------------------------------------------------------- +// - TableHeadersRow() or TableHeader() user submit a headers row (optional) +// | TableSortSpecsClickColumn() - when left-clicked: alter sort order and sort direction +// | TableOpenContextMenu() - when right-clicked: trigger opening of the default context menu +// - TableGetSortSpecs() user queries updated sort specs (optional, generally after submitting headers) +// - TableNextRow() user begin into a new row (also automatically called by TableHeadersRow()) +// | TableEndRow() - finish existing row +// | TableBeginRow() - add a new row +// - TableSetColumnIndex() / TableNextColumn() user begin into a cell +// | TableEndCell() - close existing column/cell +// | TableBeginCell() - enter into current column/cell +// - [...] user emit contents +//----------------------------------------------------------------------------- +// - EndTable() user ends the table +// | TableDrawBorders() - draw outer borders, inner vertical borders +// | TableMergeDrawChannels() - merge draw channels if clipping isn't required +// | EndChild() - (if ScrollX/ScrollY is set) +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// TABLE SIZING +//----------------------------------------------------------------------------- +// (Read carefully because this is subtle but it does make sense!) +//----------------------------------------------------------------------------- +// About 'outer_size': +// Its meaning needs to differ slightly depending on if we are using ScrollX/ScrollY flags. +// Default value is ImVec2(0.0f, 0.0f). +// X +// - outer_size.x <= 0.0f -> Right-align from window/work-rect right-most edge. With -FLT_MIN or 0.0f will align exactly on right-most edge. +// - outer_size.x > 0.0f -> Set Fixed width. +// Y with ScrollX/ScrollY disabled: we output table directly in current window +// - outer_size.y < 0.0f -> Bottom-align (but will auto extend, unless _NoHostExtendY is set). Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> No minimum height (but will auto extend, unless _NoHostExtendY is set) +// - outer_size.y > 0.0f -> Set Minimum height (but will auto extend, unless _NoHostExtenY is set) +// Y with ScrollX/ScrollY enabled: using a child window for scrolling +// - outer_size.y < 0.0f -> Bottom-align. Not meaningful is parent window can vertically scroll. +// - outer_size.y = 0.0f -> Bottom-align, consistent with BeginChild(). Not recommended unless table is last item in parent window. +// - outer_size.y > 0.0f -> Set Exact height. Recommended when using Scrolling on any axis. +//----------------------------------------------------------------------------- +// Outer size is also affected by the NoHostExtendX/NoHostExtendY flags. +// Important to that note how the two flags have slightly different behaviors! +// - ImGuiTableFlags_NoHostExtendX -> Make outer width auto-fit to columns (overriding outer_size.x value). Only available when ScrollX/ScrollY are disabled and Stretch columns are not used. +// - ImGuiTableFlags_NoHostExtendY -> Make outer height stop exactly at outer_size.y (prevent auto-extending table past the limit). Only available when ScrollX/ScrollY is disabled. Data below the limit will be clipped and not visible. +// In theory ImGuiTableFlags_NoHostExtendY could be the default and any non-scrolling tables with outer_size.y != 0.0f would use exact height. +// This would be consistent but perhaps less useful and more confusing (as vertically clipped items are not easily noticeable) +//----------------------------------------------------------------------------- +// About 'inner_width': +// With ScrollX disabled: +// - inner_width -> *ignored* +// With ScrollX enabled: +// - inner_width < 0.0f -> *illegal* fit in known width (right align from outer_size.x) <-- weird +// - inner_width = 0.0f -> fit in outer_width: Fixed size columns will take space they need (if avail, otherwise shrink down), Stretch columns becomes Fixed columns. +// - inner_width > 0.0f -> override scrolling width, generally to be larger than outer_size.x. Fixed column take space they need (if avail, otherwise shrink down), Stretch columns share remaining space! +//----------------------------------------------------------------------------- +// Details: +// - If you want to use Stretch columns with ScrollX, you generally need to specify 'inner_width' otherwise the concept +// of "available space" doesn't make sense. +// - Even if not really useful, we allow 'inner_width < outer_size.x' for consistency and to facilitate understanding +// of what the value does. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// COLUMNS SIZING POLICIES +//----------------------------------------------------------------------------- +// About overriding column sizing policy and width/weight with TableSetupColumn(): +// We use a default parameter of 'init_width_or_weight == -1'. +// - with ImGuiTableColumnFlags_WidthFixed, init_width <= 0 (default) --> width is automatic +// - with ImGuiTableColumnFlags_WidthFixed, init_width > 0 (explicit) --> width is custom +// - with ImGuiTableColumnFlags_WidthStretch, init_weight <= 0 (default) --> weight is 1.0f +// - with ImGuiTableColumnFlags_WidthStretch, init_weight > 0 (explicit) --> weight is custom +// Widths are specified _without_ CellPadding. If you specify a width of 100.0f, the column will be cover (100.0f + Padding * 2.0f) +// and you can fit a 100.0f wide item in it without clipping and with full padding. +//----------------------------------------------------------------------------- +// About default sizing policy (if you don't specify a ImGuiTableColumnFlags_WidthXXXX flag) +// - with Table policy ImGuiTableFlags_SizingFixedFit --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is equal to contents width +// - with Table policy ImGuiTableFlags_SizingFixedSame --> default Column policy is ImGuiTableColumnFlags_WidthFixed, default Width is max of all contents width +// - with Table policy ImGuiTableFlags_SizingStretchSame --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is 1.0f +// - with Table policy ImGuiTableFlags_SizingStretchWeight --> default Column policy is ImGuiTableColumnFlags_WidthStretch, default Weight is proportional to contents +// Default Width and default Weight can be overridden when calling TableSetupColumn(). +//----------------------------------------------------------------------------- +// About mixing Fixed/Auto and Stretch columns together: +// - the typical use of mixing sizing policies is: any number of LEADING Fixed columns, followed by one or two TRAILING Stretch columns. +// - using mixed policies with ScrollX does not make much sense, as using Stretch columns with ScrollX does not make much sense in the first place! +// that is, unless 'inner_width' is passed to BeginTable() to explicitly provide a total width to layout columns in. +// - when using ImGuiTableFlags_SizingFixedSame with mixed columns, only the Fixed/Auto columns will match their widths to the width of the maximum contents. +// - when using ImGuiTableFlags_SizingStretchSame with mixed columns, only the Stretch columns will match their weight/widths. +//----------------------------------------------------------------------------- +// About using column width: +// If a column is manual resizable or has a width specified with TableSetupColumn(): +// - you may use GetContentRegionAvail().x to query the width available in a given column. +// - right-side alignment features such as SetNextItemWidth(-x) or PushItemWidth(-x) will rely on this width. +// If the column is not resizable and has no width specified with TableSetupColumn(): +// - its width will be automatic and be set to the max of items submitted. +// - therefore you generally cannot have ALL items of the columns use e.g. SetNextItemWidth(-FLT_MIN). +// - but if the column has one or more items of known/fixed size, this will become the reference width used by SetNextItemWidth(-FLT_MIN). +//----------------------------------------------------------------------------- + + +//----------------------------------------------------------------------------- +// TABLES CLIPPING/CULLING +//----------------------------------------------------------------------------- +// About clipping/culling of Rows in Tables: +// - For large numbers of rows, it is recommended you use ImGuiListClipper to only submit visible rows. +// ImGuiListClipper is reliant on the fact that rows are of equal height. +// See 'Demo->Tables->Vertical Scrolling' or 'Demo->Tables->Advanced' for a demo of using the clipper. +// - Note that auto-resizing columns don't play well with using the clipper. +// By default a table with _ScrollX but without _Resizable will have column auto-resize. +// So, if you want to use the clipper, make sure to either enable _Resizable, either setup columns width explicitly with _WidthFixed. +//----------------------------------------------------------------------------- +// About clipping/culling of Columns in Tables: +// - Both TableSetColumnIndex() and TableNextColumn() return true when the column is visible or performing +// width measurements. Otherwise, you may skip submitting the contents of a cell/column, BUT ONLY if you know +// it is not going to contribute to row height. +// In many situations, you may skip submitting contents for every column but one (e.g. the first one). +// - Case A: column is not hidden by user, and at least partially in sight (most common case). +// - Case B: column is clipped / out of sight (because of scrolling or parent ClipRect): TableNextColumn() return false as a hint but we still allow layout output. +// - Case C: column is hidden explicitly by the user (e.g. via the context menu, or _DefaultHide column flag, etc.). +// +// [A] [B] [C] +// TableNextColumn(): true false false -> [userland] when TableNextColumn() / TableSetColumnIndex() return false, user can skip submitting items but only if the column doesn't contribute to row height. +// SkipItems: false false true -> [internal] when SkipItems is true, most widgets will early out if submitted, resulting is no layout output. +// ClipRect: normal zero-width zero-width -> [internal] when ClipRect is zero, ItemAdd() will return false and most widgets will early out mid-way. +// ImDrawList output: normal dummy dummy -> [internal] when using the dummy channel, ImDrawList submissions (if any) will be wasted (because cliprect is zero-width anyway). +// +// - We need to distinguish those cases because non-hidden columns that are clipped outside of scrolling bounds should still contribute their height to the row. +// However, in the majority of cases, the contribution to row height is the same for all columns, or the tallest cells are known by the programmer. +//----------------------------------------------------------------------------- +// About clipping/culling of whole Tables: +// - Scrolling tables with a known outer size can be clipped earlier as BeginTable() will return false. +//----------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// [SECTION] Header mess +//----------------------------------------------------------------------------- + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE +#include "imgui_internal.h" + +// System includes +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#endif + +//----------------------------------------------------------------------------- +// [SECTION] Tables: Main code +//----------------------------------------------------------------------------- +// - TableFixFlags() [Internal] +// - TableFindByID() [Internal] +// - BeginTable() +// - BeginTableEx() [Internal] +// - TableBeginInitMemory() [Internal] +// - TableBeginApplyRequests() [Internal] +// - TableSetupColumnFlags() [Internal] +// - TableUpdateLayout() [Internal] +// - TableUpdateBorders() [Internal] +// - EndTable() +// - TableSetupColumn() +// - TableSetupScrollFreeze() +//----------------------------------------------------------------------------- + +// Configuration +static const int TABLE_DRAW_CHANNEL_BG0 = 0; +static const int TABLE_DRAW_CHANNEL_BG2_FROZEN = 1; +static const int TABLE_DRAW_CHANNEL_NOCLIP = 2; // When using ImGuiTableFlags_NoClip (this becomes the last visible channel) +static const float TABLE_BORDER_SIZE = 1.0f; // FIXME-TABLE: Currently hard-coded because of clipping assumptions with outer borders rendering. +static const float TABLE_RESIZE_SEPARATOR_HALF_THICKNESS = 4.0f; // Extend outside inner borders. +static const float TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER = 0.06f; // Delay/timer before making the hover feedback (color+cursor) visible because tables/columns tends to be more cramped. + +// Helper +inline ImGuiTableFlags TableFixFlags(ImGuiTableFlags flags, ImGuiWindow* outer_window) +{ + // Adjust flags: set default sizing policy + if ((flags & ImGuiTableFlags_SizingMask_) == 0) + flags |= ((flags & ImGuiTableFlags_ScrollX) || (outer_window->Flags & ImGuiWindowFlags_AlwaysAutoResize)) ? ImGuiTableFlags_SizingFixedFit : ImGuiTableFlags_SizingStretchSame; + + // Adjust flags: enable NoKeepColumnsVisible when using ImGuiTableFlags_SizingFixedSame + if ((flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableFlags_NoKeepColumnsVisible; + + // Adjust flags: enforce borders when resizable + if (flags & ImGuiTableFlags_Resizable) + flags |= ImGuiTableFlags_BordersInnerV; + + // Adjust flags: disable NoHostExtendX/NoHostExtendY if we have any scrolling going on + if (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) + flags &= ~(ImGuiTableFlags_NoHostExtendX | ImGuiTableFlags_NoHostExtendY); + + // Adjust flags: NoBordersInBodyUntilResize takes priority over NoBordersInBody + if (flags & ImGuiTableFlags_NoBordersInBodyUntilResize) + flags &= ~ImGuiTableFlags_NoBordersInBody; + + // Adjust flags: disable saved settings if there's nothing to save + if ((flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Hideable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Sortable)) == 0) + flags |= ImGuiTableFlags_NoSavedSettings; + + // Inherit _NoSavedSettings from top-level window (child windows always have _NoSavedSettings set) + if (outer_window->RootWindow->Flags & ImGuiWindowFlags_NoSavedSettings) + flags |= ImGuiTableFlags_NoSavedSettings; + + return flags; +} + +ImGuiTable* ImGui::TableFindByID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + return g.Tables.GetByKey(id); +} + +// Read about "TABLE SIZING" at the top of this file. +bool ImGui::BeginTable(const char* str_id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiID id = GetID(str_id); + return BeginTableEx(str_id, id, columns_count, flags, outer_size, inner_width); +} + +bool ImGui::BeginTableEx(const char* name, ImGuiID id, int columns_count, ImGuiTableFlags flags, const ImVec2& outer_size, float inner_width) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* outer_window = GetCurrentWindow(); + if (outer_window->SkipItems) // Consistent with other tables + beneficial side effect that assert on miscalling EndTable() will be more visible. + return false; + + // Sanity checks + IM_ASSERT(columns_count > 0 && columns_count < IMGUI_TABLE_MAX_COLUMNS); + if (flags & ImGuiTableFlags_ScrollX) + IM_ASSERT(inner_width >= 0.0f); + + // If an outer size is specified ahead we will be able to early out when not visible. Exact clipping rules may evolve. + const bool use_child_window = (flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) != 0; + const ImVec2 avail_size = GetContentRegionAvail(); + ImVec2 actual_outer_size = CalcItemSize(outer_size, ImMax(avail_size.x, 1.0f), use_child_window ? ImMax(avail_size.y, 1.0f) : 0.0f); + ImRect outer_rect(outer_window->DC.CursorPos, outer_window->DC.CursorPos + actual_outer_size); + if (use_child_window && IsClippedEx(outer_rect, 0)) + { + ItemSize(outer_rect); + return false; + } + + // Acquire storage for the table + ImGuiTable* table = g.Tables.GetOrAddByKey(id); + const ImGuiTableFlags table_last_flags = table->Flags; + + // Acquire temporary buffers + const int table_idx = g.Tables.GetIndex(table); + if (++g.TablesTempDataStacked > g.TablesTempData.Size) + g.TablesTempData.resize(g.TablesTempDataStacked, ImGuiTableTempData()); + ImGuiTableTempData* temp_data = table->TempData = &g.TablesTempData[g.TablesTempDataStacked - 1]; + temp_data->TableIndex = table_idx; + table->DrawSplitter = &table->TempData->DrawSplitter; + table->DrawSplitter->Clear(); + + // Fix flags + table->IsDefaultSizingPolicy = (flags & ImGuiTableFlags_SizingMask_) == 0; + flags = TableFixFlags(flags, outer_window); + + // Initialize + const int instance_no = (table->LastFrameActive != g.FrameCount) ? 0 : table->InstanceCurrent + 1; + table->ID = id; + table->Flags = flags; + table->LastFrameActive = g.FrameCount; + table->OuterWindow = table->InnerWindow = outer_window; + table->ColumnsCount = columns_count; + table->IsLayoutLocked = false; + table->InnerWidth = inner_width; + temp_data->UserOuterSize = outer_size; + + // Instance data (for instance 0, TableID == TableInstanceID) + ImGuiID instance_id; + table->InstanceCurrent = (ImS16)instance_no; + if (instance_no > 0) + { + IM_ASSERT(table->ColumnsCount == columns_count && "BeginTable(): Cannot change columns count mid-frame while preserving same ID"); + if (table->InstanceDataExtra.Size < instance_no) + table->InstanceDataExtra.push_back(ImGuiTableInstanceData()); + instance_id = GetIDWithSeed(instance_no, GetIDWithSeed("##Instances", NULL, id)); // Push "##Instance" followed by (int)instance_no in ID stack. + } + else + { + instance_id = id; + } + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + table_instance->TableInstanceID = instance_id; + + // When not using a child window, WorkRect.Max will grow as we append contents. + if (use_child_window) + { + // Ensure no vertical scrollbar appears if we only want horizontal one, to make flag consistent + // (we have no other way to disable vertical scrollbar of a window while keeping the horizontal one showing) + ImVec2 override_content_size(FLT_MAX, FLT_MAX); + if ((flags & ImGuiTableFlags_ScrollX) && !(flags & ImGuiTableFlags_ScrollY)) + override_content_size.y = FLT_MIN; + + // Ensure specified width (when not specified, Stretched columns will act as if the width == OuterWidth and + // never lead to any scrolling). We don't handle inner_width < 0.0f, we could potentially use it to right-align + // based on the right side of the child window work rect, which would require knowing ahead if we are going to + // have decoration taking horizontal spaces (typically a vertical scrollbar). + if ((flags & ImGuiTableFlags_ScrollX) && inner_width > 0.0f) + override_content_size.x = inner_width; + + if (override_content_size.x != FLT_MAX || override_content_size.y != FLT_MAX) + SetNextWindowContentSize(ImVec2(override_content_size.x != FLT_MAX ? override_content_size.x : 0.0f, override_content_size.y != FLT_MAX ? override_content_size.y : 0.0f)); + + // Reset scroll if we are reactivating it + if ((table_last_flags & (ImGuiTableFlags_ScrollX | ImGuiTableFlags_ScrollY)) == 0) + SetNextWindowScroll(ImVec2(0.0f, 0.0f)); + + // Create scrolling region (without border and zero window padding) + ImGuiWindowFlags child_flags = (flags & ImGuiTableFlags_ScrollX) ? ImGuiWindowFlags_HorizontalScrollbar : ImGuiWindowFlags_None; + BeginChildEx(name, instance_id, outer_rect.GetSize(), false, child_flags); + table->InnerWindow = g.CurrentWindow; + table->WorkRect = table->InnerWindow->WorkRect; + table->OuterRect = table->InnerWindow->Rect(); + table->InnerRect = table->InnerWindow->InnerRect; + IM_ASSERT(table->InnerWindow->WindowPadding.x == 0.0f && table->InnerWindow->WindowPadding.y == 0.0f && table->InnerWindow->WindowBorderSize == 0.0f); + + // When using multiple instances, ensure they have the same amount of horizontal decorations (aka vertical scrollbar) so stretched columns can be aligned) + if (instance_no == 0) + { + table->HasScrollbarYPrev = table->HasScrollbarYCurr; + table->HasScrollbarYCurr = false; + } + table->HasScrollbarYCurr |= (table->InnerWindow->ScrollMax.y > 0.0f); + } + else + { + // For non-scrolling tables, WorkRect == OuterRect == InnerRect. + // But at this point we do NOT have a correct value for .Max.y (unless a height has been explicitly passed in). It will only be updated in EndTable(). + table->WorkRect = table->OuterRect = table->InnerRect = outer_rect; + } + + // Push a standardized ID for both child-using and not-child-using tables + PushOverrideID(id); + if (instance_no > 0) + PushOverrideID(instance_id); // FIXME: Somehow this is not resolved by stack-tool, even tho GetIDWithSeed() submitted the symbol. + + // Backup a copy of host window members we will modify + ImGuiWindow* inner_window = table->InnerWindow; + table->HostIndentX = inner_window->DC.Indent.x; + table->HostClipRect = inner_window->ClipRect; + table->HostSkipItems = inner_window->SkipItems; + temp_data->HostBackupWorkRect = inner_window->WorkRect; + temp_data->HostBackupParentWorkRect = inner_window->ParentWorkRect; + temp_data->HostBackupColumnsOffset = outer_window->DC.ColumnsOffset; + temp_data->HostBackupPrevLineSize = inner_window->DC.PrevLineSize; + temp_data->HostBackupCurrLineSize = inner_window->DC.CurrLineSize; + temp_data->HostBackupCursorMaxPos = inner_window->DC.CursorMaxPos; + temp_data->HostBackupItemWidth = outer_window->DC.ItemWidth; + temp_data->HostBackupItemWidthStackSize = outer_window->DC.ItemWidthStack.Size; + inner_window->DC.PrevLineSize = inner_window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + + // Padding and Spacing + // - None ........Content..... Pad .....Content........ + // - PadOuter | Pad ..Content..... Pad .....Content.. Pad | + // - PadInner ........Content.. Pad | Pad ..Content........ + // - PadOuter+PadInner | Pad ..Content.. Pad | Pad ..Content.. Pad | + const bool pad_outer_x = (flags & ImGuiTableFlags_NoPadOuterX) ? false : (flags & ImGuiTableFlags_PadOuterX) ? true : (flags & ImGuiTableFlags_BordersOuterV) != 0; + const bool pad_inner_x = (flags & ImGuiTableFlags_NoPadInnerX) ? false : true; + const float inner_spacing_for_border = (flags & ImGuiTableFlags_BordersInnerV) ? TABLE_BORDER_SIZE : 0.0f; + const float inner_spacing_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) == 0) ? g.Style.CellPadding.x : 0.0f; + const float inner_padding_explicit = (pad_inner_x && (flags & ImGuiTableFlags_BordersInnerV) != 0) ? g.Style.CellPadding.x : 0.0f; + table->CellSpacingX1 = inner_spacing_explicit + inner_spacing_for_border; + table->CellSpacingX2 = inner_spacing_explicit; + table->CellPaddingX = inner_padding_explicit; + table->CellPaddingY = g.Style.CellPadding.y; + + const float outer_padding_for_border = (flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + const float outer_padding_explicit = pad_outer_x ? g.Style.CellPadding.x : 0.0f; + table->OuterPaddingX = (outer_padding_for_border + outer_padding_explicit) - table->CellPaddingX; + + table->CurrentColumn = -1; + table->CurrentRow = -1; + table->RowBgColorCounter = 0; + table->LastRowFlags = ImGuiTableRowFlags_None; + table->InnerClipRect = (inner_window == outer_window) ? table->WorkRect : inner_window->ClipRect; + table->InnerClipRect.ClipWith(table->WorkRect); // We need this to honor inner_width + table->InnerClipRect.ClipWithFull(table->HostClipRect); + table->InnerClipRect.Max.y = (flags & ImGuiTableFlags_NoHostExtendY) ? ImMin(table->InnerClipRect.Max.y, inner_window->WorkRect.Max.y) : inner_window->ClipRect.Max.y; + + table->RowPosY1 = table->RowPosY2 = table->WorkRect.Min.y; // This is needed somehow + table->RowTextBaseline = 0.0f; // This will be cleared again by TableBeginRow() + table->FreezeRowsRequest = table->FreezeRowsCount = 0; // This will be setup by TableSetupScrollFreeze(), if any + table->FreezeColumnsRequest = table->FreezeColumnsCount = 0; + table->IsUnfrozenRows = true; + table->DeclColumnsCount = 0; + + // Using opaque colors facilitate overlapping elements of the grid + table->BorderColorStrong = GetColorU32(ImGuiCol_TableBorderStrong); + table->BorderColorLight = GetColorU32(ImGuiCol_TableBorderLight); + + // Make table current + g.CurrentTable = table; + outer_window->DC.CurrentTableIdx = table_idx; + if (inner_window != outer_window) // So EndChild() within the inner window can restore the table properly. + inner_window->DC.CurrentTableIdx = table_idx; + + if ((table_last_flags & ImGuiTableFlags_Reorderable) && (flags & ImGuiTableFlags_Reorderable) == 0) + table->IsResetDisplayOrderRequest = true; + + // Mark as used + if (table_idx >= g.TablesLastTimeActive.Size) + g.TablesLastTimeActive.resize(table_idx + 1, -1.0f); + g.TablesLastTimeActive[table_idx] = (float)g.Time; + temp_data->LastTimeActive = (float)g.Time; + table->MemoryCompacted = false; + + // Setup memory buffer (clear data if columns count changed) + ImGuiTableColumn* old_columns_to_preserve = NULL; + void* old_columns_raw_data = NULL; + const int old_columns_count = table->Columns.size(); + if (old_columns_count != 0 && old_columns_count != columns_count) + { + // Attempt to preserve width on column count change (#4046) + old_columns_to_preserve = table->Columns.Data; + old_columns_raw_data = table->RawData; + table->RawData = NULL; + } + if (table->RawData == NULL) + { + TableBeginInitMemory(table, columns_count); + table->IsInitializing = table->IsSettingsRequestLoad = true; + } + if (table->IsResetAllRequest) + TableResetSettings(table); + if (table->IsInitializing) + { + // Initialize + table->SettingsOffset = -1; + table->IsSortSpecsDirty = true; + table->InstanceInteracted = -1; + table->ContextPopupColumn = -1; + table->ReorderColumn = table->ResizedColumn = table->LastResizedColumn = -1; + table->AutoFitSingleColumn = -1; + table->HoveredColumnBody = table->HoveredColumnBorder = -1; + for (int n = 0; n < columns_count; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + if (old_columns_to_preserve && n < old_columns_count) + { + // FIXME: We don't attempt to preserve column order in this path. + *column = old_columns_to_preserve[n]; + } + else + { + float width_auto = column->WidthAuto; + *column = ImGuiTableColumn(); + column->WidthAuto = width_auto; + column->IsPreserveWidthAuto = true; // Preserve WidthAuto when reinitializing a live table: not technically necessary but remove a visible flicker + column->IsEnabled = column->IsUserEnabled = column->IsUserEnabledNextFrame = true; + } + column->DisplayOrder = table->DisplayOrderToIndex[n] = (ImGuiTableColumnIdx)n; + } + } + if (old_columns_raw_data) + IM_FREE(old_columns_raw_data); + + // Load settings + if (table->IsSettingsRequestLoad) + TableLoadSettings(table); + + // Handle DPI/font resize + // This is designed to facilitate DPI changes with the assumption that e.g. style.CellPadding has been scaled as well. + // It will also react to changing fonts with mixed results. It doesn't need to be perfect but merely provide a decent transition. + // FIXME-DPI: Provide consistent standards for reference size. Perhaps using g.CurrentDpiScale would be more self explanatory. + // This is will lead us to non-rounded WidthRequest in columns, which should work but is a poorly tested path. + const float new_ref_scale_unit = g.FontSize; // g.Font->GetCharAdvance('A') ? + if (table->RefScale != 0.0f && table->RefScale != new_ref_scale_unit) + { + const float scale_factor = new_ref_scale_unit / table->RefScale; + //IMGUI_DEBUG_PRINT("[table] %08X RefScaleUnit %.3f -> %.3f, scaling width by %.3f\n", table->ID, table->RefScaleUnit, new_ref_scale_unit, scale_factor); + for (int n = 0; n < columns_count; n++) + table->Columns[n].WidthRequest = table->Columns[n].WidthRequest * scale_factor; + } + table->RefScale = new_ref_scale_unit; + + // Disable output until user calls TableNextRow() or TableNextColumn() leading to the TableUpdateLayout() call.. + // This is not strictly necessary but will reduce cases were "out of table" output will be misleading to the user. + // Because we cannot safely assert in EndTable() when no rows have been created, this seems like our best option. + inner_window->SkipItems = true; + + // Clear names + // At this point the ->NameOffset field of each column will be invalid until TableUpdateLayout() or the first call to TableSetupColumn() + if (table->ColumnsNames.Buf.Size > 0) + table->ColumnsNames.Buf.resize(0); + + // Apply queued resizing/reordering/hiding requests + TableBeginApplyRequests(table); + + return true; +} + +// For reference, the average total _allocation count_ for a table is: +// + 0 (for ImGuiTable instance, we are pooling allocations in g.Tables) +// + 1 (for table->RawData allocated below) +// + 1 (for table->ColumnsNames, if names are used) +// Shared allocations per number of nested tables +// + 1 (for table->Splitter._Channels) +// + 2 * active_channels_count (for ImDrawCmd and ImDrawIdx buffers inside channels) +// Where active_channels_count is variable but often == columns_count or columns_count + 1, see TableSetupDrawChannels() for details. +// Unused channels don't perform their +2 allocations. +void ImGui::TableBeginInitMemory(ImGuiTable* table, int columns_count) +{ + // Allocate single buffer for our arrays + const int columns_bit_array_size = (int)ImBitArrayGetStorageSizeInBytes(columns_count); + ImSpanAllocator<6> span_allocator; + span_allocator.Reserve(0, columns_count * sizeof(ImGuiTableColumn)); + span_allocator.Reserve(1, columns_count * sizeof(ImGuiTableColumnIdx)); + span_allocator.Reserve(2, columns_count * sizeof(ImGuiTableCellData), 4); + for (int n = 3; n < 6; n++) + span_allocator.Reserve(n, columns_bit_array_size); + table->RawData = IM_ALLOC(span_allocator.GetArenaSizeInBytes()); + memset(table->RawData, 0, span_allocator.GetArenaSizeInBytes()); + span_allocator.SetArenaBasePtr(table->RawData); + span_allocator.GetSpan(0, &table->Columns); + span_allocator.GetSpan(1, &table->DisplayOrderToIndex); + span_allocator.GetSpan(2, &table->RowCellData); + table->EnabledMaskByDisplayOrder = (ImU32*)span_allocator.GetSpanPtrBegin(3); + table->EnabledMaskByIndex = (ImU32*)span_allocator.GetSpanPtrBegin(4); + table->VisibleMaskByIndex = (ImU32*)span_allocator.GetSpanPtrBegin(5); +} + +// Apply queued resizing/reordering/hiding requests +void ImGui::TableBeginApplyRequests(ImGuiTable* table) +{ + // Handle resizing request + // (We process this at the first TableBegin of the frame) + // FIXME-TABLE: Contains columns if our work area doesn't allow for scrolling? + if (table->InstanceCurrent == 0) + { + if (table->ResizedColumn != -1 && table->ResizedColumnNextWidth != FLT_MAX) + TableSetColumnWidth(table->ResizedColumn, table->ResizedColumnNextWidth); + table->LastResizedColumn = table->ResizedColumn; + table->ResizedColumnNextWidth = FLT_MAX; + table->ResizedColumn = -1; + + // Process auto-fit for single column, which is a special case for stretch columns and fixed columns with FixedSame policy. + // FIXME-TABLE: Would be nice to redistribute available stretch space accordingly to other weights, instead of giving it all to siblings. + if (table->AutoFitSingleColumn != -1) + { + TableSetColumnWidth(table->AutoFitSingleColumn, table->Columns[table->AutoFitSingleColumn].WidthAuto); + table->AutoFitSingleColumn = -1; + } + } + + // Handle reordering request + // Note: we don't clear ReorderColumn after handling the request. + if (table->InstanceCurrent == 0) + { + if (table->HeldHeaderColumn == -1 && table->ReorderColumn != -1) + table->ReorderColumn = -1; + table->HeldHeaderColumn = -1; + if (table->ReorderColumn != -1 && table->ReorderColumnDir != 0) + { + // We need to handle reordering across hidden columns. + // In the configuration below, moving C to the right of E will lead to: + // ... C [D] E ---> ... [D] E C (Column name/index) + // ... 2 3 4 ... 2 3 4 (Display order) + const int reorder_dir = table->ReorderColumnDir; + IM_ASSERT(reorder_dir == -1 || reorder_dir == +1); + IM_ASSERT(table->Flags & ImGuiTableFlags_Reorderable); + ImGuiTableColumn* src_column = &table->Columns[table->ReorderColumn]; + ImGuiTableColumn* dst_column = &table->Columns[(reorder_dir == -1) ? src_column->PrevEnabledColumn : src_column->NextEnabledColumn]; + IM_UNUSED(dst_column); + const int src_order = src_column->DisplayOrder; + const int dst_order = dst_column->DisplayOrder; + src_column->DisplayOrder = (ImGuiTableColumnIdx)dst_order; + for (int order_n = src_order + reorder_dir; order_n != dst_order + reorder_dir; order_n += reorder_dir) + table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder -= (ImGuiTableColumnIdx)reorder_dir; + IM_ASSERT(dst_column->DisplayOrder == dst_order - reorder_dir); + + // Display order is stored in both columns->IndexDisplayOrder and table->DisplayOrder[], + // rebuild the later from the former. + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; + table->ReorderColumnDir = 0; + table->IsSettingsDirty = true; + } + } + + // Handle display order reset request + if (table->IsResetDisplayOrderRequest) + { + for (int n = 0; n < table->ColumnsCount; n++) + table->DisplayOrderToIndex[n] = table->Columns[n].DisplayOrder = (ImGuiTableColumnIdx)n; + table->IsResetDisplayOrderRequest = false; + table->IsSettingsDirty = true; + } +} + +// Adjust flags: default width mode + stretch columns are not allowed when auto extending +static void TableSetupColumnFlags(ImGuiTable* table, ImGuiTableColumn* column, ImGuiTableColumnFlags flags_in) +{ + ImGuiTableColumnFlags flags = flags_in; + + // Sizing Policy + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0) + { + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + if (table_sizing_policy == ImGuiTableFlags_SizingFixedFit || table_sizing_policy == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + else + flags |= ImGuiTableColumnFlags_WidthStretch; + } + else + { + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_WidthMask_)); // Check that only 1 of each set is used. + } + + // Resize + if ((table->Flags & ImGuiTableFlags_Resizable) == 0) + flags |= ImGuiTableColumnFlags_NoResize; + + // Sorting + if ((flags & ImGuiTableColumnFlags_NoSortAscending) && (flags & ImGuiTableColumnFlags_NoSortDescending)) + flags |= ImGuiTableColumnFlags_NoSort; + + // Indentation + if ((flags & ImGuiTableColumnFlags_IndentMask_) == 0) + flags |= (table->Columns.index_from_ptr(column) == 0) ? ImGuiTableColumnFlags_IndentEnable : ImGuiTableColumnFlags_IndentDisable; + + // Alignment + //if ((flags & ImGuiTableColumnFlags_AlignMask_) == 0) + // flags |= ImGuiTableColumnFlags_AlignCenter; + //IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiTableColumnFlags_AlignMask_)); // Check that only 1 of each set is used. + + // Preserve status flags + column->Flags = flags | (column->Flags & ImGuiTableColumnFlags_StatusMask_); + + // Build an ordered list of available sort directions + column->SortDirectionsAvailCount = column->SortDirectionsAvailMask = column->SortDirectionsAvailList = 0; + if (table->Flags & ImGuiTableFlags_Sortable) + { + int count = 0, mask = 0, list = 0; + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) != 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) != 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortAscending) == 0 && (flags & ImGuiTableColumnFlags_NoSortAscending) == 0) { mask |= 1 << ImGuiSortDirection_Ascending; list |= ImGuiSortDirection_Ascending << (count << 1); count++; } + if ((flags & ImGuiTableColumnFlags_PreferSortDescending) == 0 && (flags & ImGuiTableColumnFlags_NoSortDescending) == 0) { mask |= 1 << ImGuiSortDirection_Descending; list |= ImGuiSortDirection_Descending << (count << 1); count++; } + if ((table->Flags & ImGuiTableFlags_SortTristate) || count == 0) { mask |= 1 << ImGuiSortDirection_None; count++; } + column->SortDirectionsAvailList = (ImU8)list; + column->SortDirectionsAvailMask = (ImU8)mask; + column->SortDirectionsAvailCount = (ImU8)count; + ImGui::TableFixColumnSortDirection(table, column); + } +} + +// Layout columns for the frame. This is in essence the followup to BeginTable(). +// Runs on the first call to TableNextRow(), to give a chance for TableSetupColumn() to be called first. +// FIXME-TABLE: Our width (and therefore our WorkRect) will be minimal in the first frame for _WidthAuto columns. +// Increase feedback side-effect with widgets relying on WorkRect.Max.x... Maybe provide a default distribution for _WidthAuto columns? +void ImGui::TableUpdateLayout(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->IsLayoutLocked == false); + + const ImGuiTableFlags table_sizing_policy = (table->Flags & ImGuiTableFlags_SizingMask_); + table->IsDefaultDisplayOrder = true; + table->ColumnsEnabledCount = 0; + ImBitArrayClearAllBits(table->EnabledMaskByIndex, table->ColumnsCount); + ImBitArrayClearAllBits(table->EnabledMaskByDisplayOrder, table->ColumnsCount); + table->LeftMostEnabledColumn = -1; + table->MinColumnWidth = ImMax(1.0f, g.Style.FramePadding.x * 1.0f); // g.Style.ColumnsMinSpacing; // FIXME-TABLE + + // [Part 1] Apply/lock Enabled and Order states. Calculate auto/ideal width for columns. Count fixed/stretch columns. + // Process columns in their visible orders as we are building the Prev/Next indices. + int count_fixed = 0; // Number of columns that have fixed sizing policies + int count_stretch = 0; // Number of columns that have stretch sizing policies + int prev_visible_column_idx = -1; + bool has_auto_fit_request = false; + bool has_resizable = false; + float stretch_sum_width_auto = 0.0f; + float fixed_max_width_auto = 0.0f; + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + if (column_n != order_n) + table->IsDefaultDisplayOrder = false; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Clear column setup if not submitted by user. Currently we make it mandatory to call TableSetupColumn() every frame. + // It would easily work without but we're not ready to guarantee it since e.g. names need resubmission anyway. + // We take a slight shortcut but in theory we could be calling TableSetupColumn() here with dummy values, it should yield the same effect. + if (table->DeclColumnsCount <= column_n) + { + TableSetupColumnFlags(table, column, ImGuiTableColumnFlags_None); + column->NameOffset = -1; + column->UserID = 0; + column->InitStretchWeightOrWidth = -1.0f; + } + + // Update Enabled state, mark settings and sort specs dirty + if (!(table->Flags & ImGuiTableFlags_Hideable) || (column->Flags & ImGuiTableColumnFlags_NoHide)) + column->IsUserEnabledNextFrame = true; + if (column->IsUserEnabled != column->IsUserEnabledNextFrame) + { + column->IsUserEnabled = column->IsUserEnabledNextFrame; + table->IsSettingsDirty = true; + } + column->IsEnabled = column->IsUserEnabled && (column->Flags & ImGuiTableColumnFlags_Disabled) == 0; + + if (column->SortOrder != -1 && !column->IsEnabled) + table->IsSortSpecsDirty = true; + if (column->SortOrder > 0 && !(table->Flags & ImGuiTableFlags_SortMulti)) + table->IsSortSpecsDirty = true; + + // Auto-fit unsized columns + const bool start_auto_fit = (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? (column->WidthRequest < 0.0f) : (column->StretchWeight < 0.0f); + if (start_auto_fit) + column->AutoFitQueue = column->CannotSkipItemsQueue = (1 << 3) - 1; // Fit for three frames + + if (!column->IsEnabled) + { + column->IndexWithinEnabledSet = -1; + continue; + } + + // Mark as enabled and link to previous/next enabled column + column->PrevEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + column->NextEnabledColumn = -1; + if (prev_visible_column_idx != -1) + table->Columns[prev_visible_column_idx].NextEnabledColumn = (ImGuiTableColumnIdx)column_n; + else + table->LeftMostEnabledColumn = (ImGuiTableColumnIdx)column_n; + column->IndexWithinEnabledSet = table->ColumnsEnabledCount++; + ImBitArraySetBit(table->EnabledMaskByIndex, column_n); + ImBitArraySetBit(table->EnabledMaskByDisplayOrder, column->DisplayOrder); + prev_visible_column_idx = column_n; + IM_ASSERT(column->IndexWithinEnabledSet <= column->DisplayOrder); + + // Calculate ideal/auto column width (that's the width required for all contents to be visible without clipping) + // Combine width from regular rows + width from headers unless requested not to. + if (!column->IsPreserveWidthAuto) + column->WidthAuto = TableGetColumnWidthAuto(table, column); + + // Non-resizable columns keep their requested width (apply user value regardless of IsPreserveWidthAuto) + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column_is_resizable) + has_resizable = true; + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f && !column_is_resizable) + column->WidthAuto = column->InitStretchWeightOrWidth; + + if (column->AutoFitQueue != 0x00) + has_auto_fit_request = true; + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + stretch_sum_width_auto += column->WidthAuto; + count_stretch++; + } + else + { + fixed_max_width_auto = ImMax(fixed_max_width_auto, column->WidthAuto); + count_fixed++; + } + } + if ((table->Flags & ImGuiTableFlags_Sortable) && table->SortSpecsCount == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + table->IsSortSpecsDirty = true; + table->RightMostEnabledColumn = (ImGuiTableColumnIdx)prev_visible_column_idx; + IM_ASSERT(table->LeftMostEnabledColumn >= 0 && table->RightMostEnabledColumn >= 0); + + // [Part 2] Disable child window clipping while fitting columns. This is not strictly necessary but makes it possible + // to avoid the column fitting having to wait until the first visible frame of the child container (may or not be a good thing). + // FIXME-TABLE: for always auto-resizing columns may not want to do that all the time. + if (has_auto_fit_request && table->OuterWindow != table->InnerWindow) + table->InnerWindow->SkipItems = false; + if (has_auto_fit_request) + table->IsSettingsDirty = true; + + // [Part 3] Fix column flags and record a few extra information. + float sum_width_requests = 0.0f; // Sum of all width for fixed and auto-resize columns, excluding width contributed by Stretch columns but including spacing/padding. + float stretch_sum_weights = 0.0f; // Sum of all weights for stretch columns. + table->LeftMostStretchedColumn = table->RightMostStretchedColumn = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const bool column_is_resizable = (column->Flags & ImGuiTableColumnFlags_NoResize) == 0; + if (column->Flags & ImGuiTableColumnFlags_WidthFixed) + { + // Apply same widths policy + float width_auto = column->WidthAuto; + if (table_sizing_policy == ImGuiTableFlags_SizingFixedSame && (column->AutoFitQueue != 0x00 || !column_is_resizable)) + width_auto = fixed_max_width_auto; + + // Apply automatic width + // Latch initial size for fixed columns and update it constantly for auto-resizing column (unless clipped!) + if (column->AutoFitQueue != 0x00) + column->WidthRequest = width_auto; + else if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !column_is_resizable && column->IsRequestOutput) + column->WidthRequest = width_auto; + + // FIXME-TABLE: Increase minimum size during init frame to avoid biasing auto-fitting widgets + // (e.g. TextWrapped) too much. Otherwise what tends to happen is that TextWrapped would output a very + // large height (= first frame scrollbar display very off + clipper would skip lots of items). + // This is merely making the side-effect less extreme, but doesn't properly fixes it. + // FIXME: Move this to ->WidthGiven to avoid temporary lossyless? + // FIXME: This break IsPreserveWidthAuto from not flickering if the stored WidthAuto was smaller. + if (column->AutoFitQueue > 0x01 && table->IsInitializing && !column->IsPreserveWidthAuto) + column->WidthRequest = ImMax(column->WidthRequest, table->MinColumnWidth * 4.0f); // FIXME-TABLE: Another constant/scale? + sum_width_requests += column->WidthRequest; + } + else + { + // Initialize stretch weight + if (column->AutoFitQueue != 0x00 || column->StretchWeight < 0.0f || !column_is_resizable) + { + if (column->InitStretchWeightOrWidth > 0.0f) + column->StretchWeight = column->InitStretchWeightOrWidth; + else if (table_sizing_policy == ImGuiTableFlags_SizingStretchProp) + column->StretchWeight = (column->WidthAuto / stretch_sum_width_auto) * count_stretch; + else + column->StretchWeight = 1.0f; + } + + stretch_sum_weights += column->StretchWeight; + if (table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder > column->DisplayOrder) + table->LeftMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + if (table->RightMostStretchedColumn == -1 || table->Columns[table->RightMostStretchedColumn].DisplayOrder < column->DisplayOrder) + table->RightMostStretchedColumn = (ImGuiTableColumnIdx)column_n; + } + column->IsPreserveWidthAuto = false; + sum_width_requests += table->CellPaddingX * 2.0f; + } + table->ColumnsEnabledFixedCount = (ImGuiTableColumnIdx)count_fixed; + table->ColumnsStretchSumWeights = stretch_sum_weights; + + // [Part 4] Apply final widths based on requested widths + const ImRect work_rect = table->WorkRect; + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + const float width_removed = (table->HasScrollbarYPrev && !table->InnerWindow->ScrollbarY) ? g.Style.ScrollbarSize : 0.0f; // To synchronize decoration width of synched tables with mismatching scrollbar state (#5920) + const float width_avail = ImMax(1.0f, (((table->Flags & ImGuiTableFlags_ScrollX) && table->InnerWidth == 0.0f) ? table->InnerClipRect.GetWidth() : work_rect.GetWidth()) - width_removed); + const float width_avail_for_stretched_columns = width_avail - width_spacings - sum_width_requests; + float width_remaining_for_stretched_columns = width_avail_for_stretched_columns; + table->ColumnsGivenWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Allocate width for stretched/weighted columns (StretchWeight gets converted into WidthRequest) + if (column->Flags & ImGuiTableColumnFlags_WidthStretch) + { + float weight_ratio = column->StretchWeight / stretch_sum_weights; + column->WidthRequest = IM_FLOOR(ImMax(width_avail_for_stretched_columns * weight_ratio, table->MinColumnWidth) + 0.01f); + width_remaining_for_stretched_columns -= column->WidthRequest; + } + + // [Resize Rule 1] The right-most Visible column is not resizable if there is at least one Stretch column + // See additional comments in TableSetColumnWidth(). + if (column->NextEnabledColumn == -1 && table->LeftMostStretchedColumn != -1) + column->Flags |= ImGuiTableColumnFlags_NoDirectResize_; + + // Assign final width, record width in case we will need to shrink + column->WidthGiven = ImFloor(ImMax(column->WidthRequest, table->MinColumnWidth)); + table->ColumnsGivenWidth += column->WidthGiven; + } + + // [Part 5] Redistribute stretch remainder width due to rounding (remainder width is < 1.0f * number of Stretch column). + // Using right-to-left distribution (more likely to match resizing cursor). + if (width_remaining_for_stretched_columns >= 1.0f && !(table->Flags & ImGuiTableFlags_PreciseWidths)) + for (int order_n = table->ColumnsCount - 1; stretch_sum_weights > 0.0f && width_remaining_for_stretched_columns >= 1.0f && order_n >= 0; order_n--) + { + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + continue; + ImGuiTableColumn* column = &table->Columns[table->DisplayOrderToIndex[order_n]]; + if (!(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->WidthRequest += 1.0f; + column->WidthGiven += 1.0f; + width_remaining_for_stretched_columns -= 1.0f; + } + + // Determine if table is hovered which will be used to flag columns as hovered. + // - In principle we'd like to use the equivalent of IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem), + // but because our item is partially submitted at this point we use ItemHoverable() and a workaround (temporarily + // clear ActiveId, which is equivalent to the change provided by _AllowWhenBLockedByActiveItem). + // - This allows columns to be marked as hovered when e.g. clicking a button inside the column, or using drag and drop. + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + table->HoveredColumnBody = -1; + table->HoveredColumnBorder = -1; + const ImRect mouse_hit_rect(table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.Max.x, ImMax(table->OuterRect.Max.y, table->OuterRect.Min.y + table_instance->LastOuterHeight)); + const ImGuiID backup_active_id = g.ActiveId; + g.ActiveId = 0; + const bool is_hovering_table = ItemHoverable(mouse_hit_rect, 0); + g.ActiveId = backup_active_id; + + // [Part 6] Setup final position, offset, skip/clip states and clipping rectangles, detect hovered column + // Process columns in their visible orders as we are comparing the visible order and adjusting host_clip_rect while looping. + int visible_n = 0; + bool offset_x_frozen = (table->FreezeColumnsCount > 0); + float offset_x = ((table->FreezeColumnsCount > 0) ? table->OuterRect.Min.x : work_rect.Min.x) + table->OuterPaddingX - table->CellSpacingX1; + ImRect host_clip_rect = table->InnerClipRect; + //host_clip_rect.Max.x += table->CellPaddingX + table->CellSpacingX2; + ImBitArrayClearAllBits(table->VisibleMaskByIndex, table->ColumnsCount); + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + + column->NavLayerCurrent = (ImS8)(table->FreezeRowsCount > 0 ? ImGuiNavLayer_Menu : ImGuiNavLayer_Main); // Use Count NOT request so Header line changes layer when frozen + + if (offset_x_frozen && table->FreezeColumnsCount == visible_n) + { + offset_x += work_rect.Min.x - table->OuterRect.Min.x; + offset_x_frozen = false; + } + + // Clear status flags + column->Flags &= ~ImGuiTableColumnFlags_StatusMask_; + + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + { + // Hidden column: clear a few fields and we are done with it for the remainder of the function. + // We set a zero-width clip rect but set Min.y/Max.y properly to not interfere with the clipper. + column->MinX = column->MaxX = column->WorkMinX = column->ClipRect.Min.x = column->ClipRect.Max.x = offset_x; + column->WidthGiven = 0.0f; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + column->IsVisibleX = column->IsVisibleY = column->IsRequestOutput = false; + column->IsSkipItems = true; + column->ItemWidth = 1.0f; + continue; + } + + // Detect hovered column + if (is_hovering_table && g.IO.MousePos.x >= column->ClipRect.Min.x && g.IO.MousePos.x < column->ClipRect.Max.x) + table->HoveredColumnBody = (ImGuiTableColumnIdx)column_n; + + // Lock start position + column->MinX = offset_x; + + // Lock width based on start position and minimum/maximum width for this position + float max_width = TableGetMaxColumnWidth(table, column_n); + column->WidthGiven = ImMin(column->WidthGiven, max_width); + column->WidthGiven = ImMax(column->WidthGiven, ImMin(column->WidthRequest, table->MinColumnWidth)); + column->MaxX = offset_x + column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + + // Lock other positions + // - ClipRect.Min.x: Because merging draw commands doesn't compare min boundaries, we make ClipRect.Min.x match left bounds to be consistent regardless of merging. + // - ClipRect.Max.x: using WorkMaxX instead of MaxX (aka including padding) makes things more consistent when resizing down, tho slightly detrimental to visibility in very-small column. + // - ClipRect.Max.x: using MaxX makes it easier for header to receive hover highlight with no discontinuity and display sorting arrow. + // - FIXME-TABLE: We want equal width columns to have equal (ClipRect.Max.x - WorkMinX) width, which means ClipRect.max.x cannot stray off host_clip_rect.Max.x else right-most column may appear shorter. + column->WorkMinX = column->MinX + table->CellPaddingX + table->CellSpacingX1; + column->WorkMaxX = column->MaxX - table->CellPaddingX - table->CellSpacingX2; // Expected max + column->ItemWidth = ImFloor(column->WidthGiven * 0.65f); + column->ClipRect.Min.x = column->MinX; + column->ClipRect.Min.y = work_rect.Min.y; + column->ClipRect.Max.x = column->MaxX; //column->WorkMaxX; + column->ClipRect.Max.y = FLT_MAX; + column->ClipRect.ClipWithFull(host_clip_rect); + + // Mark column as Clipped (not in sight) + // Note that scrolling tables (where inner_window != outer_window) handle Y clipped earlier in BeginTable() so IsVisibleY really only applies to non-scrolling tables. + // FIXME-TABLE: Because InnerClipRect.Max.y is conservatively ==outer_window->ClipRect.Max.y, we never can mark columns _Above_ the scroll line as not IsVisibleY. + // Taking advantage of LastOuterHeight would yield good results there... + // FIXME-TABLE: Y clipping is disabled because it effectively means not submitting will reduce contents width which is fed to outer_window->DC.CursorMaxPos.x, + // and this may be used (e.g. typically by outer_window using AlwaysAutoResize or outer_window's horizontal scrollbar, but could be something else). + // Possible solution to preserve last known content width for clipped column. Test 'table_reported_size' fails when enabling Y clipping and window is resized small. + column->IsVisibleX = (column->ClipRect.Max.x > column->ClipRect.Min.x); + column->IsVisibleY = true; // (column->ClipRect.Max.y > column->ClipRect.Min.y); + const bool is_visible = column->IsVisibleX; //&& column->IsVisibleY; + if (is_visible) + ImBitArraySetBit(table->VisibleMaskByIndex, column_n); + + // Mark column as requesting output from user. Note that fixed + non-resizable sets are auto-fitting at all times and therefore always request output. + column->IsRequestOutput = is_visible || column->AutoFitQueue != 0 || column->CannotSkipItemsQueue != 0; + + // Mark column as SkipItems (ignoring all items/layout) + column->IsSkipItems = !column->IsEnabled || table->HostSkipItems; + if (column->IsSkipItems) + IM_ASSERT(!is_visible); + + // Update status flags + column->Flags |= ImGuiTableColumnFlags_IsEnabled; + if (is_visible) + column->Flags |= ImGuiTableColumnFlags_IsVisible; + if (column->SortOrder != -1) + column->Flags |= ImGuiTableColumnFlags_IsSorted; + if (table->HoveredColumnBody == column_n) + column->Flags |= ImGuiTableColumnFlags_IsHovered; + + // Alignment + // FIXME-TABLE: This align based on the whole column width, not per-cell, and therefore isn't useful in + // many cases (to be able to honor this we might be able to store a log of cells width, per row, for + // visible rows, but nav/programmatic scroll would have visible artifacts.) + //if (column->Flags & ImGuiTableColumnFlags_AlignRight) + // column->WorkMinX = ImMax(column->WorkMinX, column->MaxX - column->ContentWidthRowsUnfrozen); + //else if (column->Flags & ImGuiTableColumnFlags_AlignCenter) + // column->WorkMinX = ImLerp(column->WorkMinX, ImMax(column->StartX, column->MaxX - column->ContentWidthRowsUnfrozen), 0.5f); + + // Reset content width variables + column->ContentMaxXFrozen = column->ContentMaxXUnfrozen = column->WorkMinX; + column->ContentMaxXHeadersUsed = column->ContentMaxXHeadersIdeal = column->WorkMinX; + + // Don't decrement auto-fit counters until container window got a chance to submit its items + if (table->HostSkipItems == false) + { + column->AutoFitQueue >>= 1; + column->CannotSkipItemsQueue >>= 1; + } + + if (visible_n < table->FreezeColumnsCount) + host_clip_rect.Min.x = ImClamp(column->MaxX + TABLE_BORDER_SIZE, host_clip_rect.Min.x, host_clip_rect.Max.x); + + offset_x += column->WidthGiven + table->CellSpacingX1 + table->CellSpacingX2 + table->CellPaddingX * 2.0f; + visible_n++; + } + + // [Part 7] Detect/store when we are hovering the unused space after the right-most column (so e.g. context menus can react on it) + // Clear Resizable flag if none of our column are actually resizable (either via an explicit _NoResize flag, either + // because of using _WidthAuto/_WidthStretch). This will hide the resizing option from the context menu. + const float unused_x1 = ImMax(table->WorkRect.Min.x, table->Columns[table->RightMostEnabledColumn].ClipRect.Max.x); + if (is_hovering_table && table->HoveredColumnBody == -1) + { + if (g.IO.MousePos.x >= unused_x1) + table->HoveredColumnBody = (ImGuiTableColumnIdx)table->ColumnsCount; + } + if (has_resizable == false && (table->Flags & ImGuiTableFlags_Resizable)) + table->Flags &= ~ImGuiTableFlags_Resizable; + + // [Part 8] Lock actual OuterRect/WorkRect right-most position. + // This is done late to handle the case of fixed-columns tables not claiming more widths that they need. + // Because of this we are careful with uses of WorkRect and InnerClipRect before this point. + if (table->RightMostStretchedColumn != -1) + table->Flags &= ~ImGuiTableFlags_NoHostExtendX; + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + table->OuterRect.Max.x = table->WorkRect.Max.x = unused_x1; + table->InnerClipRect.Max.x = ImMin(table->InnerClipRect.Max.x, unused_x1); + } + table->InnerWindow->ParentWorkRect = table->WorkRect; + table->BorderX1 = table->InnerClipRect.Min.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : -1.0f); + table->BorderX2 = table->InnerClipRect.Max.x;// +((table->Flags & ImGuiTableFlags_BordersOuter) ? 0.0f : +1.0f); + + // [Part 9] Allocate draw channels and setup background cliprect + TableSetupDrawChannels(table); + + // [Part 10] Hit testing on borders + if (table->Flags & ImGuiTableFlags_Resizable) + TableUpdateBorders(table); + table_instance->LastFirstRowHeight = 0.0f; + table->IsLayoutLocked = true; + table->IsUsingHeaders = false; + + // [Part 11] Context menu + if (TableBeginContextMenuPopup(table)) + { + TableDrawContextMenu(table); + EndPopup(); + } + + // [Part 12] Sanitize and build sort specs before we have a change to use them for display. + // This path will only be exercised when sort specs are modified before header rows (e.g. init or visibility change) + if (table->IsSortSpecsDirty && (table->Flags & ImGuiTableFlags_Sortable)) + TableSortSpecsBuild(table); + + // [Part 13] Setup inner window decoration size (for scrolling / nav tracking to properly take account of frozen rows/columns) + if (table->FreezeColumnsRequest > 0) + table->InnerWindow->DecoInnerSizeX1 = table->Columns[table->DisplayOrderToIndex[table->FreezeColumnsRequest - 1]].MaxX - table->OuterRect.Min.x; + if (table->FreezeRowsRequest > 0) + table->InnerWindow->DecoInnerSizeY1 = table_instance->LastFrozenHeight; + table_instance->LastFrozenHeight = 0.0f; + + // Initial state + ImGuiWindow* inner_window = table->InnerWindow; + if (table->Flags & ImGuiTableFlags_NoClip) + table->DrawSplitter->SetCurrentChannel(inner_window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + else + inner_window->DrawList->PushClipRect(inner_window->ClipRect.Min, inner_window->ClipRect.Max, false); +} + +// Process hit-testing on resizing borders. Actual size change will be applied in EndTable() +// - Set table->HoveredColumnBorder with a short delay/timer to reduce feedback noise +// - Submit ahead of table contents and header, use ImGuiButtonFlags_AllowItemOverlap to prioritize widgets +// overlapping the same area. +void ImGui::TableUpdateBorders(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(table->Flags & ImGuiTableFlags_Resizable); + + // At this point OuterRect height may be zero or under actual final height, so we rely on temporal coherency and + // use the final height from last frame. Because this is only affecting _interaction_ with columns, it is not + // really problematic (whereas the actual visual will be displayed in EndTable() and using the current frame height). + // Actual columns highlight/render will be performed in EndTable() and not be affected. + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + const float hit_half_width = TABLE_RESIZE_SEPARATOR_HALF_THICKNESS; + const float hit_y1 = table->OuterRect.Min.y; + const float hit_y2_body = ImMax(table->OuterRect.Max.y, hit_y1 + table_instance->LastOuterHeight); + const float hit_y2_head = hit_y1 + table_instance->LastFirstRowHeight; + + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) + continue; + + // ImGuiTableFlags_NoBordersInBodyUntilResize will be honored in TableDrawBorders() + const float border_y2_hit = (table->Flags & ImGuiTableFlags_NoBordersInBody) ? hit_y2_head : hit_y2_body; + if ((table->Flags & ImGuiTableFlags_NoBordersInBody) && table->IsUsingHeaders == false) + continue; + + if (!column->IsVisibleX && table->LastResizedColumn != column_n) + continue; + + ImGuiID column_id = TableGetColumnResizeID(table, column_n, table->InstanceCurrent); + ImRect hit_rect(column->MaxX - hit_half_width, hit_y1, column->MaxX + hit_half_width, border_y2_hit); + ItemAdd(hit_rect, column_id, NULL, ImGuiItemFlags_NoNav); + //GetForegroundDrawList()->AddRect(hit_rect.Min, hit_rect.Max, IM_COL32(255, 0, 0, 100)); + + bool hovered = false, held = false; + bool pressed = ButtonBehavior(hit_rect, column_id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_NoNavFocus); + if (pressed && IsMouseDoubleClicked(0)) + { + TableSetColumnWidthAutoSingle(table, column_n); + ClearActiveID(); + held = hovered = false; + } + if (held) + { + if (table->LastResizedColumn == -1) + table->ResizeLockMinContentsX2 = table->RightMostEnabledColumn != -1 ? table->Columns[table->RightMostEnabledColumn].MaxX : -FLT_MAX; + table->ResizedColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + } + if ((hovered && g.HoveredIdTimer > TABLE_RESIZE_SEPARATOR_FEEDBACK_TIMER) || held) + { + table->HoveredColumnBorder = (ImGuiTableColumnIdx)column_n; + SetMouseCursor(ImGuiMouseCursor_ResizeEW); + } + } +} + +void ImGui::EndTable() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Only call EndTable() if BeginTable() returns true!"); + + // This assert would be very useful to catch a common error... unfortunately it would probably trigger in some + // cases, and for consistency user may sometimes output empty tables (and still benefit from e.g. outer border) + //IM_ASSERT(table->IsLayoutLocked && "Table unused: never called TableNextRow(), is that the intent?"); + + // If the user never got to call TableNextRow() or TableNextColumn(), we call layout ourselves to ensure all our + // code paths are consistent (instead of just hoping that TableBegin/TableEnd will work), get borders drawn, etc. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + const ImGuiTableFlags flags = table->Flags; + ImGuiWindow* inner_window = table->InnerWindow; + ImGuiWindow* outer_window = table->OuterWindow; + ImGuiTableTempData* temp_data = table->TempData; + IM_ASSERT(inner_window == g.CurrentWindow); + IM_ASSERT(outer_window == inner_window || outer_window == inner_window->ParentWindow); + + if (table->IsInsideRow) + TableEndRow(table); + + // Context menu in columns body + if (flags & ImGuiTableFlags_ContextMenuInBody) + if (table->HoveredColumnBody != -1 && !IsAnyItemHovered() && IsMouseReleased(ImGuiMouseButton_Right)) + TableOpenContextMenu((int)table->HoveredColumnBody); + + // Finalize table height + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + inner_window->DC.PrevLineSize = temp_data->HostBackupPrevLineSize; + inner_window->DC.CurrLineSize = temp_data->HostBackupCurrLineSize; + inner_window->DC.CursorMaxPos = temp_data->HostBackupCursorMaxPos; + const float inner_content_max_y = table->RowPosY2; + IM_ASSERT(table->RowPosY2 == inner_window->DC.CursorPos.y); + if (inner_window != outer_window) + inner_window->DC.CursorMaxPos.y = inner_content_max_y; + else if (!(flags & ImGuiTableFlags_NoHostExtendY)) + table->OuterRect.Max.y = table->InnerRect.Max.y = ImMax(table->OuterRect.Max.y, inner_content_max_y); // Patch OuterRect/InnerRect height + table->WorkRect.Max.y = ImMax(table->WorkRect.Max.y, table->OuterRect.Max.y); + table_instance->LastOuterHeight = table->OuterRect.GetHeight(); + + // Setup inner scrolling range + // FIXME: This ideally should be done earlier, in BeginTable() SetNextWindowContentSize call, just like writing to inner_window->DC.CursorMaxPos.y, + // but since the later is likely to be impossible to do we'd rather update both axises together. + if (table->Flags & ImGuiTableFlags_ScrollX) + { + const float outer_padding_for_border = (table->Flags & ImGuiTableFlags_BordersOuterV) ? TABLE_BORDER_SIZE : 0.0f; + float max_pos_x = table->InnerWindow->DC.CursorMaxPos.x; + if (table->RightMostEnabledColumn != -1) + max_pos_x = ImMax(max_pos_x, table->Columns[table->RightMostEnabledColumn].WorkMaxX + table->CellPaddingX + table->OuterPaddingX - outer_padding_for_border); + if (table->ResizedColumn != -1) + max_pos_x = ImMax(max_pos_x, table->ResizeLockMinContentsX2); + table->InnerWindow->DC.CursorMaxPos.x = max_pos_x; + } + + // Pop clipping rect + if (!(flags & ImGuiTableFlags_NoClip)) + inner_window->DrawList->PopClipRect(); + inner_window->ClipRect = inner_window->DrawList->_ClipRectStack.back(); + + // Draw borders + if ((flags & ImGuiTableFlags_Borders) != 0) + TableDrawBorders(table); + +#if 0 + // Strip out dummy channel draw calls + // We have no way to prevent user submitting direct ImDrawList calls into a hidden column (but ImGui:: calls will be clipped out) + // Pros: remove draw calls which will have no effect. since they'll have zero-size cliprect they may be early out anyway. + // Cons: making it harder for users watching metrics/debugger to spot the wasted vertices. + if (table->DummyDrawChannel != (ImGuiTableColumnIdx)-1) + { + ImDrawChannel* dummy_channel = &table->DrawSplitter._Channels[table->DummyDrawChannel]; + dummy_channel->_CmdBuffer.resize(0); + dummy_channel->_IdxBuffer.resize(0); + } +#endif + + // Flatten channels and merge draw calls + ImDrawListSplitter* splitter = table->DrawSplitter; + splitter->SetCurrentChannel(inner_window->DrawList, 0); + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + TableMergeDrawChannels(table); + splitter->Merge(inner_window->DrawList); + + // Update ColumnsAutoFitWidth to get us ahead for host using our size to auto-resize without waiting for next BeginTable() + float auto_fit_width_for_fixed = 0.0f; + float auto_fit_width_for_stretched = 0.0f; + float auto_fit_width_for_stretched_min = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (IM_BITARRAY_TESTBIT(table->EnabledMaskByIndex, column_n)) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + float column_width_request = ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && !(column->Flags & ImGuiTableColumnFlags_NoResize)) ? column->WidthRequest : TableGetColumnWidthAuto(table, column); + if (column->Flags & ImGuiTableColumnFlags_WidthFixed) + auto_fit_width_for_fixed += column_width_request; + else + auto_fit_width_for_stretched += column_width_request; + if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) && (column->Flags & ImGuiTableColumnFlags_NoResize) != 0) + auto_fit_width_for_stretched_min = ImMax(auto_fit_width_for_stretched_min, column_width_request / (column->StretchWeight / table->ColumnsStretchSumWeights)); + } + const float width_spacings = (table->OuterPaddingX * 2.0f) + (table->CellSpacingX1 + table->CellSpacingX2) * (table->ColumnsEnabledCount - 1); + table->ColumnsAutoFitWidth = width_spacings + (table->CellPaddingX * 2.0f) * table->ColumnsEnabledCount + auto_fit_width_for_fixed + ImMax(auto_fit_width_for_stretched, auto_fit_width_for_stretched_min); + + // Update scroll + if ((table->Flags & ImGuiTableFlags_ScrollX) == 0 && inner_window != outer_window) + { + inner_window->Scroll.x = 0.0f; + } + else if (table->LastResizedColumn != -1 && table->ResizedColumn == -1 && inner_window->ScrollbarX && table->InstanceInteracted == table->InstanceCurrent) + { + // When releasing a column being resized, scroll to keep the resulting column in sight + const float neighbor_width_to_keep_visible = table->MinColumnWidth + table->CellPaddingX * 2.0f; + ImGuiTableColumn* column = &table->Columns[table->LastResizedColumn]; + if (column->MaxX < table->InnerClipRect.Min.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x - neighbor_width_to_keep_visible, 1.0f); + else if (column->MaxX > table->InnerClipRect.Max.x) + SetScrollFromPosX(inner_window, column->MaxX - inner_window->Pos.x + neighbor_width_to_keep_visible, 1.0f); + } + + // Apply resizing/dragging at the end of the frame + if (table->ResizedColumn != -1 && table->InstanceCurrent == table->InstanceInteracted) + { + ImGuiTableColumn* column = &table->Columns[table->ResizedColumn]; + const float new_x2 = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + TABLE_RESIZE_SEPARATOR_HALF_THICKNESS); + const float new_width = ImFloor(new_x2 - column->MinX - table->CellSpacingX1 - table->CellPaddingX * 2.0f); + table->ResizedColumnNextWidth = new_width; + } + + // Pop from id stack + IM_ASSERT_USER_ERROR(inner_window->IDStack.back() == table_instance->TableInstanceID, "Mismatching PushID/PopID!"); + IM_ASSERT_USER_ERROR(outer_window->DC.ItemWidthStack.Size >= temp_data->HostBackupItemWidthStackSize, "Too many PopItemWidth!"); + if (table->InstanceCurrent > 0) + PopID(); + PopID(); + + // Restore window data that we modified + const ImVec2 backup_outer_max_pos = outer_window->DC.CursorMaxPos; + inner_window->WorkRect = temp_data->HostBackupWorkRect; + inner_window->ParentWorkRect = temp_data->HostBackupParentWorkRect; + inner_window->SkipItems = table->HostSkipItems; + outer_window->DC.CursorPos = table->OuterRect.Min; + outer_window->DC.ItemWidth = temp_data->HostBackupItemWidth; + outer_window->DC.ItemWidthStack.Size = temp_data->HostBackupItemWidthStackSize; + outer_window->DC.ColumnsOffset = temp_data->HostBackupColumnsOffset; + + // Layout in outer window + // (FIXME: To allow auto-fit and allow desirable effect of SameLine() we dissociate 'used' vs 'ideal' size by overriding + // CursorPosPrevLine and CursorMaxPos manually. That should be a more general layout feature, see same problem e.g. #3414) + if (inner_window != outer_window) + { + EndChild(); + } + else + { + ItemSize(table->OuterRect.GetSize()); + ItemAdd(table->OuterRect, 0); + } + + // Override declared contents width/height to enable auto-resize while not needlessly adding a scrollbar + if (table->Flags & ImGuiTableFlags_NoHostExtendX) + { + // FIXME-TABLE: Could we remove this section? + // ColumnsAutoFitWidth may be one frame ahead here since for Fixed+NoResize is calculated from latest contents + IM_ASSERT((table->Flags & ImGuiTableFlags_ScrollX) == 0); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth); + } + else if (temp_data->UserOuterSize.x <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollX) ? inner_window->ScrollbarSizes.x : 0.0f; + outer_window->DC.IdealMaxPos.x = ImMax(outer_window->DC.IdealMaxPos.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth + decoration_size - temp_data->UserOuterSize.x); + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, ImMin(table->OuterRect.Max.x, table->OuterRect.Min.x + table->ColumnsAutoFitWidth)); + } + else + { + outer_window->DC.CursorMaxPos.x = ImMax(backup_outer_max_pos.x, table->OuterRect.Max.x); + } + if (temp_data->UserOuterSize.y <= 0.0f) + { + const float decoration_size = (table->Flags & ImGuiTableFlags_ScrollY) ? inner_window->ScrollbarSizes.y : 0.0f; + outer_window->DC.IdealMaxPos.y = ImMax(outer_window->DC.IdealMaxPos.y, inner_content_max_y + decoration_size - temp_data->UserOuterSize.y); + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, ImMin(table->OuterRect.Max.y, inner_content_max_y)); + } + else + { + // OuterRect.Max.y may already have been pushed downward from the initial value (unless ImGuiTableFlags_NoHostExtendY is set) + outer_window->DC.CursorMaxPos.y = ImMax(backup_outer_max_pos.y, table->OuterRect.Max.y); + } + + // Save settings + if (table->IsSettingsDirty) + TableSaveSettings(table); + table->IsInitializing = false; + + // Clear or restore current table, if any + IM_ASSERT(g.CurrentWindow == outer_window && g.CurrentTable == table); + IM_ASSERT(g.TablesTempDataStacked > 0); + temp_data = (--g.TablesTempDataStacked > 0) ? &g.TablesTempData[g.TablesTempDataStacked - 1] : NULL; + g.CurrentTable = temp_data ? g.Tables.GetByIndex(temp_data->TableIndex) : NULL; + if (g.CurrentTable) + { + g.CurrentTable->TempData = temp_data; + g.CurrentTable->DrawSplitter = &temp_data->DrawSplitter; + } + outer_window->DC.CurrentTableIdx = g.CurrentTable ? g.Tables.GetIndex(g.CurrentTable) : -1; +} + +// See "COLUMN SIZING POLICIES" comments at the top of this file +// If (init_width_or_weight <= 0.0f) it is ignored +void ImGui::TableSetupColumn(const char* label, ImGuiTableColumnFlags flags, float init_width_or_weight, ImGuiID user_id) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call call TableSetupColumn() before first row!"); + IM_ASSERT((flags & ImGuiTableColumnFlags_StatusMask_) == 0 && "Illegal to pass StatusMask values to TableSetupColumn()"); + if (table->DeclColumnsCount >= table->ColumnsCount) + { + IM_ASSERT_USER_ERROR(table->DeclColumnsCount < table->ColumnsCount, "Called TableSetupColumn() too many times!"); + return; + } + + ImGuiTableColumn* column = &table->Columns[table->DeclColumnsCount]; + table->DeclColumnsCount++; + + // Assert when passing a width or weight if policy is entirely left to default, to avoid storing width into weight and vice-versa. + // Give a grace to users of ImGuiTableFlags_ScrollX. + if (table->IsDefaultSizingPolicy && (flags & ImGuiTableColumnFlags_WidthMask_) == 0 && (flags & ImGuiTableFlags_ScrollX) == 0) + IM_ASSERT(init_width_or_weight <= 0.0f && "Can only specify width/weight if sizing policy is set explicitly in either Table or Column."); + + // When passing a width automatically enforce WidthFixed policy + // (whereas TableSetupColumnFlags would default to WidthAuto if table is not Resizable) + if ((flags & ImGuiTableColumnFlags_WidthMask_) == 0 && init_width_or_weight > 0.0f) + if ((table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedFit || (table->Flags & ImGuiTableFlags_SizingMask_) == ImGuiTableFlags_SizingFixedSame) + flags |= ImGuiTableColumnFlags_WidthFixed; + + TableSetupColumnFlags(table, column, flags); + column->UserID = user_id; + flags = column->Flags; + + // Initialize defaults + column->InitStretchWeightOrWidth = init_width_or_weight; + if (table->IsInitializing) + { + // Init width or weight + if (column->WidthRequest < 0.0f && column->StretchWeight < 0.0f) + { + if ((flags & ImGuiTableColumnFlags_WidthFixed) && init_width_or_weight > 0.0f) + column->WidthRequest = init_width_or_weight; + if (flags & ImGuiTableColumnFlags_WidthStretch) + column->StretchWeight = (init_width_or_weight > 0.0f) ? init_width_or_weight : -1.0f; + + // Disable auto-fit if an explicit width/weight has been specified + if (init_width_or_weight > 0.0f) + column->AutoFitQueue = 0x00; + } + + // Init default visibility/sort state + if ((flags & ImGuiTableColumnFlags_DefaultHide) && (table->SettingsLoadedFlags & ImGuiTableFlags_Hideable) == 0) + column->IsUserEnabled = column->IsUserEnabledNextFrame = false; + if (flags & ImGuiTableColumnFlags_DefaultSort && (table->SettingsLoadedFlags & ImGuiTableFlags_Sortable) == 0) + { + column->SortOrder = 0; // Multiple columns using _DefaultSort will be reassigned unique SortOrder values when building the sort specs. + column->SortDirection = (column->Flags & ImGuiTableColumnFlags_PreferSortDescending) ? (ImS8)ImGuiSortDirection_Descending : (ImU8)(ImGuiSortDirection_Ascending); + } + } + + // Store name (append with zero-terminator in contiguous buffer) + column->NameOffset = -1; + if (label != NULL && label[0] != 0) + { + column->NameOffset = (ImS16)table->ColumnsNames.size(); + table->ColumnsNames.append(label, label + strlen(label) + 1); + } +} + +// [Public] +void ImGui::TableSetupScrollFreeze(int columns, int rows) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableSetupColumn() after BeginTable()!"); + IM_ASSERT(table->IsLayoutLocked == false && "Need to call TableSetupColumn() before first row!"); + IM_ASSERT(columns >= 0 && columns < IMGUI_TABLE_MAX_COLUMNS); + IM_ASSERT(rows >= 0 && rows < 128); // Arbitrary limit + + table->FreezeColumnsRequest = (table->Flags & ImGuiTableFlags_ScrollX) ? (ImGuiTableColumnIdx)ImMin(columns, table->ColumnsCount) : 0; + table->FreezeColumnsCount = (table->InnerWindow->Scroll.x != 0.0f) ? table->FreezeColumnsRequest : 0; + table->FreezeRowsRequest = (table->Flags & ImGuiTableFlags_ScrollY) ? (ImGuiTableColumnIdx)rows : 0; + table->FreezeRowsCount = (table->InnerWindow->Scroll.y != 0.0f) ? table->FreezeRowsRequest : 0; + table->IsUnfrozenRows = (table->FreezeRowsCount == 0); // Make sure this is set before TableUpdateLayout() so ImGuiListClipper can benefit from it.b + + // Ensure frozen columns are ordered in their section. We still allow multiple frozen columns to be reordered. + // FIXME-TABLE: This work for preserving 2143 into 21|43. How about 4321 turning into 21|43? (preserve relative order in each section) + for (int column_n = 0; column_n < table->FreezeColumnsRequest; column_n++) + { + int order_n = table->DisplayOrderToIndex[column_n]; + if (order_n != column_n && order_n >= table->FreezeColumnsRequest) + { + ImSwap(table->Columns[table->DisplayOrderToIndex[order_n]].DisplayOrder, table->Columns[table->DisplayOrderToIndex[column_n]].DisplayOrder); + ImSwap(table->DisplayOrderToIndex[order_n], table->DisplayOrderToIndex[column_n]); + } + } +} + +//----------------------------------------------------------------------------- +// [SECTION] Tables: Simple accessors +//----------------------------------------------------------------------------- +// - TableGetColumnCount() +// - TableGetColumnName() +// - TableGetColumnName() [Internal] +// - TableSetColumnEnabled() +// - TableGetColumnFlags() +// - TableGetCellBgRect() [Internal] +// - TableGetColumnResizeID() [Internal] +// - TableGetHoveredColumn() [Internal] +// - TableSetBgColor() +//----------------------------------------------------------------------------- + +int ImGui::TableGetColumnCount() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + return table ? table->ColumnsCount : 0; +} + +const char* ImGui::TableGetColumnName(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return NULL; + if (column_n < 0) + column_n = table->CurrentColumn; + return TableGetColumnName(table, column_n); +} + +const char* ImGui::TableGetColumnName(const ImGuiTable* table, int column_n) +{ + if (table->IsLayoutLocked == false && column_n >= table->DeclColumnsCount) + return ""; // NameOffset is invalid at this point + const ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->NameOffset == -1) + return ""; + return &table->ColumnsNames.Buf[column->NameOffset]; +} + +// Change user accessible enabled/disabled state of a column (often perceived as "showing/hiding" from users point of view) +// Note that end-user can use the context menu to change this themselves (right-click in headers, or right-click in columns body with ImGuiTableFlags_ContextMenuInBody) +// - Require table to have the ImGuiTableFlags_Hideable flag because we are manipulating user accessible state. +// - Request will be applied during next layout, which happens on the first call to TableNextRow() after BeginTable(). +// - For the getter you can test (TableGetColumnFlags() & ImGuiTableColumnFlags_IsEnabled) != 0. +// - Alternative: the ImGuiTableColumnFlags_Disabled is an overriding/master disable flag which will also hide the column from context menu. +void ImGui::TableSetColumnEnabled(int column_n, bool enabled) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + if (!table) + return; + IM_ASSERT(table->Flags & ImGuiTableFlags_Hideable); // See comments above + if (column_n < 0) + column_n = table->CurrentColumn; + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column = &table->Columns[column_n]; + column->IsUserEnabledNextFrame = enabled; +} + +// We allow querying for an extra column in order to poll the IsHovered state of the right-most section +ImGuiTableColumnFlags ImGui::TableGetColumnFlags(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return ImGuiTableColumnFlags_None; + if (column_n < 0) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) + return (table->HoveredColumnBody == column_n) ? ImGuiTableColumnFlags_IsHovered : ImGuiTableColumnFlags_None; + return table->Columns[column_n].Flags; +} + +// Return the cell rectangle based on currently known height. +// - Important: we generally don't know our row height until the end of the row, so Max.y will be incorrect in many situations. +// The only case where this is correct is if we provided a min_row_height to TableNextRow() and don't go below it, or in TableEndRow() when we locked that height. +// - Important: if ImGuiTableFlags_PadOuterX is set but ImGuiTableFlags_PadInnerX is not set, the outer-most left and right +// columns report a small offset so their CellBgRect can extend up to the outer border. +// FIXME: But the rendering code in TableEndRow() nullifies that with clamping required for scrolling. +ImRect ImGui::TableGetCellBgRect(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float x1 = column->MinX; + float x2 = column->MaxX; + //if (column->PrevEnabledColumn == -1) + // x1 -= table->OuterPaddingX; + //if (column->NextEnabledColumn == -1) + // x2 += table->OuterPaddingX; + x1 = ImMax(x1, table->WorkRect.Min.x); + x2 = ImMin(x2, table->WorkRect.Max.x); + return ImRect(x1, table->RowPosY1, x2, table->RowPosY2); +} + +// Return the resizing ID for the right-side of the given column. +ImGuiID ImGui::TableGetColumnResizeID(ImGuiTable* table, int column_n, int instance_no) +{ + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiID instance_id = TableGetInstanceID(table, instance_no); + return instance_id + 1 + column_n; // FIXME: #6140: still not ideal +} + +// Return -1 when table is not hovered. return columns_count if the unused space at the right of visible columns is hovered. +int ImGui::TableGetHoveredColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return -1; + return (int)table->HoveredColumnBody; +} + +void ImGui::TableSetBgColor(ImGuiTableBgTarget target, ImU32 color, int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(target != ImGuiTableBgTarget_None); + + if (color == IM_COL32_DISABLE) + color = 0; + + // We cannot draw neither the cell or row background immediately as we don't know the row height at this point in time. + switch (target) + { + case ImGuiTableBgTarget_CellBg: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + if (column_n == -1) + column_n = table->CurrentColumn; + if (!IM_BITARRAY_TESTBIT(table->VisibleMaskByIndex, column_n)) + return; + if (table->RowCellDataCurrent < 0 || table->RowCellData[table->RowCellDataCurrent].Column != column_n) + table->RowCellDataCurrent++; + ImGuiTableCellData* cell_data = &table->RowCellData[table->RowCellDataCurrent]; + cell_data->BgColor = color; + cell_data->Column = (ImGuiTableColumnIdx)column_n; + break; + } + case ImGuiTableBgTarget_RowBg0: + case ImGuiTableBgTarget_RowBg1: + { + if (table->RowPosY1 > table->InnerClipRect.Max.y) // Discard + return; + IM_ASSERT(column_n == -1); + int bg_idx = (target == ImGuiTableBgTarget_RowBg1) ? 1 : 0; + table->RowBgColor[bg_idx] = color; + break; + } + default: + IM_ASSERT(0); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Row changes +//------------------------------------------------------------------------- +// - TableGetRowIndex() +// - TableNextRow() +// - TableBeginRow() [Internal] +// - TableEndRow() [Internal] +//------------------------------------------------------------------------- + +// [Public] Note: for row coloring we use ->RowBgColorCounter which is the same value without counting header rows +int ImGui::TableGetRowIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentRow; +} + +// [Public] Starts into the first cell of a new row +void ImGui::TableNextRow(ImGuiTableRowFlags row_flags, float row_min_height) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + if (table->IsInsideRow) + TableEndRow(table); + + table->LastRowFlags = table->RowFlags; + table->RowFlags = row_flags; + table->RowMinHeight = row_min_height; + TableBeginRow(table); + + // We honor min_row_height requested by user, but cannot guarantee per-row maximum height, + // because that would essentially require a unique clipping rectangle per-cell. + table->RowPosY2 += table->CellPaddingY * 2.0f; + table->RowPosY2 = ImMax(table->RowPosY2, table->RowPosY1 + row_min_height); + + // Disable output until user calls TableNextColumn() + table->InnerWindow->SkipItems = true; +} + +// [Internal] Called by TableNextRow() +void ImGui::TableBeginRow(ImGuiTable* table) +{ + ImGuiWindow* window = table->InnerWindow; + IM_ASSERT(!table->IsInsideRow); + + // New row + table->CurrentRow++; + table->CurrentColumn = -1; + table->RowBgColor[0] = table->RowBgColor[1] = IM_COL32_DISABLE; + table->RowCellDataCurrent = -1; + table->IsInsideRow = true; + + // Begin frozen rows + float next_y1 = table->RowPosY2; + if (table->CurrentRow == 0 && table->FreezeRowsCount > 0) + next_y1 = window->DC.CursorPos.y = table->OuterRect.Min.y; + + table->RowPosY1 = table->RowPosY2 = next_y1; + table->RowTextBaseline = 0.0f; + table->RowIndentOffsetX = window->DC.Indent.x - table->HostIndentX; // Lock indent + window->DC.PrevLineTextBaseOffset = 0.0f; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.IsSameLine = window->DC.IsSetPos = false; + window->DC.CursorMaxPos.y = next_y1; + + // Making the header BG color non-transparent will allow us to overlay it multiple times when handling smooth dragging. + if (table->RowFlags & ImGuiTableRowFlags_Headers) + { + TableSetBgColor(ImGuiTableBgTarget_RowBg0, GetColorU32(ImGuiCol_TableHeaderBg)); + if (table->CurrentRow == 0) + table->IsUsingHeaders = true; + } +} + +// [Internal] Called by TableNextRow() +void ImGui::TableEndRow(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window == table->InnerWindow); + IM_ASSERT(table->IsInsideRow); + + if (table->CurrentColumn != -1) + TableEndCell(table); + + // Logging + if (g.LogEnabled) + LogRenderedText(NULL, "|"); + + // Position cursor at the bottom of our row so it can be used for e.g. clipping calculation. However it is + // likely that the next call to TableBeginCell() will reposition the cursor to take account of vertical padding. + window->DC.CursorPos.y = table->RowPosY2; + + // Row background fill + const float bg_y1 = table->RowPosY1; + const float bg_y2 = table->RowPosY2; + const bool unfreeze_rows_actual = (table->CurrentRow + 1 == table->FreezeRowsCount); + const bool unfreeze_rows_request = (table->CurrentRow + 1 == table->FreezeRowsRequest); + if (table->CurrentRow == 0) + TableGetInstanceData(table, table->InstanceCurrent)->LastFirstRowHeight = bg_y2 - bg_y1; + + const bool is_visible = (bg_y2 >= table->InnerClipRect.Min.y && bg_y1 <= table->InnerClipRect.Max.y); + if (is_visible) + { + // Decide of background color for the row + ImU32 bg_col0 = 0; + ImU32 bg_col1 = 0; + if (table->RowBgColor[0] != IM_COL32_DISABLE) + bg_col0 = table->RowBgColor[0]; + else if (table->Flags & ImGuiTableFlags_RowBg) + bg_col0 = GetColorU32((table->RowBgColorCounter & 1) ? ImGuiCol_TableRowBgAlt : ImGuiCol_TableRowBg); + if (table->RowBgColor[1] != IM_COL32_DISABLE) + bg_col1 = table->RowBgColor[1]; + + // Decide of top border color + ImU32 border_col = 0; + const float border_size = TABLE_BORDER_SIZE; + if (table->CurrentRow > 0 || table->InnerWindow == table->OuterWindow) + if (table->Flags & ImGuiTableFlags_BordersInnerH) + border_col = (table->LastRowFlags & ImGuiTableRowFlags_Headers) ? table->BorderColorStrong : table->BorderColorLight; + + const bool draw_cell_bg_color = table->RowCellDataCurrent >= 0; + const bool draw_strong_bottom_border = unfreeze_rows_actual; + if ((bg_col0 | bg_col1 | border_col) != 0 || draw_strong_bottom_border || draw_cell_bg_color) + { + // In theory we could call SetWindowClipRectBeforeSetChannel() but since we know TableEndRow() is + // always followed by a change of clipping rectangle we perform the smallest overwrite possible here. + if ((table->Flags & ImGuiTableFlags_NoClip) == 0) + window->DrawList->_CmdHeader.ClipRect = table->Bg0ClipRectForDrawCmd.ToVec4(); + table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_BG0); + } + + // Draw row background + // We soft/cpu clip this so all backgrounds and borders can share the same clipping rectangle + if (bg_col0 || bg_col1) + { + ImRect row_rect(table->WorkRect.Min.x, bg_y1, table->WorkRect.Max.x, bg_y2); + row_rect.ClipWith(table->BgClipRect); + if (bg_col0 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col0); + if (bg_col1 != 0 && row_rect.Min.y < row_rect.Max.y) + window->DrawList->AddRectFilled(row_rect.Min, row_rect.Max, bg_col1); + } + + // Draw cell background color + if (draw_cell_bg_color) + { + ImGuiTableCellData* cell_data_end = &table->RowCellData[table->RowCellDataCurrent]; + for (ImGuiTableCellData* cell_data = &table->RowCellData[0]; cell_data <= cell_data_end; cell_data++) + { + // As we render the BG here we need to clip things (for layout we would not) + // FIXME: This cancels the OuterPadding addition done by TableGetCellBgRect(), need to keep it while rendering correctly while scrolling. + const ImGuiTableColumn* column = &table->Columns[cell_data->Column]; + ImRect cell_bg_rect = TableGetCellBgRect(table, cell_data->Column); + cell_bg_rect.ClipWith(table->BgClipRect); + cell_bg_rect.Min.x = ImMax(cell_bg_rect.Min.x, column->ClipRect.Min.x); // So that first column after frozen one gets clipped when scrolling + cell_bg_rect.Max.x = ImMin(cell_bg_rect.Max.x, column->MaxX); + window->DrawList->AddRectFilled(cell_bg_rect.Min, cell_bg_rect.Max, cell_data->BgColor); + } + } + + // Draw top border + if (border_col && bg_y1 >= table->BgClipRect.Min.y && bg_y1 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y1), ImVec2(table->BorderX2, bg_y1), border_col, border_size); + + // Draw bottom border at the row unfreezing mark (always strong) + if (draw_strong_bottom_border && bg_y2 >= table->BgClipRect.Min.y && bg_y2 < table->BgClipRect.Max.y) + window->DrawList->AddLine(ImVec2(table->BorderX1, bg_y2), ImVec2(table->BorderX2, bg_y2), table->BorderColorStrong, border_size); + } + + // End frozen rows (when we are past the last frozen row line, teleport cursor and alter clipping rectangle) + // We need to do that in TableEndRow() instead of TableBeginRow() so the list clipper can mark end of row and + // get the new cursor position. + if (unfreeze_rows_request) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->Columns[column_n].NavLayerCurrent = ImGuiNavLayer_Main; + if (unfreeze_rows_actual) + { + IM_ASSERT(table->IsUnfrozenRows == false); + const float y0 = ImMax(table->RowPosY2 + 1, window->InnerClipRect.Min.y); + table->IsUnfrozenRows = true; + TableGetInstanceData(table, table->InstanceCurrent)->LastFrozenHeight = y0 - table->OuterRect.Min.y; + + // BgClipRect starts as table->InnerClipRect, reduce it now and make BgClipRectForDrawCmd == BgClipRect + table->BgClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y = ImMin(y0, window->InnerClipRect.Max.y); + table->BgClipRect.Max.y = table->Bg2ClipRectForDrawCmd.Max.y = window->InnerClipRect.Max.y; + table->Bg2DrawChannelCurrent = table->Bg2DrawChannelUnfrozen; + IM_ASSERT(table->Bg2ClipRectForDrawCmd.Min.y <= table->Bg2ClipRectForDrawCmd.Max.y); + + float row_height = table->RowPosY2 - table->RowPosY1; + table->RowPosY2 = window->DC.CursorPos.y = table->WorkRect.Min.y + table->RowPosY2 - table->OuterRect.Min.y; + table->RowPosY1 = table->RowPosY2 - row_height; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + column->DrawChannelCurrent = column->DrawChannelUnfrozen; + column->ClipRect.Min.y = table->Bg2ClipRectForDrawCmd.Min.y; + } + + // Update cliprect ahead of TableBeginCell() so clipper can access to new ClipRect->Min.y + SetWindowClipRectBeforeSetChannel(window, table->Columns[0].ClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Columns[0].DrawChannelCurrent); + } + + if (!(table->RowFlags & ImGuiTableRowFlags_Headers)) + table->RowBgColorCounter++; + table->IsInsideRow = false; +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns changes +//------------------------------------------------------------------------- +// - TableGetColumnIndex() +// - TableSetColumnIndex() +// - TableNextColumn() +// - TableBeginCell() [Internal] +// - TableEndCell() [Internal] +//------------------------------------------------------------------------- + +int ImGui::TableGetColumnIndex() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return 0; + return table->CurrentColumn; +} + +// [Public] Append into a specific column +bool ImGui::TableSetColumnIndex(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->CurrentColumn != column_n) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + IM_ASSERT(column_n >= 0 && table->ColumnsCount); + TableBeginCell(table, column_n); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + return table->Columns[column_n].IsRequestOutput; +} + +// [Public] Append into the next column, wrap and create a new row when already on last column +bool ImGui::TableNextColumn() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (!table) + return false; + + if (table->IsInsideRow && table->CurrentColumn + 1 < table->ColumnsCount) + { + if (table->CurrentColumn != -1) + TableEndCell(table); + TableBeginCell(table, table->CurrentColumn + 1); + } + else + { + TableNextRow(); + TableBeginCell(table, 0); + } + + // Return whether the column is visible. User may choose to skip submitting items based on this return value, + // however they shouldn't skip submitting for columns that may have the tallest contribution to row height. + return table->Columns[table->CurrentColumn].IsRequestOutput; +} + + +// [Internal] Called by TableSetColumnIndex()/TableNextColumn() +// This is called very frequently, so we need to be mindful of unnecessary overhead. +// FIXME-TABLE FIXME-OPT: Could probably shortcut some things for non-active or clipped columns. +void ImGui::TableBeginCell(ImGuiTable* table, int column_n) +{ + ImGuiTableColumn* column = &table->Columns[column_n]; + ImGuiWindow* window = table->InnerWindow; + table->CurrentColumn = column_n; + + // Start position is roughly ~~ CellRect.Min + CellPadding + Indent + float start_x = column->WorkMinX; + if (column->Flags & ImGuiTableColumnFlags_IndentEnable) + start_x += table->RowIndentOffsetX; // ~~ += window.DC.Indent.x - table->HostIndentX, except we locked it for the row. + + window->DC.CursorPos.x = start_x; + window->DC.CursorPos.y = table->RowPosY1 + table->CellPaddingY; + window->DC.CursorMaxPos.x = window->DC.CursorPos.x; + window->DC.ColumnsOffset.x = start_x - window->Pos.x - window->DC.Indent.x; // FIXME-WORKRECT + window->DC.CurrLineTextBaseOffset = table->RowTextBaseline; + window->DC.NavLayerCurrent = (ImGuiNavLayer)column->NavLayerCurrent; + + window->WorkRect.Min.y = window->DC.CursorPos.y; + window->WorkRect.Min.x = column->WorkMinX; + window->WorkRect.Max.x = column->WorkMaxX; + window->DC.ItemWidth = column->ItemWidth; + + window->SkipItems = column->IsSkipItems; + if (column->IsSkipItems) + { + ImGuiContext& g = *GImGui; + g.LastItemData.ID = 0; + g.LastItemData.StatusFlags = 0; + } + + if (table->Flags & ImGuiTableFlags_NoClip) + { + // FIXME: if we end up drawing all borders/bg in EndTable, could remove this and just assert that channel hasn't changed. + table->DrawSplitter->SetCurrentChannel(window->DrawList, TABLE_DRAW_CHANNEL_NOCLIP); + //IM_ASSERT(table->DrawSplitter._Current == TABLE_DRAW_CHANNEL_NOCLIP); + } + else + { + // FIXME-TABLE: Could avoid this if draw channel is dummy channel? + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); + } + + // Logging + ImGuiContext& g = *GImGui; + if (g.LogEnabled && !column->IsSkipItems) + { + LogRenderedText(&window->DC.CursorPos, "|"); + g.LogLinePosY = FLT_MAX; + } +} + +// [Internal] Called by TableNextRow()/TableSetColumnIndex()/TableNextColumn() +void ImGui::TableEndCell(ImGuiTable* table) +{ + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + ImGuiWindow* window = table->InnerWindow; + + if (window->DC.IsSetPos) + ErrorCheckUsingSetCursorPosToExtendParentBoundaries(); + + // Report maximum position so we can infer content size per column. + float* p_max_pos_x; + if (table->RowFlags & ImGuiTableRowFlags_Headers) + p_max_pos_x = &column->ContentMaxXHeadersUsed; // Useful in case user submit contents in header row that is not a TableHeader() call + else + p_max_pos_x = table->IsUnfrozenRows ? &column->ContentMaxXUnfrozen : &column->ContentMaxXFrozen; + *p_max_pos_x = ImMax(*p_max_pos_x, window->DC.CursorMaxPos.x); + if (column->IsEnabled) + table->RowPosY2 = ImMax(table->RowPosY2, window->DC.CursorMaxPos.y + table->CellPaddingY); + column->ItemWidth = window->DC.ItemWidth; + + // Propagate text baseline for the entire row + // FIXME-TABLE: Here we propagate text baseline from the last line of the cell.. instead of the first one. + table->RowTextBaseline = ImMax(table->RowTextBaseline, window->DC.PrevLineTextBaseOffset); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Columns width management +//------------------------------------------------------------------------- +// - TableGetMaxColumnWidth() [Internal] +// - TableGetColumnWidthAuto() [Internal] +// - TableSetColumnWidth() +// - TableSetColumnWidthAutoSingle() [Internal] +// - TableSetColumnWidthAutoAll() [Internal] +// - TableUpdateColumnsWeightFromWidth() [Internal] +//------------------------------------------------------------------------- + +// Maximum column content width given current layout. Use column->MinX so this value on a per-column basis. +float ImGui::TableGetMaxColumnWidth(const ImGuiTable* table, int column_n) +{ + const ImGuiTableColumn* column = &table->Columns[column_n]; + float max_width = FLT_MAX; + const float min_column_distance = table->MinColumnWidth + table->CellPaddingX * 2.0f + table->CellSpacingX1 + table->CellSpacingX2; + if (table->Flags & ImGuiTableFlags_ScrollX) + { + // Frozen columns can't reach beyond visible width else scrolling will naturally break. + // (we use DisplayOrder as within a set of multiple frozen column reordering is possible) + if (column->DisplayOrder < table->FreezeColumnsRequest) + { + max_width = (table->InnerClipRect.Max.x - (table->FreezeColumnsRequest - column->DisplayOrder) * min_column_distance) - column->MinX; + max_width = max_width - table->OuterPaddingX - table->CellPaddingX - table->CellSpacingX2; + } + } + else if ((table->Flags & ImGuiTableFlags_NoKeepColumnsVisible) == 0) + { + // If horizontal scrolling if disabled, we apply a final lossless shrinking of columns in order to make + // sure they are all visible. Because of this we also know that all of the columns will always fit in + // table->WorkRect and therefore in table->InnerRect (because ScrollX is off) + // FIXME-TABLE: This is solved incorrectly but also quite a difficult problem to fix as we also want ClipRect width to match. + // See "table_width_distrib" and "table_width_keep_visible" tests + max_width = table->WorkRect.Max.x - (table->ColumnsEnabledCount - column->IndexWithinEnabledSet - 1) * min_column_distance - column->MinX; + //max_width -= table->CellSpacingX1; + max_width -= table->CellSpacingX2; + max_width -= table->CellPaddingX * 2.0f; + max_width -= table->OuterPaddingX; + } + return max_width; +} + +// Note this is meant to be stored in column->WidthAuto, please generally use the WidthAuto field +float ImGui::TableGetColumnWidthAuto(ImGuiTable* table, ImGuiTableColumn* column) +{ + const float content_width_body = ImMax(column->ContentMaxXFrozen, column->ContentMaxXUnfrozen) - column->WorkMinX; + const float content_width_headers = column->ContentMaxXHeadersIdeal - column->WorkMinX; + float width_auto = content_width_body; + if (!(column->Flags & ImGuiTableColumnFlags_NoHeaderWidth)) + width_auto = ImMax(width_auto, content_width_headers); + + // Non-resizable fixed columns preserve their requested width + if ((column->Flags & ImGuiTableColumnFlags_WidthFixed) && column->InitStretchWeightOrWidth > 0.0f) + if (!(table->Flags & ImGuiTableFlags_Resizable) || (column->Flags & ImGuiTableColumnFlags_NoResize)) + width_auto = column->InitStretchWeightOrWidth; + + return ImMax(width_auto, table->MinColumnWidth); +} + +// 'width' = inner column width, without padding +void ImGui::TableSetColumnWidth(int column_n, float width) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && table->IsLayoutLocked == false); + IM_ASSERT(column_n >= 0 && column_n < table->ColumnsCount); + ImGuiTableColumn* column_0 = &table->Columns[column_n]; + float column_0_width = width; + + // Apply constraints early + // Compare both requested and actual given width to avoid overwriting requested width when column is stuck (minimum size, bounded) + IM_ASSERT(table->MinColumnWidth > 0.0f); + const float min_width = table->MinColumnWidth; + const float max_width = ImMax(min_width, TableGetMaxColumnWidth(table, column_n)); + column_0_width = ImClamp(column_0_width, min_width, max_width); + if (column_0->WidthGiven == column_0_width || column_0->WidthRequest == column_0_width) + return; + + //IMGUI_DEBUG_PRINT("TableSetColumnWidth(%d, %.1f->%.1f)\n", column_0_idx, column_0->WidthGiven, column_0_width); + ImGuiTableColumn* column_1 = (column_0->NextEnabledColumn != -1) ? &table->Columns[column_0->NextEnabledColumn] : NULL; + + // In this surprisingly not simple because of how we support mixing Fixed and multiple Stretch columns. + // - All fixed: easy. + // - All stretch: easy. + // - One or more fixed + one stretch: easy. + // - One or more fixed + more than one stretch: tricky. + // Qt when manual resize is enabled only support a single _trailing_ stretch column. + + // When forwarding resize from Wn| to Fn+1| we need to be considerate of the _NoResize flag on Fn+1. + // FIXME-TABLE: Find a way to rewrite all of this so interactions feel more consistent for the user. + // Scenarios: + // - F1 F2 F3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. Subsequent columns will be offset. + // - F1 F2 F3 resize from F3| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered. + // - F1 F2 W3 resize from F1| or F2| --> ok: alter ->WidthRequested of Fixed column. If active, ScrollX extent can be altered, but it doesn't make much sense as the Stretch column will always be minimal size. + // - F1 F2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 W3 resize from W1| or W2| --> ok + // - W1 W2 W3 resize from W3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 F3 resize from F3| --> ok: no-op (disabled by Resize Rule 1) + // - W1 F2 resize from F2| --> ok: no-op (disabled by Resize Rule 1) + // - W1 W2 F3 resize from W1| or W2| --> ok + // - W1 F2 W3 resize from W1| or F2| --> ok + // - F1 W2 F3 resize from W2| --> ok + // - F1 W3 F2 resize from W3| --> ok + // - W1 F2 F3 resize from W1| --> ok: equivalent to resizing |F2. F3 will not move. + // - W1 F2 F3 resize from F2| --> ok + // All resizes from a Wx columns are locking other columns. + + // Possible improvements: + // - W1 W2 W3 resize W1| --> to not be stuck, both W2 and W3 would stretch down. Seems possible to fix. Would be most beneficial to simplify resize of all-weighted columns. + // - W3 F1 F2 resize W3| --> to not be stuck past F1|, both F1 and F2 would need to stretch down, which would be lossy or ambiguous. Seems hard to fix. + + // [Resize Rule 1] Can't resize from right of right-most visible column if there is any Stretch column. Implemented in TableUpdateLayout(). + + // If we have all Fixed columns OR resizing a Fixed column that doesn't come after a Stretch one, we can do an offsetting resize. + // This is the preferred resize path + if (column_0->Flags & ImGuiTableColumnFlags_WidthFixed) + if (!column_1 || table->LeftMostStretchedColumn == -1 || table->Columns[table->LeftMostStretchedColumn].DisplayOrder >= column_0->DisplayOrder) + { + column_0->WidthRequest = column_0_width; + table->IsSettingsDirty = true; + return; + } + + // We can also use previous column if there's no next one (this is used when doing an auto-fit on the right-most stretch column) + if (column_1 == NULL) + column_1 = (column_0->PrevEnabledColumn != -1) ? &table->Columns[column_0->PrevEnabledColumn] : NULL; + if (column_1 == NULL) + return; + + // Resizing from right-side of a Stretch column before a Fixed column forward sizing to left-side of fixed column. + // (old_a + old_b == new_a + new_b) --> (new_a == old_a + old_b - new_b) + float column_1_width = ImMax(column_1->WidthRequest - (column_0_width - column_0->WidthRequest), min_width); + column_0_width = column_0->WidthRequest + column_1->WidthRequest - column_1_width; + IM_ASSERT(column_0_width > 0.0f && column_1_width > 0.0f); + column_0->WidthRequest = column_0_width; + column_1->WidthRequest = column_1_width; + if ((column_0->Flags | column_1->Flags) & ImGuiTableColumnFlags_WidthStretch) + TableUpdateColumnsWeightFromWidth(table); + table->IsSettingsDirty = true; +} + +// Disable clipping then auto-fit, will take 2 frames +// (we don't take a shortcut for unclipped columns to reduce inconsistencies when e.g. resizing multiple columns) +void ImGui::TableSetColumnWidthAutoSingle(ImGuiTable* table, int column_n) +{ + // Single auto width uses auto-fit + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled) + return; + column->CannotSkipItemsQueue = (1 << 0); + table->AutoFitSingleColumn = (ImGuiTableColumnIdx)column_n; +} + +void ImGui::TableSetColumnWidthAutoAll(ImGuiTable* table) +{ + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) // Cannot reset weight of hidden stretch column + continue; + column->CannotSkipItemsQueue = (1 << 0); + column->AutoFitQueue = (1 << 1); + } +} + +void ImGui::TableUpdateColumnsWeightFromWidth(ImGuiTable* table) +{ + IM_ASSERT(table->LeftMostStretchedColumn != -1 && table->RightMostStretchedColumn != -1); + + // Measure existing quantity + float visible_weight = 0.0f; + float visible_width = 0.0f; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + IM_ASSERT(column->StretchWeight > 0.0f); + visible_weight += column->StretchWeight; + visible_width += column->WidthRequest; + } + IM_ASSERT(visible_weight > 0.0f && visible_width > 0.0f); + + // Apply new weights + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (!column->IsEnabled || !(column->Flags & ImGuiTableColumnFlags_WidthStretch)) + continue; + column->StretchWeight = (column->WidthRequest / visible_width) * visible_weight; + IM_ASSERT(column->StretchWeight > 0.0f); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Drawing +//------------------------------------------------------------------------- +// - TablePushBackgroundChannel() [Internal] +// - TablePopBackgroundChannel() [Internal] +// - TableSetupDrawChannels() [Internal] +// - TableMergeDrawChannels() [Internal] +// - TableDrawBorders() [Internal] +//------------------------------------------------------------------------- + +// Bg2 is used by Selectable (and possibly other widgets) to render to the background. +// Unlike our Bg0/1 channel which we uses for RowBg/CellBg/Borders and where we guarantee all shapes to be CPU-clipped, the Bg2 channel being widgets-facing will rely on regular ClipRect. +void ImGui::TablePushBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + table->HostBackupInnerClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, table->Bg2ClipRectForDrawCmd); + table->DrawSplitter->SetCurrentChannel(window->DrawList, table->Bg2DrawChannelCurrent); +} + +void ImGui::TablePopBackgroundChannel() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiTable* table = g.CurrentTable; + ImGuiTableColumn* column = &table->Columns[table->CurrentColumn]; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, table->HostBackupInnerClipRect); + table->DrawSplitter->SetCurrentChannel(window->DrawList, column->DrawChannelCurrent); +} + +// Allocate draw channels. Called by TableUpdateLayout() +// - We allocate them following storage order instead of display order so reordering columns won't needlessly +// increase overall dormant memory cost. +// - We isolate headers draw commands in their own channels instead of just altering clip rects. +// This is in order to facilitate merging of draw commands. +// - After crossing FreezeRowsCount, all columns see their current draw channel changed to a second set of channels. +// - We only use the dummy draw channel so we can push a null clipping rectangle into it without affecting other +// channels, while simplifying per-row/per-cell overhead. It will be empty and discarded when merged. +// - We allocate 1 or 2 background draw channels. This is because we know TablePushBackgroundChannel() is only used for +// horizontal spanning. If we allowed vertical spanning we'd need one background draw channel per merge group (1-4). +// Draw channel allocation (before merging): +// - NoClip --> 2+D+1 channels: bg0/1 + bg2 + foreground (same clip rect == always 1 draw call) +// - Clip --> 2+D+N channels +// - FreezeRows --> 2+D+N*2 (unless scrolling value is zero) +// - FreezeRows || FreezeColunns --> 3+D+N*2 (unless scrolling value is zero) +// Where D is 1 if any column is clipped or hidden (dummy channel) otherwise 0. +void ImGui::TableSetupDrawChannels(ImGuiTable* table) +{ + const int freeze_row_multiplier = (table->FreezeRowsCount > 0) ? 2 : 1; + const int channels_for_row = (table->Flags & ImGuiTableFlags_NoClip) ? 1 : table->ColumnsEnabledCount; + const int channels_for_bg = 1 + 1 * freeze_row_multiplier; + const int channels_for_dummy = (table->ColumnsEnabledCount < table->ColumnsCount || (memcmp(table->VisibleMaskByIndex, table->EnabledMaskByIndex, ImBitArrayGetStorageSizeInBytes(table->ColumnsCount)) != 0)) ? +1 : 0; + const int channels_total = channels_for_bg + (channels_for_row * freeze_row_multiplier) + channels_for_dummy; + table->DrawSplitter->Split(table->InnerWindow->DrawList, channels_total); + table->DummyDrawChannel = (ImGuiTableDrawChannelIdx)((channels_for_dummy > 0) ? channels_total - 1 : -1); + table->Bg2DrawChannelCurrent = TABLE_DRAW_CHANNEL_BG2_FROZEN; + table->Bg2DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)((table->FreezeRowsCount > 0) ? 2 + channels_for_row : TABLE_DRAW_CHANNEL_BG2_FROZEN); + + int draw_channel_current = 2; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsVisibleX && column->IsVisibleY) + { + column->DrawChannelFrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current); + column->DrawChannelUnfrozen = (ImGuiTableDrawChannelIdx)(draw_channel_current + (table->FreezeRowsCount > 0 ? channels_for_row + 1 : 0)); + if (!(table->Flags & ImGuiTableFlags_NoClip)) + draw_channel_current++; + } + else + { + column->DrawChannelFrozen = column->DrawChannelUnfrozen = table->DummyDrawChannel; + } + column->DrawChannelCurrent = column->DrawChannelFrozen; + } + + // Initial draw cmd starts with a BgClipRect that matches the one of its host, to facilitate merge draw commands by default. + // All our cell highlight are manually clipped with BgClipRect. When unfreezing it will be made smaller to fit scrolling rect. + // (This technically isn't part of setting up draw channels, but is reasonably related to be done here) + table->BgClipRect = table->InnerClipRect; + table->Bg0ClipRectForDrawCmd = table->OuterWindow->ClipRect; + table->Bg2ClipRectForDrawCmd = table->HostClipRect; + IM_ASSERT(table->BgClipRect.Min.y <= table->BgClipRect.Max.y); +} + +// This function reorder draw channels based on matching clip rectangle, to facilitate merging them. Called by EndTable(). +// For simplicity we call it TableMergeDrawChannels() but in fact it only reorder channels + overwrite ClipRect, +// actual merging is done by table->DrawSplitter.Merge() which is called right after TableMergeDrawChannels(). +// +// Columns where the contents didn't stray off their local clip rectangle can be merged. To achieve +// this we merge their clip rect and make them contiguous in the channel list, so they can be merged +// by the call to DrawSplitter.Merge() following to the call to this function. +// We reorder draw commands by arranging them into a maximum of 4 distinct groups: +// +// 1 group: 2 groups: 2 groups: 4 groups: +// [ 0. ] no freeze [ 0. ] row freeze [ 01 ] col freeze [ 01 ] row+col freeze +// [ .. ] or no scroll [ 2. ] and v-scroll [ .. ] and h-scroll [ 23 ] and v+h-scroll +// +// Each column itself can use 1 channel (row freeze disabled) or 2 channels (row freeze enabled). +// When the contents of a column didn't stray off its limit, we move its channels into the corresponding group +// based on its position (within frozen rows/columns groups or not). +// At the end of the operation our 1-4 groups will each have a ImDrawCmd using the same ClipRect. +// This function assume that each column are pointing to a distinct draw channel, +// otherwise merge_group->ChannelsCount will not match set bit count of merge_group->ChannelsMask. +// +// Column channels will not be merged into one of the 1-4 groups in the following cases: +// - The contents stray off its clipping rectangle (we only compare the MaxX value, not the MinX value). +// Direct ImDrawList calls won't be taken into account by default, if you use them make sure the ImGui:: bounds +// matches, by e.g. calling SetCursorScreenPos(). +// - The channel uses more than one draw command itself. We drop all our attempt at merging stuff here.. +// we could do better but it's going to be rare and probably not worth the hassle. +// Columns for which the draw channel(s) haven't been merged with other will use their own ImDrawCmd. +// +// This function is particularly tricky to understand.. take a breath. +void ImGui::TableMergeDrawChannels(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImDrawListSplitter* splitter = table->DrawSplitter; + const bool has_freeze_v = (table->FreezeRowsCount > 0); + const bool has_freeze_h = (table->FreezeColumnsCount > 0); + IM_ASSERT(splitter->_Current == 0); + + // Track which groups we are going to attempt to merge, and which channels goes into each group. + struct MergeGroup + { + ImRect ClipRect; + int ChannelsCount; + ImBitArrayPtr ChannelsMask; + }; + int merge_group_mask = 0x00; + MergeGroup merge_groups[4] = {}; + + // Use a reusable temp buffer for the merge masks as they are dynamically sized. + const int max_draw_channels = (4 + table->ColumnsCount * 2); + const int size_for_masks_bitarrays_one = (int)ImBitArrayGetStorageSizeInBytes(max_draw_channels); + g.TempBuffer.reserve(size_for_masks_bitarrays_one * 5); + memset(g.TempBuffer.Data, 0, size_for_masks_bitarrays_one * 5); + for (int n = 0; n < IM_ARRAYSIZE(merge_groups); n++) + merge_groups[n].ChannelsMask = (ImBitArrayPtr)(void*)(g.TempBuffer.Data + (size_for_masks_bitarrays_one * n)); + ImBitArrayPtr remaining_mask = (ImBitArrayPtr)(void*)(g.TempBuffer.Data + (size_for_masks_bitarrays_one * 4)); + + // 1. Scan channels and take note of those which can be merged + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + if (!IM_BITARRAY_TESTBIT(table->VisibleMaskByIndex, column_n)) + continue; + ImGuiTableColumn* column = &table->Columns[column_n]; + + const int merge_group_sub_count = has_freeze_v ? 2 : 1; + for (int merge_group_sub_n = 0; merge_group_sub_n < merge_group_sub_count; merge_group_sub_n++) + { + const int channel_no = (merge_group_sub_n == 0) ? column->DrawChannelFrozen : column->DrawChannelUnfrozen; + + // Don't attempt to merge if there are multiple draw calls within the column + ImDrawChannel* src_channel = &splitter->_Channels[channel_no]; + if (src_channel->_CmdBuffer.Size > 0 && src_channel->_CmdBuffer.back().ElemCount == 0 && src_channel->_CmdBuffer.back().UserCallback == NULL) // Equivalent of PopUnusedDrawCmd() + src_channel->_CmdBuffer.pop_back(); + if (src_channel->_CmdBuffer.Size != 1) + continue; + + // Find out the width of this merge group and check if it will fit in our column + // (note that we assume that rendering didn't stray on the left direction. we should need a CursorMinPos to detect it) + if (!(column->Flags & ImGuiTableColumnFlags_NoClip)) + { + float content_max_x; + if (!has_freeze_v) + content_max_x = ImMax(column->ContentMaxXUnfrozen, column->ContentMaxXHeadersUsed); // No row freeze + else if (merge_group_sub_n == 0) + content_max_x = ImMax(column->ContentMaxXFrozen, column->ContentMaxXHeadersUsed); // Row freeze: use width before freeze + else + content_max_x = column->ContentMaxXUnfrozen; // Row freeze: use width after freeze + if (content_max_x > column->ClipRect.Max.x) + continue; + } + + const int merge_group_n = (has_freeze_h && column_n < table->FreezeColumnsCount ? 0 : 1) + (has_freeze_v && merge_group_sub_n == 0 ? 0 : 2); + IM_ASSERT(channel_no < max_draw_channels); + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + merge_group->ClipRect = ImRect(+FLT_MAX, +FLT_MAX, -FLT_MAX, -FLT_MAX); + ImBitArraySetBit(merge_group->ChannelsMask, channel_no); + merge_group->ChannelsCount++; + merge_group->ClipRect.Add(src_channel->_CmdBuffer[0].ClipRect); + merge_group_mask |= (1 << merge_group_n); + } + + // Invalidate current draw channel + // (we don't clear DrawChannelFrozen/DrawChannelUnfrozen solely to facilitate debugging/later inspection of data) + column->DrawChannelCurrent = (ImGuiTableDrawChannelIdx)-1; + } + + // [DEBUG] Display merge groups +#if 0 + if (g.IO.KeyShift) + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + if (merge_group->ChannelsCount == 0) + continue; + char buf[32]; + ImFormatString(buf, 32, "MG%d:%d", merge_group_n, merge_group->ChannelsCount); + ImVec2 text_pos = merge_group->ClipRect.Min + ImVec2(4, 4); + ImVec2 text_size = CalcTextSize(buf, NULL); + GetForegroundDrawList()->AddRectFilled(text_pos, text_pos + text_size, IM_COL32(0, 0, 0, 255)); + GetForegroundDrawList()->AddText(text_pos, IM_COL32(255, 255, 0, 255), buf, NULL); + GetForegroundDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 255, 0, 255)); + } +#endif + + // 2. Rewrite channel list in our preferred order + if (merge_group_mask != 0) + { + // We skip channel 0 (Bg0/Bg1) and 1 (Bg2 frozen) from the shuffling since they won't move - see channels allocation in TableSetupDrawChannels(). + const int LEADING_DRAW_CHANNELS = 2; + g.DrawChannelsTempMergeBuffer.resize(splitter->_Count - LEADING_DRAW_CHANNELS); // Use shared temporary storage so the allocation gets amortized + ImDrawChannel* dst_tmp = g.DrawChannelsTempMergeBuffer.Data; + ImBitArraySetBitRange(remaining_mask, LEADING_DRAW_CHANNELS, splitter->_Count); + ImBitArrayClearBit(remaining_mask, table->Bg2DrawChannelUnfrozen); + IM_ASSERT(has_freeze_v == false || table->Bg2DrawChannelUnfrozen != TABLE_DRAW_CHANNEL_BG2_FROZEN); + int remaining_count = splitter->_Count - (has_freeze_v ? LEADING_DRAW_CHANNELS + 1 : LEADING_DRAW_CHANNELS); + //ImRect host_rect = (table->InnerWindow == table->OuterWindow) ? table->InnerClipRect : table->HostClipRect; + ImRect host_rect = table->HostClipRect; + for (int merge_group_n = 0; merge_group_n < IM_ARRAYSIZE(merge_groups); merge_group_n++) + { + if (int merge_channels_count = merge_groups[merge_group_n].ChannelsCount) + { + MergeGroup* merge_group = &merge_groups[merge_group_n]; + ImRect merge_clip_rect = merge_group->ClipRect; + + // Extend outer-most clip limits to match those of host, so draw calls can be merged even if + // outer-most columns have some outer padding offsetting them from their parent ClipRect. + // The principal cases this is dealing with are: + // - On a same-window table (not scrolling = single group), all fitting columns ClipRect -> will extend and match host ClipRect -> will merge + // - Columns can use padding and have left-most ClipRect.Min.x and right-most ClipRect.Max.x != from host ClipRect -> will extend and match host ClipRect -> will merge + // FIXME-TABLE FIXME-WORKRECT: We are wasting a merge opportunity on tables without scrolling if column doesn't fit + // within host clip rect, solely because of the half-padding difference between window->WorkRect and window->InnerClipRect. + if ((merge_group_n & 1) == 0 || !has_freeze_h) + merge_clip_rect.Min.x = ImMin(merge_clip_rect.Min.x, host_rect.Min.x); + if ((merge_group_n & 2) == 0 || !has_freeze_v) + merge_clip_rect.Min.y = ImMin(merge_clip_rect.Min.y, host_rect.Min.y); + if ((merge_group_n & 1) != 0) + merge_clip_rect.Max.x = ImMax(merge_clip_rect.Max.x, host_rect.Max.x); + if ((merge_group_n & 2) != 0 && (table->Flags & ImGuiTableFlags_NoHostExtendY) == 0) + merge_clip_rect.Max.y = ImMax(merge_clip_rect.Max.y, host_rect.Max.y); +#if 0 + GetOverlayDrawList()->AddRect(merge_group->ClipRect.Min, merge_group->ClipRect.Max, IM_COL32(255, 0, 0, 200), 0.0f, 0, 1.0f); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Min, merge_clip_rect.Min, IM_COL32(255, 100, 0, 200)); + GetOverlayDrawList()->AddLine(merge_group->ClipRect.Max, merge_clip_rect.Max, IM_COL32(255, 100, 0, 200)); +#endif + remaining_count -= merge_group->ChannelsCount; + for (int n = 0; n < (size_for_masks_bitarrays_one >> 2); n++) + remaining_mask[n] &= ~merge_group->ChannelsMask[n]; + for (int n = 0; n < splitter->_Count && merge_channels_count != 0; n++) + { + // Copy + overwrite new clip rect + if (!IM_BITARRAY_TESTBIT(merge_group->ChannelsMask, n)) + continue; + IM_BITARRAY_CLEARBIT(merge_group->ChannelsMask, n); + merge_channels_count--; + + ImDrawChannel* channel = &splitter->_Channels[n]; + IM_ASSERT(channel->_CmdBuffer.Size == 1 && merge_clip_rect.Contains(ImRect(channel->_CmdBuffer[0].ClipRect))); + channel->_CmdBuffer[0].ClipRect = merge_clip_rect.ToVec4(); + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + } + } + + // Make sure Bg2DrawChannelUnfrozen appears in the middle of our groups (whereas Bg0/Bg1 and Bg2 frozen are fixed to 0 and 1) + if (merge_group_n == 1 && has_freeze_v) + memcpy(dst_tmp++, &splitter->_Channels[table->Bg2DrawChannelUnfrozen], sizeof(ImDrawChannel)); + } + + // Append unmergeable channels that we didn't reorder at the end of the list + for (int n = 0; n < splitter->_Count && remaining_count != 0; n++) + { + if (!IM_BITARRAY_TESTBIT(remaining_mask, n)) + continue; + ImDrawChannel* channel = &splitter->_Channels[n]; + memcpy(dst_tmp++, channel, sizeof(ImDrawChannel)); + remaining_count--; + } + IM_ASSERT(dst_tmp == g.DrawChannelsTempMergeBuffer.Data + g.DrawChannelsTempMergeBuffer.Size); + memcpy(splitter->_Channels.Data + LEADING_DRAW_CHANNELS, g.DrawChannelsTempMergeBuffer.Data, (splitter->_Count - LEADING_DRAW_CHANNELS) * sizeof(ImDrawChannel)); + } +} + +// FIXME-TABLE: This is a mess, need to redesign how we render borders (as some are also done in TableEndRow) +void ImGui::TableDrawBorders(ImGuiTable* table) +{ + ImGuiWindow* inner_window = table->InnerWindow; + if (!table->OuterWindow->ClipRect.Overlaps(table->OuterRect)) + return; + + ImDrawList* inner_drawlist = inner_window->DrawList; + table->DrawSplitter->SetCurrentChannel(inner_drawlist, TABLE_DRAW_CHANNEL_BG0); + inner_drawlist->PushClipRect(table->Bg0ClipRectForDrawCmd.Min, table->Bg0ClipRectForDrawCmd.Max, false); + + // Draw inner border and resizing feedback + ImGuiTableInstanceData* table_instance = TableGetInstanceData(table, table->InstanceCurrent); + const float border_size = TABLE_BORDER_SIZE; + const float draw_y1 = table->InnerRect.Min.y; + const float draw_y2_body = table->InnerRect.Max.y; + const float draw_y2_head = table->IsUsingHeaders ? ImMin(table->InnerRect.Max.y, (table->FreezeRowsCount >= 1 ? table->InnerRect.Min.y : table->WorkRect.Min.y) + table_instance->LastFirstRowHeight) : draw_y1; + if (table->Flags & ImGuiTableFlags_BordersInnerV) + { + for (int order_n = 0; order_n < table->ColumnsCount; order_n++) + { + if (!IM_BITARRAY_TESTBIT(table->EnabledMaskByDisplayOrder, order_n)) + continue; + + const int column_n = table->DisplayOrderToIndex[order_n]; + ImGuiTableColumn* column = &table->Columns[column_n]; + const bool is_hovered = (table->HoveredColumnBorder == column_n); + const bool is_resized = (table->ResizedColumn == column_n) && (table->InstanceInteracted == table->InstanceCurrent); + const bool is_resizable = (column->Flags & (ImGuiTableColumnFlags_NoResize | ImGuiTableColumnFlags_NoDirectResize_)) == 0; + const bool is_frozen_separator = (table->FreezeColumnsCount == order_n + 1); + if (column->MaxX > table->InnerClipRect.Max.x && !is_resized) + continue; + + // Decide whether right-most column is visible + if (column->NextEnabledColumn == -1 && !is_resizable) + if ((table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame || (table->Flags & ImGuiTableFlags_NoHostExtendX)) + continue; + if (column->MaxX <= column->ClipRect.Min.x) // FIXME-TABLE FIXME-STYLE: Assume BorderSize==1, this is problematic if we want to increase the border size.. + continue; + + // Draw in outer window so right-most column won't be clipped + // Always draw full height border when being resized/hovered, or on the delimitation of frozen column scrolling. + ImU32 col; + float draw_y2; + if (is_hovered || is_resized || is_frozen_separator) + { + draw_y2 = draw_y2_body; + col = is_resized ? GetColorU32(ImGuiCol_SeparatorActive) : is_hovered ? GetColorU32(ImGuiCol_SeparatorHovered) : table->BorderColorStrong; + } + else + { + draw_y2 = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? draw_y2_head : draw_y2_body; + col = (table->Flags & (ImGuiTableFlags_NoBordersInBody | ImGuiTableFlags_NoBordersInBodyUntilResize)) ? table->BorderColorStrong : table->BorderColorLight; + } + + if (draw_y2 > draw_y1) + inner_drawlist->AddLine(ImVec2(column->MaxX, draw_y1), ImVec2(column->MaxX, draw_y2), col, border_size); + } + } + + // Draw outer border + // FIXME: could use AddRect or explicit VLine/HLine helper? + if (table->Flags & ImGuiTableFlags_BordersOuter) + { + // Display outer border offset by 1 which is a simple way to display it without adding an extra draw call + // (Without the offset, in outer_window it would be rendered behind cells, because child windows are above their + // parent. In inner_window, it won't reach out over scrollbars. Another weird solution would be to display part + // of it in inner window, and the part that's over scrollbars in the outer window..) + // Either solution currently won't allow us to use a larger border size: the border would clipped. + const ImRect outer_border = table->OuterRect; + const ImU32 outer_col = table->BorderColorStrong; + if ((table->Flags & ImGuiTableFlags_BordersOuter) == ImGuiTableFlags_BordersOuter) + { + inner_drawlist->AddRect(outer_border.Min, outer_border.Max, outer_col, 0.0f, 0, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterV) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Min.x, outer_border.Max.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Max.x, outer_border.Min.y), outer_border.Max, outer_col, border_size); + } + else if (table->Flags & ImGuiTableFlags_BordersOuterH) + { + inner_drawlist->AddLine(outer_border.Min, ImVec2(outer_border.Max.x, outer_border.Min.y), outer_col, border_size); + inner_drawlist->AddLine(ImVec2(outer_border.Min.x, outer_border.Max.y), outer_border.Max, outer_col, border_size); + } + } + if ((table->Flags & ImGuiTableFlags_BordersInnerH) && table->RowPosY2 < table->OuterRect.Max.y) + { + // Draw bottom-most row border + const float border_y = table->RowPosY2; + if (border_y >= table->BgClipRect.Min.y && border_y < table->BgClipRect.Max.y) + inner_drawlist->AddLine(ImVec2(table->BorderX1, border_y), ImVec2(table->BorderX2, border_y), table->BorderColorLight, border_size); + } + + inner_drawlist->PopClipRect(); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Sorting +//------------------------------------------------------------------------- +// - TableGetSortSpecs() +// - TableFixColumnSortDirection() [Internal] +// - TableGetColumnNextSortDirection() [Internal] +// - TableSetColumnSortDirection() [Internal] +// - TableSortSpecsSanitize() [Internal] +// - TableSortSpecsBuild() [Internal] +//------------------------------------------------------------------------- + +// Return NULL if no sort specs (most often when ImGuiTableFlags_Sortable is not set) +// You can sort your data again when 'SpecsChanged == true'. It will be true with sorting specs have changed since +// last call, or the first time. +// Lifetime: don't hold on this pointer over multiple frames or past any subsequent call to BeginTable()! +ImGuiTableSortSpecs* ImGui::TableGetSortSpecs() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL); + + if (!(table->Flags & ImGuiTableFlags_Sortable)) + return NULL; + + // Require layout (in case TableHeadersRow() hasn't been called) as it may alter IsSortSpecsDirty in some paths. + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + TableSortSpecsBuild(table); + + return &table->SortSpecs; +} + +static inline ImGuiSortDirection TableGetColumnAvailSortDirection(ImGuiTableColumn* column, int n) +{ + IM_ASSERT(n < column->SortDirectionsAvailCount); + return (column->SortDirectionsAvailList >> (n << 1)) & 0x03; +} + +// Fix sort direction if currently set on a value which is unavailable (e.g. activating NoSortAscending/NoSortDescending) +void ImGui::TableFixColumnSortDirection(ImGuiTable* table, ImGuiTableColumn* column) +{ + if (column->SortOrder == -1 || (column->SortDirectionsAvailMask & (1 << column->SortDirection)) != 0) + return; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + table->IsSortSpecsDirty = true; +} + +// Calculate next sort direction that would be set after clicking the column +// - If the PreferSortDescending flag is set, we will default to a Descending direction on the first click. +// - Note that the PreferSortAscending flag is never checked, it is essentially the default and therefore a no-op. +IM_STATIC_ASSERT(ImGuiSortDirection_None == 0 && ImGuiSortDirection_Ascending == 1 && ImGuiSortDirection_Descending == 2); +ImGuiSortDirection ImGui::TableGetColumnNextSortDirection(ImGuiTableColumn* column) +{ + IM_ASSERT(column->SortDirectionsAvailCount > 0); + if (column->SortOrder == -1) + return TableGetColumnAvailSortDirection(column, 0); + for (int n = 0; n < 3; n++) + if (column->SortDirection == TableGetColumnAvailSortDirection(column, n)) + return TableGetColumnAvailSortDirection(column, (n + 1) % column->SortDirectionsAvailCount); + IM_ASSERT(0); + return ImGuiSortDirection_None; +} + +// Note that the NoSortAscending/NoSortDescending flags are processed in TableSortSpecsSanitize(), and they may change/revert +// the value of SortDirection. We could technically also do it here but it would be unnecessary and duplicate code. +void ImGui::TableSetColumnSortDirection(int column_n, ImGuiSortDirection sort_direction, bool append_to_sort_specs) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + + if (!(table->Flags & ImGuiTableFlags_SortMulti)) + append_to_sort_specs = false; + if (!(table->Flags & ImGuiTableFlags_SortTristate)) + IM_ASSERT(sort_direction != ImGuiSortDirection_None); + + ImGuiTableColumnIdx sort_order_max = 0; + if (append_to_sort_specs) + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + sort_order_max = ImMax(sort_order_max, table->Columns[other_column_n].SortOrder); + + ImGuiTableColumn* column = &table->Columns[column_n]; + column->SortDirection = (ImU8)sort_direction; + if (column->SortDirection == ImGuiSortDirection_None) + column->SortOrder = -1; + else if (column->SortOrder == -1 || !append_to_sort_specs) + column->SortOrder = append_to_sort_specs ? sort_order_max + 1 : 0; + + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + if (other_column != column && !append_to_sort_specs) + other_column->SortOrder = -1; + TableFixColumnSortDirection(table, other_column); + } + table->IsSettingsDirty = true; + table->IsSortSpecsDirty = true; +} + +void ImGui::TableSortSpecsSanitize(ImGuiTable* table) +{ + IM_ASSERT(table->Flags & ImGuiTableFlags_Sortable); + + // Clear SortOrder from hidden column and verify that there's no gap or duplicate. + int sort_order_count = 0; + ImU64 sort_order_mask = 0x00; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder != -1 && !column->IsEnabled) + column->SortOrder = -1; + if (column->SortOrder == -1) + continue; + sort_order_count++; + sort_order_mask |= ((ImU64)1 << column->SortOrder); + IM_ASSERT(sort_order_count < (int)sizeof(sort_order_mask) * 8); + } + + const bool need_fix_linearize = ((ImU64)1 << sort_order_count) != (sort_order_mask + 1); + const bool need_fix_single_sort_order = (sort_order_count > 1) && !(table->Flags & ImGuiTableFlags_SortMulti); + if (need_fix_linearize || need_fix_single_sort_order) + { + ImU64 fixed_mask = 0x00; + for (int sort_n = 0; sort_n < sort_order_count; sort_n++) + { + // Fix: Rewrite sort order fields if needed so they have no gap or duplicate. + // (e.g. SortOrder 0 disappeared, SortOrder 1..2 exists --> rewrite then as SortOrder 0..1) + int column_with_smallest_sort_order = -1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if ((fixed_mask & ((ImU64)1 << (ImU64)column_n)) == 0 && table->Columns[column_n].SortOrder != -1) + if (column_with_smallest_sort_order == -1 || table->Columns[column_n].SortOrder < table->Columns[column_with_smallest_sort_order].SortOrder) + column_with_smallest_sort_order = column_n; + IM_ASSERT(column_with_smallest_sort_order != -1); + fixed_mask |= ((ImU64)1 << column_with_smallest_sort_order); + table->Columns[column_with_smallest_sort_order].SortOrder = (ImGuiTableColumnIdx)sort_n; + + // Fix: Make sure only one column has a SortOrder if ImGuiTableFlags_MultiSortable is not set. + if (need_fix_single_sort_order) + { + sort_order_count = 1; + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + if (column_n != column_with_smallest_sort_order) + table->Columns[column_n].SortOrder = -1; + break; + } + } + } + + // Fallback default sort order (if no column had the ImGuiTableColumnFlags_DefaultSort flag) + if (sort_order_count == 0 && !(table->Flags & ImGuiTableFlags_SortTristate)) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->IsEnabled && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + sort_order_count = 1; + column->SortOrder = 0; + column->SortDirection = (ImU8)TableGetColumnAvailSortDirection(column, 0); + break; + } + } + + table->SortSpecsCount = (ImGuiTableColumnIdx)sort_order_count; +} + +void ImGui::TableSortSpecsBuild(ImGuiTable* table) +{ + bool dirty = table->IsSortSpecsDirty; + if (dirty) + { + TableSortSpecsSanitize(table); + table->SortSpecsMulti.resize(table->SortSpecsCount <= 1 ? 0 : table->SortSpecsCount); + table->SortSpecs.SpecsDirty = true; // Mark as dirty for user + table->IsSortSpecsDirty = false; // Mark as not dirty for us + } + + // Write output + ImGuiTableColumnSortSpecs* sort_specs = (table->SortSpecsCount == 0) ? NULL : (table->SortSpecsCount == 1) ? &table->SortSpecsSingle : table->SortSpecsMulti.Data; + if (dirty && sort_specs != NULL) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + { + ImGuiTableColumn* column = &table->Columns[column_n]; + if (column->SortOrder == -1) + continue; + IM_ASSERT(column->SortOrder < table->SortSpecsCount); + ImGuiTableColumnSortSpecs* sort_spec = &sort_specs[column->SortOrder]; + sort_spec->ColumnUserID = column->UserID; + sort_spec->ColumnIndex = (ImGuiTableColumnIdx)column_n; + sort_spec->SortOrder = (ImGuiTableColumnIdx)column->SortOrder; + sort_spec->SortDirection = column->SortDirection; + } + + table->SortSpecs.Specs = sort_specs; + table->SortSpecs.SpecsCount = table->SortSpecsCount; +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Headers +//------------------------------------------------------------------------- +// - TableGetHeaderRowHeight() [Internal] +// - TableHeadersRow() +// - TableHeader() +//------------------------------------------------------------------------- + +float ImGui::TableGetHeaderRowHeight() +{ + // Caring for a minor edge case: + // Calculate row height, for the unlikely case that some labels may be taller than others. + // If we didn't do that, uneven header height would highlight but smaller one before the tallest wouldn't catch input for all height. + // In your custom header row you may omit this all together and just call TableNextRow() without a height... + float row_height = GetTextLineHeight(); + int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + { + ImGuiTableColumnFlags flags = TableGetColumnFlags(column_n); + if ((flags & ImGuiTableColumnFlags_IsEnabled) && !(flags & ImGuiTableColumnFlags_NoHeaderLabel)) + row_height = ImMax(row_height, CalcTextSize(TableGetColumnName(column_n)).y); + } + row_height += GetStyle().CellPadding.y * 2.0f; + return row_height; +} + +// [Public] This is a helper to output TableHeader() calls based on the column names declared in TableSetupColumn(). +// The intent is that advanced users willing to create customized headers would not need to use this helper +// and can create their own! For example: TableHeader() may be preceeded by Checkbox() or other custom widgets. +// See 'Demo->Tables->Custom headers' for a demonstration of implementing a custom version of this. +// This code is constructed to not make much use of internal functions, as it is intended to be a template to copy. +// FIXME-TABLE: TableOpenContextMenu() and TableGetHeaderRowHeight() are not public. +void ImGui::TableHeadersRow() +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeadersRow() after BeginTable()!"); + + // Layout if not already done (this is automatically done by TableNextRow, we do it here solely to facilitate stepping in debugger as it is frequent to step in TableUpdateLayout) + if (!table->IsLayoutLocked) + TableUpdateLayout(table); + + // Open row + const float row_y1 = GetCursorScreenPos().y; + const float row_height = TableGetHeaderRowHeight(); + TableNextRow(ImGuiTableRowFlags_Headers, row_height); + if (table->HostSkipItems) // Merely an optimization, you may skip in your own code. + return; + + const int columns_count = TableGetColumnCount(); + for (int column_n = 0; column_n < columns_count; column_n++) + { + if (!TableSetColumnIndex(column_n)) + continue; + + // Push an id to allow unnamed labels (generally accidental, but let's behave nicely with them) + // In your own code you may omit the PushID/PopID all-together, provided you know they won't collide. + const char* name = (TableGetColumnFlags(column_n) & ImGuiTableColumnFlags_NoHeaderLabel) ? "" : TableGetColumnName(column_n); + PushID(column_n); + TableHeader(name); + PopID(); + } + + // Allow opening popup from the right-most section after the last column. + ImVec2 mouse_pos = ImGui::GetMousePos(); + if (IsMouseReleased(1) && TableGetHoveredColumn() == columns_count) + if (mouse_pos.y >= row_y1 && mouse_pos.y < row_y1 + row_height) + TableOpenContextMenu(-1); // Will open a non-column-specific popup. +} + +// Emit a column header (text + optional sort order) +// We cpu-clip text here so that all columns headers can be merged into a same draw call. +// Note that because of how we cpu-clip and display sorting indicators, you _cannot_ use SameLine() after a TableHeader() +void ImGui::TableHeader(const char* label) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTable* table = g.CurrentTable; + IM_ASSERT(table != NULL && "Need to call TableHeader() after BeginTable()!"); + IM_ASSERT(table->CurrentColumn != -1); + const int column_n = table->CurrentColumn; + ImGuiTableColumn* column = &table->Columns[column_n]; + + // Label + if (label == NULL) + label = ""; + const char* label_end = FindRenderedTextEnd(label); + ImVec2 label_size = CalcTextSize(label, label_end, true); + ImVec2 label_pos = window->DC.CursorPos; + + // If we already got a row height, there's use that. + // FIXME-TABLE: Padding problem if the correct outer-padding CellBgRect strays off our ClipRect? + ImRect cell_r = TableGetCellBgRect(table, column_n); + float label_height = ImMax(label_size.y, table->RowMinHeight - table->CellPaddingY * 2.0f); + + // Calculate ideal size for sort order arrow + float w_arrow = 0.0f; + float w_sort_text = 0.0f; + char sort_order_suf[4] = ""; + const float ARROW_SCALE = 0.65f; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + w_arrow = ImFloor(g.FontSize * ARROW_SCALE + g.Style.FramePadding.x); + if (column->SortOrder > 0) + { + ImFormatString(sort_order_suf, IM_ARRAYSIZE(sort_order_suf), "%d", column->SortOrder + 1); + w_sort_text = g.Style.ItemInnerSpacing.x + CalcTextSize(sort_order_suf).x; + } + } + + // We feed our unclipped width to the column without writing on CursorMaxPos, so that column is still considering for merging. + float max_pos_x = label_pos.x + label_size.x + w_sort_text + w_arrow; + column->ContentMaxXHeadersUsed = ImMax(column->ContentMaxXHeadersUsed, column->WorkMaxX); + column->ContentMaxXHeadersIdeal = ImMax(column->ContentMaxXHeadersIdeal, max_pos_x); + + // Keep header highlighted when context menu is open. + const bool selected = (table->IsContextPopupOpen && table->ContextPopupColumn == column_n && table->InstanceInteracted == table->InstanceCurrent); + ImGuiID id = window->GetID(label); + ImRect bb(cell_r.Min.x, cell_r.Min.y, cell_r.Max.x, ImMax(cell_r.Max.y, cell_r.Min.y + label_height + g.Style.CellPadding.y * 2.0f)); + ItemSize(ImVec2(0.0f, label_height)); // Don't declare unclipped width, it'll be fed ContentMaxPosHeadersIdeal + if (!ItemAdd(bb, id)) + return; + + //GetForegroundDrawList()->AddRect(cell_r.Min, cell_r.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + //GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 0, 0, 255)); // [DEBUG] + + // Using AllowItemOverlap mode because we cover the whole cell, and we want user to be able to submit subsequent items. + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_AllowItemOverlap); + if (g.ActiveId != id) + SetItemAllowOverlap(); + if (held || hovered || selected) + { + const ImU32 col = GetColorU32(held ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + //RenderFrame(bb.Min, bb.Max, col, false, 0.0f); + TableSetBgColor(ImGuiTableBgTarget_CellBg, col, table->CurrentColumn); + } + else + { + // Submit single cell bg color in the case we didn't submit a full header row + if ((table->RowFlags & ImGuiTableRowFlags_Headers) == 0) + TableSetBgColor(ImGuiTableBgTarget_CellBg, GetColorU32(ImGuiCol_TableHeaderBg), table->CurrentColumn); + } + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + if (held) + table->HeldHeaderColumn = (ImGuiTableColumnIdx)column_n; + window->DC.CursorPos.y -= g.Style.ItemSpacing.y * 0.5f; + + // Drag and drop to re-order columns. + // FIXME-TABLE: Scroll request while reordering a column and it lands out of the scrolling zone. + if (held && (table->Flags & ImGuiTableFlags_Reorderable) && IsMouseDragging(0) && !g.DragDropActive) + { + // While moving a column it will jump on the other side of the mouse, so we also test for MouseDelta.x + table->ReorderColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + + // We don't reorder: through the frozen<>unfrozen line, or through a column that is marked with ImGuiTableColumnFlags_NoReorder. + if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < cell_r.Min.x) + if (ImGuiTableColumn* prev_column = (column->PrevEnabledColumn != -1) ? &table->Columns[column->PrevEnabledColumn] : NULL) + if (!((column->Flags | prev_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (prev_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = -1; + if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > cell_r.Max.x) + if (ImGuiTableColumn* next_column = (column->NextEnabledColumn != -1) ? &table->Columns[column->NextEnabledColumn] : NULL) + if (!((column->Flags | next_column->Flags) & ImGuiTableColumnFlags_NoReorder)) + if ((column->IndexWithinEnabledSet < table->FreezeColumnsRequest) == (next_column->IndexWithinEnabledSet < table->FreezeColumnsRequest)) + table->ReorderColumnDir = +1; + } + + // Sort order arrow + const float ellipsis_max = cell_r.Max.x - w_arrow - w_sort_text; + if ((table->Flags & ImGuiTableFlags_Sortable) && !(column->Flags & ImGuiTableColumnFlags_NoSort)) + { + if (column->SortOrder != -1) + { + float x = ImMax(cell_r.Min.x, cell_r.Max.x - w_arrow - w_sort_text); + float y = label_pos.y; + if (column->SortOrder > 0) + { + PushStyleColor(ImGuiCol_Text, GetColorU32(ImGuiCol_Text, 0.70f)); + RenderText(ImVec2(x + g.Style.ItemInnerSpacing.x, y), sort_order_suf); + PopStyleColor(); + x += w_sort_text; + } + RenderArrow(window->DrawList, ImVec2(x, y), GetColorU32(ImGuiCol_Text), column->SortDirection == ImGuiSortDirection_Ascending ? ImGuiDir_Up : ImGuiDir_Down, ARROW_SCALE); + } + + // Handle clicking on column header to adjust Sort Order + if (pressed && table->ReorderColumn != column_n) + { + ImGuiSortDirection sort_direction = TableGetColumnNextSortDirection(column); + TableSetColumnSortDirection(column_n, sort_direction, g.IO.KeyShift); + } + } + + // Render clipped label. Clipping here ensure that in the majority of situations, all our header cells will + // be merged into a single draw call. + //window->DrawList->AddCircleFilled(ImVec2(ellipsis_max, label_pos.y), 40, IM_COL32_WHITE); + RenderTextEllipsis(window->DrawList, label_pos, ImVec2(ellipsis_max, label_pos.y + label_height + g.Style.FramePadding.y), ellipsis_max, ellipsis_max, label, label_end, &label_size); + + const bool text_clipped = label_size.x > (ellipsis_max - label_pos.x); + if (text_clipped && hovered && g.ActiveId == 0 && IsItemHovered(ImGuiHoveredFlags_DelayNormal)) + SetTooltip("%.*s", (int)(label_end - label), label); + + // We don't use BeginPopupContextItem() because we want the popup to stay up even after the column is hidden + if (IsMouseReleased(1) && IsItemHovered()) + TableOpenContextMenu(column_n); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Context Menu +//------------------------------------------------------------------------- +// - TableOpenContextMenu() [Internal] +// - TableDrawContextMenu() [Internal] +//------------------------------------------------------------------------- + +// Use -1 to open menu not specific to a given column. +void ImGui::TableOpenContextMenu(int column_n) +{ + ImGuiContext& g = *GImGui; + ImGuiTable* table = g.CurrentTable; + if (column_n == -1 && table->CurrentColumn != -1) // When called within a column automatically use this one (for consistency) + column_n = table->CurrentColumn; + if (column_n == table->ColumnsCount) // To facilitate using with TableGetHoveredColumn() + column_n = -1; + IM_ASSERT(column_n >= -1 && column_n < table->ColumnsCount); + if (table->Flags & (ImGuiTableFlags_Resizable | ImGuiTableFlags_Reorderable | ImGuiTableFlags_Hideable)) + { + table->IsContextPopupOpen = true; + table->ContextPopupColumn = (ImGuiTableColumnIdx)column_n; + table->InstanceInteracted = table->InstanceCurrent; + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + OpenPopupEx(context_menu_id, ImGuiPopupFlags_None); + } +} + +bool ImGui::TableBeginContextMenuPopup(ImGuiTable* table) +{ + if (!table->IsContextPopupOpen || table->InstanceCurrent != table->InstanceInteracted) + return false; + const ImGuiID context_menu_id = ImHashStr("##ContextMenu", 0, table->ID); + if (BeginPopupEx(context_menu_id, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings)) + return true; + table->IsContextPopupOpen = false; + return false; +} + +// Output context menu into current window (generally a popup) +// FIXME-TABLE: Ideally this should be writable by the user. Full programmatic access to that data? +void ImGui::TableDrawContextMenu(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + bool want_separator = false; + const int column_n = (table->ContextPopupColumn >= 0 && table->ContextPopupColumn < table->ColumnsCount) ? table->ContextPopupColumn : -1; + ImGuiTableColumn* column = (column_n != -1) ? &table->Columns[column_n] : NULL; + + // Sizing + if (table->Flags & ImGuiTableFlags_Resizable) + { + if (column != NULL) + { + const bool can_resize = !(column->Flags & ImGuiTableColumnFlags_NoResize) && column->IsEnabled; + if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableSizeOne), NULL, false, can_resize)) // "###SizeOne" + TableSetColumnWidthAutoSingle(table, column_n); + } + + const char* size_all_desc; + if (table->ColumnsEnabledFixedCount == table->ColumnsEnabledCount && (table->Flags & ImGuiTableFlags_SizingMask_) != ImGuiTableFlags_SizingFixedSame) + size_all_desc = LocalizeGetMsg(ImGuiLocKey_TableSizeAllFit); // "###SizeAll" All fixed + else + size_all_desc = LocalizeGetMsg(ImGuiLocKey_TableSizeAllDefault); // "###SizeAll" All stretch or mixed + if (MenuItem(size_all_desc, NULL)) + TableSetColumnWidthAutoAll(table); + want_separator = true; + } + + // Ordering + if (table->Flags & ImGuiTableFlags_Reorderable) + { + if (MenuItem(LocalizeGetMsg(ImGuiLocKey_TableResetOrder), NULL, false, !table->IsDefaultDisplayOrder)) + table->IsResetDisplayOrderRequest = true; + want_separator = true; + } + + // Reset all (should work but seems unnecessary/noisy to expose?) + //if (MenuItem("Reset all")) + // table->IsResetAllRequest = true; + + // Sorting + // (modify TableOpenContextMenu() to add _Sortable flag if enabling this) +#if 0 + if ((table->Flags & ImGuiTableFlags_Sortable) && column != NULL && (column->Flags & ImGuiTableColumnFlags_NoSort) == 0) + { + if (want_separator) + Separator(); + want_separator = true; + + bool append_to_sort_specs = g.IO.KeyShift; + if (MenuItem("Sort in Ascending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Ascending, (column->Flags & ImGuiTableColumnFlags_NoSortAscending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Ascending, append_to_sort_specs); + if (MenuItem("Sort in Descending Order", NULL, column->SortOrder != -1 && column->SortDirection == ImGuiSortDirection_Descending, (column->Flags & ImGuiTableColumnFlags_NoSortDescending) == 0)) + TableSetColumnSortDirection(table, column_n, ImGuiSortDirection_Descending, append_to_sort_specs); + } +#endif + + // Hiding / Visibility + if (table->Flags & ImGuiTableFlags_Hideable) + { + if (want_separator) + Separator(); + want_separator = true; + + PushItemFlag(ImGuiItemFlags_SelectableDontClosePopup, true); + for (int other_column_n = 0; other_column_n < table->ColumnsCount; other_column_n++) + { + ImGuiTableColumn* other_column = &table->Columns[other_column_n]; + if (other_column->Flags & ImGuiTableColumnFlags_Disabled) + continue; + + const char* name = TableGetColumnName(table, other_column_n); + if (name == NULL || name[0] == 0) + name = ""; + + // Make sure we can't hide the last active column + bool menu_item_active = (other_column->Flags & ImGuiTableColumnFlags_NoHide) ? false : true; + if (other_column->IsUserEnabled && table->ColumnsEnabledCount <= 1) + menu_item_active = false; + if (MenuItem(name, NULL, other_column->IsUserEnabled, menu_item_active)) + other_column->IsUserEnabledNextFrame = !other_column->IsUserEnabled; + } + PopItemFlag(); + } +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Settings (.ini data) +//------------------------------------------------------------------------- +// FIXME: The binding/finding/creating flow are too confusing. +//------------------------------------------------------------------------- +// - TableSettingsInit() [Internal] +// - TableSettingsCalcChunkSize() [Internal] +// - TableSettingsCreate() [Internal] +// - TableSettingsFindByID() [Internal] +// - TableGetBoundSettings() [Internal] +// - TableResetSettings() +// - TableSaveSettings() [Internal] +// - TableLoadSettings() [Internal] +// - TableSettingsHandler_ClearAll() [Internal] +// - TableSettingsHandler_ApplyAll() [Internal] +// - TableSettingsHandler_ReadOpen() [Internal] +// - TableSettingsHandler_ReadLine() [Internal] +// - TableSettingsHandler_WriteAll() [Internal] +// - TableSettingsInstallHandler() [Internal] +//------------------------------------------------------------------------- +// [Init] 1: TableSettingsHandler_ReadXXXX() Load and parse .ini file into TableSettings. +// [Main] 2: TableLoadSettings() When table is created, bind Table to TableSettings, serialize TableSettings data into Table. +// [Main] 3: TableSaveSettings() When table properties are modified, serialize Table data into bound or new TableSettings, mark .ini as dirty. +// [Main] 4: TableSettingsHandler_WriteAll() When .ini file is dirty (which can come from other source), save TableSettings into .ini file. +//------------------------------------------------------------------------- + +// Clear and initialize empty settings instance +static void TableSettingsInit(ImGuiTableSettings* settings, ImGuiID id, int columns_count, int columns_count_max) +{ + IM_PLACEMENT_NEW(settings) ImGuiTableSettings(); + ImGuiTableColumnSettings* settings_column = settings->GetColumnSettings(); + for (int n = 0; n < columns_count_max; n++, settings_column++) + IM_PLACEMENT_NEW(settings_column) ImGuiTableColumnSettings(); + settings->ID = id; + settings->ColumnsCount = (ImGuiTableColumnIdx)columns_count; + settings->ColumnsCountMax = (ImGuiTableColumnIdx)columns_count_max; + settings->WantApply = true; +} + +static size_t TableSettingsCalcChunkSize(int columns_count) +{ + return sizeof(ImGuiTableSettings) + (size_t)columns_count * sizeof(ImGuiTableColumnSettings); +} + +ImGuiTableSettings* ImGui::TableSettingsCreate(ImGuiID id, int columns_count) +{ + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.alloc_chunk(TableSettingsCalcChunkSize(columns_count)); + TableSettingsInit(settings, id, columns_count, columns_count); + return settings; +} + +// Find existing settings +ImGuiTableSettings* ImGui::TableSettingsFindByID(ImGuiID id) +{ + // FIXME-OPT: Might want to store a lookup map for this? + ImGuiContext& g = *GImGui; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID == id) + return settings; + return NULL; +} + +// Get settings for a given table, NULL if none +ImGuiTableSettings* ImGui::TableGetBoundSettings(ImGuiTable* table) +{ + if (table->SettingsOffset != -1) + { + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = g.SettingsTables.ptr_from_offset(table->SettingsOffset); + IM_ASSERT(settings->ID == table->ID); + if (settings->ColumnsCountMax >= table->ColumnsCount) + return settings; // OK + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return NULL; +} + +// Restore initial state of table (with or without saved settings) +void ImGui::TableResetSettings(ImGuiTable* table) +{ + table->IsInitializing = table->IsSettingsDirty = true; + table->IsResetAllRequest = false; + table->IsSettingsRequestLoad = false; // Don't reload from ini + table->SettingsLoadedFlags = ImGuiTableFlags_None; // Mark as nothing loaded so our initialized data becomes authoritative +} + +void ImGui::TableSaveSettings(ImGuiTable* table) +{ + table->IsSettingsDirty = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind or create settings data + ImGuiContext& g = *GImGui; + ImGuiTableSettings* settings = TableGetBoundSettings(table); + if (settings == NULL) + { + settings = TableSettingsCreate(table->ID, table->ColumnsCount); + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + settings->ColumnsCount = (ImGuiTableColumnIdx)table->ColumnsCount; + + // Serialize ImGuiTable/ImGuiTableColumn into ImGuiTableSettings/ImGuiTableColumnSettings + IM_ASSERT(settings->ID == table->ID); + IM_ASSERT(settings->ColumnsCount == table->ColumnsCount && settings->ColumnsCountMax >= settings->ColumnsCount); + ImGuiTableColumn* column = table->Columns.Data; + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + + bool save_ref_scale = false; + settings->SaveFlags = ImGuiTableFlags_None; + for (int n = 0; n < table->ColumnsCount; n++, column++, column_settings++) + { + const float width_or_weight = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? column->StretchWeight : column->WidthRequest; + column_settings->WidthOrWeight = width_or_weight; + column_settings->Index = (ImGuiTableColumnIdx)n; + column_settings->DisplayOrder = column->DisplayOrder; + column_settings->SortOrder = column->SortOrder; + column_settings->SortDirection = column->SortDirection; + column_settings->IsEnabled = column->IsUserEnabled; + column_settings->IsStretch = (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? 1 : 0; + if ((column->Flags & ImGuiTableColumnFlags_WidthStretch) == 0) + save_ref_scale = true; + + // We skip saving some data in the .ini file when they are unnecessary to restore our state. + // Note that fixed width where initial width was derived from auto-fit will always be saved as InitStretchWeightOrWidth will be 0.0f. + // FIXME-TABLE: We don't have logic to easily compare SortOrder to DefaultSortOrder yet so it's always saved when present. + if (width_or_weight != column->InitStretchWeightOrWidth) + settings->SaveFlags |= ImGuiTableFlags_Resizable; + if (column->DisplayOrder != n) + settings->SaveFlags |= ImGuiTableFlags_Reorderable; + if (column->SortOrder != -1) + settings->SaveFlags |= ImGuiTableFlags_Sortable; + if (column->IsUserEnabled != ((column->Flags & ImGuiTableColumnFlags_DefaultHide) == 0)) + settings->SaveFlags |= ImGuiTableFlags_Hideable; + } + settings->SaveFlags &= table->Flags; + settings->RefScale = save_ref_scale ? table->RefScale : 0.0f; + + MarkIniSettingsDirty(); +} + +void ImGui::TableLoadSettings(ImGuiTable* table) +{ + ImGuiContext& g = *GImGui; + table->IsSettingsRequestLoad = false; + if (table->Flags & ImGuiTableFlags_NoSavedSettings) + return; + + // Bind settings + ImGuiTableSettings* settings; + if (table->SettingsOffset == -1) + { + settings = TableSettingsFindByID(table->ID); + if (settings == NULL) + return; + if (settings->ColumnsCount != table->ColumnsCount) // Allow settings if columns count changed. We could otherwise decide to return... + table->IsSettingsDirty = true; + table->SettingsOffset = g.SettingsTables.offset_from_ptr(settings); + } + else + { + settings = TableGetBoundSettings(table); + } + + table->SettingsLoadedFlags = settings->SaveFlags; + table->RefScale = settings->RefScale; + + // Serialize ImGuiTableSettings/ImGuiTableColumnSettings into ImGuiTable/ImGuiTableColumn + ImGuiTableColumnSettings* column_settings = settings->GetColumnSettings(); + ImU64 display_order_mask = 0; + for (int data_n = 0; data_n < settings->ColumnsCount; data_n++, column_settings++) + { + int column_n = column_settings->Index; + if (column_n < 0 || column_n >= table->ColumnsCount) + continue; + + ImGuiTableColumn* column = &table->Columns[column_n]; + if (settings->SaveFlags & ImGuiTableFlags_Resizable) + { + if (column_settings->IsStretch) + column->StretchWeight = column_settings->WidthOrWeight; + else + column->WidthRequest = column_settings->WidthOrWeight; + column->AutoFitQueue = 0x00; + } + if (settings->SaveFlags & ImGuiTableFlags_Reorderable) + column->DisplayOrder = column_settings->DisplayOrder; + else + column->DisplayOrder = (ImGuiTableColumnIdx)column_n; + display_order_mask |= (ImU64)1 << column->DisplayOrder; + column->IsUserEnabled = column->IsUserEnabledNextFrame = column_settings->IsEnabled; + column->SortOrder = column_settings->SortOrder; + column->SortDirection = column_settings->SortDirection; + } + + // Validate and fix invalid display order data + const ImU64 expected_display_order_mask = (settings->ColumnsCount == 64) ? ~0 : ((ImU64)1 << settings->ColumnsCount) - 1; + if (display_order_mask != expected_display_order_mask) + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->Columns[column_n].DisplayOrder = (ImGuiTableColumnIdx)column_n; + + // Rebuild index + for (int column_n = 0; column_n < table->ColumnsCount; column_n++) + table->DisplayOrderToIndex[table->Columns[column_n].DisplayOrder] = (ImGuiTableColumnIdx)column_n; +} + +static void TableSettingsHandler_ClearAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetMapSize(); i++) + if (ImGuiTable* table = g.Tables.TryGetMapData(i)) + table->SettingsOffset = -1; + g.SettingsTables.clear(); +} + +// Apply to existing windows (if any) +static void TableSettingsHandler_ApplyAll(ImGuiContext* ctx, ImGuiSettingsHandler*) +{ + ImGuiContext& g = *ctx; + for (int i = 0; i != g.Tables.GetMapSize(); i++) + if (ImGuiTable* table = g.Tables.TryGetMapData(i)) + { + table->IsSettingsRequestLoad = true; + table->SettingsOffset = -1; + } +} + +static void* TableSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name) +{ + ImGuiID id = 0; + int columns_count = 0; + if (sscanf(name, "0x%08X,%d", &id, &columns_count) < 2) + return NULL; + + if (ImGuiTableSettings* settings = ImGui::TableSettingsFindByID(id)) + { + if (settings->ColumnsCountMax >= columns_count) + { + TableSettingsInit(settings, id, columns_count, settings->ColumnsCountMax); // Recycle + return settings; + } + settings->ID = 0; // Invalidate storage, we won't fit because of a count change + } + return ImGui::TableSettingsCreate(id, columns_count); +} + +static void TableSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line) +{ + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + ImGuiTableSettings* settings = (ImGuiTableSettings*)entry; + float f = 0.0f; + int column_n = 0, r = 0, n = 0; + + if (sscanf(line, "RefScale=%f", &f) == 1) { settings->RefScale = f; return; } + + if (sscanf(line, "Column %d%n", &column_n, &r) == 1) + { + if (column_n < 0 || column_n >= settings->ColumnsCount) + return; + line = ImStrSkipBlank(line + r); + char c = 0; + ImGuiTableColumnSettings* column = settings->GetColumnSettings() + column_n; + column->Index = (ImGuiTableColumnIdx)column_n; + if (sscanf(line, "UserID=0x%08X%n", (ImU32*)&n, &r)==1) { line = ImStrSkipBlank(line + r); column->UserID = (ImGuiID)n; } + if (sscanf(line, "Width=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = (float)n; column->IsStretch = 0; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Weight=%f%n", &f, &r) == 1) { line = ImStrSkipBlank(line + r); column->WidthOrWeight = f; column->IsStretch = 1; settings->SaveFlags |= ImGuiTableFlags_Resizable; } + if (sscanf(line, "Visible=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->IsEnabled = (ImU8)n; settings->SaveFlags |= ImGuiTableFlags_Hideable; } + if (sscanf(line, "Order=%d%n", &n, &r) == 1) { line = ImStrSkipBlank(line + r); column->DisplayOrder = (ImGuiTableColumnIdx)n; settings->SaveFlags |= ImGuiTableFlags_Reorderable; } + if (sscanf(line, "Sort=%d%c%n", &n, &c, &r) == 2) { line = ImStrSkipBlank(line + r); column->SortOrder = (ImGuiTableColumnIdx)n; column->SortDirection = (c == '^') ? ImGuiSortDirection_Descending : ImGuiSortDirection_Ascending; settings->SaveFlags |= ImGuiTableFlags_Sortable; } + } +} + +static void TableSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf) +{ + ImGuiContext& g = *ctx; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + { + if (settings->ID == 0) // Skip ditched settings + continue; + + // TableSaveSettings() may clear some of those flags when we establish that the data can be stripped + // (e.g. Order was unchanged) + const bool save_size = (settings->SaveFlags & ImGuiTableFlags_Resizable) != 0; + const bool save_visible = (settings->SaveFlags & ImGuiTableFlags_Hideable) != 0; + const bool save_order = (settings->SaveFlags & ImGuiTableFlags_Reorderable) != 0; + const bool save_sort = (settings->SaveFlags & ImGuiTableFlags_Sortable) != 0; + if (!save_size && !save_visible && !save_order && !save_sort) + continue; + + buf->reserve(buf->size() + 30 + settings->ColumnsCount * 50); // ballpark reserve + buf->appendf("[%s][0x%08X,%d]\n", handler->TypeName, settings->ID, settings->ColumnsCount); + if (settings->RefScale != 0.0f) + buf->appendf("RefScale=%g\n", settings->RefScale); + ImGuiTableColumnSettings* column = settings->GetColumnSettings(); + for (int column_n = 0; column_n < settings->ColumnsCount; column_n++, column++) + { + // "Column 0 UserID=0x42AD2D21 Width=100 Visible=1 Order=0 Sort=0v" + bool save_column = column->UserID != 0 || save_size || save_visible || save_order || (save_sort && column->SortOrder != -1); + if (!save_column) + continue; + buf->appendf("Column %-2d", column_n); + if (column->UserID != 0) buf->appendf(" UserID=%08X", column->UserID); + if (save_size && column->IsStretch) buf->appendf(" Weight=%.4f", column->WidthOrWeight); + if (save_size && !column->IsStretch) buf->appendf(" Width=%d", (int)column->WidthOrWeight); + if (save_visible) buf->appendf(" Visible=%d", column->IsEnabled); + if (save_order) buf->appendf(" Order=%d", column->DisplayOrder); + if (save_sort && column->SortOrder != -1) buf->appendf(" Sort=%d%c", column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? 'v' : '^'); + buf->append("\n"); + } + buf->append("\n"); + } +} + +void ImGui::TableSettingsAddSettingsHandler() +{ + ImGuiSettingsHandler ini_handler; + ini_handler.TypeName = "Table"; + ini_handler.TypeHash = ImHashStr("Table"); + ini_handler.ClearAllFn = TableSettingsHandler_ClearAll; + ini_handler.ReadOpenFn = TableSettingsHandler_ReadOpen; + ini_handler.ReadLineFn = TableSettingsHandler_ReadLine; + ini_handler.ApplyAllFn = TableSettingsHandler_ApplyAll; + ini_handler.WriteAllFn = TableSettingsHandler_WriteAll; + AddSettingsHandler(&ini_handler); +} + +//------------------------------------------------------------------------- +// [SECTION] Tables: Garbage Collection +//------------------------------------------------------------------------- +// - TableRemove() [Internal] +// - TableGcCompactTransientBuffers() [Internal] +// - TableGcCompactSettings() [Internal] +//------------------------------------------------------------------------- + +// Remove Table (currently only used by TestEngine) +void ImGui::TableRemove(ImGuiTable* table) +{ + //IMGUI_DEBUG_PRINT("TableRemove() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + int table_idx = g.Tables.GetIndex(table); + //memset(table->RawData.Data, 0, table->RawData.size_in_bytes()); + //memset(table, 0, sizeof(ImGuiTable)); + g.Tables.Remove(table->ID, table); + g.TablesLastTimeActive[table_idx] = -1.0f; +} + +// Free up/compact internal Table buffers for when it gets unused +void ImGui::TableGcCompactTransientBuffers(ImGuiTable* table) +{ + //IMGUI_DEBUG_PRINT("TableGcCompactTransientBuffers() id=0x%08X\n", table->ID); + ImGuiContext& g = *GImGui; + IM_ASSERT(table->MemoryCompacted == false); + table->SortSpecs.Specs = NULL; + table->SortSpecsMulti.clear(); + table->IsSortSpecsDirty = true; // FIXME: shouldn't have to leak into user performing a sort + table->ColumnsNames.clear(); + table->MemoryCompacted = true; + for (int n = 0; n < table->ColumnsCount; n++) + table->Columns[n].NameOffset = -1; + g.TablesLastTimeActive[g.Tables.GetIndex(table)] = -1.0f; +} + +void ImGui::TableGcCompactTransientBuffers(ImGuiTableTempData* temp_data) +{ + temp_data->DrawSplitter.ClearFreeMemory(); + temp_data->LastTimeActive = -1.0f; +} + +// Compact and remove unused settings data (currently only used by TestEngine) +void ImGui::TableGcCompactSettings() +{ + ImGuiContext& g = *GImGui; + int required_memory = 0; + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + required_memory += (int)TableSettingsCalcChunkSize(settings->ColumnsCount); + if (required_memory == g.SettingsTables.Buf.Size) + return; + ImChunkStream new_chunk_stream; + new_chunk_stream.Buf.reserve(required_memory); + for (ImGuiTableSettings* settings = g.SettingsTables.begin(); settings != NULL; settings = g.SettingsTables.next_chunk(settings)) + if (settings->ID != 0) + memcpy(new_chunk_stream.alloc_chunk(TableSettingsCalcChunkSize(settings->ColumnsCount)), settings, TableSettingsCalcChunkSize(settings->ColumnsCount)); + g.SettingsTables.swap(new_chunk_stream); +} + + +//------------------------------------------------------------------------- +// [SECTION] Tables: Debugging +//------------------------------------------------------------------------- +// - DebugNodeTable() [Internal] +//------------------------------------------------------------------------- + +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + +static const char* DebugNodeTableGetSizingPolicyDesc(ImGuiTableFlags sizing_policy) +{ + sizing_policy &= ImGuiTableFlags_SizingMask_; + if (sizing_policy == ImGuiTableFlags_SizingFixedFit) { return "FixedFit"; } + if (sizing_policy == ImGuiTableFlags_SizingFixedSame) { return "FixedSame"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchProp) { return "StretchProp"; } + if (sizing_policy == ImGuiTableFlags_SizingStretchSame) { return "StretchSame"; } + return "N/A"; +} + +void ImGui::DebugNodeTable(ImGuiTable* table) +{ + char buf[512]; + char* p = buf; + const char* buf_end = buf + IM_ARRAYSIZE(buf); + const bool is_active = (table->LastFrameActive >= ImGui::GetFrameCount() - 2); // Note that fully clipped early out scrolling tables will appear as inactive here. + ImFormatString(p, buf_end - p, "Table 0x%08X (%d columns, in '%s')%s", table->ID, table->ColumnsCount, table->OuterWindow->Name, is_active ? "" : " *Inactive*"); + if (!is_active) { PushStyleColor(ImGuiCol_Text, GetStyleColorVec4(ImGuiCol_TextDisabled)); } + bool open = TreeNode(table, "%s", buf); + if (!is_active) { PopStyleColor(); } + if (IsItemHovered()) + GetForegroundDrawList()->AddRect(table->OuterRect.Min, table->OuterRect.Max, IM_COL32(255, 255, 0, 255)); + if (IsItemVisible() && table->HoveredColumnBody != -1) + GetForegroundDrawList()->AddRect(GetItemRectMin(), GetItemRectMax(), IM_COL32(255, 255, 0, 255)); + if (!open) + return; + if (table->InstanceCurrent > 0) + ImGui::Text("** %d instances of same table! Some data below will refer to last instance.", table->InstanceCurrent + 1); + bool clear_settings = SmallButton("Clear settings"); + BulletText("OuterRect: Pos: (%.1f,%.1f) Size: (%.1f,%.1f) Sizing: '%s'", table->OuterRect.Min.x, table->OuterRect.Min.y, table->OuterRect.GetWidth(), table->OuterRect.GetHeight(), DebugNodeTableGetSizingPolicyDesc(table->Flags)); + BulletText("ColumnsGivenWidth: %.1f, ColumnsAutoFitWidth: %.1f, InnerWidth: %.1f%s", table->ColumnsGivenWidth, table->ColumnsAutoFitWidth, table->InnerWidth, table->InnerWidth == 0.0f ? " (auto)" : ""); + BulletText("CellPaddingX: %.1f, CellSpacingX: %.1f/%.1f, OuterPaddingX: %.1f", table->CellPaddingX, table->CellSpacingX1, table->CellSpacingX2, table->OuterPaddingX); + BulletText("HoveredColumnBody: %d, HoveredColumnBorder: %d", table->HoveredColumnBody, table->HoveredColumnBorder); + BulletText("ResizedColumn: %d, ReorderColumn: %d, HeldHeaderColumn: %d", table->ResizedColumn, table->ReorderColumn, table->HeldHeaderColumn); + //BulletText("BgDrawChannels: %d/%d", 0, table->BgDrawChannelUnfrozen); + float sum_weights = 0.0f; + for (int n = 0; n < table->ColumnsCount; n++) + if (table->Columns[n].Flags & ImGuiTableColumnFlags_WidthStretch) + sum_weights += table->Columns[n].StretchWeight; + for (int n = 0; n < table->ColumnsCount; n++) + { + ImGuiTableColumn* column = &table->Columns[n]; + const char* name = TableGetColumnName(table, n); + ImFormatString(buf, IM_ARRAYSIZE(buf), + "Column %d order %d '%s': offset %+.2f to %+.2f%s\n" + "Enabled: %d, VisibleX/Y: %d/%d, RequestOutput: %d, SkipItems: %d, DrawChannels: %d,%d\n" + "WidthGiven: %.1f, Request/Auto: %.1f/%.1f, StretchWeight: %.3f (%.1f%%)\n" + "MinX: %.1f, MaxX: %.1f (%+.1f), ClipRect: %.1f to %.1f (+%.1f)\n" + "ContentWidth: %.1f,%.1f, HeadersUsed/Ideal %.1f/%.1f\n" + "Sort: %d%s, UserID: 0x%08X, Flags: 0x%04X: %s%s%s..", + n, column->DisplayOrder, name, column->MinX - table->WorkRect.Min.x, column->MaxX - table->WorkRect.Min.x, (n < table->FreezeColumnsRequest) ? " (Frozen)" : "", + column->IsEnabled, column->IsVisibleX, column->IsVisibleY, column->IsRequestOutput, column->IsSkipItems, column->DrawChannelFrozen, column->DrawChannelUnfrozen, + column->WidthGiven, column->WidthRequest, column->WidthAuto, column->StretchWeight, column->StretchWeight > 0.0f ? (column->StretchWeight / sum_weights) * 100.0f : 0.0f, + column->MinX, column->MaxX, column->MaxX - column->MinX, column->ClipRect.Min.x, column->ClipRect.Max.x, column->ClipRect.Max.x - column->ClipRect.Min.x, + column->ContentMaxXFrozen - column->WorkMinX, column->ContentMaxXUnfrozen - column->WorkMinX, column->ContentMaxXHeadersUsed - column->WorkMinX, column->ContentMaxXHeadersIdeal - column->WorkMinX, + column->SortOrder, (column->SortDirection == ImGuiSortDirection_Ascending) ? " (Asc)" : (column->SortDirection == ImGuiSortDirection_Descending) ? " (Des)" : "", column->UserID, column->Flags, + (column->Flags & ImGuiTableColumnFlags_WidthStretch) ? "WidthStretch " : "", + (column->Flags & ImGuiTableColumnFlags_WidthFixed) ? "WidthFixed " : "", + (column->Flags & ImGuiTableColumnFlags_NoResize) ? "NoResize " : ""); + Bullet(); + Selectable(buf); + if (IsItemHovered()) + { + ImRect r(column->MinX, table->OuterRect.Min.y, column->MaxX, table->OuterRect.Max.y); + GetForegroundDrawList()->AddRect(r.Min, r.Max, IM_COL32(255, 255, 0, 255)); + } + } + if (ImGuiTableSettings* settings = TableGetBoundSettings(table)) + DebugNodeTableSettings(settings); + if (clear_settings) + table->IsResetAllRequest = true; + TreePop(); +} + +void ImGui::DebugNodeTableSettings(ImGuiTableSettings* settings) +{ + if (!TreeNode((void*)(intptr_t)settings->ID, "Settings 0x%08X (%d columns)", settings->ID, settings->ColumnsCount)) + return; + BulletText("SaveFlags: 0x%08X", settings->SaveFlags); + BulletText("ColumnsCount: %d (max %d)", settings->ColumnsCount, settings->ColumnsCountMax); + for (int n = 0; n < settings->ColumnsCount; n++) + { + ImGuiTableColumnSettings* column_settings = &settings->GetColumnSettings()[n]; + ImGuiSortDirection sort_dir = (column_settings->SortOrder != -1) ? (ImGuiSortDirection)column_settings->SortDirection : ImGuiSortDirection_None; + BulletText("Column %d Order %d SortOrder %d %s Vis %d %s %7.3f UserID 0x%08X", + n, column_settings->DisplayOrder, column_settings->SortOrder, + (sort_dir == ImGuiSortDirection_Ascending) ? "Asc" : (sort_dir == ImGuiSortDirection_Descending) ? "Des" : "---", + column_settings->IsEnabled, column_settings->IsStretch ? "Weight" : "Width ", column_settings->WidthOrWeight, column_settings->UserID); + } + TreePop(); +} + +#else // #ifndef IMGUI_DISABLE_DEBUG_TOOLS + +void ImGui::DebugNodeTable(ImGuiTable*) {} +void ImGui::DebugNodeTableSettings(ImGuiTableSettings*) {} + +#endif + + +//------------------------------------------------------------------------- +// [SECTION] Columns, BeginColumns, EndColumns, etc. +// (This is a legacy API, prefer using BeginTable/EndTable!) +//------------------------------------------------------------------------- +// FIXME: sizing is lossy when columns width is very small (default width may turn negative etc.) +//------------------------------------------------------------------------- +// - SetWindowClipRectBeforeSetChannel() [Internal] +// - GetColumnIndex() +// - GetColumnsCount() +// - GetColumnOffset() +// - GetColumnWidth() +// - SetColumnOffset() +// - SetColumnWidth() +// - PushColumnClipRect() [Internal] +// - PushColumnsBackground() [Internal] +// - PopColumnsBackground() [Internal] +// - FindOrCreateColumns() [Internal] +// - GetColumnsID() [Internal] +// - BeginColumns() +// - NextColumn() +// - EndColumns() +// - Columns() +//------------------------------------------------------------------------- + +// [Internal] Small optimization to avoid calls to PopClipRect/SetCurrentChannel/PushClipRect in sequences, +// they would meddle many times with the underlying ImDrawCmd. +// Instead, we do a preemptive overwrite of clipping rectangle _without_ altering the command-buffer and let +// the subsequent single call to SetCurrentChannel() does it things once. +void ImGui::SetWindowClipRectBeforeSetChannel(ImGuiWindow* window, const ImRect& clip_rect) +{ + ImVec4 clip_rect_vec4 = clip_rect.ToVec4(); + window->ClipRect = clip_rect; + window->DrawList->_CmdHeader.ClipRect = clip_rect_vec4; + window->DrawList->_ClipRectStack.Data[window->DrawList->_ClipRectStack.Size - 1] = clip_rect_vec4; +} + +int ImGui::GetColumnIndex() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0; +} + +int ImGui::GetColumnsCount() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1; +} + +float ImGui::GetColumnOffsetFromNorm(const ImGuiOldColumns* columns, float offset_norm) +{ + return offset_norm * (columns->OffMaxX - columns->OffMinX); +} + +float ImGui::GetColumnNormFromOffset(const ImGuiOldColumns* columns, float offset) +{ + return offset / (columns->OffMaxX - columns->OffMinX); +} + +static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f; + +static float GetDraggedColumnOffset(ImGuiOldColumns* columns, int column_index) +{ + // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing + // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning. + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(column_index > 0); // We are not supposed to drag column 0. + IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index)); + + float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x; + x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing); + if ((columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths)) + x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing); + + return x; +} + +float ImGui::GetColumnOffset(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return 0.0f; + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const float t = columns->Columns[column_index].OffsetNorm; + const float x_offset = ImLerp(columns->OffMinX, columns->OffMaxX, t); + return x_offset; +} + +static float GetColumnWidthEx(ImGuiOldColumns* columns, int column_index, bool before_resize = false) +{ + if (column_index < 0) + column_index = columns->Current; + + float offset_norm; + if (before_resize) + offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize; + else + offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm; + return ImGui::GetColumnOffsetFromNorm(columns, offset_norm); +} + +float ImGui::GetColumnWidth(int column_index) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns == NULL) + return GetContentRegionAvail().x; + + if (column_index < 0) + column_index = columns->Current; + return GetColumnOffsetFromNorm(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm); +} + +void ImGui::SetColumnOffset(int column_index, float offset) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + IM_ASSERT(column_index < columns->Columns.Size); + + const bool preserve_width = !(columns->Flags & ImGuiOldColumnFlags_NoPreserveWidths) && (column_index < columns->Count - 1); + const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f; + + if (!(columns->Flags & ImGuiOldColumnFlags_NoForceWithinWindow)) + offset = ImMin(offset, columns->OffMaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index)); + columns->Columns[column_index].OffsetNorm = GetColumnNormFromOffset(columns, offset - columns->OffMinX); + + if (preserve_width) + SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width)); +} + +void ImGui::SetColumnWidth(int column_index, float width) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + if (column_index < 0) + column_index = columns->Current; + SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width); +} + +void ImGui::PushColumnClipRect(int column_index) +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (column_index < 0) + column_index = columns->Current; + + ImGuiOldColumnData* column = &columns->Columns[column_index]; + PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false); +} + +// Get into the columns background draw command (which is generally the same draw command as before we called BeginColumns) +void ImGui::PushColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid SetCurrentChannel() + PushClipRect() + columns->HostBackupClipRect = window->ClipRect; + SetWindowClipRectBeforeSetChannel(window, columns->HostInitialClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, 0); +} + +void ImGui::PopColumnsBackground() +{ + ImGuiWindow* window = GetCurrentWindowRead(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns->Count == 1) + return; + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + SetWindowClipRectBeforeSetChannel(window, columns->HostBackupClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); +} + +ImGuiOldColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id) +{ + // We have few columns per window so for now we don't need bother much with turning this into a faster lookup. + for (int n = 0; n < window->ColumnsStorage.Size; n++) + if (window->ColumnsStorage[n].ID == id) + return &window->ColumnsStorage[n]; + + window->ColumnsStorage.push_back(ImGuiOldColumns()); + ImGuiOldColumns* columns = &window->ColumnsStorage.back(); + columns->ID = id; + return columns; +} + +ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count) +{ + ImGuiWindow* window = GetCurrentWindow(); + + // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget. + // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer. + PushID(0x11223347 + (str_id ? 0 : columns_count)); + ImGuiID id = window->GetID(str_id ? str_id : "columns"); + PopID(); + + return id; +} + +void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiOldColumnFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + IM_ASSERT(columns_count >= 1); + IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported + + // Acquire storage for the columns set + ImGuiID id = GetColumnsID(str_id, columns_count); + ImGuiOldColumns* columns = FindOrCreateColumns(window, id); + IM_ASSERT(columns->ID == id); + columns->Current = 0; + columns->Count = columns_count; + columns->Flags = flags; + window->DC.CurrentColumns = columns; + + columns->HostCursorPosY = window->DC.CursorPos.y; + columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x; + columns->HostInitialClipRect = window->ClipRect; + columns->HostBackupParentWorkRect = window->ParentWorkRect; + window->ParentWorkRect = window->WorkRect; + + // Set state for first column + // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect + const float column_padding = g.Style.ItemSpacing.x; + const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize)); + const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f); + const float max_2 = window->WorkRect.Max.x + half_clip_extend_x; + columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f); + columns->OffMaxX = ImMax(ImMin(max_1, max_2) - window->Pos.x, columns->OffMinX + 1.0f); + columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y; + + // Clear data if columns count changed + if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1) + columns->Columns.resize(0); + + // Initialize default widths + columns->IsFirstFrame = (columns->Columns.Size == 0); + if (columns->Columns.Size == 0) + { + columns->Columns.reserve(columns_count + 1); + for (int n = 0; n < columns_count + 1; n++) + { + ImGuiOldColumnData column; + column.OffsetNorm = n / (float)columns_count; + columns->Columns.push_back(column); + } + } + + for (int n = 0; n < columns_count; n++) + { + // Compute clipping rectangle + ImGuiOldColumnData* column = &columns->Columns[n]; + float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n)); + float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f); + column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX); + column->ClipRect.ClipWithFull(window->ClipRect); + } + + if (columns->Count > 1) + { + columns->Splitter.Split(window->DrawList, 1 + columns->Count); + columns->Splitter.SetCurrentChannel(window->DrawList, 1); + PushColumnClipRect(0); + } + + // We don't generally store Indent.x inside ColumnsOffset because it may be manipulated by the user. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::NextColumn() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems || window->DC.CurrentColumns == NULL) + return; + + ImGuiContext& g = *GImGui; + ImGuiOldColumns* columns = window->DC.CurrentColumns; + + if (columns->Count == 1) + { + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + IM_ASSERT(columns->Current == 0); + return; + } + + // Next column + if (++columns->Current == columns->Count) + columns->Current = 0; + + PopItemWidth(); + + // Optimization: avoid PopClipRect() + SetCurrentChannel() + PushClipRect() + // (which would needlessly attempt to update commands in the wrong channel, then pop or overwrite them), + ImGuiOldColumnData* column = &columns->Columns[columns->Current]; + SetWindowClipRectBeforeSetChannel(window, column->ClipRect); + columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1); + + const float column_padding = g.Style.ItemSpacing.x; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + if (columns->Current > 0) + { + // Columns 1+ ignore IndentX (by canceling it out) + // FIXME-COLUMNS: Unnecessary, could be locked? + window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + column_padding; + } + else + { + // New row/line: column 0 honor IndentX. + window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f); + window->DC.IsSameLine = false; + columns->LineMinY = columns->LineMaxY; + } + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); + window->DC.CursorPos.y = columns->LineMinY; + window->DC.CurrLineSize = ImVec2(0.0f, 0.0f); + window->DC.CurrLineTextBaseOffset = 0.0f; + + // FIXME-COLUMNS: Share code with BeginColumns() - move code on columns setup. + float offset_0 = GetColumnOffset(columns->Current); + float offset_1 = GetColumnOffset(columns->Current + 1); + float width = offset_1 - offset_0; + PushItemWidth(width * 0.65f); + window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding; +} + +void ImGui::EndColumns() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + ImGuiOldColumns* columns = window->DC.CurrentColumns; + IM_ASSERT(columns != NULL); + + PopItemWidth(); + if (columns->Count > 1) + { + PopClipRect(); + columns->Splitter.Merge(window->DrawList); + } + + const ImGuiOldColumnFlags flags = columns->Flags; + columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y); + window->DC.CursorPos.y = columns->LineMaxY; + if (!(flags & ImGuiOldColumnFlags_GrowParentContentsSize)) + window->DC.CursorMaxPos.x = columns->HostCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent + + // Draw columns borders and handle resize + // The IsBeingResized flag ensure we preserve pre-resize columns width so back-and-forth are not lossy + bool is_being_resized = false; + if (!(flags & ImGuiOldColumnFlags_NoBorder) && !window->SkipItems) + { + // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers. + const float y1 = ImMax(columns->HostCursorPosY, window->ClipRect.Min.y); + const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y); + int dragging_column = -1; + for (int n = 1; n < columns->Count; n++) + { + ImGuiOldColumnData* column = &columns->Columns[n]; + float x = window->Pos.x + GetColumnOffset(n); + const ImGuiID column_id = columns->ID + ImGuiID(n); + const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH; + const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2)); + if (!ItemAdd(column_hit_rect, column_id, NULL, ImGuiItemFlags_NoNav)) + continue; + + bool hovered = false, held = false; + if (!(flags & ImGuiOldColumnFlags_NoResize)) + { + ButtonBehavior(column_hit_rect, column_id, &hovered, &held); + if (hovered || held) + g.MouseCursor = ImGuiMouseCursor_ResizeEW; + if (held && !(column->Flags & ImGuiOldColumnFlags_NoResize)) + dragging_column = n; + } + + // Draw column + const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); + const float xi = IM_FLOOR(x); + window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col); + } + + // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame. + if (dragging_column != -1) + { + if (!columns->IsBeingResized) + for (int n = 0; n < columns->Count + 1; n++) + columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm; + columns->IsBeingResized = is_being_resized = true; + float x = GetDraggedColumnOffset(columns, dragging_column); + SetColumnOffset(dragging_column, x); + } + } + columns->IsBeingResized = is_being_resized; + + window->WorkRect = window->ParentWorkRect; + window->ParentWorkRect = columns->HostBackupParentWorkRect; + window->DC.CurrentColumns = NULL; + window->DC.ColumnsOffset.x = 0.0f; + window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); +} + +void ImGui::Columns(int columns_count, const char* id, bool border) +{ + ImGuiWindow* window = GetCurrentWindow(); + IM_ASSERT(columns_count >= 1); + + ImGuiOldColumnFlags flags = (border ? 0 : ImGuiOldColumnFlags_NoBorder); + //flags |= ImGuiOldColumnFlags_NoPreserveWidths; // NB: Legacy behavior + ImGuiOldColumns* columns = window->DC.CurrentColumns; + if (columns != NULL && columns->Count == columns_count && columns->Flags == flags) + return; + + if (columns != NULL) + EndColumns(); + + if (columns_count != 1) + BeginColumns(id, columns_count, flags); +} + +//------------------------------------------------------------------------- + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imgui_widgets.cpp b/ImGui/imgui_widgets.cpp new file mode 100644 index 0000000..0279df2 --- /dev/null +++ b/ImGui/imgui_widgets.cpp @@ -0,0 +1,8554 @@ +// dear imgui, v1.89.4 WIP +// (widgets code) + +/* + +Index of this file: + +// [SECTION] Forward Declarations +// [SECTION] Widgets: Text, etc. +// [SECTION] Widgets: Main (Button, Image, Checkbox, RadioButton, ProgressBar, Bullet, etc.) +// [SECTION] Widgets: Low-level Layout helpers (Spacing, Dummy, NewLine, Separator, etc.) +// [SECTION] Widgets: ComboBox +// [SECTION] Data Type and Data Formatting Helpers +// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. +// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. +// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. +// [SECTION] Widgets: InputText, InputTextMultiline +// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. +// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. +// [SECTION] Widgets: Selectable +// [SECTION] Widgets: ListBox +// [SECTION] Widgets: PlotLines, PlotHistogram +// [SECTION] Widgets: Value helpers +// [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc. +// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. +// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. +// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc. + +*/ + +#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS +#endif + +#ifndef IMGUI_DEFINE_MATH_OPERATORS +#define IMGUI_DEFINE_MATH_OPERATORS +#endif + +#include "imgui.h" +#ifndef IMGUI_DISABLE +#include "imgui_internal.h" + +// System includes +#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier +#include // intptr_t +#else +#include // intptr_t +#endif + +//------------------------------------------------------------------------- +// Warnings +//------------------------------------------------------------------------- + +// Visual Studio warnings +#ifdef _MSC_VER +#pragma warning (disable: 4127) // condition expression is constant +#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen +#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later +#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types +#endif +#pragma warning (disable: 26451) // [Static Analyzer] Arithmetic overflow : Using operator 'xxx' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator 'xxx' to avoid overflow(io.2). +#pragma warning (disable: 26812) // [Static Analyzer] The enum type 'xxx' is unscoped. Prefer 'enum class' over 'enum' (Enum.3). +#endif + +// Clang/GCC warnings with -Weverything +#if defined(__clang__) +#if __has_warning("-Wunknown-warning-option") +#pragma clang diagnostic ignored "-Wunknown-warning-option" // warning: unknown warning group 'xxx' // not all warnings are known by all Clang versions and they tend to be rename-happy.. so ignoring warnings triggers new warnings on some configuration. Great! +#endif +#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning: unknown warning group 'xxx' +#pragma clang diagnostic ignored "-Wold-style-cast" // warning: use of old-style cast // yes, they are more terse. +#pragma clang diagnostic ignored "-Wfloat-equal" // warning: comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok. +#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning: format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code. +#pragma clang diagnostic ignored "-Wsign-conversion" // warning: implicit conversion changes signedness +#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning: zero as null pointer constant // some standard header variations use #define NULL 0 +#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double. +#pragma clang diagnostic ignored "-Wenum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') +#pragma clang diagnostic ignored "-Wdeprecated-enum-enum-conversion"// warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#pragma clang diagnostic ignored "-Wimplicit-int-float-conversion" // warning: implicit conversion from 'xxx' to 'float' may lose precision +#elif defined(__GNUC__) +#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind +#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked +#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead +#pragma GCC diagnostic ignored "-Wdeprecated-enum-enum-conversion" // warning: bitwise operation between different enumeration types ('XXXFlags_' and 'XXXFlagsPrivate_') is deprecated +#endif + +//------------------------------------------------------------------------- +// Data +//------------------------------------------------------------------------- + +// Widgets +static const float DRAGDROP_HOLD_TO_OPEN_TIMER = 0.70f; // Time for drag-hold to activate items accepting the ImGuiButtonFlags_PressedOnDragDropHold button behavior. +static const float DRAG_MOUSE_THRESHOLD_FACTOR = 0.50f; // Multiplier for the default value of io.MouseDragThreshold to make DragFloat/DragInt react faster to mouse drags. + +// Those MIN/MAX values are not define because we need to point to them +static const signed char IM_S8_MIN = -128; +static const signed char IM_S8_MAX = 127; +static const unsigned char IM_U8_MIN = 0; +static const unsigned char IM_U8_MAX = 0xFF; +static const signed short IM_S16_MIN = -32768; +static const signed short IM_S16_MAX = 32767; +static const unsigned short IM_U16_MIN = 0; +static const unsigned short IM_U16_MAX = 0xFFFF; +static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000); +static const ImS32 IM_S32_MAX = INT_MAX; // (2147483647), (0x7FFFFFFF) +static const ImU32 IM_U32_MIN = 0; +static const ImU32 IM_U32_MAX = UINT_MAX; // (0xFFFFFFFF) +#ifdef LLONG_MIN +static const ImS64 IM_S64_MIN = LLONG_MIN; // (-9223372036854775807ll - 1ll); +static const ImS64 IM_S64_MAX = LLONG_MAX; // (9223372036854775807ll); +#else +static const ImS64 IM_S64_MIN = -9223372036854775807LL - 1; +static const ImS64 IM_S64_MAX = 9223372036854775807LL; +#endif +static const ImU64 IM_U64_MIN = 0; +#ifdef ULLONG_MAX +static const ImU64 IM_U64_MAX = ULLONG_MAX; // (0xFFFFFFFFFFFFFFFFull); +#else +static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1); +#endif + +//------------------------------------------------------------------------- +// [SECTION] Forward Declarations +//------------------------------------------------------------------------- + +// For InputTextEx() +static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source); +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end); +static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining = NULL, ImVec2* out_offset = NULL, bool stop_on_new_line = false); + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Text, etc. +//------------------------------------------------------------------------- +// - TextEx() [Internal] +// - TextUnformatted() +// - Text() +// - TextV() +// - TextColored() +// - TextColoredV() +// - TextDisabled() +// - TextDisabledV() +// - TextWrapped() +// - TextWrappedV() +// - LabelText() +// - LabelTextV() +// - BulletText() +// - BulletTextV() +//------------------------------------------------------------------------- + +void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ImGuiContext& g = *GImGui; + + // Accept null ranges + if (text == text_end) + text = text_end = ""; + + // Calculate length + const char* text_begin = text; + if (text_end == NULL) + text_end = text + strlen(text); // FIXME-OPT + + const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + const float wrap_pos_x = window->DC.TextWrapPos; + const bool wrap_enabled = (wrap_pos_x >= 0.0f); + if (text_end - text <= 2000 || wrap_enabled) + { + // Common case + const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f; + const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width); + + ImRect bb(text_pos, text_pos + text_size); + ItemSize(text_size, 0.0f); + if (!ItemAdd(bb, 0)) + return; + + // Render (we don't hide text after ## in this end-user function) + RenderTextWrapped(bb.Min, text_begin, text_end, wrap_width); + } + else + { + // Long text! + // Perform manual coarse clipping to optimize for long multi-line text + // - From this point we will only compute the width of lines that are visible. Optimization only available when word-wrapping is disabled. + // - We also don't vertically center the text within the line full height, which is unlikely to matter because we are likely the biggest and only item on the line. + // - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop. + const char* line = text; + const float line_height = GetTextLineHeight(); + ImVec2 text_size(0, 0); + + // Lines to skip (can't skip when logging text) + ImVec2 pos = text_pos; + if (!g.LogEnabled) + { + int lines_skippable = (int)((window->ClipRect.Min.y - text_pos.y) / line_height); + if (lines_skippable > 0) + { + int lines_skipped = 0; + while (line < text_end && lines_skipped < lines_skippable) + { + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + line = line_end + 1; + lines_skipped++; + } + pos.y += lines_skipped * line_height; + } + } + + // Lines to render + if (line < text_end) + { + ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height)); + while (line < text_end) + { + if (IsClippedEx(line_rect, 0)) + break; + + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + RenderText(pos, line, line_end, false); + line = line_end + 1; + line_rect.Min.y += line_height; + line_rect.Max.y += line_height; + pos.y += line_height; + } + + // Count remaining lines + int lines_skipped = 0; + while (line < text_end) + { + const char* line_end = (const char*)memchr(line, '\n', text_end - line); + if (!line_end) + line_end = text_end; + if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0) + text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x); + line = line_end + 1; + lines_skipped++; + } + pos.y += lines_skipped * line_height; + } + text_size.y = (pos - text_pos).y; + + ImRect bb(text_pos, text_pos + text_size); + ItemSize(text_size, 0.0f); + ItemAdd(bb, 0); + } +} + +void ImGui::TextUnformatted(const char* text, const char* text_end) +{ + TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); +} + +void ImGui::Text(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextV(fmt, args); + va_end(args); +} + +void ImGui::TextV(const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + const char* text, *text_end; + ImFormatStringToTempBufferV(&text, &text_end, fmt, args); + TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText); +} + +void ImGui::TextColored(const ImVec4& col, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextColoredV(col, fmt, args); + va_end(args); +} + +void ImGui::TextColoredV(const ImVec4& col, const char* fmt, va_list args) +{ + PushStyleColor(ImGuiCol_Text, col); + TextV(fmt, args); + PopStyleColor(); +} + +void ImGui::TextDisabled(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextDisabledV(fmt, args); + va_end(args); +} + +void ImGui::TextDisabledV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]); + TextV(fmt, args); + PopStyleColor(); +} + +void ImGui::TextWrapped(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + TextWrappedV(fmt, args); + va_end(args); +} + +void ImGui::TextWrappedV(const char* fmt, va_list args) +{ + ImGuiContext& g = *GImGui; + const bool need_backup = (g.CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set + if (need_backup) + PushTextWrapPos(0.0f); + TextV(fmt, args); + if (need_backup) + PopTextWrapPos(); +} + +void ImGui::LabelText(const char* label, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + LabelTextV(label, fmt, args); + va_end(args); +} + +// Add a label+text combo aligned to other label+value widgets +void ImGui::LabelTextV(const char* label, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float w = CalcItemWidth(); + + const char* value_text_begin, *value_text_end; + ImFormatStringToTempBufferV(&value_text_begin, &value_text_end, fmt, args); + const ImVec2 value_size = CalcTextSize(value_text_begin, value_text_end, false); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const ImVec2 pos = window->DC.CursorPos; + const ImRect value_bb(pos, pos + ImVec2(w, value_size.y + style.FramePadding.y * 2)); + const ImRect total_bb(pos, pos + ImVec2(w + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), ImMax(value_size.y, label_size.y) + style.FramePadding.y * 2)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, 0)) + return; + + // Render + RenderTextClipped(value_bb.Min + style.FramePadding, value_bb.Max, value_text_begin, value_text_end, &value_size, ImVec2(0.0f, 0.0f)); + if (label_size.x > 0.0f) + RenderText(ImVec2(value_bb.Max.x + style.ItemInnerSpacing.x, value_bb.Min.y + style.FramePadding.y), label); +} + +void ImGui::BulletText(const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + BulletTextV(fmt, args); + va_end(args); +} + +// Text with a little bullet aligned to the typical tree node. +void ImGui::BulletTextV(const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + const char* text_begin, *text_end; + ImFormatStringToTempBufferV(&text_begin, &text_end, fmt, args); + const ImVec2 label_size = CalcTextSize(text_begin, text_end, false); + const ImVec2 total_size = ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x * 2) : 0.0f), label_size.y); // Empty text doesn't add padding + ImVec2 pos = window->DC.CursorPos; + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(total_size, 0.0f); + const ImRect bb(pos, pos + total_size); + if (!ItemAdd(bb, 0)) + return; + + // Render + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, g.FontSize * 0.5f), text_col); + RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Main +//------------------------------------------------------------------------- +// - ButtonBehavior() [Internal] +// - Button() +// - SmallButton() +// - InvisibleButton() +// - ArrowButton() +// - CloseButton() [Internal] +// - CollapseButton() [Internal] +// - GetWindowScrollbarID() [Internal] +// - GetWindowScrollbarRect() [Internal] +// - Scrollbar() [Internal] +// - ScrollbarEx() [Internal] +// - Image() +// - ImageButton() +// - Checkbox() +// - CheckboxFlagsT() [Internal] +// - CheckboxFlags() +// - RadioButton() +// - ProgressBar() +// - Bullet() +//------------------------------------------------------------------------- + +// The ButtonBehavior() function is key to many interactions and used by many/most widgets. +// Because we handle so many cases (keyboard/gamepad navigation, drag and drop) and many specific behavior (via ImGuiButtonFlags_), +// this code is a little complex. +// By far the most common path is interacting with the Mouse using the default ImGuiButtonFlags_PressedOnClickRelease button behavior. +// See the series of events below and the corresponding state reported by dear imgui: +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnClickRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+0 (mouse is outside bb) - - - - - - +// Frame N+1 (mouse moves inside bb) - true - - - - +// Frame N+2 (mouse button is down) - true true true - true +// Frame N+3 (mouse button is down) - true true - - - +// Frame N+4 (mouse moves outside bb) - - true - - - +// Frame N+5 (mouse moves inside bb) - true true - - - +// Frame N+6 (mouse button is released) true true - - true - +// Frame N+7 (mouse button is released) - true - - - - +// Frame N+8 (mouse moves outside bb) - - - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+2 (mouse button is down) true true true true - true +// Frame N+3 (mouse button is down) - true true - - - +// Frame N+6 (mouse button is released) - true - - true - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+2 (mouse button is down) - true - - - true +// Frame N+3 (mouse button is down) - true - - - - +// Frame N+6 (mouse button is released) true true - - - - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// with PressedOnDoubleClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked() +// Frame N+0 (mouse button is down) - true - - - true +// Frame N+1 (mouse button is down) - true - - - - +// Frame N+2 (mouse button is released) - true - - - - +// Frame N+3 (mouse button is released) - true - - - - +// Frame N+4 (mouse button is down) true true true true - true +// Frame N+5 (mouse button is down) - true true - - - +// Frame N+6 (mouse button is released) - true - - true - +// Frame N+7 (mouse button is released) - true - - - - +//------------------------------------------------------------------------------------------------------------------------------------------------ +// Note that some combinations are supported, +// - PressedOnDragDropHold can generally be associated with any flag. +// - PressedOnDoubleClick can be associated by PressedOnClickRelease/PressedOnRelease, in which case the second release event won't be reported. +//------------------------------------------------------------------------------------------------------------------------------------------------ +// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set: +// Repeat+ Repeat+ Repeat+ Repeat+ +// PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick +//------------------------------------------------------------------------------------------------------------------------------------------------- +// Frame N+0 (mouse button is down) - true - true +// ... - - - - +// Frame N + RepeatDelay true true - true +// ... - - - - +// Frame N + RepeatDelay + RepeatRate*N true true - true +//------------------------------------------------------------------------------------------------------------------------------------------------- + +bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + // Default only reacts to left mouse button + if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0) + flags |= ImGuiButtonFlags_MouseButtonDefault_; + + // Default behavior requires click + release inside bounding box + if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0) + flags |= ImGuiButtonFlags_PressedOnDefault_; + + ImGuiWindow* backup_hovered_window = g.HoveredWindow; + const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredWindow && g.HoveredWindow->RootWindow == window; + if (flatten_hovered_children) + g.HoveredWindow = window; + +#ifdef IMGUI_ENABLE_TEST_ENGINE + // Alternate registration spot, for when caller didn't use ItemAdd() + if (id != 0 && g.LastItemData.ID != id) + IMGUI_TEST_ENGINE_ITEM_ADD(id, bb, NULL); +#endif + + bool pressed = false; + bool hovered = ItemHoverable(bb, id); + + // Drag source doesn't report as hovered + if (hovered && g.DragDropActive && g.DragDropPayload.SourceId == id && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoDisableHover)) + hovered = false; + + // Special mode for Drag and Drop where holding button pressed for a long time while dragging another item triggers the button + if (g.DragDropActive && (flags & ImGuiButtonFlags_PressedOnDragDropHold) && !(g.DragDropSourceFlags & ImGuiDragDropFlags_SourceNoHoldToOpenOthers)) + if (IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem)) + { + hovered = true; + SetHoveredID(id); + if (g.HoveredIdTimer - g.IO.DeltaTime <= DRAGDROP_HOLD_TO_OPEN_TIMER && g.HoveredIdTimer >= DRAGDROP_HOLD_TO_OPEN_TIMER) + { + pressed = true; + g.DragDropHoldJustPressedId = id; + FocusWindow(window); + } + } + + if (flatten_hovered_children) + g.HoveredWindow = backup_hovered_window; + + // AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one. + if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0)) + hovered = false; + + // Mouse handling + const ImGuiID test_owner_id = (flags & ImGuiButtonFlags_NoTestKeyOwner) ? ImGuiKeyOwner_Any : id; + if (hovered) + { + // Poll mouse buttons + // - 'mouse_button_clicked' is generally carried into ActiveIdMouseButton when setting ActiveId. + // - Technically we only need some values in one code path, but since this is gated by hovered test this is fine. + int mouse_button_clicked = -1; + int mouse_button_released = -1; + for (int button = 0; button < 3; button++) + if (flags & (ImGuiButtonFlags_MouseButtonLeft << button)) // Handle ImGuiButtonFlags_MouseButtonRight and ImGuiButtonFlags_MouseButtonMiddle here. + { + if (IsMouseClicked(button, test_owner_id) && mouse_button_clicked == -1) { mouse_button_clicked = button; } + if (IsMouseReleased(button, test_owner_id) && mouse_button_released == -1) { mouse_button_released = button; } + } + + // Process initial action + if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt)) + { + if (mouse_button_clicked != -1 && g.ActiveId != id) + { + if (!(flags & ImGuiButtonFlags_NoSetKeyOwner)) + SetKeyOwner(MouseButtonToKey(mouse_button_clicked), id); + if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere)) + { + SetActiveID(id, window); + g.ActiveIdMouseButton = mouse_button_clicked; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + FocusWindow(window); + } + if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseClickedCount[mouse_button_clicked] == 2)) + { + pressed = true; + if (flags & ImGuiButtonFlags_NoHoldingActiveId) + ClearActiveID(); + else + SetActiveID(id, window); // Hold on ID + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + g.ActiveIdMouseButton = mouse_button_clicked; + FocusWindow(window); + } + } + if (flags & ImGuiButtonFlags_PressedOnRelease) + { + if (mouse_button_released != -1) + { + const bool has_repeated_at_least_once = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay; // Repeat mode trumps on release behavior + if (!has_repeated_at_least_once) + pressed = true; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + ClearActiveID(); + } + } + + // 'Repeat' mode acts when held regardless of _PressedOn flags (see table above). + // Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings. + if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat)) + if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, test_owner_id, ImGuiInputFlags_Repeat)) + pressed = true; + } + + if (pressed) + g.NavDisableHighlight = true; + } + + // Gamepad/Keyboard navigation + // We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse. + if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId)) + if (!(flags & ImGuiButtonFlags_NoHoveredOnFocus)) + hovered = true; + if (g.NavActivateDownId == id) + { + bool nav_activated_by_code = (g.NavActivateId == id); + bool nav_activated_by_inputs = (g.NavActivatePressedId == id); + if (!nav_activated_by_inputs && (flags & ImGuiButtonFlags_Repeat)) + { + // Avoid pressing multiple keys from triggering excessive amount of repeat events + const ImGuiKeyData* key1 = GetKeyData(ImGuiKey_Space); + const ImGuiKeyData* key2 = GetKeyData(ImGuiKey_Enter); + const ImGuiKeyData* key3 = GetKeyData(ImGuiKey_NavGamepadActivate); + const float t1 = ImMax(ImMax(key1->DownDuration, key2->DownDuration), key3->DownDuration); + nav_activated_by_inputs = CalcTypematicRepeatAmount(t1 - g.IO.DeltaTime, t1, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate) > 0; + } + if (nav_activated_by_code || nav_activated_by_inputs) + { + // Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button. + pressed = true; + SetActiveID(id, window); + g.ActiveIdSource = ImGuiInputSource_Nav; + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + SetFocusID(id, window); + } + } + + // Process while held + bool held = false; + if (g.ActiveId == id) + { + if (g.ActiveIdSource == ImGuiInputSource_Mouse) + { + if (g.ActiveIdIsJustActivated) + g.ActiveIdClickOffset = g.IO.MousePos - bb.Min; + + const int mouse_button = g.ActiveIdMouseButton; + if (IsMouseDown(mouse_button, test_owner_id)) + { + held = true; + } + else + { + bool release_in = hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) != 0; + bool release_anywhere = (flags & ImGuiButtonFlags_PressedOnClickReleaseAnywhere) != 0; + if ((release_in || release_anywhere) && !g.DragDropActive) + { + // Report as pressed when releasing the mouse (this is the most common path) + bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseReleased[mouse_button] && g.IO.MouseClickedLastCount[mouse_button] == 2; + bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps + bool is_button_avail_or_owned = TestKeyOwner(MouseButtonToKey(mouse_button), test_owner_id); + if (!is_double_click_release && !is_repeating_already && is_button_avail_or_owned) + pressed = true; + } + ClearActiveID(); + } + if (!(flags & ImGuiButtonFlags_NoNavFocus)) + g.NavDisableHighlight = true; + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + // When activated using Nav, we hold on the ActiveID until activation button is released + if (g.NavActivateDownId != id) + ClearActiveID(); + } + if (pressed) + g.ActiveIdHasBeenPressedBefore = true; + } + + if (out_hovered) *out_hovered = hovered; + if (out_held) *out_held = held; + + return pressed; +} + +bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + ImVec2 pos = window->DC.CursorPos; + if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag) + pos.y += window->DC.CurrLineTextBaseOffset - style.FramePadding.y; + ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f); + + const ImRect bb(pos, pos + size); + ItemSize(size, style.FramePadding.y); + if (!ItemAdd(bb, id)) + return false; + + if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) + flags |= ImGuiButtonFlags_Repeat; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, col, true, style.FrameRounding); + + if (g.LogEnabled) + LogSetNextTextDecoration("[", "]"); + RenderTextClipped(bb.Min + style.FramePadding, bb.Max - style.FramePadding, label, NULL, &label_size, style.ButtonTextAlign, &bb); + + // Automatically close popups + //if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup)) + // CloseCurrentPopup(); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::Button(const char* label, const ImVec2& size_arg) +{ + return ButtonEx(label, size_arg, ImGuiButtonFlags_None); +} + +// Small buttons fits within text without additional vertical spacing. +bool ImGui::SmallButton(const char* label) +{ + ImGuiContext& g = *GImGui; + float backup_padding_y = g.Style.FramePadding.y; + g.Style.FramePadding.y = 0.0f; + bool pressed = ButtonEx(label, ImVec2(0, 0), ImGuiButtonFlags_AlignTextBaseLine); + g.Style.FramePadding.y = backup_padding_y; + return pressed; +} + +// Tip: use ImGui::PushID()/PopID() to push indices or pointers in the ID stack. +// Then you can keep 'str_id' empty or the same for all your buttons (instead of creating a string based on a non-string id) +bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + // Cannot use zero-size for InvisibleButton(). Unlike Button() there is not way to fallback using the label size. + IM_ASSERT(size_arg.x != 0.0f && size_arg.y != 0.0f); + + const ImGuiID id = window->GetID(str_id); + ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(size); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImGuiID id = window->GetID(str_id); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + const float default_size = GetFrameHeight(); + ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f); + if (!ItemAdd(bb, id)) + return false; + + if (g.LastItemData.InFlags & ImGuiItemFlags_ButtonRepeat) + flags |= ImGuiButtonFlags_Repeat; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + const ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding); + RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, str_id, g.LastItemData.StatusFlags); + return pressed; +} + +bool ImGui::ArrowButton(const char* str_id, ImGuiDir dir) +{ + float sz = GetFrameHeight(); + return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), ImGuiButtonFlags_None); +} + +// Button to close a window +bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // Tweak 1: Shrink hit-testing area if button covers an abnormally large proportion of the visible region. That's in order to facilitate moving the window away. (#3825) + // This may better be applied as a general hit-rect reduction mechanism for all widgets to ensure the area to move window is always accessible? + const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + ImRect bb_interact = bb; + const float area_to_visible_ratio = window->OuterRectClipped.GetArea() / bb.GetArea(); + if (area_to_visible_ratio < 1.5f) + bb_interact.Expand(ImFloor(bb_interact.GetSize() * -0.25f)); + + // Tweak 2: We intentionally allow interaction when clipped so that a mechanical Alt,Right,Activate sequence can always close a window. + // (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible). + bool is_clipped = !ItemAdd(bb_interact, id); + + bool hovered, held; + bool pressed = ButtonBehavior(bb_interact, id, &hovered, &held); + if (is_clipped) + return pressed; + + // Render + // FIXME: Clarify this mess + ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered); + ImVec2 center = bb.GetCenter(); + if (hovered) + window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12); + + float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f; + ImU32 cross_col = GetColorU32(ImGuiCol_Text); + center -= ImVec2(0.5f, 0.5f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, +cross_extent), center + ImVec2(-cross_extent, -cross_extent), cross_col, 1.0f); + window->DrawList->AddLine(center + ImVec2(+cross_extent, -cross_extent), center + ImVec2(-cross_extent, +cross_extent), cross_col, 1.0f); + + return pressed; +} + +bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f); + ItemAdd(bb, id); + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None); + + // Render + ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + if (hovered || held) + window->DrawList->AddCircleFilled(bb.GetCenter()/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12); + RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f); + + // Switch to moving the window after mouse is moved beyond the initial drag threshold + if (IsItemActive() && IsMouseDragging(0)) + StartMouseMovingWindow(window); + + return pressed; +} + +ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis) +{ + return window->GetID(axis == ImGuiAxis_X ? "#SCROLLX" : "#SCROLLY"); +} + +// Return scrollbar rectangle, must only be called for corresponding axis if window->ScrollbarX/Y is set. +ImRect ImGui::GetWindowScrollbarRect(ImGuiWindow* window, ImGuiAxis axis) +{ + const ImRect outer_rect = window->Rect(); + const ImRect inner_rect = window->InnerRect; + const float border_size = window->WindowBorderSize; + const float scrollbar_size = window->ScrollbarSizes[axis ^ 1]; // (ScrollbarSizes.x = width of Y scrollbar; ScrollbarSizes.y = height of X scrollbar) + IM_ASSERT(scrollbar_size > 0.0f); + if (axis == ImGuiAxis_X) + return ImRect(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size), inner_rect.Max.x, outer_rect.Max.y); + else + return ImRect(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y, outer_rect.Max.x, inner_rect.Max.y); +} + +void ImGui::Scrollbar(ImGuiAxis axis) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + const ImGuiID id = GetWindowScrollbarID(window, axis); + + // Calculate scrollbar bounding box + ImRect bb = GetWindowScrollbarRect(window, axis); + ImDrawFlags rounding_corners = ImDrawFlags_RoundCornersNone; + if (axis == ImGuiAxis_X) + { + rounding_corners |= ImDrawFlags_RoundCornersBottomLeft; + if (!window->ScrollbarY) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + else + { + if ((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) + rounding_corners |= ImDrawFlags_RoundCornersTopRight; + if (!window->ScrollbarX) + rounding_corners |= ImDrawFlags_RoundCornersBottomRight; + } + float size_avail = window->InnerRect.Max[axis] - window->InnerRect.Min[axis]; + float size_contents = window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f; + ImS64 scroll = (ImS64)window->Scroll[axis]; + ScrollbarEx(bb, id, axis, &scroll, (ImS64)size_avail, (ImS64)size_contents, rounding_corners); + window->Scroll[axis] = (float)scroll; +} + +// Vertical/Horizontal scrollbar +// The entire piece of code below is rather confusing because: +// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab) +// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar +// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal. +// Still, the code should probably be made simpler.. +bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, ImS64* p_scroll_v, ImS64 size_avail_v, ImS64 size_contents_v, ImDrawFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + const float bb_frame_width = bb_frame.GetWidth(); + const float bb_frame_height = bb_frame.GetHeight(); + if (bb_frame_width <= 0.0f || bb_frame_height <= 0.0f) + return false; + + // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the window resize grab) + float alpha = 1.0f; + if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f) + alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f)); + if (alpha <= 0.0f) + return false; + + const ImGuiStyle& style = g.Style; + const bool allow_interaction = (alpha >= 1.0f); + + ImRect bb = bb_frame; + bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f))); + + // V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar) + const float scrollbar_size_v = (axis == ImGuiAxis_X) ? bb.GetWidth() : bb.GetHeight(); + + // Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount) + // But we maintain a minimum size in pixel to allow for the user to still aim inside. + IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers. + const ImS64 win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), (ImS64)1); + const float grab_h_pixels = ImClamp(scrollbar_size_v * ((float)size_avail_v / (float)win_size_v), style.GrabMinSize, scrollbar_size_v); + const float grab_h_norm = grab_h_pixels / scrollbar_size_v; + + // Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar(). + bool held = false; + bool hovered = false; + ItemAdd(bb_frame, id, NULL, ImGuiItemFlags_NoNav); + ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus); + + const ImS64 scroll_max = ImMax((ImS64)1, size_contents_v - size_avail_v); + float scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); + float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; // Grab position in normalized space + if (held && allow_interaction && grab_h_norm < 1.0f) + { + const float scrollbar_pos_v = bb.Min[axis]; + const float mouse_pos_v = g.IO.MousePos[axis]; + + // Click position in scrollbar normalized space (0.0f->1.0f) + const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v); + SetHoveredID(id); + + bool seek_absolute = false; + if (g.ActiveIdIsJustActivated) + { + // On initial click calculate the distance between mouse and the center of the grab + seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm); + if (seek_absolute) + g.ScrollbarClickDeltaToGrabCenter = 0.0f; + else + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + } + + // Apply scroll (p_scroll_v will generally point on one member of window->Scroll) + // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position + const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm)); + *p_scroll_v = (ImS64)(scroll_v_norm * scroll_max); + + // Update values for rendering + scroll_ratio = ImSaturate((float)*p_scroll_v / (float)scroll_max); + grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v; + + // Update distance to grab now that we have seeked and saturated + if (seek_absolute) + g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f; + } + + // Render + const ImU32 bg_col = GetColorU32(ImGuiCol_ScrollbarBg); + const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha); + window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, bg_col, window->WindowRounding, flags); + ImRect grab_rect; + if (axis == ImGuiAxis_X) + grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y); + else + grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels); + window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding); + + return held; +} + +void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + if (border_col.w > 0.0f) + bb.Max += ImVec2(2, 2); + ItemSize(bb); + if (!ItemAdd(bb, 0)) + return; + + if (border_col.w > 0.0f) + { + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(border_col), 0.0f); + window->DrawList->AddImage(user_texture_id, bb.Min + ImVec2(1, 1), bb.Max - ImVec2(1, 1), uv0, uv1, GetColorU32(tint_col)); + } + else + { + window->DrawList->AddImage(user_texture_id, bb.Min, bb.Max, uv0, uv1, GetColorU32(tint_col)); + } +} + +// ImageButton() is flawed as 'id' is always derived from 'texture_id' (see #2464 #1390) +// We provide this internal helper to write your own variant while we figure out how to redesign the public ImageButton() API. +bool ImGui::ImageButtonEx(ImGuiID id, ImTextureID texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col, ImGuiButtonFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImVec2 padding = g.Style.FramePadding; + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size + padding * 2.0f); + ItemSize(bb); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags); + + // Render + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + RenderNavHighlight(bb, id); + RenderFrame(bb.Min, bb.Max, col, true, ImClamp((float)ImMin(padding.x, padding.y), 0.0f, g.Style.FrameRounding)); + if (bg_col.w > 0.0f) + window->DrawList->AddRectFilled(bb.Min + padding, bb.Max - padding, GetColorU32(bg_col)); + window->DrawList->AddImage(texture_id, bb.Min + padding, bb.Max - padding, uv0, uv1, GetColorU32(tint_col)); + + return pressed; +} + +bool ImGui::ImageButton(const char* str_id, ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + return ImageButtonEx(window->GetID(str_id), user_texture_id, size, uv0, uv1, bg_col, tint_col); +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// Legacy API obsoleted in 1.89. Two differences with new ImageButton() +// - new ImageButton() requires an explicit 'const char* str_id' Old ImageButton() used opaque imTextureId (created issue with: multiple buttons with same image, transient texture id values, opaque computation of ID) +// - new ImageButton() always use style.FramePadding Old ImageButton() had an override argument. +// If you need to change padding with new ImageButton() you can use PushStyleVar(ImGuiStyleVar_FramePadding, value), consistent with other Button functions. +bool ImGui::ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, int frame_padding, const ImVec4& bg_col, const ImVec4& tint_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + // Default to using texture ID as ID. User can still push string/integer prefixes. + PushID((void*)(intptr_t)user_texture_id); + const ImGuiID id = window->GetID("#image"); + PopID(); + + if (frame_padding >= 0) + PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2((float)frame_padding, (float)frame_padding)); + bool ret = ImageButtonEx(id, user_texture_id, size, uv0, uv1, bg_col, tint_col); + if (frame_padding >= 0) + PopStyleVar(); + return ret; +} +#endif // #ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS + +bool ImGui::Checkbox(const char* label, bool* v) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const float square_sz = GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id)) + { + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return false; + } + + bool hovered, held; + bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + { + *v = !(*v); + MarkItemEdited(id); + } + + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + RenderNavHighlight(total_bb, id); + RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding); + ImU32 check_col = GetColorU32(ImGuiCol_CheckMark); + bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0; + if (mixed_value) + { + // Undocumented tristate/mixed/indeterminate checkbox (#2644) + // This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox) + ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f))); + window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding); + } + else if (*v) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]"); + if (label_size.x > 0.0f) + RenderText(label_pos, label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0)); + return pressed; +} + +template +bool ImGui::CheckboxFlagsT(const char* label, T* flags, T flags_value) +{ + bool all_on = (*flags & flags_value) == flags_value; + bool any_on = (*flags & flags_value) != 0; + bool pressed; + if (!all_on && any_on) + { + ImGuiContext& g = *GImGui; + ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_MixedValue; + pressed = Checkbox(label, &all_on); + g.CurrentItemFlags = backup_item_flags; + } + else + { + pressed = Checkbox(label, &all_on); + + } + if (pressed) + { + if (all_on) + *flags |= flags_value; + else + *flags &= ~flags_value; + } + return pressed; +} + +bool ImGui::CheckboxFlags(const char* label, int* flags, int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, unsigned int* flags, unsigned int flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImS64* flags, ImS64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::CheckboxFlags(const char* label, ImU64* flags, ImU64 flags_value) +{ + return CheckboxFlagsT(label, flags, flags_value); +} + +bool ImGui::RadioButton(const char* label, bool active) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + const float square_sz = GetFrameHeight(); + const ImVec2 pos = window->DC.CursorPos; + const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz)); + const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id)) + return false; + + ImVec2 center = check_bb.GetCenter(); + center.x = IM_ROUND(center.x); + center.y = IM_ROUND(center.y); + const float radius = (square_sz - 1.0f) * 0.5f; + + bool hovered, held; + bool pressed = ButtonBehavior(total_bb, id, &hovered, &held); + if (pressed) + MarkItemEdited(id); + + RenderNavHighlight(total_bb, id); + window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16); + if (active) + { + const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f)); + window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16); + } + + if (style.FrameBorderSize > 0.0f) + { + window->DrawList->AddCircle(center + ImVec2(1, 1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize); + window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize); + } + + ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y); + if (g.LogEnabled) + LogRenderedText(&label_pos, active ? "(x)" : "( )"); + if (label_size.x > 0.0f) + RenderText(label_pos, label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; +} + +// FIXME: This would work nicely if it was a public template, e.g. 'template RadioButton(const char* label, T* v, T v_button)', but I'm not sure how we would expose it.. +bool ImGui::RadioButton(const char* label, int* v, int v_button) +{ + const bool pressed = RadioButton(label, *v == v_button); + if (pressed) + *v = v_button; + return pressed; +} + +// size_arg (for each axis) < 0.0f: align to end, 0.0f: auto, > 0.0f: specified size +void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* overlay) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + ImVec2 pos = window->DC.CursorPos; + ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y * 2.0f); + ImRect bb(pos, pos + size); + ItemSize(size, style.FramePadding.y); + if (!ItemAdd(bb, 0)) + return; + + // Render + fraction = ImSaturate(fraction); + RenderFrame(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + bb.Expand(ImVec2(-style.FrameBorderSize, -style.FrameBorderSize)); + const ImVec2 fill_br = ImVec2(ImLerp(bb.Min.x, bb.Max.x, fraction), bb.Max.y); + RenderRectFilledRangeH(window->DrawList, bb, GetColorU32(ImGuiCol_PlotHistogram), 0.0f, fraction, style.FrameRounding); + + // Default displaying the fraction as percentage string, but user can override it + char overlay_buf[32]; + if (!overlay) + { + ImFormatString(overlay_buf, IM_ARRAYSIZE(overlay_buf), "%.0f%%", fraction * 100 + 0.01f); + overlay = overlay_buf; + } + + ImVec2 overlay_size = CalcTextSize(overlay, NULL); + if (overlay_size.x > 0.0f) + RenderTextClipped(ImVec2(ImClamp(fill_br.x + style.ItemSpacing.x, bb.Min.x, bb.Max.x - overlay_size.x - style.ItemInnerSpacing.x), bb.Min.y), bb.Max, overlay, NULL, &overlay_size, ImVec2(0.0f, 0.5f), &bb); +} + +void ImGui::Bullet() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), g.FontSize); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height)); + ItemSize(bb); + if (!ItemAdd(bb, 0)) + { + SameLine(0, style.FramePadding.x * 2); + return; + } + + // Render and stay on same line + ImU32 text_col = GetColorU32(ImGuiCol_Text); + RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize * 0.5f, line_height * 0.5f), text_col); + SameLine(0, style.FramePadding.x * 2.0f); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Low-level Layout helpers +//------------------------------------------------------------------------- +// - Spacing() +// - Dummy() +// - NewLine() +// - AlignTextToFramePadding() +// - SeparatorEx() [Internal] +// - Separator() +// - SplitterBehavior() [Internal] +// - ShrinkWidths() [Internal] +//------------------------------------------------------------------------- + +void ImGui::Spacing() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ItemSize(ImVec2(0, 0)); +} + +void ImGui::Dummy(const ImVec2& size) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(size); + ItemAdd(bb, 0); +} + +void ImGui::NewLine() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + const ImGuiLayoutType backup_layout_type = window->DC.LayoutType; + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.IsSameLine = false; + if (window->DC.CurrLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height. + ItemSize(ImVec2(0, 0)); + else + ItemSize(ImVec2(0.0f, g.FontSize)); + window->DC.LayoutType = backup_layout_type; +} + +void ImGui::AlignTextToFramePadding() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + window->DC.CurrLineSize.y = ImMax(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2); + window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y); +} + +// Horizontal/vertical separating line +// FIXME: Surprisingly, this seemingly simple widget is adjacent to MANY different legacy/tricky layout issues. +void ImGui::SeparatorEx(ImGuiSeparatorFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + ImGuiContext& g = *GImGui; + IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected + + const float thickness = 1.0f; // Cannot use g.Style.SeparatorTextSize yet for various reasons. + if (flags & ImGuiSeparatorFlags_Vertical) + { + // Vertical separator, for menu bars (use current line height). + float y1 = window->DC.CursorPos.y; + float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y; + const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness, y2)); + ItemSize(ImVec2(thickness, 0.0f)); + if (!ItemAdd(bb, 0)) + return; + + // Draw + window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogText(" |"); + } + else if (flags & ImGuiSeparatorFlags_Horizontal) + { + // Horizontal Separator + float x1 = window->Pos.x; + float x2 = window->Pos.x + window->Size.x; + + // FIXME-WORKRECT: old hack (#205) until we decide of consistent behavior with WorkRect/Indent and Separator + if (g.GroupStack.Size > 0 && g.GroupStack.back().WindowID == window->ID) + x1 += window->DC.Indent.x; + + // FIXME-WORKRECT: In theory we should simply be using WorkRect.Min.x/Max.x everywhere but it isn't aesthetically what we want, + // need to introduce a variant of WorkRect for that purpose. (#4787) + if (ImGuiTable* table = g.CurrentTable) + { + x1 = table->Columns[table->CurrentColumn].MinX; + x2 = table->Columns[table->CurrentColumn].MaxX; + } + + ImGuiOldColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL; + if (columns) + PushColumnsBackground(); + + // We don't provide our width to the layout so that it doesn't get feed back into AutoFit + // FIXME: This prevents ->CursorMaxPos based bounding box evaluation from working (e.g. TableEndCell) + const float thickness_for_layout = (thickness == 1.0f) ? 0.0f : thickness; // FIXME: See 1.70/1.71 Separator() change: makes legacy 1-px separator not affect layout yet. Should change. + const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness)); + ItemSize(ImVec2(0.0f, thickness_for_layout)); + const bool item_visible = ItemAdd(bb, 0); + if (item_visible) + { + // Draw + window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_Separator)); + if (g.LogEnabled) + LogRenderedText(&bb.Min, "--------------------------------\n"); + + } + if (columns) + { + PopColumnsBackground(); + columns->LineMinY = window->DC.CursorPos.y; + } + } +} + +void ImGui::Separator() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + // Those flags should eventually be overridable by the user + ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal; + flags |= ImGuiSeparatorFlags_SpanAllColumns; // NB: this only applies to legacy Columns() api as they relied on Separator() a lot. + SeparatorEx(flags); +} + +void ImGui::SeparatorTextEx(ImGuiID id, const char* label, const char* label_end, float extra_w) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStyle& style = g.Style; + + const ImVec2 label_size = CalcTextSize(label, label_end, false); + const ImVec2 pos = window->DC.CursorPos; + const ImVec2 padding = style.SeparatorTextPadding; + + const float separator_thickness = style.SeparatorTextBorderSize; + const ImVec2 min_size(label_size.x + extra_w + padding.x * 2.0f, ImMax(label_size.y + padding.y * 2.0f, separator_thickness)); + const ImRect bb(pos, ImVec2(window->WorkRect.Max.x, pos.y + min_size.y)); + const float text_baseline_y = ImFloor((bb.GetHeight() - label_size.y) * style.SeparatorTextAlign.y + 0.99999f); //ImMax(padding.y, ImFloor((style.SeparatorTextSize - label_size.y) * 0.5f)); + ItemSize(min_size, text_baseline_y); + if (!ItemAdd(bb, id)) + return; + + const float sep1_x1 = pos.x; + const float sep2_x2 = bb.Max.x; + const float seps_y = ImFloor((bb.Min.y + bb.Max.y) * 0.5f + 0.99999f); + + const float label_avail_w = ImMax(0.0f, sep2_x2 - sep1_x1 - padding.x * 2.0f); + const ImVec2 label_pos(pos.x + padding.x + ImMax(0.0f, (label_avail_w - label_size.x - extra_w) * style.SeparatorTextAlign.x), pos.y + text_baseline_y); // FIXME-ALIGN + + // This allows using SameLine() to position something in the 'extra_w' + window->DC.CursorPosPrevLine.x = label_pos.x + label_size.x; + + const ImU32 separator_col = GetColorU32(ImGuiCol_Separator); + if (label_size.x > 0.0f) + { + const float sep1_x2 = label_pos.x - style.ItemSpacing.x; + const float sep2_x1 = label_pos.x + label_size.x + extra_w + style.ItemSpacing.x; + if (sep1_x2 > sep1_x1 && separator_thickness > 0.0f) + window->DrawList->AddLine(ImVec2(sep1_x1, seps_y), ImVec2(sep1_x2, seps_y), separator_col, separator_thickness); + if (sep2_x2 > sep2_x1 && separator_thickness > 0.0f) + window->DrawList->AddLine(ImVec2(sep2_x1, seps_y), ImVec2(sep2_x2, seps_y), separator_col, separator_thickness); + if (g.LogEnabled) + LogSetNextTextDecoration("---", NULL); + RenderTextEllipsis(window->DrawList, label_pos, ImVec2(bb.Max.x, bb.Max.y + style.ItemSpacing.y), bb.Max.x, bb.Max.x, label, label_end, &label_size); + } + else + { + if (g.LogEnabled) + LogText("---"); + if (separator_thickness > 0.0f) + window->DrawList->AddLine(ImVec2(sep1_x1, seps_y), ImVec2(sep2_x2, seps_y), separator_col, separator_thickness); + } +} + +void ImGui::SeparatorText(const char* label) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + + // The SeparatorText() vs SeparatorTextEx() distinction is designed to be considerate that we may want: + // - allow headers to be draggable items (would require a stable ID + a noticeable highlight) + // - this high-level entry point to allow formatting? (may require ID separate from formatted string) + // - because of this we probably can't turn 'const char* label' into 'const char* fmt, ...' + // Otherwise, we can decide that users wanting to drag this would layout a dedicated drag-item, + // and then we can turn this into a format function. + SeparatorTextEx(0, label, FindRenderedTextEnd(label), 0.0f); +} + +// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise. +bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend, float hover_visibility_delay, ImU32 bg_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + if (!ItemAdd(bb, id, NULL, ImGuiItemFlags_NoNav)) + return false; + + bool hovered, held; + ImRect bb_interact = bb; + bb_interact.Expand(axis == ImGuiAxis_Y ? ImVec2(0.0f, hover_extend) : ImVec2(hover_extend, 0.0f)); + ButtonBehavior(bb_interact, id, &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_AllowItemOverlap); + if (hovered) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredRect; // for IsItemHovered(), because bb_interact is larger than bb + if (g.ActiveId != id) + SetItemAllowOverlap(); + + if (held || (hovered && g.HoveredIdPreviousFrame == id && g.HoveredIdTimer >= hover_visibility_delay)) + SetMouseCursor(axis == ImGuiAxis_Y ? ImGuiMouseCursor_ResizeNS : ImGuiMouseCursor_ResizeEW); + + ImRect bb_render = bb; + if (held) + { + ImVec2 mouse_delta_2d = g.IO.MousePos - g.ActiveIdClickOffset - bb_interact.Min; + float mouse_delta = (axis == ImGuiAxis_Y) ? mouse_delta_2d.y : mouse_delta_2d.x; + + // Minimum pane size + float size_1_maximum_delta = ImMax(0.0f, *size1 - min_size1); + float size_2_maximum_delta = ImMax(0.0f, *size2 - min_size2); + if (mouse_delta < -size_1_maximum_delta) + mouse_delta = -size_1_maximum_delta; + if (mouse_delta > size_2_maximum_delta) + mouse_delta = size_2_maximum_delta; + + // Apply resize + if (mouse_delta != 0.0f) + { + if (mouse_delta < 0.0f) + IM_ASSERT(*size1 + mouse_delta >= min_size1); + if (mouse_delta > 0.0f) + IM_ASSERT(*size2 - mouse_delta >= min_size2); + *size1 += mouse_delta; + *size2 -= mouse_delta; + bb_render.Translate((axis == ImGuiAxis_X) ? ImVec2(mouse_delta, 0.0f) : ImVec2(0.0f, mouse_delta)); + MarkItemEdited(id); + } + } + + // Render at new position + if (bg_col & IM_COL32_A_MASK) + window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, bg_col, 0.0f); + const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator); + window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f); + + return held; +} + +static int IMGUI_CDECL ShrinkWidthItemComparer(const void* lhs, const void* rhs) +{ + const ImGuiShrinkWidthItem* a = (const ImGuiShrinkWidthItem*)lhs; + const ImGuiShrinkWidthItem* b = (const ImGuiShrinkWidthItem*)rhs; + if (int d = (int)(b->Width - a->Width)) + return d; + return (b->Index - a->Index); +} + +// Shrink excess width from a set of item, by removing width from the larger items first. +// Set items Width to -1.0f to disable shrinking this item. +void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess) +{ + if (count == 1) + { + if (items[0].Width >= 0.0f) + items[0].Width = ImMax(items[0].Width - width_excess, 1.0f); + return; + } + ImQsort(items, (size_t)count, sizeof(ImGuiShrinkWidthItem), ShrinkWidthItemComparer); + int count_same_width = 1; + while (width_excess > 0.0f && count_same_width < count) + { + while (count_same_width < count && items[0].Width <= items[count_same_width].Width) + count_same_width++; + float max_width_to_remove_per_item = (count_same_width < count && items[count_same_width].Width >= 0.0f) ? (items[0].Width - items[count_same_width].Width) : (items[0].Width - 1.0f); + if (max_width_to_remove_per_item <= 0.0f) + break; + float width_to_remove_per_item = ImMin(width_excess / count_same_width, max_width_to_remove_per_item); + for (int item_n = 0; item_n < count_same_width; item_n++) + items[item_n].Width -= width_to_remove_per_item; + width_excess -= width_to_remove_per_item * count_same_width; + } + + // Round width and redistribute remainder + // Ensure that e.g. the right-most tab of a shrunk tab-bar always reaches exactly at the same distance from the right-most edge of the tab bar separator. + width_excess = 0.0f; + for (int n = 0; n < count; n++) + { + float width_rounded = ImFloor(items[n].Width); + width_excess += items[n].Width - width_rounded; + items[n].Width = width_rounded; + } + while (width_excess > 0.0f) + for (int n = 0; n < count && width_excess > 0.0f; n++) + { + float width_to_add = ImMin(items[n].InitialWidth - items[n].Width, 1.0f); + items[n].Width += width_to_add; + width_excess -= width_to_add; + } +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ComboBox +//------------------------------------------------------------------------- +// - CalcMaxPopupHeightFromItemCount() [Internal] +// - BeginCombo() +// - BeginComboPopup() [Internal] +// - EndCombo() +// - BeginComboPreview() [Internal] +// - EndComboPreview() [Internal] +// - Combo() +//------------------------------------------------------------------------- + +static float CalcMaxPopupHeightFromItemCount(int items_count) +{ + ImGuiContext& g = *GImGui; + if (items_count <= 0) + return FLT_MAX; + return (g.FontSize + g.Style.ItemSpacing.y) * items_count - g.Style.ItemSpacing.y + (g.Style.WindowPadding.y * 2); +} + +bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + + ImGuiNextWindowDataFlags backup_next_window_data_flags = g.NextWindowData.Flags; + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + IM_ASSERT((flags & (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)) != (ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_NoPreview)); // Can't use both flags together + + const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight(); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth(); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(bb.Min, bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &bb)) + return false; + + // Open on click + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + const ImGuiID popup_id = ImHashStr("##ComboPopup", 0, id); + bool popup_open = IsPopupOpen(popup_id, ImGuiPopupFlags_None); + if (pressed && !popup_open) + { + OpenPopupEx(popup_id, ImGuiPopupFlags_None); + popup_open = true; + } + + // Render shape + const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + const float value_x2 = ImMax(bb.Min.x, bb.Max.x - arrow_size); + RenderNavHighlight(bb, id); + if (!(flags & ImGuiComboFlags_NoPreview)) + window->DrawList->AddRectFilled(bb.Min, ImVec2(value_x2, bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersLeft); + if (!(flags & ImGuiComboFlags_NoArrowButton)) + { + ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button); + ImU32 text_col = GetColorU32(ImGuiCol_Text); + window->DrawList->AddRectFilled(ImVec2(value_x2, bb.Min.y), bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawFlags_RoundCornersAll : ImDrawFlags_RoundCornersRight); + if (value_x2 + arrow_size - style.FramePadding.x <= bb.Max.x) + RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f); + } + RenderFrameBorder(bb.Min, bb.Max, style.FrameRounding); + + // Custom preview + if (flags & ImGuiComboFlags_CustomPreview) + { + g.ComboPreviewData.PreviewRect = ImRect(bb.Min.x, bb.Min.y, value_x2, bb.Max.y); + IM_ASSERT(preview_value == NULL || preview_value[0] == 0); + preview_value = NULL; + } + + // Render preview and label + if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview)) + { + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(bb.Min + style.FramePadding, ImVec2(value_x2, bb.Max.y), preview_value, NULL, NULL); + } + if (label_size.x > 0) + RenderText(ImVec2(bb.Max.x + style.ItemInnerSpacing.x, bb.Min.y + style.FramePadding.y), label); + + if (!popup_open) + return false; + + g.NextWindowData.Flags = backup_next_window_data_flags; + return BeginComboPopup(popup_id, bb, flags); +} + +bool ImGui::BeginComboPopup(ImGuiID popup_id, const ImRect& bb, ImGuiComboFlags flags) +{ + ImGuiContext& g = *GImGui; + if (!IsPopupOpen(popup_id, ImGuiPopupFlags_None)) + { + g.NextWindowData.ClearFlags(); + return false; + } + + // Set popup size + float w = bb.GetWidth(); + if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) + { + g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w); + } + else + { + if ((flags & ImGuiComboFlags_HeightMask_) == 0) + flags |= ImGuiComboFlags_HeightRegular; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiComboFlags_HeightMask_)); // Only one + int popup_max_height_in_items = -1; + if (flags & ImGuiComboFlags_HeightRegular) popup_max_height_in_items = 8; + else if (flags & ImGuiComboFlags_HeightSmall) popup_max_height_in_items = 4; + else if (flags & ImGuiComboFlags_HeightLarge) popup_max_height_in_items = 20; + ImVec2 constraint_min(0.0f, 0.0f), constraint_max(FLT_MAX, FLT_MAX); + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) == 0 || g.NextWindowData.SizeVal.x <= 0.0f) // Don't apply constraints if user specified a size + constraint_min.x = w; + if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) == 0 || g.NextWindowData.SizeVal.y <= 0.0f) + constraint_max.y = CalcMaxPopupHeightFromItemCount(popup_max_height_in_items); + SetNextWindowSizeConstraints(constraint_min, constraint_max); + } + + // This is essentially a specialized version of BeginPopupEx() + char name[16]; + ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth + + // Set position given a custom constraint (peak into expected window size so we can position it) + // FIXME: This might be easier to express with an hypothetical SetNextWindowPosConstraints() function? + // FIXME: This might be moved to Begin() or at least around the same spot where Tooltips and other Popups are calling FindBestWindowPosForPopupEx()? + if (ImGuiWindow* popup_window = FindWindowByName(name)) + if (popup_window->WasActive) + { + // Always override 'AutoPosLastDirection' to not leave a chance for a past value to affect us. + ImVec2 size_expected = CalcWindowNextAutoFitSize(popup_window); + popup_window->AutoPosLastDirection = (flags & ImGuiComboFlags_PopupAlignLeft) ? ImGuiDir_Left : ImGuiDir_Down; // Left = "Below, Toward Left", Down = "Below, Toward Right (default)" + ImRect r_outer = GetPopupAllowedExtentRect(popup_window); + ImVec2 pos = FindBestWindowPosForPopupEx(bb.GetBL(), size_expected, &popup_window->AutoPosLastDirection, r_outer, bb, ImGuiPopupPositionPolicy_ComboBox); + SetNextWindowPos(pos); + } + + // We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx() + ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove; + PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(g.Style.FramePadding.x, g.Style.WindowPadding.y)); // Horizontally align ourselves with the framed text + bool ret = Begin(name, NULL, window_flags); + PopStyleVar(); + if (!ret) + { + EndPopup(); + IM_ASSERT(0); // This should never happen as we tested for IsPopupOpen() above + return false; + } + return true; +} + +void ImGui::EndCombo() +{ + EndPopup(); +} + +// Call directly after the BeginCombo/EndCombo block. The preview is designed to only host non-interactive elements +// (Experimental, see GitHub issues: #1658, #4168) +bool ImGui::BeginComboPreview() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; + + if (window->SkipItems || !(g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible)) + return false; + IM_ASSERT(g.LastItemData.Rect.Min.x == preview_data->PreviewRect.Min.x && g.LastItemData.Rect.Min.y == preview_data->PreviewRect.Min.y); // Didn't call after BeginCombo/EndCombo block or forgot to pass ImGuiComboFlags_CustomPreview flag? + if (!window->ClipRect.Contains(preview_data->PreviewRect)) // Narrower test (optional) + return false; + + // FIXME: This could be contained in a PushWorkRect() api + preview_data->BackupCursorPos = window->DC.CursorPos; + preview_data->BackupCursorMaxPos = window->DC.CursorMaxPos; + preview_data->BackupCursorPosPrevLine = window->DC.CursorPosPrevLine; + preview_data->BackupPrevLineTextBaseOffset = window->DC.PrevLineTextBaseOffset; + preview_data->BackupLayout = window->DC.LayoutType; + window->DC.CursorPos = preview_data->PreviewRect.Min + g.Style.FramePadding; + window->DC.CursorMaxPos = window->DC.CursorPos; + window->DC.LayoutType = ImGuiLayoutType_Horizontal; + window->DC.IsSameLine = false; + PushClipRect(preview_data->PreviewRect.Min, preview_data->PreviewRect.Max, true); + + return true; +} + +void ImGui::EndComboPreview() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiComboPreviewData* preview_data = &g.ComboPreviewData; + + // FIXME: Using CursorMaxPos approximation instead of correct AABB which we will store in ImDrawCmd in the future + ImDrawList* draw_list = window->DrawList; + if (window->DC.CursorMaxPos.x < preview_data->PreviewRect.Max.x && window->DC.CursorMaxPos.y < preview_data->PreviewRect.Max.y) + if (draw_list->CmdBuffer.Size > 1) // Unlikely case that the PushClipRect() didn't create a command + { + draw_list->_CmdHeader.ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 1].ClipRect = draw_list->CmdBuffer[draw_list->CmdBuffer.Size - 2].ClipRect; + draw_list->_TryMergeDrawCmds(); + } + PopClipRect(); + window->DC.CursorPos = preview_data->BackupCursorPos; + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, preview_data->BackupCursorMaxPos); + window->DC.CursorPosPrevLine = preview_data->BackupCursorPosPrevLine; + window->DC.PrevLineTextBaseOffset = preview_data->BackupPrevLineTextBaseOffset; + window->DC.LayoutType = preview_data->BackupLayout; + window->DC.IsSameLine = false; + preview_data->PreviewRect = ImRect(); +} + +// Getter for the old Combo() API: const char*[] +static bool Items_ArrayGetter(void* data, int idx, const char** out_text) +{ + const char* const* items = (const char* const*)data; + if (out_text) + *out_text = items[idx]; + return true; +} + +// Getter for the old Combo() API: "item1\0item2\0item3\0" +static bool Items_SingleStringGetter(void* data, int idx, const char** out_text) +{ + // FIXME-OPT: we could pre-compute the indices to fasten this. But only 1 active combo means the waste is limited. + const char* items_separated_by_zeros = (const char*)data; + int items_count = 0; + const char* p = items_separated_by_zeros; + while (*p) + { + if (idx == items_count) + break; + p += strlen(p) + 1; + items_count++; + } + if (!*p) + return false; + if (out_text) + *out_text = p; + return true; +} + +// Old API, prefer using BeginCombo() nowadays if you can. +bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int popup_max_height_in_items) +{ + ImGuiContext& g = *GImGui; + + // Call the getter to obtain the preview string which is a parameter to BeginCombo() + const char* preview_value = NULL; + if (*current_item >= 0 && *current_item < items_count) + items_getter(data, *current_item, &preview_value); + + // The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here. + if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)) + SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items))); + + if (!BeginCombo(label, preview_value, ImGuiComboFlags_None)) + return false; + + // Display items + // FIXME-OPT: Use clipper (but we need to disable it on the appearing frame to make sure our call to SetItemDefaultFocus() is processed) + bool value_changed = false; + for (int i = 0; i < items_count; i++) + { + PushID(i); + const bool item_selected = (i == *current_item); + const char* item_text; + if (!items_getter(data, i, &item_text)) + item_text = "*Unknown item*"; + if (Selectable(item_text, item_selected)) + { + value_changed = true; + *current_item = i; + } + if (item_selected) + SetItemDefaultFocus(); + PopID(); + } + + EndCombo(); + + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +// Combo box helper allowing to pass an array of strings. +bool ImGui::Combo(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items) +{ + const bool value_changed = Combo(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_in_items); + return value_changed; +} + +// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0" +bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items) +{ + int items_count = 0; + const char* p = items_separated_by_zeros; // FIXME-OPT: Avoid computing this, or at least only when combo is open + while (*p) + { + p += strlen(p) + 1; + items_count++; + } + bool value_changed = Combo(label, current_item, Items_SingleStringGetter, (void*)items_separated_by_zeros, items_count, height_in_items); + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Data Type and Data Formatting Helpers [Internal] +//------------------------------------------------------------------------- +// - DataTypeGetInfo() +// - DataTypeFormatString() +// - DataTypeApplyOp() +// - DataTypeApplyOpFromText() +// - DataTypeCompare() +// - DataTypeClamp() +// - GetMinimumStepAtDecimalPrecision +// - RoundScalarWithFormat<>() +//------------------------------------------------------------------------- + +static const ImGuiDataTypeInfo GDataTypeInfo[] = +{ + { sizeof(char), "S8", "%d", "%d" }, // ImGuiDataType_S8 + { sizeof(unsigned char), "U8", "%u", "%u" }, + { sizeof(short), "S16", "%d", "%d" }, // ImGuiDataType_S16 + { sizeof(unsigned short), "U16", "%u", "%u" }, + { sizeof(int), "S32", "%d", "%d" }, // ImGuiDataType_S32 + { sizeof(unsigned int), "U32", "%u", "%u" }, +#ifdef _MSC_VER + { sizeof(ImS64), "S64", "%I64d","%I64d" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%I64u","%I64u" }, +#else + { sizeof(ImS64), "S64", "%lld", "%lld" }, // ImGuiDataType_S64 + { sizeof(ImU64), "U64", "%llu", "%llu" }, +#endif + { sizeof(float), "float", "%.3f","%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg) + { sizeof(double), "double","%f", "%lf" }, // ImGuiDataType_Double +}; +IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT); + +const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type) +{ + IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT); + return &GDataTypeInfo[data_type]; +} + +int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format) +{ + // Signedness doesn't matter when pushing integer arguments + if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) + return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data); + if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) + return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data); + if (data_type == ImGuiDataType_Float) + return ImFormatString(buf, buf_size, format, *(const float*)p_data); + if (data_type == ImGuiDataType_Double) + return ImFormatString(buf, buf_size, format, *(const double*)p_data); + if (data_type == ImGuiDataType_S8) + return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data); + if (data_type == ImGuiDataType_U8) + return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data); + if (data_type == ImGuiDataType_S16) + return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data); + if (data_type == ImGuiDataType_U16) + return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data); + IM_ASSERT(0); + return 0; +} + +void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, const void* arg1, const void* arg2) +{ + IM_ASSERT(op == '+' || op == '-'); + switch (data_type) + { + case ImGuiDataType_S8: + if (op == '+') { *(ImS8*)output = ImAddClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } + if (op == '-') { *(ImS8*)output = ImSubClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); } + return; + case ImGuiDataType_U8: + if (op == '+') { *(ImU8*)output = ImAddClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } + if (op == '-') { *(ImU8*)output = ImSubClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); } + return; + case ImGuiDataType_S16: + if (op == '+') { *(ImS16*)output = ImAddClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } + if (op == '-') { *(ImS16*)output = ImSubClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); } + return; + case ImGuiDataType_U16: + if (op == '+') { *(ImU16*)output = ImAddClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } + if (op == '-') { *(ImU16*)output = ImSubClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); } + return; + case ImGuiDataType_S32: + if (op == '+') { *(ImS32*)output = ImAddClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } + if (op == '-') { *(ImS32*)output = ImSubClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); } + return; + case ImGuiDataType_U32: + if (op == '+') { *(ImU32*)output = ImAddClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } + if (op == '-') { *(ImU32*)output = ImSubClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); } + return; + case ImGuiDataType_S64: + if (op == '+') { *(ImS64*)output = ImAddClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } + if (op == '-') { *(ImS64*)output = ImSubClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); } + return; + case ImGuiDataType_U64: + if (op == '+') { *(ImU64*)output = ImAddClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } + if (op == '-') { *(ImU64*)output = ImSubClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); } + return; + case ImGuiDataType_Float: + if (op == '+') { *(float*)output = *(const float*)arg1 + *(const float*)arg2; } + if (op == '-') { *(float*)output = *(const float*)arg1 - *(const float*)arg2; } + return; + case ImGuiDataType_Double: + if (op == '+') { *(double*)output = *(const double*)arg1 + *(const double*)arg2; } + if (op == '-') { *(double*)output = *(const double*)arg1 - *(const double*)arg2; } + return; + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); +} + +// User can input math operators (e.g. +100) to edit a numerical values. +// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess.. +bool ImGui::DataTypeApplyFromText(const char* buf, ImGuiDataType data_type, void* p_data, const char* format) +{ + while (ImCharIsBlankA(*buf)) + buf++; + if (!buf[0]) + return false; + + // Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all. + const ImGuiDataTypeInfo* type_info = DataTypeGetInfo(data_type); + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, type_info->Size); + + // Sanitize format + // For float/double we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in, so force them into %f and %lf + char format_sanitized[32]; + if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) + format = type_info->ScanFmt; + else + format = ImParseFormatSanitizeForScanning(format, format_sanitized, IM_ARRAYSIZE(format_sanitized)); + + // Small types need a 32-bit buffer to receive the result from scanf() + int v32 = 0; + if (sscanf(buf, format, type_info->Size >= 4 ? p_data : &v32) < 1) + return false; + if (type_info->Size < 4) + { + if (data_type == ImGuiDataType_S8) + *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX); + else if (data_type == ImGuiDataType_U8) + *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX); + else if (data_type == ImGuiDataType_S16) + *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX); + else if (data_type == ImGuiDataType_U16) + *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX); + else + IM_ASSERT(0); + } + + return memcmp(&data_backup, p_data, type_info->Size) != 0; +} + +template +static int DataTypeCompareT(const T* lhs, const T* rhs) +{ + if (*lhs < *rhs) return -1; + if (*lhs > *rhs) return +1; + return 0; +} + +int ImGui::DataTypeCompare(ImGuiDataType data_type, const void* arg_1, const void* arg_2) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeCompareT((const ImS8* )arg_1, (const ImS8* )arg_2); + case ImGuiDataType_U8: return DataTypeCompareT((const ImU8* )arg_1, (const ImU8* )arg_2); + case ImGuiDataType_S16: return DataTypeCompareT((const ImS16* )arg_1, (const ImS16* )arg_2); + case ImGuiDataType_U16: return DataTypeCompareT((const ImU16* )arg_1, (const ImU16* )arg_2); + case ImGuiDataType_S32: return DataTypeCompareT((const ImS32* )arg_1, (const ImS32* )arg_2); + case ImGuiDataType_U32: return DataTypeCompareT((const ImU32* )arg_1, (const ImU32* )arg_2); + case ImGuiDataType_S64: return DataTypeCompareT((const ImS64* )arg_1, (const ImS64* )arg_2); + case ImGuiDataType_U64: return DataTypeCompareT((const ImU64* )arg_1, (const ImU64* )arg_2); + case ImGuiDataType_Float: return DataTypeCompareT((const float* )arg_1, (const float* )arg_2); + case ImGuiDataType_Double: return DataTypeCompareT((const double*)arg_1, (const double*)arg_2); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return 0; +} + +template +static bool DataTypeClampT(T* v, const T* v_min, const T* v_max) +{ + // Clamp, both sides are optional, return true if modified + if (v_min && *v < *v_min) { *v = *v_min; return true; } + if (v_max && *v > *v_max) { *v = *v_max; return true; } + return false; +} + +bool ImGui::DataTypeClamp(ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max) +{ + switch (data_type) + { + case ImGuiDataType_S8: return DataTypeClampT((ImS8* )p_data, (const ImS8* )p_min, (const ImS8* )p_max); + case ImGuiDataType_U8: return DataTypeClampT((ImU8* )p_data, (const ImU8* )p_min, (const ImU8* )p_max); + case ImGuiDataType_S16: return DataTypeClampT((ImS16* )p_data, (const ImS16* )p_min, (const ImS16* )p_max); + case ImGuiDataType_U16: return DataTypeClampT((ImU16* )p_data, (const ImU16* )p_min, (const ImU16* )p_max); + case ImGuiDataType_S32: return DataTypeClampT((ImS32* )p_data, (const ImS32* )p_min, (const ImS32* )p_max); + case ImGuiDataType_U32: return DataTypeClampT((ImU32* )p_data, (const ImU32* )p_min, (const ImU32* )p_max); + case ImGuiDataType_S64: return DataTypeClampT((ImS64* )p_data, (const ImS64* )p_min, (const ImS64* )p_max); + case ImGuiDataType_U64: return DataTypeClampT((ImU64* )p_data, (const ImU64* )p_min, (const ImU64* )p_max); + case ImGuiDataType_Float: return DataTypeClampT((float* )p_data, (const float* )p_min, (const float* )p_max); + case ImGuiDataType_Double: return DataTypeClampT((double*)p_data, (const double*)p_min, (const double*)p_max); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +static float GetMinimumStepAtDecimalPrecision(int decimal_precision) +{ + static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f }; + if (decimal_precision < 0) + return FLT_MIN; + return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision); +} + +template +TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, TYPE v) +{ + IM_UNUSED(data_type); + IM_ASSERT(data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double); + const char* fmt_start = ImParseFormatFindStart(format); + if (fmt_start[0] != '%' || fmt_start[1] == '%') // Don't apply if the value is not visible in the format string + return v; + + // Sanitize format + char fmt_sanitized[32]; + ImParseFormatSanitizeForPrinting(fmt_start, fmt_sanitized, IM_ARRAYSIZE(fmt_sanitized)); + fmt_start = fmt_sanitized; + + // Format value with our rounding, and read back + char v_str[64]; + ImFormatString(v_str, IM_ARRAYSIZE(v_str), fmt_start, v); + const char* p = v_str; + while (*p == ' ') + p++; + v = (TYPE)ImAtof(p); + + return v; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: DragScalar, DragFloat, DragInt, etc. +//------------------------------------------------------------------------- +// - DragBehaviorT<>() [Internal] +// - DragBehavior() [Internal] +// - DragScalar() +// - DragScalarN() +// - DragFloat() +// - DragFloat2() +// - DragFloat3() +// - DragFloat4() +// - DragFloatRange2() +// - DragInt() +// - DragInt2() +// - DragInt3() +// - DragInt4() +// - DragIntRange2() +//------------------------------------------------------------------------- + +// This is called by DragBehavior() when the widget is active (held by mouse or being manipulated with Nav controls) +template +bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiContext& g = *GImGui; + const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; + const bool is_clamped = (v_min < v_max); + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + + // Default tweak speed + if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX)) + v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio); + + // Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings + float adjust_delta = 0.0f; + if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) + { + adjust_delta = g.IO.MouseDelta[axis]; + if (g.IO.KeyAlt) + adjust_delta *= 1.0f / 100.0f; + if (g.IO.KeyShift) + adjust_delta *= 10.0f; + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; + const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); + const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); + const float tweak_factor = tweak_slow ? 1.0f / 1.0f : tweak_fast ? 10.0f : 1.0f; + adjust_delta = GetNavTweakPressedAmount(axis) * tweak_factor; + v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision)); + } + adjust_delta *= v_speed; + + // For vertical drag we currently assume that Up=higher value (like we do with vertical sliders). This may become a parameter. + if (axis == ImGuiAxis_Y) + adjust_delta = -adjust_delta; + + // For logarithmic use our range is effectively 0..1 so scale the delta into that range + if (is_logarithmic && (v_max - v_min < FLT_MAX) && ((v_max - v_min) > 0.000001f)) // Epsilon to avoid /0 + adjust_delta /= (float)(v_max - v_min); + + // Clear current value on activation + // Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300. + bool is_just_activated = g.ActiveIdIsJustActivated; + bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f)); + if (is_just_activated || is_already_past_limits_and_pushing_outward) + { + g.DragCurrentAccum = 0.0f; + g.DragCurrentAccumDirty = false; + } + else if (adjust_delta != 0.0f) + { + g.DragCurrentAccum += adjust_delta; + g.DragCurrentAccumDirty = true; + } + + if (!g.DragCurrentAccumDirty) + return false; + + TYPE v_cur = *v; + FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f; + + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + const float zero_deadzone_halfsize = 0.0f; // Drag widgets have no deadzone (as it doesn't make sense) + if (is_logarithmic) + { + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + + // Convert to parametric space, apply delta, convert back + float v_old_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + float v_new_parametric = v_old_parametric + g.DragCurrentAccum; + v_cur = ScaleValueFromRatioT(data_type, v_new_parametric, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + v_old_ref_for_accum_remainder = v_old_parametric; + } + else + { + v_cur += (SIGNEDTYPE)g.DragCurrentAccum; + } + + // Round to user desired precision based on format string + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_cur = RoundScalarWithFormatT(format, data_type, v_cur); + + // Preserve remainder after rounding has been applied. This also allow slow tweaking of values. + g.DragCurrentAccumDirty = false; + if (is_logarithmic) + { + // Convert to parametric space, apply delta, convert back + float v_new_parametric = ScaleRatioFromValueT(data_type, v_cur, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + g.DragCurrentAccum -= (float)(v_new_parametric - v_old_ref_for_accum_remainder); + } + else + { + g.DragCurrentAccum -= (float)((SIGNEDTYPE)v_cur - (SIGNEDTYPE)*v); + } + + // Lose zero sign for float/double + if (v_cur == (TYPE)-0) + v_cur = (TYPE)0; + + // Clamp values (+ handle overflow/wrap-around for integer types) + if (*v != v_cur && is_clamped) + { + if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_floating_point)) + v_cur = v_min; + if (v_cur > v_max || (v_cur < *v && adjust_delta > 0.0f && !is_floating_point)) + v_cur = v_max; + } + + // Apply result + if (*v == v_cur) + return false; + *v = v_cur; + return true; +} + +bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flags! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + + ImGuiContext& g = *GImGui; + if (g.ActiveId == id) + { + // Those are the things we can do easily outside the DragBehaviorT<> template, saves code generation. + if (g.ActiveIdSource == ImGuiInputSource_Mouse && !g.IO.MouseDown[0]) + ClearActiveID(); + else if (g.ActiveIdSource == ImGuiInputSource_Nav && g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + ClearActiveID(); + } + if (g.ActiveId != id) + return false; + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; + + switch (data_type) + { + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN, p_max ? *(const ImS8*)p_max : IM_S8_MAX, format, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN, p_max ? *(const ImU8*)p_max : IM_U8_MAX, format, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } + case ImGuiDataType_S32: return DragBehaviorT(data_type, (ImS32*)p_v, v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, flags); + case ImGuiDataType_U32: return DragBehaviorT(data_type, (ImU32*)p_v, v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, flags); + case ImGuiDataType_S64: return DragBehaviorT(data_type, (ImS64*)p_v, v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, flags); + case ImGuiDataType_U64: return DragBehaviorT(data_type, (ImU64*)p_v, v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, flags); + case ImGuiDataType_Float: return DragBehaviorT(data_type, (float*)p_v, v_speed, p_min ? *(const float* )p_min : -FLT_MAX, p_max ? *(const float* )p_max : FLT_MAX, format, flags); + case ImGuiDataType_Double: return DragBehaviorT(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX, p_max ? *(const double*)p_max : DBL_MAX, format, flags); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional. +// Read code of e.g. DragFloat(), DragInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const float w = CalcItemWidth(); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + + const bool hovered = ItemHoverable(frame_bb, id); + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); + if (!temp_input_is_active) + { + // Tabbing or CTRL-clicking on Drag turns it into an InputText + const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool clicked = hovered && IsMouseClicked(0, id); + const bool double_clicked = (hovered && g.IO.MouseClickedCount[0] == 2 && TestKeyOwner(ImGuiKey_MouseLeft, id)); + const bool make_active = (input_requested_by_tabbing || clicked || double_clicked || g.NavActivateId == id); + if (make_active && (clicked || double_clicked)) + SetKeyOwner(ImGuiKey_MouseLeft, id); + if (make_active && temp_input_allowed) + if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || double_clicked || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + temp_input_is_active = true; + + // (Optional) simple click (without moving) turns Drag into an InputText + if (g.IO.ConfigDragClickToInputText && temp_input_allowed && !temp_input_is_active) + if (g.ActiveId == id && hovered && g.IO.MouseReleased[0] && !IsMouseDragPastThreshold(0, g.IO.MouseDragThreshold * DRAG_MOUSE_THRESHOLD_FACTOR)) + { + g.NavActivateId = id; + g.NavActivateFlags = ImGuiActivateFlags_PreferInput; + temp_input_is_active = true; + } + + if (make_active && !temp_input_is_active) + { + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + } + } + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0 && (p_min == NULL || p_max == NULL || DataTypeCompare(data_type, p_min, p_max) < 0); + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding); + + // Drag behavior + const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, flags); + if (value_changed) + MarkItemEdited(id); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (temp_input_allowed ? ImGuiItemStatusFlags_Inputable : 0)); + return value_changed; +} + +bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, flags); + PopID(); + PopItemWidth(); + p_data = (void*)((char*)p_data + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::DragFloat(const char* label, float* v, float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalar(label, ImGuiDataType_Float, v, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat2(const char* label, float v[2], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 2, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat3(const char* label, float v[3], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 3, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragFloat4(const char* label, float v[4], float v_speed, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_Float, v, 4, v_speed, &v_min, &v_max, format, flags); +} + +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_current_max, float v_speed, float v_min, float v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + PushID(label); + BeginGroup(); + PushMultiItemsWidths(2, CalcItemWidth()); + + float min_min = (v_min >= v_max) ? -FLT_MAX : v_min; + float min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragScalar("##min", ImGuiDataType_Float, v_current_min, v_speed, &min_min, &min_max, format, min_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + float max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + float max_max = (v_min >= v_max) ? FLT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragScalar("##max", ImGuiDataType_Float, v_current_max, v_speed, &max_min, &max_max, format_max ? format_max : format, max_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + TextEx(label, FindRenderedTextEnd(label)); + EndGroup(); + PopID(); + + return value_changed; +} + +// NB: v_speed is float to allow adjusting the drag speed with more precision +bool ImGui::DragInt(const char* label, int* v, float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalar(label, ImGuiDataType_S32, v, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt2(const char* label, int v[2], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 2, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt3(const char* label, int v[3], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 3, v_speed, &v_min, &v_max, format, flags); +} + +bool ImGui::DragInt4(const char* label, int v[4], float v_speed, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return DragScalarN(label, ImGuiDataType_S32, v, 4, v_speed, &v_min, &v_max, format, flags); +} + +// NB: You likely want to specify the ImGuiSliderFlags_AlwaysClamp when using this. +bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed, int v_min, int v_max, const char* format, const char* format_max, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + PushID(label); + BeginGroup(); + PushMultiItemsWidths(2, CalcItemWidth()); + + int min_min = (v_min >= v_max) ? INT_MIN : v_min; + int min_max = (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max); + ImGuiSliderFlags min_flags = flags | ((min_min == min_max) ? ImGuiSliderFlags_ReadOnly : 0); + bool value_changed = DragInt("##min", v_current_min, v_speed, min_min, min_max, format, min_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + int max_min = (v_min >= v_max) ? *v_current_min : ImMax(v_min, *v_current_min); + int max_max = (v_min >= v_max) ? INT_MAX : v_max; + ImGuiSliderFlags max_flags = flags | ((max_min == max_max) ? ImGuiSliderFlags_ReadOnly : 0); + value_changed |= DragInt("##max", v_current_max, v_speed, max_min, max_max, format_max ? format_max : format, max_flags); + PopItemWidth(); + SameLine(0, g.Style.ItemInnerSpacing.x); + + TextEx(label, FindRenderedTextEnd(label)); + EndGroup(); + PopID(); + + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: SliderScalar, SliderFloat, SliderInt, etc. +//------------------------------------------------------------------------- +// - ScaleRatioFromValueT<> [Internal] +// - ScaleValueFromRatioT<> [Internal] +// - SliderBehaviorT<>() [Internal] +// - SliderBehavior() [Internal] +// - SliderScalar() +// - SliderScalarN() +// - SliderFloat() +// - SliderFloat2() +// - SliderFloat3() +// - SliderFloat4() +// - SliderAngle() +// - SliderInt() +// - SliderInt2() +// - SliderInt3() +// - SliderInt4() +// - VSliderScalar() +// - VSliderFloat() +// - VSliderInt() +//------------------------------------------------------------------------- + +// Convert a value v in the output space of a slider into a parametric position on the slider itself (the logical opposite of ScaleValueFromRatioT) +template +float ImGui::ScaleRatioFromValueT(ImGuiDataType data_type, TYPE v, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) +{ + if (v_min == v_max) + return 0.0f; + IM_UNUSED(data_type); + + const TYPE v_clamped = (v_min < v_max) ? ImClamp(v, v_min, v_max) : ImClamp(v, v_max, v_min); + if (is_logarithmic) + { + bool flipped = v_max < v_min; + + if (flipped) // Handle the case where the range is backwards + ImSwap(v_min, v_max); + + // Fudge min/max to avoid getting close to log(0) + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + // Awkward special cases - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_min == 0.0f) && (v_max < 0.0f)) + v_min_fudged = -logarithmic_zero_epsilon; + else if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float result; + if (v_clamped <= v_min_fudged) + result = 0.0f; // Workaround for values that are in-range but below our fudge + else if (v_clamped >= v_max_fudged) + result = 1.0f; // Workaround for values that are in-range but above our fudge + else if ((v_min * v_max) < 0.0f) // Range crosses zero, so split into two portions + { + float zero_point_center = (-(float)v_min) / ((float)v_max - (float)v_min); // The zero point in parametric space. There's an argument we should take the logarithmic nature into account when calculating this, but for now this should do (and the most common case of a symmetrical range works fine) + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (v == 0.0f) + result = zero_point_center; // Special case for exactly zero + else if (v < 0.0f) + result = (1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(-v_min_fudged / logarithmic_zero_epsilon))) * zero_point_snap_L; + else + result = zero_point_snap_R + ((float)(ImLog((FLOATTYPE)v_clamped / logarithmic_zero_epsilon) / ImLog(v_max_fudged / logarithmic_zero_epsilon)) * (1.0f - zero_point_snap_R)); + } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = 1.0f - (float)(ImLog(-(FLOATTYPE)v_clamped / -v_max_fudged) / ImLog(-v_min_fudged / -v_max_fudged)); + else + result = (float)(ImLog((FLOATTYPE)v_clamped / v_min_fudged) / ImLog(v_max_fudged / v_min_fudged)); + + return flipped ? (1.0f - result) : result; + } + else + { + // Linear slider + return (float)((FLOATTYPE)(SIGNEDTYPE)(v_clamped - v_min) / (FLOATTYPE)(SIGNEDTYPE)(v_max - v_min)); + } +} + +// Convert a parametric position on a slider into a value v in the output space (the logical opposite of ScaleRatioFromValueT) +template +TYPE ImGui::ScaleValueFromRatioT(ImGuiDataType data_type, float t, TYPE v_min, TYPE v_max, bool is_logarithmic, float logarithmic_zero_epsilon, float zero_deadzone_halfsize) +{ + // We special-case the extents because otherwise our logarithmic fudging can lead to "mathematically correct" + // but non-intuitive behaviors like a fully-left slider not actually reaching the minimum value. Also generally simpler. + if (t <= 0.0f || v_min == v_max) + return v_min; + if (t >= 1.0f) + return v_max; + + TYPE result = (TYPE)0; + if (is_logarithmic) + { + // Fudge min/max to avoid getting silly results close to zero + FLOATTYPE v_min_fudged = (ImAbs((FLOATTYPE)v_min) < logarithmic_zero_epsilon) ? ((v_min < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_min; + FLOATTYPE v_max_fudged = (ImAbs((FLOATTYPE)v_max) < logarithmic_zero_epsilon) ? ((v_max < 0.0f) ? -logarithmic_zero_epsilon : logarithmic_zero_epsilon) : (FLOATTYPE)v_max; + + const bool flipped = v_max < v_min; // Check if range is "backwards" + if (flipped) + ImSwap(v_min_fudged, v_max_fudged); + + // Awkward special case - we need ranges of the form (-100 .. 0) to convert to (-100 .. -epsilon), not (-100 .. epsilon) + if ((v_max == 0.0f) && (v_min < 0.0f)) + v_max_fudged = -logarithmic_zero_epsilon; + + float t_with_flip = flipped ? (1.0f - t) : t; // t, but flipped if necessary to account for us flipping the range + + if ((v_min * v_max) < 0.0f) // Range crosses zero, so we have to do this in two parts + { + float zero_point_center = (-(float)ImMin(v_min, v_max)) / ImAbs((float)v_max - (float)v_min); // The zero point in parametric space + float zero_point_snap_L = zero_point_center - zero_deadzone_halfsize; + float zero_point_snap_R = zero_point_center + zero_deadzone_halfsize; + if (t_with_flip >= zero_point_snap_L && t_with_flip <= zero_point_snap_R) + result = (TYPE)0.0f; // Special case to make getting exactly zero possible (the epsilon prevents it otherwise) + else if (t_with_flip < zero_point_center) + result = (TYPE)-(logarithmic_zero_epsilon * ImPow(-v_min_fudged / logarithmic_zero_epsilon, (FLOATTYPE)(1.0f - (t_with_flip / zero_point_snap_L)))); + else + result = (TYPE)(logarithmic_zero_epsilon * ImPow(v_max_fudged / logarithmic_zero_epsilon, (FLOATTYPE)((t_with_flip - zero_point_snap_R) / (1.0f - zero_point_snap_R)))); + } + else if ((v_min < 0.0f) || (v_max < 0.0f)) // Entirely negative slider + result = (TYPE)-(-v_max_fudged * ImPow(-v_min_fudged / -v_max_fudged, (FLOATTYPE)(1.0f - t_with_flip))); + else + result = (TYPE)(v_min_fudged * ImPow(v_max_fudged / v_min_fudged, (FLOATTYPE)t_with_flip)); + } + else + { + // Linear slider + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + if (is_floating_point) + { + result = ImLerp(v_min, v_max, t); + } + else if (t < 1.0) + { + // - For integer values we want the clicking position to match the grab box so we round above + // This code is carefully tuned to work with large values (e.g. high ranges of U64) while preserving this property.. + // - Not doing a *1.0 multiply at the end of a range as it tends to be lossy. While absolute aiming at a large s64/u64 + // range is going to be imprecise anyway, with this check we at least make the edge values matches expected limits. + FLOATTYPE v_new_off_f = (SIGNEDTYPE)(v_max - v_min) * t; + result = (TYPE)((SIGNEDTYPE)v_min + (SIGNEDTYPE)(v_new_off_f + (FLOATTYPE)(v_min > v_max ? -0.5 : 0.5))); + } + } + + return result; +} + +// FIXME: Try to move more of the code into shared SliderBehavior() +template +bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, TYPE* v, const TYPE v_min, const TYPE v_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) +{ + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X; + const bool is_logarithmic = (flags & ImGuiSliderFlags_Logarithmic) != 0; + const bool is_floating_point = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double); + const SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max); + + // Calculate bounds + const float grab_padding = 2.0f; // FIXME: Should be part of style. + const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f; + float grab_sz = style.GrabMinSize; + if (!is_floating_point && v_range >= 0) // v_range < 0 may happen on integer overflows + grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit + grab_sz = ImMin(grab_sz, slider_sz); + const float slider_usable_sz = slider_sz - grab_sz; + const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f; + const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f; + + float logarithmic_zero_epsilon = 0.0f; // Only valid when is_logarithmic is true + float zero_deadzone_halfsize = 0.0f; // Only valid when is_logarithmic is true + if (is_logarithmic) + { + // When using logarithmic sliders, we need to clamp to avoid hitting zero, but our choice of clamp value greatly affects slider precision. We attempt to use the specified precision to estimate a good lower bound. + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 1; + logarithmic_zero_epsilon = ImPow(0.1f, (float)decimal_precision); + zero_deadzone_halfsize = (style.LogSliderDeadzone * 0.5f) / ImMax(slider_usable_sz, 1.0f); + } + + // Process interacting with the slider + bool value_changed = false; + if (g.ActiveId == id) + { + bool set_new_value = false; + float clicked_t = 0.0f; + if (g.ActiveIdSource == ImGuiInputSource_Mouse) + { + if (!g.IO.MouseDown[0]) + { + ClearActiveID(); + } + else + { + const float mouse_abs_pos = g.IO.MousePos[axis]; + if (g.ActiveIdIsJustActivated) + { + float grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (axis == ImGuiAxis_Y) + grab_t = 1.0f - grab_t; + const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); + const bool clicked_around_grab = (mouse_abs_pos >= grab_pos - grab_sz * 0.5f - 1.0f) && (mouse_abs_pos <= grab_pos + grab_sz * 0.5f + 1.0f); // No harm being extra generous here. + g.SliderGrabClickOffset = (clicked_around_grab && is_floating_point) ? mouse_abs_pos - grab_pos : 0.0f; + } + if (slider_usable_sz > 0.0f) + clicked_t = ImSaturate((mouse_abs_pos - g.SliderGrabClickOffset - slider_usable_pos_min) / slider_usable_sz); + if (axis == ImGuiAxis_Y) + clicked_t = 1.0f - clicked_t; + set_new_value = true; + } + } + else if (g.ActiveIdSource == ImGuiInputSource_Nav) + { + if (g.ActiveIdIsJustActivated) + { + g.SliderCurrentAccum = 0.0f; // Reset any stored nav delta upon activation + g.SliderCurrentAccumDirty = false; + } + + float input_delta = (axis == ImGuiAxis_X) ? GetNavTweakPressedAmount(axis) : -GetNavTweakPressedAmount(axis); + if (input_delta != 0.0f) + { + const bool tweak_slow = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakSlow : ImGuiKey_NavKeyboardTweakSlow); + const bool tweak_fast = IsKeyDown((g.NavInputSource == ImGuiInputSource_Gamepad) ? ImGuiKey_NavGamepadTweakFast : ImGuiKey_NavKeyboardTweakFast); + const int decimal_precision = is_floating_point ? ImParseFormatPrecision(format, 3) : 0; + if (decimal_precision > 0) + { + input_delta /= 100.0f; // Gamepad/keyboard tweak speeds in % of slider bounds + if (tweak_slow) + input_delta /= 10.0f; + } + else + { + if ((v_range >= -100.0f && v_range <= 100.0f) || tweak_slow) + input_delta = ((input_delta < 0.0f) ? -1.0f : +1.0f) / (float)v_range; // Gamepad/keyboard tweak speeds in integer steps + else + input_delta /= 100.0f; + } + if (tweak_fast) + input_delta *= 10.0f; + + g.SliderCurrentAccum += input_delta; + g.SliderCurrentAccumDirty = true; + } + + float delta = g.SliderCurrentAccum; + if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated) + { + ClearActiveID(); + } + else if (g.SliderCurrentAccumDirty) + { + clicked_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + if ((clicked_t >= 1.0f && delta > 0.0f) || (clicked_t <= 0.0f && delta < 0.0f)) // This is to avoid applying the saturation when already past the limits + { + set_new_value = false; + g.SliderCurrentAccum = 0.0f; // If pushing up against the limits, don't continue to accumulate + } + else + { + set_new_value = true; + float old_clicked_t = clicked_t; + clicked_t = ImSaturate(clicked_t + delta); + + // Calculate what our "new" clicked_t will be, and thus how far we actually moved the slider, and subtract this from the accumulator + TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT(format, data_type, v_new); + float new_clicked_t = ScaleRatioFromValueT(data_type, v_new, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + if (delta > 0) + g.SliderCurrentAccum -= ImMin(new_clicked_t - old_clicked_t, delta); + else + g.SliderCurrentAccum -= ImMax(new_clicked_t - old_clicked_t, delta); + } + + g.SliderCurrentAccumDirty = false; + } + } + + if (set_new_value) + { + TYPE v_new = ScaleValueFromRatioT(data_type, clicked_t, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + + // Round to user desired precision based on format string + if (is_floating_point && !(flags & ImGuiSliderFlags_NoRoundToFormat)) + v_new = RoundScalarWithFormatT(format, data_type, v_new); + + // Apply result + if (*v != v_new) + { + *v = v_new; + value_changed = true; + } + } + } + + if (slider_sz < 1.0f) + { + *out_grab_bb = ImRect(bb.Min, bb.Min); + } + else + { + // Output grab position so it can be displayed by the caller + float grab_t = ScaleRatioFromValueT(data_type, *v, v_min, v_max, is_logarithmic, logarithmic_zero_epsilon, zero_deadzone_halfsize); + if (axis == ImGuiAxis_Y) + grab_t = 1.0f - grab_t; + const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t); + if (axis == ImGuiAxis_X) + *out_grab_bb = ImRect(grab_pos - grab_sz * 0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz * 0.5f, bb.Max.y - grab_padding); + else + *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz * 0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz * 0.5f); + } + + return value_changed; +} + +// For 32-bit and larger types, slider bounds are limited to half the natural type range. +// So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok. +// It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders. +bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags, ImRect* out_grab_bb) +{ + // Read imgui.cpp "API BREAKING CHANGES" section for 1.78 if you hit this assert. + IM_ASSERT((flags == 1 || (flags & ImGuiSliderFlags_InvalidMask_) == 0) && "Invalid ImGuiSliderFlags flag! Has the 'float power' argument been mistakenly cast to flags? Call function with ImGuiSliderFlags_Logarithmic flags instead."); + + // Those are the things we can do easily outside the SliderBehaviorT<> template, saves code generation. + ImGuiContext& g = *GImGui; + if ((g.LastItemData.InFlags & ImGuiItemFlags_ReadOnly) || (flags & ImGuiSliderFlags_ReadOnly)) + return false; + + switch (data_type) + { + case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; } + case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min, *(const ImU8*)p_max, format, flags, out_grab_bb); if (r) *(ImU8*)p_v = (ImU8)v32; return r; } + case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; } + case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; } + case ImGuiDataType_S32: + IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN / 2 && *(const ImS32*)p_max <= IM_S32_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImS32*)p_v, *(const ImS32*)p_min, *(const ImS32*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_U32: + IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImU32*)p_v, *(const ImU32*)p_min, *(const ImU32*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_S64: + IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN / 2 && *(const ImS64*)p_max <= IM_S64_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImS64*)p_v, *(const ImS64*)p_min, *(const ImS64*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_U64: + IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX / 2); + return SliderBehaviorT(bb, id, data_type, (ImU64*)p_v, *(const ImU64*)p_min, *(const ImU64*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_Float: + IM_ASSERT(*(const float*)p_min >= -FLT_MAX / 2.0f && *(const float*)p_max <= FLT_MAX / 2.0f); + return SliderBehaviorT(bb, id, data_type, (float*)p_v, *(const float*)p_min, *(const float*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_Double: + IM_ASSERT(*(const double*)p_min >= -DBL_MAX / 2.0f && *(const double*)p_max <= DBL_MAX / 2.0f); + return SliderBehaviorT(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, flags, out_grab_bb); + case ImGuiDataType_COUNT: break; + } + IM_ASSERT(0); + return false; +} + +// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required. +// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + const float w = CalcItemWidth(); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y * 2.0f)); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + const bool temp_input_allowed = (flags & ImGuiSliderFlags_NoInput) == 0; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, temp_input_allowed ? ImGuiItemFlags_Inputable : 0)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + + const bool hovered = ItemHoverable(frame_bb, id); + bool temp_input_is_active = temp_input_allowed && TempInputIsActive(id); + if (!temp_input_is_active) + { + // Tabbing or CTRL-clicking on Slider turns it into an input box + const bool input_requested_by_tabbing = temp_input_allowed && (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool clicked = hovered && IsMouseClicked(0, id); + const bool make_active = (input_requested_by_tabbing || clicked || g.NavActivateId == id); + if (make_active && clicked) + SetKeyOwner(ImGuiKey_MouseLeft, id); + if (make_active && temp_input_allowed) + if (input_requested_by_tabbing || (clicked && g.IO.KeyCtrl) || (g.NavActivateId == id && (g.NavActivateFlags & ImGuiActivateFlags_PreferInput))) + temp_input_is_active = true; + + if (make_active && !temp_input_is_active) + { + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + } + } + + if (temp_input_is_active) + { + // Only clamp CTRL+Click input when ImGuiSliderFlags_AlwaysClamp is set + const bool is_clamp_input = (flags & ImGuiSliderFlags_AlwaysClamp) != 0; + return TempInputScalar(frame_bb, id, label, data_type, p_data, format, is_clamp_input ? p_min : NULL, is_clamp_input ? p_max : NULL); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); + + // Slider behavior + ImRect grab_bb; + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags, &grab_bb); + if (value_changed) + MarkItemEdited(id); + + // Render grab + if (grab_bb.Max.x > grab_bb.Min.x) + window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + if (g.LogEnabled) + LogSetNextTextDecoration("{", "}"); + RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (temp_input_allowed ? ImGuiItemStatusFlags_Inputable : 0)); + return value_changed; +} + +// Add multiple sliders on 1 line for compact edition of multiple components +bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, flags); + PopID(); + PopItemWidth(); + v = (void*)((char*)v + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalar(label, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 2, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 3, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderFloat4(const char* label, float v[4], float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_Float, v, 4, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderAngle(const char* label, float* v_rad, float v_degrees_min, float v_degrees_max, const char* format, ImGuiSliderFlags flags) +{ + if (format == NULL) + format = "%.0f deg"; + float v_deg = (*v_rad) * 360.0f / (2 * IM_PI); + bool value_changed = SliderFloat(label, &v_deg, v_degrees_min, v_degrees_max, format, flags); + *v_rad = v_deg * (2 * IM_PI) / 360.0f; + return value_changed; +} + +bool ImGui::SliderInt(const char* label, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalar(label, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 2, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 3, &v_min, &v_max, format, flags); +} + +bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format, flags); +} + +bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, ImGuiSliderFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size); + const ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + + ItemSize(bb, style.FramePadding.y); + if (!ItemAdd(frame_bb, id)) + return false; + + // Default format string when passing NULL + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + + const bool hovered = ItemHoverable(frame_bb, id); + const bool clicked = hovered && IsMouseClicked(0, id); + if (clicked || g.NavActivateId == id) + { + if (clicked) + SetKeyOwner(ImGuiKey_MouseLeft, id); + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + } + + // Draw frame + const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg); + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, g.Style.FrameRounding); + + // Slider behavior + ImRect grab_bb; + const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, flags | ImGuiSliderFlags_Vertical, &grab_bb); + if (value_changed) + MarkItemEdited(id); + + // Render grab + if (grab_bb.Max.y > grab_bb.Min.y) + window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding); + + // Display value using user-provided display format so user can add prefix/suffix/decorations to the value. + // For the vertical slider we allow centered text to overlap the frame padding + char value_buf[64]; + const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format); + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.0f)); + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + return value_changed; +} + +bool ImGui::VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format, ImGuiSliderFlags flags) +{ + return VSliderScalar(label, size, ImGuiDataType_Float, v, &v_min, &v_max, format, flags); +} + +bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format, ImGuiSliderFlags flags) +{ + return VSliderScalar(label, size, ImGuiDataType_S32, v, &v_min, &v_max, format, flags); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: InputScalar, InputFloat, InputInt, etc. +//------------------------------------------------------------------------- +// - ImParseFormatFindStart() [Internal] +// - ImParseFormatFindEnd() [Internal] +// - ImParseFormatTrimDecorations() [Internal] +// - ImParseFormatSanitizeForPrinting() [Internal] +// - ImParseFormatSanitizeForScanning() [Internal] +// - ImParseFormatPrecision() [Internal] +// - TempInputTextScalar() [Internal] +// - InputScalar() +// - InputScalarN() +// - InputFloat() +// - InputFloat2() +// - InputFloat3() +// - InputFloat4() +// - InputInt() +// - InputInt2() +// - InputInt3() +// - InputInt4() +// - InputDouble() +//------------------------------------------------------------------------- + +// We don't use strchr() because our strings are usually very short and often start with '%' +const char* ImParseFormatFindStart(const char* fmt) +{ + while (char c = fmt[0]) + { + if (c == '%' && fmt[1] != '%') + return fmt; + else if (c == '%') + fmt++; + fmt++; + } + return fmt; +} + +const char* ImParseFormatFindEnd(const char* fmt) +{ + // Printf/scanf types modifiers: I/L/h/j/l/t/w/z. Other uppercase letters qualify as types aka end of the format. + if (fmt[0] != '%') + return fmt; + const unsigned int ignored_uppercase_mask = (1 << ('I'-'A')) | (1 << ('L'-'A')); + const unsigned int ignored_lowercase_mask = (1 << ('h'-'a')) | (1 << ('j'-'a')) | (1 << ('l'-'a')) | (1 << ('t'-'a')) | (1 << ('w'-'a')) | (1 << ('z'-'a')); + for (char c; (c = *fmt) != 0; fmt++) + { + if (c >= 'A' && c <= 'Z' && ((1 << (c - 'A')) & ignored_uppercase_mask) == 0) + return fmt + 1; + if (c >= 'a' && c <= 'z' && ((1 << (c - 'a')) & ignored_lowercase_mask) == 0) + return fmt + 1; + } + return fmt; +} + +// Extract the format out of a format string with leading or trailing decorations +// fmt = "blah blah" -> return fmt +// fmt = "%.3f" -> return fmt +// fmt = "hello %.3f" -> return fmt + 6 +// fmt = "%.3f hello" -> return buf written with "%.3f" +const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_size) +{ + const char* fmt_start = ImParseFormatFindStart(fmt); + if (fmt_start[0] != '%') + return fmt; + const char* fmt_end = ImParseFormatFindEnd(fmt_start); + if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data. + return fmt_start; + ImStrncpy(buf, fmt_start, ImMin((size_t)(fmt_end - fmt_start) + 1, buf_size)); + return buf; +} + +// Sanitize format +// - Zero terminate so extra characters after format (e.g. "%f123") don't confuse atof/atoi +// - stb_sprintf.h supports several new modifiers which format numbers in a way that also makes them incompatible atof/atoi. +void ImParseFormatSanitizeForPrinting(const char* fmt_in, char* fmt_out, size_t fmt_out_size) +{ + const char* fmt_end = ImParseFormatFindEnd(fmt_in); + IM_UNUSED(fmt_out_size); + IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! + while (fmt_in < fmt_end) + { + char c = *fmt_in++; + if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. + *(fmt_out++) = c; + } + *fmt_out = 0; // Zero-terminate +} + +// - For scanning we need to remove all width and precision fields "%3.7f" -> "%f". BUT don't strip types like "%I64d" which includes digits. ! "%07I64d" -> "%I64d" +const char* ImParseFormatSanitizeForScanning(const char* fmt_in, char* fmt_out, size_t fmt_out_size) +{ + const char* fmt_end = ImParseFormatFindEnd(fmt_in); + const char* fmt_out_begin = fmt_out; + IM_UNUSED(fmt_out_size); + IM_ASSERT((size_t)(fmt_end - fmt_in + 1) < fmt_out_size); // Format is too long, let us know if this happens to you! + bool has_type = false; + while (fmt_in < fmt_end) + { + char c = *fmt_in++; + if (!has_type && ((c >= '0' && c <= '9') || c == '.')) + continue; + has_type |= ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); // Stop skipping digits + if (c != '\'' && c != '$' && c != '_') // Custom flags provided by stb_sprintf.h. POSIX 2008 also supports '. + *(fmt_out++) = c; + } + *fmt_out = 0; // Zero-terminate + return fmt_out_begin; +} + +template +static const char* ImAtoi(const char* src, TYPE* output) +{ + int negative = 0; + if (*src == '-') { negative = 1; src++; } + if (*src == '+') { src++; } + TYPE v = 0; + while (*src >= '0' && *src <= '9') + v = (v * 10) + (*src++ - '0'); + *output = negative ? -v : v; + return src; +} + +// Parse display precision back from the display format string +// FIXME: This is still used by some navigation code path to infer a minimum tweak step, but we should aim to rework widgets so it isn't needed. +int ImParseFormatPrecision(const char* fmt, int default_precision) +{ + fmt = ImParseFormatFindStart(fmt); + if (fmt[0] != '%') + return default_precision; + fmt++; + while (*fmt >= '0' && *fmt <= '9') + fmt++; + int precision = INT_MAX; + if (*fmt == '.') + { + fmt = ImAtoi(fmt + 1, &precision); + if (precision < 0 || precision > 99) + precision = default_precision; + } + if (*fmt == 'e' || *fmt == 'E') // Maximum precision with scientific notation + precision = -1; + if ((*fmt == 'g' || *fmt == 'G') && precision == INT_MAX) + precision = -1; + return (precision == INT_MAX) ? default_precision : precision; +} + +// Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets) +// FIXME: Facilitate using this in variety of other situations. +bool ImGui::TempInputText(const ImRect& bb, ImGuiID id, const char* label, char* buf, int buf_size, ImGuiInputTextFlags flags) +{ + // On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id. + // We clear ActiveID on the first frame to allow the InputText() taking it back. + ImGuiContext& g = *GImGui; + const bool init = (g.TempInputId != id); + if (init) + ClearActiveID(); + + g.CurrentWindow->DC.CursorPos = bb.Min; + bool value_changed = InputTextEx(label, NULL, buf, buf_size, bb.GetSize(), flags | ImGuiInputTextFlags_MergedItem); + if (init) + { + // First frame we started displaying the InputText widget, we expect it to take the active id. + IM_ASSERT(g.ActiveId == id); + g.TempInputId = g.ActiveId; + } + return value_changed; +} + +static inline ImGuiInputTextFlags InputScalar_DefaultCharsFilter(ImGuiDataType data_type, const char* format) +{ + if (data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) + return ImGuiInputTextFlags_CharsScientific; + const char format_last_char = format[0] ? format[strlen(format) - 1] : 0; + return (format_last_char == 'x' || format_last_char == 'X') ? ImGuiInputTextFlags_CharsHexadecimal : ImGuiInputTextFlags_CharsDecimal; +} + +// Note that Drag/Slider functions are only forwarding the min/max values clamping values if the ImGuiSliderFlags_AlwaysClamp flag is set! +// This is intended: this way we allow CTRL+Click manual input to set a value out of bounds, for maximum flexibility. +// However this may not be ideal for all uses, as some user code may break on out of bound values. +bool ImGui::TempInputScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format, const void* p_clamp_min, const void* p_clamp_max) +{ + char fmt_buf[32]; + char data_buf[32]; + format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf)); + DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format); + ImStrTrimBlanks(data_buf); + + ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; + flags |= InputScalar_DefaultCharsFilter(data_type, format); + + bool value_changed = false; + if (TempInputText(bb, id, label, data_buf, IM_ARRAYSIZE(data_buf), flags)) + { + // Backup old value + size_t data_type_size = DataTypeGetInfo(data_type)->Size; + ImGuiDataTypeTempStorage data_backup; + memcpy(&data_backup, p_data, data_type_size); + + // Apply new value (or operations) then clamp + DataTypeApplyFromText(data_buf, data_type, p_data, format); + if (p_clamp_min || p_clamp_max) + { + if (p_clamp_min && p_clamp_max && DataTypeCompare(data_type, p_clamp_min, p_clamp_max) > 0) + ImSwap(p_clamp_min, p_clamp_max); + DataTypeClamp(data_type, p_data, p_clamp_min, p_clamp_max); + } + + // Only mark as edited if new value is different + value_changed = memcmp(&data_backup, p_data, data_type_size) != 0; + if (value_changed) + MarkItemEdited(id); + } + return value_changed; +} + +// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional. +// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly. +bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + + if (format == NULL) + format = DataTypeGetInfo(data_type)->PrintFmt; + + char buf[64]; + DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format); + + // Testing ActiveId as a minor optimization as filtering is not needed until active + if (g.ActiveId == 0 && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0) + flags |= InputScalar_DefaultCharsFilter(data_type, format); + flags |= ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselves by comparing the actual data rather than the string. + + bool value_changed = false; + if (p_step != NULL) + { + const float button_size = GetFrameHeight(); + + BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive() + PushID(label); + SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2)); + if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable); + + // Step buttons + const ImVec2 backup_frame_padding = style.FramePadding; + style.FramePadding.x = style.FramePadding.y; + ImGuiButtonFlags button_flags = ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups; + if (flags & ImGuiInputTextFlags_ReadOnly) + BeginDisabled(); + SameLine(0, style.ItemInnerSpacing.x); + if (ButtonEx("-", ImVec2(button_size, button_size), button_flags)) + { + DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); + value_changed = true; + } + SameLine(0, style.ItemInnerSpacing.x); + if (ButtonEx("+", ImVec2(button_size, button_size), button_flags)) + { + DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step); + value_changed = true; + } + if (flags & ImGuiInputTextFlags_ReadOnly) + EndDisabled(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0, style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + style.FramePadding = backup_frame_padding; + + PopID(); + EndGroup(); + } + else + { + if (InputText(label, buf, IM_ARRAYSIZE(buf), flags)) + value_changed = DataTypeApplyFromText(buf, data_type, p_data, format); + } + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + bool value_changed = false; + BeginGroup(); + PushID(label); + PushMultiItemsWidths(components, CalcItemWidth()); + size_t type_size = GDataTypeInfo[data_type].Size; + for (int i = 0; i < components; i++) + { + PushID(i); + if (i > 0) + SameLine(0, g.Style.ItemInnerSpacing.x); + value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags); + PopID(); + PopItemWidth(); + p_data = (void*)((char*)p_data + type_size); + } + PopID(); + + const char* label_end = FindRenderedTextEnd(label); + if (label != label_end) + { + SameLine(0.0f, g.Style.ItemInnerSpacing.x); + TextEx(label, label_end); + } + + EndGroup(); + return value_changed; +} + +bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags) +{ + flags |= ImGuiInputTextFlags_CharsScientific; + return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step > 0.0f ? &step : NULL), (void*)(step_fast > 0.0f ? &step_fast : NULL), format, flags); +} + +bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags); +} + +bool ImGui::InputFloat3(const char* label, float v[3], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags); +} + +bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags); +} + +bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags flags) +{ + // Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes. + const char* format = (flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d"; + return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step > 0 ? &step : NULL), (void*)(step_fast > 0 ? &step_fast : NULL), format, flags); +} + +bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 2, NULL, NULL, "%d", flags); +} + +bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 3, NULL, NULL, "%d", flags); +} + +bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags) +{ + return InputScalarN(label, ImGuiDataType_S32, v, 4, NULL, NULL, "%d", flags); +} + +bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags) +{ + flags |= ImGuiInputTextFlags_CharsScientific; + return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step > 0.0 ? &step : NULL), (void*)(step_fast > 0.0 ? &step_fast : NULL), format, flags); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint +//------------------------------------------------------------------------- +// - InputText() +// - InputTextWithHint() +// - InputTextMultiline() +// - InputTextGetCharInfo() [Internal] +// - InputTextReindexLines() [Internal] +// - InputTextReindexLinesRange() [Internal] +// - InputTextEx() [Internal] +// - DebugNodeInputTextState() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() + return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); +} + +bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + return InputTextEx(label, NULL, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data); +} + +bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data) +{ + IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline() or InputTextEx() manually if you need multi-line + hint. + return InputTextEx(label, hint, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data); +} + +static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end) +{ + int line_count = 0; + const char* s = text_begin; + while (char c = *s++) // We are only matching for \n so we can ignore UTF-8 decoding + if (c == '\n') + line_count++; + s--; + if (s[0] != '\n' && s[0] != '\r') + line_count++; + *out_text_end = s; + return line_count; +} + +static ImVec2 InputTextCalcTextSizeW(ImGuiContext* ctx, const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line) +{ + ImGuiContext& g = *ctx; + ImFont* font = g.Font; + const float line_height = g.FontSize; + const float scale = line_height / font->FontSize; + + ImVec2 text_size = ImVec2(0, 0); + float line_width = 0.0f; + + const ImWchar* s = text_begin; + while (s < text_end) + { + unsigned int c = (unsigned int)(*s++); + if (c == '\n') + { + text_size.x = ImMax(text_size.x, line_width); + text_size.y += line_height; + line_width = 0.0f; + if (stop_on_new_line) + break; + continue; + } + if (c == '\r') + continue; + + const float char_width = font->GetCharAdvance((ImWchar)c) * scale; + line_width += char_width; + } + + if (text_size.x < line_width) + text_size.x = line_width; + + if (out_offset) + *out_offset = ImVec2(line_width, text_size.y + line_height); // offset allow for the possibility of sitting after a trailing \n + + if (line_width > 0 || text_size.y == 0.0f) // whereas size.y will ignore the trailing \n + text_size.y += line_height; + + if (remaining) + *remaining = s; + + return text_size; +} + +// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar) +namespace ImStb +{ + +static int STB_TEXTEDIT_STRINGLEN(const ImGuiInputTextState* obj) { return obj->CurLenW; } +static ImWchar STB_TEXTEDIT_GETCHAR(const ImGuiInputTextState* obj, int idx) { return obj->TextW[idx]; } +static float STB_TEXTEDIT_GETWIDTH(ImGuiInputTextState* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *obj->Ctx; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); } +static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; } +static ImWchar STB_TEXTEDIT_NEWLINE = '\n'; +static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, ImGuiInputTextState* obj, int line_start_idx) +{ + const ImWchar* text = obj->TextW.Data; + const ImWchar* text_remaining = NULL; + const ImVec2 size = InputTextCalcTextSizeW(obj->Ctx, text + line_start_idx, text + obj->CurLenW, &text_remaining, NULL, true); + r->x0 = 0.0f; + r->x1 = size.x; + r->baseline_y_delta = size.y; + r->ymin = 0.0f; + r->ymax = size.y; + r->num_chars = (int)(text_remaining - (text + line_start_idx)); +} + +// When ImGuiInputTextFlags_Password is set, we don't want actions such as CTRL+Arrow to leak the fact that underlying data are blanks or separators. +static bool is_separator(unsigned int c) { return ImCharIsBlankW(c) || c==',' || c==';' || c=='(' || c==')' || c=='{' || c=='}' || c=='[' || c==']' || c=='|' || c=='\n' || c=='\r'; } +static int is_word_boundary_from_right(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (is_separator(obj->TextW[idx - 1]) && !is_separator(obj->TextW[idx]) ) : 1; } +static int is_word_boundary_from_left(ImGuiInputTextState* obj, int idx) { if (obj->Flags & ImGuiInputTextFlags_Password) return 0; return idx > 0 ? (!is_separator(obj->TextW[idx - 1]) && is_separator(obj->TextW[idx])) : 1; } +static int STB_TEXTEDIT_MOVEWORDLEFT_IMPL(ImGuiInputTextState* obj, int idx) { idx--; while (idx >= 0 && !is_word_boundary_from_right(obj, idx)) idx--; return idx < 0 ? 0 : idx; } +static int STB_TEXTEDIT_MOVEWORDRIGHT_MAC(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_left(obj, idx)) idx++; return idx > len ? len : idx; } +static int STB_TEXTEDIT_MOVEWORDRIGHT_WIN(ImGuiInputTextState* obj, int idx) { idx++; int len = obj->CurLenW; while (idx < len && !is_word_boundary_from_right(obj, idx)) idx++; return idx > len ? len : idx; } +static int STB_TEXTEDIT_MOVEWORDRIGHT_IMPL(ImGuiInputTextState* obj, int idx) { ImGuiContext& g = *obj->Ctx; if (g.IO.ConfigMacOSXBehaviors) return STB_TEXTEDIT_MOVEWORDRIGHT_MAC(obj, idx); else return STB_TEXTEDIT_MOVEWORDRIGHT_WIN(obj, idx); } +#define STB_TEXTEDIT_MOVEWORDLEFT STB_TEXTEDIT_MOVEWORDLEFT_IMPL // They need to be #define for stb_textedit.h +#define STB_TEXTEDIT_MOVEWORDRIGHT STB_TEXTEDIT_MOVEWORDRIGHT_IMPL + +static void STB_TEXTEDIT_DELETECHARS(ImGuiInputTextState* obj, int pos, int n) +{ + ImWchar* dst = obj->TextW.Data + pos; + + // We maintain our buffer length in both UTF-8 and wchar formats + obj->Edited = true; + obj->CurLenA -= ImTextCountUtf8BytesFromStr(dst, dst + n); + obj->CurLenW -= n; + + // Offset remaining text (FIXME-OPT: Use memmove) + const ImWchar* src = obj->TextW.Data + pos + n; + while (ImWchar c = *src++) + *dst++ = c; + *dst = '\0'; +} + +static bool STB_TEXTEDIT_INSERTCHARS(ImGuiInputTextState* obj, int pos, const ImWchar* new_text, int new_text_len) +{ + const bool is_resizable = (obj->Flags & ImGuiInputTextFlags_CallbackResize) != 0; + const int text_len = obj->CurLenW; + IM_ASSERT(pos <= text_len); + + const int new_text_len_utf8 = ImTextCountUtf8BytesFromStr(new_text, new_text + new_text_len); + if (!is_resizable && (new_text_len_utf8 + obj->CurLenA + 1 > obj->BufCapacityA)) + return false; + + // Grow internal buffer if needed + if (new_text_len + text_len + 1 > obj->TextW.Size) + { + if (!is_resizable) + return false; + IM_ASSERT(text_len < obj->TextW.Size); + obj->TextW.resize(text_len + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1); + } + + ImWchar* text = obj->TextW.Data; + if (pos != text_len) + memmove(text + pos + new_text_len, text + pos, (size_t)(text_len - pos) * sizeof(ImWchar)); + memcpy(text + pos, new_text, (size_t)new_text_len * sizeof(ImWchar)); + + obj->Edited = true; + obj->CurLenW += new_text_len; + obj->CurLenA += new_text_len_utf8; + obj->TextW[obj->CurLenW] = '\0'; + + return true; +} + +// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols) +#define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left +#define STB_TEXTEDIT_K_RIGHT 0x200001 // keyboard input to move cursor right +#define STB_TEXTEDIT_K_UP 0x200002 // keyboard input to move cursor up +#define STB_TEXTEDIT_K_DOWN 0x200003 // keyboard input to move cursor down +#define STB_TEXTEDIT_K_LINESTART 0x200004 // keyboard input to move cursor to start of line +#define STB_TEXTEDIT_K_LINEEND 0x200005 // keyboard input to move cursor to end of line +#define STB_TEXTEDIT_K_TEXTSTART 0x200006 // keyboard input to move cursor to start of text +#define STB_TEXTEDIT_K_TEXTEND 0x200007 // keyboard input to move cursor to end of text +#define STB_TEXTEDIT_K_DELETE 0x200008 // keyboard input to delete selection or character under cursor +#define STB_TEXTEDIT_K_BACKSPACE 0x200009 // keyboard input to delete selection or character left of cursor +#define STB_TEXTEDIT_K_UNDO 0x20000A // keyboard input to perform undo +#define STB_TEXTEDIT_K_REDO 0x20000B // keyboard input to perform redo +#define STB_TEXTEDIT_K_WORDLEFT 0x20000C // keyboard input to move cursor left one word +#define STB_TEXTEDIT_K_WORDRIGHT 0x20000D // keyboard input to move cursor right one word +#define STB_TEXTEDIT_K_PGUP 0x20000E // keyboard input to move cursor up a page +#define STB_TEXTEDIT_K_PGDOWN 0x20000F // keyboard input to move cursor down a page +#define STB_TEXTEDIT_K_SHIFT 0x400000 + +#define STB_TEXTEDIT_IMPLEMENTATION +#include "imstb_textedit.h" + +// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling +// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?) +static void stb_textedit_replace(ImGuiInputTextState* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len) +{ + stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len); + ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW); + state->cursor = state->select_start = state->select_end = 0; + if (text_len <= 0) + return; + if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len)) + { + state->cursor = state->select_start = state->select_end = text_len; + state->has_preferred_x = 0; + return; + } + IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace() +} + +} // namespace ImStb + +void ImGuiInputTextState::OnKeyPressed(int key) +{ + stb_textedit_key(this, &Stb, key); + CursorFollow = true; + CursorAnimReset(); +} + +ImGuiInputTextCallbackData::ImGuiInputTextCallbackData() +{ + memset(this, 0, sizeof(*this)); +} + +// Public API to manipulate UTF-8 text +// We expose UTF-8 to the user (unlike the STB_TEXTEDIT_* functions which are manipulating wchar) +// FIXME: The existence of this rarely exercised code path is a bit of a nuisance. +void ImGuiInputTextCallbackData::DeleteChars(int pos, int bytes_count) +{ + IM_ASSERT(pos + bytes_count <= BufTextLen); + char* dst = Buf + pos; + const char* src = Buf + pos + bytes_count; + while (char c = *src++) + *dst++ = c; + *dst = '\0'; + + if (CursorPos >= pos + bytes_count) + CursorPos -= bytes_count; + else if (CursorPos >= pos) + CursorPos = pos; + SelectionStart = SelectionEnd = CursorPos; + BufDirty = true; + BufTextLen -= bytes_count; +} + +void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, const char* new_text_end) +{ + const bool is_resizable = (Flags & ImGuiInputTextFlags_CallbackResize) != 0; + const int new_text_len = new_text_end ? (int)(new_text_end - new_text) : (int)strlen(new_text); + if (new_text_len + BufTextLen >= BufSize) + { + if (!is_resizable) + return; + + // Contrary to STB_TEXTEDIT_INSERTCHARS() this is working in the UTF8 buffer, hence the mildly similar code (until we remove the U16 buffer altogether!) + ImGuiContext& g = *Ctx; + ImGuiInputTextState* edit_state = &g.InputTextState; + IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID); + IM_ASSERT(Buf == edit_state->TextA.Data); + int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1; + edit_state->TextA.reserve(new_buf_size + 1); + Buf = edit_state->TextA.Data; + BufSize = edit_state->BufCapacityA = new_buf_size; + } + + if (BufTextLen != pos) + memmove(Buf + pos + new_text_len, Buf + pos, (size_t)(BufTextLen - pos)); + memcpy(Buf + pos, new_text, (size_t)new_text_len * sizeof(char)); + Buf[BufTextLen + new_text_len] = '\0'; + + if (CursorPos >= pos) + CursorPos += new_text_len; + SelectionStart = SelectionEnd = CursorPos; + BufDirty = true; + BufTextLen += new_text_len; +} + +// Return false to discard a character. +static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data, ImGuiInputSource input_source) +{ + IM_ASSERT(input_source == ImGuiInputSource_Keyboard || input_source == ImGuiInputSource_Clipboard); + unsigned int c = *p_char; + + // Filter non-printable (NB: isprint is unreliable! see #2467) + bool apply_named_filters = true; + if (c < 0x20) + { + bool pass = false; + pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline)); // Note that an Enter KEY will emit \r and be ignored (we poll for KEY in InputText() code) + pass |= (c == '\t' && (flags & ImGuiInputTextFlags_AllowTabInput)); + if (!pass) + return false; + apply_named_filters = false; // Override named filters below so newline and tabs can still be inserted. + } + + if (input_source != ImGuiInputSource_Clipboard) + { + // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817) + if (c == 127) + return false; + + // Filter private Unicode range. GLFW on OSX seems to send private characters for special keys like arrow keys (FIXME) + if (c >= 0xE000 && c <= 0xF8FF) + return false; + } + + // Filter Unicode ranges we are not handling in this build + if (c > IM_UNICODE_CODEPOINT_MAX) + return false; + + // Generic named filters + if (apply_named_filters && (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))) + { + // The libc allows overriding locale, with e.g. 'setlocale(LC_NUMERIC, "de_DE.UTF-8");' which affect the output/input of printf/scanf to use e.g. ',' instead of '.'. + // The standard mandate that programs starts in the "C" locale where the decimal point is '.'. + // We don't really intend to provide widespread support for it, but out of empathy for people stuck with using odd API, we support the bare minimum aka overriding the decimal point. + // Change the default decimal_point with: + // ImGui::GetCurrentContext()->PlatformLocaleDecimalPoint = *localeconv()->decimal_point; + // Users of non-default decimal point (in particular ',') may be affected by word-selection logic (is_word_boundary_from_right/is_word_boundary_from_left) functions. + ImGuiContext& g = *GImGui; + const unsigned c_decimal_point = (unsigned int)g.PlatformLocaleDecimalPoint; + + // Full-width -> half-width conversion for numeric fields (https://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block) + // While this is mostly convenient, this has the side-effect for uninformed users accidentally inputting full-width characters that they may + // scratch their head as to why it works in numerical fields vs in generic text fields it would require support in the font. + if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsScientific | ImGuiInputTextFlags_CharsHexadecimal)) + if (c >= 0xFF01 && c <= 0xFF5E) + c = c - 0xFF01 + 0x21; + + // Allow 0-9 . - + * / + if (flags & ImGuiInputTextFlags_CharsDecimal) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/')) + return false; + + // Allow 0-9 . - + * / e E + if (flags & ImGuiInputTextFlags_CharsScientific) + if (!(c >= '0' && c <= '9') && (c != c_decimal_point) && (c != '-') && (c != '+') && (c != '*') && (c != '/') && (c != 'e') && (c != 'E')) + return false; + + // Allow 0-9 a-F A-F + if (flags & ImGuiInputTextFlags_CharsHexadecimal) + if (!(c >= '0' && c <= '9') && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F')) + return false; + + // Turn a-z into A-Z + if (flags & ImGuiInputTextFlags_CharsUppercase) + if (c >= 'a' && c <= 'z') + c += (unsigned int)('A' - 'a'); + + if (flags & ImGuiInputTextFlags_CharsNoBlank) + if (ImCharIsBlankW(c)) + return false; + + *p_char = c; + } + + // Custom callback filter + if (flags & ImGuiInputTextFlags_CallbackCharFilter) + { + ImGuiContext& g = *GImGui; + ImGuiInputTextCallbackData callback_data; + callback_data.Ctx = &g; + callback_data.EventFlag = ImGuiInputTextFlags_CallbackCharFilter; + callback_data.EventChar = (ImWchar)c; + callback_data.Flags = flags; + callback_data.UserData = user_data; + if (callback(&callback_data) != 0) + return false; + *p_char = callback_data.EventChar; + if (!callback_data.EventChar) + return false; + } + + return true; +} + +// Find the shortest single replacement we can make to get the new text from the old text. +// Important: needs to be run before TextW is rewritten with the new characters because calling STB_TEXTEDIT_GETCHAR() at the end. +// FIXME: Ideally we should transition toward (1) making InsertChars()/DeleteChars() update undo-stack (2) discourage (and keep reconcile) or obsolete (and remove reconcile) accessing buffer directly. +static void InputTextReconcileUndoStateAfterUserCallback(ImGuiInputTextState* state, const char* new_buf_a, int new_length_a) +{ + ImGuiContext& g = *GImGui; + const ImWchar* old_buf = state->TextW.Data; + const int old_length = state->CurLenW; + const int new_length = ImTextCountCharsFromUtf8(new_buf_a, new_buf_a + new_length_a); + g.TempBuffer.reserve_discard((new_length + 1) * sizeof(ImWchar)); + ImWchar* new_buf = (ImWchar*)(void*)g.TempBuffer.Data; + ImTextStrFromUtf8(new_buf, new_length + 1, new_buf_a, new_buf_a + new_length_a); + + const int shorter_length = ImMin(old_length, new_length); + int first_diff; + for (first_diff = 0; first_diff < shorter_length; first_diff++) + if (old_buf[first_diff] != new_buf[first_diff]) + break; + if (first_diff == old_length && first_diff == new_length) + return; + + int old_last_diff = old_length - 1; + int new_last_diff = new_length - 1; + for (; old_last_diff >= first_diff && new_last_diff >= first_diff; old_last_diff--, new_last_diff--) + if (old_buf[old_last_diff] != new_buf[new_last_diff]) + break; + + const int insert_len = new_last_diff - first_diff + 1; + const int delete_len = old_last_diff - first_diff + 1; + if (insert_len > 0 || delete_len > 0) + if (STB_TEXTEDIT_CHARTYPE* p = stb_text_createundo(&state->Stb.undostate, first_diff, delete_len, insert_len)) + for (int i = 0; i < delete_len; i++) + p[i] = ImStb::STB_TEXTEDIT_GETCHAR(state, first_diff + i); +} + +// Edit a string of text +// - buf_size account for the zero-terminator, so a buf_size of 6 can hold "Hello" but not "Hello!". +// This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match +// Note that in std::string world, capacity() would omit 1 byte used by the zero-terminator. +// - When active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while the InputText is active has no effect. +// - If you want to use ImGui::InputText() with std::string, see misc/cpp/imgui_stdlib.h +// (FIXME: Rather confusing and messy function, among the worse part of our codebase, expecting to rewrite a V2 at some point.. Partly because we are +// doing UTF8 > U16 > UTF8 conversions on the go to easily interface with stb_textedit. Ideally should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188) +bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + IM_ASSERT(buf != NULL && buf_size >= 0); + IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackHistory) && (flags & ImGuiInputTextFlags_Multiline))); // Can't use both together (they both use up/down keys) + IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key) + + ImGuiContext& g = *GImGui; + ImGuiIO& io = g.IO; + const ImGuiStyle& style = g.Style; + + const bool RENDER_SELECTION_WHEN_INACTIVE = false; + const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0; + const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0; + const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0; + const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0; + const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0; + if (is_resizable) + IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag! + + if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope (including the scrollbar) + BeginGroup(); + const ImGuiID id = window->GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? g.FontSize * 8.0f : label_size.y) + style.FramePadding.y * 2.0f); // Arbitrary default of 8 lines high for multi-line + const ImVec2 total_size = ImVec2(frame_size.x + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), frame_size.y); + + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size); + + ImGuiWindow* draw_window = window; + ImVec2 inner_size = frame_size; + ImGuiItemStatusFlags item_status_flags = 0; + ImGuiLastItemData item_data_backup; + if (is_multiline) + { + ImVec2 backup_pos = window->DC.CursorPos; + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) + { + EndGroup(); + return false; + } + item_status_flags = g.LastItemData.StatusFlags; + item_data_backup = g.LastItemData; + window->DC.CursorPos = backup_pos; + + // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug. + // FIXME-NAV: Pressing NavActivate will trigger general child activation right before triggering our own below. Harmless but bizarre. + PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]); + PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding); + PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize); + PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0, 0)); // Ensure no clip rect so mouse hover can reach FramePadding edges + bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove); + PopStyleVar(3); + PopStyleColor(); + if (!child_visible) + { + EndChild(); + EndGroup(); + return false; + } + draw_window = g.CurrentWindow; // Child window + draw_window->DC.NavLayersActiveMaskNext |= (1 << draw_window->DC.NavLayerCurrent); // This is to ensure that EndChild() will display a navigation highlight so we can "enter" into it. + draw_window->DC.CursorPos += style.FramePadding; + inner_size.x -= draw_window->ScrollbarSizes.x; + } + else + { + // Support for internal ImGuiInputTextFlags_MergedItem flag, which could be redesigned as an ItemFlags if needed (with test performed in ItemAdd) + ItemSize(total_bb, style.FramePadding.y); + if (!(flags & ImGuiInputTextFlags_MergedItem)) + if (!ItemAdd(total_bb, id, &frame_bb, ImGuiItemFlags_Inputable)) + return false; + item_status_flags = g.LastItemData.StatusFlags; + } + const bool hovered = ItemHoverable(frame_bb, id); + if (hovered) + g.MouseCursor = ImGuiMouseCursor_TextInput; + + // We are only allowed to access the state if we are already the active widget. + ImGuiInputTextState* state = GetInputTextState(id); + + const bool input_requested_by_tabbing = (item_status_flags & ImGuiItemStatusFlags_FocusedByTabbing) != 0; + const bool input_requested_by_nav = (g.ActiveId != id) && ((g.NavActivateId == id) && ((g.NavActivateFlags & ImGuiActivateFlags_PreferInput) || (g.NavInputSource == ImGuiInputSource_Keyboard))); + + const bool user_clicked = hovered && io.MouseClicked[0]; + const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); + const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetWindowScrollbarID(draw_window, ImGuiAxis_Y); + bool clear_active_id = false; + bool select_all = false; + + float scroll_y = is_multiline ? draw_window->Scroll.y : FLT_MAX; + + const bool init_changed_specs = (state != NULL && state->Stb.single_line != !is_multiline); + const bool init_make_active = (user_clicked || user_scroll_finish || input_requested_by_nav || input_requested_by_tabbing); + const bool init_state = (init_make_active || user_scroll_active); + if ((init_state && g.ActiveId != id) || init_changed_specs) + { + // Access state even if we don't own it yet. + state = &g.InputTextState; + state->CursorAnimReset(); + + // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar) + // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode) + const int buf_len = (int)strlen(buf); + state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string. + memcpy(state->InitialTextA.Data, buf, buf_len + 1); + + // Preserve cursor position and undo/redo stack if we come back to same widget + // FIXME: Since we reworked this on 2022/06, may want to differenciate recycle_cursor vs recycle_undostate? + bool recycle_state = (state->ID == id && !init_changed_specs); + if (recycle_state && (state->CurLenA != buf_len || (state->TextAIsValid && strncmp(state->TextA.Data, buf, buf_len) != 0))) + recycle_state = false; + + // Start edition + const char* buf_end = NULL; + state->ID = id; + state->TextW.resize(buf_size + 1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data is always pointing to at least an empty string. + state->TextA.resize(0); + state->TextAIsValid = false; // TextA is not valid yet (we will display buf until then) + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, buf_size, buf, NULL, &buf_end); + state->CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8. + + if (recycle_state) + { + // Recycle existing cursor/selection/undo stack but clamp position + // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler. + state->CursorClamp(); + } + else + { + state->ScrollX = 0.0f; + stb_textedit_initialize_state(&state->Stb, !is_multiline); + } + + if (!is_multiline) + { + if (flags & ImGuiInputTextFlags_AutoSelectAll) + select_all = true; + if (input_requested_by_nav && (!recycle_state || !(g.NavActivateFlags & ImGuiActivateFlags_TryToPreserveState))) + select_all = true; + if (input_requested_by_tabbing || (user_clicked && io.KeyCtrl)) + select_all = true; + } + + if (flags & ImGuiInputTextFlags_AlwaysOverwrite) + state->Stb.insert_mode = 1; // stb field name is indeed incorrect (see #2863) + } + + const bool is_osx = io.ConfigMacOSXBehaviors; + if (g.ActiveId != id && init_make_active) + { + IM_ASSERT(state && state->ID == id); + SetActiveID(id, window); + SetFocusID(id, window); + FocusWindow(window); + } + if (g.ActiveId == id) + { + // Declare some inputs, the other are registered and polled via Shortcut() routing system. + if (user_clicked) + SetKeyOwner(ImGuiKey_MouseLeft, id); + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right); + if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory)) + g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down); + SetKeyOwner(ImGuiKey_Home, id); + SetKeyOwner(ImGuiKey_End, id); + if (is_multiline) + { + SetKeyOwner(ImGuiKey_PageUp, id); + SetKeyOwner(ImGuiKey_PageDown, id); + } + if (is_osx) + SetKeyOwner(ImGuiMod_Alt, id); + if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character. + SetShortcutRouting(ImGuiKey_Tab, id); + } + + // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function) + if (g.ActiveId == id && state == NULL) + ClearActiveID(); + + // Release focus when we click outside + if (g.ActiveId == id && io.MouseClicked[0] && !init_state && !init_make_active) //-V560 + clear_active_id = true; + + // Lock the decision of whether we are going to take the path displaying the cursor or selection + bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active); + bool render_selection = state && (state->HasSelection() || select_all) && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); + bool value_changed = false; + bool validated = false; + + // When read-only we always use the live data passed to the function + // FIXME-OPT: Because our selection/cursor code currently needs the wide text we need to convert it when active, which is not ideal :( + if (is_readonly && state != NULL && (render_cursor || render_selection)) + { + const char* buf_end = NULL; + state->TextW.resize(buf_size + 1); + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, buf, NULL, &buf_end); + state->CurLenA = (int)(buf_end - buf); + state->CursorClamp(); + render_selection &= state->HasSelection(); + } + + // Select the buffer to render. + const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state && state->TextAIsValid; + const bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0); + + // Password pushes a temporary font with only a fallback glyph + if (is_password && !is_displaying_hint) + { + const ImFontGlyph* glyph = g.Font->FindGlyph('*'); + ImFont* password_font = &g.InputTextPasswordFont; + password_font->FontSize = g.Font->FontSize; + password_font->Scale = g.Font->Scale; + password_font->Ascent = g.Font->Ascent; + password_font->Descent = g.Font->Descent; + password_font->ContainerAtlas = g.Font->ContainerAtlas; + password_font->FallbackGlyph = glyph; + password_font->FallbackAdvanceX = glyph->AdvanceX; + IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty()); + PushFont(password_font); + } + + // Process mouse inputs and character inputs + int backup_current_text_length = 0; + if (g.ActiveId == id) + { + IM_ASSERT(state != NULL); + backup_current_text_length = state->CurLenA; + state->Edited = false; + state->BufCapacityA = buf_size; + state->Flags = flags; + + // Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget. + // Down the line we should have a cleaner library-wide concept of Selected vs Active. + g.ActiveIdAllowOverlap = !io.MouseDown[0]; + g.WantTextInputNextFrame = 1; + + // Edit in progress + const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX; + const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y) : (g.FontSize * 0.5f)); + + if (select_all) + { + state->SelectAll(); + state->SelectedAllMouseLock = true; + } + else if (hovered && io.MouseClickedCount[0] >= 2 && !io.KeyShift) + { + stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); + const int multiclick_count = (io.MouseClickedCount[0] - 2); + if ((multiclick_count % 2) == 0) + { + // Double-click: Select word + // We always use the "Mac" word advance for double-click select vs CTRL+Right which use the platform dependent variant: + // FIXME: There are likely many ways to improve this behavior, but there's no "right" behavior (depends on use-case, software, OS) + const bool is_bol = (state->Stb.cursor == 0) || ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor - 1) == '\n'; + if (STB_TEXT_HAS_SELECTION(&state->Stb) || !is_bol) + state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT); + //state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT); + if (!STB_TEXT_HAS_SELECTION(&state->Stb)) + ImStb::stb_textedit_prep_selection_at_cursor(&state->Stb); + state->Stb.cursor = ImStb::STB_TEXTEDIT_MOVEWORDRIGHT_MAC(state, state->Stb.cursor); + state->Stb.select_end = state->Stb.cursor; + ImStb::stb_textedit_clamp(state, &state->Stb); + } + else + { + // Triple-click: Select line + const bool is_eol = ImStb::STB_TEXTEDIT_GETCHAR(state, state->Stb.cursor) == '\n'; + state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART); + state->OnKeyPressed(STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT); + state->OnKeyPressed(STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT); + if (!is_eol && is_multiline) + { + ImSwap(state->Stb.select_start, state->Stb.select_end); + state->Stb.cursor = state->Stb.select_end; + } + state->CursorFollow = false; + } + state->CursorAnimReset(); + } + else if (io.MouseClicked[0] && !state->SelectedAllMouseLock) + { + if (hovered) + { + if (io.KeyShift) + stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y); + else + stb_textedit_click(state, &state->Stb, mouse_x, mouse_y); + state->CursorAnimReset(); + } + } + else if (io.MouseDown[0] && !state->SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f)) + { + stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y); + state->CursorAnimReset(); + state->CursorFollow = true; + } + if (state->SelectedAllMouseLock && !io.MouseDown[0]) + state->SelectedAllMouseLock = false; + + // We expect backends to emit a Tab key but some also emit a Tab character which we ignore (#2467, #1336) + // (For Tab and Enter: Win32/SFML/Allegro are sending both keys and chars, GLFW and SDL are only sending keys. For Space they all send all threes) + if ((flags & ImGuiInputTextFlags_AllowTabInput) && Shortcut(ImGuiKey_Tab, id) && !is_readonly) + { + unsigned int c = '\t'; // Insert TAB + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + + // Process regular text input (before we check for Return because using some IME will effectively send a Return?) + // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters. + const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper); + if (io.InputQueueCharacters.Size > 0) + { + if (!ignore_char_inputs && !is_readonly && !input_requested_by_nav) + for (int n = 0; n < io.InputQueueCharacters.Size; n++) + { + // Insert character if they pass filtering + unsigned int c = (unsigned int)io.InputQueueCharacters[n]; + if (c == '\t') // Skip Tab, see above. + continue; + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + + // Consume characters + io.InputQueueCharacters.resize(0); + } + } + + // Process other shortcuts/key-presses + bool revert_edit = false; + if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id) + { + IM_ASSERT(state != NULL); + + const int row_count_per_page = ImMax((int)((inner_size.y - style.FramePadding.y) / g.FontSize), 1); + state->Stb.row_count_per_page = row_count_per_page; + + const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0); + const bool is_wordmove_key_down = is_osx ? io.KeyAlt : io.KeyCtrl; // OS X style: Text editing cursor movement using Alt instead of Ctrl + const bool is_startend_key_down = is_osx && io.KeySuper && !io.KeyCtrl && !io.KeyAlt; // OS X style: Line/Text Start and End using Cmd+Arrows instead of Home/End + + // Using Shortcut() with ImGuiInputFlags_RouteFocused (default policy) to allow routing operations for other code (e.g. calling window trying to use CTRL+A and CTRL+B: formet would be handled by InputText) + // Otherwise we could simply assume that we own the keys as we are active. + const ImGuiInputFlags f_repeat = ImGuiInputFlags_Repeat; + const bool is_cut = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_X, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Delete, id, f_repeat)) && !is_readonly && !is_password && (!is_multiline || state->HasSelection()); + const bool is_copy = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_C, id) || Shortcut(ImGuiMod_Ctrl | ImGuiKey_Insert, id)) && !is_password && (!is_multiline || state->HasSelection()); + const bool is_paste = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_V, id, f_repeat) || Shortcut(ImGuiMod_Shift | ImGuiKey_Insert, id, f_repeat)) && !is_readonly; + const bool is_undo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Z, id, f_repeat)) && !is_readonly && is_undoable; + const bool is_redo = (Shortcut(ImGuiMod_Shortcut | ImGuiKey_Y, id, f_repeat) || (is_osx && Shortcut(ImGuiMod_Shortcut | ImGuiMod_Shift | ImGuiKey_Z, id, f_repeat))) && !is_readonly && is_undoable; + const bool is_select_all = Shortcut(ImGuiMod_Shortcut | ImGuiKey_A, id); + + // We allow validate/cancel with Nav source (gamepad) to makes it easier to undo an accidental NavInput press with no keyboard wired, but otherwise it isn't very useful. + const bool nav_gamepad_active = (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (io.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0; + const bool is_enter_pressed = IsKeyPressed(ImGuiKey_Enter, true) || IsKeyPressed(ImGuiKey_KeypadEnter, true); + const bool is_gamepad_validate = nav_gamepad_active && (IsKeyPressed(ImGuiKey_NavGamepadActivate, false) || IsKeyPressed(ImGuiKey_NavGamepadInput, false)); + const bool is_cancel = Shortcut(ImGuiKey_Escape, id, f_repeat) || (nav_gamepad_active && Shortcut(ImGuiKey_NavGamepadCancel, id, f_repeat)); + + // FIXME: Should use more Shortcut() and reduce IsKeyPressed()+SetKeyOwner(), but requires modifiers combination to be taken account of. + if (IsKeyPressed(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); } + else if (IsKeyPressed(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); } + else if (IsKeyPressed(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); } + else if (IsKeyPressed(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); } + else if (IsKeyPressed(ImGuiKey_PageUp) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGUP | k_mask); scroll_y -= row_count_per_page * g.FontSize; } + else if (IsKeyPressed(ImGuiKey_PageDown) && is_multiline) { state->OnKeyPressed(STB_TEXTEDIT_K_PGDOWN | k_mask); scroll_y += row_count_per_page * g.FontSize; } + else if (IsKeyPressed(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); } + else if (IsKeyPressed(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); } + else if (IsKeyPressed(ImGuiKey_Delete) && !is_readonly && !is_cut) + { + if (!state->HasSelection()) + { + // OSX doesn't seem to have Super+Delete to delete until end-of-line, so we don't emulate that (as opposed to Super+Backspace) + if (is_wordmove_key_down) + state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT); + } + state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); + } + else if (IsKeyPressed(ImGuiKey_Backspace) && !is_readonly) + { + if (!state->HasSelection()) + { + if (is_wordmove_key_down) + state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT); + else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) + state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT); + } + state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask); + } + else if (is_enter_pressed || is_gamepad_validate) + { + // Determine if we turn Enter into a \n character + bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0; + if (!is_multiline || is_gamepad_validate || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl)) + { + validated = true; + if (io.ConfigInputTextEnterKeepActive && !is_multiline) + state->SelectAll(); // No need to scroll + else + clear_active_id = true; + } + else if (!is_readonly) + { + unsigned int c = '\n'; // Insert new line + if (InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Keyboard)) + state->OnKeyPressed((int)c); + } + } + else if (is_cancel) + { + if (flags & ImGuiInputTextFlags_EscapeClearsAll) + { + if (state->CurLenA > 0) + { + revert_edit = true; + } + else + { + render_cursor = render_selection = false; + clear_active_id = true; + } + } + else + { + clear_active_id = revert_edit = true; + render_cursor = render_selection = false; + } + } + else if (is_undo || is_redo) + { + state->OnKeyPressed(is_undo ? STB_TEXTEDIT_K_UNDO : STB_TEXTEDIT_K_REDO); + state->ClearSelection(); + } + else if (is_select_all) + { + state->SelectAll(); + state->CursorFollow = true; + } + else if (is_cut || is_copy) + { + // Cut, Copy + if (io.SetClipboardTextFn) + { + const int ib = state->HasSelection() ? ImMin(state->Stb.select_start, state->Stb.select_end) : 0; + const int ie = state->HasSelection() ? ImMax(state->Stb.select_start, state->Stb.select_end) : state->CurLenW; + const int clipboard_data_len = ImTextCountUtf8BytesFromStr(state->TextW.Data + ib, state->TextW.Data + ie) + 1; + char* clipboard_data = (char*)IM_ALLOC(clipboard_data_len * sizeof(char)); + ImTextStrToUtf8(clipboard_data, clipboard_data_len, state->TextW.Data + ib, state->TextW.Data + ie); + SetClipboardText(clipboard_data); + MemFree(clipboard_data); + } + if (is_cut) + { + if (!state->HasSelection()) + state->SelectAll(); + state->CursorFollow = true; + stb_textedit_cut(state, &state->Stb); + } + } + else if (is_paste) + { + if (const char* clipboard = GetClipboardText()) + { + // Filter pasted buffer + const int clipboard_len = (int)strlen(clipboard); + ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len + 1) * sizeof(ImWchar)); + int clipboard_filtered_len = 0; + for (const char* s = clipboard; *s != 0; ) + { + unsigned int c; + s += ImTextCharFromUtf8(&c, s, NULL); + if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data, ImGuiInputSource_Clipboard)) + continue; + clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c; + } + clipboard_filtered[clipboard_filtered_len] = 0; + if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation + { + stb_textedit_paste(state, &state->Stb, clipboard_filtered, clipboard_filtered_len); + state->CursorFollow = true; + } + MemFree(clipboard_filtered); + } + } + + // Update render selection flag after events have been handled, so selection highlight can be displayed during the same frame. + render_selection |= state->HasSelection() && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor); + } + + // Process callbacks and apply result back to user's buffer. + const char* apply_new_text = NULL; + int apply_new_text_length = 0; + if (g.ActiveId == id) + { + IM_ASSERT(state != NULL); + if (revert_edit && !is_readonly) + { + if (flags & ImGuiInputTextFlags_EscapeClearsAll) + { + // Clear input + apply_new_text = ""; + apply_new_text_length = 0; + STB_TEXTEDIT_CHARTYPE empty_string; + stb_textedit_replace(state, &state->Stb, &empty_string, 0); + } + else if (strcmp(buf, state->InitialTextA.Data) != 0) + { + // Restore initial value. Only return true if restoring to the initial value changes the current buffer contents. + // Push records into the undo stack so we can CTRL+Z the revert operation itself + apply_new_text = state->InitialTextA.Data; + apply_new_text_length = state->InitialTextA.Size - 1; + ImVector w_text; + if (apply_new_text_length > 0) + { + w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1); + ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length); + } + stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0); + } + } + + // Apply ASCII value + if (!is_readonly) + { + state->TextAIsValid = true; + state->TextA.resize(state->TextW.Size * 4 + 1); + ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL); + } + + // When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame. + // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. + // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize). + const bool apply_edit_back_to_user_buffer = !revert_edit || (validated && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0); + if (apply_edit_back_to_user_buffer) + { + // Apply new value immediately - copy modified buffer back + // Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer + // FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect. + // FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks. + + // User callback + if ((flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_CallbackHistory | ImGuiInputTextFlags_CallbackEdit | ImGuiInputTextFlags_CallbackAlways)) != 0) + { + IM_ASSERT(callback != NULL); + + // The reason we specify the usage semantic (Completion/History) is that Completion needs to disable keyboard TABBING at the moment. + ImGuiInputTextFlags event_flag = 0; + ImGuiKey event_key = ImGuiKey_None; + if ((flags & ImGuiInputTextFlags_CallbackCompletion) != 0 && Shortcut(ImGuiKey_Tab, id)) + { + event_flag = ImGuiInputTextFlags_CallbackCompletion; + event_key = ImGuiKey_Tab; + } + else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_UpArrow)) + { + event_flag = ImGuiInputTextFlags_CallbackHistory; + event_key = ImGuiKey_UpArrow; + } + else if ((flags & ImGuiInputTextFlags_CallbackHistory) != 0 && IsKeyPressed(ImGuiKey_DownArrow)) + { + event_flag = ImGuiInputTextFlags_CallbackHistory; + event_key = ImGuiKey_DownArrow; + } + else if ((flags & ImGuiInputTextFlags_CallbackEdit) && state->Edited) + { + event_flag = ImGuiInputTextFlags_CallbackEdit; + } + else if (flags & ImGuiInputTextFlags_CallbackAlways) + { + event_flag = ImGuiInputTextFlags_CallbackAlways; + } + + if (event_flag) + { + ImGuiInputTextCallbackData callback_data; + callback_data.Ctx = &g; + callback_data.EventFlag = event_flag; + callback_data.Flags = flags; + callback_data.UserData = callback_user_data; + + char* callback_buf = is_readonly ? buf : state->TextA.Data; + callback_data.EventKey = event_key; + callback_data.Buf = callback_buf; + callback_data.BufTextLen = state->CurLenA; + callback_data.BufSize = state->BufCapacityA; + callback_data.BufDirty = false; + + // We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188) + ImWchar* text = state->TextW.Data; + const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + state->Stb.cursor); + const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_start); + const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_end); + + // Call user code + callback(&callback_data); + + // Read back what user may have modified + callback_buf = is_readonly ? buf : state->TextA.Data; // Pointer may have been invalidated by a resize callback + IM_ASSERT(callback_data.Buf == callback_buf); // Invalid to modify those fields + IM_ASSERT(callback_data.BufSize == state->BufCapacityA); + IM_ASSERT(callback_data.Flags == flags); + const bool buf_dirty = callback_data.BufDirty; + if (callback_data.CursorPos != utf8_cursor_pos || buf_dirty) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; } + if (callback_data.SelectionStart != utf8_selection_start || buf_dirty) { state->Stb.select_start = (callback_data.SelectionStart == callback_data.CursorPos) ? state->Stb.cursor : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); } + if (callback_data.SelectionEnd != utf8_selection_end || buf_dirty) { state->Stb.select_end = (callback_data.SelectionEnd == callback_data.SelectionStart) ? state->Stb.select_start : ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); } + if (buf_dirty) + { + IM_ASSERT((flags & ImGuiInputTextFlags_ReadOnly) == 0); + IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text! + InputTextReconcileUndoStateAfterUserCallback(state, callback_data.Buf, callback_data.BufTextLen); // FIXME: Move the rest of this block inside function and rename to InputTextReconcileStateAfterUserCallback() ? + if (callback_data.BufTextLen > backup_current_text_length && is_resizable) + state->TextW.resize(state->TextW.Size + (callback_data.BufTextLen - backup_current_text_length)); // Worse case scenario resize + state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, callback_data.Buf, NULL); + state->CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen() + state->CursorAnimReset(); + } + } + } + + // Will copy result string if modified + if (!is_readonly && strcmp(state->TextA.Data, buf) != 0) + { + apply_new_text = state->TextA.Data; + apply_new_text_length = state->CurLenA; + } + } + } + + // Copy result to user buffer. This can currently only happen when (g.ActiveId == id) + if (apply_new_text != NULL) + { + // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size + // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used + // without any storage on user's side. + IM_ASSERT(apply_new_text_length >= 0); + if (is_resizable) + { + ImGuiInputTextCallbackData callback_data; + callback_data.Ctx = &g; + callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize; + callback_data.Flags = flags; + callback_data.Buf = buf; + callback_data.BufTextLen = apply_new_text_length; + callback_data.BufSize = ImMax(buf_size, apply_new_text_length + 1); + callback_data.UserData = callback_user_data; + callback(&callback_data); + buf = callback_data.Buf; + buf_size = callback_data.BufSize; + apply_new_text_length = ImMin(callback_data.BufTextLen, buf_size - 1); + IM_ASSERT(apply_new_text_length <= buf_size); + } + //IMGUI_DEBUG_PRINT("InputText(\"%s\"): apply_new_text length %d\n", label, apply_new_text_length); + + // If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size. + ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size)); + value_changed = true; + } + + // Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value) + if (clear_active_id && g.ActiveId == id) + ClearActiveID(); + + // Render frame + if (!is_multiline) + { + RenderNavHighlight(frame_bb, id); + RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + } + + const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size + ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding; + ImVec2 text_size(0.0f, 0.0f); + + // Set upper limit of single-line InputTextEx() at 2 million characters strings. The current pathological worst case is a long line + // without any carriage return, which would makes ImFont::RenderText() reserve too many vertices and probably crash. Avoid it altogether. + // Note that we only use this limit on single-line InputText(), so a pathologically large line on a InputTextMultiline() would still crash. + const int buf_display_max_length = 2 * 1024 * 1024; + const char* buf_display = buf_display_from_state ? state->TextA.Data : buf; //-V595 + const char* buf_display_end = NULL; // We have specialized paths below for setting the length + if (is_displaying_hint) + { + buf_display = hint; + buf_display_end = hint + strlen(hint); + } + + // Render text. We currently only render selection when the widget is active or while scrolling. + // FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive. + if (render_cursor || render_selection) + { + IM_ASSERT(state != NULL); + if (!is_displaying_hint) + buf_display_end = buf_display + state->CurLenA; + + // Render text (with cursor and selection) + // This is going to be messy. We need to: + // - Display the text (this alone can be more easily clipped) + // - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation) + // - Measure text height (for scrollbar) + // We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort) + // FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8. + const ImWchar* text_begin = state->TextW.Data; + ImVec2 cursor_offset, select_start_offset; + + { + // Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions. + const ImWchar* searches_input_ptr[2] = { NULL, NULL }; + int searches_result_line_no[2] = { -1000, -1000 }; + int searches_remaining = 0; + if (render_cursor) + { + searches_input_ptr[0] = text_begin + state->Stb.cursor; + searches_result_line_no[0] = -1; + searches_remaining++; + } + if (render_selection) + { + searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); + searches_result_line_no[1] = -1; + searches_remaining++; + } + + // Iterate all lines to find our line numbers + // In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter. + searches_remaining += is_multiline ? 1 : 0; + int line_count = 0; + //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit + for (const ImWchar* s = text_begin; *s != 0; s++) + if (*s == '\n') + { + line_count++; + if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; } + if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; } + } + line_count++; + if (searches_result_line_no[0] == -1) + searches_result_line_no[0] = line_count; + if (searches_result_line_no[1] == -1) + searches_result_line_no[1] = line_count; + + // Calculate 2d position by finding the beginning of the line and measuring distance + cursor_offset.x = InputTextCalcTextSizeW(&g, ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x; + cursor_offset.y = searches_result_line_no[0] * g.FontSize; + if (searches_result_line_no[1] >= 0) + { + select_start_offset.x = InputTextCalcTextSizeW(&g, ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x; + select_start_offset.y = searches_result_line_no[1] * g.FontSize; + } + + // Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224) + if (is_multiline) + text_size = ImVec2(inner_size.x, line_count * g.FontSize); + } + + // Scroll + if (render_cursor && state->CursorFollow) + { + // Horizontal scroll in chunks of quarter width + if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll)) + { + const float scroll_increment_x = inner_size.x * 0.25f; + const float visible_width = inner_size.x - style.FramePadding.x; + if (cursor_offset.x < state->ScrollX) + state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x)); + else if (cursor_offset.x - visible_width >= state->ScrollX) + state->ScrollX = IM_FLOOR(cursor_offset.x - visible_width + scroll_increment_x); + } + else + { + state->ScrollX = 0.0f; + } + + // Vertical scroll + if (is_multiline) + { + // Test if cursor is vertically visible + if (cursor_offset.y - g.FontSize < scroll_y) + scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize); + else if (cursor_offset.y - (inner_size.y - style.FramePadding.y * 2.0f) >= scroll_y) + scroll_y = cursor_offset.y - inner_size.y + style.FramePadding.y * 2.0f; + const float scroll_max_y = ImMax((text_size.y + style.FramePadding.y * 2.0f) - inner_size.y, 0.0f); + scroll_y = ImClamp(scroll_y, 0.0f, scroll_max_y); + draw_pos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag + draw_window->Scroll.y = scroll_y; + } + + state->CursorFollow = false; + } + + // Draw selection + const ImVec2 draw_scroll = ImVec2(state->ScrollX, 0.0f); + if (render_selection) + { + const ImWchar* text_selected_begin = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end); + const ImWchar* text_selected_end = text_begin + ImMax(state->Stb.select_start, state->Stb.select_end); + + ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg, render_cursor ? 1.0f : 0.6f); // FIXME: current code flow mandate that render_cursor is always true here, we are leaving the transparent one for tests. + float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection. + float bg_offy_dn = is_multiline ? 0.0f : 2.0f; + ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll; + for (const ImWchar* p = text_selected_begin; p < text_selected_end; ) + { + if (rect_pos.y > clip_rect.w + g.FontSize) + break; + if (rect_pos.y < clip_rect.y) + { + //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit + //p = p ? p + 1 : text_selected_end; + while (p < text_selected_end) + if (*p++ == '\n') + break; + } + else + { + ImVec2 rect_size = InputTextCalcTextSizeW(&g, p, text_selected_end, &p, NULL, true); + if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines + ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos + ImVec2(rect_size.x, bg_offy_dn)); + rect.ClipWith(clip_rect); + if (rect.Overlaps(clip_rect)) + draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color); + } + rect_pos.x = draw_pos.x - draw_scroll.x; + rect_pos.y += g.FontSize; + } + } + + // We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash. + if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) + { + ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); + draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); + } + + // Draw blinking cursor + if (render_cursor) + { + state->CursorAnim += io.DeltaTime; + bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f; + ImVec2 cursor_screen_pos = ImFloor(draw_pos + cursor_offset - draw_scroll); + ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f); + if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect)) + draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text)); + + // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.) + if (!is_readonly) + { + g.PlatformImeData.WantVisible = true; + g.PlatformImeData.InputPos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize); + g.PlatformImeData.InputLineHeight = g.FontSize; + } + } + } + else + { + // Render text only (no selection, no cursor) + if (is_multiline) + text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width + else if (!is_displaying_hint && g.ActiveId == id) + buf_display_end = buf_display + state->CurLenA; + else if (!is_displaying_hint) + buf_display_end = buf_display + strlen(buf_display); + + if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length) + { + ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text); + draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect); + } + } + + if (is_password && !is_displaying_hint) + PopFont(); + + if (is_multiline) + { + // For focus requests to work on our multiline we need to ensure our child ItemAdd() call specifies the ImGuiItemFlags_Inputable (ref issue #4761)... + Dummy(ImVec2(text_size.x, text_size.y + style.FramePadding.y)); + ImGuiItemFlags backup_item_flags = g.CurrentItemFlags; + g.CurrentItemFlags |= ImGuiItemFlags_Inputable | ImGuiItemFlags_NoTabStop; + EndChild(); + item_data_backup.StatusFlags |= (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredWindow); + g.CurrentItemFlags = backup_item_flags; + + // ...and then we need to undo the group overriding last item data, which gets a bit messy as EndGroup() tries to forward scrollbar being active... + // FIXME: This quite messy/tricky, should attempt to get rid of the child window. + EndGroup(); + if (g.LastItemData.ID == 0) + { + g.LastItemData.ID = id; + g.LastItemData.InFlags = item_data_backup.InFlags; + g.LastItemData.StatusFlags = item_data_backup.StatusFlags; + } + } + + // Log as text + if (g.LogEnabled && (!is_password || is_displaying_hint)) + { + LogSetNextTextDecoration("{", "}"); + LogRenderedText(&draw_pos, buf_display, buf_display_end); + } + + if (label_size.x > 0) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label); + + if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited)) + MarkItemEdited(id); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Inputable); + if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0) + return validated; + else + return value_changed; +} + +void ImGui::DebugNodeInputTextState(ImGuiInputTextState* state) +{ +#ifndef IMGUI_DISABLE_DEBUG_TOOLS + ImGuiContext& g = *GImGui; + ImStb::STB_TexteditState* stb_state = &state->Stb; + ImStb::StbUndoState* undo_state = &stb_state->undostate; + Text("ID: 0x%08X, ActiveID: 0x%08X", state->ID, g.ActiveId); + DebugLocateItemOnHover(state->ID); + Text("CurLenW: %d, CurLenA: %d, Cursor: %d, Selection: %d..%d", state->CurLenW, state->CurLenA, stb_state->cursor, stb_state->select_start, stb_state->select_end); + Text("has_preferred_x: %d (%.2f)", stb_state->has_preferred_x, stb_state->preferred_x); + Text("undo_point: %d, redo_point: %d, undo_char_point: %d, redo_char_point: %d", undo_state->undo_point, undo_state->redo_point, undo_state->undo_char_point, undo_state->redo_char_point); + if (BeginChild("undopoints", ImVec2(0.0f, GetTextLineHeight() * 15), true)) // Visualize undo state + { + PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0)); + for (int n = 0; n < STB_TEXTEDIT_UNDOSTATECOUNT; n++) + { + ImStb::StbUndoRecord* undo_rec = &undo_state->undo_rec[n]; + const char undo_rec_type = (n < undo_state->undo_point) ? 'u' : (n >= undo_state->redo_point) ? 'r' : ' '; + if (undo_rec_type == ' ') + BeginDisabled(); + char buf[64] = ""; + if (undo_rec_type != ' ' && undo_rec->char_storage != -1) + ImTextStrToUtf8(buf, IM_ARRAYSIZE(buf), undo_state->undo_char + undo_rec->char_storage, undo_state->undo_char + undo_rec->char_storage + undo_rec->insert_length); + Text("%c [%02d] where %03d, insert %03d, delete %03d, char_storage %03d \"%s\"", + undo_rec_type, n, undo_rec->where, undo_rec->insert_length, undo_rec->delete_length, undo_rec->char_storage, buf); + if (undo_rec_type == ' ') + EndDisabled(); + } + PopStyleVar(); + } + EndChild(); +#else + IM_UNUSED(state); +#endif +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ColorEdit, ColorPicker, ColorButton, etc. +//------------------------------------------------------------------------- +// - ColorEdit3() +// - ColorEdit4() +// - ColorPicker3() +// - RenderColorRectWithAlphaCheckerboard() [Internal] +// - ColorPicker4() +// - ColorButton() +// - SetColorEditOptions() +// - ColorTooltip() [Internal] +// - ColorEditOptionsPopup() [Internal] +// - ColorPickerOptionsPopup() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags) +{ + return ColorEdit4(label, col, flags | ImGuiColorEditFlags_NoAlpha); +} + +static void ColorEditRestoreH(const float* col, float* H) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ColorEditCurrentID != 0); + if (g.ColorEditSavedID != g.ColorEditCurrentID || g.ColorEditSavedColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) + return; + *H = g.ColorEditSavedHue; +} + +// ColorEdit supports RGB and HSV inputs. In case of RGB input resulting color may have undefined hue and/or saturation. +// Since widget displays both RGB and HSV values we must preserve hue and saturation to prevent these values resetting. +static void ColorEditRestoreHS(const float* col, float* H, float* S, float* V) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(g.ColorEditCurrentID != 0); + if (g.ColorEditSavedID != g.ColorEditCurrentID || g.ColorEditSavedColor != ImGui::ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0))) + return; + + // When S == 0, H is undefined. + // When H == 1 it wraps around to 0. + if (*S == 0.0f || (*H == 0.0f && g.ColorEditSavedHue == 1)) + *H = g.ColorEditSavedHue; + + // When V == 0, S is undefined. + if (*V == 0.0f) + *S = g.ColorEditSavedSat; +} + +// Edit colors components (each component in 0.0f..1.0f range). +// See enum ImGuiColorEditFlags_ for available options. e.g. Only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +// With typical options: Left-click on color square to open color picker. Right-click to open option menu. CTRL-Click over input fields to edit them and TAB to go to next item. +bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const float square_sz = GetFrameHeight(); + const float w_full = CalcItemWidth(); + const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x); + const float w_inputs = w_full - w_button; + const char* label_display_end = FindRenderedTextEnd(label); + g.NextItemData.ClearFlags(); + + BeginGroup(); + PushID(label); + const bool set_current_color_edit_id = (g.ColorEditCurrentID == 0); + if (set_current_color_edit_id) + g.ColorEditCurrentID = window->IDStack.back(); + + // If we're not showing any slider there's no point in doing any HSV conversions + const ImGuiColorEditFlags flags_untouched = flags; + if (flags & ImGuiColorEditFlags_NoInputs) + flags = (flags & (~ImGuiColorEditFlags_DisplayMask_)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions; + + // Context menu: display and modify options (before defaults are applied) + if (!(flags & ImGuiColorEditFlags_NoOptions)) + ColorEditOptionsPopup(col, flags); + + // Read stored options + if (!(flags & ImGuiColorEditFlags_DisplayMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DisplayMask_); + if (!(flags & ImGuiColorEditFlags_DataTypeMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_DataTypeMask_); + if (!(flags & ImGuiColorEditFlags_PickerMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_); + if (!(flags & ImGuiColorEditFlags_InputMask_)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_InputMask_); + flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_)); + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check that only 1 is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected + + const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0; + const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0; + const int components = alpha ? 4 : 3; + + // Convert to the formats we need + float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f }; + if ((flags & ImGuiColorEditFlags_InputHSV) && (flags & ImGuiColorEditFlags_DisplayRGB)) + ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); + else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV)) + { + // Hue is lost when converting from grayscale rgb (saturation=0). Restore it. + ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + ColorEditRestoreHS(col, &f[0], &f[1], &f[2]); + } + int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) }; + + bool value_changed = false; + bool value_changed_as_float = false; + + const ImVec2 pos = window->DC.CursorPos; + const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f; + window->DC.CursorPos.x = pos.x + inputs_offset_x; + + if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) + { + // RGB/HSV 0..255 Sliders + const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components - 1)) / (float)components)); + const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components - 1))); + + const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x); + static const char* ids[4] = { "##X", "##Y", "##Z", "##W" }; + static const char* fmt_table_int[3][4] = + { + { "%3d", "%3d", "%3d", "%3d" }, // Short display + { "R:%3d", "G:%3d", "B:%3d", "A:%3d" }, // Long display for RGBA + { "H:%3d", "S:%3d", "V:%3d", "A:%3d" } // Long display for HSVA + }; + static const char* fmt_table_float[3][4] = + { + { "%0.3f", "%0.3f", "%0.3f", "%0.3f" }, // Short display + { "R:%0.3f", "G:%0.3f", "B:%0.3f", "A:%0.3f" }, // Long display for RGBA + { "H:%0.3f", "S:%0.3f", "V:%0.3f", "A:%0.3f" } // Long display for HSVA + }; + const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1; + + for (int n = 0; n < components; n++) + { + if (n > 0) + SameLine(0, style.ItemInnerSpacing.x); + SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last); + + // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0. + if (flags & ImGuiColorEditFlags_Float) + { + value_changed |= DragFloat(ids[n], &f[n], 1.0f / 255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]); + value_changed_as_float |= value_changed; + } + else + { + value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]); + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + } + else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0) + { + // RGB Hexadecimal Input + char buf[64]; + if (alpha) + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255), ImClamp(i[3], 0, 255)); + else + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0], 0, 255), ImClamp(i[1], 0, 255), ImClamp(i[2], 0, 255)); + SetNextItemWidth(w_inputs); + if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase)) + { + value_changed = true; + char* p = buf; + while (*p == '#' || ImCharIsBlankA(*p)) + p++; + i[0] = i[1] = i[2] = 0; + i[3] = 0xFF; // alpha default to 255 is not parsed by scanf (e.g. inputting #FFFFFF omitting alpha) + int r; + if (alpha) + r = sscanf(p, "%02X%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2], (unsigned int*)&i[3]); // Treat at unsigned (%X is unsigned) + else + r = sscanf(p, "%02X%02X%02X", (unsigned int*)&i[0], (unsigned int*)&i[1], (unsigned int*)&i[2]); + IM_UNUSED(r); // Fixes C6031: Return value ignored: 'sscanf'. + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + + ImGuiWindow* picker_active_window = NULL; + if (!(flags & ImGuiColorEditFlags_NoSmallPreview)) + { + const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x; + window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y); + + const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f); + if (ColorButton("##ColorButton", col_v4, flags)) + { + if (!(flags & ImGuiColorEditFlags_NoPicker)) + { + // Store current color and open a picker + g.ColorPickerRef = col_v4; + OpenPopup("picker"); + SetNextWindowPos(g.LastItemData.Rect.GetBL() + ImVec2(0.0f, style.ItemSpacing.y)); + } + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + + if (BeginPopup("picker")) + { + if (g.CurrentWindow->BeginCount == 1) + { + picker_active_window = g.CurrentWindow; + if (label != label_display_end) + { + TextEx(label, label_display_end); + Spacing(); + } + ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_PickerMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar; + ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags_DisplayMask_ | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf; + SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes? + value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x); + } + EndPopup(); + } + } + + if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel)) + { + // Position not necessarily next to last submitted button (e.g. if style.ColorButtonPosition == ImGuiDir_Left), + // but we need to use SameLine() to setup baseline correctly. Might want to refactor SameLine() to simplify this. + SameLine(0.0f, style.ItemInnerSpacing.x); + window->DC.CursorPos.x = pos.x + ((flags & ImGuiColorEditFlags_NoInputs) ? w_button : w_full + style.ItemInnerSpacing.x); + TextEx(label, label_display_end); + } + + // Convert back + if (value_changed && picker_active_window == NULL) + { + if (!value_changed_as_float) + for (int n = 0; n < 4; n++) + f[n] = i[n] / 255.0f; + if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB)) + { + g.ColorEditSavedHue = f[0]; + g.ColorEditSavedSat = f[1]; + ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]); + g.ColorEditSavedID = g.ColorEditCurrentID; + g.ColorEditSavedColor = ColorConvertFloat4ToU32(ImVec4(f[0], f[1], f[2], 0)); + } + if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV)) + ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]); + + col[0] = f[0]; + col[1] = f[1]; + col[2] = f[2]; + if (alpha) + col[3] = f[3]; + } + + if (set_current_color_edit_id) + g.ColorEditCurrentID = 0; + PopID(); + EndGroup(); + + // Drag and Drop Target + // NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test. + if ((g.LastItemData.StatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget()) + { + bool accepted_drag_drop = false; + if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F)) + { + memcpy((float*)col, payload->Data, sizeof(float) * 3); // Preserve alpha if any //-V512 //-V1086 + value_changed = accepted_drag_drop = true; + } + if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F)) + { + memcpy((float*)col, payload->Data, sizeof(float) * components); + value_changed = accepted_drag_drop = true; + } + + // Drag-drop payloads are always RGB + if (accepted_drag_drop && (flags & ImGuiColorEditFlags_InputHSV)) + ColorConvertRGBtoHSV(col[0], col[1], col[2], col[0], col[1], col[2]); + EndDragDropTarget(); + } + + // When picker is being actively used, use its active id so IsItemActive() will function on ColorEdit4(). + if (picker_active_window && g.ActiveId != 0 && g.ActiveIdWindow == picker_active_window) + g.LastItemData.ID = g.ActiveId; + + if (value_changed && g.LastItemData.ID != 0) // In case of ID collision, the second EndGroup() won't catch g.ActiveId + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +bool ImGui::ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags) +{ + float col4[4] = { col[0], col[1], col[2], 1.0f }; + if (!ColorPicker4(label, col4, flags | ImGuiColorEditFlags_NoAlpha)) + return false; + col[0] = col4[0]; col[1] = col4[1]; col[2] = col4[2]; + return true; +} + +// Helper for ColorPicker4() +static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w, float alpha) +{ + ImU32 alpha8 = IM_F32_TO_INT8_SAT(alpha); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32(255,255,255,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32(0,0,0,alpha8)); + ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32(255,255,255,alpha8)); +} + +// Note: ColorPicker4() only accesses 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +// (In C++ the 'float col[4]' notation for a function argument is equivalent to 'float* col', we only specify a size to facilitate understanding of the code.) +// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..) +// FIXME: this is trying to be aware of style.Alpha but not fully correct. Also, the color wheel will have overlapping glitches with (style.Alpha < 1.0) +bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImDrawList* draw_list = window->DrawList; + ImGuiStyle& style = g.Style; + ImGuiIO& io = g.IO; + + const float width = CalcItemWidth(); + g.NextItemData.ClearFlags(); + + PushID(label); + const bool set_current_color_edit_id = (g.ColorEditCurrentID == 0); + if (set_current_color_edit_id) + g.ColorEditCurrentID = window->IDStack.back(); + BeginGroup(); + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + flags |= ImGuiColorEditFlags_NoSmallPreview; + + // Context menu: display and store options. + if (!(flags & ImGuiColorEditFlags_NoOptions)) + ColorPickerOptionsPopup(col, flags); + + // Read stored options + if (!(flags & ImGuiColorEditFlags_PickerMask_)) + flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_PickerMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_PickerMask_; + if (!(flags & ImGuiColorEditFlags_InputMask_)) + flags |= ((g.ColorEditOptions & ImGuiColorEditFlags_InputMask_) ? g.ColorEditOptions : ImGuiColorEditFlags_DefaultOptions_) & ImGuiColorEditFlags_InputMask_; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check that only 1 is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check that only 1 is selected + if (!(flags & ImGuiColorEditFlags_NoOptions)) + flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar); + + // Setup + int components = (flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4; + bool alpha_bar = (flags & ImGuiColorEditFlags_AlphaBar) && !(flags & ImGuiColorEditFlags_NoAlpha); + ImVec2 picker_pos = window->DC.CursorPos; + float square_sz = GetFrameHeight(); + float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars + float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box + float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x; + float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x; + float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f); + + float backup_initial_col[4]; + memcpy(backup_initial_col, col, components * sizeof(float)); + + float wheel_thickness = sv_picker_size * 0.08f; + float wheel_r_outer = sv_picker_size * 0.50f; + float wheel_r_inner = wheel_r_outer - wheel_thickness; + ImVec2 wheel_center(picker_pos.x + (sv_picker_size + bars_width)*0.5f, picker_pos.y + sv_picker_size * 0.5f); + + // Note: the triangle is displayed rotated with triangle_pa pointing to Hue, but most coordinates stays unrotated for logic. + float triangle_r = wheel_r_inner - (int)(sv_picker_size * 0.027f); + ImVec2 triangle_pa = ImVec2(triangle_r, 0.0f); // Hue point. + ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point. + ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point. + + float H = col[0], S = col[1], V = col[2]; + float R = col[0], G = col[1], B = col[2]; + if (flags & ImGuiColorEditFlags_InputRGB) + { + // Hue is lost when converting from grayscale rgb (saturation=0). Restore it. + ColorConvertRGBtoHSV(R, G, B, H, S, V); + ColorEditRestoreHS(col, &H, &S, &V); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + ColorConvertHSVtoRGB(H, S, V, R, G, B); + } + + bool value_changed = false, value_changed_h = false, value_changed_sv = false; + + PushItemFlag(ImGuiItemFlags_NoNav, true); + if (flags & ImGuiColorEditFlags_PickerHueWheel) + { + // Hue wheel + SV triangle logic + InvisibleButton("hsv", ImVec2(sv_picker_size + style.ItemInnerSpacing.x + bars_width, sv_picker_size)); + if (IsItemActive()) + { + ImVec2 initial_off = g.IO.MouseClickedPos[0] - wheel_center; + ImVec2 current_off = g.IO.MousePos - wheel_center; + float initial_dist2 = ImLengthSqr(initial_off); + if (initial_dist2 >= (wheel_r_inner - 1) * (wheel_r_inner - 1) && initial_dist2 <= (wheel_r_outer + 1) * (wheel_r_outer + 1)) + { + // Interactive with Hue wheel + H = ImAtan2(current_off.y, current_off.x) / IM_PI * 0.5f; + if (H < 0.0f) + H += 1.0f; + value_changed = value_changed_h = true; + } + float cos_hue_angle = ImCos(-H * 2.0f * IM_PI); + float sin_hue_angle = ImSin(-H * 2.0f * IM_PI); + if (ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, ImRotate(initial_off, cos_hue_angle, sin_hue_angle))) + { + // Interacting with SV triangle + ImVec2 current_off_unrotated = ImRotate(current_off, cos_hue_angle, sin_hue_angle); + if (!ImTriangleContainsPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated)) + current_off_unrotated = ImTriangleClosestPoint(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated); + float uu, vv, ww; + ImTriangleBarycentricCoords(triangle_pa, triangle_pb, triangle_pc, current_off_unrotated, uu, vv, ww); + V = ImClamp(1.0f - vv, 0.0001f, 1.0f); + S = ImClamp(uu / V, 0.0001f, 1.0f); + value_changed = value_changed_sv = true; + } + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + } + else if (flags & ImGuiColorEditFlags_PickerHueBar) + { + // SV rectangle logic + InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size)); + if (IsItemActive()) + { + S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size - 1)); + V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + ColorEditRestoreH(col, &H); // Greatly reduces hue jitter and reset to 0 when hue == 255 and color is rapidly modified using SV square. + value_changed = value_changed_sv = true; + } + if (!(flags & ImGuiColorEditFlags_NoOptions)) + OpenPopupOnItemClick("context", ImGuiPopupFlags_MouseButtonRight); + + // Hue bar logic + SetCursorScreenPos(ImVec2(bar0_pos_x, picker_pos.y)); + InvisibleButton("hue", ImVec2(bars_width, sv_picker_size)); + if (IsItemActive()) + { + H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + value_changed = value_changed_h = true; + } + } + + // Alpha bar logic + if (alpha_bar) + { + SetCursorScreenPos(ImVec2(bar1_pos_x, picker_pos.y)); + InvisibleButton("alpha", ImVec2(bars_width, sv_picker_size)); + if (IsItemActive()) + { + col[3] = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size - 1)); + value_changed = true; + } + } + PopItemFlag(); // ImGuiItemFlags_NoNav + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + { + SameLine(0, style.ItemInnerSpacing.x); + BeginGroup(); + } + + if (!(flags & ImGuiColorEditFlags_NoLabel)) + { + const char* label_display_end = FindRenderedTextEnd(label); + if (label != label_display_end) + { + if ((flags & ImGuiColorEditFlags_NoSidePreview)) + SameLine(0, style.ItemInnerSpacing.x); + TextEx(label, label_display_end); + } + } + + if (!(flags & ImGuiColorEditFlags_NoSidePreview)) + { + PushItemFlag(ImGuiItemFlags_NoNavDefaultFocus, true); + ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + if ((flags & ImGuiColorEditFlags_NoLabel)) + Text("Current"); + + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip; + ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2)); + if (ref_col != NULL) + { + Text("Original"); + ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]); + if (ColorButton("##original", ref_col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2))) + { + memcpy(col, ref_col, components * sizeof(float)); + value_changed = true; + } + } + PopItemFlag(); + EndGroup(); + } + + // Convert back color to RGB + if (value_changed_h || value_changed_sv) + { + if (flags & ImGuiColorEditFlags_InputRGB) + { + ColorConvertHSVtoRGB(H, S, V, col[0], col[1], col[2]); + g.ColorEditSavedHue = H; + g.ColorEditSavedSat = S; + g.ColorEditSavedID = g.ColorEditCurrentID; + g.ColorEditSavedColor = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 0)); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + col[0] = H; + col[1] = S; + col[2] = V; + } + } + + // R,G,B and H,S,V slider color editor + bool value_changed_fix_hue_wrap = false; + if ((flags & ImGuiColorEditFlags_NoInputs) == 0) + { + PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x); + ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags_DataTypeMask_ | ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf; + ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker; + if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB)) + { + // FIXME: Hackily differentiating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget. + // For the later we don't want to run the hue-wrap canceling code. If you are well versed in HSV picker please provide your input! (See #2050) + value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap); + value_changed = true; + } + if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_DisplayHSV); + if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags_DisplayMask_) == 0) + value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_DisplayHex); + PopItemWidth(); + } + + // Try to cancel hue wrap (after ColorEdit4 call), if any + if (value_changed_fix_hue_wrap && (flags & ImGuiColorEditFlags_InputRGB)) + { + float new_H, new_S, new_V; + ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V); + if (new_H <= 0 && H > 0) + { + if (new_V <= 0 && V != new_V) + ColorConvertHSVtoRGB(H, S, new_V <= 0 ? V * 0.5f : new_V, col[0], col[1], col[2]); + else if (new_S <= 0) + ColorConvertHSVtoRGB(H, new_S <= 0 ? S * 0.5f : new_S, new_V, col[0], col[1], col[2]); + } + } + + if (value_changed) + { + if (flags & ImGuiColorEditFlags_InputRGB) + { + R = col[0]; + G = col[1]; + B = col[2]; + ColorConvertRGBtoHSV(R, G, B, H, S, V); + ColorEditRestoreHS(col, &H, &S, &V); // Fix local Hue as display below will use it immediately. + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + H = col[0]; + S = col[1]; + V = col[2]; + ColorConvertHSVtoRGB(H, S, V, R, G, B); + } + } + + const int style_alpha8 = IM_F32_TO_INT8_SAT(style.Alpha); + const ImU32 col_black = IM_COL32(0,0,0,style_alpha8); + const ImU32 col_white = IM_COL32(255,255,255,style_alpha8); + const ImU32 col_midgrey = IM_COL32(128,128,128,style_alpha8); + const ImU32 col_hues[6 + 1] = { IM_COL32(255,0,0,style_alpha8), IM_COL32(255,255,0,style_alpha8), IM_COL32(0,255,0,style_alpha8), IM_COL32(0,255,255,style_alpha8), IM_COL32(0,0,255,style_alpha8), IM_COL32(255,0,255,style_alpha8), IM_COL32(255,0,0,style_alpha8) }; + + ImVec4 hue_color_f(1, 1, 1, style.Alpha); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z); + ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f); + ImU32 user_col32_striped_of_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, style.Alpha)); // Important: this is still including the main rendering/style alpha!! + + ImVec2 sv_cursor_pos; + + if (flags & ImGuiColorEditFlags_PickerHueWheel) + { + // Render Hue Wheel + const float aeps = 0.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out). + const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12); + for (int n = 0; n < 6; n++) + { + const float a0 = (n) /6.0f * 2.0f * IM_PI - aeps; + const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps; + const int vert_start_idx = draw_list->VtxBuffer.Size; + draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc); + draw_list->PathStroke(col_white, 0, wheel_thickness); + const int vert_end_idx = draw_list->VtxBuffer.Size; + + // Paint colors over existing vertices + ImVec2 gradient_p0(wheel_center.x + ImCos(a0) * wheel_r_inner, wheel_center.y + ImSin(a0) * wheel_r_inner); + ImVec2 gradient_p1(wheel_center.x + ImCos(a1) * wheel_r_inner, wheel_center.y + ImSin(a1) * wheel_r_inner); + ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n + 1]); + } + + // Render Cursor + preview on Hue Wheel + float cos_hue_angle = ImCos(H * 2.0f * IM_PI); + float sin_hue_angle = ImSin(H * 2.0f * IM_PI); + ImVec2 hue_cursor_pos(wheel_center.x + cos_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f, wheel_center.y + sin_hue_angle * (wheel_r_inner + wheel_r_outer) * 0.5f); + float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f; + int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32); + draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad + 1, col_midgrey, hue_cursor_segments); + draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments); + + // Render SV triangle (rotated according to hue) + ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle); + ImVec2 trb = wheel_center + ImRotate(triangle_pb, cos_hue_angle, sin_hue_angle); + ImVec2 trc = wheel_center + ImRotate(triangle_pc, cos_hue_angle, sin_hue_angle); + ImVec2 uv_white = GetFontTexUvWhitePixel(); + draw_list->PrimReserve(6, 6); + draw_list->PrimVtx(tra, uv_white, hue_color32); + draw_list->PrimVtx(trb, uv_white, hue_color32); + draw_list->PrimVtx(trc, uv_white, col_white); + draw_list->PrimVtx(tra, uv_white, 0); + draw_list->PrimVtx(trb, uv_white, col_black); + draw_list->PrimVtx(trc, uv_white, 0); + draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f); + sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V)); + } + else if (flags & ImGuiColorEditFlags_PickerHueBar) + { + // Render SV Square + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white); + draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black); + RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f); + sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S) * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much + sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2); + + // Render Hue Bar + for (int i = 0; i < 6; ++i) + draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]); + float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size); + RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); + } + + // Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range) + float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f; + draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad + 1, col_midgrey, 12); + draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12); + + // Render alpha bar + if (alpha_bar) + { + float alpha = ImSaturate(col[3]); + ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size); + RenderColorRectWithAlphaCheckerboard(draw_list, bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f)); + draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK); + float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size); + RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f); + RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha); + } + + EndGroup(); + + if (value_changed && memcmp(backup_initial_col, col, components * sizeof(float)) == 0) + value_changed = false; + if (value_changed && g.LastItemData.ID != 0) // In case of ID collision, the second EndGroup() won't catch g.ActiveId + MarkItemEdited(g.LastItemData.ID); + + if (set_current_color_edit_id) + g.ColorEditCurrentID = 0; + PopID(); + + return value_changed; +} + +// A little color square. Return true when clicked. +// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip. +// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip. +// Note that 'col' may be encoded in HSV if ImGuiColorEditFlags_InputHSV is set. +bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, const ImVec2& size_arg) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiID id = window->GetID(desc_id); + const float default_size = GetFrameHeight(); + const ImVec2 size(size_arg.x == 0.0f ? default_size : size_arg.x, size_arg.y == 0.0f ? default_size : size_arg.y); + const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size); + ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f); + if (!ItemAdd(bb, id)) + return false; + + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held); + + if (flags & ImGuiColorEditFlags_NoAlpha) + flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf); + + ImVec4 col_rgb = col; + if (flags & ImGuiColorEditFlags_InputHSV) + ColorConvertHSVtoRGB(col_rgb.x, col_rgb.y, col_rgb.z, col_rgb.x, col_rgb.y, col_rgb.z); + + ImVec4 col_rgb_without_alpha(col_rgb.x, col_rgb.y, col_rgb.z, 1.0f); + float grid_step = ImMin(size.x, size.y) / 2.99f; + float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f); + ImRect bb_inner = bb; + float off = 0.0f; + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts. + bb_inner.Expand(off); + } + if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f) + { + float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f); + RenderColorRectWithAlphaCheckerboard(window->DrawList, ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawFlags_RoundCornersRight); + window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawFlags_RoundCornersLeft); + } + else + { + // Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha + ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha; + if (col_source.w < 1.0f) + RenderColorRectWithAlphaCheckerboard(window->DrawList, bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding); + else + window->DrawList->AddRectFilled(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), rounding); + } + RenderNavHighlight(bb, id); + if ((flags & ImGuiColorEditFlags_NoBorder) == 0) + { + if (g.Style.FrameBorderSize > 0.0f) + RenderFrameBorder(bb.Min, bb.Max, rounding); + else + window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_FrameBg), rounding); // Color button are often in need of some sort of border + } + + // Drag and Drop Source + // NB: The ActiveId test is merely an optional micro-optimization, BeginDragDropSource() does the same test. + if (g.ActiveId == id && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropSource()) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col_rgb, sizeof(float) * 3, ImGuiCond_Once); + else + SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col_rgb, sizeof(float) * 4, ImGuiCond_Once); + ColorButton(desc_id, col, flags); + SameLine(); + TextEx("Color"); + EndDragDropSource(); + } + + // Tooltip + if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered) + ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)); + + return pressed; +} + +// Initialize/override default color options +void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags) +{ + ImGuiContext& g = *GImGui; + if ((flags & ImGuiColorEditFlags_DisplayMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DisplayMask_; + if ((flags & ImGuiColorEditFlags_DataTypeMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_DataTypeMask_; + if ((flags & ImGuiColorEditFlags_PickerMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_PickerMask_; + if ((flags & ImGuiColorEditFlags_InputMask_) == 0) + flags |= ImGuiColorEditFlags_DefaultOptions_ & ImGuiColorEditFlags_InputMask_; + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DisplayMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_DataTypeMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_PickerMask_)); // Check only 1 option is selected + IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags_InputMask_)); // Check only 1 option is selected + g.ColorEditOptions = flags; +} + +// Note: only access 3 floats if ImGuiColorEditFlags_NoAlpha flag is set. +void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags) +{ + ImGuiContext& g = *GImGui; + + BeginTooltipEx(ImGuiTooltipFlags_OverridePreviousTooltip, ImGuiWindowFlags_None); + const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text; + if (text_end > text) + { + TextEx(text, text_end); + Separator(); + } + + ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2); + ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); + ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags_InputMask_ | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz); + SameLine(); + if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags_InputMask_)) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]); + else + Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]); + } + else if (flags & ImGuiColorEditFlags_InputHSV) + { + if (flags & ImGuiColorEditFlags_NoAlpha) + Text("H: %.3f, S: %.3f, V: %.3f", col[0], col[1], col[2]); + else + Text("H: %.3f, S: %.3f, V: %.3f, A: %.3f", col[0], col[1], col[2], col[3]); + } + EndTooltip(); +} + +void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags) +{ + bool allow_opt_inputs = !(flags & ImGuiColorEditFlags_DisplayMask_); + bool allow_opt_datatype = !(flags & ImGuiColorEditFlags_DataTypeMask_); + if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context")) + return; + ImGuiContext& g = *GImGui; + ImGuiColorEditFlags opts = g.ColorEditOptions; + if (allow_opt_inputs) + { + if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayRGB; + if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHSV; + if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags_DisplayMask_) | ImGuiColorEditFlags_DisplayHex; + } + if (allow_opt_datatype) + { + if (allow_opt_inputs) Separator(); + if (RadioButton("0..255", (opts & ImGuiColorEditFlags_Uint8) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Uint8; + if (RadioButton("0.00..1.00", (opts & ImGuiColorEditFlags_Float) != 0)) opts = (opts & ~ImGuiColorEditFlags_DataTypeMask_) | ImGuiColorEditFlags_Float; + } + + if (allow_opt_inputs || allow_opt_datatype) + Separator(); + if (Button("Copy as..", ImVec2(-1, 0))) + OpenPopup("Copy"); + if (BeginPopup("Copy")) + { + int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]); + char buf[64]; + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%.3ff, %.3ff, %.3ff, %.3ff)", col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]); + if (Selectable(buf)) + SetClipboardText(buf); + ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca); + if (Selectable(buf)) + SetClipboardText(buf); + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", cr, cg, cb); + if (Selectable(buf)) + SetClipboardText(buf); + if (!(flags & ImGuiColorEditFlags_NoAlpha)) + { + ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", cr, cg, cb, ca); + if (Selectable(buf)) + SetClipboardText(buf); + } + EndPopup(); + } + + g.ColorEditOptions = opts; + EndPopup(); +} + +void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags) +{ + bool allow_opt_picker = !(flags & ImGuiColorEditFlags_PickerMask_); + bool allow_opt_alpha_bar = !(flags & ImGuiColorEditFlags_NoAlpha) && !(flags & ImGuiColorEditFlags_AlphaBar); + if ((!allow_opt_picker && !allow_opt_alpha_bar) || !BeginPopup("context")) + return; + ImGuiContext& g = *GImGui; + if (allow_opt_picker) + { + ImVec2 picker_size(g.FontSize * 8, ImMax(g.FontSize * 8 - (GetFrameHeight() + g.Style.ItemInnerSpacing.x), 1.0f)); // FIXME: Picker size copied from main picker function + PushItemWidth(picker_size.x); + for (int picker_type = 0; picker_type < 2; picker_type++) + { + // Draw small/thumbnail version of each picker type (over an invisible button for selection) + if (picker_type > 0) Separator(); + PushID(picker_type); + ImGuiColorEditFlags picker_flags = ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoSidePreview | (flags & ImGuiColorEditFlags_NoAlpha); + if (picker_type == 0) picker_flags |= ImGuiColorEditFlags_PickerHueBar; + if (picker_type == 1) picker_flags |= ImGuiColorEditFlags_PickerHueWheel; + ImVec2 backup_pos = GetCursorScreenPos(); + if (Selectable("##selectable", false, 0, picker_size)) // By default, Selectable() is closing popup + g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags_PickerMask_) | (picker_flags & ImGuiColorEditFlags_PickerMask_); + SetCursorScreenPos(backup_pos); + ImVec4 previewing_ref_col; + memcpy(&previewing_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4)); + ColorPicker4("##previewing_picker", &previewing_ref_col.x, picker_flags); + PopID(); + } + PopItemWidth(); + } + if (allow_opt_alpha_bar) + { + if (allow_opt_picker) Separator(); + CheckboxFlags("Alpha Bar", &g.ColorEditOptions, ImGuiColorEditFlags_AlphaBar); + } + EndPopup(); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: TreeNode, CollapsingHeader, etc. +//------------------------------------------------------------------------- +// - TreeNode() +// - TreeNodeV() +// - TreeNodeEx() +// - TreeNodeExV() +// - TreeNodeBehavior() [Internal] +// - TreePush() +// - TreePop() +// - GetTreeNodeToLabelSpacing() +// - SetNextItemOpen() +// - CollapsingHeader() +//------------------------------------------------------------------------- + +bool ImGui::TreeNode(const char* str_id, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(str_id, 0, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNode(const void* ptr_id, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(ptr_id, 0, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNode(const char* label) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + return TreeNodeBehavior(window->GetID(label), 0, label, NULL); +} + +bool ImGui::TreeNodeV(const char* str_id, const char* fmt, va_list args) +{ + return TreeNodeExV(str_id, 0, fmt, args); +} + +bool ImGui::TreeNodeV(const void* ptr_id, const char* fmt, va_list args) +{ + return TreeNodeExV(ptr_id, 0, fmt, args); +} + +bool ImGui::TreeNodeEx(const char* label, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + return TreeNodeBehavior(window->GetID(label), flags, label, NULL); +} + +bool ImGui::TreeNodeEx(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(str_id, flags, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNodeEx(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, ...) +{ + va_list args; + va_start(args, fmt); + bool is_open = TreeNodeExV(ptr_id, flags, fmt, args); + va_end(args); + return is_open; +} + +bool ImGui::TreeNodeExV(const char* str_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const char* label, *label_end; + ImFormatStringToTempBufferV(&label, &label_end, fmt, args); + return TreeNodeBehavior(window->GetID(str_id), flags, label, label_end); +} + +bool ImGui::TreeNodeExV(const void* ptr_id, ImGuiTreeNodeFlags flags, const char* fmt, va_list args) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const char* label, *label_end; + ImFormatStringToTempBufferV(&label, &label_end, fmt, args); + return TreeNodeBehavior(window->GetID(ptr_id), flags, label, label_end); +} + +void ImGui::TreeNodeSetOpen(ImGuiID id, bool open) +{ + ImGuiContext& g = *GImGui; + ImGuiStorage* storage = g.CurrentWindow->DC.StateStorage; + storage->SetInt(id, open ? 1 : 0); +} + +bool ImGui::TreeNodeUpdateNextOpen(ImGuiID id, ImGuiTreeNodeFlags flags) +{ + if (flags & ImGuiTreeNodeFlags_Leaf) + return true; + + // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function) + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + ImGuiStorage* storage = window->DC.StateStorage; + + bool is_open; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen) + { + if (g.NextItemData.OpenCond & ImGuiCond_Always) + { + is_open = g.NextItemData.OpenVal; + TreeNodeSetOpen(id, is_open); + } + else + { + // We treat ImGuiCond_Once and ImGuiCond_FirstUseEver the same because tree node state are not saved persistently. + const int stored_value = storage->GetInt(id, -1); + if (stored_value == -1) + { + is_open = g.NextItemData.OpenVal; + TreeNodeSetOpen(id, is_open); + } + else + { + is_open = stored_value != 0; + } + } + } + else + { + is_open = storage->GetInt(id, (flags & ImGuiTreeNodeFlags_DefaultOpen) ? 1 : 0) != 0; + } + + // When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior). + // NB- If we are above max depth we still allow manually opened nodes to be logged. + if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand) + is_open = true; + + return is_open; +} + +bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0; + const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y)); + + if (!label_end) + label_end = FindRenderedTextEnd(label); + const ImVec2 label_size = CalcTextSize(label, label_end, false); + + // We vertically grow up to current line height up the typical widget height. + const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y * 2), label_size.y + padding.y * 2); + ImRect frame_bb; + frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x; + frame_bb.Min.y = window->DC.CursorPos.y; + frame_bb.Max.x = window->WorkRect.Max.x; + frame_bb.Max.y = window->DC.CursorPos.y + frame_height; + if (display_frame) + { + // Framed header expand a little outside the default padding, to the edge of InnerClipRect + // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f) + frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f); + frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f); + } + + const float text_offset_x = g.FontSize + (display_frame ? padding.x * 3 : padding.x * 2); // Collapser arrow width + Spacing + const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it + const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x * 2 : 0.0f); // Include collapser + ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y); + ItemSize(ImVec2(text_width, frame_height), padding.y); + + // For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing + ImRect interact_bb = frame_bb; + if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0) + interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f; + + // Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child. + // For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop(). + // This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero. + const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0; + bool is_open = TreeNodeUpdateNextOpen(id, flags); + if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth); + + bool item_add = ItemAdd(interact_bb, id); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HasDisplayRect; + g.LastItemData.DisplayRect = frame_bb; + + if (!item_add) + { + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + TreePushOverrideID(id); + IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); + return is_open; + } + + ImGuiButtonFlags button_flags = ImGuiTreeNodeFlags_None; + if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) + button_flags |= ImGuiButtonFlags_AllowItemOverlap; + if (!is_leaf) + button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; + + // We allow clicking on the arrow section with keyboard modifiers held, in order to easily + // allow browsing a tree while preserving selection with code implementing multi-selection patterns. + // When clicking on the rest of the tree node we always disallow keyboard modifiers. + const float arrow_hit_x1 = (text_pos.x - text_offset_x) - style.TouchExtraPadding.x; + const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + style.TouchExtraPadding.x; + const bool is_mouse_x_over_arrow = (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2); + if (window != g.HoveredWindow || !is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_NoKeyModifiers; + + // Open behaviors can be altered with the _OpenOnArrow and _OnOnDoubleClick flags. + // Some alteration have subtle effects (e.g. toggle on MouseUp vs MouseDown events) due to requirements for multi-selection and drag and drop support. + // - Single-click on label = Toggle on MouseUp (default, when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=0) + // - Single-click on arrow = Toggle on MouseDown (when _OpenOnArrow=1) + // - Double-click on label = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1) + // - Double-click on arrow = Toggle on MouseDoubleClick (when _OpenOnDoubleClick=1 and _OpenOnArrow=0) + // It is rather standard that arrow click react on Down rather than Up. + // We set ImGuiButtonFlags_PressedOnClickRelease on OpenOnDoubleClick because we want the item to be active on the initial MouseDown in order for drag and drop to work. + if (is_mouse_x_over_arrow) + button_flags |= ImGuiButtonFlags_PressedOnClick; + else if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) + button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; + else + button_flags |= ImGuiButtonFlags_PressedOnClickRelease; + + bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0; + const bool was_selected = selected; + + bool hovered, held; + bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags); + bool toggled = false; + if (!is_leaf) + { + if (pressed && g.DragDropHoldJustPressedId != id) + { + if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id)) + toggled = true; + if (flags & ImGuiTreeNodeFlags_OpenOnArrow) + toggled |= is_mouse_x_over_arrow && !g.NavDisableMouseHover; // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job + if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseClickedCount[0] == 2) + toggled = true; + } + else if (pressed && g.DragDropHoldJustPressedId == id) + { + IM_ASSERT(button_flags & ImGuiButtonFlags_PressedOnDragDropHold); + if (!is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again. + toggled = true; + } + + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Left && is_open) + { + toggled = true; + NavMoveRequestCancel(); + } + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right && !is_open) // If there's something upcoming on the line we may want to give it the priority? + { + toggled = true; + NavMoveRequestCancel(); + } + + if (toggled) + { + is_open = !is_open; + window->DC.StateStorage->SetInt(id, is_open); + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledOpen; + } + } + if (flags & ImGuiTreeNodeFlags_AllowItemOverlap) + SetItemAllowOverlap(); + + // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger. + if (selected != was_selected) //-V547 + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; + + // Render + const ImU32 text_col = GetColorU32(ImGuiCol_Text); + ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin; + if (display_frame) + { + // Framed type + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding); + RenderNavHighlight(frame_bb, id, nav_highlight_flags); + if (flags & ImGuiTreeNodeFlags_Bullet) + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col); + else if (!is_leaf) + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f); + else // Leaf without bullet, left-adjusted text + text_pos.x -= text_offset_x; + if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton) + frame_bb.Max.x -= g.FontSize + style.FramePadding.x; + + if (g.LogEnabled) + LogSetNextTextDecoration("###", "###"); + RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size); + } + else + { + // Unframed typed for tree nodes + if (hovered || selected) + { + const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false); + } + RenderNavHighlight(frame_bb, id, nav_highlight_flags); + if (flags & ImGuiTreeNodeFlags_Bullet) + RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col); + else if (!is_leaf) + RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f); + if (g.LogEnabled) + LogSetNextTextDecoration(">", NULL); + RenderText(text_pos, label, label_end, false); + } + + if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen)) + TreePushOverrideID(id); + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0)); + return is_open; +} + +void ImGui::TreePush(const char* str_id) +{ + ImGuiWindow* window = GetCurrentWindow(); + Indent(); + window->DC.TreeDepth++; + PushID(str_id); +} + +void ImGui::TreePush(const void* ptr_id) +{ + ImGuiWindow* window = GetCurrentWindow(); + Indent(); + window->DC.TreeDepth++; + PushID(ptr_id); +} + +void ImGui::TreePushOverrideID(ImGuiID id) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + Indent(); + window->DC.TreeDepth++; + PushOverrideID(id); +} + +void ImGui::TreePop() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + Unindent(); + + window->DC.TreeDepth--; + ImU32 tree_depth_mask = (1 << window->DC.TreeDepth); + + // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled) + if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet()) + if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask)) + { + SetNavID(window->IDStack.back(), g.NavLayer, 0, ImRect()); + NavMoveRequestCancel(); + } + window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1; + + IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much. + PopID(); +} + +// Horizontal distance preceding label when using TreeNode() or Bullet() +float ImGui::GetTreeNodeToLabelSpacing() +{ + ImGuiContext& g = *GImGui; + return g.FontSize + (g.Style.FramePadding.x * 2.0f); +} + +// Set next TreeNode/CollapsingHeader open state. +void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond) +{ + ImGuiContext& g = *GImGui; + if (g.CurrentWindow->SkipItems) + return; + g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen; + g.NextItemData.OpenVal = is_open; + g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always; +} + +// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag). +// This is basically the same as calling TreeNodeEx(label, ImGuiTreeNodeFlags_CollapsingHeader). You can remove the _NoTreePushOnOpen flag if you want behavior closer to normal TreeNode(). +bool ImGui::CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + return TreeNodeBehavior(window->GetID(label), flags | ImGuiTreeNodeFlags_CollapsingHeader, label); +} + +// p_visible == NULL : regular collapsing header +// p_visible != NULL && *p_visible == true : show a small close button on the corner of the header, clicking the button will set *p_visible = false +// p_visible != NULL && *p_visible == false : do not show the header at all +// Do not mistake this with the Open state of the header itself, which you can adjust with SetNextItemOpen() or ImGuiTreeNodeFlags_DefaultOpen. +bool ImGui::CollapsingHeader(const char* label, bool* p_visible, ImGuiTreeNodeFlags flags) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + if (p_visible && !*p_visible) + return false; + + ImGuiID id = window->GetID(label); + flags |= ImGuiTreeNodeFlags_CollapsingHeader; + if (p_visible) + flags |= ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton; + bool is_open = TreeNodeBehavior(id, flags, label); + if (p_visible != NULL) + { + // Create a small overlapping close button + // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc. + // FIXME: CloseButton can overlap into text, need find a way to clip the text somehow. + ImGuiContext& g = *GImGui; + ImGuiLastItemData last_item_backup = g.LastItemData; + float button_size = g.FontSize; + float button_x = ImMax(g.LastItemData.Rect.Min.x, g.LastItemData.Rect.Max.x - g.Style.FramePadding.x * 2.0f - button_size); + float button_y = g.LastItemData.Rect.Min.y; + ImGuiID close_button_id = GetIDWithSeed("#CLOSE", NULL, id); + if (CloseButton(close_button_id, ImVec2(button_x, button_y))) + *p_visible = false; + g.LastItemData = last_item_backup; + } + + return is_open; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Selectable +//------------------------------------------------------------------------- +// - Selectable() +//------------------------------------------------------------------------- + +// Tip: pass a non-visible label (e.g. "##hello") then you can use the space to draw other text or image. +// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id. +// With this scheme, ImGuiSelectableFlags_SpanAllColumns and ImGuiSelectableFlags_AllowItemOverlap are also frequently used flags. +// FIXME: Selectable() with (size.x == 0.0f) and (SelectableTextAlign.x > 0.0f) followed by SameLine() is currently not supported. +bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + + // Submit label or explicit size to ItemSize(), whereas ItemAdd() will submit a larger/spanning rectangle. + ImGuiID id = window->GetID(label); + ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y); + ImVec2 pos = window->DC.CursorPos; + pos.y += window->DC.CurrLineTextBaseOffset; + ItemSize(size, 0.0f); + + // Fill horizontal space + // We don't support (size < 0.0f) in Selectable() because the ItemSpacing extension would make explicitly right-aligned sizes not visibly match other widgets. + const bool span_all_columns = (flags & ImGuiSelectableFlags_SpanAllColumns) != 0; + const float min_x = span_all_columns ? window->ParentWorkRect.Min.x : pos.x; + const float max_x = span_all_columns ? window->ParentWorkRect.Max.x : window->WorkRect.Max.x; + if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_SpanAvailWidth)) + size.x = ImMax(label_size.x, max_x - min_x); + + // Text stays at the submission position, but bounding box may be extended on both sides + const ImVec2 text_min = pos; + const ImVec2 text_max(min_x + size.x, pos.y + size.y); + + // Selectables are meant to be tightly packed together with no click-gap, so we extend their box to cover spacing between selectable. + ImRect bb(min_x, pos.y, text_max.x, text_max.y); + if ((flags & ImGuiSelectableFlags_NoPadWithHalfSpacing) == 0) + { + const float spacing_x = span_all_columns ? 0.0f : style.ItemSpacing.x; + const float spacing_y = style.ItemSpacing.y; + const float spacing_L = IM_FLOOR(spacing_x * 0.50f); + const float spacing_U = IM_FLOOR(spacing_y * 0.50f); + bb.Min.x -= spacing_L; + bb.Min.y -= spacing_U; + bb.Max.x += (spacing_x - spacing_L); + bb.Max.y += (spacing_y - spacing_U); + } + //if (g.IO.KeyCtrl) { GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(0, 255, 0, 255)); } + + // Modify ClipRect for the ItemAdd(), faster than doing a PushColumnsBackground/PushTableBackground for every Selectable.. + const float backup_clip_rect_min_x = window->ClipRect.Min.x; + const float backup_clip_rect_max_x = window->ClipRect.Max.x; + if (span_all_columns) + { + window->ClipRect.Min.x = window->ParentWorkRect.Min.x; + window->ClipRect.Max.x = window->ParentWorkRect.Max.x; + } + + const bool disabled_item = (flags & ImGuiSelectableFlags_Disabled) != 0; + const bool item_add = ItemAdd(bb, id, NULL, disabled_item ? ImGuiItemFlags_Disabled : ImGuiItemFlags_None); + if (span_all_columns) + { + window->ClipRect.Min.x = backup_clip_rect_min_x; + window->ClipRect.Max.x = backup_clip_rect_max_x; + } + + if (!item_add) + return false; + + const bool disabled_global = (g.CurrentItemFlags & ImGuiItemFlags_Disabled) != 0; + if (disabled_item && !disabled_global) // Only testing this as an optimization + BeginDisabled(); + + // FIXME: We can standardize the behavior of those two, we could also keep the fast path of override ClipRect + full push on render only, + // which would be advantageous since most selectable are not selected. + if (span_all_columns && window->DC.CurrentColumns) + PushColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePushBackgroundChannel(); + + // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries + ImGuiButtonFlags button_flags = 0; + if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; } + if (flags & ImGuiSelectableFlags_NoSetKeyOwner) { button_flags |= ImGuiButtonFlags_NoSetKeyOwner; } + if (flags & ImGuiSelectableFlags_SelectOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; } + if (flags & ImGuiSelectableFlags_SelectOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; } + if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; } + if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; } + + const bool was_selected = selected; + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); + + // Auto-select when moved into + // - This will be more fully fleshed in the range-select branch + // - This is not exposed as it won't nicely work with some user side handling of shift/control + // - We cannot do 'if (g.NavJustMovedToId != id) { selected = false; pressed = was_selected; }' for two reasons + // - (1) it would require focus scope to be set, need exposing PushFocusScope() or equivalent (e.g. BeginSelection() calling PushFocusScope()) + // - (2) usage will fail with clipped items + // The multi-select API aim to fix those issues, e.g. may be replaced with a BeginSelection() API. + if ((flags & ImGuiSelectableFlags_SelectOnNav) && g.NavJustMovedToId != 0 && g.NavJustMovedToFocusScopeId == g.CurrentFocusScopeId) + if (g.NavJustMovedToId == id) + selected = pressed = true; + + // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard + if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover))) + { + if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent) + { + SetNavID(id, window->DC.NavLayerCurrent, g.CurrentFocusScopeId, WindowRectAbsToRel(window, bb)); // (bb == NavRect) + g.NavDisableHighlight = true; + } + } + if (pressed) + MarkItemEdited(id); + + if (flags & ImGuiSelectableFlags_AllowItemOverlap) + SetItemAllowOverlap(); + + // In this branch, Selectable() cannot toggle the selection so this will never trigger. + if (selected != was_selected) //-V547 + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_ToggledSelection; + + // Render + if (hovered || selected) + { + const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header); + RenderFrame(bb.Min, bb.Max, col, false, 0.0f); + } + RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding); + + if (span_all_columns && window->DC.CurrentColumns) + PopColumnsBackground(); + else if (span_all_columns && g.CurrentTable) + TablePopBackgroundChannel(); + + RenderTextClipped(text_min, text_max, label, NULL, &label_size, style.SelectableTextAlign, &bb); + + // Automatically close popups + if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(g.LastItemData.InFlags & ImGuiItemFlags_SelectableDontClosePopup)) + CloseCurrentPopup(); + + if (disabled_item && !disabled_global) + EndDisabled(); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + return pressed; //-V1020 +} + +bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags, const ImVec2& size_arg) +{ + if (Selectable(label, *p_selected, flags, size_arg)) + { + *p_selected = !*p_selected; + return true; + } + return false; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: ListBox +//------------------------------------------------------------------------- +// - BeginListBox() +// - EndListBox() +// - ListBox() +//------------------------------------------------------------------------- + +// Tip: To have a list filling the entire window width, use size.x = -FLT_MIN and pass an non-visible label e.g. "##empty" +// Tip: If your vertical size is calculated from an item count (e.g. 10 * item_height) consider adding a fractional part to facilitate seeing scrolling boundaries (e.g. 10.25 * item_height). +bool ImGui::BeginListBox(const char* label, const ImVec2& size_arg) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = GetID(label); + const ImVec2 label_size = CalcTextSize(label, NULL, true); + + // Size default to hold ~7.25 items. + // Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar. + ImVec2 size = ImFloor(CalcItemSize(size_arg, CalcItemWidth(), GetTextLineHeightWithSpacing() * 7.25f + style.FramePadding.y * 2.0f)); + ImVec2 frame_size = ImVec2(size.x, ImMax(size.y, label_size.y)); + ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f)); + g.NextItemData.ClearFlags(); + + if (!IsRectVisible(bb.Min, bb.Max)) + { + ItemSize(bb.GetSize(), style.FramePadding.y); + ItemAdd(bb, 0, &frame_bb); + return false; + } + + // FIXME-OPT: We could omit the BeginGroup() if label_size.x but would need to omit the EndGroup() as well. + BeginGroup(); + if (label_size.x > 0.0f) + { + ImVec2 label_pos = ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y); + RenderText(label_pos, label); + window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, label_pos + label_size); + } + + BeginChildFrame(id, frame_bb.GetSize()); + return true; +} + +#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS +// OBSOLETED in 1.81 (from February 2021) +bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items) +{ + // If height_in_items == -1, default height is maximum 7. + ImGuiContext& g = *GImGui; + float height_in_items_f = (height_in_items < 0 ? ImMin(items_count, 7) : height_in_items) + 0.25f; + ImVec2 size; + size.x = 0.0f; + size.y = GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f; + return BeginListBox(label, size); +} +#endif + +void ImGui::EndListBox() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT((window->Flags & ImGuiWindowFlags_ChildWindow) && "Mismatched BeginListBox/EndListBox calls. Did you test the return value of BeginListBox?"); + IM_UNUSED(window); + + EndChildFrame(); + EndGroup(); // This is only required to be able to do IsItemXXX query on the whole ListBox including label +} + +bool ImGui::ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_items) +{ + const bool value_changed = ListBox(label, current_item, Items_ArrayGetter, (void*)items, items_count, height_items); + return value_changed; +} + +// This is merely a helper around BeginListBox(), EndListBox(). +// Considering using those directly to submit custom data or store selection differently. +bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(void*, int, const char**), void* data, int items_count, int height_in_items) +{ + ImGuiContext& g = *GImGui; + + // Calculate size from "height_in_items" + if (height_in_items < 0) + height_in_items = ImMin(items_count, 7); + float height_in_items_f = height_in_items + 0.25f; + ImVec2 size(0.0f, ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + g.Style.FramePadding.y * 2.0f)); + + if (!BeginListBox(label, size)) + return false; + + // Assume all items have even height (= 1 line of text). If you need items of different height, + // you can create a custom version of ListBox() in your code without using the clipper. + bool value_changed = false; + ImGuiListClipper clipper; + clipper.Begin(items_count, GetTextLineHeightWithSpacing()); // We know exactly our line height here so we pass it as a minor optimization, but generally you don't need to. + while (clipper.Step()) + for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) + { + const char* item_text; + if (!items_getter(data, i, &item_text)) + item_text = "*Unknown item*"; + + PushID(i); + const bool item_selected = (i == *current_item); + if (Selectable(item_text, item_selected)) + { + *current_item = i; + value_changed = true; + } + if (item_selected) + SetItemDefaultFocus(); + PopID(); + } + EndListBox(); + + if (value_changed) + MarkItemEdited(g.LastItemData.ID); + + return value_changed; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: PlotLines, PlotHistogram +//------------------------------------------------------------------------- +// - PlotEx() [Internal] +// - PlotLines() +// - PlotHistogram() +//------------------------------------------------------------------------- +// Plot/Graph widgets are not very good. +// Consider writing your own, or using a third-party one, see: +// - ImPlot https://github.com/epezent/implot +// - others https://github.com/ocornut/imgui/wiki/Useful-Extensions +//------------------------------------------------------------------------- + +int ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, const ImVec2& size_arg) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return -1; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + + const ImVec2 label_size = CalcTextSize(label, NULL, true); + const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), label_size.y + style.FramePadding.y * 2.0f); + + const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size); + const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding); + const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0)); + ItemSize(total_bb, style.FramePadding.y); + if (!ItemAdd(total_bb, 0, &frame_bb)) + return -1; + const bool hovered = ItemHoverable(frame_bb, id); + + // Determine scale from values if not specified + if (scale_min == FLT_MAX || scale_max == FLT_MAX) + { + float v_min = FLT_MAX; + float v_max = -FLT_MAX; + for (int i = 0; i < values_count; i++) + { + const float v = values_getter(data, i); + if (v != v) // Ignore NaN values + continue; + v_min = ImMin(v_min, v); + v_max = ImMax(v_max, v); + } + if (scale_min == FLT_MAX) + scale_min = v_min; + if (scale_max == FLT_MAX) + scale_max = v_max; + } + + RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding); + + const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1; + int idx_hovered = -1; + if (values_count >= values_count_min) + { + int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); + int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0); + + // Tooltip on hover + if (hovered && inner_bb.Contains(g.IO.MousePos)) + { + const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f); + const int v_idx = (int)(t * item_count); + IM_ASSERT(v_idx >= 0 && v_idx < values_count); + + const float v0 = values_getter(data, (v_idx + values_offset) % values_count); + const float v1 = values_getter(data, (v_idx + 1 + values_offset) % values_count); + if (plot_type == ImGuiPlotType_Lines) + SetTooltip("%d: %8.4g\n%d: %8.4g", v_idx, v0, v_idx + 1, v1); + else if (plot_type == ImGuiPlotType_Histogram) + SetTooltip("%d: %8.4g", v_idx, v0); + idx_hovered = v_idx; + } + + const float t_step = 1.0f / (float)res_w; + const float inv_scale = (scale_min == scale_max) ? 0.0f : (1.0f / (scale_max - scale_min)); + + float v0 = values_getter(data, (0 + values_offset) % values_count); + float t0 = 0.0f; + ImVec2 tp0 = ImVec2( t0, 1.0f - ImSaturate((v0 - scale_min) * inv_scale) ); // Point in the normalized space of our target rectangle + float histogram_zero_line_t = (scale_min * scale_max < 0.0f) ? (1 + scale_min * inv_scale) : (scale_min < 0.0f ? 0.0f : 1.0f); // Where does the zero line stands + + const ImU32 col_base = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLines : ImGuiCol_PlotHistogram); + const ImU32 col_hovered = GetColorU32((plot_type == ImGuiPlotType_Lines) ? ImGuiCol_PlotLinesHovered : ImGuiCol_PlotHistogramHovered); + + for (int n = 0; n < res_w; n++) + { + const float t1 = t0 + t_step; + const int v1_idx = (int)(t0 * item_count + 0.5f); + IM_ASSERT(v1_idx >= 0 && v1_idx < values_count); + const float v1 = values_getter(data, (v1_idx + values_offset + 1) % values_count); + const ImVec2 tp1 = ImVec2( t1, 1.0f - ImSaturate((v1 - scale_min) * inv_scale) ); + + // NB: Draw calls are merged together by the DrawList system. Still, we should render our batch are lower level to save a bit of CPU. + ImVec2 pos0 = ImLerp(inner_bb.Min, inner_bb.Max, tp0); + ImVec2 pos1 = ImLerp(inner_bb.Min, inner_bb.Max, (plot_type == ImGuiPlotType_Lines) ? tp1 : ImVec2(tp1.x, histogram_zero_line_t)); + if (plot_type == ImGuiPlotType_Lines) + { + window->DrawList->AddLine(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); + } + else if (plot_type == ImGuiPlotType_Histogram) + { + if (pos1.x >= pos0.x + 2.0f) + pos1.x -= 1.0f; + window->DrawList->AddRectFilled(pos0, pos1, idx_hovered == v1_idx ? col_hovered : col_base); + } + + t0 = t1; + tp0 = tp1; + } + } + + // Text overlay + if (overlay_text) + RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, overlay_text, NULL, NULL, ImVec2(0.5f, 0.0f)); + + if (label_size.x > 0.0f) + RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label); + + // Return hovered index or -1 if none are hovered. + // This is currently not exposed in the public API because we need a larger redesign of the whole thing, but in the short-term we are making it available in PlotEx(). + return idx_hovered; +} + +struct ImGuiPlotArrayGetterData +{ + const float* Values; + int Stride; + + ImGuiPlotArrayGetterData(const float* values, int stride) { Values = values; Stride = stride; } +}; + +static float Plot_ArrayGetter(void* data, int idx) +{ + ImGuiPlotArrayGetterData* plot_data = (ImGuiPlotArrayGetterData*)data; + const float v = *(const float*)(const void*)((const unsigned char*)plot_data->Values + (size_t)idx * plot_data->Stride); + return v; +} + +void ImGui::PlotLines(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) +{ + ImGuiPlotArrayGetterData data(values, stride); + PlotEx(ImGuiPlotType_Lines, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotLines(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) +{ + PlotEx(ImGuiPlotType_Lines, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotHistogram(const char* label, const float* values, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size, int stride) +{ + ImGuiPlotArrayGetterData data(values, stride); + PlotEx(ImGuiPlotType_Histogram, label, &Plot_ArrayGetter, (void*)&data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +void ImGui::PlotHistogram(const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size) +{ + PlotEx(ImGuiPlotType_Histogram, label, values_getter, data, values_count, values_offset, overlay_text, scale_min, scale_max, graph_size); +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: Value helpers +// Those is not very useful, legacy API. +//------------------------------------------------------------------------- +// - Value() +//------------------------------------------------------------------------- + +void ImGui::Value(const char* prefix, bool b) +{ + Text("%s: %s", prefix, (b ? "true" : "false")); +} + +void ImGui::Value(const char* prefix, int v) +{ + Text("%s: %d", prefix, v); +} + +void ImGui::Value(const char* prefix, unsigned int v) +{ + Text("%s: %d", prefix, v); +} + +void ImGui::Value(const char* prefix, float v, const char* float_format) +{ + if (float_format) + { + char fmt[64]; + ImFormatString(fmt, IM_ARRAYSIZE(fmt), "%%s: %s", float_format); + Text(fmt, prefix, v); + } + else + { + Text("%s: %.3f", prefix, v); + } +} + +//------------------------------------------------------------------------- +// [SECTION] MenuItem, BeginMenu, EndMenu, etc. +//------------------------------------------------------------------------- +// - ImGuiMenuColumns [Internal] +// - BeginMenuBar() +// - EndMenuBar() +// - BeginMainMenuBar() +// - EndMainMenuBar() +// - BeginMenu() +// - EndMenu() +// - MenuItemEx() [Internal] +// - MenuItem() +//------------------------------------------------------------------------- + +// Helpers for internal use +void ImGuiMenuColumns::Update(float spacing, bool window_reappearing) +{ + if (window_reappearing) + memset(Widths, 0, sizeof(Widths)); + Spacing = (ImU16)spacing; + CalcNextTotalWidth(true); + memset(Widths, 0, sizeof(Widths)); + TotalWidth = NextTotalWidth; + NextTotalWidth = 0; +} + +void ImGuiMenuColumns::CalcNextTotalWidth(bool update_offsets) +{ + ImU16 offset = 0; + bool want_spacing = false; + for (int i = 0; i < IM_ARRAYSIZE(Widths); i++) + { + ImU16 width = Widths[i]; + if (want_spacing && width > 0) + offset += Spacing; + want_spacing |= (width > 0); + if (update_offsets) + { + if (i == 1) { OffsetLabel = offset; } + if (i == 2) { OffsetShortcut = offset; } + if (i == 3) { OffsetMark = offset; } + } + offset += width; + } + NextTotalWidth = offset; +} + +float ImGuiMenuColumns::DeclColumns(float w_icon, float w_label, float w_shortcut, float w_mark) +{ + Widths[0] = ImMax(Widths[0], (ImU16)w_icon); + Widths[1] = ImMax(Widths[1], (ImU16)w_label); + Widths[2] = ImMax(Widths[2], (ImU16)w_shortcut); + Widths[3] = ImMax(Widths[3], (ImU16)w_mark); + CalcNextTotalWidth(false); + return (float)ImMax(TotalWidth, NextTotalWidth); +} + +// FIXME: Provided a rectangle perhaps e.g. a BeginMenuBarEx() could be used anywhere.. +// Currently the main responsibility of this function being to setup clip-rect + horizontal layout + menu navigation layer. +// Ideally we also want this to be responsible for claiming space out of the main window scrolling rectangle, in which case ImGuiWindowFlags_MenuBar will become unnecessary. +// Then later the same system could be used for multiple menu-bars, scrollbars, side-bars. +bool ImGui::BeginMenuBar() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + if (!(window->Flags & ImGuiWindowFlags_MenuBar)) + return false; + + IM_ASSERT(!window->DC.MenuBarAppending); + BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore + PushID("##menubar"); + + // We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect. + // We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy. + ImRect bar_rect = window->MenuBarRect(); + ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y)); + clip_rect.ClipWith(window->OuterRectClipped); + PushClipRect(clip_rect.Min, clip_rect.Max, false); + + // We overwrite CursorMaxPos because BeginGroup sets it to CursorPos (essentially the .EmitItem hack in EndMenuBar() would need something analogous here, maybe a BeginGroupEx() with flags). + window->DC.CursorPos = window->DC.CursorMaxPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y); + window->DC.LayoutType = ImGuiLayoutType_Horizontal; + window->DC.IsSameLine = false; + window->DC.NavLayerCurrent = ImGuiNavLayer_Menu; + window->DC.MenuBarAppending = true; + AlignTextToFramePadding(); + return true; +} + +void ImGui::EndMenuBar() +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return; + ImGuiContext& g = *GImGui; + + // Nav: When a move request within one of our child menu failed, capture the request to navigate among our siblings. + if (NavMoveRequestButNoResultYet() && (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right) && (g.NavWindow->Flags & ImGuiWindowFlags_ChildMenu)) + { + // Try to find out if the request is for one of our child menu + ImGuiWindow* nav_earliest_child = g.NavWindow; + while (nav_earliest_child->ParentWindow && (nav_earliest_child->ParentWindow->Flags & ImGuiWindowFlags_ChildMenu)) + nav_earliest_child = nav_earliest_child->ParentWindow; + if (nav_earliest_child->ParentWindow == window && nav_earliest_child->DC.ParentLayoutType == ImGuiLayoutType_Horizontal && (g.NavMoveFlags & ImGuiNavMoveFlags_Forwarded) == 0) + { + // To do so we claim focus back, restore NavId and then process the movement request for yet another frame. + // This involve a one-frame delay which isn't very problematic in this situation. We could remove it by scoring in advance for multiple window (probably not worth bothering) + const ImGuiNavLayer layer = ImGuiNavLayer_Menu; + IM_ASSERT(window->DC.NavLayersActiveMaskNext & (1 << layer)); // Sanity check (FIXME: Seems unnecessary) + FocusWindow(window); + SetNavID(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]); + g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection. + g.NavDisableMouseHover = g.NavMousePosDirty = true; + NavMoveRequestForward(g.NavMoveDir, g.NavMoveClipDir, g.NavMoveFlags, g.NavMoveScrollFlags); // Repeat + } + } + + IM_MSVC_WARNING_SUPPRESS(6011); // Static Analysis false positive "warning C6011: Dereferencing NULL pointer 'window'" + IM_ASSERT(window->Flags & ImGuiWindowFlags_MenuBar); + IM_ASSERT(window->DC.MenuBarAppending); + PopClipRect(); + PopID(); + window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->Pos.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos. + g.GroupStack.back().EmitItem = false; + EndGroup(); // Restore position on layer 0 + window->DC.LayoutType = ImGuiLayoutType_Vertical; + window->DC.IsSameLine = false; + window->DC.NavLayerCurrent = ImGuiNavLayer_Main; + window->DC.MenuBarAppending = false; +} + +// Important: calling order matters! +// FIXME: Somehow overlapping with docking tech. +// FIXME: The "rect-cut" aspect of this could be formalized into a lower-level helper (rect-cut: https://halt.software/dead-simple-layouts) +bool ImGui::BeginViewportSideBar(const char* name, ImGuiViewport* viewport_p, ImGuiDir dir, float axis_size, ImGuiWindowFlags window_flags) +{ + IM_ASSERT(dir != ImGuiDir_None); + + ImGuiWindow* bar_window = FindWindowByName(name); + if (bar_window == NULL || bar_window->BeginCount == 0) + { + // Calculate and set window size/position + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)(viewport_p ? viewport_p : GetMainViewport()); + ImRect avail_rect = viewport->GetBuildWorkRect(); + ImGuiAxis axis = (dir == ImGuiDir_Up || dir == ImGuiDir_Down) ? ImGuiAxis_Y : ImGuiAxis_X; + ImVec2 pos = avail_rect.Min; + if (dir == ImGuiDir_Right || dir == ImGuiDir_Down) + pos[axis] = avail_rect.Max[axis] - axis_size; + ImVec2 size = avail_rect.GetSize(); + size[axis] = axis_size; + SetNextWindowPos(pos); + SetNextWindowSize(size); + + // Report our size into work area (for next frame) using actual window size + if (dir == ImGuiDir_Up || dir == ImGuiDir_Left) + viewport->BuildWorkOffsetMin[axis] += axis_size; + else if (dir == ImGuiDir_Down || dir == ImGuiDir_Right) + viewport->BuildWorkOffsetMax[axis] -= axis_size; + } + + window_flags |= ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove; + PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f); + PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0)); // Lift normal size constraint + bool is_open = Begin(name, NULL, window_flags); + PopStyleVar(2); + + return is_open; +} + +bool ImGui::BeginMainMenuBar() +{ + ImGuiContext& g = *GImGui; + ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)GetMainViewport(); + + // For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set. + // FIXME: This could be generalized as an opt-in way to clamp window->DC.CursorStartPos to avoid SafeArea? + // FIXME: Consider removing support for safe area down the line... it's messy. Nowadays consoles have support for TV calibration in OS settings. + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f)); + ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar; + float height = GetFrameHeight(); + bool is_open = BeginViewportSideBar("##MainMenuBar", viewport, ImGuiDir_Up, height, window_flags); + g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f); + + if (is_open) + BeginMenuBar(); + else + End(); + return is_open; +} + +void ImGui::EndMainMenuBar() +{ + EndMenuBar(); + + // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window + // FIXME: With this strategy we won't be able to restore a NULL focus. + ImGuiContext& g = *GImGui; + if (g.CurrentWindow == g.NavWindow && g.NavLayer == ImGuiNavLayer_Main && !g.NavAnyRequest) + FocusTopMostWindowUnderOne(g.NavWindow, NULL); + + End(); +} + +static bool IsRootOfOpenMenuSet() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if ((g.OpenPopupStack.Size <= g.BeginPopupStack.Size) || (window->Flags & ImGuiWindowFlags_ChildMenu)) + return false; + + // Initially we used 'upper_popup->OpenParentId == window->IDStack.back()' to differentiate multiple menu sets from each others + // (e.g. inside menu bar vs loose menu items) based on parent ID. + // This would however prevent the use of e.g. PuhsID() user code submitting menus. + // Previously this worked between popup and a first child menu because the first child menu always had the _ChildWindow flag, + // making hovering on parent popup possible while first child menu was focused - but this was generally a bug with other side effects. + // Instead we don't treat Popup specifically (in order to consistently support menu features in them), maybe the first child menu of a Popup + // doesn't have the _ChildWindow flag, and we rely on this IsRootOfOpenMenuSet() check to allow hovering between root window/popup and first child menu. + // In the end, lack of ID check made it so we could no longer differentiate between separate menu sets. To compensate for that, we at least check parent window nav layer. + // This fixes the most common case of menu opening on hover when moving between window content and menu bar. Multiple different menu sets in same nav layer would still + // open on hover, but that should be a lesser problem, because if such menus are close in proximity in window content then it won't feel weird and if they are far apart + // it likely won't be a problem anyone runs into. + const ImGuiPopupData* upper_popup = &g.OpenPopupStack[g.BeginPopupStack.Size]; + return (window->DC.NavLayerCurrent == upper_popup->ParentNavLayer && upper_popup->Window && (upper_popup->Window->Flags & ImGuiWindowFlags_ChildMenu)); +} + +bool ImGui::BeginMenuEx(const char* label, const char* icon, bool enabled) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + const ImGuiStyle& style = g.Style; + const ImGuiID id = window->GetID(label); + bool menu_is_open = IsPopupOpen(id, ImGuiPopupFlags_None); + + // Sub-menus are ChildWindow so that mouse can be hovering across them (otherwise top-most popup menu would steal focus and not allow hovering on parent menu) + // The first menu in a hierarchy isn't so hovering doesn't get across (otherwise e.g. resizing borders with ImGuiButtonFlags_FlattenChildren would react), but top-most BeginMenu() will bypass that limitation. + ImGuiWindowFlags window_flags = ImGuiWindowFlags_ChildMenu | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoNavFocus; + if (window->Flags & ImGuiWindowFlags_ChildMenu) + window_flags |= ImGuiWindowFlags_ChildWindow; + + // If a menu with same the ID was already submitted, we will append to it, matching the behavior of Begin(). + // We are relying on a O(N) search - so O(N log N) over the frame - which seems like the most efficient for the expected small amount of BeginMenu() calls per frame. + // If somehow this is ever becoming a problem we can switch to use e.g. ImGuiStorage mapping key to last frame used. + if (g.MenusIdSubmittedThisFrame.contains(id)) + { + if (menu_is_open) + menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + else + g.NextWindowData.ClearFlags(); // we behave like Begin() and need to consume those values + return menu_is_open; + } + + // Tag menu as used. Next time BeginMenu() with same ID is called it will append to existing menu + g.MenusIdSubmittedThisFrame.push_back(id); + + ImVec2 label_size = CalcTextSize(label, NULL, true); + + // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent without always being a Child window) + // This is only done for items for the menu set and not the full parent window. + const bool menuset_is_open = IsRootOfOpenMenuSet(); + if (menuset_is_open) + PushItemFlag(ImGuiItemFlags_NoWindowHoverableCheck, true); + + // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu, + // However the final position is going to be different! It is chosen by FindBestWindowPosForPopup(). + // e.g. Menus tend to overlap each other horizontally to amplify relative Z-ordering. + ImVec2 popup_pos, pos = window->DC.CursorPos; + PushID(label); + if (!enabled) + BeginDisabled(); + const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; + bool pressed; + + // We use ImGuiSelectableFlags_NoSetKeyOwner to allow down on one menu item, move, up on another. + const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_NoSetKeyOwner | ImGuiSelectableFlags_SelectOnClick | ImGuiSelectableFlags_DontClosePopups; + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + { + // Menu inside an horizontal menu bar + // Selectable extend their highlight by half ItemSpacing in each direction. + // For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin() + popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight()); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); + float w = label_size.x; + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + pressed = Selectable("", menu_is_open, selectable_flags, ImVec2(w, label_size.y)); + RenderText(text_pos, label); + PopStyleVar(); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + } + else + { + // Menu inside a regular/vertical menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. + popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y); + float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; + float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, 0.0f, checkmark_w); // Feedback to next frame + float extra_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + pressed = Selectable("", menu_is_open, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y)); + RenderText(text_pos, label); + if (icon_w > 0.0f) + RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); + RenderArrow(window->DrawList, pos + ImVec2(offsets->OffsetMark + extra_w + g.FontSize * 0.30f, 0.0f), GetColorU32(ImGuiCol_Text), ImGuiDir_Right); + } + if (!enabled) + EndDisabled(); + + const bool hovered = (g.HoveredId == id) && enabled && !g.NavDisableMouseHover; + if (menuset_is_open) + PopItemFlag(); + + bool want_open = false; + bool want_close = false; + if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu)) + { + // Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu + // Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive. + bool moving_toward_child_menu = false; + ImGuiPopupData* child_popup = (g.BeginPopupStack.Size < g.OpenPopupStack.Size) ? &g.OpenPopupStack[g.BeginPopupStack.Size] : NULL; // Popup candidate (testing below) + ImGuiWindow* child_menu_window = (child_popup && child_popup->Window && child_popup->Window->ParentWindow == window) ? child_popup->Window : NULL; + if (g.HoveredWindow == window && child_menu_window != NULL) + { + float ref_unit = g.FontSize; // FIXME-DPI + float child_dir = (window->Pos.x < child_menu_window->Pos.x) ? 1.0f : -1.0f; + ImRect next_window_rect = child_menu_window->Rect(); + ImVec2 ta = (g.IO.MousePos - g.IO.MouseDelta); + ImVec2 tb = (child_dir > 0.0f) ? next_window_rect.GetTL() : next_window_rect.GetTR(); + ImVec2 tc = (child_dir > 0.0f) ? next_window_rect.GetBL() : next_window_rect.GetBR(); + float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, ref_unit * 0.5f, ref_unit * 2.5f); // add a bit of extra slack. + ta.x += child_dir * -0.5f; + tb.x += child_dir * ref_unit; + tc.x += child_dir * ref_unit; + tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -ref_unit * 8.0f); // triangle has maximum height to limit the slope and the bias toward large sub-menus + tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +ref_unit * 8.0f); + moving_toward_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos); + //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_toward_child_menu ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG] + } + + // The 'HovereWindow == window' check creates an inconsistency (e.g. moving away from menu slowly tends to hit same window, whereas moving away fast does not) + // But we also need to not close the top-menu menu when moving over void. Perhaps we should extend the triangle check to a larger polygon. + // (Remember to test this on BeginPopup("A")->BeginMenu("B") sequence which behaves slightly differently as B isn't a Child of A and hovering isn't shared.) + if (menu_is_open && !hovered && g.HoveredWindow == window && !moving_toward_child_menu && !g.NavDisableMouseHover) + want_close = true; + + // Open + if (!menu_is_open && pressed) // Click/activate to open + want_open = true; + else if (!menu_is_open && hovered && !moving_toward_child_menu) // Hover to open + want_open = true; + if (g.NavId == id && g.NavMoveDir == ImGuiDir_Right) // Nav-Right to open + { + want_open = true; + NavMoveRequestCancel(); + } + } + else + { + // Menu bar + if (menu_is_open && pressed && menuset_is_open) // Click an open menu again to close it + { + want_close = true; + want_open = menu_is_open = false; + } + else if (pressed || (hovered && menuset_is_open && !menu_is_open)) // First click to open, then hover to open others + { + want_open = true; + } + else if (g.NavId == id && g.NavMoveDir == ImGuiDir_Down) // Nav-Down to open + { + want_open = true; + NavMoveRequestCancel(); + } + } + + if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }' + want_close = true; + if (want_close && IsPopupOpen(id, ImGuiPopupFlags_None)) + ClosePopupToLevel(g.BeginPopupStack.Size, true); + + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Openable | (menu_is_open ? ImGuiItemStatusFlags_Opened : 0)); + PopID(); + + if (want_open && !menu_is_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size) + { + // Don't reopen/recycle same menu level in the same frame, first close the other menu and yield for a frame. + OpenPopup(label); + } + else if (want_open) + { + menu_is_open = true; + OpenPopup(label); + } + + if (menu_is_open) + { + ImGuiLastItemData last_item_in_parent = g.LastItemData; + SetNextWindowPos(popup_pos, ImGuiCond_Always); // Note: misleading: the value will serve as reference for FindBestWindowPosForPopup(), not actual pos. + PushStyleVar(ImGuiStyleVar_ChildRounding, style.PopupRounding); // First level will use _PopupRounding, subsequent will use _ChildRounding + menu_is_open = BeginPopupEx(id, window_flags); // menu_is_open can be 'false' when the popup is completely clipped (e.g. zero size display) + PopStyleVar(); + if (menu_is_open) + { + // Restore LastItemData so IsItemXXXX functions can work after BeginMenu()/EndMenu() + // (This fixes using IsItemClicked() and IsItemHovered(), but IsItemHovered() also relies on its support for ImGuiItemFlags_NoWindowHoverableCheck) + g.LastItemData = last_item_in_parent; + if (g.HoveredWindow == window) + g.LastItemData.StatusFlags |= ImGuiItemStatusFlags_HoveredWindow; + } + } + else + { + g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values + } + + return menu_is_open; +} + +bool ImGui::BeginMenu(const char* label, bool enabled) +{ + return BeginMenuEx(label, NULL, enabled); +} + +void ImGui::EndMenu() +{ + // Nav: When a left move request our menu failed, close ourselves. + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginMenu()/EndMenu() calls + ImGuiWindow* parent_window = window->ParentWindow; // Should always be != NULL is we passed assert. + if (window->BeginCount == window->BeginCountPreviousFrame) + if (g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet()) + if (g.NavWindow && (g.NavWindow->RootWindowForNav == window) && parent_window->DC.LayoutType == ImGuiLayoutType_Vertical) + { + ClosePopupToLevel(g.BeginPopupStack.Size - 1, true); + NavMoveRequestCancel(); + } + + EndPopup(); +} + +bool ImGui::MenuItemEx(const char* label, const char* icon, const char* shortcut, bool selected, bool enabled) +{ + ImGuiWindow* window = GetCurrentWindow(); + if (window->SkipItems) + return false; + + ImGuiContext& g = *GImGui; + ImGuiStyle& style = g.Style; + ImVec2 pos = window->DC.CursorPos; + ImVec2 label_size = CalcTextSize(label, NULL, true); + + // See BeginMenuEx() for comments about this. + const bool menuset_is_open = IsRootOfOpenMenuSet(); + if (menuset_is_open) + PushItemFlag(ImGuiItemFlags_NoWindowHoverableCheck, true); + + // We've been using the equivalent of ImGuiSelectableFlags_SetNavIdOnHover on all Selectable() since early Nav system days (commit 43ee5d73), + // but I am unsure whether this should be kept at all. For now moved it to be an opt-in feature used by menus only. + bool pressed; + PushID(label); + if (!enabled) + BeginDisabled(); + + // We use ImGuiSelectableFlags_NoSetKeyOwner to allow down on one menu item, move, up on another. + const ImGuiSelectableFlags selectable_flags = ImGuiSelectableFlags_SelectOnRelease | ImGuiSelectableFlags_NoSetKeyOwner | ImGuiSelectableFlags_SetNavIdOnHover; + const ImGuiMenuColumns* offsets = &window->DC.MenuColumns; + if (window->DC.LayoutType == ImGuiLayoutType_Horizontal) + { + // Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful + // Note that in this situation: we don't render the shortcut, we render a highlight instead of the selected tick mark. + float w = label_size.x; + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f); + ImVec2 text_pos(window->DC.CursorPos.x + offsets->OffsetLabel, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset); + PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y)); + pressed = Selectable("", selected, selectable_flags, ImVec2(w, 0.0f)); + PopStyleVar(); + if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) + RenderText(text_pos, label); + window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar(). + } + else + { + // Menu item inside a vertical menu + // (In a typical menu window where all items are BeginMenu() or MenuItem() calls, extra_w will always be 0.0f. + // Only when they are other items sticking out we're going to add spacing, yet only register minimum width into the layout system. + float icon_w = (icon && icon[0]) ? CalcTextSize(icon, NULL).x : 0.0f; + float shortcut_w = (shortcut && shortcut[0]) ? CalcTextSize(shortcut, NULL).x : 0.0f; + float checkmark_w = IM_FLOOR(g.FontSize * 1.20f); + float min_w = window->DC.MenuColumns.DeclColumns(icon_w, label_size.x, shortcut_w, checkmark_w); // Feedback for next frame + float stretch_w = ImMax(0.0f, GetContentRegionAvail().x - min_w); + pressed = Selectable("", false, selectable_flags | ImGuiSelectableFlags_SpanAvailWidth, ImVec2(min_w, label_size.y)); + if (g.LastItemData.StatusFlags & ImGuiItemStatusFlags_Visible) + { + RenderText(pos + ImVec2(offsets->OffsetLabel, 0.0f), label); + if (icon_w > 0.0f) + RenderText(pos + ImVec2(offsets->OffsetIcon, 0.0f), icon); + if (shortcut_w > 0.0f) + { + PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]); + RenderText(pos + ImVec2(offsets->OffsetShortcut + stretch_w, 0.0f), shortcut, NULL, false); + PopStyleColor(); + } + if (selected) + RenderCheckMark(window->DrawList, pos + ImVec2(offsets->OffsetMark + stretch_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(ImGuiCol_Text), g.FontSize * 0.866f); + } + } + IMGUI_TEST_ENGINE_ITEM_INFO(g.LastItemData.ID, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (selected ? ImGuiItemStatusFlags_Checked : 0)); + if (!enabled) + EndDisabled(); + PopID(); + if (menuset_is_open) + PopItemFlag(); + + return pressed; +} + +bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, bool enabled) +{ + return MenuItemEx(label, NULL, shortcut, selected, enabled); +} + +bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled) +{ + if (MenuItemEx(label, NULL, shortcut, p_selected ? *p_selected : false, enabled)) + { + if (p_selected) + *p_selected = !*p_selected; + return true; + } + return false; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: BeginTabBar, EndTabBar, etc. +//------------------------------------------------------------------------- +// - BeginTabBar() +// - BeginTabBarEx() [Internal] +// - EndTabBar() +// - TabBarLayout() [Internal] +// - TabBarCalcTabID() [Internal] +// - TabBarCalcMaxTabWidth() [Internal] +// - TabBarFindTabById() [Internal] +// - TabBarFindTabByOrder() [Internal] +// - TabBarGetCurrentTab() [Internal] +// - TabBarGetTabName() [Internal] +// - TabBarRemoveTab() [Internal] +// - TabBarCloseTab() [Internal] +// - TabBarScrollClamp() [Internal] +// - TabBarScrollToTab() [Internal] +// - TabBarQueueFocus() [Internal] +// - TabBarQueueReorder() [Internal] +// - TabBarProcessReorderFromMousePos() [Internal] +// - TabBarProcessReorder() [Internal] +// - TabBarScrollingButtons() [Internal] +// - TabBarTabListPopupButton() [Internal] +//------------------------------------------------------------------------- + +struct ImGuiTabBarSection +{ + int TabCount; // Number of tabs in this section. + float Width; // Sum of width of tabs in this section (after shrinking down) + float Spacing; // Horizontal spacing at the end of the section. + + ImGuiTabBarSection() { memset(this, 0, sizeof(*this)); } +}; + +namespace ImGui +{ + static void TabBarLayout(ImGuiTabBar* tab_bar); + static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label, ImGuiWindow* docked_window); + static float TabBarCalcMaxTabWidth(); + static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling); + static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections); + static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar); + static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar); +} + +ImGuiTabBar::ImGuiTabBar() +{ + memset(this, 0, sizeof(*this)); + CurrFrameVisible = PrevFrameVisible = -1; + LastTabItemIdx = -1; +} + +static inline int TabItemGetSectionIdx(const ImGuiTabItem* tab) +{ + return (tab->Flags & ImGuiTabItemFlags_Leading) ? 0 : (tab->Flags & ImGuiTabItemFlags_Trailing) ? 2 : 1; +} + +static int IMGUI_CDECL TabItemComparerBySection(const void* lhs, const void* rhs) +{ + const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; + const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; + const int a_section = TabItemGetSectionIdx(a); + const int b_section = TabItemGetSectionIdx(b); + if (a_section != b_section) + return a_section - b_section; + return (int)(a->IndexDuringLayout - b->IndexDuringLayout); +} + +static int IMGUI_CDECL TabItemComparerByBeginOrder(const void* lhs, const void* rhs) +{ + const ImGuiTabItem* a = (const ImGuiTabItem*)lhs; + const ImGuiTabItem* b = (const ImGuiTabItem*)rhs; + return (int)(a->BeginOrder - b->BeginOrder); +} + +static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiPtrOrIndex& ref) +{ + ImGuiContext& g = *GImGui; + return ref.Ptr ? (ImGuiTabBar*)ref.Ptr : g.TabBars.GetByIndex(ref.Index); +} + +static ImGuiPtrOrIndex GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + if (g.TabBars.Contains(tab_bar)) + return ImGuiPtrOrIndex(g.TabBars.GetIndex(tab_bar)); + return ImGuiPtrOrIndex(tab_bar); +} + +bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiID id = window->GetID(str_id); + ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id); + ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2); + tab_bar->ID = id; + return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused); +} + +bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + if ((flags & ImGuiTabBarFlags_DockNode) == 0) + PushOverrideID(tab_bar->ID); + + // Add to stack + g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar)); + g.CurrentTabBar = tab_bar; + + // Append with multiple BeginTabBar()/EndTabBar() pairs. + tab_bar->BackupCursorPos = window->DC.CursorPos; + if (tab_bar->CurrFrameVisible == g.FrameCount) + { + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); + tab_bar->BeginCount++; + return true; + } + + // Ensure correct ordering when toggling ImGuiTabBarFlags_Reorderable flag, or when a new tab was added while being not reorderable + if ((flags & ImGuiTabBarFlags_Reorderable) != (tab_bar->Flags & ImGuiTabBarFlags_Reorderable) || (tab_bar->TabsAddedNew && !(flags & ImGuiTabBarFlags_Reorderable))) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByBeginOrder); + tab_bar->TabsAddedNew = false; + + // Flags + if ((flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0) + flags |= ImGuiTabBarFlags_FittingPolicyDefault_; + + tab_bar->Flags = flags; + tab_bar->BarRect = tab_bar_bb; + tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab() + tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible; + tab_bar->CurrFrameVisible = g.FrameCount; + tab_bar->PrevTabsContentsHeight = tab_bar->CurrTabsContentsHeight; + tab_bar->CurrTabsContentsHeight = 0.0f; + tab_bar->ItemSpacingY = g.Style.ItemSpacing.y; + tab_bar->FramePadding = g.Style.FramePadding; + tab_bar->TabsActiveCount = 0; + tab_bar->LastTabItemIdx = -1; + tab_bar->BeginCount = 1; + + // Set cursor pos in a way which only be used in the off-chance the user erroneously submits item before BeginTabItem(): items will overlap + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.y + tab_bar->ItemSpacingY); + + // Draw separator + const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive); + const float y = tab_bar->BarRect.Max.y - 1.0f; + { + const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f); + const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f); + window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f); + } + return true; +} + +void ImGui::EndTabBar() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!"); + return; + } + + // Fallback in case no TabItem have been submitted + if (tab_bar->WantLayout) + TabBarLayout(tab_bar); + + // Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed(). + const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); + if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing) + { + tab_bar->CurrTabsContentsHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, tab_bar->CurrTabsContentsHeight); + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->CurrTabsContentsHeight; + } + else + { + window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->PrevTabsContentsHeight; + } + if (tab_bar->BeginCount > 1) + window->DC.CursorPos = tab_bar->BackupCursorPos; + + tab_bar->LastTabItemIdx = -1; + if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0) + PopID(); + + g.CurrentTabBarStack.pop_back(); + g.CurrentTabBar = g.CurrentTabBarStack.empty() ? NULL : GetTabBarFromTabBarRef(g.CurrentTabBarStack.back()); +} + +// This is called only once a frame before by the first call to ItemTab() +// The reason we're not calling it in BeginTabBar() is to leave a chance to the user to call the SetTabItemClosed() functions. +static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + tab_bar->WantLayout = false; + + // Garbage collect by compacting list + // Detect if we need to sort out tab list (e.g. in rare case where a tab changed section) + int tab_dst_n = 0; + bool need_sort_by_section = false; + ImGuiTabBarSection sections[3]; // Layout sections: Leading, Central, Trailing + for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n]; + if (tab->LastFrameVisible < tab_bar->PrevFrameVisible || tab->WantClose) + { + // Remove tab + if (tab_bar->VisibleTabId == tab->ID) { tab_bar->VisibleTabId = 0; } + if (tab_bar->SelectedTabId == tab->ID) { tab_bar->SelectedTabId = 0; } + if (tab_bar->NextSelectedTabId == tab->ID) { tab_bar->NextSelectedTabId = 0; } + continue; + } + if (tab_dst_n != tab_src_n) + tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n]; + + tab = &tab_bar->Tabs[tab_dst_n]; + tab->IndexDuringLayout = (ImS16)tab_dst_n; + + // We will need sorting if tabs have changed section (e.g. moved from one of Leading/Central/Trailing to another) + int curr_tab_section_n = TabItemGetSectionIdx(tab); + if (tab_dst_n > 0) + { + ImGuiTabItem* prev_tab = &tab_bar->Tabs[tab_dst_n - 1]; + int prev_tab_section_n = TabItemGetSectionIdx(prev_tab); + if (curr_tab_section_n == 0 && prev_tab_section_n != 0) + need_sort_by_section = true; + if (prev_tab_section_n == 2 && curr_tab_section_n != 2) + need_sort_by_section = true; + } + + sections[curr_tab_section_n].TabCount++; + tab_dst_n++; + } + if (tab_bar->Tabs.Size != tab_dst_n) + tab_bar->Tabs.resize(tab_dst_n); + + if (need_sort_by_section) + ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerBySection); + + // Calculate spacing between sections + sections[0].Spacing = sections[0].TabCount > 0 && (sections[1].TabCount + sections[2].TabCount) > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + sections[1].Spacing = sections[1].TabCount > 0 && sections[2].TabCount > 0 ? g.Style.ItemInnerSpacing.x : 0.0f; + + // Setup next selected tab + ImGuiID scroll_to_tab_id = 0; + if (tab_bar->NextSelectedTabId) + { + tab_bar->SelectedTabId = tab_bar->NextSelectedTabId; + tab_bar->NextSelectedTabId = 0; + scroll_to_tab_id = tab_bar->SelectedTabId; + } + + // Process order change request (we could probably process it when requested but it's just saner to do it in a single spot). + if (tab_bar->ReorderRequestTabId != 0) + { + if (TabBarProcessReorder(tab_bar)) + if (tab_bar->ReorderRequestTabId == tab_bar->SelectedTabId) + scroll_to_tab_id = tab_bar->ReorderRequestTabId; + tab_bar->ReorderRequestTabId = 0; + } + + // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!) + const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0; + if (tab_list_popup_button) + if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Min.x! + scroll_to_tab_id = tab_bar->SelectedTabId = tab_to_select->ID; + + // Leading/Trailing tabs will be shrink only if central one aren't visible anymore, so layout the shrink data as: leading, trailing, central + // (whereas our tabs are stored as: leading, central, trailing) + int shrink_buffer_indexes[3] = { 0, sections[0].TabCount + sections[2].TabCount, sections[0].TabCount }; + g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size); + + // Compute ideal tabs widths + store them into shrink buffer + ImGuiTabItem* most_recently_selected_tab = NULL; + int curr_section_n = -1; + bool found_selected_tab_id = false; + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible); + + if ((most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected) && !(tab->Flags & ImGuiTabItemFlags_Button)) + most_recently_selected_tab = tab; + if (tab->ID == tab_bar->SelectedTabId) + found_selected_tab_id = true; + if (scroll_to_tab_id == 0 && g.NavJustMovedToId == tab->ID) + scroll_to_tab_id = tab->ID; + + // Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar. + // Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet, + // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window. + const char* tab_name = TabBarGetTabName(tab_bar, tab); + const bool has_close_button_or_unsaved_marker = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) == 0 || (tab->Flags & ImGuiTabItemFlags_UnsavedDocument); + tab->ContentWidth = (tab->RequestedWidth >= 0.0f) ? tab->RequestedWidth : TabItemCalcSize(tab_name, has_close_button_or_unsaved_marker).x; + + int section_n = TabItemGetSectionIdx(tab); + ImGuiTabBarSection* section = §ions[section_n]; + section->Width += tab->ContentWidth + (section_n == curr_section_n ? g.Style.ItemInnerSpacing.x : 0.0f); + curr_section_n = section_n; + + // Store data so we can build an array sorted by width if we need to shrink tabs down + IM_MSVC_WARNING_SUPPRESS(6385); + ImGuiShrinkWidthItem* shrink_width_item = &g.ShrinkWidthBuffer[shrink_buffer_indexes[section_n]++]; + shrink_width_item->Index = tab_n; + shrink_width_item->Width = shrink_width_item->InitialWidth = tab->ContentWidth; + tab->Width = ImMax(tab->ContentWidth, 1.0f); + } + + // Compute total ideal width (used for e.g. auto-resizing a window) + tab_bar->WidthAllTabsIdeal = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) + tab_bar->WidthAllTabsIdeal += sections[section_n].Width + sections[section_n].Spacing; + + // Horizontal scrolling buttons + // (note that TabBarScrollButtons() will alter BarRect.Max.x) + if ((tab_bar->WidthAllTabsIdeal > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll)) + if (ImGuiTabItem* scroll_and_select_tab = TabBarScrollingButtons(tab_bar)) + { + scroll_to_tab_id = scroll_and_select_tab->ID; + if ((scroll_and_select_tab->Flags & ImGuiTabItemFlags_Button) == 0) + tab_bar->SelectedTabId = scroll_to_tab_id; + } + + // Shrink widths if full tabs don't fit in their allocated space + float section_0_w = sections[0].Width + sections[0].Spacing; + float section_1_w = sections[1].Width + sections[1].Spacing; + float section_2_w = sections[2].Width + sections[2].Spacing; + bool central_section_is_visible = (section_0_w + section_2_w) < tab_bar->BarRect.GetWidth(); + float width_excess; + if (central_section_is_visible) + width_excess = ImMax(section_1_w - (tab_bar->BarRect.GetWidth() - section_0_w - section_2_w), 0.0f); // Excess used to shrink central section + else + width_excess = (section_0_w + section_2_w) - tab_bar->BarRect.GetWidth(); // Excess used to shrink leading/trailing section + + // With ImGuiTabBarFlags_FittingPolicyScroll policy, we will only shrink leading/trailing if the central section is not visible anymore + if (width_excess >= 1.0f && ((tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown) || !central_section_is_visible)) + { + int shrink_data_count = (central_section_is_visible ? sections[1].TabCount : sections[0].TabCount + sections[2].TabCount); + int shrink_data_offset = (central_section_is_visible ? sections[0].TabCount + sections[2].TabCount : 0); + ShrinkWidths(g.ShrinkWidthBuffer.Data + shrink_data_offset, shrink_data_count, width_excess); + + // Apply shrunk values into tabs and sections + for (int tab_n = shrink_data_offset; tab_n < shrink_data_offset + shrink_data_count; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index]; + float shrinked_width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width); + if (shrinked_width < 0.0f) + continue; + + shrinked_width = ImMax(1.0f, shrinked_width); + int section_n = TabItemGetSectionIdx(tab); + sections[section_n].Width -= (tab->Width - shrinked_width); + tab->Width = shrinked_width; + } + } + + // Layout all active tabs + int section_tab_index = 0; + float tab_offset = 0.0f; + tab_bar->WidthAllTabs = 0.0f; + for (int section_n = 0; section_n < 3; section_n++) + { + ImGuiTabBarSection* section = §ions[section_n]; + if (section_n == 2) + tab_offset = ImMin(ImMax(0.0f, tab_bar->BarRect.GetWidth() - section->Width), tab_offset); + + for (int tab_n = 0; tab_n < section->TabCount; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[section_tab_index + tab_n]; + tab->Offset = tab_offset; + tab->NameOffset = -1; + tab_offset += tab->Width + (tab_n < section->TabCount - 1 ? g.Style.ItemInnerSpacing.x : 0.0f); + } + tab_bar->WidthAllTabs += ImMax(section->Width + section->Spacing, 0.0f); + tab_offset += section->Spacing; + section_tab_index += section->TabCount; + } + + // Clear name buffers + tab_bar->TabsNames.Buf.resize(0); + + // If we have lost the selected tab, select the next most recently active one + if (found_selected_tab_id == false) + tab_bar->SelectedTabId = 0; + if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL) + scroll_to_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID; + + // Lock in visible tab + tab_bar->VisibleTabId = tab_bar->SelectedTabId; + tab_bar->VisibleTabWasSubmitted = false; + + // Update scrolling + if (scroll_to_tab_id != 0) + TabBarScrollToTab(tab_bar, scroll_to_tab_id, sections); + tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim); + tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget); + if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget) + { + // Scrolling speed adjust itself so we can always reach our target in 1/3 seconds. + // Teleport if we are aiming far off the visible line + tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, 70.0f * g.FontSize); + tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, ImFabs(tab_bar->ScrollingTarget - tab_bar->ScrollingAnim) / 0.3f); + const bool teleport = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) || (tab_bar->ScrollingTargetDistToVisibility > 10.0f * g.FontSize); + tab_bar->ScrollingAnim = teleport ? tab_bar->ScrollingTarget : ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, g.IO.DeltaTime * tab_bar->ScrollingSpeed); + } + else + { + tab_bar->ScrollingSpeed = 0.0f; + } + tab_bar->ScrollingRectMinX = tab_bar->BarRect.Min.x + sections[0].Width + sections[0].Spacing; + tab_bar->ScrollingRectMaxX = tab_bar->BarRect.Max.x - sections[2].Width - sections[1].Spacing; + + // Actual layout in host window (we don't do it in BeginTabBar() so as not to waste an extra frame) + ImGuiWindow* window = g.CurrentWindow; + window->DC.CursorPos = tab_bar->BarRect.Min; + ItemSize(ImVec2(tab_bar->WidthAllTabs, tab_bar->BarRect.GetHeight()), tab_bar->FramePadding.y); + window->DC.IdealMaxPos.x = ImMax(window->DC.IdealMaxPos.x, tab_bar->BarRect.Min.x + tab_bar->WidthAllTabsIdeal); +} + +// Dockable windows uses Name/ID in the global namespace. Non-dockable items use the ID stack. +static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label, ImGuiWindow* docked_window) +{ + IM_ASSERT(docked_window == NULL); // master branch only + IM_UNUSED(docked_window); + if (tab_bar->Flags & ImGuiTabBarFlags_DockNode) + { + ImGuiID id = ImHashStr(label); + KeepAliveID(id); + return id; + } + else + { + ImGuiWindow* window = GImGui->CurrentWindow; + return window->GetID(label); + } +} + +static float ImGui::TabBarCalcMaxTabWidth() +{ + ImGuiContext& g = *GImGui; + return g.FontSize * 20.0f; +} + +ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id) +{ + if (tab_id != 0) + for (int n = 0; n < tab_bar->Tabs.Size; n++) + if (tab_bar->Tabs[n].ID == tab_id) + return &tab_bar->Tabs[n]; + return NULL; +} + +// Order = visible order, not submission order! (which is tab->BeginOrder) +ImGuiTabItem* ImGui::TabBarFindTabByOrder(ImGuiTabBar* tab_bar, int order) +{ + if (order < 0 || order >= tab_bar->Tabs.Size) + return NULL; + return &tab_bar->Tabs[order]; +} + +ImGuiTabItem* ImGui::TabBarGetCurrentTab(ImGuiTabBar* tab_bar) +{ + if (tab_bar->LastTabItemIdx <= 0 || tab_bar->LastTabItemIdx >= tab_bar->Tabs.Size) + return NULL; + return &tab_bar->Tabs[tab_bar->LastTabItemIdx]; +} + +const char* ImGui::TabBarGetTabName(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) +{ + if (tab->NameOffset == -1) + return "N/A"; + IM_ASSERT(tab->NameOffset < tab_bar->TabsNames.Buf.Size); + return tab_bar->TabsNames.Buf.Data + tab->NameOffset; +} + +// The *TabId fields are already set by the docking system _before_ the actual TabItem was created, so we clear them regardless. +void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id) +{ + if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) + tab_bar->Tabs.erase(tab); + if (tab_bar->VisibleTabId == tab_id) { tab_bar->VisibleTabId = 0; } + if (tab_bar->SelectedTabId == tab_id) { tab_bar->SelectedTabId = 0; } + if (tab_bar->NextSelectedTabId == tab_id) { tab_bar->NextSelectedTabId = 0; } +} + +// Called on manual closure attempt +void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) +{ + if (tab->Flags & ImGuiTabItemFlags_Button) + return; // A button appended with TabItemButton(). + + if (!(tab->Flags & ImGuiTabItemFlags_UnsavedDocument)) + { + // This will remove a frame of lag for selecting another tab on closure. + // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure + tab->WantClose = true; + if (tab_bar->VisibleTabId == tab->ID) + { + tab->LastFrameVisible = -1; + tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0; + } + } + else + { + // Actually select before expecting closure attempt (on an UnsavedDocument tab user is expect to e.g. show a popup) + if (tab_bar->VisibleTabId != tab->ID) + TabBarQueueFocus(tab_bar, tab); + } +} + +static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling) +{ + scrolling = ImMin(scrolling, tab_bar->WidthAllTabs - tab_bar->BarRect.GetWidth()); + return ImMax(scrolling, 0.0f); +} + +// Note: we may scroll to tab that are not selected! e.g. using keyboard arrow keys +static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiID tab_id, ImGuiTabBarSection* sections) +{ + ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id); + if (tab == NULL) + return; + if (tab->Flags & ImGuiTabItemFlags_SectionMask_) + return; + + ImGuiContext& g = *GImGui; + float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar) + int order = TabBarGetTabOrder(tab_bar, tab); + + // Scrolling happens only in the central section (leading/trailing sections are not scrolling) + // FIXME: This is all confusing. + float scrollable_width = tab_bar->BarRect.GetWidth() - sections[0].Width - sections[2].Width - sections[1].Spacing; + + // We make all tabs positions all relative Sections[0].Width to make code simpler + float tab_x1 = tab->Offset - sections[0].Width + (order > sections[0].TabCount - 1 ? -margin : 0.0f); + float tab_x2 = tab->Offset - sections[0].Width + tab->Width + (order + 1 < tab_bar->Tabs.Size - sections[2].TabCount ? margin : 1.0f); + tab_bar->ScrollingTargetDistToVisibility = 0.0f; + if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= scrollable_width)) + { + // Scroll to the left + tab_bar->ScrollingTargetDistToVisibility = ImMax(tab_bar->ScrollingAnim - tab_x2, 0.0f); + tab_bar->ScrollingTarget = tab_x1; + } + else if (tab_bar->ScrollingTarget < tab_x2 - scrollable_width) + { + // Scroll to the right + tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - scrollable_width) - tab_bar->ScrollingAnim, 0.0f); + tab_bar->ScrollingTarget = tab_x2 - scrollable_width; + } +} + +void ImGui::TabBarQueueFocus(ImGuiTabBar* tab_bar, ImGuiTabItem* tab) +{ + tab_bar->NextSelectedTabId = tab->ID; +} + +void ImGui::TabBarQueueReorder(ImGuiTabBar* tab_bar, ImGuiTabItem* tab, int offset) +{ + IM_ASSERT(offset != 0); + IM_ASSERT(tab_bar->ReorderRequestTabId == 0); + tab_bar->ReorderRequestTabId = tab->ID; + tab_bar->ReorderRequestOffset = (ImS16)offset; +} + +void ImGui::TabBarQueueReorderFromMousePos(ImGuiTabBar* tab_bar, ImGuiTabItem* src_tab, ImVec2 mouse_pos) +{ + ImGuiContext& g = *GImGui; + IM_ASSERT(tab_bar->ReorderRequestTabId == 0); + if ((tab_bar->Flags & ImGuiTabBarFlags_Reorderable) == 0) + return; + + const bool is_central_section = (src_tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; + const float bar_offset = tab_bar->BarRect.Min.x - (is_central_section ? tab_bar->ScrollingTarget : 0); + + // Count number of contiguous tabs we are crossing over + const int dir = (bar_offset + src_tab->Offset) > mouse_pos.x ? -1 : +1; + const int src_idx = tab_bar->Tabs.index_from_ptr(src_tab); + int dst_idx = src_idx; + for (int i = src_idx; i >= 0 && i < tab_bar->Tabs.Size; i += dir) + { + // Reordered tabs must share the same section + const ImGuiTabItem* dst_tab = &tab_bar->Tabs[i]; + if (dst_tab->Flags & ImGuiTabItemFlags_NoReorder) + break; + if ((dst_tab->Flags & ImGuiTabItemFlags_SectionMask_) != (src_tab->Flags & ImGuiTabItemFlags_SectionMask_)) + break; + dst_idx = i; + + // Include spacing after tab, so when mouse cursor is between tabs we would not continue checking further tabs that are not hovered. + const float x1 = bar_offset + dst_tab->Offset - g.Style.ItemInnerSpacing.x; + const float x2 = bar_offset + dst_tab->Offset + dst_tab->Width + g.Style.ItemInnerSpacing.x; + //GetForegroundDrawList()->AddRect(ImVec2(x1, tab_bar->BarRect.Min.y), ImVec2(x2, tab_bar->BarRect.Max.y), IM_COL32(255, 0, 0, 255)); + if ((dir < 0 && mouse_pos.x > x1) || (dir > 0 && mouse_pos.x < x2)) + break; + } + + if (dst_idx != src_idx) + TabBarQueueReorder(tab_bar, src_tab, dst_idx - src_idx); +} + +bool ImGui::TabBarProcessReorder(ImGuiTabBar* tab_bar) +{ + ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId); + if (tab1 == NULL || (tab1->Flags & ImGuiTabItemFlags_NoReorder)) + return false; + + //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools + int tab2_order = TabBarGetTabOrder(tab_bar, tab1) + tab_bar->ReorderRequestOffset; + if (tab2_order < 0 || tab2_order >= tab_bar->Tabs.Size) + return false; + + // Reordered tabs must share the same section + // (Note: TabBarQueueReorderFromMousePos() also has a similar test but since we allow direct calls to TabBarQueueReorder() we do it here too) + ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order]; + if (tab2->Flags & ImGuiTabItemFlags_NoReorder) + return false; + if ((tab1->Flags & ImGuiTabItemFlags_SectionMask_) != (tab2->Flags & ImGuiTabItemFlags_SectionMask_)) + return false; + + ImGuiTabItem item_tmp = *tab1; + ImGuiTabItem* src_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 + 1 : tab2; + ImGuiTabItem* dst_tab = (tab_bar->ReorderRequestOffset > 0) ? tab1 : tab2 + 1; + const int move_count = (tab_bar->ReorderRequestOffset > 0) ? tab_bar->ReorderRequestOffset : -tab_bar->ReorderRequestOffset; + memmove(dst_tab, src_tab, move_count * sizeof(ImGuiTabItem)); + *tab2 = item_tmp; + + if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings) + MarkIniSettingsDirty(); + return true; +} + +static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + const ImVec2 arrow_button_size(g.FontSize - 2.0f, g.FontSize + g.Style.FramePadding.y * 2.0f); + const float scrolling_buttons_width = arrow_button_size.x * 2.0f; + + const ImVec2 backup_cursor_pos = window->DC.CursorPos; + //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255)); + + int select_dir = 0; + ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; + arrow_col.w *= 0.5f; + + PushStyleColor(ImGuiCol_Text, arrow_col); + PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + const float backup_repeat_delay = g.IO.KeyRepeatDelay; + const float backup_repeat_rate = g.IO.KeyRepeatRate; + g.IO.KeyRepeatDelay = 0.250f; + g.IO.KeyRepeatRate = 0.200f; + float x = ImMax(tab_bar->BarRect.Min.x, tab_bar->BarRect.Max.x - scrolling_buttons_width); + window->DC.CursorPos = ImVec2(x, tab_bar->BarRect.Min.y); + if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) + select_dir = -1; + window->DC.CursorPos = ImVec2(x + arrow_button_size.x, tab_bar->BarRect.Min.y); + if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat)) + select_dir = +1; + PopStyleColor(2); + g.IO.KeyRepeatRate = backup_repeat_rate; + g.IO.KeyRepeatDelay = backup_repeat_delay; + + ImGuiTabItem* tab_to_scroll_to = NULL; + if (select_dir != 0) + if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId)) + { + int selected_order = TabBarGetTabOrder(tab_bar, tab_item); + int target_order = selected_order + select_dir; + + // Skip tab item buttons until another tab item is found or end is reached + while (tab_to_scroll_to == NULL) + { + // If we are at the end of the list, still scroll to make our tab visible + tab_to_scroll_to = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; + + // Cross through buttons + // (even if first/last item is a button, return it so we can update the scroll) + if (tab_to_scroll_to->Flags & ImGuiTabItemFlags_Button) + { + target_order += select_dir; + selected_order += select_dir; + tab_to_scroll_to = (target_order < 0 || target_order >= tab_bar->Tabs.Size) ? tab_to_scroll_to : NULL; + } + } + } + window->DC.CursorPos = backup_cursor_pos; + tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f; + + return tab_to_scroll_to; +} + +static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + + // We use g.Style.FramePadding.y to match the square ArrowButton size + const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y; + const ImVec2 backup_cursor_pos = window->DC.CursorPos; + window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y); + tab_bar->BarRect.Min.x += tab_list_popup_button_width; + + ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text]; + arrow_col.w *= 0.5f; + PushStyleColor(ImGuiCol_Text, arrow_col); + PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0)); + bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview | ImGuiComboFlags_HeightLargest); + PopStyleColor(2); + + ImGuiTabItem* tab_to_select = NULL; + if (open) + { + for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_n]; + if (tab->Flags & ImGuiTabItemFlags_Button) + continue; + + const char* tab_name = TabBarGetTabName(tab_bar, tab); + if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID)) + tab_to_select = tab; + } + EndCombo(); + } + + window->DC.CursorPos = backup_cursor_pos; + return tab_to_select; +} + +//------------------------------------------------------------------------- +// [SECTION] Widgets: BeginTabItem, EndTabItem, etc. +//------------------------------------------------------------------------- +// - BeginTabItem() +// - EndTabItem() +// - TabItemButton() +// - TabItemEx() [Internal] +// - SetTabItemClosed() +// - TabItemCalcSize() [Internal] +// - TabItemBackground() [Internal] +// - TabItemLabelAndCloseButton() [Internal] +//------------------------------------------------------------------------- + +bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; + } + IM_ASSERT(!(flags & ImGuiTabItemFlags_Button)); // BeginTabItem() Can't be used with button flags, use TabItemButton() instead! + + bool ret = TabItemEx(tab_bar, label, p_open, flags, NULL); + if (ret && !(flags & ImGuiTabItemFlags_NoPushId)) + { + ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; + PushOverrideID(tab->ID); // We already hashed 'label' so push into the ID stack directly instead of doing another hash through PushID(label) + } + return ret; +} + +void ImGui::EndTabItem() +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return; + } + IM_ASSERT(tab_bar->LastTabItemIdx >= 0); + ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx]; + if (!(tab->Flags & ImGuiTabItemFlags_NoPushId)) + PopID(); +} + +bool ImGui::TabItemButton(const char* label, ImGuiTabItemFlags flags) +{ + ImGuiContext& g = *GImGui; + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + ImGuiTabBar* tab_bar = g.CurrentTabBar; + if (tab_bar == NULL) + { + IM_ASSERT_USER_ERROR(tab_bar != NULL, "Needs to be called between BeginTabBar() and EndTabBar()!"); + return false; + } + return TabItemEx(tab_bar, label, NULL, flags | ImGuiTabItemFlags_Button | ImGuiTabItemFlags_NoReorder, NULL); +} + +bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags, ImGuiWindow* docked_window) +{ + // Layout whole tab bar if not already done + ImGuiContext& g = *GImGui; + if (tab_bar->WantLayout) + { + ImGuiNextItemData backup_next_item_data = g.NextItemData; + TabBarLayout(tab_bar); + g.NextItemData = backup_next_item_data; + } + ImGuiWindow* window = g.CurrentWindow; + if (window->SkipItems) + return false; + + const ImGuiStyle& style = g.Style; + const ImGuiID id = TabBarCalcTabID(tab_bar, label, docked_window); + + // If the user called us with *p_open == false, we early out and don't render. + // We make a call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID. + IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags); + if (p_open && !*p_open) + { + ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav); + return false; + } + + IM_ASSERT(!p_open || !(flags & ImGuiTabItemFlags_Button)); + IM_ASSERT((flags & (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)) != (ImGuiTabItemFlags_Leading | ImGuiTabItemFlags_Trailing)); // Can't use both Leading and Trailing + + // Store into ImGuiTabItemFlags_NoCloseButton, also honor ImGuiTabItemFlags_NoCloseButton passed by user (although not documented) + if (flags & ImGuiTabItemFlags_NoCloseButton) + p_open = NULL; + else if (p_open == NULL) + flags |= ImGuiTabItemFlags_NoCloseButton; + + // Acquire tab data + ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, id); + bool tab_is_new = false; + if (tab == NULL) + { + tab_bar->Tabs.push_back(ImGuiTabItem()); + tab = &tab_bar->Tabs.back(); + tab->ID = id; + tab_bar->TabsAddedNew = tab_is_new = true; + } + tab_bar->LastTabItemIdx = (ImS16)tab_bar->Tabs.index_from_ptr(tab); + + // Calculate tab contents size + ImVec2 size = TabItemCalcSize(label, (p_open != NULL) || (flags & ImGuiTabItemFlags_UnsavedDocument)); + tab->RequestedWidth = -1.0f; + if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth) + size.x = tab->RequestedWidth = g.NextItemData.Width; + if (tab_is_new) + tab->Width = ImMax(1.0f, size.x); + tab->ContentWidth = size.x; + tab->BeginOrder = tab_bar->TabsActiveCount++; + + const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount); + const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0; + const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount); + const bool tab_just_unsaved = (flags & ImGuiTabItemFlags_UnsavedDocument) && !(tab->Flags & ImGuiTabItemFlags_UnsavedDocument); + const bool is_tab_button = (flags & ImGuiTabItemFlags_Button) != 0; + tab->LastFrameVisible = g.FrameCount; + tab->Flags = flags; + + // Append name _WITH_ the zero-terminator + if (docked_window != NULL) + { + IM_ASSERT(docked_window == NULL); // master branch only + } + else + { + tab->NameOffset = (ImS32)tab_bar->TabsNames.size(); + tab_bar->TabsNames.append(label, label + strlen(label) + 1); + } + + // Update selected tab + if (!is_tab_button) + { + if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0) + if (!tab_bar_appearing || tab_bar->SelectedTabId == 0) + TabBarQueueFocus(tab_bar, tab); // New tabs gets activated + if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // _SetSelected can only be passed on explicit tab bar + TabBarQueueFocus(tab_bar, tab); + } + + // Lock visibility + // (Note: tab_contents_visible != tab_selected... because CTRL+TAB operations may preview some tabs without selecting them!) + bool tab_contents_visible = (tab_bar->VisibleTabId == id); + if (tab_contents_visible) + tab_bar->VisibleTabWasSubmitted = true; + + // On the very first frame of a tab bar we let first tab contents be visible to minimize appearing glitches + if (!tab_contents_visible && tab_bar->SelectedTabId == 0 && tab_bar_appearing) + if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs)) + tab_contents_visible = true; + + // Note that tab_is_new is not necessarily the same as tab_appearing! When a tab bar stops being submitted + // and then gets submitted again, the tabs will have 'tab_appearing=true' but 'tab_is_new=false'. + if (tab_appearing && (!tab_bar_appearing || tab_is_new)) + { + ItemAdd(ImRect(), id, NULL, ImGuiItemFlags_NoNav); + if (is_tab_button) + return false; + return tab_contents_visible; + } + + if (tab_bar->SelectedTabId == id) + tab->LastFrameSelected = g.FrameCount; + + // Backup current layout position + const ImVec2 backup_main_cursor_pos = window->DC.CursorPos; + + // Layout + const bool is_central_section = (tab->Flags & ImGuiTabItemFlags_SectionMask_) == 0; + size.x = tab->Width; + if (is_central_section) + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f); + else + window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(tab->Offset, 0.0f); + ImVec2 pos = window->DC.CursorPos; + ImRect bb(pos, pos + size); + + // We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation) + const bool want_clip_rect = is_central_section && (bb.Min.x < tab_bar->ScrollingRectMinX || bb.Max.x > tab_bar->ScrollingRectMaxX); + if (want_clip_rect) + PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->ScrollingRectMinX), bb.Min.y - 1), ImVec2(tab_bar->ScrollingRectMaxX, bb.Max.y), true); + + ImVec2 backup_cursor_max_pos = window->DC.CursorMaxPos; + ItemSize(bb.GetSize(), style.FramePadding.y); + window->DC.CursorMaxPos = backup_cursor_max_pos; + + if (!ItemAdd(bb, id)) + { + if (want_clip_rect) + PopClipRect(); + window->DC.CursorPos = backup_main_cursor_pos; + return tab_contents_visible; + } + + // Click to Select a tab + ImGuiButtonFlags button_flags = ((is_tab_button ? ImGuiButtonFlags_PressedOnClickRelease : ImGuiButtonFlags_PressedOnClick) | ImGuiButtonFlags_AllowItemOverlap); + if (g.DragDropActive) + button_flags |= ImGuiButtonFlags_PressedOnDragDropHold; + bool hovered, held; + bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags); + if (pressed && !is_tab_button) + TabBarQueueFocus(tab_bar, tab); + + // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered) + if (g.ActiveId != id) + SetItemAllowOverlap(); + + // Drag and drop: re-order tabs + if (held && !tab_appearing && IsMouseDragging(0)) + { + if (!g.DragDropActive && (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)) + { + // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x + if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x) + { + TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); + } + else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x) + { + TabBarQueueReorderFromMousePos(tab_bar, tab, g.IO.MousePos); + } + } + } + +#if 0 + if (hovered && g.HoveredIdNotActiveTimer > TOOLTIP_DELAY && bb.GetWidth() < tab->ContentWidth) + { + // Enlarge tab display when hovering + bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f))); + display_draw_list = GetForegroundDrawList(window); + TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive)); + } +#endif + + // Render tab shape + ImDrawList* display_draw_list = window->DrawList; + const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabUnfocused)); + TabItemBackground(display_draw_list, bb, flags, tab_col); + RenderNavHighlight(bb, id); + + // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget. + const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup); + if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1)) && !is_tab_button) + TabBarQueueFocus(tab_bar, tab); + + if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton) + flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton; + + // Render tab label, process close button + const ImGuiID close_button_id = p_open ? GetIDWithSeed("#CLOSE", NULL, id) : 0; + bool just_closed; + bool text_clipped; + TabItemLabelAndCloseButton(display_draw_list, bb, tab_just_unsaved ? (flags & ~ImGuiTabItemFlags_UnsavedDocument) : flags, tab_bar->FramePadding, label, id, close_button_id, tab_contents_visible, &just_closed, &text_clipped); + if (just_closed && p_open != NULL) + { + *p_open = false; + TabBarCloseTab(tab_bar, tab); + } + + // Restore main window position so user can draw there + if (want_clip_rect) + PopClipRect(); + window->DC.CursorPos = backup_main_cursor_pos; + + // Tooltip + // (Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer-> seems ok) + // (We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar, which g.HoveredId ignores) + // FIXME: This is a mess. + // FIXME: We may want disabled tab to still display the tooltip? + if (text_clipped && g.HoveredId == id && !held) + if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip) && !(tab->Flags & ImGuiTabItemFlags_NoTooltip)) + if (IsItemHovered(ImGuiHoveredFlags_DelayNormal)) + SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label); + + IM_ASSERT(!is_tab_button || !(tab_bar->SelectedTabId == tab->ID && is_tab_button)); // TabItemButton should not be selected + if (is_tab_button) + return pressed; + return tab_contents_visible; +} + +// [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed. +// To use it to need to call the function SetTabItemClosed() between BeginTabBar() and EndTabBar(). +// Tabs closed by the close button will automatically be flagged to avoid this issue. +void ImGui::SetTabItemClosed(const char* label) +{ + ImGuiContext& g = *GImGui; + bool is_within_manual_tab_bar = g.CurrentTabBar && !(g.CurrentTabBar->Flags & ImGuiTabBarFlags_DockNode); + if (is_within_manual_tab_bar) + { + ImGuiTabBar* tab_bar = g.CurrentTabBar; + ImGuiID tab_id = TabBarCalcTabID(tab_bar, label, NULL); + if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id)) + tab->WantClose = true; // Will be processed by next call to TabBarLayout() + } +} + +ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button_or_unsaved_marker) +{ + ImGuiContext& g = *GImGui; + ImVec2 label_size = CalcTextSize(label, NULL, true); + ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x, label_size.y + g.Style.FramePadding.y * 2.0f); + if (has_close_button_or_unsaved_marker) + size.x += g.Style.FramePadding.x + (g.Style.ItemInnerSpacing.x + g.FontSize); // We use Y intentionally to fit the close button circle. + else + size.x += g.Style.FramePadding.x + 1.0f; + return ImVec2(ImMin(size.x, TabBarCalcMaxTabWidth()), size.y); +} + +ImVec2 ImGui::TabItemCalcSize(ImGuiWindow*) +{ + IM_ASSERT(0); // This function exists to facilitate merge with 'docking' branch. + return ImVec2(0.0f, 0.0f); +} + +void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col) +{ + // While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it. + ImGuiContext& g = *GImGui; + const float width = bb.GetWidth(); + IM_UNUSED(flags); + IM_ASSERT(width > 0.0f); + const float rounding = ImMax(0.0f, ImMin((flags & ImGuiTabItemFlags_Button) ? g.Style.FrameRounding : g.Style.TabRounding, width * 0.5f - 1.0f)); + const float y1 = bb.Min.y + 1.0f; + const float y2 = bb.Max.y - 1.0f; + draw_list->PathLineTo(ImVec2(bb.Min.x, y2)); + draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9); + draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12); + draw_list->PathLineTo(ImVec2(bb.Max.x, y2)); + draw_list->PathFillConvex(col); + if (g.Style.TabBorderSize > 0.0f) + { + draw_list->PathLineTo(ImVec2(bb.Min.x + 0.5f, y2)); + draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding + 0.5f, y1 + rounding + 0.5f), rounding, 6, 9); + draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding - 0.5f, y1 + rounding + 0.5f), rounding, 9, 12); + draw_list->PathLineTo(ImVec2(bb.Max.x - 0.5f, y2)); + draw_list->PathStroke(GetColorU32(ImGuiCol_Border), 0, g.Style.TabBorderSize); + } +} + +// Render text label (with custom clipping) + Unsaved Document marker + Close Button logic +// We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter. +void ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id, bool is_contents_visible, bool* out_just_closed, bool* out_text_clipped) +{ + ImGuiContext& g = *GImGui; + ImVec2 label_size = CalcTextSize(label, NULL, true); + + if (out_just_closed) + *out_just_closed = false; + if (out_text_clipped) + *out_text_clipped = false; + + if (bb.GetWidth() <= 1.0f) + return; + + // In Style V2 we'll have full override of all colors per state (e.g. focused, selected) + // But right now if you want to alter text color of tabs this is what you need to do. +#if 0 + const float backup_alpha = g.Style.Alpha; + if (!is_contents_visible) + g.Style.Alpha *= 0.7f; +#endif + + // Render text label (with clipping + alpha gradient) + unsaved marker + ImRect text_pixel_clip_bb(bb.Min.x + frame_padding.x, bb.Min.y + frame_padding.y, bb.Max.x - frame_padding.x, bb.Max.y); + ImRect text_ellipsis_clip_bb = text_pixel_clip_bb; + + // Return clipped state ignoring the close button + if (out_text_clipped) + { + *out_text_clipped = (text_ellipsis_clip_bb.Min.x + label_size.x) > text_pixel_clip_bb.Max.x; + //draw_list->AddCircle(text_ellipsis_clip_bb.Min, 3.0f, *out_text_clipped ? IM_COL32(255, 0, 0, 255) : IM_COL32(0, 255, 0, 255)); + } + + const float button_sz = g.FontSize; + const ImVec2 button_pos(ImMax(bb.Min.x, bb.Max.x - frame_padding.x * 2.0f - button_sz), bb.Min.y); + + // Close Button & Unsaved Marker + // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap() + // 'hovered' will be true when hovering the Tab but NOT when hovering the close button + // 'g.HoveredId==id' will be true when hovering the Tab including when hovering the close button + // 'g.ActiveId==close_button_id' will be true when we are holding on the close button, in which case both hovered booleans are false + bool close_button_pressed = false; + bool close_button_visible = false; + if (close_button_id != 0) + if (is_contents_visible || bb.GetWidth() >= ImMax(button_sz, g.Style.TabMinWidthForCloseButton)) + if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == tab_id || g.ActiveId == close_button_id) + close_button_visible = true; + bool unsaved_marker_visible = (flags & ImGuiTabItemFlags_UnsavedDocument) != 0 && (button_pos.x + button_sz <= bb.Max.x); + + if (close_button_visible) + { + ImGuiLastItemData last_item_backup = g.LastItemData; + PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding); + if (CloseButton(close_button_id, button_pos)) + close_button_pressed = true; + PopStyleVar(); + g.LastItemData = last_item_backup; + + // Close with middle mouse button + if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2)) + close_button_pressed = true; + } + else if (unsaved_marker_visible) + { + const ImRect bullet_bb(button_pos, button_pos + ImVec2(button_sz, button_sz) + g.Style.FramePadding * 2.0f); + RenderBullet(draw_list, bullet_bb.GetCenter(), GetColorU32(ImGuiCol_Text)); + } + + // This is all rather complicated + // (the main idea is that because the close button only appears on hover, we don't want it to alter the ellipsis position) + // FIXME: if FramePadding is noticeably large, ellipsis_max_x will be wrong here (e.g. #3497), maybe for consistency that parameter of RenderTextEllipsis() shouldn't exist.. + float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f; + if (close_button_visible || unsaved_marker_visible) + { + text_pixel_clip_bb.Max.x -= close_button_visible ? (button_sz) : (button_sz * 0.80f); + text_ellipsis_clip_bb.Max.x -= unsaved_marker_visible ? (button_sz * 0.80f) : 0.0f; + ellipsis_max_x = text_pixel_clip_bb.Max.x; + } + RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size); + +#if 0 + if (!is_contents_visible) + g.Style.Alpha = backup_alpha; +#endif + + if (out_just_closed) + *out_just_closed = close_button_pressed; +} + + +#endif // #ifndef IMGUI_DISABLE diff --git a/ImGui/imstb_rectpack.h b/ImGui/imstb_rectpack.h new file mode 100644 index 0000000..f6917e7 --- /dev/null +++ b/ImGui/imstb_rectpack.h @@ -0,0 +1,627 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_rect_pack.h 1.01. +// Grep for [DEAR IMGUI] to find the changes. +// +// stb_rect_pack.h - v1.01 - public domain - rectangle packing +// Sean Barrett 2014 +// +// Useful for e.g. packing rectangular textures into an atlas. +// Does not do rotation. +// +// Before #including, +// +// #define STB_RECT_PACK_IMPLEMENTATION +// +// in the file that you want to have the implementation. +// +// Not necessarily the awesomest packing method, but better than +// the totally naive one in stb_truetype (which is primarily what +// this is meant to replace). +// +// Has only had a few tests run, may have issues. +// +// More docs to come. +// +// No memory allocations; uses qsort() and assert() from stdlib. +// Can override those by defining STBRP_SORT and STBRP_ASSERT. +// +// This library currently uses the Skyline Bottom-Left algorithm. +// +// Please note: better rectangle packers are welcome! Please +// implement them to the same API, but with a different init +// function. +// +// Credits +// +// Library +// Sean Barrett +// Minor features +// Martins Mozeiko +// github:IntellectualKitty +// +// Bugfixes / warning fixes +// Jeremy Jaussaud +// Fabian Giesen +// +// Version history: +// +// 1.01 (2021-07-11) always use large rect mode, expose STBRP__MAXVAL in public section +// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles +// 0.99 (2019-02-07) warning fixes +// 0.11 (2017-03-03) return packing success/fail result +// 0.10 (2016-10-25) remove cast-away-const to avoid warnings +// 0.09 (2016-08-27) fix compiler warnings +// 0.08 (2015-09-13) really fix bug with empty rects (w=0 or h=0) +// 0.07 (2015-09-13) fix bug with empty rects (w=0 or h=0) +// 0.06 (2015-04-15) added STBRP_SORT to allow replacing qsort +// 0.05: added STBRP_ASSERT to allow replacing assert +// 0.04: fixed minor bug in STBRP_LARGE_RECTS support +// 0.01: initial release +// +// LICENSE +// +// See end of file for license information. + +////////////////////////////////////////////////////////////////////////////// +// +// INCLUDE SECTION +// + +#ifndef STB_INCLUDE_STB_RECT_PACK_H +#define STB_INCLUDE_STB_RECT_PACK_H + +#define STB_RECT_PACK_VERSION 1 + +#ifdef STBRP_STATIC +#define STBRP_DEF static +#else +#define STBRP_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct stbrp_context stbrp_context; +typedef struct stbrp_node stbrp_node; +typedef struct stbrp_rect stbrp_rect; + +typedef int stbrp_coord; + +#define STBRP__MAXVAL 0x7fffffff +// Mostly for internal use, but this is the maximum supported coordinate value. + +STBRP_DEF int stbrp_pack_rects (stbrp_context *context, stbrp_rect *rects, int num_rects); +// Assign packed locations to rectangles. The rectangles are of type +// 'stbrp_rect' defined below, stored in the array 'rects', and there +// are 'num_rects' many of them. +// +// Rectangles which are successfully packed have the 'was_packed' flag +// set to a non-zero value and 'x' and 'y' store the minimum location +// on each axis (i.e. bottom-left in cartesian coordinates, top-left +// if you imagine y increasing downwards). Rectangles which do not fit +// have the 'was_packed' flag set to 0. +// +// You should not try to access the 'rects' array from another thread +// while this function is running, as the function temporarily reorders +// the array while it executes. +// +// To pack into another rectangle, you need to call stbrp_init_target +// again. To continue packing into the same rectangle, you can call +// this function again. Calling this multiple times with multiple rect +// arrays will probably produce worse packing results than calling it +// a single time with the full rectangle array, but the option is +// available. +// +// The function returns 1 if all of the rectangles were successfully +// packed and 0 otherwise. + +struct stbrp_rect +{ + // reserved for your use: + int id; + + // input: + stbrp_coord w, h; + + // output: + stbrp_coord x, y; + int was_packed; // non-zero if valid packing + +}; // 16 bytes, nominally + + +STBRP_DEF void stbrp_init_target (stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes); +// Initialize a rectangle packer to: +// pack a rectangle that is 'width' by 'height' in dimensions +// using temporary storage provided by the array 'nodes', which is 'num_nodes' long +// +// You must call this function every time you start packing into a new target. +// +// There is no "shutdown" function. The 'nodes' memory must stay valid for +// the following stbrp_pack_rects() call (or calls), but can be freed after +// the call (or calls) finish. +// +// Note: to guarantee best results, either: +// 1. make sure 'num_nodes' >= 'width' +// or 2. call stbrp_allow_out_of_mem() defined below with 'allow_out_of_mem = 1' +// +// If you don't do either of the above things, widths will be quantized to multiples +// of small integers to guarantee the algorithm doesn't run out of temporary storage. +// +// If you do #2, then the non-quantized algorithm will be used, but the algorithm +// may run out of temporary storage and be unable to pack some rectangles. + +STBRP_DEF void stbrp_setup_allow_out_of_mem (stbrp_context *context, int allow_out_of_mem); +// Optionally call this function after init but before doing any packing to +// change the handling of the out-of-temp-memory scenario, described above. +// If you call init again, this will be reset to the default (false). + + +STBRP_DEF void stbrp_setup_heuristic (stbrp_context *context, int heuristic); +// Optionally select which packing heuristic the library should use. Different +// heuristics will produce better/worse results for different data sets. +// If you call init again, this will be reset to the default. + +enum +{ + STBRP_HEURISTIC_Skyline_default=0, + STBRP_HEURISTIC_Skyline_BL_sortHeight = STBRP_HEURISTIC_Skyline_default, + STBRP_HEURISTIC_Skyline_BF_sortHeight +}; + + +////////////////////////////////////////////////////////////////////////////// +// +// the details of the following structures don't matter to you, but they must +// be visible so you can handle the memory allocations for them + +struct stbrp_node +{ + stbrp_coord x,y; + stbrp_node *next; +}; + +struct stbrp_context +{ + int width; + int height; + int align; + int init_mode; + int heuristic; + int num_nodes; + stbrp_node *active_head; + stbrp_node *free_head; + stbrp_node extra[2]; // we allocate two extra nodes so optimal user-node-count is 'width' not 'width+2' +}; + +#ifdef __cplusplus +} +#endif + +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// IMPLEMENTATION SECTION +// + +#ifdef STB_RECT_PACK_IMPLEMENTATION +#ifndef STBRP_SORT +#include +#define STBRP_SORT qsort +#endif + +#ifndef STBRP_ASSERT +#include +#define STBRP_ASSERT assert +#endif + +#ifdef _MSC_VER +#define STBRP__NOTUSED(v) (void)(v) +#define STBRP__CDECL __cdecl +#else +#define STBRP__NOTUSED(v) (void)sizeof(v) +#define STBRP__CDECL +#endif + +enum +{ + STBRP__INIT_skyline = 1 +}; + +STBRP_DEF void stbrp_setup_heuristic(stbrp_context *context, int heuristic) +{ + switch (context->init_mode) { + case STBRP__INIT_skyline: + STBRP_ASSERT(heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight || heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight); + context->heuristic = heuristic; + break; + default: + STBRP_ASSERT(0); + } +} + +STBRP_DEF void stbrp_setup_allow_out_of_mem(stbrp_context *context, int allow_out_of_mem) +{ + if (allow_out_of_mem) + // if it's ok to run out of memory, then don't bother aligning them; + // this gives better packing, but may fail due to OOM (even though + // the rectangles easily fit). @TODO a smarter approach would be to only + // quantize once we've hit OOM, then we could get rid of this parameter. + context->align = 1; + else { + // if it's not ok to run out of memory, then quantize the widths + // so that num_nodes is always enough nodes. + // + // I.e. num_nodes * align >= width + // align >= width / num_nodes + // align = ceil(width/num_nodes) + + context->align = (context->width + context->num_nodes-1) / context->num_nodes; + } +} + +STBRP_DEF void stbrp_init_target(stbrp_context *context, int width, int height, stbrp_node *nodes, int num_nodes) +{ + int i; + + for (i=0; i < num_nodes-1; ++i) + nodes[i].next = &nodes[i+1]; + nodes[i].next = NULL; + context->init_mode = STBRP__INIT_skyline; + context->heuristic = STBRP_HEURISTIC_Skyline_default; + context->free_head = &nodes[0]; + context->active_head = &context->extra[0]; + context->width = width; + context->height = height; + context->num_nodes = num_nodes; + stbrp_setup_allow_out_of_mem(context, 0); + + // node 0 is the full width, node 1 is the sentinel (lets us not store width explicitly) + context->extra[0].x = 0; + context->extra[0].y = 0; + context->extra[0].next = &context->extra[1]; + context->extra[1].x = (stbrp_coord) width; + context->extra[1].y = (1<<30); + context->extra[1].next = NULL; +} + +// find minimum y position if it starts at x1 +static int stbrp__skyline_find_min_y(stbrp_context *c, stbrp_node *first, int x0, int width, int *pwaste) +{ + stbrp_node *node = first; + int x1 = x0 + width; + int min_y, visited_width, waste_area; + + STBRP__NOTUSED(c); + + STBRP_ASSERT(first->x <= x0); + + #if 0 + // skip in case we're past the node + while (node->next->x <= x0) + ++node; + #else + STBRP_ASSERT(node->next->x > x0); // we ended up handling this in the caller for efficiency + #endif + + STBRP_ASSERT(node->x <= x0); + + min_y = 0; + waste_area = 0; + visited_width = 0; + while (node->x < x1) { + if (node->y > min_y) { + // raise min_y higher. + // we've accounted for all waste up to min_y, + // but we'll now add more waste for everything we've visted + waste_area += visited_width * (node->y - min_y); + min_y = node->y; + // the first time through, visited_width might be reduced + if (node->x < x0) + visited_width += node->next->x - x0; + else + visited_width += node->next->x - node->x; + } else { + // add waste area + int under_width = node->next->x - node->x; + if (under_width + visited_width > width) + under_width = width - visited_width; + waste_area += under_width * (min_y - node->y); + visited_width += under_width; + } + node = node->next; + } + + *pwaste = waste_area; + return min_y; +} + +typedef struct +{ + int x,y; + stbrp_node **prev_link; +} stbrp__findresult; + +static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int width, int height) +{ + int best_waste = (1<<30), best_x, best_y = (1 << 30); + stbrp__findresult fr; + stbrp_node **prev, *node, *tail, **best = NULL; + + // align to multiple of c->align + width = (width + c->align - 1); + width -= width % c->align; + STBRP_ASSERT(width % c->align == 0); + + // if it can't possibly fit, bail immediately + if (width > c->width || height > c->height) { + fr.prev_link = NULL; + fr.x = fr.y = 0; + return fr; + } + + node = c->active_head; + prev = &c->active_head; + while (node->x + width <= c->width) { + int y,waste; + y = stbrp__skyline_find_min_y(c, node, node->x, width, &waste); + if (c->heuristic == STBRP_HEURISTIC_Skyline_BL_sortHeight) { // actually just want to test BL + // bottom left + if (y < best_y) { + best_y = y; + best = prev; + } + } else { + // best-fit + if (y + height <= c->height) { + // can only use it if it first vertically + if (y < best_y || (y == best_y && waste < best_waste)) { + best_y = y; + best_waste = waste; + best = prev; + } + } + } + prev = &node->next; + node = node->next; + } + + best_x = (best == NULL) ? 0 : (*best)->x; + + // if doing best-fit (BF), we also have to try aligning right edge to each node position + // + // e.g, if fitting + // + // ____________________ + // |____________________| + // + // into + // + // | | + // | ____________| + // |____________| + // + // then right-aligned reduces waste, but bottom-left BL is always chooses left-aligned + // + // This makes BF take about 2x the time + + if (c->heuristic == STBRP_HEURISTIC_Skyline_BF_sortHeight) { + tail = c->active_head; + node = c->active_head; + prev = &c->active_head; + // find first node that's admissible + while (tail->x < width) + tail = tail->next; + while (tail) { + int xpos = tail->x - width; + int y,waste; + STBRP_ASSERT(xpos >= 0); + // find the left position that matches this + while (node->next->x <= xpos) { + prev = &node->next; + node = node->next; + } + STBRP_ASSERT(node->next->x > xpos && node->x <= xpos); + y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste); + if (y + height <= c->height) { + if (y <= best_y) { + if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) { + best_x = xpos; + //STBRP_ASSERT(y <= best_y); [DEAR IMGUI] + best_y = y; + best_waste = waste; + best = prev; + } + } + } + tail = tail->next; + } + } + + fr.prev_link = best; + fr.x = best_x; + fr.y = best_y; + return fr; +} + +static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, int width, int height) +{ + // find best position according to heuristic + stbrp__findresult res = stbrp__skyline_find_best_pos(context, width, height); + stbrp_node *node, *cur; + + // bail if: + // 1. it failed + // 2. the best node doesn't fit (we don't always check this) + // 3. we're out of memory + if (res.prev_link == NULL || res.y + height > context->height || context->free_head == NULL) { + res.prev_link = NULL; + return res; + } + + // on success, create new node + node = context->free_head; + node->x = (stbrp_coord) res.x; + node->y = (stbrp_coord) (res.y + height); + + context->free_head = node->next; + + // insert the new node into the right starting point, and + // let 'cur' point to the remaining nodes needing to be + // stiched back in + + cur = *res.prev_link; + if (cur->x < res.x) { + // preserve the existing one, so start testing with the next one + stbrp_node *next = cur->next; + cur->next = node; + cur = next; + } else { + *res.prev_link = node; + } + + // from here, traverse cur and free the nodes, until we get to one + // that shouldn't be freed + while (cur->next && cur->next->x <= res.x + width) { + stbrp_node *next = cur->next; + // move the current node to the free list + cur->next = context->free_head; + context->free_head = cur; + cur = next; + } + + // stitch the list back in + node->next = cur; + + if (cur->x < res.x + width) + cur->x = (stbrp_coord) (res.x + width); + +#ifdef _DEBUG + cur = context->active_head; + while (cur->x < context->width) { + STBRP_ASSERT(cur->x < cur->next->x); + cur = cur->next; + } + STBRP_ASSERT(cur->next == NULL); + + { + int count=0; + cur = context->active_head; + while (cur) { + cur = cur->next; + ++count; + } + cur = context->free_head; + while (cur) { + cur = cur->next; + ++count; + } + STBRP_ASSERT(count == context->num_nodes+2); + } +#endif + + return res; +} + +static int STBRP__CDECL rect_height_compare(const void *a, const void *b) +{ + const stbrp_rect *p = (const stbrp_rect *) a; + const stbrp_rect *q = (const stbrp_rect *) b; + if (p->h > q->h) + return -1; + if (p->h < q->h) + return 1; + return (p->w > q->w) ? -1 : (p->w < q->w); +} + +static int STBRP__CDECL rect_original_order(const void *a, const void *b) +{ + const stbrp_rect *p = (const stbrp_rect *) a; + const stbrp_rect *q = (const stbrp_rect *) b; + return (p->was_packed < q->was_packed) ? -1 : (p->was_packed > q->was_packed); +} + +STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int num_rects) +{ + int i, all_rects_packed = 1; + + // we use the 'was_packed' field internally to allow sorting/unsorting + for (i=0; i < num_rects; ++i) { + rects[i].was_packed = i; + } + + // sort according to heuristic + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_height_compare); + + for (i=0; i < num_rects; ++i) { + if (rects[i].w == 0 || rects[i].h == 0) { + rects[i].x = rects[i].y = 0; // empty rect needs no space + } else { + stbrp__findresult fr = stbrp__skyline_pack_rectangle(context, rects[i].w, rects[i].h); + if (fr.prev_link) { + rects[i].x = (stbrp_coord) fr.x; + rects[i].y = (stbrp_coord) fr.y; + } else { + rects[i].x = rects[i].y = STBRP__MAXVAL; + } + } + } + + // unsort + STBRP_SORT(rects, num_rects, sizeof(rects[0]), rect_original_order); + + // set was_packed flags and all_rects_packed status + for (i=0; i < num_rects; ++i) { + rects[i].was_packed = !(rects[i].x == STBRP__MAXVAL && rects[i].y == STBRP__MAXVAL); + if (!rects[i].was_packed) + all_rects_packed = 0; + } + + // return the all_rects_packed status + return all_rects_packed; +} +#endif + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is 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 Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/ImGui/imstb_textedit.h b/ImGui/imstb_textedit.h new file mode 100644 index 0000000..a8a8231 --- /dev/null +++ b/ImGui/imstb_textedit.h @@ -0,0 +1,1437 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_textedit.h 1.14. +// Those changes would need to be pushed into nothings/stb: +// - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321) +// - Fix in stb_textedit_find_charpos to handle last line (see https://github.com/ocornut/imgui/issues/6000) +// Grep for [DEAR IMGUI] to find the changes. + +// stb_textedit.h - v1.14 - public domain - Sean Barrett +// Development of this library was sponsored by RAD Game Tools +// +// This C header file implements the guts of a multi-line text-editing +// widget; you implement display, word-wrapping, and low-level string +// insertion/deletion, and stb_textedit will map user inputs into +// insertions & deletions, plus updates to the cursor position, +// selection state, and undo state. +// +// It is intended for use in games and other systems that need to build +// their own custom widgets and which do not have heavy text-editing +// requirements (this library is not recommended for use for editing large +// texts, as its performance does not scale and it has limited undo). +// +// Non-trivial behaviors are modelled after Windows text controls. +// +// +// LICENSE +// +// See end of file for license information. +// +// +// DEPENDENCIES +// +// Uses the C runtime function 'memmove', which you can override +// by defining STB_TEXTEDIT_memmove before the implementation. +// Uses no other functions. Performs no runtime allocations. +// +// +// VERSION HISTORY +// +// 1.14 (2021-07-11) page up/down, various fixes +// 1.13 (2019-02-07) fix bug in undo size management +// 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash +// 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield +// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual +// 1.9 (2016-08-27) customizable move-by-word +// 1.8 (2016-04-02) better keyboard handling when mouse button is down +// 1.7 (2015-09-13) change y range handling in case baseline is non-0 +// 1.6 (2015-04-15) allow STB_TEXTEDIT_memmove +// 1.5 (2014-09-10) add support for secondary keys for OS X +// 1.4 (2014-08-17) fix signed/unsigned warnings +// 1.3 (2014-06-19) fix mouse clicking to round to nearest char boundary +// 1.2 (2014-05-27) fix some RAD types that had crept into the new code +// 1.1 (2013-12-15) move-by-word (requires STB_TEXTEDIT_IS_SPACE ) +// 1.0 (2012-07-26) improve documentation, initial public release +// 0.3 (2012-02-24) bugfixes, single-line mode; insert mode +// 0.2 (2011-11-28) fixes to undo/redo +// 0.1 (2010-07-08) initial version +// +// ADDITIONAL CONTRIBUTORS +// +// Ulf Winklemann: move-by-word in 1.1 +// Fabian Giesen: secondary key inputs in 1.5 +// Martins Mozeiko: STB_TEXTEDIT_memmove in 1.6 +// Louis Schnellbach: page up/down in 1.14 +// +// Bugfixes: +// Scott Graham +// Daniel Keller +// Omar Cornut +// Dan Thompson +// +// USAGE +// +// This file behaves differently depending on what symbols you define +// before including it. +// +// +// Header-file mode: +// +// If you do not define STB_TEXTEDIT_IMPLEMENTATION before including this, +// it will operate in "header file" mode. In this mode, it declares a +// single public symbol, STB_TexteditState, which encapsulates the current +// state of a text widget (except for the string, which you will store +// separately). +// +// To compile in this mode, you must define STB_TEXTEDIT_CHARTYPE to a +// primitive type that defines a single character (e.g. char, wchar_t, etc). +// +// To save space or increase undo-ability, you can optionally define the +// following things that are used by the undo system: +// +// STB_TEXTEDIT_POSITIONTYPE small int type encoding a valid cursor position +// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow +// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer +// +// If you don't define these, they are set to permissive types and +// moderate sizes. The undo system does no memory allocations, so +// it grows STB_TexteditState by the worst-case storage which is (in bytes): +// +// [4 + 3 * sizeof(STB_TEXTEDIT_POSITIONTYPE)] * STB_TEXTEDIT_UNDOSTATECOUNT +// + sizeof(STB_TEXTEDIT_CHARTYPE) * STB_TEXTEDIT_UNDOCHARCOUNT +// +// +// Implementation mode: +// +// If you define STB_TEXTEDIT_IMPLEMENTATION before including this, it +// will compile the implementation of the text edit widget, depending +// on a large number of symbols which must be defined before the include. +// +// The implementation is defined only as static functions. You will then +// need to provide your own APIs in the same file which will access the +// static functions. +// +// The basic concept is that you provide a "string" object which +// behaves like an array of characters. stb_textedit uses indices to +// refer to positions in the string, implicitly representing positions +// in the displayed textedit. This is true for both plain text and +// rich text; even with rich text stb_truetype interacts with your +// code as if there was an array of all the displayed characters. +// +// Symbols that must be the same in header-file and implementation mode: +// +// STB_TEXTEDIT_CHARTYPE the character type +// STB_TEXTEDIT_POSITIONTYPE small type that is a valid cursor position +// STB_TEXTEDIT_UNDOSTATECOUNT the number of undo states to allow +// STB_TEXTEDIT_UNDOCHARCOUNT the number of characters to store in the undo buffer +// +// Symbols you must define for implementation mode: +// +// STB_TEXTEDIT_STRING the type of object representing a string being edited, +// typically this is a wrapper object with other data you need +// +// STB_TEXTEDIT_STRINGLEN(obj) the length of the string (ideally O(1)) +// STB_TEXTEDIT_LAYOUTROW(&r,obj,n) returns the results of laying out a line of characters +// starting from character #n (see discussion below) +// STB_TEXTEDIT_GETWIDTH(obj,n,i) returns the pixel delta from the xpos of the i'th character +// to the xpos of the i+1'th char for a line of characters +// starting at character #n (i.e. accounts for kerning +// with previous char) +// STB_TEXTEDIT_KEYTOTEXT(k) maps a keyboard input to an insertable character +// (return type is int, -1 means not valid to insert) +// STB_TEXTEDIT_GETCHAR(obj,i) returns the i'th character of obj, 0-based +// STB_TEXTEDIT_NEWLINE the character returned by _GETCHAR() we recognize +// as manually wordwrapping for end-of-line positioning +// +// STB_TEXTEDIT_DELETECHARS(obj,i,n) delete n characters starting at i +// STB_TEXTEDIT_INSERTCHARS(obj,i,c*,n) insert n characters at i (pointed to by STB_TEXTEDIT_CHARTYPE*) +// +// STB_TEXTEDIT_K_SHIFT a power of two that is or'd in to a keyboard input to represent the shift key +// +// STB_TEXTEDIT_K_LEFT keyboard input to move cursor left +// STB_TEXTEDIT_K_RIGHT keyboard input to move cursor right +// STB_TEXTEDIT_K_UP keyboard input to move cursor up +// STB_TEXTEDIT_K_DOWN keyboard input to move cursor down +// STB_TEXTEDIT_K_PGUP keyboard input to move cursor up a page +// STB_TEXTEDIT_K_PGDOWN keyboard input to move cursor down a page +// STB_TEXTEDIT_K_LINESTART keyboard input to move cursor to start of line // e.g. HOME +// STB_TEXTEDIT_K_LINEEND keyboard input to move cursor to end of line // e.g. END +// STB_TEXTEDIT_K_TEXTSTART keyboard input to move cursor to start of text // e.g. ctrl-HOME +// STB_TEXTEDIT_K_TEXTEND keyboard input to move cursor to end of text // e.g. ctrl-END +// STB_TEXTEDIT_K_DELETE keyboard input to delete selection or character under cursor +// STB_TEXTEDIT_K_BACKSPACE keyboard input to delete selection or character left of cursor +// STB_TEXTEDIT_K_UNDO keyboard input to perform undo +// STB_TEXTEDIT_K_REDO keyboard input to perform redo +// +// Optional: +// STB_TEXTEDIT_K_INSERT keyboard input to toggle insert mode +// STB_TEXTEDIT_IS_SPACE(ch) true if character is whitespace (e.g. 'isspace'), +// required for default WORDLEFT/WORDRIGHT handlers +// STB_TEXTEDIT_MOVEWORDLEFT(obj,i) custom handler for WORDLEFT, returns index to move cursor to +// STB_TEXTEDIT_MOVEWORDRIGHT(obj,i) custom handler for WORDRIGHT, returns index to move cursor to +// STB_TEXTEDIT_K_WORDLEFT keyboard input to move cursor left one word // e.g. ctrl-LEFT +// STB_TEXTEDIT_K_WORDRIGHT keyboard input to move cursor right one word // e.g. ctrl-RIGHT +// STB_TEXTEDIT_K_LINESTART2 secondary keyboard input to move cursor to start of line +// STB_TEXTEDIT_K_LINEEND2 secondary keyboard input to move cursor to end of line +// STB_TEXTEDIT_K_TEXTSTART2 secondary keyboard input to move cursor to start of text +// STB_TEXTEDIT_K_TEXTEND2 secondary keyboard input to move cursor to end of text +// +// Keyboard input must be encoded as a single integer value; e.g. a character code +// and some bitflags that represent shift states. to simplify the interface, SHIFT must +// be a bitflag, so we can test the shifted state of cursor movements to allow selection, +// i.e. (STB_TEXTEDIT_K_RIGHT|STB_TEXTEDIT_K_SHIFT) should be shifted right-arrow. +// +// You can encode other things, such as CONTROL or ALT, in additional bits, and +// then test for their presence in e.g. STB_TEXTEDIT_K_WORDLEFT. For example, +// my Windows implementations add an additional CONTROL bit, and an additional KEYDOWN +// bit. Then all of the STB_TEXTEDIT_K_ values bitwise-or in the KEYDOWN bit, +// and I pass both WM_KEYDOWN and WM_CHAR events to the "key" function in the +// API below. The control keys will only match WM_KEYDOWN events because of the +// keydown bit I add, and STB_TEXTEDIT_KEYTOTEXT only tests for the KEYDOWN +// bit so it only decodes WM_CHAR events. +// +// STB_TEXTEDIT_LAYOUTROW returns information about the shape of one displayed +// row of characters assuming they start on the i'th character--the width and +// the height and the number of characters consumed. This allows this library +// to traverse the entire layout incrementally. You need to compute word-wrapping +// here. +// +// Each textfield keeps its own insert mode state, which is not how normal +// applications work. To keep an app-wide insert mode, update/copy the +// "insert_mode" field of STB_TexteditState before/after calling API functions. +// +// API +// +// void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) +// +// void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +// void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +// int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +// int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +// void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXEDIT_KEYTYPE key) +// +// Each of these functions potentially updates the string and updates the +// state. +// +// initialize_state: +// set the textedit state to a known good default state when initially +// constructing the textedit. +// +// click: +// call this with the mouse x,y on a mouse down; it will update the cursor +// and reset the selection start/end to the cursor point. the x,y must +// be relative to the text widget, with (0,0) being the top left. +// +// drag: +// call this with the mouse x,y on a mouse drag/up; it will update the +// cursor and the selection end point +// +// cut: +// call this to delete the current selection; returns true if there was +// one. you should FIRST copy the current selection to the system paste buffer. +// (To copy, just copy the current selection out of the string yourself.) +// +// paste: +// call this to paste text at the current cursor point or over the current +// selection if there is one. +// +// key: +// call this for keyboard inputs sent to the textfield. you can use it +// for "key down" events or for "translated" key events. if you need to +// do both (as in Win32), or distinguish Unicode characters from control +// inputs, set a high bit to distinguish the two; then you can define the +// various definitions like STB_TEXTEDIT_K_LEFT have the is-key-event bit +// set, and make STB_TEXTEDIT_KEYTOCHAR check that the is-key-event bit is +// clear. STB_TEXTEDIT_KEYTYPE defaults to int, but you can #define it to +// anything other type you wante before including. +// +// +// When rendering, you can read the cursor position and selection state from +// the STB_TexteditState. +// +// +// Notes: +// +// This is designed to be usable in IMGUI, so it allows for the possibility of +// running in an IMGUI that has NOT cached the multi-line layout. For this +// reason, it provides an interface that is compatible with computing the +// layout incrementally--we try to make sure we make as few passes through +// as possible. (For example, to locate the mouse pointer in the text, we +// could define functions that return the X and Y positions of characters +// and binary search Y and then X, but if we're doing dynamic layout this +// will run the layout algorithm many times, so instead we manually search +// forward in one pass. Similar logic applies to e.g. up-arrow and +// down-arrow movement.) +// +// If it's run in a widget that *has* cached the layout, then this is less +// efficient, but it's not horrible on modern computers. But you wouldn't +// want to edit million-line files with it. + + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//// +//// Header-file mode +//// +//// + +#ifndef INCLUDE_STB_TEXTEDIT_H +#define INCLUDE_STB_TEXTEDIT_H + +//////////////////////////////////////////////////////////////////////// +// +// STB_TexteditState +// +// Definition of STB_TexteditState which you should store +// per-textfield; it includes cursor position, selection state, +// and undo state. +// + +#ifndef STB_TEXTEDIT_UNDOSTATECOUNT +#define STB_TEXTEDIT_UNDOSTATECOUNT 99 +#endif +#ifndef STB_TEXTEDIT_UNDOCHARCOUNT +#define STB_TEXTEDIT_UNDOCHARCOUNT 999 +#endif +#ifndef STB_TEXTEDIT_CHARTYPE +#define STB_TEXTEDIT_CHARTYPE int +#endif +#ifndef STB_TEXTEDIT_POSITIONTYPE +#define STB_TEXTEDIT_POSITIONTYPE int +#endif + +typedef struct +{ + // private data + STB_TEXTEDIT_POSITIONTYPE where; + STB_TEXTEDIT_POSITIONTYPE insert_length; + STB_TEXTEDIT_POSITIONTYPE delete_length; + int char_storage; +} StbUndoRecord; + +typedef struct +{ + // private data + StbUndoRecord undo_rec [STB_TEXTEDIT_UNDOSTATECOUNT]; + STB_TEXTEDIT_CHARTYPE undo_char[STB_TEXTEDIT_UNDOCHARCOUNT]; + short undo_point, redo_point; + int undo_char_point, redo_char_point; +} StbUndoState; + +typedef struct +{ + ///////////////////// + // + // public data + // + + int cursor; + // position of the text cursor within the string + + int select_start; // selection start point + int select_end; + // selection start and end point in characters; if equal, no selection. + // note that start may be less than or greater than end (e.g. when + // dragging the mouse, start is where the initial click was, and you + // can drag in either direction) + + unsigned char insert_mode; + // each textfield keeps its own insert mode state. to keep an app-wide + // insert mode, copy this value in/out of the app state + + int row_count_per_page; + // page size in number of row. + // this value MUST be set to >0 for pageup or pagedown in multilines documents. + + ///////////////////// + // + // private data + // + unsigned char cursor_at_end_of_line; // not implemented yet + unsigned char initialized; + unsigned char has_preferred_x; + unsigned char single_line; + unsigned char padding1, padding2, padding3; + float preferred_x; // this determines where the cursor up/down tries to seek to along x + StbUndoState undostate; +} STB_TexteditState; + + +//////////////////////////////////////////////////////////////////////// +// +// StbTexteditRow +// +// Result of layout query, used by stb_textedit to determine where +// the text in each row is. + +// result of layout query +typedef struct +{ + float x0,x1; // starting x location, end x location (allows for align=right, etc) + float baseline_y_delta; // position of baseline relative to previous row's baseline + float ymin,ymax; // height of row above and below baseline + int num_chars; +} StbTexteditRow; +#endif //INCLUDE_STB_TEXTEDIT_H + + +//////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////// +//// +//// Implementation mode +//// +//// + + +// implementation isn't include-guarded, since it might have indirectly +// included just the "header" portion +#ifdef STB_TEXTEDIT_IMPLEMENTATION + +#ifndef STB_TEXTEDIT_memmove +#include +#define STB_TEXTEDIT_memmove memmove +#endif + + +///////////////////////////////////////////////////////////////////////////// +// +// Mouse input handling +// + +// traverse the layout to locate the nearest character to a display position +static int stb_text_locate_coord(STB_TEXTEDIT_STRING *str, float x, float y) +{ + StbTexteditRow r; + int n = STB_TEXTEDIT_STRINGLEN(str); + float base_y = 0, prev_x; + int i=0, k; + + r.x0 = r.x1 = 0; + r.ymin = r.ymax = 0; + r.num_chars = 0; + + // search rows to find one that straddles 'y' + while (i < n) { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (r.num_chars <= 0) + return n; + + if (i==0 && y < base_y + r.ymin) + return 0; + + if (y < base_y + r.ymax) + break; + + i += r.num_chars; + base_y += r.baseline_y_delta; + } + + // below all text, return 'after' last character + if (i >= n) + return n; + + // check if it's before the beginning of the line + if (x < r.x0) + return i; + + // check if it's before the end of the line + if (x < r.x1) { + // search characters in row for one that straddles 'x' + prev_x = r.x0; + for (k=0; k < r.num_chars; ++k) { + float w = STB_TEXTEDIT_GETWIDTH(str, i, k); + if (x < prev_x+w) { + if (x < prev_x+w/2) + return k+i; + else + return k+i+1; + } + prev_x += w; + } + // shouldn't happen, but if it does, fall through to end-of-line case + } + + // if the last character is a newline, return that. otherwise return 'after' the last character + if (STB_TEXTEDIT_GETCHAR(str, i+r.num_chars-1) == STB_TEXTEDIT_NEWLINE) + return i+r.num_chars-1; + else + return i+r.num_chars; +} + +// API click: on mouse down, move the cursor to the clicked location, and reset the selection +static void stb_textedit_click(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +{ + // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse + // goes off the top or bottom of the text + if( state->single_line ) + { + StbTexteditRow r; + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + y = r.ymin; + } + + state->cursor = stb_text_locate_coord(str, x, y); + state->select_start = state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; +} + +// API drag: on mouse drag, move the cursor and selection endpoint to the clicked location +static void stb_textedit_drag(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, float x, float y) +{ + int p = 0; + + // In single-line mode, just always make y = 0. This lets the drag keep working if the mouse + // goes off the top or bottom of the text + if( state->single_line ) + { + StbTexteditRow r; + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + y = r.ymin; + } + + if (state->select_start == state->select_end) + state->select_start = state->cursor; + + p = stb_text_locate_coord(str, x, y); + state->cursor = state->select_end = p; +} + +///////////////////////////////////////////////////////////////////////////// +// +// Keyboard input handling +// + +// forward declarations +static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state); +static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length); +static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length); +static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length); + +typedef struct +{ + float x,y; // position of n'th character + float height; // height of line + int first_char, length; // first char of row, and length + int prev_first; // first char of previous row +} StbFindState; + +// find the x/y location of a character, and remember info about the previous row in +// case we get a move-up event (for page up, we'll have to rescan) +static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *str, int n, int single_line) +{ + StbTexteditRow r; + int prev_start = 0; + int z = STB_TEXTEDIT_STRINGLEN(str); + int i=0, first; + + if (n == z && single_line) { + // special case if it's at the end (may not be needed?) + STB_TEXTEDIT_LAYOUTROW(&r, str, 0); + find->y = 0; + find->first_char = 0; + find->length = z; + find->height = r.ymax - r.ymin; + find->x = r.x1; + return; + } + + // search rows to find the one that straddles character n + find->y = 0; + + for(;;) { + STB_TEXTEDIT_LAYOUTROW(&r, str, i); + if (n < i + r.num_chars) + break; + if (i + r.num_chars == z && z > 0 && STB_TEXTEDIT_GETCHAR(str, z - 1) != STB_TEXTEDIT_NEWLINE) // [DEAR IMGUI] special handling for last line + break; // [DEAR IMGUI] + prev_start = i; + i += r.num_chars; + find->y += r.baseline_y_delta; + if (i == z) // [DEAR IMGUI] + break; // [DEAR IMGUI] + } + + find->first_char = first = i; + find->length = r.num_chars; + find->height = r.ymax - r.ymin; + find->prev_first = prev_start; + + // now scan to find xpos + find->x = r.x0; + for (i=0; first+i < n; ++i) + find->x += STB_TEXTEDIT_GETWIDTH(str, first, i); +} + +#define STB_TEXT_HAS_SELECTION(s) ((s)->select_start != (s)->select_end) + +// make the selection/cursor state valid if client altered the string +static void stb_textedit_clamp(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + int n = STB_TEXTEDIT_STRINGLEN(str); + if (STB_TEXT_HAS_SELECTION(state)) { + if (state->select_start > n) state->select_start = n; + if (state->select_end > n) state->select_end = n; + // if clamping forced them to be equal, move the cursor to match + if (state->select_start == state->select_end) + state->cursor = state->select_start; + } + if (state->cursor > n) state->cursor = n; +} + +// delete characters while updating undo +static void stb_textedit_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int len) +{ + stb_text_makeundo_delete(str, state, where, len); + STB_TEXTEDIT_DELETECHARS(str, where, len); + state->has_preferred_x = 0; +} + +// delete the section +static void stb_textedit_delete_selection(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + stb_textedit_clamp(str, state); + if (STB_TEXT_HAS_SELECTION(state)) { + if (state->select_start < state->select_end) { + stb_textedit_delete(str, state, state->select_start, state->select_end - state->select_start); + state->select_end = state->cursor = state->select_start; + } else { + stb_textedit_delete(str, state, state->select_end, state->select_start - state->select_end); + state->select_start = state->cursor = state->select_end; + } + state->has_preferred_x = 0; + } +} + +// canoncialize the selection so start <= end +static void stb_textedit_sortselection(STB_TexteditState *state) +{ + if (state->select_end < state->select_start) { + int temp = state->select_end; + state->select_end = state->select_start; + state->select_start = temp; + } +} + +// move cursor to first character of selection +static void stb_textedit_move_to_first(STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_sortselection(state); + state->cursor = state->select_start; + state->select_end = state->select_start; + state->has_preferred_x = 0; + } +} + +// move cursor to last character of selection +static void stb_textedit_move_to_last(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_sortselection(state); + stb_textedit_clamp(str, state); + state->cursor = state->select_end; + state->select_start = state->select_end; + state->has_preferred_x = 0; + } +} + +#ifdef STB_TEXTEDIT_IS_SPACE +static int is_word_boundary( STB_TEXTEDIT_STRING *str, int idx ) +{ + return idx > 0 ? (STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str,idx-1) ) && !STB_TEXTEDIT_IS_SPACE( STB_TEXTEDIT_GETCHAR(str, idx) ) ) : 1; +} + +#ifndef STB_TEXTEDIT_MOVEWORDLEFT +static int stb_textedit_move_to_word_previous( STB_TEXTEDIT_STRING *str, int c ) +{ + --c; // always move at least one character + while( c >= 0 && !is_word_boundary( str, c ) ) + --c; + + if( c < 0 ) + c = 0; + + return c; +} +#define STB_TEXTEDIT_MOVEWORDLEFT stb_textedit_move_to_word_previous +#endif + +#ifndef STB_TEXTEDIT_MOVEWORDRIGHT +static int stb_textedit_move_to_word_next( STB_TEXTEDIT_STRING *str, int c ) +{ + const int len = STB_TEXTEDIT_STRINGLEN(str); + ++c; // always move at least one character + while( c < len && !is_word_boundary( str, c ) ) + ++c; + + if( c > len ) + c = len; + + return c; +} +#define STB_TEXTEDIT_MOVEWORDRIGHT stb_textedit_move_to_word_next +#endif + +#endif + +// update selection and cursor to match each other +static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state) +{ + if (!STB_TEXT_HAS_SELECTION(state)) + state->select_start = state->select_end = state->cursor; + else + state->cursor = state->select_end; +} + +// API cut: delete selection +static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + if (STB_TEXT_HAS_SELECTION(state)) { + stb_textedit_delete_selection(str,state); // implicitly clamps + state->has_preferred_x = 0; + return 1; + } + return 0; +} + +// API paste: replace existing selection with passed-in text +static int stb_textedit_paste_internal(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE *text, int len) +{ + // if there's a selection, the paste should delete it + stb_textedit_clamp(str, state); + stb_textedit_delete_selection(str,state); + // try to insert the characters + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, text, len)) { + stb_text_makeundo_insert(state, state->cursor, len); + state->cursor += len; + state->has_preferred_x = 0; + return 1; + } + // note: paste failure will leave deleted selection, may be restored with an undo (see https://github.com/nothings/stb/issues/734 for details) + return 0; +} + +#ifndef STB_TEXTEDIT_KEYTYPE +#define STB_TEXTEDIT_KEYTYPE int +#endif + +// API key: process a keyboard input +static void stb_textedit_key(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_KEYTYPE key) +{ +retry: + switch (key) { + default: { + int c = STB_TEXTEDIT_KEYTOTEXT(key); + if (c > 0) { + STB_TEXTEDIT_CHARTYPE ch = (STB_TEXTEDIT_CHARTYPE) c; + + // can't add newline in single-line mode + if (c == '\n' && state->single_line) + break; + + if (state->insert_mode && !STB_TEXT_HAS_SELECTION(state) && state->cursor < STB_TEXTEDIT_STRINGLEN(str)) { + stb_text_makeundo_replace(str, state, state->cursor, 1, 1); + STB_TEXTEDIT_DELETECHARS(str, state->cursor, 1); + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { + ++state->cursor; + state->has_preferred_x = 0; + } + } else { + stb_textedit_delete_selection(str,state); // implicitly clamps + if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) { + stb_text_makeundo_insert(state, state->cursor, 1); + ++state->cursor; + state->has_preferred_x = 0; + } + } + } + break; + } + +#ifdef STB_TEXTEDIT_K_INSERT + case STB_TEXTEDIT_K_INSERT: + state->insert_mode = !state->insert_mode; + break; +#endif + + case STB_TEXTEDIT_K_UNDO: + stb_text_undo(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_REDO: + stb_text_redo(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_LEFT: + // if currently there's a selection, move cursor to start of selection + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + else + if (state->cursor > 0) + --state->cursor; + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_RIGHT: + // if currently there's a selection, move cursor to end of selection + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + else + ++state->cursor; + stb_textedit_clamp(str, state); + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_LEFT | STB_TEXTEDIT_K_SHIFT: + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + // move selection left + if (state->select_end > 0) + --state->select_end; + state->cursor = state->select_end; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_MOVEWORDLEFT + case STB_TEXTEDIT_K_WORDLEFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + else { + state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); + stb_textedit_clamp( str, state ); + } + break; + + case STB_TEXTEDIT_K_WORDLEFT | STB_TEXTEDIT_K_SHIFT: + if( !STB_TEXT_HAS_SELECTION( state ) ) + stb_textedit_prep_selection_at_cursor(state); + + state->cursor = STB_TEXTEDIT_MOVEWORDLEFT(str, state->cursor); + state->select_end = state->cursor; + + stb_textedit_clamp( str, state ); + break; +#endif + +#ifdef STB_TEXTEDIT_MOVEWORDRIGHT + case STB_TEXTEDIT_K_WORDRIGHT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + else { + state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); + stb_textedit_clamp( str, state ); + } + break; + + case STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT: + if( !STB_TEXT_HAS_SELECTION( state ) ) + stb_textedit_prep_selection_at_cursor(state); + + state->cursor = STB_TEXTEDIT_MOVEWORDRIGHT(str, state->cursor); + state->select_end = state->cursor; + + stb_textedit_clamp( str, state ); + break; +#endif + + case STB_TEXTEDIT_K_RIGHT | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + // move selection right + ++state->select_end; + stb_textedit_clamp(str, state); + state->cursor = state->select_end; + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_DOWN: + case STB_TEXTEDIT_K_DOWN | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGDOWN: + case STB_TEXTEDIT_K_PGDOWN | STB_TEXTEDIT_K_SHIFT: { + StbFindState find; + StbTexteditRow row; + int i, j, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGDOWN; + int row_count = is_page ? state->row_count_per_page : 1; + + if (!is_page && state->single_line) { + // on windows, up&down in single-line behave like left&right + key = STB_TEXTEDIT_K_RIGHT | (key & STB_TEXTEDIT_K_SHIFT); + goto retry; + } + + if (sel) + stb_textedit_prep_selection_at_cursor(state); + else if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_last(str, state); + + // compute current position of cursor point + stb_textedit_clamp(str, state); + stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); + + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; + int start = find.first_char + find.length; + + if (find.length == 0) + break; + + // [DEAR IMGUI] + // going down while being on the last line shouldn't bring us to that line end + if (STB_TEXTEDIT_GETCHAR(str, find.first_char + find.length - 1) != STB_TEXTEDIT_NEWLINE) + break; + + // now find character position down a row + state->cursor = start; + STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); + x = row.x0; + for (i=0; i < row.num_chars; ++i) { + float dx = STB_TEXTEDIT_GETWIDTH(str, start, i); + #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + break; + #endif + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + stb_textedit_clamp(str, state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + + if (sel) + state->select_end = state->cursor; + + // go to next line + find.first_char = find.first_char + find.length; + find.length = row.num_chars; + } + break; + } + + case STB_TEXTEDIT_K_UP: + case STB_TEXTEDIT_K_UP | STB_TEXTEDIT_K_SHIFT: + case STB_TEXTEDIT_K_PGUP: + case STB_TEXTEDIT_K_PGUP | STB_TEXTEDIT_K_SHIFT: { + StbFindState find; + StbTexteditRow row; + int i, j, prev_scan, sel = (key & STB_TEXTEDIT_K_SHIFT) != 0; + int is_page = (key & ~STB_TEXTEDIT_K_SHIFT) == STB_TEXTEDIT_K_PGUP; + int row_count = is_page ? state->row_count_per_page : 1; + + if (!is_page && state->single_line) { + // on windows, up&down become left&right + key = STB_TEXTEDIT_K_LEFT | (key & STB_TEXTEDIT_K_SHIFT); + goto retry; + } + + if (sel) + stb_textedit_prep_selection_at_cursor(state); + else if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_move_to_first(state); + + // compute current position of cursor point + stb_textedit_clamp(str, state); + stb_textedit_find_charpos(&find, str, state->cursor, state->single_line); + + for (j = 0; j < row_count; ++j) { + float x, goal_x = state->has_preferred_x ? state->preferred_x : find.x; + + // can only go up if there's a previous row + if (find.prev_first == find.first_char) + break; + + // now find character position up a row + state->cursor = find.prev_first; + STB_TEXTEDIT_LAYOUTROW(&row, str, state->cursor); + x = row.x0; + for (i=0; i < row.num_chars; ++i) { + float dx = STB_TEXTEDIT_GETWIDTH(str, find.prev_first, i); + #ifdef STB_TEXTEDIT_GETWIDTH_NEWLINE + if (dx == STB_TEXTEDIT_GETWIDTH_NEWLINE) + break; + #endif + x += dx; + if (x > goal_x) + break; + ++state->cursor; + } + stb_textedit_clamp(str, state); + + state->has_preferred_x = 1; + state->preferred_x = goal_x; + + if (sel) + state->select_end = state->cursor; + + // go to previous line + // (we need to scan previous line the hard way. maybe we could expose this as a new API function?) + prev_scan = find.prev_first > 0 ? find.prev_first - 1 : 0; + while (prev_scan > 0 && STB_TEXTEDIT_GETCHAR(str, prev_scan - 1) != STB_TEXTEDIT_NEWLINE) + --prev_scan; + find.first_char = find.prev_first; + find.prev_first = prev_scan; + } + break; + } + + case STB_TEXTEDIT_K_DELETE: + case STB_TEXTEDIT_K_DELETE | STB_TEXTEDIT_K_SHIFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_delete_selection(str, state); + else { + int n = STB_TEXTEDIT_STRINGLEN(str); + if (state->cursor < n) + stb_textedit_delete(str, state, state->cursor, 1); + } + state->has_preferred_x = 0; + break; + + case STB_TEXTEDIT_K_BACKSPACE: + case STB_TEXTEDIT_K_BACKSPACE | STB_TEXTEDIT_K_SHIFT: + if (STB_TEXT_HAS_SELECTION(state)) + stb_textedit_delete_selection(str, state); + else { + stb_textedit_clamp(str, state); + if (state->cursor > 0) { + stb_textedit_delete(str, state, state->cursor-1, 1); + --state->cursor; + } + } + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTSTART2 + case STB_TEXTEDIT_K_TEXTSTART2: +#endif + case STB_TEXTEDIT_K_TEXTSTART: + state->cursor = state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTEND2 + case STB_TEXTEDIT_K_TEXTEND2: +#endif + case STB_TEXTEDIT_K_TEXTEND: + state->cursor = STB_TEXTEDIT_STRINGLEN(str); + state->select_start = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTSTART2 + case STB_TEXTEDIT_K_TEXTSTART2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_TEXTSTART | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = 0; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_TEXTEND2 + case STB_TEXTEDIT_K_TEXTEND2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_TEXTEND | STB_TEXTEDIT_K_SHIFT: + stb_textedit_prep_selection_at_cursor(state); + state->cursor = state->select_end = STB_TEXTEDIT_STRINGLEN(str); + state->has_preferred_x = 0; + break; + + +#ifdef STB_TEXTEDIT_K_LINESTART2 + case STB_TEXTEDIT_K_LINESTART2: +#endif + case STB_TEXTEDIT_K_LINESTART: + stb_textedit_clamp(str, state); + stb_textedit_move_to_first(state); + if (state->single_line) + state->cursor = 0; + else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) + --state->cursor; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_LINEEND2 + case STB_TEXTEDIT_K_LINEEND2: +#endif + case STB_TEXTEDIT_K_LINEEND: { + int n = STB_TEXTEDIT_STRINGLEN(str); + stb_textedit_clamp(str, state); + stb_textedit_move_to_first(state); + if (state->single_line) + state->cursor = n; + else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) + ++state->cursor; + state->has_preferred_x = 0; + break; + } + +#ifdef STB_TEXTEDIT_K_LINESTART2 + case STB_TEXTEDIT_K_LINESTART2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_LINESTART | STB_TEXTEDIT_K_SHIFT: + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + if (state->single_line) + state->cursor = 0; + else while (state->cursor > 0 && STB_TEXTEDIT_GETCHAR(str, state->cursor-1) != STB_TEXTEDIT_NEWLINE) + --state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; + break; + +#ifdef STB_TEXTEDIT_K_LINEEND2 + case STB_TEXTEDIT_K_LINEEND2 | STB_TEXTEDIT_K_SHIFT: +#endif + case STB_TEXTEDIT_K_LINEEND | STB_TEXTEDIT_K_SHIFT: { + int n = STB_TEXTEDIT_STRINGLEN(str); + stb_textedit_clamp(str, state); + stb_textedit_prep_selection_at_cursor(state); + if (state->single_line) + state->cursor = n; + else while (state->cursor < n && STB_TEXTEDIT_GETCHAR(str, state->cursor) != STB_TEXTEDIT_NEWLINE) + ++state->cursor; + state->select_end = state->cursor; + state->has_preferred_x = 0; + break; + } + } +} + +///////////////////////////////////////////////////////////////////////////// +// +// Undo processing +// +// @OPTIMIZE: the undo/redo buffer should be circular + +static void stb_textedit_flush_redo(StbUndoState *state) +{ + state->redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; + state->redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; +} + +// discard the oldest entry in the undo list +static void stb_textedit_discard_undo(StbUndoState *state) +{ + if (state->undo_point > 0) { + // if the 0th undo state has characters, clean those up + if (state->undo_rec[0].char_storage >= 0) { + int n = state->undo_rec[0].insert_length, i; + // delete n characters from all other records + state->undo_char_point -= n; + STB_TEXTEDIT_memmove(state->undo_char, state->undo_char + n, (size_t) (state->undo_char_point*sizeof(STB_TEXTEDIT_CHARTYPE))); + for (i=0; i < state->undo_point; ++i) + if (state->undo_rec[i].char_storage >= 0) + state->undo_rec[i].char_storage -= n; // @OPTIMIZE: get rid of char_storage and infer it + } + --state->undo_point; + STB_TEXTEDIT_memmove(state->undo_rec, state->undo_rec+1, (size_t) (state->undo_point*sizeof(state->undo_rec[0]))); + } +} + +// discard the oldest entry in the redo list--it's bad if this +// ever happens, but because undo & redo have to store the actual +// characters in different cases, the redo character buffer can +// fill up even though the undo buffer didn't +static void stb_textedit_discard_redo(StbUndoState *state) +{ + int k = STB_TEXTEDIT_UNDOSTATECOUNT-1; + + if (state->redo_point <= k) { + // if the k'th undo state has characters, clean those up + if (state->undo_rec[k].char_storage >= 0) { + int n = state->undo_rec[k].insert_length, i; + // move the remaining redo character data to the end of the buffer + state->redo_char_point += n; + STB_TEXTEDIT_memmove(state->undo_char + state->redo_char_point, state->undo_char + state->redo_char_point-n, (size_t) ((STB_TEXTEDIT_UNDOCHARCOUNT - state->redo_char_point)*sizeof(STB_TEXTEDIT_CHARTYPE))); + // adjust the position of all the other records to account for above memmove + for (i=state->redo_point; i < k; ++i) + if (state->undo_rec[i].char_storage >= 0) + state->undo_rec[i].char_storage += n; + } + // now move all the redo records towards the end of the buffer; the first one is at 'redo_point' + // [DEAR IMGUI] + size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0])); + const char* buf_begin = (char*)state->undo_rec; (void)buf_begin; + const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end; + IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin); + IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end); + STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size); + + // now move redo_point to point to the new one + ++state->redo_point; + } +} + +static StbUndoRecord *stb_text_create_undo_record(StbUndoState *state, int numchars) +{ + // any time we create a new undo record, we discard redo + stb_textedit_flush_redo(state); + + // if we have no free records, we have to make room, by sliding the + // existing records down + if (state->undo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + stb_textedit_discard_undo(state); + + // if the characters to store won't possibly fit in the buffer, we can't undo + if (numchars > STB_TEXTEDIT_UNDOCHARCOUNT) { + state->undo_point = 0; + state->undo_char_point = 0; + return NULL; + } + + // if we don't have enough free characters in the buffer, we have to make room + while (state->undo_char_point + numchars > STB_TEXTEDIT_UNDOCHARCOUNT) + stb_textedit_discard_undo(state); + + return &state->undo_rec[state->undo_point++]; +} + +static STB_TEXTEDIT_CHARTYPE *stb_text_createundo(StbUndoState *state, int pos, int insert_len, int delete_len) +{ + StbUndoRecord *r = stb_text_create_undo_record(state, insert_len); + if (r == NULL) + return NULL; + + r->where = pos; + r->insert_length = (STB_TEXTEDIT_POSITIONTYPE) insert_len; + r->delete_length = (STB_TEXTEDIT_POSITIONTYPE) delete_len; + + if (insert_len == 0) { + r->char_storage = -1; + return NULL; + } else { + r->char_storage = state->undo_char_point; + state->undo_char_point += insert_len; + return &state->undo_char[r->char_storage]; + } +} + +static void stb_text_undo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + StbUndoState *s = &state->undostate; + StbUndoRecord u, *r; + if (s->undo_point == 0) + return; + + // we need to do two things: apply the undo record, and create a redo record + u = s->undo_rec[s->undo_point-1]; + r = &s->undo_rec[s->redo_point-1]; + r->char_storage = -1; + + r->insert_length = u.delete_length; + r->delete_length = u.insert_length; + r->where = u.where; + + if (u.delete_length) { + // if the undo record says to delete characters, then the redo record will + // need to re-insert the characters that get deleted, so we need to store + // them. + + // there are three cases: + // there's enough room to store the characters + // characters stored for *redoing* don't leave room for redo + // characters stored for *undoing* don't leave room for redo + // if the last is true, we have to bail + + if (s->undo_char_point + u.delete_length >= STB_TEXTEDIT_UNDOCHARCOUNT) { + // the undo records take up too much character space; there's no space to store the redo characters + r->insert_length = 0; + } else { + int i; + + // there's definitely room to store the characters eventually + while (s->undo_char_point + u.delete_length > s->redo_char_point) { + // should never happen: + if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + return; + // there's currently not enough room, so discard a redo record + stb_textedit_discard_redo(s); + } + r = &s->undo_rec[s->redo_point-1]; + + r->char_storage = s->redo_char_point - u.delete_length; + s->redo_char_point = s->redo_char_point - u.delete_length; + + // now save the characters + for (i=0; i < u.delete_length; ++i) + s->undo_char[r->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u.where + i); + } + + // now we can carry out the deletion + STB_TEXTEDIT_DELETECHARS(str, u.where, u.delete_length); + } + + // check type of recorded action: + if (u.insert_length) { + // easy case: was a deletion, so we need to insert n characters + STB_TEXTEDIT_INSERTCHARS(str, u.where, &s->undo_char[u.char_storage], u.insert_length); + s->undo_char_point -= u.insert_length; + } + + state->cursor = u.where + u.insert_length; + + s->undo_point--; + s->redo_point--; +} + +static void stb_text_redo(STB_TEXTEDIT_STRING *str, STB_TexteditState *state) +{ + StbUndoState *s = &state->undostate; + StbUndoRecord *u, r; + if (s->redo_point == STB_TEXTEDIT_UNDOSTATECOUNT) + return; + + // we need to do two things: apply the redo record, and create an undo record + u = &s->undo_rec[s->undo_point]; + r = s->undo_rec[s->redo_point]; + + // we KNOW there must be room for the undo record, because the redo record + // was derived from an undo record + + u->delete_length = r.insert_length; + u->insert_length = r.delete_length; + u->where = r.where; + u->char_storage = -1; + + if (r.delete_length) { + // the redo record requires us to delete characters, so the undo record + // needs to store the characters + + if (s->undo_char_point + u->insert_length > s->redo_char_point) { + u->insert_length = 0; + u->delete_length = 0; + } else { + int i; + u->char_storage = s->undo_char_point; + s->undo_char_point = s->undo_char_point + u->insert_length; + + // now save the characters + for (i=0; i < u->insert_length; ++i) + s->undo_char[u->char_storage + i] = STB_TEXTEDIT_GETCHAR(str, u->where + i); + } + + STB_TEXTEDIT_DELETECHARS(str, r.where, r.delete_length); + } + + if (r.insert_length) { + // easy case: need to insert n characters + STB_TEXTEDIT_INSERTCHARS(str, r.where, &s->undo_char[r.char_storage], r.insert_length); + s->redo_char_point += r.insert_length; + } + + state->cursor = r.where + r.insert_length; + + s->undo_point++; + s->redo_point++; +} + +static void stb_text_makeundo_insert(STB_TexteditState *state, int where, int length) +{ + stb_text_createundo(&state->undostate, where, 0, length); +} + +static void stb_text_makeundo_delete(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int length) +{ + int i; + STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, length, 0); + if (p) { + for (i=0; i < length; ++i) + p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); + } +} + +static void stb_text_makeundo_replace(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, int where, int old_length, int new_length) +{ + int i; + STB_TEXTEDIT_CHARTYPE *p = stb_text_createundo(&state->undostate, where, old_length, new_length); + if (p) { + for (i=0; i < old_length; ++i) + p[i] = STB_TEXTEDIT_GETCHAR(str, where+i); + } +} + +// reset the state to default +static void stb_textedit_clear_state(STB_TexteditState *state, int is_single_line) +{ + state->undostate.undo_point = 0; + state->undostate.undo_char_point = 0; + state->undostate.redo_point = STB_TEXTEDIT_UNDOSTATECOUNT; + state->undostate.redo_char_point = STB_TEXTEDIT_UNDOCHARCOUNT; + state->select_end = state->select_start = 0; + state->cursor = 0; + state->has_preferred_x = 0; + state->preferred_x = 0; + state->cursor_at_end_of_line = 0; + state->initialized = 1; + state->single_line = (unsigned char) is_single_line; + state->insert_mode = 0; + state->row_count_per_page = 0; +} + +// API initialize +static void stb_textedit_initialize_state(STB_TexteditState *state, int is_single_line) +{ + stb_textedit_clear_state(state, is_single_line); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +static int stb_textedit_paste(STB_TEXTEDIT_STRING *str, STB_TexteditState *state, STB_TEXTEDIT_CHARTYPE const *ctext, int len) +{ + return stb_textedit_paste_internal(str, state, (STB_TEXTEDIT_CHARTYPE *) ctext, len); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif//STB_TEXTEDIT_IMPLEMENTATION + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is 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 Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/ImGui/imstb_truetype.h b/ImGui/imstb_truetype.h new file mode 100644 index 0000000..35c827e --- /dev/null +++ b/ImGui/imstb_truetype.h @@ -0,0 +1,5085 @@ +// [DEAR IMGUI] +// This is a slightly modified version of stb_truetype.h 1.26. +// Mostly fixing for compiler and static analyzer warnings. +// Grep for [DEAR IMGUI] to find the changes. + +// stb_truetype.h - v1.26 - public domain +// authored from 2009-2021 by Sean Barrett / RAD Game Tools +// +// ======================================================================= +// +// NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES +// +// This library does no range checking of the offsets found in the file, +// meaning an attacker can use it to read arbitrary memory. +// +// ======================================================================= +// +// This library processes TrueType files: +// parse files +// extract glyph metrics +// extract glyph shapes +// render glyphs to one-channel bitmaps with antialiasing (box filter) +// render glyphs to one-channel SDF bitmaps (signed-distance field/function) +// +// Todo: +// non-MS cmaps +// crashproof on bad data +// hinting? (no longer patented) +// cleartype-style AA? +// optimize: use simple memory allocator for intermediates +// optimize: build edge-list directly from curves +// optimize: rasterize directly from curves? +// +// ADDITIONAL CONTRIBUTORS +// +// Mikko Mononen: compound shape support, more cmap formats +// Tor Andersson: kerning, subpixel rendering +// Dougall Johnson: OpenType / Type 2 font handling +// Daniel Ribeiro Maciel: basic GPOS-based kerning +// +// Misc other: +// Ryan Gordon +// Simon Glass +// github:IntellectualKitty +// Imanol Celaya +// Daniel Ribeiro Maciel +// +// Bug/warning reports/fixes: +// "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe +// Cass Everitt Martins Mozeiko github:aloucks +// stoiko (Haemimont Games) Cap Petschulat github:oyvindjam +// Brian Hook Omar Cornut github:vassvik +// Walter van Niftrik Ryan Griege +// David Gow Peter LaValle +// David Given Sergey Popov +// Ivan-Assen Ivanov Giumo X. Clanjor +// Anthony Pesch Higor Euripedes +// Johan Duparc Thomas Fields +// Hou Qiming Derek Vinyard +// Rob Loach Cort Stratton +// Kenney Phillis Jr. Brian Costabile +// Ken Voskuil (kaesve) +// +// VERSION HISTORY +// +// 1.26 (2021-08-28) fix broken rasterizer +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// variant PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// +// Full history can be found at the end of this file. +// +// LICENSE +// +// See end of file for license information. +// +// USAGE +// +// Include this file in whatever places need to refer to it. In ONE C/C++ +// file, write: +// #define STB_TRUETYPE_IMPLEMENTATION +// before the #include of this file. This expands out the actual +// implementation into that C/C++ file. +// +// To make the implementation private to the file that generates the implementation, +// #define STBTT_STATIC +// +// Simple 3D API (don't ship this, but it's fine for tools and quick start) +// stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture +// stbtt_GetBakedQuad() -- compute quad to draw for a given char +// +// Improved 3D API (more shippable): +// #include "stb_rect_pack.h" -- optional, but you really want it +// stbtt_PackBegin() +// stbtt_PackSetOversampling() -- for improved quality on small fonts +// stbtt_PackFontRanges() -- pack and renders +// stbtt_PackEnd() +// stbtt_GetPackedQuad() +// +// "Load" a font file from a memory buffer (you have to keep the buffer loaded) +// stbtt_InitFont() +// stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections +// stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections +// +// Render a unicode codepoint to a bitmap +// stbtt_GetCodepointBitmap() -- allocates and returns a bitmap +// stbtt_MakeCodepointBitmap() -- renders into bitmap you provide +// stbtt_GetCodepointBitmapBox() -- how big the bitmap must be +// +// Character advance/positioning +// stbtt_GetCodepointHMetrics() +// stbtt_GetFontVMetrics() +// stbtt_GetFontVMetricsOS2() +// stbtt_GetCodepointKernAdvance() +// +// Starting with version 1.06, the rasterizer was replaced with a new, +// faster and generally-more-precise rasterizer. The new rasterizer more +// accurately measures pixel coverage for anti-aliasing, except in the case +// where multiple shapes overlap, in which case it overestimates the AA pixel +// coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If +// this turns out to be a problem, you can re-enable the old rasterizer with +// #define STBTT_RASTERIZER_VERSION 1 +// which will incur about a 15% speed hit. +// +// ADDITIONAL DOCUMENTATION +// +// Immediately after this block comment are a series of sample programs. +// +// After the sample programs is the "header file" section. This section +// includes documentation for each API function. +// +// Some important concepts to understand to use this library: +// +// Codepoint +// Characters are defined by unicode codepoints, e.g. 65 is +// uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is +// the hiragana for "ma". +// +// Glyph +// A visual character shape (every codepoint is rendered as +// some glyph) +// +// Glyph index +// A font-specific integer ID representing a glyph +// +// Baseline +// Glyph shapes are defined relative to a baseline, which is the +// bottom of uppercase characters. Characters extend both above +// and below the baseline. +// +// Current Point +// As you draw text to the screen, you keep track of a "current point" +// which is the origin of each character. The current point's vertical +// position is the baseline. Even "baked fonts" use this model. +// +// Vertical Font Metrics +// The vertical qualities of the font, used to vertically position +// and space the characters. See docs for stbtt_GetFontVMetrics. +// +// Font Size in Pixels or Points +// The preferred interface for specifying font sizes in stb_truetype +// is to specify how tall the font's vertical extent should be in pixels. +// If that sounds good enough, skip the next paragraph. +// +// Most font APIs instead use "points", which are a common typographic +// measurement for describing font size, defined as 72 points per inch. +// stb_truetype provides a point API for compatibility. However, true +// "per inch" conventions don't make much sense on computer displays +// since different monitors have different number of pixels per +// inch. For example, Windows traditionally uses a convention that +// there are 96 pixels per inch, thus making 'inch' measurements have +// nothing to do with inches, and thus effectively defining a point to +// be 1.333 pixels. Additionally, the TrueType font data provides +// an explicit scale factor to scale a given font's glyphs to points, +// but the author has observed that this scale factor is often wrong +// for non-commercial fonts, thus making fonts scaled in points +// according to the TrueType spec incoherently sized in practice. +// +// DETAILED USAGE: +// +// Scale: +// Select how high you want the font to be, in points or pixels. +// Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute +// a scale factor SF that will be used by all other functions. +// +// Baseline: +// You need to select a y-coordinate that is the baseline of where +// your text will appear. Call GetFontBoundingBox to get the baseline-relative +// bounding box for all characters. SF*-y0 will be the distance in pixels +// that the worst-case character could extend above the baseline, so if +// you want the top edge of characters to appear at the top of the +// screen where y=0, then you would set the baseline to SF*-y0. +// +// Current point: +// Set the current point where the first character will appear. The +// first character could extend left of the current point; this is font +// dependent. You can either choose a current point that is the leftmost +// point and hope, or add some padding, or check the bounding box or +// left-side-bearing of the first character to be displayed and set +// the current point based on that. +// +// Displaying a character: +// Compute the bounding box of the character. It will contain signed values +// relative to . I.e. if it returns x0,y0,x1,y1, +// then the character should be displayed in the rectangle from +// to = 32 && *text < 128) { + stbtt_aligned_quad q; + stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 + glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); + glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); + glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); + glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); + } + ++text; + } + glEnd(); +} +#endif +// +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program (this compiles): get a single bitmap, print as ASCII art +// +#if 0 +#include +#define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation +#include "stb_truetype.h" + +char ttf_buffer[1<<25]; + +int main(int argc, char **argv) +{ + stbtt_fontinfo font; + unsigned char *bitmap; + int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); + + fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); + + stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); + bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); + + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) + putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); + putchar('\n'); + } + return 0; +} +#endif +// +// Output: +// +// .ii. +// @@@@@@. +// V@Mio@@o +// :i. V@V +// :oM@@M +// :@@@MM@M +// @@o o@M +// :@@. M@M +// @@@o@@@@ +// :M@@V:@@. +// +////////////////////////////////////////////////////////////////////////////// +// +// Complete program: print "Hello World!" banner, with bugs +// +#if 0 +char buffer[24<<20]; +unsigned char screen[20][79]; + +int main(int arg, char **argv) +{ + stbtt_fontinfo font; + int i,j,ascent,baseline,ch=0; + float scale, xpos=2; // leave a little padding in case the character extends left + char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness + + fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); + stbtt_InitFont(&font, buffer, 0); + + scale = stbtt_ScaleForPixelHeight(&font, 15); + stbtt_GetFontVMetrics(&font, &ascent,0,0); + baseline = (int) (ascent*scale); + + while (text[ch]) { + int advance,lsb,x0,y0,x1,y1; + float x_shift = xpos - (float) floor(xpos); + stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); + stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); + stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); + // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong + // because this API is really for baking character bitmaps into textures. if you want to render + // a sequence of characters, you really need to render each bitmap to a temp buffer, then + // "alpha blend" that into the working buffer + xpos += (advance * scale); + if (text[ch+1]) + xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); + ++ch; + } + + for (j=0; j < 20; ++j) { + for (i=0; i < 78; ++i) + putchar(" .:ioVM@"[screen[j][i]>>5]); + putchar('\n'); + } + + return 0; +} +#endif + + +////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////// +//// +//// INTEGRATION WITH YOUR CODEBASE +//// +//// The following sections allow you to supply alternate definitions +//// of C library functions used by stb_truetype, e.g. if you don't +//// link with the C runtime library. + +#ifdef STB_TRUETYPE_IMPLEMENTATION + // #define your own (u)stbtt_int8/16/32 before including to override this + #ifndef stbtt_uint8 + typedef unsigned char stbtt_uint8; + typedef signed char stbtt_int8; + typedef unsigned short stbtt_uint16; + typedef signed short stbtt_int16; + typedef unsigned int stbtt_uint32; + typedef signed int stbtt_int32; + #endif + + typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; + typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; + + // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h + #ifndef STBTT_ifloor + #include + #define STBTT_ifloor(x) ((int) floor(x)) + #define STBTT_iceil(x) ((int) ceil(x)) + #endif + + #ifndef STBTT_sqrt + #include + #define STBTT_sqrt(x) sqrt(x) + #define STBTT_pow(x,y) pow(x,y) + #endif + + #ifndef STBTT_fmod + #include + #define STBTT_fmod(x,y) fmod(x,y) + #endif + + #ifndef STBTT_cos + #include + #define STBTT_cos(x) cos(x) + #define STBTT_acos(x) acos(x) + #endif + + #ifndef STBTT_fabs + #include + #define STBTT_fabs(x) fabs(x) + #endif + + // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h + #ifndef STBTT_malloc + #include + #define STBTT_malloc(x,u) ((void)(u),malloc(x)) + #define STBTT_free(x,u) ((void)(u),free(x)) + #endif + + #ifndef STBTT_assert + #include + #define STBTT_assert(x) assert(x) + #endif + + #ifndef STBTT_strlen + #include + #define STBTT_strlen(x) strlen(x) + #endif + + #ifndef STBTT_memcpy + #include + #define STBTT_memcpy memcpy + #define STBTT_memset memset + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// INTERFACE +//// +//// + +#ifndef __STB_INCLUDE_STB_TRUETYPE_H__ +#define __STB_INCLUDE_STB_TRUETYPE_H__ + +#ifdef STBTT_STATIC +#define STBTT_DEF static +#else +#define STBTT_DEF extern +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +// private structure +typedef struct +{ + unsigned char *data; + int cursor; + int size; +} stbtt__buf; + +////////////////////////////////////////////////////////////////////////////// +// +// TEXTURE BAKING API +// +// If you use this API, you only have to call two functions ever. +// + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; +} stbtt_bakedchar; + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata); // you allocate this, it's num_chars long +// if return is positive, the first unused row of the bitmap +// if return is negative, returns the negative of the number of characters that fit +// if return is 0, no characters fit and no rows were used +// This uses a very crappy packing. + +typedef struct +{ + float x0,y0,s0,t0; // top-left + float x1,y1,s1,t1; // bottom-right +} stbtt_aligned_quad; + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier +// Call GetBakedQuad with char_index = 'character - first_char', and it +// creates the quad you need to draw and advances the current position. +// +// The coordinate system used assumes y increases downwards. +// +// Characters will extend both above and below the current position; +// see discussion of "BASELINE" above. +// +// It's inefficient; you might want to c&p it and optimize it. + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); +// Query the font vertical metrics without having to create a font first. + + +////////////////////////////////////////////////////////////////////////////// +// +// NEW TEXTURE BAKING API +// +// This provides options for packing multiple fonts into one atlas, not +// perfectly but better than nothing. + +typedef struct +{ + unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap + float xoff,yoff,xadvance; + float xoff2,yoff2; +} stbtt_packedchar; + +typedef struct stbtt_pack_context stbtt_pack_context; +typedef struct stbtt_fontinfo stbtt_fontinfo; +#ifndef STB_RECT_PACK_VERSION +typedef struct stbrp_rect stbrp_rect; +#endif + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); +// Initializes a packing context stored in the passed-in stbtt_pack_context. +// Future calls using this context will pack characters into the bitmap passed +// in here: a 1-channel bitmap that is width * height. stride_in_bytes is +// the distance from one row to the next (or 0 to mean they are packed tightly +// together). "padding" is the amount of padding to leave between each +// character (normally you want '1' for bitmaps you'll use as textures with +// bilinear filtering). +// +// Returns 0 on failure, 1 on success. + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); +// Cleans up the packing context and frees all memory. + +#define STBTT_POINT_SIZE(x) (-(x)) + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); +// Creates character bitmaps from the font_index'th font found in fontdata (use +// font_index=0 if you don't know what that is). It creates num_chars_in_range +// bitmaps for characters with unicode values starting at first_unicode_char_in_range +// and increasing. Data for how to render them is stored in chardata_for_range; +// pass these to stbtt_GetPackedQuad to get back renderable quads. +// +// font_size is the full height of the character from ascender to descender, +// as computed by stbtt_ScaleForPixelHeight. To use a point size as computed +// by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() +// and pass that result as 'font_size': +// ..., 20 , ... // font max minus min y is 20 pixels tall +// ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall + +typedef struct +{ + float font_size; + int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint + int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints + int num_chars; + stbtt_packedchar *chardata_for_range; // output + unsigned char h_oversample, v_oversample; // don't set these, they're used internally +} stbtt_pack_range; + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); +// Creates character bitmaps from multiple ranges of characters stored in +// ranges. This will usually create a better-packed bitmap than multiple +// calls to stbtt_PackFontRange. Note that you can call this multiple +// times within a single PackBegin/PackEnd. + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); +// Oversampling a font increases the quality by allowing higher-quality subpixel +// positioning, and is especially valuable at smaller text sizes. +// +// This function sets the amount of oversampling for all following calls to +// stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given +// pack context. The default (no oversampling) is achieved by h_oversample=1 +// and v_oversample=1. The total number of pixels required is +// h_oversample*v_oversample larger than the default; for example, 2x2 +// oversampling requires 4x the storage of 1x1. For best results, render +// oversampled textures with bilinear filtering. Look at the readme in +// stb/tests/oversample for information about oversampled fonts +// +// To use with PackFontRangesGather etc., you must set it before calls +// call to PackFontRangesGatherRects. + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); +// If skip != 0, this tells stb_truetype to skip any codepoints for which +// there is no corresponding glyph. If skip=0, which is the default, then +// codepoints without a glyph recived the font's "missing character" glyph, +// typically an empty box by convention. + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above + int char_index, // character to display + float *xpos, float *ypos, // pointers to current position in screen pixel space + stbtt_aligned_quad *q, // output: quad to draw + int align_to_integer); + +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); +// Calling these functions in sequence is roughly equivalent to calling +// stbtt_PackFontRanges(). If you more control over the packing of multiple +// fonts, or if you want to pack custom data into a font texture, take a look +// at the source to of stbtt_PackFontRanges() and create a custom version +// using these functions, e.g. call GatherRects multiple times, +// building up a single array of rects, then call PackRects once, +// then call RenderIntoRects repeatedly. This may result in a +// better packing than calling PackFontRanges multiple times +// (or it may not). + +// this is an opaque structure that you shouldn't mess with which holds +// all the context needed from PackBegin to PackEnd. +struct stbtt_pack_context { + void *user_allocator_context; + void *pack_info; + int width; + int height; + int stride_in_bytes; + int padding; + int skip_missing; + unsigned int h_oversample, v_oversample; + unsigned char *pixels; + void *nodes; +}; + +////////////////////////////////////////////////////////////////////////////// +// +// FONT LOADING +// +// + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); +// This function will determine the number of fonts in a font file. TrueType +// collection (.ttc) files may contain multiple fonts, while TrueType font +// (.ttf) files only contain one font. The number of fonts can be used for +// indexing with the previous function where the index is between zero and one +// less than the total fonts. If an error occurs, -1 is returned. + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); +// Each .ttf/.ttc file may have more than one font. Each font has a sequential +// index number starting from 0. Call this function to get the font offset for +// a given index; it returns -1 if the index is out of range. A regular .ttf +// file will only define one font and it always be at offset 0, so it will +// return '0' for index 0, and -1 for all other indices. + +// The following structure is defined publicly so you can declare one on +// the stack or as a global or etc, but you should treat it as opaque. +struct stbtt_fontinfo +{ + void * userdata; + unsigned char * data; // pointer to .ttf file + int fontstart; // offset of start of font + + int numGlyphs; // number of glyphs, needed for range checking + + int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf + int index_map; // a cmap mapping for our chosen character encoding + int indexToLocFormat; // format needed to map from glyph index to glyph + + stbtt__buf cff; // cff font data + stbtt__buf charstrings; // the charstring index + stbtt__buf gsubrs; // global charstring subroutines index + stbtt__buf subrs; // private charstring subroutines index + stbtt__buf fontdicts; // array of font dicts + stbtt__buf fdselect; // map from glyph to fontdict +}; + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); +// Given an offset into the file that defines a font, this function builds +// the necessary cached info for the rest of the system. You must allocate +// the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't +// need to do anything special to free it, because the contents are pure +// value data with no additional data structures. Returns 0 on failure. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER TO GLYPH-INDEX CONVERSIOn + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); +// If you're going to perform multiple operations on the same character +// and you want a speed-up, call this function with the character you're +// going to process, then use glyph-based functions instead of the +// codepoint-based functions. +// Returns 0 if the character codepoint is not defined in the font. + + +////////////////////////////////////////////////////////////////////////////// +// +// CHARACTER PROPERTIES +// + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose "height" is 'pixels' tall. +// Height is measured as the distance from the highest ascender to the lowest +// descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics +// and computing: +// scale = pixels / (ascent - descent) +// so if you prefer to measure height by the ascent only, use a similar calculation. + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); +// computes a scale factor to produce a font whose EM size is mapped to +// 'pixels' tall. This is probably what traditional APIs compute, but +// I'm not positive. + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); +// ascent is the coordinate above the baseline the font extends; descent +// is the coordinate below the baseline the font extends (i.e. it is typically negative) +// lineGap is the spacing between one row's descent and the next row's ascent... +// so you should advance the vertical position by "*ascent - *descent + *lineGap" +// these are expressed in unscaled coordinates, so you must multiply by +// the scale factor for a given size + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); +// analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 +// table (specific to MS/Windows TTF files). +// +// Returns 1 on success (table present), 0 on failure. + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); +// the bounding box around all possible characters + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); +// leftSideBearing is the offset from the current horizontal position to the left edge of the character +// advanceWidth is the offset from the current horizontal position to the next horizontal position +// these are expressed in unscaled coordinates + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); +// an additional amount to add to the 'advance' value between ch1 and ch2 + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); +// Gets the bounding box of the visible part of the glyph, in unscaled coordinates + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); +// as above, but takes one or more glyph indices for greater efficiency + +typedef struct stbtt_kerningentry +{ + int glyph1; // use stbtt_FindGlyphIndex + int glyph2; + int advance; +} stbtt_kerningentry; + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); +// Retrieves a complete list of all of the kerning pairs provided by the font +// stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. +// The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) + +////////////////////////////////////////////////////////////////////////////// +// +// GLYPH SHAPES (you probably don't need these, but they have to go before +// the bitmaps for C declaration-order reasons) +// + +#ifndef STBTT_vmove // you can predefine these to use different values (but why?) + enum { + STBTT_vmove=1, + STBTT_vline, + STBTT_vcurve, + STBTT_vcubic + }; +#endif + +#ifndef stbtt_vertex // you can predefine this to use different values + // (we share this with other code at RAD) + #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file + typedef struct + { + stbtt_vertex_type x,y,cx,cy,cx1,cy1; + unsigned char type,padding; + } stbtt_vertex; +#endif + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); +// returns non-zero if nothing is drawn for this glyph + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); +// returns # of vertices and fills *vertices with the pointer to them +// these are expressed in "unscaled" coordinates +// +// The shape is a series of contours. Each one starts with +// a STBTT_moveto, then consists of a series of mixed +// STBTT_lineto and STBTT_curveto segments. A lineto +// draws a line from previous endpoint to its x,y; a curveto +// draws a quadratic bezier from previous endpoint to +// its x,y, using cx,cy as the bezier control point. + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); +// frees the data allocated above + +STBTT_DEF unsigned char *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl); +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); +// fills svg with the character's SVG data. +// returns data size or 0 if SVG not found. + +////////////////////////////////////////////////////////////////////////////// +// +// BITMAP RENDERING +// + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); +// frees the bitmap allocated below + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// allocates a large-enough single-channel 8bpp bitmap and renders the +// specified character/glyph at the specified scale into it, with +// antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). +// *width & *height are filled out with the width & height of the bitmap, +// which is stored left-to-right, top-to-bottom. +// +// xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); +// the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); +// the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap +// in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap +// is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the +// width and height and positioning info for it first. + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); +// same as stbtt_MakeCodepointBitmap, but you can specify a subpixel +// shift for the character + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); +// same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering +// is performed (see stbtt_PackSetOversampling) + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +// get the bbox of the bitmap centered around the glyph origin; so the +// bitmap width is ix1-ix0, height is iy1-iy0, and location to place +// the bitmap top left is (leftSideBearing*scale,iy0). +// (Note that the bitmap uses y-increases-down, but the shape uses +// y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); +// same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel +// shift for the character + +// the following functions are equivalent to the above functions, but operate +// on glyph indices instead of Unicode codepoints (for efficiency) +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); + + +// @TODO: don't expose this structure +typedef struct +{ + int w,h,stride; + unsigned char *pixels; +} stbtt__bitmap; + +// rasterize a shape with quadratic beziers into a bitmap +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into + float flatness_in_pixels, // allowable error of curve in pixels + stbtt_vertex *vertices, // array of vertices defining shape + int num_verts, // number of vertices in above array + float scale_x, float scale_y, // scale applied to input vertices + float shift_x, float shift_y, // translation applied to input vertices + int x_off, int y_off, // another translation applied to input + int invert, // if non-zero, vertically flip shape + void *userdata); // context for to STBTT_MALLOC + +////////////////////////////////////////////////////////////////////////////// +// +// Signed Distance Function (or Field) rendering + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); +// frees the SDF bitmap allocated below + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); +// These functions compute a discretized SDF field for a single character, suitable for storing +// in a single-channel texture, sampling with bilinear filtering, and testing against +// larger than some threshold to produce scalable fonts. +// info -- the font +// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap +// glyph/codepoint -- the character to generate the SDF for +// padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), +// which allows effects like bit outlines +// onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) +// pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) +// if positive, > onedge_value is inside; if negative, < onedge_value is inside +// width,height -- output height & width of the SDF bitmap (including padding) +// xoff,yoff -- output origin of the character +// return value -- a 2D array of bytes 0..255, width*height in size +// +// pixel_dist_scale & onedge_value are a scale & bias that allows you to make +// optimal use of the limited 0..255 for your application, trading off precision +// and special effects. SDF values outside the range 0..255 are clamped to 0..255. +// +// Example: +// scale = stbtt_ScaleForPixelHeight(22) +// padding = 5 +// onedge_value = 180 +// pixel_dist_scale = 180/5.0 = 36.0 +// +// This will create an SDF bitmap in which the character is about 22 pixels +// high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled +// shape, sample the SDF at each pixel and fill the pixel if the SDF value +// is greater than or equal to 180/255. (You'll actually want to antialias, +// which is beyond the scope of this example.) Additionally, you can compute +// offset outlines (e.g. to stroke the character border inside & outside, +// or only outside). For example, to fill outside the character up to 3 SDF +// pixels, you would compare against (180-36.0*3)/255 = 72/255. The above +// choice of variables maps a range from 5 pixels outside the shape to +// 2 pixels inside the shape to 0..255; this is intended primarily for apply +// outside effects only (the interior range is needed to allow proper +// antialiasing of the font at *smaller* sizes) +// +// The function computes the SDF analytically at each SDF pixel, not by e.g. +// building a higher-res bitmap and approximating it. In theory the quality +// should be as high as possible for an SDF of this size & representation, but +// unclear if this is true in practice (perhaps building a higher-res bitmap +// and computing from that can allow drop-out prevention). +// +// The algorithm has not been optimized at all, so expect it to be slow +// if computing lots of characters or very large sizes. + + + +////////////////////////////////////////////////////////////////////////////// +// +// Finding the right font... +// +// You should really just solve this offline, keep your own tables +// of what font is what, and don't try to get it out of the .ttf file. +// That's because getting it out of the .ttf file is really hard, because +// the names in the file can appear in many possible encodings, in many +// possible languages, and e.g. if you need a case-insensitive comparison, +// the details of that depend on the encoding & language in a complex way +// (actually underspecified in truetype, but also gigantic). +// +// But you can use the provided functions in two possible ways: +// stbtt_FindMatchingFont() will use *case-sensitive* comparisons on +// unicode-encoded names to try to find the font you want; +// you can run this before calling stbtt_InitFont() +// +// stbtt_GetFontNameString() lets you get any of the various strings +// from the file yourself and do your own comparisons on them. +// You have to have called stbtt_InitFont() first. + + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); +// returns the offset (not index) of the font that matches, or -1 if none +// if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". +// if you use any other flag, use a font name like "Arial"; this checks +// the 'macStyle' header field; i don't know if fonts set this consistently +#define STBTT_MACSTYLE_DONTCARE 0 +#define STBTT_MACSTYLE_BOLD 1 +#define STBTT_MACSTYLE_ITALIC 2 +#define STBTT_MACSTYLE_UNDERSCORE 4 +#define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); +// returns 1/0 whether the first string interpreted as utf8 is identical to +// the second string interpreted as big-endian utf16... useful for strings from next func + +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); +// returns the string (which may be big-endian double byte, e.g. for unicode) +// and puts the length in bytes in *length. +// +// some of the values for the IDs are below; for more see the truetype spec: +// http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html +// http://www.microsoft.com/typography/otspec/name.htm + +enum { // platformID + STBTT_PLATFORM_ID_UNICODE =0, + STBTT_PLATFORM_ID_MAC =1, + STBTT_PLATFORM_ID_ISO =2, + STBTT_PLATFORM_ID_MICROSOFT =3 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_UNICODE + STBTT_UNICODE_EID_UNICODE_1_0 =0, + STBTT_UNICODE_EID_UNICODE_1_1 =1, + STBTT_UNICODE_EID_ISO_10646 =2, + STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, + STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT + STBTT_MS_EID_SYMBOL =0, + STBTT_MS_EID_UNICODE_BMP =1, + STBTT_MS_EID_SHIFTJIS =2, + STBTT_MS_EID_UNICODE_FULL =10 +}; + +enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes + STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, + STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, + STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, + STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 +}; + +enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... + // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs + STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, + STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, + STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, + STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, + STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, + STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D +}; + +enum { // languageID for STBTT_PLATFORM_ID_MAC + STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, + STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, + STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, + STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , + STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , + STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, + STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 +}; + +#ifdef __cplusplus +} +#endif + +#endif // __STB_INCLUDE_STB_TRUETYPE_H__ + +/////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////// +//// +//// IMPLEMENTATION +//// +//// + +#ifdef STB_TRUETYPE_IMPLEMENTATION + +#ifndef STBTT_MAX_OVERSAMPLE +#define STBTT_MAX_OVERSAMPLE 8 +#endif + +#if STBTT_MAX_OVERSAMPLE > 255 +#error "STBTT_MAX_OVERSAMPLE cannot be > 255" +#endif + +typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; + +#ifndef STBTT_RASTERIZER_VERSION +#define STBTT_RASTERIZER_VERSION 2 +#endif + +#ifdef _MSC_VER +#define STBTT__NOTUSED(v) (void)(v) +#else +#define STBTT__NOTUSED(v) (void)sizeof(v) +#endif + +////////////////////////////////////////////////////////////////////////// +// +// stbtt__buf helpers to parse data from file +// + +static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor++]; +} + +static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) +{ + if (b->cursor >= b->size) + return 0; + return b->data[b->cursor]; +} + +static void stbtt__buf_seek(stbtt__buf *b, int o) +{ + STBTT_assert(!(o > b->size || o < 0)); + b->cursor = (o > b->size || o < 0) ? b->size : o; +} + +static void stbtt__buf_skip(stbtt__buf *b, int o) +{ + stbtt__buf_seek(b, b->cursor + o); +} + +static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) +{ + stbtt_uint32 v = 0; + int i; + STBTT_assert(n >= 1 && n <= 4); + for (i = 0; i < n; i++) + v = (v << 8) | stbtt__buf_get8(b); + return v; +} + +static stbtt__buf stbtt__new_buf(const void *p, size_t size) +{ + stbtt__buf r; + STBTT_assert(size < 0x40000000); + r.data = (stbtt_uint8*) p; + r.size = (int) size; + r.cursor = 0; + return r; +} + +#define stbtt__buf_get16(b) stbtt__buf_get((b), 2) +#define stbtt__buf_get32(b) stbtt__buf_get((b), 4) + +static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) +{ + stbtt__buf r = stbtt__new_buf(NULL, 0); + if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; + r.data = b->data + o; + r.size = s; + return r; +} + +static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) +{ + int count, start, offsize; + start = b->cursor; + count = stbtt__buf_get16(b); + if (count) { + offsize = stbtt__buf_get8(b); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(b, offsize * count); + stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); + } + return stbtt__buf_range(b, start, b->cursor - start); +} + +static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) +{ + int b0 = stbtt__buf_get8(b); + if (b0 >= 32 && b0 <= 246) return b0 - 139; + else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; + else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; + else if (b0 == 28) return stbtt__buf_get16(b); + else if (b0 == 29) return stbtt__buf_get32(b); + STBTT_assert(0); + return 0; +} + +static void stbtt__cff_skip_operand(stbtt__buf *b) { + int v, b0 = stbtt__buf_peek8(b); + STBTT_assert(b0 >= 28); + if (b0 == 30) { + stbtt__buf_skip(b, 1); + while (b->cursor < b->size) { + v = stbtt__buf_get8(b); + if ((v & 0xF) == 0xF || (v >> 4) == 0xF) + break; + } + } else { + stbtt__cff_int(b); + } +} + +static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) +{ + stbtt__buf_seek(b, 0); + while (b->cursor < b->size) { + int start = b->cursor, end, op; + while (stbtt__buf_peek8(b) >= 28) + stbtt__cff_skip_operand(b); + end = b->cursor; + op = stbtt__buf_get8(b); + if (op == 12) op = stbtt__buf_get8(b) | 0x100; + if (op == key) return stbtt__buf_range(b, start, end-start); + } + return stbtt__buf_range(b, 0, 0); +} + +static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) +{ + int i; + stbtt__buf operands = stbtt__dict_get(b, key); + for (i = 0; i < outcount && operands.cursor < operands.size; i++) + out[i] = stbtt__cff_int(&operands); +} + +static int stbtt__cff_index_count(stbtt__buf *b) +{ + stbtt__buf_seek(b, 0); + return stbtt__buf_get16(b); +} + +static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) +{ + int count, offsize, start, end; + stbtt__buf_seek(&b, 0); + count = stbtt__buf_get16(&b); + offsize = stbtt__buf_get8(&b); + STBTT_assert(i >= 0 && i < count); + STBTT_assert(offsize >= 1 && offsize <= 4); + stbtt__buf_skip(&b, i*offsize); + start = stbtt__buf_get(&b, offsize); + end = stbtt__buf_get(&b, offsize); + return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); +} + +////////////////////////////////////////////////////////////////////////// +// +// accessors to parse data from file +// + +// on platforms that don't allow misaligned reads, if we want to allow +// truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE + +#define ttBYTE(p) (* (stbtt_uint8 *) (p)) +#define ttCHAR(p) (* (stbtt_int8 *) (p)) +#define ttFixed(p) ttLONG(p) + +static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } +static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } +static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } + +#define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) +#define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) + +static int stbtt__isfont(stbtt_uint8 *font) +{ + // check the version number + if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 + if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! + if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF + if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 + if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts + return 0; +} + +// @OPTIMIZE: binary search +static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) +{ + stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); + stbtt_uint32 tabledir = fontstart + 12; + stbtt_int32 i; + for (i=0; i < num_tables; ++i) { + stbtt_uint32 loc = tabledir + 16*i; + if (stbtt_tag(data+loc+0, tag)) + return ttULONG(data+loc+8); + } + return 0; +} + +static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) +{ + // if it's just a font, there's only one valid index + if (stbtt__isfont(font_collection)) + return index == 0 ? 0 : -1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + stbtt_int32 n = ttLONG(font_collection+8); + if (index >= n) + return -1; + return ttULONG(font_collection+12+index*4); + } + } + return -1; +} + +static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) +{ + // if it's just a font, there's only one valid font + if (stbtt__isfont(font_collection)) + return 1; + + // check if it's a TTC + if (stbtt_tag(font_collection, "ttcf")) { + // version 1? + if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { + return ttLONG(font_collection+8); + } + } + return 0; +} + +static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) +{ + stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; + stbtt__buf pdict; + stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); + if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); + pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); + stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); + if (!subrsoff) return stbtt__new_buf(NULL, 0); + stbtt__buf_seek(&cff, private_loc[1]+subrsoff); + return stbtt__cff_get_index(&cff); +} + +// since most people won't use this, find this table the first time it's needed +static int stbtt__get_svg(stbtt_fontinfo *info) +{ + stbtt_uint32 t; + if (info->svg < 0) { + t = stbtt__find_table(info->data, info->fontstart, "SVG "); + if (t) { + stbtt_uint32 offset = ttULONG(info->data + t + 2); + info->svg = t + offset; + } else { + info->svg = 0; + } + } + return info->svg; +} + +static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) +{ + stbtt_uint32 cmap, t; + stbtt_int32 i,numTables; + + info->data = data; + info->fontstart = fontstart; + info->cff = stbtt__new_buf(NULL, 0); + + cmap = stbtt__find_table(data, fontstart, "cmap"); // required + info->loca = stbtt__find_table(data, fontstart, "loca"); // required + info->head = stbtt__find_table(data, fontstart, "head"); // required + info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required + info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required + info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required + info->kern = stbtt__find_table(data, fontstart, "kern"); // not required + info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required + + if (!cmap || !info->head || !info->hhea || !info->hmtx) + return 0; + if (info->glyf) { + // required for truetype + if (!info->loca) return 0; + } else { + // initialization for CFF / Type2 fonts (OTF) + stbtt__buf b, topdict, topdictidx; + stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; + stbtt_uint32 cff; + + cff = stbtt__find_table(data, fontstart, "CFF "); + if (!cff) return 0; + + info->fontdicts = stbtt__new_buf(NULL, 0); + info->fdselect = stbtt__new_buf(NULL, 0); + + // @TODO this should use size from table (not 512MB) + info->cff = stbtt__new_buf(data+cff, 512*1024*1024); + b = info->cff; + + // read the header + stbtt__buf_skip(&b, 2); + stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize + + // @TODO the name INDEX could list multiple fonts, + // but we just use the first one. + stbtt__cff_get_index(&b); // name INDEX + topdictidx = stbtt__cff_get_index(&b); + topdict = stbtt__cff_index_get(topdictidx, 0); + stbtt__cff_get_index(&b); // string INDEX + info->gsubrs = stbtt__cff_get_index(&b); + + stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); + stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); + stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); + stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); + info->subrs = stbtt__get_subrs(b, topdict); + + // we only support Type 2 charstrings + if (cstype != 2) return 0; + if (charstrings == 0) return 0; + + if (fdarrayoff) { + // looks like a CID font + if (!fdselectoff) return 0; + stbtt__buf_seek(&b, fdarrayoff); + info->fontdicts = stbtt__cff_get_index(&b); + info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); + } + + stbtt__buf_seek(&b, charstrings); + info->charstrings = stbtt__cff_get_index(&b); + } + + t = stbtt__find_table(data, fontstart, "maxp"); + if (t) + info->numGlyphs = ttUSHORT(data+t+4); + else + info->numGlyphs = 0xffff; + + info->svg = -1; + + // find a cmap encoding table we understand *now* to avoid searching + // later. (todo: could make this installable) + // the same regardless of glyph. + numTables = ttUSHORT(data + cmap + 2); + info->index_map = 0; + for (i=0; i < numTables; ++i) { + stbtt_uint32 encoding_record = cmap + 4 + 8 * i; + // find an encoding we understand: + switch(ttUSHORT(data+encoding_record)) { + case STBTT_PLATFORM_ID_MICROSOFT: + switch (ttUSHORT(data+encoding_record+2)) { + case STBTT_MS_EID_UNICODE_BMP: + case STBTT_MS_EID_UNICODE_FULL: + // MS/Unicode + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + break; + case STBTT_PLATFORM_ID_UNICODE: + // Mac/iOS has these + // all the encodingIDs are unicode, so we don't bother to check it + info->index_map = cmap + ttULONG(data+encoding_record+4); + break; + } + } + if (info->index_map == 0) + return 0; + + info->indexToLocFormat = ttUSHORT(data+info->head + 50); + return 1; +} + +STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) +{ + stbtt_uint8 *data = info->data; + stbtt_uint32 index_map = info->index_map; + + stbtt_uint16 format = ttUSHORT(data + index_map + 0); + if (format == 0) { // apple byte encoding + stbtt_int32 bytes = ttUSHORT(data + index_map + 2); + if (unicode_codepoint < bytes-6) + return ttBYTE(data + index_map + 6 + unicode_codepoint); + return 0; + } else if (format == 6) { + stbtt_uint32 first = ttUSHORT(data + index_map + 6); + stbtt_uint32 count = ttUSHORT(data + index_map + 8); + if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) + return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); + return 0; + } else if (format == 2) { + STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean + return 0; + } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges + stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; + stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; + stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); + stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; + + // do a binary search of the segments + stbtt_uint32 endCount = index_map + 14; + stbtt_uint32 search = endCount; + + if (unicode_codepoint > 0xffff) + return 0; + + // they lie from endCount .. endCount + segCount + // but searchRange is the nearest power of two, so... + if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) + search += rangeShift*2; + + // now decrement to bias correctly to find smallest + search -= 2; + while (entrySelector) { + stbtt_uint16 end; + searchRange >>= 1; + end = ttUSHORT(data + search + searchRange*2); + if (unicode_codepoint > end) + search += searchRange*2; + --entrySelector; + } + search += 2; + + { + stbtt_uint16 offset, start, last; + stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); + + start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); + last = ttUSHORT(data + endCount + 2*item); + if (unicode_codepoint < start || unicode_codepoint > last) + return 0; + + offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); + if (offset == 0) + return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); + + return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); + } + } else if (format == 12 || format == 13) { + stbtt_uint32 ngroups = ttULONG(data+index_map+12); + stbtt_int32 low,high; + low = 0; high = (stbtt_int32)ngroups; + // Binary search the right group. + while (low < high) { + stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high + stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); + stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); + if ((stbtt_uint32) unicode_codepoint < start_char) + high = mid; + else if ((stbtt_uint32) unicode_codepoint > end_char) + low = mid+1; + else { + stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); + if (format == 12) + return start_glyph + unicode_codepoint-start_char; + else // format == 13 + return start_glyph; + } + } + return 0; // not found + } + // @TODO + STBTT_assert(0); + return 0; +} + +STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) +{ + return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); +} + +static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) +{ + v->type = type; + v->x = (stbtt_int16) x; + v->y = (stbtt_int16) y; + v->cx = (stbtt_int16) cx; + v->cy = (stbtt_int16) cy; +} + +static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) +{ + int g1,g2; + + STBTT_assert(!info->cff.size); + + if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range + if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format + + if (info->indexToLocFormat == 0) { + g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; + g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; + } else { + g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); + g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); + } + + return g1==g2 ? -1 : g1; // if length is 0, return -1 +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); + +STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + if (info->cff.size) { + stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); + } else { + int g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 0; + + if (x0) *x0 = ttSHORT(info->data + g + 2); + if (y0) *y0 = ttSHORT(info->data + g + 4); + if (x1) *x1 = ttSHORT(info->data + g + 6); + if (y1) *y1 = ttSHORT(info->data + g + 8); + } + return 1; +} + +STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) +{ + return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); +} + +STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt_int16 numberOfContours; + int g; + if (info->cff.size) + return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; + g = stbtt__GetGlyfOffset(info, glyph_index); + if (g < 0) return 1; + numberOfContours = ttSHORT(info->data + g); + return numberOfContours == 0; +} + +static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, + stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) +{ + if (start_off) { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); + } + return num_vertices; +} + +static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + stbtt_int16 numberOfContours; + stbtt_uint8 *endPtsOfContours; + stbtt_uint8 *data = info->data; + stbtt_vertex *vertices=0; + int num_vertices=0; + int g = stbtt__GetGlyfOffset(info, glyph_index); + + *pvertices = NULL; + + if (g < 0) return 0; + + numberOfContours = ttSHORT(data + g); + + if (numberOfContours > 0) { + stbtt_uint8 flags=0,flagcount; + stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; + stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; + stbtt_uint8 *points; + endPtsOfContours = (data + g + 10); + ins = ttUSHORT(data + g + 10 + numberOfContours * 2); + points = data + g + 10 + numberOfContours * 2 + 2 + ins; + + n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); + + m = n + 2*numberOfContours; // a loose bound on how many vertices we might need + vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); + if (vertices == 0) + return 0; + + next_move = 0; + flagcount=0; + + // in first pass, we load uninterpreted data into the allocated array + // above, shifted to the end of the array so we won't overwrite it when + // we create our final data starting from the front + + off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated + + // first load flags + + for (i=0; i < n; ++i) { + if (flagcount == 0) { + flags = *points++; + if (flags & 8) + flagcount = *points++; + } else + --flagcount; + vertices[off+i].type = flags; + } + + // now load x coordinates + x=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 2) { + stbtt_int16 dx = *points++; + x += (flags & 16) ? dx : -dx; // ??? + } else { + if (!(flags & 16)) { + x = x + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].x = (stbtt_int16) x; + } + + // now load y coordinates + y=0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + if (flags & 4) { + stbtt_int16 dy = *points++; + y += (flags & 32) ? dy : -dy; // ??? + } else { + if (!(flags & 32)) { + y = y + (stbtt_int16) (points[0]*256 + points[1]); + points += 2; + } + } + vertices[off+i].y = (stbtt_int16) y; + } + + // now convert them to our format + num_vertices=0; + sx = sy = cx = cy = scx = scy = 0; + for (i=0; i < n; ++i) { + flags = vertices[off+i].type; + x = (stbtt_int16) vertices[off+i].x; + y = (stbtt_int16) vertices[off+i].y; + + if (next_move == i) { + if (i != 0) + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + + // now start the new one + start_off = !(flags & 1); + if (start_off) { + // if we start off with an off-curve point, then when we need to find a point on the curve + // where we can start, and we need to save some state for when we wraparound. + scx = x; + scy = y; + if (!(vertices[off+i+1].type & 1)) { + // next point is also a curve point, so interpolate an on-point curve + sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; + sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; + } else { + // otherwise just use the next point as our start point + sx = (stbtt_int32) vertices[off+i+1].x; + sy = (stbtt_int32) vertices[off+i+1].y; + ++i; // we're using point i+1 as the starting point, so skip it + } + } else { + sx = x; + sy = y; + } + stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); + was_off = 0; + next_move = 1 + ttUSHORT(endPtsOfContours+j*2); + ++j; + } else { + if (!(flags & 1)) { // if it's a curve + if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); + cx = x; + cy = y; + was_off = 1; + } else { + if (was_off) + stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); + else + stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); + was_off = 0; + } + } + } + num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); + } else if (numberOfContours < 0) { + // Compound shapes. + int more = 1; + stbtt_uint8 *comp = data + g + 10; + num_vertices = 0; + vertices = 0; + while (more) { + stbtt_uint16 flags, gidx; + int comp_num_verts = 0, i; + stbtt_vertex *comp_verts = 0, *tmp = 0; + float mtx[6] = {1,0,0,1,0,0}, m, n; + + flags = ttSHORT(comp); comp+=2; + gidx = ttSHORT(comp); comp+=2; + + if (flags & 2) { // XY values + if (flags & 1) { // shorts + mtx[4] = ttSHORT(comp); comp+=2; + mtx[5] = ttSHORT(comp); comp+=2; + } else { + mtx[4] = ttCHAR(comp); comp+=1; + mtx[5] = ttCHAR(comp); comp+=1; + } + } + else { + // @TODO handle matching point + STBTT_assert(0); + } + if (flags & (1<<3)) { // WE_HAVE_A_SCALE + mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = mtx[2] = 0; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO + mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; + mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; + } + + // Find transformation scales. + m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); + n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); + + // Get indexed glyph. + comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); + if (comp_num_verts > 0) { + // Transform vertices. + for (i = 0; i < comp_num_verts; ++i) { + stbtt_vertex* v = &comp_verts[i]; + stbtt_vertex_type x,y; + x=v->x; y=v->y; + v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + x=v->cx; y=v->cy; + v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); + v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); + } + // Append vertices. + tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); + if (!tmp) { + if (vertices) STBTT_free(vertices, info->userdata); + if (comp_verts) STBTT_free(comp_verts, info->userdata); + return 0; + } + if (num_vertices > 0 && vertices) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); + STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); + if (vertices) STBTT_free(vertices, info->userdata); + vertices = tmp; + STBTT_free(comp_verts, info->userdata); + num_vertices += comp_num_verts; + } + // More components ? + more = flags & (1<<5); + } + } else { + // numberOfCounters == 0, do nothing + } + + *pvertices = vertices; + return num_vertices; +} + +typedef struct +{ + int bounds; + int started; + float first_x, first_y; + float x, y; + stbtt_int32 min_x, max_x, min_y, max_y; + + stbtt_vertex *pvertices; + int num_vertices; +} stbtt__csctx; + +#define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} + +static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) +{ + if (x > c->max_x || !c->started) c->max_x = x; + if (y > c->max_y || !c->started) c->max_y = y; + if (x < c->min_x || !c->started) c->min_x = x; + if (y < c->min_y || !c->started) c->min_y = y; + c->started = 1; +} + +static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) +{ + if (c->bounds) { + stbtt__track_vertex(c, x, y); + if (type == STBTT_vcubic) { + stbtt__track_vertex(c, cx, cy); + stbtt__track_vertex(c, cx1, cy1); + } + } else { + stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); + c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; + c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; + } + c->num_vertices++; +} + +static void stbtt__csctx_close_shape(stbtt__csctx *ctx) +{ + if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) +{ + stbtt__csctx_close_shape(ctx); + ctx->first_x = ctx->x = ctx->x + dx; + ctx->first_y = ctx->y = ctx->y + dy; + stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) +{ + ctx->x += dx; + ctx->y += dy; + stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); +} + +static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) +{ + float cx1 = ctx->x + dx1; + float cy1 = ctx->y + dy1; + float cx2 = cx1 + dx2; + float cy2 = cy1 + dy2; + ctx->x = cx2 + dx3; + ctx->y = cy2 + dy3; + stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); +} + +static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) +{ + int count = stbtt__cff_index_count(&idx); + int bias = 107; + if (count >= 33900) + bias = 32768; + else if (count >= 1240) + bias = 1131; + n += bias; + if (n < 0 || n >= count) + return stbtt__new_buf(NULL, 0); + return stbtt__cff_index_get(idx, n); +} + +static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) +{ + stbtt__buf fdselect = info->fdselect; + int nranges, start, end, v, fmt, fdselector = -1, i; + + stbtt__buf_seek(&fdselect, 0); + fmt = stbtt__buf_get8(&fdselect); + if (fmt == 0) { + // untested + stbtt__buf_skip(&fdselect, glyph_index); + fdselector = stbtt__buf_get8(&fdselect); + } else if (fmt == 3) { + nranges = stbtt__buf_get16(&fdselect); + start = stbtt__buf_get16(&fdselect); + for (i = 0; i < nranges; i++) { + v = stbtt__buf_get8(&fdselect); + end = stbtt__buf_get16(&fdselect); + if (glyph_index >= start && glyph_index < end) { + fdselector = v; + break; + } + start = end; + } + } + if (fdselector == -1) return stbtt__new_buf(NULL, 0); // [DEAR IMGUI] fixed, see #6007 and nothings/stb#1422 + return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); +} + +static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) +{ + int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; + int has_subrs = 0, clear_stack; + float s[48]; + stbtt__buf subr_stack[10], subrs = info->subrs, b; + float f; + +#define STBTT__CSERR(s) (0) + + // this currently ignores the initial width value, which isn't needed if we have hmtx + b = stbtt__cff_index_get(info->charstrings, glyph_index); + while (b.cursor < b.size) { + i = 0; + clear_stack = 1; + b0 = stbtt__buf_get8(&b); + switch (b0) { + // @TODO implement hinting + case 0x13: // hintmask + case 0x14: // cntrmask + if (in_header) + maskbits += (sp / 2); // implicit "vstem" + in_header = 0; + stbtt__buf_skip(&b, (maskbits + 7) / 8); + break; + + case 0x01: // hstem + case 0x03: // vstem + case 0x12: // hstemhm + case 0x17: // vstemhm + maskbits += (sp / 2); + break; + + case 0x15: // rmoveto + in_header = 0; + if (sp < 2) return STBTT__CSERR("rmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); + break; + case 0x04: // vmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("vmoveto stack"); + stbtt__csctx_rmove_to(c, 0, s[sp-1]); + break; + case 0x16: // hmoveto + in_header = 0; + if (sp < 1) return STBTT__CSERR("hmoveto stack"); + stbtt__csctx_rmove_to(c, s[sp-1], 0); + break; + + case 0x05: // rlineto + if (sp < 2) return STBTT__CSERR("rlineto stack"); + for (; i + 1 < sp; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical + // starting from a different place. + + case 0x07: // vlineto + if (sp < 1) return STBTT__CSERR("vlineto stack"); + goto vlineto; + case 0x06: // hlineto + if (sp < 1) return STBTT__CSERR("hlineto stack"); + for (;;) { + if (i >= sp) break; + stbtt__csctx_rline_to(c, s[i], 0); + i++; + vlineto: + if (i >= sp) break; + stbtt__csctx_rline_to(c, 0, s[i]); + i++; + } + break; + + case 0x1F: // hvcurveto + if (sp < 4) return STBTT__CSERR("hvcurveto stack"); + goto hvcurveto; + case 0x1E: // vhcurveto + if (sp < 4) return STBTT__CSERR("vhcurveto stack"); + for (;;) { + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); + i += 4; + hvcurveto: + if (i + 3 >= sp) break; + stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); + i += 4; + } + break; + + case 0x08: // rrcurveto + if (sp < 6) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x18: // rcurveline + if (sp < 8) return STBTT__CSERR("rcurveline stack"); + for (; i + 5 < sp - 2; i += 6) + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); + stbtt__csctx_rline_to(c, s[i], s[i+1]); + break; + + case 0x19: // rlinecurve + if (sp < 8) return STBTT__CSERR("rlinecurve stack"); + for (; i + 1 < sp - 6; i += 2) + stbtt__csctx_rline_to(c, s[i], s[i+1]); + if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); + stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); + break; + + case 0x1A: // vvcurveto + case 0x1B: // hhcurveto + if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); + f = 0.0; + if (sp & 1) { f = s[i]; i++; } + for (; i + 3 < sp; i += 4) { + if (b0 == 0x1B) + stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); + else + stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); + f = 0.0; + } + break; + + case 0x0A: // callsubr + if (!has_subrs) { + if (info->fdselect.size) + subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); + has_subrs = 1; + } + // FALLTHROUGH + case 0x1D: // callgsubr + if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); + v = (int) s[--sp]; + if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); + subr_stack[subr_stack_height++] = b; + b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); + if (b.size == 0) return STBTT__CSERR("subr not found"); + b.cursor = 0; + clear_stack = 0; + break; + + case 0x0B: // return + if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); + b = subr_stack[--subr_stack_height]; + clear_stack = 0; + break; + + case 0x0E: // endchar + stbtt__csctx_close_shape(c); + return 1; + + case 0x0C: { // two-byte escape + float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; + float dx, dy; + int b1 = stbtt__buf_get8(&b); + switch (b1) { + // @TODO These "flex" implementations ignore the flex-depth and resolution, + // and always draw beziers. + case 0x22: // hflex + if (sp < 7) return STBTT__CSERR("hflex stack"); + dx1 = s[0]; + dx2 = s[1]; + dy2 = s[2]; + dx3 = s[3]; + dx4 = s[4]; + dx5 = s[5]; + dx6 = s[6]; + stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); + break; + + case 0x23: // flex + if (sp < 13) return STBTT__CSERR("flex stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = s[10]; + dy6 = s[11]; + //fd is s[12] + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + case 0x24: // hflex1 + if (sp < 9) return STBTT__CSERR("hflex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dx4 = s[5]; + dx5 = s[6]; + dy5 = s[7]; + dx6 = s[8]; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); + stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); + break; + + case 0x25: // flex1 + if (sp < 11) return STBTT__CSERR("flex1 stack"); + dx1 = s[0]; + dy1 = s[1]; + dx2 = s[2]; + dy2 = s[3]; + dx3 = s[4]; + dy3 = s[5]; + dx4 = s[6]; + dy4 = s[7]; + dx5 = s[8]; + dy5 = s[9]; + dx6 = dy6 = s[10]; + dx = dx1+dx2+dx3+dx4+dx5; + dy = dy1+dy2+dy3+dy4+dy5; + if (STBTT_fabs(dx) > STBTT_fabs(dy)) + dy6 = -dy; + else + dx6 = -dx; + stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); + stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); + break; + + default: + return STBTT__CSERR("unimplemented"); + } + } break; + + default: + if (b0 != 255 && b0 != 28 && b0 < 32) + return STBTT__CSERR("reserved operator"); + + // push immediate + if (b0 == 255) { + f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; + } else { + stbtt__buf_skip(&b, -1); + f = (float)(stbtt_int16)stbtt__cff_int(&b); + } + if (sp >= 48) return STBTT__CSERR("push stack overflow"); + s[sp++] = f; + clear_stack = 0; + break; + } + if (clear_stack) sp = 0; + } + return STBTT__CSERR("no endchar"); + +#undef STBTT__CSERR +} + +static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + // runs the charstring twice, once to count and once to output (to avoid realloc) + stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); + stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); + if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { + *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); + output_ctx.pvertices = *pvertices; + if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { + STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); + return output_ctx.num_vertices; + } + } + *pvertices = NULL; + return 0; +} + +static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) +{ + stbtt__csctx c = STBTT__CSCTX_INIT(1); + int r = stbtt__run_charstring(info, glyph_index, &c); + if (x0) *x0 = r ? c.min_x : 0; + if (y0) *y0 = r ? c.min_y : 0; + if (x1) *x1 = r ? c.max_x : 0; + if (y1) *y1 = r ? c.max_y : 0; + return r ? c.num_vertices : 0; +} + +STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) +{ + if (!info->cff.size) + return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); + else + return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); +} + +STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) +{ + stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); + if (glyph_index < numOfLongHorMetrics) { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); + } else { + if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); + if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); + } +} + +STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) +{ + stbtt_uint8 *data = info->data + info->kern; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + return ttUSHORT(data+10); +} + +STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) +{ + stbtt_uint8 *data = info->data + info->kern; + int k, length; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + length = ttUSHORT(data+10); + if (table_length < length) + length = table_length; + + for (k = 0; k < length; k++) + { + table[k].glyph1 = ttUSHORT(data+18+(k*6)); + table[k].glyph2 = ttUSHORT(data+20+(k*6)); + table[k].advance = ttSHORT(data+22+(k*6)); + } + + return length; +} + +static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint8 *data = info->data + info->kern; + stbtt_uint32 needle, straw; + int l, r, m; + + // we only look at the first table. it must be 'horizontal' and format 0. + if (!info->kern) + return 0; + if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 + return 0; + if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format + return 0; + + l = 0; + r = ttUSHORT(data+10) - 1; + needle = glyph1 << 16 | glyph2; + while (l <= r) { + m = (l + r) >> 1; + straw = ttULONG(data+18+(m*6)); // note: unaligned read + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else + return ttSHORT(data+22+(m*6)); + } + return 0; +} + +static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) +{ + stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); + switch (coverageFormat) { + case 1: { + stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); + + // Binary search. + stbtt_int32 l=0, r=glyphCount-1, m; + int straw, needle=glyph; + while (l <= r) { + stbtt_uint8 *glyphArray = coverageTable + 4; + stbtt_uint16 glyphID; + m = (l + r) >> 1; + glyphID = ttUSHORT(glyphArray + 2 * m); + straw = glyphID; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + return m; + } + } + break; + } + + case 2: { + stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); + stbtt_uint8 *rangeArray = coverageTable + 4; + + // Binary search. + stbtt_int32 l=0, r=rangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *rangeRecord; + m = (l + r) >> 1; + rangeRecord = rangeArray + 6 * m; + strawStart = ttUSHORT(rangeRecord); + strawEnd = ttUSHORT(rangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else { + stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); + return startCoverageIndex + glyph - strawStart; + } + } + break; + } + + default: return -1; // unsupported + } + + return -1; +} + +static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) +{ + stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); + switch (classDefFormat) + { + case 1: { + stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); + stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); + stbtt_uint8 *classDef1ValueArray = classDefTable + 6; + + if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) + return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); + break; + } + + case 2: { + stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); + stbtt_uint8 *classRangeRecords = classDefTable + 4; + + // Binary search. + stbtt_int32 l=0, r=classRangeCount-1, m; + int strawStart, strawEnd, needle=glyph; + while (l <= r) { + stbtt_uint8 *classRangeRecord; + m = (l + r) >> 1; + classRangeRecord = classRangeRecords + 6 * m; + strawStart = ttUSHORT(classRangeRecord); + strawEnd = ttUSHORT(classRangeRecord + 2); + if (needle < strawStart) + r = m - 1; + else if (needle > strawEnd) + l = m + 1; + else + return (stbtt_int32)ttUSHORT(classRangeRecord + 4); + } + break; + } + + default: + return -1; // Unsupported definition type, return an error. + } + + // "All glyphs not assigned to a class fall into class 0". (OpenType spec) + return 0; +} + +// Define to STBTT_assert(x) if you want to break on unimplemented formats. +#define STBTT_GPOS_TODO_assert(x) + +static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) +{ + stbtt_uint16 lookupListOffset; + stbtt_uint8 *lookupList; + stbtt_uint16 lookupCount; + stbtt_uint8 *data; + stbtt_int32 i, sti; + + if (!info->gpos) return 0; + + data = info->data + info->gpos; + + if (ttUSHORT(data+0) != 1) return 0; // Major version 1 + if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 + + lookupListOffset = ttUSHORT(data+8); + lookupList = data + lookupListOffset; + lookupCount = ttUSHORT(lookupList); + + for (i=0; i= pairSetCount) return 0; + + needle=glyph2; + r=pairValueCount-1; + l=0; + + // Binary search. + while (l <= r) { + stbtt_uint16 secondGlyph; + stbtt_uint8 *pairValue; + m = (l + r) >> 1; + pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; + secondGlyph = ttUSHORT(pairValue); + straw = secondGlyph; + if (needle < straw) + r = m - 1; + else if (needle > straw) + l = m + 1; + else { + stbtt_int16 xAdvance = ttSHORT(pairValue + 2); + return xAdvance; + } + } + } else + return 0; + break; + } + + case 2: { + stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); + stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); + if (valueFormat1 == 4 && valueFormat2 == 0) { // Support more formats? + stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); + stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); + int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); + int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); + + stbtt_uint16 class1Count = ttUSHORT(table + 12); + stbtt_uint16 class2Count = ttUSHORT(table + 14); + stbtt_uint8 *class1Records, *class2Records; + stbtt_int16 xAdvance; + + if (glyph1class < 0 || glyph1class >= class1Count) return 0; // malformed + if (glyph2class < 0 || glyph2class >= class2Count) return 0; // malformed + + class1Records = table + 16; + class2Records = class1Records + 2 * (glyph1class * class2Count); + xAdvance = ttSHORT(class2Records + 2 * glyph2class); + return xAdvance; + } else + return 0; + break; + } + + default: + return 0; // Unsupported position format + } + } + } + + return 0; +} + +STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) +{ + int xAdvance = 0; + + if (info->gpos) + xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); + else if (info->kern) + xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); + + return xAdvance; +} + +STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) +{ + if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs + return 0; + return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); +} + +STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) +{ + stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); +} + +STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) +{ + if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); + if (descent) *descent = ttSHORT(info->data+info->hhea + 6); + if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); +} + +STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) +{ + int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); + if (!tab) + return 0; + if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); + if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); + if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); + return 1; +} + +STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) +{ + *x0 = ttSHORT(info->data + info->head + 36); + *y0 = ttSHORT(info->data + info->head + 38); + *x1 = ttSHORT(info->data + info->head + 40); + *y1 = ttSHORT(info->data + info->head + 42); +} + +STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) +{ + int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); + return (float) height / fheight; +} + +STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) +{ + int unitsPerEm = ttUSHORT(info->data + info->head + 18); + return pixels / unitsPerEm; +} + +STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) +{ + STBTT_free(v, info->userdata); +} + +STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) +{ + int i; + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); + + int numEntries = ttUSHORT(svg_doc_list); + stbtt_uint8 *svg_docs = svg_doc_list + 2; + + for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) + return svg_doc; + } + return 0; +} + +STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) +{ + stbtt_uint8 *data = info->data; + stbtt_uint8 *svg_doc; + + if (info->svg == 0) + return 0; + + svg_doc = stbtt_FindSVGDoc(info, gl); + if (svg_doc != NULL) { + *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); + return ttULONG(svg_doc + 8); + } else { + return 0; + } +} + +STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) +{ + return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); +} + +////////////////////////////////////////////////////////////////////////////// +// +// antialiasing software rasterizer +// + +STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning + if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { + // e.g. space character + if (ix0) *ix0 = 0; + if (iy0) *iy0 = 0; + if (ix1) *ix1 = 0; + if (iy1) *iy1 = 0; + } else { + // move to integral bboxes (treating pixels as little squares, what pixels get touched)? + if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); + if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); + if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); + if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); + } +} + +STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); +} + +STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) +{ + stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); +} + +////////////////////////////////////////////////////////////////////////////// +// +// Rasterizer + +typedef struct stbtt__hheap_chunk +{ + struct stbtt__hheap_chunk *next; +} stbtt__hheap_chunk; + +typedef struct stbtt__hheap +{ + struct stbtt__hheap_chunk *head; + void *first_free; + int num_remaining_in_head_chunk; +} stbtt__hheap; + +static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) +{ + if (hh->first_free) { + void *p = hh->first_free; + hh->first_free = * (void **) p; + return p; + } else { + if (hh->num_remaining_in_head_chunk == 0) { + int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); + stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); + if (c == NULL) + return NULL; + c->next = hh->head; + hh->head = c; + hh->num_remaining_in_head_chunk = count; + } + --hh->num_remaining_in_head_chunk; + return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; + } +} + +static void stbtt__hheap_free(stbtt__hheap *hh, void *p) +{ + *(void **) p = hh->first_free; + hh->first_free = p; +} + +static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) +{ + stbtt__hheap_chunk *c = hh->head; + while (c) { + stbtt__hheap_chunk *n = c->next; + STBTT_free(c, userdata); + c = n; + } +} + +typedef struct stbtt__edge { + float x0,y0, x1,y1; + int invert; +} stbtt__edge; + + +typedef struct stbtt__active_edge +{ + struct stbtt__active_edge *next; + #if STBTT_RASTERIZER_VERSION==1 + int x,dx; + float ey; + int direction; + #elif STBTT_RASTERIZER_VERSION==2 + float fx,fdx,fdy; + float direction; + float sy; + float ey; + #else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" + #endif +} stbtt__active_edge; + +#if STBTT_RASTERIZER_VERSION == 1 +#define STBTT_FIXSHIFT 10 +#define STBTT_FIX (1 << STBTT_FIXSHIFT) +#define STBTT_FIXMASK (STBTT_FIX-1) + +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + if (!z) return z; + + // round dx down to avoid overshooting + if (dxdy < 0) + z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); + else + z->dx = STBTT_ifloor(STBTT_FIX * dxdy); + + z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount + z->x -= off_x * STBTT_FIX; + + z->ey = e->y1; + z->next = 0; + z->direction = e->invert ? 1 : -1; + return z; +} +#elif STBTT_RASTERIZER_VERSION == 2 +static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) +{ + stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); + float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); + STBTT_assert(z != NULL); + //STBTT_assert(e->y0 <= start_point); + if (!z) return z; + z->fdx = dxdy; + z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; + z->fx = e->x0 + dxdy * (start_point - e->y0); + z->fx -= off_x; + z->direction = e->invert ? 1.0f : -1.0f; + z->sy = e->y0; + z->ey = e->y1; + z->next = 0; + return z; +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#if STBTT_RASTERIZER_VERSION == 1 +// note: this routine clips fills that extend off the edges... ideally this +// wouldn't happen, but it could happen if the truetype glyph bounding boxes +// are wrong, or if the user supplies a too-small bitmap +static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) +{ + // non-zero winding fill + int x0=0, w=0; + + while (e) { + if (w == 0) { + // if we're currently at zero, we need to record the edge start point + x0 = e->x; w += e->direction; + } else { + int x1 = e->x; w += e->direction; + // if we went to zero, we need to draw + if (w == 0) { + int i = x0 >> STBTT_FIXSHIFT; + int j = x1 >> STBTT_FIXSHIFT; + + if (i < len && j >= 0) { + if (i == j) { + // x0,x1 are the same pixel, so compute combined coverage + scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); + } else { + if (i >= 0) // add antialiasing for x0 + scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); + else + i = -1; // clip + + if (j < len) // add antialiasing for x1 + scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); + else + j = len; // clip + + for (++i; i < j; ++i) // fill pixels between x0 and x1 + scanline[i] = scanline[i] + (stbtt_uint8) max_weight; + } + } + } + } + + e = e->next; + } +} + +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0; + int max_weight = (255 / vsubsample); // weight per vertical scanline + int s; // vertical subsample index + unsigned char scanline_data[512], *scanline; + + if (result->w > 512) + scanline = (unsigned char *) STBTT_malloc(result->w, userdata); + else + scanline = scanline_data; + + y = off_y * vsubsample; + e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; + + while (j < result->h) { + STBTT_memset(scanline, 0, result->w); + for (s=0; s < vsubsample; ++s) { + // find center of pixel for this scanline + float scan_y = y + 0.5f; + stbtt__active_edge **step = &active; + + // update all active edges; + // remove all active edges that terminate before the center of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + z->x += z->dx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + } + + // resort the list if needed + for(;;) { + int changed=0; + step = &active; + while (*step && (*step)->next) { + if ((*step)->x > (*step)->next->x) { + stbtt__active_edge *t = *step; + stbtt__active_edge *q = t->next; + + t->next = q->next; + q->next = t; + *step = q; + changed = 1; + } + step = &(*step)->next; + } + if (!changed) break; + } + + // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline + while (e->y0 <= scan_y) { + if (e->y1 > scan_y) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); + if (z != NULL) { + // find insertion point + if (active == NULL) + active = z; + else if (z->x < active->x) { + // insert at front + z->next = active; + active = z; + } else { + // find thing to insert AFTER + stbtt__active_edge *p = active; + while (p->next && p->next->x < z->x) + p = p->next; + // at this point, p->next->x is NOT < z->x + z->next = p->next; + p->next = z; + } + } + } + ++e; + } + + // now process all active edges in XOR fashion + if (active) + stbtt__fill_active_edges(scanline, result->w, active, max_weight); + + ++y; + } + STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} + +#elif STBTT_RASTERIZER_VERSION == 2 + +// the edge passed in here does not cross the vertical line at x or the vertical line at x+1 +// (i.e. it has already been clipped to those) +static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) +{ + if (y0 == y1) return; + STBTT_assert(y0 < y1); + STBTT_assert(e->sy <= e->ey); + if (y0 > e->ey) return; + if (y1 < e->sy) return; + if (y0 < e->sy) { + x0 += (x1-x0) * (e->sy - y0) / (y1-y0); + y0 = e->sy; + } + if (y1 > e->ey) { + x1 += (x1-x0) * (e->ey - y1) / (y1-y0); + y1 = e->ey; + } + + if (x0 == x) + STBTT_assert(x1 <= x+1); + else if (x0 == x+1) + STBTT_assert(x1 >= x); + else if (x0 <= x) + STBTT_assert(x1 <= x); + else if (x0 >= x+1) + STBTT_assert(x1 >= x+1); + else + STBTT_assert(x1 >= x && x1 <= x+1); + + if (x0 <= x && x1 <= x) + scanline[x] += e->direction * (y1-y0); + else if (x0 >= x+1 && x1 >= x+1) + ; + else { + STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); + scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position + } +} + +static float stbtt__sized_trapezoid_area(float height, float top_width, float bottom_width) +{ + STBTT_assert(top_width >= 0); + STBTT_assert(bottom_width >= 0); + return (top_width + bottom_width) / 2.0f * height; +} + +static float stbtt__position_trapezoid_area(float height, float tx0, float tx1, float bx0, float bx1) +{ + return stbtt__sized_trapezoid_area(height, tx1 - tx0, bx1 - bx0); +} + +static float stbtt__sized_triangle_area(float height, float width) +{ + return height * width / 2; +} + +static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) +{ + float y_bottom = y_top+1; + + while (e) { + // brute force every pixel + + // compute intersection points with top & bottom + STBTT_assert(e->ey >= y_top); + + if (e->fdx == 0) { + float x0 = e->fx; + if (x0 < len) { + if (x0 >= 0) { + stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); + stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); + } else { + stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); + } + } + } else { + float x0 = e->fx; + float dx = e->fdx; + float xb = x0 + dx; + float x_top, x_bottom; + float sy0,sy1; + float dy = e->fdy; + STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); + + // compute endpoints of line segment clipped to this scanline (if the + // line segment starts on this scanline. x0 is the intersection of the + // line with y_top, but that may be off the line segment. + if (e->sy > y_top) { + x_top = x0 + dx * (e->sy - y_top); + sy0 = e->sy; + } else { + x_top = x0; + sy0 = y_top; + } + if (e->ey < y_bottom) { + x_bottom = x0 + dx * (e->ey - y_top); + sy1 = e->ey; + } else { + x_bottom = xb; + sy1 = y_bottom; + } + + if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { + // from here on, we don't have to range check x values + + if ((int) x_top == (int) x_bottom) { + float height; + // simple case, only spans one pixel + int x = (int) x_top; + height = (sy1 - sy0) * e->direction; + STBTT_assert(x >= 0 && x < len); + scanline[x] += stbtt__position_trapezoid_area(height, x_top, x+1.0f, x_bottom, x+1.0f); + scanline_fill[x] += height; // everything right of this pixel is filled + } else { + int x,x1,x2; + float y_crossing, y_final, step, sign, area; + // covers 2+ pixels + if (x_top > x_bottom) { + // flip scanline vertically; signed area is the same + float t; + sy0 = y_bottom - (sy0 - y_top); + sy1 = y_bottom - (sy1 - y_top); + t = sy0, sy0 = sy1, sy1 = t; + t = x_bottom, x_bottom = x_top, x_top = t; + dx = -dx; + dy = -dy; + t = x0, x0 = xb, xb = t; + } + STBTT_assert(dy >= 0); + STBTT_assert(dx >= 0); + + x1 = (int) x_top; + x2 = (int) x_bottom; + // compute intersection with y axis at x1+1 + y_crossing = y_top + dy * (x1+1 - x0); + + // compute intersection with y axis at x2 + y_final = y_top + dy * (x2 - x0); + + // x1 x_top x2 x_bottom + // y_top +------|-----+------------+------------+--------|---+------------+ + // | | | | | | + // | | | | | | + // sy0 | Txxxxx|............|............|............|............| + // y_crossing | *xxxxx.......|............|............|............| + // | | xxxxx..|............|............|............| + // | | /- xx*xxxx........|............|............| + // | | dy < | xxxxxx..|............|............| + // y_final | | \- | xx*xxx.........|............| + // sy1 | | | | xxxxxB...|............| + // | | | | | | + // | | | | | | + // y_bottom +------------+------------+------------+------------+------------+ + // + // goal is to measure the area covered by '.' in each pixel + + // if x2 is right at the right edge of x1, y_crossing can blow up, github #1057 + // @TODO: maybe test against sy1 rather than y_bottom? + if (y_crossing > y_bottom) + y_crossing = y_bottom; + + sign = e->direction; + + // area of the rectangle covered from sy0..y_crossing + area = sign * (y_crossing-sy0); + + // area of the triangle (x_top,sy0), (x1+1,sy0), (x1+1,y_crossing) + scanline[x1] += stbtt__sized_triangle_area(area, x1+1 - x_top); + + // check if final y_crossing is blown up; no test case for this + if (y_final > y_bottom) { + int denom = (x2 - (x1+1)); + y_final = y_bottom; + if (denom != 0) { // [DEAR IMGUI] Avoid div by zero (https://github.com/nothings/stb/issues/1316) + dy = (y_final - y_crossing ) / denom; // if denom=0, y_final = y_crossing, so y_final <= y_bottom + } + } + + // in second pixel, area covered by line segment found in first pixel + // is always a rectangle 1 wide * the height of that line segment; this + // is exactly what the variable 'area' stores. it also gets a contribution + // from the line segment within it. the THIRD pixel will get the first + // pixel's rectangle contribution, the second pixel's rectangle contribution, + // and its own contribution. the 'own contribution' is the same in every pixel except + // the leftmost and rightmost, a trapezoid that slides down in each pixel. + // the second pixel's contribution to the third pixel will be the + // rectangle 1 wide times the height change in the second pixel, which is dy. + + step = sign * dy * 1; // dy is dy/dx, change in y for every 1 change in x, + // which multiplied by 1-pixel-width is how much pixel area changes for each step in x + // so the area advances by 'step' every time + + for (x = x1+1; x < x2; ++x) { + scanline[x] += area + step/2; // area of trapezoid is 1*step/2 + area += step; + } + STBTT_assert(STBTT_fabs(area) <= 1.01f); // accumulated error from area += step unless we round step down + STBTT_assert(sy1 > y_final-0.01f); + + // area covered in the last pixel is the rectangle from all the pixels to the left, + // plus the trapezoid filled by the line segment in this pixel all the way to the right edge + scanline[x2] += area + sign * stbtt__position_trapezoid_area(sy1-y_final, (float) x2, x2+1.0f, x_bottom, x2+1.0f); + + // the rest of the line is filled based on the total height of the line segment in this pixel + scanline_fill[x2] += sign * (sy1-sy0); + } + } else { + // if edge goes outside of box we're drawing, we require + // clipping logic. since this does not match the intended use + // of this library, we use a different, very slow brute + // force implementation + // note though that this does happen some of the time because + // x_top and x_bottom can be extrapolated at the top & bottom of + // the shape and actually lie outside the bounding box + int x; + for (x=0; x < len; ++x) { + // cases: + // + // there can be up to two intersections with the pixel. any intersection + // with left or right edges can be handled by splitting into two (or three) + // regions. intersections with top & bottom do not necessitate case-wise logic. + // + // the old way of doing this found the intersections with the left & right edges, + // then used some simple logic to produce up to three segments in sorted order + // from top-to-bottom. however, this had a problem: if an x edge was epsilon + // across the x border, then the corresponding y position might not be distinct + // from the other y segment, and it might ignored as an empty segment. to avoid + // that, we need to explicitly produce segments based on x positions. + + // rename variables to clearly-defined pairs + float y0 = y_top; + float x1 = (float) (x); + float x2 = (float) (x+1); + float x3 = xb; + float y3 = y_bottom; + + // x = e->x + e->dx * (y-y_top) + // (y-y_top) = (x - e->x) / e->dx + // y = (x - e->x) / e->dx + y_top + float y1 = (x - x0) / dx + y_top; + float y2 = (x+1 - x0) / dx + y_top; + + if (x0 < x1 && x3 > x2) { // three segments descending down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x1 && x0 > x2) { // three segments descending down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); + stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); + } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); + stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); + } else { // one segment + stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); + } + } + } + } + e = e->next; + } +} + +// directly AA rasterize edges w/o supersampling +static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) +{ + stbtt__hheap hh = { 0, 0, 0 }; + stbtt__active_edge *active = NULL; + int y,j=0, i; + float scanline_data[129], *scanline, *scanline2; + + STBTT__NOTUSED(vsubsample); + + if (result->w > 64) + scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); + else + scanline = scanline_data; + + scanline2 = scanline + result->w; + + y = off_y; + e[n].y0 = (float) (off_y + result->h) + 1; + + while (j < result->h) { + // find center of pixel for this scanline + float scan_y_top = y + 0.0f; + float scan_y_bottom = y + 1.0f; + stbtt__active_edge **step = &active; + + STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); + STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); + + // update all active edges; + // remove all active edges that terminate before the top of this scanline + while (*step) { + stbtt__active_edge * z = *step; + if (z->ey <= scan_y_top) { + *step = z->next; // delete from list + STBTT_assert(z->direction); + z->direction = 0; + stbtt__hheap_free(&hh, z); + } else { + step = &((*step)->next); // advance through list + } + } + + // insert all edges that start before the bottom of this scanline + while (e->y0 <= scan_y_bottom) { + if (e->y0 != e->y1) { + stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); + if (z != NULL) { + if (j == 0 && off_y != 0) { + if (z->ey < scan_y_top) { + // this can happen due to subpixel positioning and some kind of fp rounding error i think + z->ey = scan_y_top; + } + } + STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds + // insert at front + z->next = active; + active = z; + } + } + ++e; + } + + // now process all active edges + if (active) + stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); + + { + float sum = 0; + for (i=0; i < result->w; ++i) { + float k; + int m; + sum += scanline2[i]; + k = scanline[i] + sum; + k = (float) STBTT_fabs(k)*255 + 0.5f; + m = (int) k; + if (m > 255) m = 255; + result->pixels[j*result->stride + i] = (unsigned char) m; + } + } + // advance all the edges + step = &active; + while (*step) { + stbtt__active_edge *z = *step; + z->fx += z->fdx; // advance to position for current scanline + step = &((*step)->next); // advance through list + } + + ++y; + ++j; + } + + stbtt__hheap_cleanup(&hh, userdata); + + if (scanline != scanline_data) + STBTT_free(scanline, userdata); +} +#else +#error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + +#define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) + +static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) +{ + int i,j; + for (i=1; i < n; ++i) { + stbtt__edge t = p[i], *a = &t; + j = i; + while (j > 0) { + stbtt__edge *b = &p[j-1]; + int c = STBTT__COMPARE(a,b); + if (!c) break; + p[j] = p[j-1]; + --j; + } + if (i != j) + p[j] = t; + } +} + +static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) +{ + /* threshold for transitioning to insertion sort */ + while (n > 12) { + stbtt__edge t; + int c01,c12,c,m,i,j; + + /* compute median of three */ + m = n >> 1; + c01 = STBTT__COMPARE(&p[0],&p[m]); + c12 = STBTT__COMPARE(&p[m],&p[n-1]); + /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ + if (c01 != c12) { + /* otherwise, we'll need to swap something else to middle */ + int z; + c = STBTT__COMPARE(&p[0],&p[n-1]); + /* 0>mid && midn => n; 0 0 */ + /* 0n: 0>n => 0; 0 n */ + z = (c == c12) ? 0 : n-1; + t = p[z]; + p[z] = p[m]; + p[m] = t; + } + /* now p[m] is the median-of-three */ + /* swap it to the beginning so it won't move around */ + t = p[0]; + p[0] = p[m]; + p[m] = t; + + /* partition loop */ + i=1; + j=n-1; + for(;;) { + /* handling of equality is crucial here */ + /* for sentinels & efficiency with duplicates */ + for (;;++i) { + if (!STBTT__COMPARE(&p[i], &p[0])) break; + } + for (;;--j) { + if (!STBTT__COMPARE(&p[0], &p[j])) break; + } + /* make sure we haven't crossed */ + if (i >= j) break; + t = p[i]; + p[i] = p[j]; + p[j] = t; + + ++i; + --j; + } + /* recurse on smaller side, iterate on larger */ + if (j < (n-i)) { + stbtt__sort_edges_quicksort(p,j); + p = p+i; + n = n-i; + } else { + stbtt__sort_edges_quicksort(p+i, n-i); + n = j; + } + } +} + +static void stbtt__sort_edges(stbtt__edge *p, int n) +{ + stbtt__sort_edges_quicksort(p, n); + stbtt__sort_edges_ins_sort(p, n); +} + +typedef struct +{ + float x,y; +} stbtt__point; + +static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) +{ + float y_scale_inv = invert ? -scale_y : scale_y; + stbtt__edge *e; + int n,i,j,k,m; +#if STBTT_RASTERIZER_VERSION == 1 + int vsubsample = result->h < 8 ? 15 : 5; +#elif STBTT_RASTERIZER_VERSION == 2 + int vsubsample = 1; +#else + #error "Unrecognized value of STBTT_RASTERIZER_VERSION" +#endif + // vsubsample should divide 255 evenly; otherwise we won't reach full opacity + + // now we have to blow out the windings into explicit edge lists + n = 0; + for (i=0; i < windings; ++i) + n += wcount[i]; + + e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel + if (e == 0) return; + n = 0; + + m=0; + for (i=0; i < windings; ++i) { + stbtt__point *p = pts + m; + m += wcount[i]; + j = wcount[i]-1; + for (k=0; k < wcount[i]; j=k++) { + int a=k,b=j; + // skip the edge if horizontal + if (p[j].y == p[k].y) + continue; + // add edge from j to k to the list + e[n].invert = 0; + if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { + e[n].invert = 1; + a=j,b=k; + } + e[n].x0 = p[a].x * scale_x + shift_x; + e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; + e[n].x1 = p[b].x * scale_x + shift_x; + e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; + ++n; + } + } + + // now sort the edges by their highest point (should snap to integer, and then by x) + //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); + stbtt__sort_edges(e, n); + + // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule + stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); + + STBTT_free(e, userdata); +} + +static void stbtt__add_point(stbtt__point *points, int n, float x, float y) +{ + if (!points) return; // during first pass, it's unallocated + points[n].x = x; + points[n].y = y; +} + +// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching +static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) +{ + // midpoint + float mx = (x0 + 2*x1 + x2)/4; + float my = (y0 + 2*y1 + y2)/4; + // versus directly drawn line + float dx = (x0+x2)/2 - mx; + float dy = (y0+y2)/2 - my; + if (n > 16) // 65536 segments on one curve better be enough! + return 1; + if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA + stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x2,y2); + *num_points = *num_points+1; + } + return 1; +} + +static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) +{ + // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough + float dx0 = x1-x0; + float dy0 = y1-y0; + float dx1 = x2-x1; + float dy1 = y2-y1; + float dx2 = x3-x2; + float dy2 = y3-y2; + float dx = x3-x0; + float dy = y3-y0; + float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); + float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); + float flatness_squared = longlen*longlen-shortlen*shortlen; + + if (n > 16) // 65536 segments on one curve better be enough! + return; + + if (flatness_squared > objspace_flatness_squared) { + float x01 = (x0+x1)/2; + float y01 = (y0+y1)/2; + float x12 = (x1+x2)/2; + float y12 = (y1+y2)/2; + float x23 = (x2+x3)/2; + float y23 = (y2+y3)/2; + + float xa = (x01+x12)/2; + float ya = (y01+y12)/2; + float xb = (x12+x23)/2; + float yb = (y12+y23)/2; + + float mx = (xa+xb)/2; + float my = (ya+yb)/2; + + stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); + stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); + } else { + stbtt__add_point(points, *num_points,x3,y3); + *num_points = *num_points+1; + } +} + +// returns number of contours +static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) +{ + stbtt__point *points=0; + int num_points=0; + + float objspace_flatness_squared = objspace_flatness * objspace_flatness; + int i,n=0,start=0, pass; + + // count how many "moves" there are to get the contour count + for (i=0; i < num_verts; ++i) + if (vertices[i].type == STBTT_vmove) + ++n; + + *num_contours = n; + if (n == 0) return 0; + + *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); + + if (*contour_lengths == 0) { + *num_contours = 0; + return 0; + } + + // make two passes through the points so we don't need to realloc + for (pass=0; pass < 2; ++pass) { + float x=0,y=0; + if (pass == 1) { + points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); + if (points == NULL) goto error; + } + num_points = 0; + n= -1; + for (i=0; i < num_verts; ++i) { + switch (vertices[i].type) { + case STBTT_vmove: + // start the next contour + if (n >= 0) + (*contour_lengths)[n] = num_points - start; + ++n; + start = num_points; + + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x,y); + break; + case STBTT_vline: + x = vertices[i].x, y = vertices[i].y; + stbtt__add_point(points, num_points++, x, y); + break; + case STBTT_vcurve: + stbtt__tesselate_curve(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + case STBTT_vcubic: + stbtt__tesselate_cubic(points, &num_points, x,y, + vertices[i].cx, vertices[i].cy, + vertices[i].cx1, vertices[i].cy1, + vertices[i].x, vertices[i].y, + objspace_flatness_squared, 0); + x = vertices[i].x, y = vertices[i].y; + break; + } + } + (*contour_lengths)[n] = num_points - start; + } + + return points; +error: + STBTT_free(points, userdata); + STBTT_free(*contour_lengths, userdata); + *contour_lengths = 0; + *num_contours = 0; + return NULL; +} + +STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) +{ + float scale = scale_x > scale_y ? scale_y : scale_x; + int winding_count = 0; + int *winding_lengths = NULL; + stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); + if (windings) { + stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); + STBTT_free(winding_lengths, userdata); + STBTT_free(windings, userdata); + } +} + +STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + int ix0,iy0,ix1,iy1; + stbtt__bitmap gbm; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + + if (scale_x == 0) scale_x = scale_y; + if (scale_y == 0) { + if (scale_x == 0) { + STBTT_free(vertices, info->userdata); + return NULL; + } + scale_y = scale_x; + } + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); + + // now we get the size + gbm.w = (ix1 - ix0); + gbm.h = (iy1 - iy0); + gbm.pixels = NULL; // in case we error + + if (width ) *width = gbm.w; + if (height) *height = gbm.h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + if (gbm.w && gbm.h) { + gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); + if (gbm.pixels) { + gbm.stride = gbm.w; + + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); + } + } + STBTT_free(vertices, info->userdata); + return gbm.pixels; +} + +STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) +{ + int ix0,iy0; + stbtt_vertex *vertices; + int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); + stbtt__bitmap gbm; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); + gbm.pixels = output; + gbm.w = out_w; + gbm.h = out_h; + gbm.stride = out_stride; + + if (gbm.w && gbm.h) + stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); + + STBTT_free(vertices, info->userdata); +} + +STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) +{ + stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); +} + +STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); +} + +STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) +{ + stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); +} + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-CRAPPY packing to keep source code small + +static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) + float pixel_height, // height of font in pixels + unsigned char *pixels, int pw, int ph, // bitmap to be filled in + int first_char, int num_chars, // characters to bake + stbtt_bakedchar *chardata) +{ + float scale; + int x,y,bottom_y, i; + stbtt_fontinfo f; + f.userdata = NULL; + if (!stbtt_InitFont(&f, data, offset)) + return -1; + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + x=y=1; + bottom_y = 1; + + scale = stbtt_ScaleForPixelHeight(&f, pixel_height); + + for (i=0; i < num_chars; ++i) { + int advance, lsb, x0,y0,x1,y1,gw,gh; + int g = stbtt_FindGlyphIndex(&f, first_char + i); + stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); + stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); + gw = x1-x0; + gh = y1-y0; + if (x + gw + 1 >= pw) + y = bottom_y, x = 1; // advance to next row + if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row + return -i; + STBTT_assert(x+gw < pw); + STBTT_assert(y+gh < ph); + stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); + chardata[i].x0 = (stbtt_int16) x; + chardata[i].y0 = (stbtt_int16) y; + chardata[i].x1 = (stbtt_int16) (x + gw); + chardata[i].y1 = (stbtt_int16) (y + gh); + chardata[i].xadvance = scale * advance; + chardata[i].xoff = (float) x0; + chardata[i].yoff = (float) y0; + x = x + gw + 1; + if (y+gh+1 > bottom_y) + bottom_y = y+gh+1; + } + return bottom_y; +} + +STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) +{ + float d3d_bias = opengl_fillrule ? 0 : -0.5f; + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_bakedchar *b = chardata + char_index; + int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); + int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); + + q->x0 = round_x + d3d_bias; + q->y0 = round_y + d3d_bias; + q->x1 = round_x + b->x1 - b->x0 + d3d_bias; + q->y1 = round_y + b->y1 - b->y0 + d3d_bias; + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// rectangle packing replacement routines if you don't have stb_rect_pack.h +// + +#ifndef STB_RECT_PACK_VERSION + +typedef int stbrp_coord; + +//////////////////////////////////////////////////////////////////////////////////// +// // +// // +// COMPILER WARNING ?!?!? // +// // +// // +// if you get a compile warning due to these symbols being defined more than // +// once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // +// // +//////////////////////////////////////////////////////////////////////////////////// + +typedef struct +{ + int width,height; + int x,y,bottom_y; +} stbrp_context; + +typedef struct +{ + unsigned char x; +} stbrp_node; + +struct stbrp_rect +{ + stbrp_coord x,y; + int id,w,h,was_packed; +}; + +static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) +{ + con->width = pw; + con->height = ph; + con->x = 0; + con->y = 0; + con->bottom_y = 0; + STBTT__NOTUSED(nodes); + STBTT__NOTUSED(num_nodes); +} + +static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) +{ + int i; + for (i=0; i < num_rects; ++i) { + if (con->x + rects[i].w > con->width) { + con->x = 0; + con->y = con->bottom_y; + } + if (con->y + rects[i].h > con->height) + break; + rects[i].x = con->x; + rects[i].y = con->y; + rects[i].was_packed = 1; + con->x += rects[i].w; + if (con->y + rects[i].h > con->bottom_y) + con->bottom_y = con->y + rects[i].h; + } + for ( ; i < num_rects; ++i) + rects[i].was_packed = 0; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// bitmap baking +// +// This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If +// stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. + +STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) +{ + stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); + int num_nodes = pw - padding; + stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); + + if (context == NULL || nodes == NULL) { + if (context != NULL) STBTT_free(context, alloc_context); + if (nodes != NULL) STBTT_free(nodes , alloc_context); + return 0; + } + + spc->user_allocator_context = alloc_context; + spc->width = pw; + spc->height = ph; + spc->pixels = pixels; + spc->pack_info = context; + spc->nodes = nodes; + spc->padding = padding; + spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; + spc->h_oversample = 1; + spc->v_oversample = 1; + spc->skip_missing = 0; + + stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); + + if (pixels) + STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels + + return 1; +} + +STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) +{ + STBTT_free(spc->nodes , spc->user_allocator_context); + STBTT_free(spc->pack_info, spc->user_allocator_context); +} + +STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) +{ + STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); + STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); + if (h_oversample <= STBTT_MAX_OVERSAMPLE) + spc->h_oversample = h_oversample; + if (v_oversample <= STBTT_MAX_OVERSAMPLE) + spc->v_oversample = v_oversample; +} + +STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) +{ + spc->skip_missing = skip; +} + +#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) + +static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_w = w - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < h; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_w; ++i) { + total += pixels[i] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; + pixels[i] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < w; ++i) { + STBTT_assert(pixels[i] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i] = (unsigned char) (total / kernel_width); + } + + pixels += stride_in_bytes; + } +} + +static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) +{ + unsigned char buffer[STBTT_MAX_OVERSAMPLE]; + int safe_h = h - kernel_width; + int j; + STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze + for (j=0; j < w; ++j) { + int i; + unsigned int total; + STBTT_memset(buffer, 0, kernel_width); + + total = 0; + + // make kernel_width a constant in common cases so compiler can optimize out the divide + switch (kernel_width) { + case 2: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 2); + } + break; + case 3: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 3); + } + break; + case 4: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 4); + } + break; + case 5: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / 5); + } + break; + default: + for (i=0; i <= safe_h; ++i) { + total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; + buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + break; + } + + for (; i < h; ++i) { + STBTT_assert(pixels[i*stride_in_bytes] == 0); + total -= buffer[i & STBTT__OVER_MASK]; + pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); + } + + pixels += 1; + } +} + +static float stbtt__oversample_shift(int oversample) +{ + if (!oversample) + return 0.0f; + + // The prefilter is a box filter of width "oversample", + // which shifts phase by (oversample - 1)/2 pixels in + // oversampled space. We want to shift in the opposite + // direction to counter this. + return (float)-(oversample - 1) / (2.0f * (float)oversample); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k; + int missing_glyph_added = 0; + + k=0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + ranges[i].h_oversample = (unsigned char) spc->h_oversample; + ranges[i].v_oversample = (unsigned char) spc->v_oversample; + for (j=0; j < ranges[i].num_chars; ++j) { + int x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { + rects[k].w = rects[k].h = 0; + } else { + stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + &x0,&y0,&x1,&y1); + rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); + rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); + if (glyph == 0) + missing_glyph_added = 1; + } + ++k; + } + } + + return k; +} + +STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) +{ + stbtt_MakeGlyphBitmapSubpixel(info, + output, + out_w - (prefilter_x - 1), + out_h - (prefilter_y - 1), + out_stride, + scale_x, + scale_y, + shift_x, + shift_y, + glyph); + + if (prefilter_x > 1) + stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); + + if (prefilter_y > 1) + stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); + + *sub_x = stbtt__oversample_shift(prefilter_x); + *sub_y = stbtt__oversample_shift(prefilter_y); +} + +// rects array must be big enough to accommodate all characters in the given ranges +STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) +{ + int i,j,k, missing_glyph = -1, return_value = 1; + + // save current values + int old_h_over = spc->h_oversample; + int old_v_over = spc->v_oversample; + + k = 0; + for (i=0; i < num_ranges; ++i) { + float fh = ranges[i].font_size; + float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); + float recip_h,recip_v,sub_x,sub_y; + spc->h_oversample = ranges[i].h_oversample; + spc->v_oversample = ranges[i].v_oversample; + recip_h = 1.0f / spc->h_oversample; + recip_v = 1.0f / spc->v_oversample; + sub_x = stbtt__oversample_shift(spc->h_oversample); + sub_y = stbtt__oversample_shift(spc->v_oversample); + for (j=0; j < ranges[i].num_chars; ++j) { + stbrp_rect *r = &rects[k]; + if (r->was_packed && r->w != 0 && r->h != 0) { + stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; + int advance, lsb, x0,y0,x1,y1; + int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; + int glyph = stbtt_FindGlyphIndex(info, codepoint); + stbrp_coord pad = (stbrp_coord) spc->padding; + + // pad on left and top + r->x += pad; + r->y += pad; + r->w -= pad; + r->h -= pad; + stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); + stbtt_GetGlyphBitmapBox(info, glyph, + scale * spc->h_oversample, + scale * spc->v_oversample, + &x0,&y0,&x1,&y1); + stbtt_MakeGlyphBitmapSubpixel(info, + spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w - spc->h_oversample+1, + r->h - spc->v_oversample+1, + spc->stride_in_bytes, + scale * spc->h_oversample, + scale * spc->v_oversample, + 0,0, + glyph); + + if (spc->h_oversample > 1) + stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->h_oversample); + + if (spc->v_oversample > 1) + stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, + r->w, r->h, spc->stride_in_bytes, + spc->v_oversample); + + bc->x0 = (stbtt_int16) r->x; + bc->y0 = (stbtt_int16) r->y; + bc->x1 = (stbtt_int16) (r->x + r->w); + bc->y1 = (stbtt_int16) (r->y + r->h); + bc->xadvance = scale * advance; + bc->xoff = (float) x0 * recip_h + sub_x; + bc->yoff = (float) y0 * recip_v + sub_y; + bc->xoff2 = (x0 + r->w) * recip_h + sub_x; + bc->yoff2 = (y0 + r->h) * recip_v + sub_y; + + if (glyph == 0) + missing_glyph = j; + } else if (spc->skip_missing) { + return_value = 0; + } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { + ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; + } else { + return_value = 0; // if any fail, report failure + } + + ++k; + } + } + + // restore original values + spc->h_oversample = old_h_over; + spc->v_oversample = old_v_over; + + return return_value; +} + +STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) +{ + stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); +} + +STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) +{ + stbtt_fontinfo info; + int i, j, n, return_value; // [DEAR IMGUI] removed = 1; + //stbrp_context *context = (stbrp_context *) spc->pack_info; + stbrp_rect *rects; + + // flag all characters as NOT packed + for (i=0; i < num_ranges; ++i) + for (j=0; j < ranges[i].num_chars; ++j) + ranges[i].chardata_for_range[j].x0 = + ranges[i].chardata_for_range[j].y0 = + ranges[i].chardata_for_range[j].x1 = + ranges[i].chardata_for_range[j].y1 = 0; + + n = 0; + for (i=0; i < num_ranges; ++i) + n += ranges[i].num_chars; + + rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); + if (rects == NULL) + return 0; + + info.userdata = spc->user_allocator_context; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); + + n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); + + stbtt_PackFontRangesPackRects(spc, rects, n); + + return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); + + STBTT_free(rects, spc->user_allocator_context); + return return_value; +} + +STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, + int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) +{ + stbtt_pack_range range; + range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; + range.array_of_unicode_codepoints = NULL; + range.num_chars = num_chars_in_range; + range.chardata_for_range = chardata_for_range; + range.font_size = font_size; + return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); +} + +STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) +{ + int i_ascent, i_descent, i_lineGap; + float scale; + stbtt_fontinfo info; + stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); + scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); + stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); + *ascent = (float) i_ascent * scale; + *descent = (float) i_descent * scale; + *lineGap = (float) i_lineGap * scale; +} + +STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) +{ + float ipw = 1.0f / pw, iph = 1.0f / ph; + const stbtt_packedchar *b = chardata + char_index; + + if (align_to_integer) { + float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); + float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); + q->x0 = x; + q->y0 = y; + q->x1 = x + b->xoff2 - b->xoff; + q->y1 = y + b->yoff2 - b->yoff; + } else { + q->x0 = *xpos + b->xoff; + q->y0 = *ypos + b->yoff; + q->x1 = *xpos + b->xoff2; + q->y1 = *ypos + b->yoff2; + } + + q->s0 = b->x0 * ipw; + q->t0 = b->y0 * iph; + q->s1 = b->x1 * ipw; + q->t1 = b->y1 * iph; + + *xpos += b->xadvance; +} + +////////////////////////////////////////////////////////////////////////////// +// +// sdf computation +// + +#define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) +#define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) + +static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) +{ + float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; + float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; + float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; + float roperp = orig[1]*ray[0] - orig[0]*ray[1]; + + float a = q0perp - 2*q1perp + q2perp; + float b = q1perp - q0perp; + float c = q0perp - roperp; + + float s0 = 0., s1 = 0.; + int num_s = 0; + + if (a != 0.0) { + float discr = b*b - a*c; + if (discr > 0.0) { + float rcpna = -1 / a; + float d = (float) STBTT_sqrt(discr); + s0 = (b+d) * rcpna; + s1 = (b-d) * rcpna; + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { + if (num_s == 0) s0 = s1; + ++num_s; + } + } + } else { + // 2*b*s + c = 0 + // s = -c / (2*b) + s0 = c / (-2 * b); + if (s0 >= 0.0 && s0 <= 1.0) + num_s = 1; + } + + if (num_s == 0) + return 0; + else { + float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); + float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; + + float q0d = q0[0]*rayn_x + q0[1]*rayn_y; + float q1d = q1[0]*rayn_x + q1[1]*rayn_y; + float q2d = q2[0]*rayn_x + q2[1]*rayn_y; + float rod = orig[0]*rayn_x + orig[1]*rayn_y; + + float q10d = q1d - q0d; + float q20d = q2d - q0d; + float q0rd = q0d - rod; + + hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; + hits[0][1] = a*s0+b; + + if (num_s > 1) { + hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; + hits[1][1] = a*s1+b; + return 2; + } else { + return 1; + } + } +} + +static int equal(float *a, float *b) +{ + return (a[0] == b[0] && a[1] == b[1]); +} + +static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) +{ + int i; + float orig[2], ray[2] = { 1, 0 }; + float y_frac; + int winding = 0; + + // make sure y never passes through a vertex of the shape + y_frac = (float) STBTT_fmod(y, 1.0f); + if (y_frac < 0.01f) + y += 0.01f; + else if (y_frac > 0.99f) + y -= 0.01f; + + orig[0] = x; + orig[1] = y; + + // test a ray from (-infinity,y) to (x,y) + for (i=0; i < nverts; ++i) { + if (verts[i].type == STBTT_vline) { + int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; + int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } + if (verts[i].type == STBTT_vcurve) { + int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; + int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; + int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; + int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); + int by = STBTT_max(y0,STBTT_max(y1,y2)); + if (y > ay && y < by && x > ax) { + float q0[2],q1[2],q2[2]; + float hits[2][2]; + q0[0] = (float)x0; + q0[1] = (float)y0; + q1[0] = (float)x1; + q1[1] = (float)y1; + q2[0] = (float)x2; + q2[1] = (float)y2; + if (equal(q0,q1) || equal(q1,q2)) { + x0 = (int)verts[i-1].x; + y0 = (int)verts[i-1].y; + x1 = (int)verts[i ].x; + y1 = (int)verts[i ].y; + if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { + float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; + if (x_inter < x) + winding += (y0 < y1) ? 1 : -1; + } + } else { + int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); + if (num_hits >= 1) + if (hits[0][0] < 0) + winding += (hits[0][1] < 0 ? -1 : 1); + if (num_hits >= 2) + if (hits[1][0] < 0) + winding += (hits[1][1] < 0 ? -1 : 1); + } + } + } + } + return winding; +} + +static float stbtt__cuberoot( float x ) +{ + if (x<0) + return -(float) STBTT_pow(-x,1.0f/3.0f); + else + return (float) STBTT_pow( x,1.0f/3.0f); +} + +// x^3 + a*x^2 + b*x + c = 0 +static int stbtt__solve_cubic(float a, float b, float c, float* r) +{ + float s = -a / 3; + float p = b - a*a / 3; + float q = a * (2*a*a - 9*b) / 27 + c; + float p3 = p*p*p; + float d = q*q + 4*p3 / 27; + if (d >= 0) { + float z = (float) STBTT_sqrt(d); + float u = (-q + z) / 2; + float v = (-q - z) / 2; + u = stbtt__cuberoot(u); + v = stbtt__cuberoot(v); + r[0] = s + u + v; + return 1; + } else { + float u = (float) STBTT_sqrt(-p/3); + float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative + float m = (float) STBTT_cos(v); + float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; + r[0] = s + u * 2 * m; + r[1] = s - u * (m + n); + r[2] = s - u * (m - n); + + //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? + //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); + //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); + return 3; + } +} + +STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + float scale_x = scale, scale_y = scale; + int ix0,iy0,ix1,iy1; + int w,h; + unsigned char *data; + + if (scale == 0) return NULL; + + stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); + + // if empty, return NULL + if (ix0 == ix1 || iy0 == iy1) + return NULL; + + ix0 -= padding; + iy0 -= padding; + ix1 += padding; + iy1 += padding; + + w = (ix1 - ix0); + h = (iy1 - iy0); + + if (width ) *width = w; + if (height) *height = h; + if (xoff ) *xoff = ix0; + if (yoff ) *yoff = iy0; + + // invert for y-downwards bitmaps + scale_y = -scale_y; + + { + int x,y,i,j; + float *precompute; + stbtt_vertex *verts; + int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); + data = (unsigned char *) STBTT_malloc(w * h, info->userdata); + precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); + + for (i=0,j=num_verts-1; i < num_verts; j=i++) { + if (verts[i].type == STBTT_vline) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; + float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); + precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; + float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; + float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float len2 = bx*bx + by*by; + if (len2 != 0.0f) + precompute[i] = 1.0f / (bx*bx + by*by); + else + precompute[i] = 0.0f; + } else + precompute[i] = 0.0f; + } + + for (y=iy0; y < iy1; ++y) { + for (x=ix0; x < ix1; ++x) { + float val; + float min_dist = 999999.0f; + float sx = (float) x + 0.5f; + float sy = (float) y + 0.5f; + float x_gspace = (sx / scale_x); + float y_gspace = (sy / scale_y); + + int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path + + for (i=0; i < num_verts; ++i) { + float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; + + if (verts[i].type == STBTT_vline && precompute[i] != 0.0f) { + float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; + + float dist,dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + // coarse culling against bbox + //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && + // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) + dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; + STBTT_assert(i != 0); + if (dist < min_dist) { + // check position along line + // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) + // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) + float dx = x1-x0, dy = y1-y0; + float px = x0-sx, py = y0-sy; + // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy + // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve + float t = -(px*dx + py*dy) / (dx*dx + dy*dy); + if (t >= 0.0f && t <= 1.0f) + min_dist = dist; + } + } else if (verts[i].type == STBTT_vcurve) { + float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; + float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; + float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); + float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); + float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); + float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); + // coarse culling against bbox to avoid computing cubic unnecessarily + if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { + int num=0; + float ax = x1-x0, ay = y1-y0; + float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; + float mx = x0 - sx, my = y0 - sy; + float res[3] = {0.f,0.f,0.f}; + float px,py,t,it,dist2; + float a_inv = precompute[i]; + if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula + float a = 3*(ax*bx + ay*by); + float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); + float c = mx*ax+my*ay; + if (a == 0.0) { // if a is 0, it's linear + if (b != 0.0) { + res[num++] = -c/b; + } + } else { + float discriminant = b*b - 4*a*c; + if (discriminant < 0) + num = 0; + else { + float root = (float) STBTT_sqrt(discriminant); + res[0] = (-b - root)/(2*a); + res[1] = (-b + root)/(2*a); + num = 2; // don't bother distinguishing 1-solution case, as code below will still work + } + } + } else { + float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point + float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; + float d = (mx*ax+my*ay) * a_inv; + num = stbtt__solve_cubic(b, c, d, res); + } + dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); + if (dist2 < min_dist*min_dist) + min_dist = (float) STBTT_sqrt(dist2); + + if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { + t = res[0], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { + t = res[1], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { + t = res[2], it = 1.0f - t; + px = it*it*x0 + 2*t*it*x1 + t*t*x2; + py = it*it*y0 + 2*t*it*y1 + t*t*y2; + dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); + if (dist2 < min_dist * min_dist) + min_dist = (float) STBTT_sqrt(dist2); + } + } + } + } + if (winding == 0) + min_dist = -min_dist; // if outside the shape, value is negative + val = onedge_value + pixel_dist_scale * min_dist; + if (val < 0) + val = 0; + else if (val > 255) + val = 255; + data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; + } + } + STBTT_free(precompute, info->userdata); + STBTT_free(verts, info->userdata); + } + return data; +} + +STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) +{ + return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); +} + +STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) +{ + STBTT_free(bitmap, userdata); +} + +////////////////////////////////////////////////////////////////////////////// +// +// font name matching -- recommended not to use this +// + +// check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string +static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) +{ + stbtt_int32 i=0; + + // convert utf16 to utf8 and compare the results while converting + while (len2) { + stbtt_uint16 ch = s2[0]*256 + s2[1]; + if (ch < 0x80) { + if (i >= len1) return -1; + if (s1[i++] != ch) return -1; + } else if (ch < 0x800) { + if (i+1 >= len1) return -1; + if (s1[i++] != 0xc0 + (ch >> 6)) return -1; + if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; + } else if (ch >= 0xd800 && ch < 0xdc00) { + stbtt_uint32 c; + stbtt_uint16 ch2 = s2[2]*256 + s2[3]; + if (i+3 >= len1) return -1; + c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; + if (s1[i++] != 0xf0 + (c >> 18)) return -1; + if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; + s2 += 2; // plus another 2 below + len2 -= 2; + } else if (ch >= 0xdc00 && ch < 0xe000) { + return -1; + } else { + if (i+2 >= len1) return -1; + if (s1[i++] != 0xe0 + (ch >> 12)) return -1; + if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; + if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; + } + s2 += 2; + len2 -= 2; + } + return i; +} + +static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) +{ + return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); +} + +// returns results in whatever encoding you request... but note that 2-byte encodings +// will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare +STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) +{ + stbtt_int32 i,count,stringOffset; + stbtt_uint8 *fc = font->data; + stbtt_uint32 offset = font->fontstart; + stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return NULL; + + count = ttUSHORT(fc+nm+2); + stringOffset = nm + ttUSHORT(fc+nm+4); + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) + && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { + *length = ttUSHORT(fc+loc+8); + return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); + } + } + return NULL; +} + +static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) +{ + stbtt_int32 i; + stbtt_int32 count = ttUSHORT(fc+nm+2); + stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); + + for (i=0; i < count; ++i) { + stbtt_uint32 loc = nm + 6 + 12 * i; + stbtt_int32 id = ttUSHORT(fc+loc+6); + if (id == target_id) { + // find the encoding + stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); + + // is this a Unicode encoding? + if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { + stbtt_int32 slen = ttUSHORT(fc+loc+8); + stbtt_int32 off = ttUSHORT(fc+loc+10); + + // check if there's a prefix match + stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); + if (matchlen >= 0) { + // check for target_id+1 immediately following, with same encoding & language + if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { + slen = ttUSHORT(fc+loc+12+8); + off = ttUSHORT(fc+loc+12+10); + if (slen == 0) { + if (matchlen == nlen) + return 1; + } else if (matchlen < nlen && name[matchlen] == ' ') { + ++matchlen; + if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) + return 1; + } + } else { + // if nothing immediately following + if (matchlen == nlen) + return 1; + } + } + } + + // @TODO handle other encodings + } + } + return 0; +} + +static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) +{ + stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); + stbtt_uint32 nm,hd; + if (!stbtt__isfont(fc+offset)) return 0; + + // check italics/bold/underline flags in macStyle... + if (flags) { + hd = stbtt__find_table(fc, offset, "head"); + if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; + } + + nm = stbtt__find_table(fc, offset, "name"); + if (!nm) return 0; + + if (flags) { + // if we checked the macStyle flags, then just check the family and ignore the subfamily + if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } else { + if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; + if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; + } + + return 0; +} + +static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) +{ + stbtt_int32 i; + for (i=0;;++i) { + stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); + if (off < 0) return off; + if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) + return off; + } +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wcast-qual" +#endif + +STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, + float pixel_height, unsigned char *pixels, int pw, int ph, + int first_char, int num_chars, stbtt_bakedchar *chardata) +{ + return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); +} + +STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) +{ + return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); +} + +STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) +{ + return stbtt_GetNumberOfFonts_internal((unsigned char *) data); +} + +STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) +{ + return stbtt_InitFont_internal(info, (unsigned char *) data, offset); +} + +STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) +{ + return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); +} + +STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) +{ + return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); +} + +#if defined(__GNUC__) || defined(__clang__) +#pragma GCC diagnostic pop +#endif + +#endif // STB_TRUETYPE_IMPLEMENTATION + + +// FULL VERSION HISTORY +// +// 1.25 (2021-07-11) many fixes +// 1.24 (2020-02-05) fix warning +// 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) +// 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined +// 1.21 (2019-02-25) fix warning +// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() +// 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod +// 1.18 (2018-01-29) add missing function +// 1.17 (2017-07-23) make more arguments const; doc fix +// 1.16 (2017-07-12) SDF support +// 1.15 (2017-03-03) make more arguments const +// 1.14 (2017-01-16) num-fonts-in-TTC function +// 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts +// 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual +// 1.11 (2016-04-02) fix unused-variable warning +// 1.10 (2016-04-02) allow user-defined fabs() replacement +// fix memory leak if fontsize=0.0 +// fix warning from duplicate typedef +// 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges +// 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges +// 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; +// allow PackFontRanges to pack and render in separate phases; +// fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); +// fixed an assert() bug in the new rasterizer +// replace assert() with STBTT_assert() in new rasterizer +// 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) +// also more precise AA rasterizer, except if shapes overlap +// remove need for STBTT_sort +// 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC +// 1.04 (2015-04-15) typo in example +// 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes +// 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ +// 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match +// non-oversampled; STBTT_POINT_SIZE for packed case only +// 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling +// 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) +// 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID +// 0.8b (2014-07-07) fix a warning +// 0.8 (2014-05-25) fix a few more warnings +// 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back +// 0.6c (2012-07-24) improve documentation +// 0.6b (2012-07-20) fix a few more warnings +// 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, +// stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty +// 0.5 (2011-12-09) bugfixes: +// subpixel glyph renderer computed wrong bounding box +// first vertex of shape can be off-curve (FreeSans) +// 0.4b (2011-12-03) fixed an error in the font baking example +// 0.4 (2011-12-01) kerning, subpixel rendering (tor) +// bugfixes for: +// codepoint-to-glyph conversion using table fmt=12 +// codepoint-to-glyph conversion using table fmt=4 +// stbtt_GetBakedQuad with non-square texture (Zer) +// updated Hello World! sample to use kerning and subpixel +// fixed some warnings +// 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) +// userdata, malloc-from-userdata, non-zero fill (stb) +// 0.2 (2009-03-11) Fix unsigned/signed char warnings +// 0.1 (2009-03-09) First public release +// + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is 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 Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS 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 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/include/SDL/SDL.h b/include/SDL/SDL.h new file mode 100644 index 0000000..9ba8f68 --- /dev/null +++ b/include/SDL/SDL.h @@ -0,0 +1,233 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL.h + * + * Main include header for the SDL library + */ + + +#ifndef SDL_h_ +#define SDL_h_ + +#include "SDL_main.h" +#include "SDL_stdinc.h" +#include "SDL_assert.h" +#include "SDL_atomic.h" +#include "SDL_audio.h" +#include "SDL_clipboard.h" +#include "SDL_cpuinfo.h" +#include "SDL_endian.h" +#include "SDL_error.h" +#include "SDL_events.h" +#include "SDL_filesystem.h" +#include "SDL_gamecontroller.h" +#include "SDL_guid.h" +#include "SDL_haptic.h" +#include "SDL_hidapi.h" +#include "SDL_hints.h" +#include "SDL_joystick.h" +#include "SDL_loadso.h" +#include "SDL_log.h" +#include "SDL_messagebox.h" +#include "SDL_metal.h" +#include "SDL_mutex.h" +#include "SDL_power.h" +#include "SDL_render.h" +#include "SDL_rwops.h" +#include "SDL_sensor.h" +#include "SDL_shape.h" +#include "SDL_system.h" +#include "SDL_thread.h" +#include "SDL_timer.h" +#include "SDL_version.h" +#include "SDL_video.h" +#include "SDL_locale.h" +#include "SDL_misc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* As of version 0.5, SDL is loaded dynamically into the application */ + +/** + * \name SDL_INIT_* + * + * These are the flags which may be passed to SDL_Init(). You should + * specify the subsystems which you will be using in your application. + */ +/* @{ */ +#define SDL_INIT_TIMER 0x00000001u +#define SDL_INIT_AUDIO 0x00000010u +#define SDL_INIT_VIDEO 0x00000020u /**< SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ +#define SDL_INIT_JOYSTICK 0x00000200u /**< SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS */ +#define SDL_INIT_HAPTIC 0x00001000u +#define SDL_INIT_GAMECONTROLLER 0x00002000u /**< SDL_INIT_GAMECONTROLLER implies SDL_INIT_JOYSTICK */ +#define SDL_INIT_EVENTS 0x00004000u +#define SDL_INIT_SENSOR 0x00008000u +#define SDL_INIT_NOPARACHUTE 0x00100000u /**< compatibility; this flag is ignored. */ +#define SDL_INIT_EVERYTHING ( \ + SDL_INIT_TIMER | SDL_INIT_AUDIO | SDL_INIT_VIDEO | SDL_INIT_EVENTS | \ + SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC | SDL_INIT_GAMECONTROLLER | SDL_INIT_SENSOR \ + ) +/* @} */ + +/** + * Initialize the SDL library. + * + * SDL_Init() simply forwards to calling SDL_InitSubSystem(). Therefore, the + * two may be used interchangeably. Though for readability of your code + * SDL_InitSubSystem() might be preferred. + * + * The file I/O (for example: SDL_RWFromFile) and threading (SDL_CreateThread) + * subsystems are initialized by default. Message boxes + * (SDL_ShowSimpleMessageBox) also attempt to work without initializing the + * video subsystem, in hopes of being useful in showing an error dialog when + * SDL_Init fails. You must specifically initialize other subsystems if you + * use them in your application. + * + * Logging (such as SDL_Log) works without initialization, too. + * + * `flags` may be any of the following OR'd together: + * + * - `SDL_INIT_TIMER`: timer subsystem + * - `SDL_INIT_AUDIO`: audio subsystem + * - `SDL_INIT_VIDEO`: video subsystem; automatically initializes the events + * subsystem + * - `SDL_INIT_JOYSTICK`: joystick subsystem; automatically initializes the + * events subsystem + * - `SDL_INIT_HAPTIC`: haptic (force feedback) subsystem + * - `SDL_INIT_GAMECONTROLLER`: controller subsystem; automatically + * initializes the joystick subsystem + * - `SDL_INIT_EVENTS`: events subsystem + * - `SDL_INIT_EVERYTHING`: all of the above subsystems + * - `SDL_INIT_NOPARACHUTE`: compatibility; this flag is ignored + * + * Subsystem initialization is ref-counted, you must call SDL_QuitSubSystem() + * for each SDL_InitSubSystem() to correctly shutdown a subsystem manually (or + * call SDL_Quit() to force shutdown). If a subsystem is already loaded then + * this call will increase the ref-count and return. + * + * \param flags subsystem initialization flags + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + * \sa SDL_SetMainReady + * \sa SDL_WasInit + */ +extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); + +/** + * Compatibility function to initialize the SDL library. + * + * In SDL2, this function and SDL_Init() are interchangeable. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_Quit + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); + +/** + * Shut down specific SDL subsystems. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * SDL_QuitSubSystem() and SDL_WasInit() will not work. You will need to use + * that subsystem's quit function (SDL_VideoQuit()) directly instead. But + * generally, you should not be using those functions directly anyhow; use + * SDL_Init() instead. + * + * You still need to call SDL_Quit() even if you close all open subsystems + * with SDL_QuitSubSystem(). + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_InitSubSystem + * \sa SDL_Quit + */ +extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); + +/** + * Get a mask of the specified subsystems which are currently initialized. + * + * \param flags any of the flags used by SDL_Init(); see SDL_Init for details. + * \returns a mask of all initialized subsystems if `flags` is 0, otherwise it + * returns the initialization status of the specified subsystems. + * + * The return value does not include SDL_INIT_NOPARACHUTE. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_InitSubSystem + */ +extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); + +/** + * Clean up all initialized subsystems. + * + * You should call this function even if you have already shutdown each + * initialized subsystem with SDL_QuitSubSystem(). It is safe to call this + * function even in the case of errors in initialization. + * + * If you start a subsystem using a call to that subsystem's init function + * (for example SDL_VideoInit()) instead of SDL_Init() or SDL_InitSubSystem(), + * then you must use that subsystem's quit function (SDL_VideoQuit()) to shut + * it down before calling SDL_Quit(). But generally, you should not be using + * those functions directly anyhow; use SDL_Init() instead. + * + * You can use this function with atexit() to ensure that it is run when your + * application is shutdown, but it is not wise to do this from a library or + * other dynamically loaded code. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + * \sa SDL_QuitSubSystem + */ +extern DECLSPEC void SDLCALL SDL_Quit(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_assert.h b/include/SDL/SDL_assert.h new file mode 100644 index 0000000..ba6dcd1 --- /dev/null +++ b/include/SDL/SDL_assert.h @@ -0,0 +1,326 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_assert_h_ +#define SDL_assert_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef SDL_ASSERT_LEVEL +#ifdef SDL_DEFAULT_ASSERT_LEVEL +#define SDL_ASSERT_LEVEL SDL_DEFAULT_ASSERT_LEVEL +#elif defined(_DEBUG) || defined(DEBUG) || \ + (defined(__GNUC__) && !defined(__OPTIMIZE__)) +#define SDL_ASSERT_LEVEL 2 +#else +#define SDL_ASSERT_LEVEL 1 +#endif +#endif /* SDL_ASSERT_LEVEL */ + +/* +These are macros and not first class functions so that the debugger breaks +on the assertion line and not in some random guts of SDL, and so each +assert can have unique static variables associated with it. +*/ + +#if defined(_MSC_VER) +/* Don't include intrin.h here because it contains C++ code */ + extern void __cdecl __debugbreak(void); + #define SDL_TriggerBreakpoint() __debugbreak() +#elif _SDL_HAS_BUILTIN(__builtin_debugtrap) + #define SDL_TriggerBreakpoint() __builtin_debugtrap() +#elif ( (!defined(__NACL__)) && ((defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__))) ) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "int $3\n\t" ) +#elif ( defined(__APPLE__) && (defined(__arm64__) || defined(__aarch64__)) ) /* this might work on other ARM targets, but this is a known quantity... */ + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "brk #22\n\t" ) +#elif defined(__APPLE__) && defined(__arm__) + #define SDL_TriggerBreakpoint() __asm__ __volatile__ ( "bkpt #22\n\t" ) +#elif defined(__386__) && defined(__WATCOMC__) + #define SDL_TriggerBreakpoint() { _asm { int 0x03 } } +#elif defined(HAVE_SIGNAL_H) && !defined(__WATCOMC__) + #include + #define SDL_TriggerBreakpoint() raise(SIGTRAP) +#else + /* How do we trigger breakpoints on this platform? */ + #define SDL_TriggerBreakpoint() +#endif + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 supports __func__ as a standard. */ +# define SDL_FUNCTION __func__ +#elif ((defined(__GNUC__) && (__GNUC__ >= 2)) || defined(_MSC_VER) || defined (__WATCOMC__)) +# define SDL_FUNCTION __FUNCTION__ +#else +# define SDL_FUNCTION "???" +#endif +#define SDL_FILE __FILE__ +#define SDL_LINE __LINE__ + +/* +sizeof (x) makes the compiler still parse the expression even without +assertions enabled, so the code is always checked at compile time, but +doesn't actually generate code for it, so there are no side effects or +expensive checks at run time, just the constant size of what x WOULD be, +which presumably gets optimized out as unused. +This also solves the problem of... + + int somevalue = blah(); + SDL_assert(somevalue == 1); + +...which would cause compiles to complain that somevalue is unused if we +disable assertions. +*/ + +/* "while (0,0)" fools Microsoft's compiler's /W4 warning level into thinking + this condition isn't constant. And looks like an owl's face! */ +#ifdef _MSC_VER /* stupid /W4 warnings. */ +#define SDL_NULL_WHILE_LOOP_CONDITION (0,0) +#else +#define SDL_NULL_WHILE_LOOP_CONDITION (0) +#endif + +#define SDL_disabled_assert(condition) \ + do { (void) sizeof ((condition)); } while (SDL_NULL_WHILE_LOOP_CONDITION) + +typedef enum +{ + SDL_ASSERTION_RETRY, /**< Retry the assert immediately. */ + SDL_ASSERTION_BREAK, /**< Make the debugger trigger a breakpoint. */ + SDL_ASSERTION_ABORT, /**< Terminate the program. */ + SDL_ASSERTION_IGNORE, /**< Ignore the assert. */ + SDL_ASSERTION_ALWAYS_IGNORE /**< Ignore the assert from now on. */ +} SDL_AssertState; + +typedef struct SDL_AssertData +{ + int always_ignore; + unsigned int trigger_count; + const char *condition; + const char *filename; + int linenum; + const char *function; + const struct SDL_AssertData *next; +} SDL_AssertData; + +#if (SDL_ASSERT_LEVEL > 0) + +/* Never call this directly. Use the SDL_assert* macros. */ +extern DECLSPEC SDL_AssertState SDLCALL SDL_ReportAssertion(SDL_AssertData *, + const char *, + const char *, int) +#if defined(__clang__) +#if __has_feature(attribute_analyzer_noreturn) +/* this tells Clang's static analysis that we're a custom assert function, + and that the analyzer should assume the condition was always true past this + SDL_assert test. */ + __attribute__((analyzer_noreturn)) +#endif +#endif +; + +/* the do {} while(0) avoids dangling else problems: + if (x) SDL_assert(y); else blah(); + ... without the do/while, the "else" could attach to this macro's "if". + We try to handle just the minimum we need here in a macro...the loop, + the static vars, and break points. The heavy lifting is handled in + SDL_ReportAssertion(), in SDL_assert.c. +*/ +#define SDL_enabled_assert(condition) \ + do { \ + while ( !(condition) ) { \ + static struct SDL_AssertData sdl_assert_data = { \ + 0, 0, #condition, 0, 0, 0, 0 \ + }; \ + const SDL_AssertState sdl_assert_state = SDL_ReportAssertion(&sdl_assert_data, SDL_FUNCTION, SDL_FILE, SDL_LINE); \ + if (sdl_assert_state == SDL_ASSERTION_RETRY) { \ + continue; /* go again. */ \ + } else if (sdl_assert_state == SDL_ASSERTION_BREAK) { \ + SDL_TriggerBreakpoint(); \ + } \ + break; /* not retrying. */ \ + } \ + } while (SDL_NULL_WHILE_LOOP_CONDITION) + +#endif /* enabled assertions support code */ + +/* Enable various levels of assertions. */ +#if SDL_ASSERT_LEVEL == 0 /* assertions disabled */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_disabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 1 /* release settings. */ +# define SDL_assert(condition) SDL_disabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 2 /* normal settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_disabled_assert(condition) +#elif SDL_ASSERT_LEVEL == 3 /* paranoid settings. */ +# define SDL_assert(condition) SDL_enabled_assert(condition) +# define SDL_assert_release(condition) SDL_enabled_assert(condition) +# define SDL_assert_paranoid(condition) SDL_enabled_assert(condition) +#else +# error Unknown assertion level. +#endif + +/* this assertion is never disabled at any level. */ +#define SDL_assert_always(condition) SDL_enabled_assert(condition) + + +/** + * A callback that fires when an SDL assertion fails. + * + * \param data a pointer to the SDL_AssertData structure corresponding to the + * current assertion + * \param userdata what was passed as `userdata` to SDL_SetAssertionHandler() + * \returns an SDL_AssertState value indicating how to handle the failure. + */ +typedef SDL_AssertState (SDLCALL *SDL_AssertionHandler)( + const SDL_AssertData* data, void* userdata); + +/** + * Set an application-defined assertion handler. + * + * This function allows an application to show its own assertion UI and/or + * force the response to an assertion failure. If the application doesn't + * provide this, SDL will try to do the right thing, popping up a + * system-specific GUI dialog, and probably minimizing any fullscreen windows. + * + * This callback may fire from any thread, but it runs wrapped in a mutex, so + * it will only fire from one thread at a time. + * + * This callback is NOT reset to SDL's internal handler upon SDL_Quit()! + * + * \param handler the SDL_AssertionHandler function to call when an assertion + * fails or NULL for the default handler + * \param userdata a pointer that is passed to `handler` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAssertionHandler + */ +extern DECLSPEC void SDLCALL SDL_SetAssertionHandler( + SDL_AssertionHandler handler, + void *userdata); + +/** + * Get the default assertion handler. + * + * This returns the function pointer that is called by default when an + * assertion is triggered. This is an internal function provided by SDL, that + * is used for assertions when SDL_SetAssertionHandler() hasn't been used to + * provide a different function. + * + * \returns the default SDL_AssertionHandler that is called when an assert + * triggers. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GetAssertionHandler + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetDefaultAssertionHandler(void); + +/** + * Get the current assertion handler. + * + * This returns the function pointer that is called when an assertion is + * triggered. This is either the value last passed to + * SDL_SetAssertionHandler(), or if no application-specified function is set, + * is equivalent to calling SDL_GetDefaultAssertionHandler(). + * + * The parameter `puserdata` is a pointer to a void*, which will store the + * "userdata" pointer that was passed to SDL_SetAssertionHandler(). This value + * will always be NULL for the default handler. If you don't care about this + * data, it is safe to pass a NULL pointer to this function to ignore it. + * + * \param puserdata pointer which is filled with the "userdata" pointer that + * was passed to SDL_SetAssertionHandler() + * \returns the SDL_AssertionHandler that is called when an assert triggers. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_SetAssertionHandler + */ +extern DECLSPEC SDL_AssertionHandler SDLCALL SDL_GetAssertionHandler(void **puserdata); + +/** + * Get a list of all assertion failures. + * + * This function gets all assertions triggered since the last call to + * SDL_ResetAssertionReport(), or the start of the program. + * + * The proper way to examine this data looks something like this: + * + * ```c + * const SDL_AssertData *item = SDL_GetAssertionReport(); + * while (item) { + * printf("'%s', %s (%s:%d), triggered %u times, always ignore: %s.\\n", + * item->condition, item->function, item->filename, + * item->linenum, item->trigger_count, + * item->always_ignore ? "yes" : "no"); + * item = item->next; + * } + * ``` + * + * \returns a list of all failed assertions or NULL if the list is empty. This + * memory should not be modified or freed by the application. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ResetAssertionReport + */ +extern DECLSPEC const SDL_AssertData * SDLCALL SDL_GetAssertionReport(void); + +/** + * Clear the list of all assertion failures. + * + * This function will clear the list of all assertions triggered up to that + * point. Immediately following this call, SDL_GetAssertionReport will return + * no items. In addition, any previously-triggered assertions will be reset to + * a trigger_count of zero, and their always_ignore state will be false. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAssertionReport + */ +extern DECLSPEC void SDLCALL SDL_ResetAssertionReport(void); + + +/* these had wrong naming conventions until 2.0.4. Please update your app! */ +#define SDL_assert_state SDL_AssertState +#define SDL_assert_data SDL_AssertData + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_assert_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_atomic.h b/include/SDL/SDL_atomic.h new file mode 100644 index 0000000..22ea019 --- /dev/null +++ b/include/SDL/SDL_atomic.h @@ -0,0 +1,415 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_atomic.h + * + * Atomic operations. + * + * IMPORTANT: + * If you are not an expert in concurrent lockless programming, you should + * only be using the atomic lock and reference counting functions in this + * file. In all other cases you should be protecting your data structures + * with full mutexes. + * + * The list of "safe" functions to use are: + * SDL_AtomicLock() + * SDL_AtomicUnlock() + * SDL_AtomicIncRef() + * SDL_AtomicDecRef() + * + * Seriously, here be dragons! + * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + * + * You can find out a little more about lockless programming and the + * subtle issues that can arise here: + * http://msdn.microsoft.com/en-us/library/ee418650%28v=vs.85%29.aspx + * + * There's also lots of good information here: + * http://www.1024cores.net/home/lock-free-algorithms + * http://preshing.com/ + * + * These operations may or may not actually be implemented using + * processor specific atomic operations. When possible they are + * implemented as true processor specific atomic operations. When that + * is not possible the are implemented using locks that *do* use the + * available atomic operations. + * + * All of the atomic operations that modify memory are full memory barriers. + */ + +#ifndef SDL_atomic_h_ +#define SDL_atomic_h_ + +#include "SDL_stdinc.h" +#include "SDL_platform.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name SDL AtomicLock + * + * The atomic locks are efficient spinlocks using CPU instructions, + * but are vulnerable to starvation and can spin forever if a thread + * holding a lock has been terminated. For this reason you should + * minimize the code executed inside an atomic lock and never do + * expensive things like API or system calls while holding them. + * + * The atomic locks are not safe to lock recursively. + * + * Porting Note: + * The spin lock functions and type are required and can not be + * emulated because they are used in the atomic emulation code. + */ +/* @{ */ + +typedef int SDL_SpinLock; + +/** + * Try to lock a spin lock by setting it to a non-zero value. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * \returns SDL_TRUE if the lock succeeded, SDL_FALSE if the lock is already + * held. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicLock + * \sa SDL_AtomicUnlock + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicTryLock(SDL_SpinLock *lock); + +/** + * Lock a spin lock by setting it to a non-zero value. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicTryLock + * \sa SDL_AtomicUnlock + */ +extern DECLSPEC void SDLCALL SDL_AtomicLock(SDL_SpinLock *lock); + +/** + * Unlock a spin lock by setting it to 0. + * + * Always returns immediately. + * + * ***Please note that spinlocks are dangerous if you don't know what you're + * doing. Please be careful using any sort of spinlock!*** + * + * \param lock a pointer to a lock variable + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicLock + * \sa SDL_AtomicTryLock + */ +extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock); + +/* @} *//* SDL AtomicLock */ + + +/** + * The compiler barrier prevents the compiler from reordering + * reads and writes to globally visible variables across the call. + */ +#if defined(_MSC_VER) && (_MSC_VER > 1200) && !defined(__clang__) +void _ReadWriteBarrier(void); +#pragma intrinsic(_ReadWriteBarrier) +#define SDL_CompilerBarrier() _ReadWriteBarrier() +#elif (defined(__GNUC__) && !defined(__EMSCRIPTEN__)) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs when using GCC or Solaris Studio 12.1+. */ +#define SDL_CompilerBarrier() __asm__ __volatile__ ("" : : : "memory") +#elif defined(__WATCOMC__) +extern __inline void SDL_CompilerBarrier(void); +#pragma aux SDL_CompilerBarrier = "" parm [] modify exact []; +#else +#define SDL_CompilerBarrier() \ +{ SDL_SpinLock _tmp = 0; SDL_AtomicLock(&_tmp); SDL_AtomicUnlock(&_tmp); } +#endif + +/** + * Memory barriers are designed to prevent reads and writes from being + * reordered by the compiler and being seen out of order on multi-core CPUs. + * + * A typical pattern would be for thread A to write some data and a flag, and + * for thread B to read the flag and get the data. In this case you would + * insert a release barrier between writing the data and the flag, + * guaranteeing that the data write completes no later than the flag is + * written, and you would insert an acquire barrier between reading the flag + * and reading the data, to ensure that all the reads associated with the flag + * have completed. + * + * In this pattern you should always see a release barrier paired with an + * acquire barrier and you should gate the data reads/writes with a single + * flag variable. + * + * For more information on these semantics, take a look at the blog post: + * http://preshing.com/20120913/acquire-and-release-semantics + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void SDLCALL SDL_MemoryBarrierReleaseFunction(void); +extern DECLSPEC void SDLCALL SDL_MemoryBarrierAcquireFunction(void); + +#if defined(__GNUC__) && (defined(__powerpc__) || defined(__ppc__)) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("lwsync" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("lwsync" : : : "memory") +#elif defined(__GNUC__) && defined(__aarch64__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__GNUC__) && defined(__arm__) +#if 0 /* defined(__LINUX__) || defined(__ANDROID__) */ +/* Information from: + https://chromium.googlesource.com/chromium/chromium/+/trunk/base/atomicops_internals_arm_gcc.h#19 + + The Linux kernel provides a helper function which provides the right code for a memory barrier, + hard-coded at address 0xffff0fa0 +*/ +typedef void (*SDL_KernelMemoryBarrierFunc)(); +#define SDL_MemoryBarrierRelease() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#define SDL_MemoryBarrierAcquire() ((SDL_KernelMemoryBarrierFunc)0xffff0fa0)() +#elif 0 /* defined(__QNXNTO__) */ +#include + +#define SDL_MemoryBarrierRelease() __cpu_membarrier() +#define SDL_MemoryBarrierAcquire() __cpu_membarrier() +#else +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) || defined(__ARM_ARCH_8A__) +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("dmb ish" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("dmb ish" : : : "memory") +#elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_5TE__) +#ifdef __thumb__ +/* The mcr instruction isn't available in thumb mode, use real functions */ +#define SDL_MEMORY_BARRIER_USES_FUNCTION +#define SDL_MemoryBarrierRelease() SDL_MemoryBarrierReleaseFunction() +#define SDL_MemoryBarrierAcquire() SDL_MemoryBarrierAcquireFunction() +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r"(0) : "memory") +#endif /* __thumb__ */ +#else +#define SDL_MemoryBarrierRelease() __asm__ __volatile__ ("" : : : "memory") +#define SDL_MemoryBarrierAcquire() __asm__ __volatile__ ("" : : : "memory") +#endif /* __LINUX__ || __ANDROID__ */ +#endif /* __GNUC__ && __arm__ */ +#else +#if (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5120)) +/* This is correct for all CPUs on Solaris when using Solaris Studio 12.1+. */ +#include +#define SDL_MemoryBarrierRelease() __machine_rel_barrier() +#define SDL_MemoryBarrierAcquire() __machine_acq_barrier() +#else +/* This is correct for the x86 and x64 CPUs, and we'll expand this over time. */ +#define SDL_MemoryBarrierRelease() SDL_CompilerBarrier() +#define SDL_MemoryBarrierAcquire() SDL_CompilerBarrier() +#endif +#endif + +/* "REP NOP" is PAUSE, coded for tools that don't know it by that name. */ +#if (defined(__GNUC__) || defined(__clang__)) && (defined(__i386__) || defined(__x86_64__)) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("pause\n") /* Some assemblers can't do REP NOP, so go with PAUSE. */ +#elif (defined(__arm__) && __ARM_ARCH >= 7) || defined(__aarch64__) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("yield" ::: "memory") +#elif (defined(__powerpc__) || defined(__powerpc64__)) + #define SDL_CPUPauseInstruction() __asm__ __volatile__("or 27,27,27"); +#elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64)) + #define SDL_CPUPauseInstruction() _mm_pause() /* this is actually "rep nop" and not a SIMD instruction. No inline asm in MSVC x86-64! */ +#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_ARM64)) + #define SDL_CPUPauseInstruction() __yield() +#elif defined(__WATCOMC__) && defined(__386__) + /* watcom assembler rejects PAUSE if CPU < i686, and it refuses REP NOP as an invalid combination. Hardcode the bytes. */ + extern __inline void SDL_CPUPauseInstruction(void); + #pragma aux SDL_CPUPauseInstruction = "db 0f3h,90h" +#else + #define SDL_CPUPauseInstruction() +#endif + + +/** + * \brief A type representing an atomic integer value. It is a struct + * so people don't accidentally use numeric operations on it. + */ +typedef struct { int value; } SDL_atomic_t; + +/** + * Set an atomic variable to a new value if it is currently an old value. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param oldval the old value + * \param newval the new value + * \returns SDL_TRUE if the atomic variable was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicGet + * \sa SDL_AtomicSet + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCAS(SDL_atomic_t *a, int oldval, int newval); + +/** + * Set an atomic variable to a value. + * + * This function also acts as a full memory barrier. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param v the desired value + * \returns the previous value of the atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicGet + */ +extern DECLSPEC int SDLCALL SDL_AtomicSet(SDL_atomic_t *a, int v); + +/** + * Get the value of an atomic variable. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable + * \returns the current value of an atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicSet + */ +extern DECLSPEC int SDLCALL SDL_AtomicGet(SDL_atomic_t *a); + +/** + * Add to an atomic variable. + * + * This function also acts as a full memory barrier. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to an SDL_atomic_t variable to be modified + * \param v the desired value to add + * \returns the previous value of the atomic variable. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicDecRef + * \sa SDL_AtomicIncRef + */ +extern DECLSPEC int SDLCALL SDL_AtomicAdd(SDL_atomic_t *a, int v); + +/** + * \brief Increment an atomic variable used as a reference count. + */ +#ifndef SDL_AtomicIncRef +#define SDL_AtomicIncRef(a) SDL_AtomicAdd(a, 1) +#endif + +/** + * \brief Decrement an atomic variable used as a reference count. + * + * \return SDL_TRUE if the variable reached zero after decrementing, + * SDL_FALSE otherwise + */ +#ifndef SDL_AtomicDecRef +#define SDL_AtomicDecRef(a) (SDL_AtomicAdd(a, -1) == 1) +#endif + +/** + * Set a pointer to a new value if it is currently an old value. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \param oldval the old pointer value + * \param newval the new pointer value + * \returns SDL_TRUE if the pointer was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AtomicCAS + * \sa SDL_AtomicGetPtr + * \sa SDL_AtomicSetPtr + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AtomicCASPtr(void **a, void *oldval, void *newval); + +/** + * Set a pointer to a value atomically. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \param v the desired pointer value + * \returns the previous value of the pointer. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicGetPtr + */ +extern DECLSPEC void* SDLCALL SDL_AtomicSetPtr(void **a, void* v); + +/** + * Get the value of a pointer atomically. + * + * ***Note: If you don't know what this function is for, you shouldn't use + * it!*** + * + * \param a a pointer to a pointer + * \returns the current value of a pointer. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_AtomicCASPtr + * \sa SDL_AtomicSetPtr + */ +extern DECLSPEC void* SDLCALL SDL_AtomicGetPtr(void **a); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif + +#include "close_code.h" + +#endif /* SDL_atomic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_audio.h b/include/SDL/SDL_audio.h new file mode 100644 index 0000000..2c0f211 --- /dev/null +++ b/include/SDL/SDL_audio.h @@ -0,0 +1,1500 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/* !!! FIXME: several functions in here need Doxygen comments. */ + +/** + * \file SDL_audio.h + * + * Access to the raw audio mixing buffer for the SDL library. + */ + +#ifndef SDL_audio_h_ +#define SDL_audio_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_endian.h" +#include "SDL_mutex.h" +#include "SDL_thread.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Audio format flags. + * + * These are what the 16 bits in SDL_AudioFormat currently mean... + * (Unspecified bits are always zero). + * + * \verbatim + ++-----------------------sample is signed if set + || + || ++-----------sample is bigendian if set + || || + || || ++---sample is float if set + || || || + || || || +---sample bit size---+ + || || || | | + 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 + \endverbatim + * + * There are macros in SDL 2.0 and later to query these bits. + */ +typedef Uint16 SDL_AudioFormat; + +/** + * \name Audio flags + */ +/* @{ */ + +#define SDL_AUDIO_MASK_BITSIZE (0xFF) +#define SDL_AUDIO_MASK_DATATYPE (1<<8) +#define SDL_AUDIO_MASK_ENDIAN (1<<12) +#define SDL_AUDIO_MASK_SIGNED (1<<15) +#define SDL_AUDIO_BITSIZE(x) (x & SDL_AUDIO_MASK_BITSIZE) +#define SDL_AUDIO_ISFLOAT(x) (x & SDL_AUDIO_MASK_DATATYPE) +#define SDL_AUDIO_ISBIGENDIAN(x) (x & SDL_AUDIO_MASK_ENDIAN) +#define SDL_AUDIO_ISSIGNED(x) (x & SDL_AUDIO_MASK_SIGNED) +#define SDL_AUDIO_ISINT(x) (!SDL_AUDIO_ISFLOAT(x)) +#define SDL_AUDIO_ISLITTLEENDIAN(x) (!SDL_AUDIO_ISBIGENDIAN(x)) +#define SDL_AUDIO_ISUNSIGNED(x) (!SDL_AUDIO_ISSIGNED(x)) + +/** + * \name Audio format flags + * + * Defaults to LSB byte order. + */ +/* @{ */ +#define AUDIO_U8 0x0008 /**< Unsigned 8-bit samples */ +#define AUDIO_S8 0x8008 /**< Signed 8-bit samples */ +#define AUDIO_U16LSB 0x0010 /**< Unsigned 16-bit samples */ +#define AUDIO_S16LSB 0x8010 /**< Signed 16-bit samples */ +#define AUDIO_U16MSB 0x1010 /**< As above, but big-endian byte order */ +#define AUDIO_S16MSB 0x9010 /**< As above, but big-endian byte order */ +#define AUDIO_U16 AUDIO_U16LSB +#define AUDIO_S16 AUDIO_S16LSB +/* @} */ + +/** + * \name int32 support + */ +/* @{ */ +#define AUDIO_S32LSB 0x8020 /**< 32-bit integer samples */ +#define AUDIO_S32MSB 0x9020 /**< As above, but big-endian byte order */ +#define AUDIO_S32 AUDIO_S32LSB +/* @} */ + +/** + * \name float32 support + */ +/* @{ */ +#define AUDIO_F32LSB 0x8120 /**< 32-bit floating point samples */ +#define AUDIO_F32MSB 0x9120 /**< As above, but big-endian byte order */ +#define AUDIO_F32 AUDIO_F32LSB +/* @} */ + +/** + * \name Native audio byte ordering + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define AUDIO_U16SYS AUDIO_U16LSB +#define AUDIO_S16SYS AUDIO_S16LSB +#define AUDIO_S32SYS AUDIO_S32LSB +#define AUDIO_F32SYS AUDIO_F32LSB +#else +#define AUDIO_U16SYS AUDIO_U16MSB +#define AUDIO_S16SYS AUDIO_S16MSB +#define AUDIO_S32SYS AUDIO_S32MSB +#define AUDIO_F32SYS AUDIO_F32MSB +#endif +/* @} */ + +/** + * \name Allow change flags + * + * Which audio format changes are allowed when opening a device. + */ +/* @{ */ +#define SDL_AUDIO_ALLOW_FREQUENCY_CHANGE 0x00000001 +#define SDL_AUDIO_ALLOW_FORMAT_CHANGE 0x00000002 +#define SDL_AUDIO_ALLOW_CHANNELS_CHANGE 0x00000004 +#define SDL_AUDIO_ALLOW_SAMPLES_CHANGE 0x00000008 +#define SDL_AUDIO_ALLOW_ANY_CHANGE (SDL_AUDIO_ALLOW_FREQUENCY_CHANGE|SDL_AUDIO_ALLOW_FORMAT_CHANGE|SDL_AUDIO_ALLOW_CHANNELS_CHANGE|SDL_AUDIO_ALLOW_SAMPLES_CHANGE) +/* @} */ + +/* @} *//* Audio flags */ + +/** + * This function is called when the audio device needs more data. + * + * \param userdata An application-specific parameter saved in + * the SDL_AudioSpec structure + * \param stream A pointer to the audio data buffer. + * \param len The length of that buffer in bytes. + * + * Once the callback returns, the buffer will no longer be valid. + * Stereo samples are stored in a LRLRLR ordering. + * + * You can choose to avoid callbacks and use SDL_QueueAudio() instead, if + * you like. Just open your audio device with a NULL callback. + */ +typedef void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream, + int len); + +/** + * The calculated values in this structure are calculated by SDL_OpenAudio(). + * + * For multi-channel audio, the default SDL channel mapping is: + * 2: FL FR (stereo) + * 3: FL FR LFE (2.1 surround) + * 4: FL FR BL BR (quad) + * 5: FL FR LFE BL BR (4.1 surround) + * 6: FL FR FC LFE SL SR (5.1 surround - last two can also be BL BR) + * 7: FL FR FC LFE BC SL SR (6.1 surround) + * 8: FL FR FC LFE BL BR SL SR (7.1 surround) + */ +typedef struct SDL_AudioSpec +{ + int freq; /**< DSP frequency -- samples per second */ + SDL_AudioFormat format; /**< Audio data format */ + Uint8 channels; /**< Number of channels: 1 mono, 2 stereo */ + Uint8 silence; /**< Audio buffer silence value (calculated) */ + Uint16 samples; /**< Audio buffer size in sample FRAMES (total samples divided by channel count) */ + Uint16 padding; /**< Necessary for some compile environments */ + Uint32 size; /**< Audio buffer size in bytes (calculated) */ + SDL_AudioCallback callback; /**< Callback that feeds the audio device (NULL to use SDL_QueueAudio()). */ + void *userdata; /**< Userdata passed to callback (ignored for NULL callbacks). */ +} SDL_AudioSpec; + + +struct SDL_AudioCVT; +typedef void (SDLCALL * SDL_AudioFilter) (struct SDL_AudioCVT * cvt, + SDL_AudioFormat format); + +/** + * \brief Upper limit of filters in SDL_AudioCVT + * + * The maximum number of SDL_AudioFilter functions in SDL_AudioCVT is + * currently limited to 9. The SDL_AudioCVT.filters array has 10 pointers, + * one of which is the terminating NULL pointer. + */ +#define SDL_AUDIOCVT_MAX_FILTERS 9 + +/** + * \struct SDL_AudioCVT + * \brief A structure to hold a set of audio conversion filters and buffers. + * + * Note that various parts of the conversion pipeline can take advantage + * of SIMD operations (like SSE2, for example). SDL_AudioCVT doesn't require + * you to pass it aligned data, but can possibly run much faster if you + * set both its (buf) field to a pointer that is aligned to 16 bytes, and its + * (len) field to something that's a multiple of 16, if possible. + */ +#if defined(__GNUC__) && !defined(__CHERI_PURE_CAPABILITY__) +/* This structure is 84 bytes on 32-bit architectures, make sure GCC doesn't + pad it out to 88 bytes to guarantee ABI compatibility between compilers. + This is not a concern on CHERI architectures, where pointers must be stored + at aligned locations otherwise they will become invalid, and thus structs + containing pointers cannot be packed without giving a warning or error. + vvv + The next time we rev the ABI, make sure to size the ints and add padding. +*/ +#define SDL_AUDIOCVT_PACKED __attribute__((packed)) +#else +#define SDL_AUDIOCVT_PACKED +#endif +/* */ +typedef struct SDL_AudioCVT +{ + int needed; /**< Set to 1 if conversion possible */ + SDL_AudioFormat src_format; /**< Source audio format */ + SDL_AudioFormat dst_format; /**< Target audio format */ + double rate_incr; /**< Rate conversion increment */ + Uint8 *buf; /**< Buffer to hold entire audio data */ + int len; /**< Length of original audio buffer */ + int len_cvt; /**< Length of converted audio buffer */ + int len_mult; /**< buffer must be len*len_mult big */ + double len_ratio; /**< Given len, final size is len*len_ratio */ + SDL_AudioFilter filters[SDL_AUDIOCVT_MAX_FILTERS + 1]; /**< NULL-terminated list of filter functions */ + int filter_index; /**< Current audio conversion function */ +} SDL_AUDIOCVT_PACKED SDL_AudioCVT; + + +/* Function prototypes */ + +/** + * \name Driver discovery functions + * + * These functions return the list of built in audio drivers, in the + * order that they are normally initialized by default. + */ +/* @{ */ + +/** + * Use this function to get the number of built-in audio drivers. + * + * This function returns a hardcoded number. This never returns a negative + * value; if there are no drivers compiled into this build of SDL, this + * function returns zero. The presence of a driver in this list does not mean + * it will function, it just means SDL is capable of interacting with that + * interface. For example, a build of SDL might have esound support, but if + * there's no esound server available, SDL's esound driver would fail if used. + * + * By default, SDL tries all drivers, in its preferred order, until one is + * found to be usable. + * + * \returns the number of built-in audio drivers. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDriver + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDrivers(void); + +/** + * Use this function to get the name of a built in audio driver. + * + * The list of audio drivers is given in the order that they are normally + * initialized by default; the drivers that seem more reasonable to choose + * first (as far as the SDL developers believe) are earlier in the list. + * + * The names of drivers are all simple, low-ASCII identifiers, like "alsa", + * "coreaudio" or "xaudio2". These never have Unicode characters, and are not + * meant to be proper names. + * + * \param index the index of the audio driver; the value ranges from 0 to + * SDL_GetNumAudioDrivers() - 1 + * \returns the name of the audio driver at the requested index, or NULL if an + * invalid index was specified. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumAudioDrivers + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDriver(int index); +/* @} */ + +/** + * \name Initialization and cleanup + * + * \internal These functions are used internally, and should not be used unless + * you have a specific need to specify the audio driver you want to + * use. You should normally use SDL_Init() or SDL_InitSubSystem(). + */ +/* @{ */ + +/** + * Use this function to initialize a particular audio driver. + * + * This function is used internally, and should not be used unless you have a + * specific need to designate the audio driver you want to use. You should + * normally use SDL_Init() or SDL_InitSubSystem(). + * + * \param driver_name the name of the desired audio driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioQuit + */ +extern DECLSPEC int SDLCALL SDL_AudioInit(const char *driver_name); + +/** + * Use this function to shut down audio if you initialized it with + * SDL_AudioInit(). + * + * This function is used internally, and should not be used unless you have a + * specific need to specify the audio driver you want to use. You should + * normally use SDL_Quit() or SDL_QuitSubSystem(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioInit + */ +extern DECLSPEC void SDLCALL SDL_AudioQuit(void); +/* @} */ + +/** + * Get the name of the current audio driver. + * + * The returned string points to internal static memory and thus never becomes + * invalid, even if you quit the audio subsystem and initialize a new driver + * (although such a case would return a different static string from another + * call to this function, of course). As such, you should not modify or free + * the returned string. + * + * \returns the name of the current audio driver or NULL if no driver has been + * initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AudioInit + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentAudioDriver(void); + +/** + * This function is a legacy means of opening the audio device. + * + * This function remains for compatibility with SDL 1.2, but also because it's + * slightly easier to use than the new functions in SDL 2.0. The new, more + * powerful, and preferred way to do this is SDL_OpenAudioDevice(). + * + * This function is roughly equivalent to: + * + * ```c + * SDL_OpenAudioDevice(NULL, 0, desired, obtained, SDL_AUDIO_ALLOW_ANY_CHANGE); + * ``` + * + * With two notable exceptions: + * + * - If `obtained` is NULL, we use `desired` (and allow no changes), which + * means desired will be modified to have the correct values for silence, + * etc, and SDL will convert any differences between your app's specific + * request and the hardware behind the scenes. + * - The return value is always success or failure, and not a device ID, which + * means you can only have one device open at a time with this function. + * + * \param desired an SDL_AudioSpec structure representing the desired output + * format. Please refer to the SDL_OpenAudioDevice + * documentation for details on how to prepare this structure. + * \param obtained an SDL_AudioSpec structure filled in with the actual + * parameters, or NULL. + * \returns 0 if successful, placing the actual hardware parameters in the + * structure pointed to by `obtained`. + * + * If `obtained` is NULL, the audio data passed to the callback + * function will be guaranteed to be in the requested format, and + * will be automatically converted to the actual hardware audio + * format if necessary. If `obtained` is NULL, `desired` will have + * fields modified. + * + * This function returns a negative error code on failure to open the + * audio device or failure to set up the audio thread; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CloseAudio + * \sa SDL_LockAudio + * \sa SDL_PauseAudio + * \sa SDL_UnlockAudio + */ +extern DECLSPEC int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired, + SDL_AudioSpec * obtained); + +/** + * SDL Audio Device IDs. + * + * A successful call to SDL_OpenAudio() is always device id 1, and legacy + * SDL audio APIs assume you want this device ID. SDL_OpenAudioDevice() calls + * always returns devices >= 2 on success. The legacy calls are good both + * for backwards compatibility and when you don't care about multiple, + * specific, or capture devices. + */ +typedef Uint32 SDL_AudioDeviceID; + +/** + * Get the number of built-in audio devices. + * + * This function is only valid after successfully initializing the audio + * subsystem. + * + * Note that audio capture support is not implemented as of SDL 2.0.4, so the + * `iscapture` parameter is for future expansion and should always be zero for + * now. + * + * This function will return -1 if an explicit list of devices can't be + * determined. Returning -1 is not an error. For example, if SDL is set up to + * talk to a remote audio server, it can't list every one available on the + * Internet, but it will still allow a specific host to be specified in + * SDL_OpenAudioDevice(). + * + * In many common cases, when this function returns a value <= 0, it can still + * successfully open the default device (NULL for first argument of + * SDL_OpenAudioDevice()). + * + * This function may trigger a complete redetect of available hardware. It + * should not be called for each iteration of a loop, but rather once at the + * start of a loop: + * + * ```c + * // Don't do this: + * for (int i = 0; i < SDL_GetNumAudioDevices(0); i++) + * + * // do this instead: + * const int count = SDL_GetNumAudioDevices(0); + * for (int i = 0; i < count; ++i) { do_something_here(); } + * ``` + * + * \param iscapture zero to request playback devices, non-zero to request + * recording devices + * \returns the number of available devices exposed by the current driver or + * -1 if an explicit list of devices can't be determined. A return + * value of -1 does not necessarily mean an error condition. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDeviceName + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC int SDLCALL SDL_GetNumAudioDevices(int iscapture); + +/** + * Get the human-readable name of a specific audio device. + * + * This function is only valid after successfully initializing the audio + * subsystem. The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); re-call that function to redetect available + * hardware. + * + * The string returned by this function is UTF-8 encoded, read-only, and + * managed internally. You are not to free it. If you need to keep the string + * for any length of time, you should make your own copy of it, as it will be + * invalid next time any of several other SDL functions are called. + * + * \param index the index of the audio device; valid values range from 0 to + * SDL_GetNumAudioDevices() - 1 + * \param iscapture non-zero to query the list of recording devices, zero to + * query the list of output devices. + * \returns the name of the audio device at the requested index, or NULL on + * error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumAudioDevices + * \sa SDL_GetDefaultAudioInfo + */ +extern DECLSPEC const char *SDLCALL SDL_GetAudioDeviceName(int index, + int iscapture); + +/** + * Get the preferred audio format of a specific audio device. + * + * This function is only valid after a successfully initializing the audio + * subsystem. The values returned by this function reflect the latest call to + * SDL_GetNumAudioDevices(); re-call that function to redetect available + * hardware. + * + * `spec` will be filled with the sample rate, sample format, and channel + * count. + * + * \param index the index of the audio device; valid values range from 0 to + * SDL_GetNumAudioDevices() - 1 + * \param iscapture non-zero to query the list of recording devices, zero to + * query the list of output devices. + * \param spec The SDL_AudioSpec to be initialized by this function. + * \returns 0 on success, nonzero on error + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetNumAudioDevices + * \sa SDL_GetDefaultAudioInfo + */ +extern DECLSPEC int SDLCALL SDL_GetAudioDeviceSpec(int index, + int iscapture, + SDL_AudioSpec *spec); + + +/** + * Get the name and preferred format of the default audio device. + * + * Some (but not all!) platforms have an isolated mechanism to get information + * about the "default" device. This can actually be a completely different + * device that's not in the list you get from SDL_GetAudioDeviceSpec(). It can + * even be a network address! (This is discussed in SDL_OpenAudioDevice().) + * + * As a result, this call is not guaranteed to be performant, as it can query + * the sound server directly every time, unlike the other query functions. You + * should call this function sparingly! + * + * `spec` will be filled with the sample rate, sample format, and channel + * count, if a default device exists on the system. If `name` is provided, + * will be filled with either a dynamically-allocated UTF-8 string or NULL. + * + * \param name A pointer to be filled with the name of the default device (can + * be NULL). Please call SDL_free() when you are done with this + * pointer! + * \param spec The SDL_AudioSpec to be initialized by this function. + * \param iscapture non-zero to query the default recording device, zero to + * query the default output device. + * \returns 0 on success, nonzero on error + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetAudioDeviceName + * \sa SDL_GetAudioDeviceSpec + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC int SDLCALL SDL_GetDefaultAudioInfo(char **name, + SDL_AudioSpec *spec, + int iscapture); + + +/** + * Open a specific audio device. + * + * SDL_OpenAudio(), unlike this function, always acts on device ID 1. As such, + * this function will never return a 1 so as not to conflict with the legacy + * function. + * + * Please note that SDL 2.0 before 2.0.5 did not support recording; as such, + * this function would fail if `iscapture` was not zero. Starting with SDL + * 2.0.5, recording is implemented and this value can be non-zero. + * + * Passing in a `device` name of NULL requests the most reasonable default + * (and is equivalent to what SDL_OpenAudio() does to choose a device). The + * `device` name is a UTF-8 string reported by SDL_GetAudioDeviceName(), but + * some drivers allow arbitrary and driver-specific strings, such as a + * hostname/IP address for a remote audio server, or a filename in the + * diskaudio driver. + * + * An opened audio device starts out paused, and should be enabled for playing + * by calling SDL_PauseAudioDevice(devid, 0) when you are ready for your audio + * callback function to be called. Since the audio driver may modify the + * requested size of the audio buffer, you should allocate any local mixing + * buffers after you open the audio device. + * + * The audio callback runs in a separate thread in most cases; you can prevent + * race conditions between your callback and other threads without fully + * pausing playback with SDL_LockAudioDevice(). For more information about the + * callback, see SDL_AudioSpec. + * + * Managing the audio spec via 'desired' and 'obtained': + * + * When filling in the desired audio spec structure: + * + * - `desired->freq` should be the frequency in sample-frames-per-second (Hz). + * - `desired->format` should be the audio format (`AUDIO_S16SYS`, etc). + * - `desired->samples` is the desired size of the audio buffer, in _sample + * frames_ (with stereo output, two samples--left and right--would make a + * single sample frame). This number should be a power of two, and may be + * adjusted by the audio driver to a value more suitable for the hardware. + * Good values seem to range between 512 and 8096 inclusive, depending on + * the application and CPU speed. Smaller values reduce latency, but can + * lead to underflow if the application is doing heavy processing and cannot + * fill the audio buffer in time. Note that the number of sample frames is + * directly related to time by the following formula: `ms = + * (sampleframes*1000)/freq` + * - `desired->size` is the size in _bytes_ of the audio buffer, and is + * calculated by SDL_OpenAudioDevice(). You don't initialize this. + * - `desired->silence` is the value used to set the buffer to silence, and is + * calculated by SDL_OpenAudioDevice(). You don't initialize this. + * - `desired->callback` should be set to a function that will be called when + * the audio device is ready for more data. It is passed a pointer to the + * audio buffer, and the length in bytes of the audio buffer. This function + * usually runs in a separate thread, and so you should protect data + * structures that it accesses by calling SDL_LockAudioDevice() and + * SDL_UnlockAudioDevice() in your code. Alternately, you may pass a NULL + * pointer here, and call SDL_QueueAudio() with some frequency, to queue + * more audio samples to be played (or for capture devices, call + * SDL_DequeueAudio() with some frequency, to obtain audio samples). + * - `desired->userdata` is passed as the first parameter to your callback + * function. If you passed a NULL callback, this value is ignored. + * + * `allowed_changes` can have the following flags OR'd together: + * + * - `SDL_AUDIO_ALLOW_FREQUENCY_CHANGE` + * - `SDL_AUDIO_ALLOW_FORMAT_CHANGE` + * - `SDL_AUDIO_ALLOW_CHANNELS_CHANGE` + * - `SDL_AUDIO_ALLOW_SAMPLES_CHANGE` + * - `SDL_AUDIO_ALLOW_ANY_CHANGE` + * + * These flags specify how SDL should behave when a device cannot offer a + * specific feature. If the application requests a feature that the hardware + * doesn't offer, SDL will always try to get the closest equivalent. + * + * For example, if you ask for float32 audio format, but the sound card only + * supports int16, SDL will set the hardware to int16. If you had set + * SDL_AUDIO_ALLOW_FORMAT_CHANGE, SDL will change the format in the `obtained` + * structure. If that flag was *not* set, SDL will prepare to convert your + * callback's float32 audio to int16 before feeding it to the hardware and + * will keep the originally requested format in the `obtained` structure. + * + * The resulting audio specs, varying depending on hardware and on what + * changes were allowed, will then be written back to `obtained`. + * + * If your application can only handle one specific data format, pass a zero + * for `allowed_changes` and let SDL transparently handle any differences. + * + * \param device a UTF-8 string reported by SDL_GetAudioDeviceName() or a + * driver-specific name as appropriate. NULL requests the most + * reasonable default device. + * \param iscapture non-zero to specify a device should be opened for + * recording, not playback + * \param desired an SDL_AudioSpec structure representing the desired output + * format; see SDL_OpenAudio() for more information + * \param obtained an SDL_AudioSpec structure filled in with the actual output + * format; see SDL_OpenAudio() for more information + * \param allowed_changes 0, or one or more flags OR'd together + * \returns a valid device ID that is > 0 on success or 0 on failure; call + * SDL_GetError() for more information. + * + * For compatibility with SDL 1.2, this will never return 1, since + * SDL reserves that ID for the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CloseAudioDevice + * \sa SDL_GetAudioDeviceName + * \sa SDL_LockAudioDevice + * \sa SDL_OpenAudio + * \sa SDL_PauseAudioDevice + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC SDL_AudioDeviceID SDLCALL SDL_OpenAudioDevice( + const char *device, + int iscapture, + const SDL_AudioSpec *desired, + SDL_AudioSpec *obtained, + int allowed_changes); + + + +/** + * \name Audio state + * + * Get the current audio state. + */ +/* @{ */ +typedef enum +{ + SDL_AUDIO_STOPPED = 0, + SDL_AUDIO_PLAYING, + SDL_AUDIO_PAUSED +} SDL_AudioStatus; + +/** + * This function is a legacy means of querying the audio device. + * + * New programs might want to use SDL_GetAudioDeviceStatus() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_GetAudioDeviceStatus(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \returns the SDL_AudioStatus of the audio device opened by SDL_OpenAudio(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioDeviceStatus + */ +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioStatus(void); + +/** + * Use this function to get the current audio state of an audio device. + * + * \param dev the ID of an audio device previously opened with + * SDL_OpenAudioDevice() + * \returns the SDL_AudioStatus of the specified audio device. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PauseAudioDevice + */ +extern DECLSPEC SDL_AudioStatus SDLCALL SDL_GetAudioDeviceStatus(SDL_AudioDeviceID dev); +/* @} *//* Audio State */ + +/** + * \name Pause audio functions + * + * These functions pause and unpause the audio callback processing. + * They should be called with a parameter of 0 after opening the audio + * device to start playing sound. This is so you can safely initialize + * data for your callback function after opening the audio device. + * Silence will be written to the audio device during the pause. + */ +/* @{ */ + +/** + * This function is a legacy means of pausing the audio device. + * + * New programs might want to use SDL_PauseAudioDevice() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_PauseAudioDevice(1, pause_on); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \param pause_on non-zero to pause, 0 to unpause + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetAudioStatus + * \sa SDL_PauseAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_PauseAudio(int pause_on); + +/** + * Use this function to pause and unpause audio playback on a specified + * device. + * + * This function pauses and unpauses the audio callback processing for a given + * device. Newly-opened audio devices start in the paused state, so you must + * call this function with **pause_on**=0 after opening the specified audio + * device to start playing sound. This allows you to safely initialize data + * for your callback function after opening the audio device. Silence will be + * written to the audio device while paused, and the audio callback is + * guaranteed to not be called. Pausing one device does not prevent other + * unpaused devices from running their callbacks. + * + * Pausing state does not stack; even if you pause a device several times, a + * single unpause will start the device playing again, and vice versa. This is + * different from how SDL_LockAudioDevice() works. + * + * If you just need to protect a few variables from race conditions vs your + * callback, you shouldn't pause the audio device, as it will lead to dropouts + * in the audio playback. Instead, you should use SDL_LockAudioDevice(). + * + * \param dev a device opened by SDL_OpenAudioDevice() + * \param pause_on non-zero to pause, 0 to unpause + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_PauseAudioDevice(SDL_AudioDeviceID dev, + int pause_on); +/* @} *//* Pause audio functions */ + +/** + * Load the audio data of a WAVE file into memory. + * + * Loading a WAVE file requires `src`, `spec`, `audio_buf` and `audio_len` to + * be valid pointers. The entire data portion of the file is then loaded into + * memory and decoded if necessary. + * + * If `freesrc` is non-zero, the data source gets automatically closed and + * freed before the function returns. + * + * Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and + * 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and + * A-law and mu-law (8 bits). Other formats are currently unsupported and + * cause an error. + * + * If this function succeeds, the pointer returned by it is equal to `spec` + * and the pointer to the audio data allocated by the function is written to + * `audio_buf` and its length in bytes to `audio_len`. The SDL_AudioSpec + * members `freq`, `channels`, and `format` are set to the values of the audio + * data in the buffer. The `samples` member is set to a sane default and all + * others are set to zero. + * + * It's necessary to use SDL_FreeWAV() to free the audio data returned in + * `audio_buf` when it is no longer used. + * + * Because of the underspecification of the .WAV format, there are many + * problematic files in the wild that cause issues with strict decoders. To + * provide compatibility with these files, this decoder is lenient in regards + * to the truncation of the file, the fact chunk, and the size of the RIFF + * chunk. The hints `SDL_HINT_WAVE_RIFF_CHUNK_SIZE`, + * `SDL_HINT_WAVE_TRUNCATION`, and `SDL_HINT_WAVE_FACT_CHUNK` can be used to + * tune the behavior of the loading process. + * + * Any file that is invalid (due to truncation, corruption, or wrong values in + * the headers), too big, or unsupported causes an error. Additionally, any + * critical I/O error from the data source will terminate the loading process + * with an error. The function returns NULL on error and in all cases (with + * the exception of `src` being NULL), an appropriate error message will be + * set. + * + * It is required that the data source supports seeking. + * + * Example: + * + * ```c + * SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, &spec, &buf, &len); + * ``` + * + * Note that the SDL_LoadWAV macro does this same thing for you, but in a less + * messy way: + * + * ```c + * SDL_LoadWAV("sample.wav", &spec, &buf, &len); + * ``` + * + * \param src The data source for the WAVE data + * \param freesrc If non-zero, SDL will _always_ free the data source + * \param spec An SDL_AudioSpec that will be filled in with the wave file's + * format details + * \param audio_buf A pointer filled with the audio data, allocated by the + * function. + * \param audio_len A pointer filled with the length of the audio data buffer + * in bytes + * \returns This function, if successfully called, returns `spec`, which will + * be filled with the audio data format of the wave source data. + * `audio_buf` will be filled with a pointer to an allocated buffer + * containing the audio data, and `audio_len` is filled with the + * length of that audio buffer in bytes. + * + * This function returns NULL if the .WAV file cannot be opened, uses + * an unknown data format, or is corrupt; call SDL_GetError() for + * more information. + * + * When the application is done with the data returned in + * `audio_buf`, it should call SDL_FreeWAV() to dispose of it. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeWAV + * \sa SDL_LoadWAV + */ +extern DECLSPEC SDL_AudioSpec *SDLCALL SDL_LoadWAV_RW(SDL_RWops * src, + int freesrc, + SDL_AudioSpec * spec, + Uint8 ** audio_buf, + Uint32 * audio_len); + +/** + * Loads a WAV from a file. + * Compatibility convenience function. + */ +#define SDL_LoadWAV(file, spec, audio_buf, audio_len) \ + SDL_LoadWAV_RW(SDL_RWFromFile(file, "rb"),1, spec,audio_buf,audio_len) + +/** + * Free data previously allocated with SDL_LoadWAV() or SDL_LoadWAV_RW(). + * + * After a WAVE file has been opened with SDL_LoadWAV() or SDL_LoadWAV_RW() + * its data can eventually be freed with SDL_FreeWAV(). It is safe to call + * this function with a NULL pointer. + * + * \param audio_buf a pointer to the buffer created by SDL_LoadWAV() or + * SDL_LoadWAV_RW() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadWAV + * \sa SDL_LoadWAV_RW + */ +extern DECLSPEC void SDLCALL SDL_FreeWAV(Uint8 * audio_buf); + +/** + * Initialize an SDL_AudioCVT structure for conversion. + * + * Before an SDL_AudioCVT structure can be used to convert audio data it must + * be initialized with source and destination information. + * + * This function will zero out every field of the SDL_AudioCVT, so it must be + * called before the application fills in the final buffer information. + * + * Once this function has returned successfully, and reported that a + * conversion is necessary, the application fills in the rest of the fields in + * SDL_AudioCVT, now that it knows how large a buffer it needs to allocate, + * and then can call SDL_ConvertAudio() to complete the conversion. + * + * \param cvt an SDL_AudioCVT structure filled in with audio conversion + * information + * \param src_format the source format of the audio data; for more info see + * SDL_AudioFormat + * \param src_channels the number of channels in the source + * \param src_rate the frequency (sample-frames-per-second) of the source + * \param dst_format the destination format of the audio data; for more info + * see SDL_AudioFormat + * \param dst_channels the number of channels in the destination + * \param dst_rate the frequency (sample-frames-per-second) of the destination + * \returns 1 if the audio filter is prepared, 0 if no conversion is needed, + * or a negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ConvertAudio + */ +extern DECLSPEC int SDLCALL SDL_BuildAudioCVT(SDL_AudioCVT * cvt, + SDL_AudioFormat src_format, + Uint8 src_channels, + int src_rate, + SDL_AudioFormat dst_format, + Uint8 dst_channels, + int dst_rate); + +/** + * Convert audio data to a desired audio format. + * + * This function does the actual audio data conversion, after the application + * has called SDL_BuildAudioCVT() to prepare the conversion information and + * then filled in the buffer details. + * + * Once the application has initialized the `cvt` structure using + * SDL_BuildAudioCVT(), allocated an audio buffer and filled it with audio + * data in the source format, this function will convert the buffer, in-place, + * to the desired format. + * + * The data conversion may go through several passes; any given pass may + * possibly temporarily increase the size of the data. For example, SDL might + * expand 16-bit data to 32 bits before resampling to a lower frequency, + * shrinking the data size after having grown it briefly. Since the supplied + * buffer will be both the source and destination, converting as necessary + * in-place, the application must allocate a buffer that will fully contain + * the data during its largest conversion pass. After SDL_BuildAudioCVT() + * returns, the application should set the `cvt->len` field to the size, in + * bytes, of the source data, and allocate a buffer that is `cvt->len * + * cvt->len_mult` bytes long for the `buf` field. + * + * The source data should be copied into this buffer before the call to + * SDL_ConvertAudio(). Upon successful return, this buffer will contain the + * converted audio, and `cvt->len_cvt` will be the size of the converted data, + * in bytes. Any bytes in the buffer past `cvt->len_cvt` are undefined once + * this function returns. + * + * \param cvt an SDL_AudioCVT structure that was previously set up by + * SDL_BuildAudioCVT(). + * \returns 0 if the conversion was completed successfully or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BuildAudioCVT + */ +extern DECLSPEC int SDLCALL SDL_ConvertAudio(SDL_AudioCVT * cvt); + +/* SDL_AudioStream is a new audio conversion interface. + The benefits vs SDL_AudioCVT: + - it can handle resampling data in chunks without generating + artifacts, when it doesn't have the complete buffer available. + - it can handle incoming data in any variable size. + - You push data as you have it, and pull it when you need it + */ +/* this is opaque to the outside world. */ +struct _SDL_AudioStream; +typedef struct _SDL_AudioStream SDL_AudioStream; + +/** + * Create a new audio stream. + * + * \param src_format The format of the source audio + * \param src_channels The number of channels of the source audio + * \param src_rate The sampling rate of the source audio + * \param dst_format The format of the desired audio output + * \param dst_channels The number of channels of the desired audio output + * \param dst_rate The sampling rate of the desired audio output + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC SDL_AudioStream * SDLCALL SDL_NewAudioStream(const SDL_AudioFormat src_format, + const Uint8 src_channels, + const int src_rate, + const SDL_AudioFormat dst_format, + const Uint8 dst_channels, + const int dst_rate); + +/** + * Add data to be converted/resampled to the stream. + * + * \param stream The stream the audio data is being added to + * \param buf A pointer to the audio data to add + * \param len The number of bytes to write to the stream + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamPut(SDL_AudioStream *stream, const void *buf, int len); + +/** + * Get converted/resampled data from the stream + * + * \param stream The stream the audio is being requested from + * \param buf A buffer to fill with audio data + * \param len The maximum number of bytes to fill + * \returns the number of bytes read from the stream, or -1 on error + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamGet(SDL_AudioStream *stream, void *buf, int len); + +/** + * Get the number of converted/resampled bytes available. + * + * The stream may be buffering data behind the scenes until it has enough to + * resample correctly, so this number might be lower than what you expect, or + * even be zero. Add more data or flush the stream if you need the data now. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamAvailable(SDL_AudioStream *stream); + +/** + * Tell the stream that you're done sending data, and anything being buffered + * should be converted/resampled and made available immediately. + * + * It is legal to add more data to a stream after flushing, but there will be + * audio gaps in the output. Generally this is intended to signal the end of + * input, so the complete output becomes available. + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamClear + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC int SDLCALL SDL_AudioStreamFlush(SDL_AudioStream *stream); + +/** + * Clear any pending data in the stream without converting it + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_FreeAudioStream + */ +extern DECLSPEC void SDLCALL SDL_AudioStreamClear(SDL_AudioStream *stream); + +/** + * Free an audio stream + * + * \since This function is available since SDL 2.0.7. + * + * \sa SDL_NewAudioStream + * \sa SDL_AudioStreamPut + * \sa SDL_AudioStreamGet + * \sa SDL_AudioStreamAvailable + * \sa SDL_AudioStreamFlush + * \sa SDL_AudioStreamClear + */ +extern DECLSPEC void SDLCALL SDL_FreeAudioStream(SDL_AudioStream *stream); + +#define SDL_MIX_MAXVOLUME 128 + +/** + * This function is a legacy means of mixing audio. + * + * This function is equivalent to calling... + * + * ```c + * SDL_MixAudioFormat(dst, src, format, len, volume); + * ``` + * + * ...where `format` is the obtained format of the audio device from the + * legacy SDL_OpenAudio() function. + * + * \param dst the destination for the mixed audio + * \param src the source audio buffer to be mixed + * \param len the length of the audio buffer in bytes + * \param volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MixAudioFormat + */ +extern DECLSPEC void SDLCALL SDL_MixAudio(Uint8 * dst, const Uint8 * src, + Uint32 len, int volume); + +/** + * Mix audio data in a specified format. + * + * This takes an audio buffer `src` of `len` bytes of `format` data and mixes + * it into `dst`, performing addition, volume adjustment, and overflow + * clipping. The buffer pointed to by `dst` must also be `len` bytes of + * `format` data. + * + * This is provided for convenience -- you can mix your own audio data. + * + * Do not use this function for mixing together more than two streams of + * sample data. The output from repeated application of this function may be + * distorted by clipping, because there is no accumulator with greater range + * than the input (not to mention this being an inefficient way of doing it). + * + * It is a common misconception that this function is required to write audio + * data to an output stream in an audio callback. While you can do that, + * SDL_MixAudioFormat() is really only needed when you're mixing a single + * audio stream with a volume adjustment. + * + * \param dst the destination for the mixed audio + * \param src the source audio buffer to be mixed + * \param format the SDL_AudioFormat structure representing the desired audio + * format + * \param len the length of the audio buffer in bytes + * \param volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME + * for full audio volume + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_MixAudioFormat(Uint8 * dst, + const Uint8 * src, + SDL_AudioFormat format, + Uint32 len, int volume); + +/** + * Queue more audio on non-callback devices. + * + * If you are looking to retrieve queued audio from a non-callback capture + * device, you want SDL_DequeueAudio() instead. SDL_QueueAudio() will return + * -1 to signify an error if you use it with capture devices. + * + * SDL offers two ways to feed audio to the device: you can either supply a + * callback that SDL triggers with some frequency to obtain more audio (pull + * method), or you can supply no callback, and then SDL will expect you to + * supply data at regular intervals (push method) with this function. + * + * There are no limits on the amount of data you can queue, short of + * exhaustion of address space. Queued data will drain to the device as + * necessary without further intervention from you. If the device needs audio + * but there is not enough queued, it will play silence to make up the + * difference. This means you will have skips in your audio playback if you + * aren't routinely queueing sufficient data. + * + * This function copies the supplied data, so you are safe to free it when the + * function returns. This function is thread-safe, but queueing to the same + * device from two threads at once does not promise which buffer will be + * queued first. + * + * You may not queue audio on a device that is using an application-supplied + * callback; doing so returns an error. You have to use the audio callback or + * queue audio with this function, but not both. + * + * You should not call SDL_LockAudio() on the device before queueing; SDL + * handles locking internally for this function. + * + * Note that SDL2 does not support planar audio. You will need to resample + * from planar audio formats into a non-planar one (see SDL_AudioFormat) + * before queuing audio. + * + * \param dev the device ID to which we will queue audio + * \param data the data to queue to the device for later playback + * \param len the number of bytes (not samples!) to which `data` points + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_GetQueuedAudioSize + */ +extern DECLSPEC int SDLCALL SDL_QueueAudio(SDL_AudioDeviceID dev, const void *data, Uint32 len); + +/** + * Dequeue more audio on non-callback devices. + * + * If you are looking to queue audio for output on a non-callback playback + * device, you want SDL_QueueAudio() instead. SDL_DequeueAudio() will always + * return 0 if you use it with playback devices. + * + * SDL offers two ways to retrieve audio from a capture device: you can either + * supply a callback that SDL triggers with some frequency as the device + * records more audio data, (push method), or you can supply no callback, and + * then SDL will expect you to retrieve data at regular intervals (pull + * method) with this function. + * + * There are no limits on the amount of data you can queue, short of + * exhaustion of address space. Data from the device will keep queuing as + * necessary without further intervention from you. This means you will + * eventually run out of memory if you aren't routinely dequeueing data. + * + * Capture devices will not queue data when paused; if you are expecting to + * not need captured audio for some length of time, use SDL_PauseAudioDevice() + * to stop the capture device from queueing more data. This can be useful + * during, say, level loading times. When unpaused, capture devices will start + * queueing data from that point, having flushed any capturable data available + * while paused. + * + * This function is thread-safe, but dequeueing from the same device from two + * threads at once does not promise which thread will dequeue data first. + * + * You may not dequeue audio from a device that is using an + * application-supplied callback; doing so returns an error. You have to use + * the audio callback, or dequeue audio with this function, but not both. + * + * You should not call SDL_LockAudio() on the device before dequeueing; SDL + * handles locking internally for this function. + * + * \param dev the device ID from which we will dequeue audio + * \param data a pointer into where audio data should be copied + * \param len the number of bytes (not samples!) to which (data) points + * \returns the number of bytes dequeued, which could be less than requested; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_GetQueuedAudioSize + */ +extern DECLSPEC Uint32 SDLCALL SDL_DequeueAudio(SDL_AudioDeviceID dev, void *data, Uint32 len); + +/** + * Get the number of bytes of still-queued audio. + * + * For playback devices: this is the number of bytes that have been queued for + * playback with SDL_QueueAudio(), but have not yet been sent to the hardware. + * + * Once we've sent it to the hardware, this function can not decide the exact + * byte boundary of what has been played. It's possible that we just gave the + * hardware several kilobytes right before you called this function, but it + * hasn't played any of it yet, or maybe half of it, etc. + * + * For capture devices, this is the number of bytes that have been captured by + * the device and are waiting for you to dequeue. This number may grow at any + * time, so this only informs of the lower-bound of available data. + * + * You may not queue or dequeue audio on a device that is using an + * application-supplied callback; calling this function on such a device + * always returns 0. You have to use the audio callback or queue audio, but + * not both. + * + * You should not call SDL_LockAudio() on the device before querying; SDL + * handles locking internally for this function. + * + * \param dev the device ID of which we will query queued audio size + * \returns the number of bytes (not samples!) of queued audio. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_ClearQueuedAudio + * \sa SDL_QueueAudio + * \sa SDL_DequeueAudio + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetQueuedAudioSize(SDL_AudioDeviceID dev); + +/** + * Drop any queued audio data waiting to be sent to the hardware. + * + * Immediately after this call, SDL_GetQueuedAudioSize() will return 0. For + * output devices, the hardware will start playing silence if more audio isn't + * queued. For capture devices, the hardware will start filling the empty + * queue with new data if the capture device isn't paused. + * + * This will not prevent playback of queued audio that's already been sent to + * the hardware, as we can not undo that, so expect there to be some fraction + * of a second of audio that might still be heard. This can be useful if you + * want to, say, drop any pending music or any unprocessed microphone input + * during a level change in your game. + * + * You may not queue or dequeue audio on a device that is using an + * application-supplied callback; calling this function on such a device + * always returns 0. You have to use the audio callback or queue audio, but + * not both. + * + * You should not call SDL_LockAudio() on the device before clearing the + * queue; SDL handles locking internally for this function. + * + * This function always succeeds and thus returns void. + * + * \param dev the device ID of which to clear the audio queue + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetQueuedAudioSize + * \sa SDL_QueueAudio + * \sa SDL_DequeueAudio + */ +extern DECLSPEC void SDLCALL SDL_ClearQueuedAudio(SDL_AudioDeviceID dev); + + +/** + * \name Audio lock functions + * + * The lock manipulated by these functions protects the callback function. + * During a SDL_LockAudio()/SDL_UnlockAudio() pair, you can be guaranteed that + * the callback function is not running. Do not call these from the callback + * function or you will cause deadlock. + */ +/* @{ */ + +/** + * This function is a legacy means of locking the audio device. + * + * New programs might want to use SDL_LockAudioDevice() instead. This function + * is equivalent to calling... + * + * ```c + * SDL_LockAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + * \sa SDL_UnlockAudio + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_LockAudio(void); + +/** + * Use this function to lock out the audio callback function for a specified + * device. + * + * The lock manipulated by these functions protects the audio callback + * function specified in SDL_OpenAudioDevice(). During a + * SDL_LockAudioDevice()/SDL_UnlockAudioDevice() pair, you can be guaranteed + * that the callback function for that device is not running, even if the + * device is not paused. While a device is locked, any other unpaused, + * unlocked devices may still run their callbacks. + * + * Calling this function from inside your audio callback is unnecessary. SDL + * obtains this lock before calling your function, and releases it when the + * function returns. + * + * You should not hold the lock longer than absolutely necessary. If you hold + * it too long, you'll experience dropouts in your audio playback. Ideally, + * your application locks the device, sets a few variables and unlocks again. + * Do not do heavy work while holding the lock for a device. + * + * It is safe to lock the audio device multiple times, as long as you unlock + * it an equivalent number of times. The callback will not run until the + * device has been unlocked completely in this way. If your application fails + * to unlock the device appropriately, your callback will never run, you might + * hear repeating bursts of audio, and SDL_CloseAudioDevice() will probably + * deadlock. + * + * Internally, the audio device lock is a mutex; if you lock from two threads + * at once, not only will you block the audio callback, you'll block the other + * thread. + * + * \param dev the ID of the device to be locked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_LockAudioDevice(SDL_AudioDeviceID dev); + +/** + * This function is a legacy means of unlocking the audio device. + * + * New programs might want to use SDL_UnlockAudioDevice() instead. This + * function is equivalent to calling... + * + * ```c + * SDL_UnlockAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudio + * \sa SDL_UnlockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_UnlockAudio(void); + +/** + * Use this function to unlock the audio callback function for a specified + * device. + * + * This function should be paired with a previous SDL_LockAudioDevice() call. + * + * \param dev the ID of the device to be unlocked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_UnlockAudioDevice(SDL_AudioDeviceID dev); +/* @} *//* Audio lock functions */ + +/** + * This function is a legacy means of closing the audio device. + * + * This function is equivalent to calling... + * + * ```c + * SDL_CloseAudioDevice(1); + * ``` + * + * ...and is only useful if you used the legacy SDL_OpenAudio() function. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_OpenAudio + */ +extern DECLSPEC void SDLCALL SDL_CloseAudio(void); + +/** + * Use this function to shut down audio processing and close the audio device. + * + * The application should close open audio devices once they are no longer + * needed. Calling this function will wait until the device's audio callback + * is not running, release the audio hardware and then clean up internal + * state. No further audio will play from this device once this function + * returns. + * + * This function may block briefly while pending audio data is played by the + * hardware, so that applications don't drop the last buffer of data they + * supplied. + * + * The device ID is invalid as soon as the device is closed, and is eligible + * for reuse in a new SDL_OpenAudioDevice() call immediately. + * + * \param dev an audio device previously opened with SDL_OpenAudioDevice() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_OpenAudioDevice + */ +extern DECLSPEC void SDLCALL SDL_CloseAudioDevice(SDL_AudioDeviceID dev); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_audio_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_bits.h b/include/SDL/SDL_bits.h new file mode 100644 index 0000000..81161ae --- /dev/null +++ b/include/SDL/SDL_bits.h @@ -0,0 +1,126 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_bits.h + * + * Functions for fiddling with bits and bitmasks. + */ + +#ifndef SDL_bits_h_ +#define SDL_bits_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_bits.h + */ + +/** + * Get the index of the most significant bit. Result is undefined when called + * with 0. This operation can also be stated as "count leading zeroes" and + * "log base 2". + * + * \return the index of the most significant bit, or -1 if the value is 0. + */ +#if defined(__WATCOMC__) && defined(__386__) +extern __inline int _SDL_bsr_watcom(Uint32); +#pragma aux _SDL_bsr_watcom = \ + "bsr eax, eax" \ + parm [eax] nomemory \ + value [eax] \ + modify exact [eax] nomemory; +#endif + +SDL_FORCE_INLINE int +SDL_MostSignificantBitIndex32(Uint32 x) +{ +#if defined(__GNUC__) && (__GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) + /* Count Leading Zeroes builtin in GCC. + * http://gcc.gnu.org/onlinedocs/gcc-4.3.4/gcc/Other-Builtins.html + */ + if (x == 0) { + return -1; + } + return 31 - __builtin_clz(x); +#elif defined(__WATCOMC__) && defined(__386__) + if (x == 0) { + return -1; + } + return _SDL_bsr_watcom(x); +#elif defined(_MSC_VER) + unsigned long index; + if (_BitScanReverse(&index, x)) { + return index; + } + return -1; +#else + /* Based off of Bit Twiddling Hacks by Sean Eron Anderson + * , released in the public domain. + * http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog + */ + const Uint32 b[] = {0x2, 0xC, 0xF0, 0xFF00, 0xFFFF0000}; + const int S[] = {1, 2, 4, 8, 16}; + + int msbIndex = 0; + int i; + + if (x == 0) { + return -1; + } + + for (i = 4; i >= 0; i--) + { + if (x & b[i]) + { + x >>= S[i]; + msbIndex |= S[i]; + } + } + + return msbIndex; +#endif +} + +SDL_FORCE_INLINE SDL_bool +SDL_HasExactlyOneBitSet32(Uint32 x) +{ + if (x && !(x & (x - 1))) { + return SDL_TRUE; + } + return SDL_FALSE; +} + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_bits_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_blendmode.h b/include/SDL/SDL_blendmode.h new file mode 100644 index 0000000..b862116 --- /dev/null +++ b/include/SDL/SDL_blendmode.h @@ -0,0 +1,198 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_blendmode.h + * + * Header file declaring the SDL_BlendMode enumeration + */ + +#ifndef SDL_blendmode_h_ +#define SDL_blendmode_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The blend mode used in SDL_RenderCopy() and drawing operations. + */ +typedef enum +{ + SDL_BLENDMODE_NONE = 0x00000000, /**< no blending + dstRGBA = srcRGBA */ + SDL_BLENDMODE_BLEND = 0x00000001, /**< alpha blending + dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)) + dstA = srcA + (dstA * (1-srcA)) */ + SDL_BLENDMODE_ADD = 0x00000002, /**< additive blending + dstRGB = (srcRGB * srcA) + dstRGB + dstA = dstA */ + SDL_BLENDMODE_MOD = 0x00000004, /**< color modulate + dstRGB = srcRGB * dstRGB + dstA = dstA */ + SDL_BLENDMODE_MUL = 0x00000008, /**< color multiply + dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)) + dstA = (srcA * dstA) + (dstA * (1-srcA)) */ + SDL_BLENDMODE_INVALID = 0x7FFFFFFF + + /* Additional custom blend modes can be returned by SDL_ComposeCustomBlendMode() */ + +} SDL_BlendMode; + +/** + * \brief The blend operation used when combining source and destination pixel components + */ +typedef enum +{ + SDL_BLENDOPERATION_ADD = 0x1, /**< dst + src: supported by all renderers */ + SDL_BLENDOPERATION_SUBTRACT = 0x2, /**< dst - src : supported by D3D9, D3D11, OpenGL, OpenGLES */ + SDL_BLENDOPERATION_REV_SUBTRACT = 0x3, /**< src - dst : supported by D3D9, D3D11, OpenGL, OpenGLES */ + SDL_BLENDOPERATION_MINIMUM = 0x4, /**< min(dst, src) : supported by D3D9, D3D11 */ + SDL_BLENDOPERATION_MAXIMUM = 0x5 /**< max(dst, src) : supported by D3D9, D3D11 */ +} SDL_BlendOperation; + +/** + * \brief The normalized factor used to multiply pixel components + */ +typedef enum +{ + SDL_BLENDFACTOR_ZERO = 0x1, /**< 0, 0, 0, 0 */ + SDL_BLENDFACTOR_ONE = 0x2, /**< 1, 1, 1, 1 */ + SDL_BLENDFACTOR_SRC_COLOR = 0x3, /**< srcR, srcG, srcB, srcA */ + SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = 0x4, /**< 1-srcR, 1-srcG, 1-srcB, 1-srcA */ + SDL_BLENDFACTOR_SRC_ALPHA = 0x5, /**< srcA, srcA, srcA, srcA */ + SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = 0x6, /**< 1-srcA, 1-srcA, 1-srcA, 1-srcA */ + SDL_BLENDFACTOR_DST_COLOR = 0x7, /**< dstR, dstG, dstB, dstA */ + SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = 0x8, /**< 1-dstR, 1-dstG, 1-dstB, 1-dstA */ + SDL_BLENDFACTOR_DST_ALPHA = 0x9, /**< dstA, dstA, dstA, dstA */ + SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = 0xA /**< 1-dstA, 1-dstA, 1-dstA, 1-dstA */ +} SDL_BlendFactor; + +/** + * Compose a custom blend mode for renderers. + * + * The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept + * the SDL_BlendMode returned by this function if the renderer supports it. + * + * A blend mode controls how the pixels from a drawing operation (source) get + * combined with the pixels from the render target (destination). First, the + * components of the source and destination pixels get multiplied with their + * blend factors. Then, the blend operation takes the two products and + * calculates the result that will get stored in the render target. + * + * Expressed in pseudocode, it would look like this: + * + * ```c + * dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor); + * dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor); + * ``` + * + * Where the functions `colorOperation(src, dst)` and `alphaOperation(src, + * dst)` can return one of the following: + * + * - `src + dst` + * - `src - dst` + * - `dst - src` + * - `min(src, dst)` + * - `max(src, dst)` + * + * The red, green, and blue components are always multiplied with the first, + * second, and third components of the SDL_BlendFactor, respectively. The + * fourth component is not used. + * + * The alpha component is always multiplied with the fourth component of the + * SDL_BlendFactor. The other components are not used in the alpha + * calculation. + * + * Support for these blend modes varies for each renderer. To check if a + * specific SDL_BlendMode is supported, create a renderer and pass it to + * either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will + * return with an error if the blend mode is not supported. + * + * This list describes the support of custom blend modes for each renderer in + * SDL 2.0.6. All renderers support the four blend modes listed in the + * SDL_BlendMode enumeration. + * + * - **direct3d**: Supports all operations with all factors. However, some + * factors produce unexpected results with `SDL_BLENDOPERATION_MINIMUM` and + * `SDL_BLENDOPERATION_MAXIMUM`. + * - **direct3d11**: Same as Direct3D 9. + * - **opengl**: Supports the `SDL_BLENDOPERATION_ADD` operation with all + * factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly with SDL + * 2.0.6. + * - **opengles**: Supports the `SDL_BLENDOPERATION_ADD` operation with all + * factors. Color and alpha factors need to be the same. OpenGL ES 1 + * implementation specific: May also support `SDL_BLENDOPERATION_SUBTRACT` + * and `SDL_BLENDOPERATION_REV_SUBTRACT`. May support color and alpha + * operations being different from each other. May support color and alpha + * factors being different from each other. + * - **opengles2**: Supports the `SDL_BLENDOPERATION_ADD`, + * `SDL_BLENDOPERATION_SUBTRACT`, `SDL_BLENDOPERATION_REV_SUBTRACT` + * operations with all factors. + * - **psp**: No custom blend mode support. + * - **software**: No custom blend mode support. + * + * Some renderers do not provide an alpha component for the default render + * target. The `SDL_BLENDFACTOR_DST_ALPHA` and + * `SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA` factors do not have an effect in this + * case. + * + * \param srcColorFactor the SDL_BlendFactor applied to the red, green, and + * blue components of the source pixels + * \param dstColorFactor the SDL_BlendFactor applied to the red, green, and + * blue components of the destination pixels + * \param colorOperation the SDL_BlendOperation used to combine the red, + * green, and blue components of the source and + * destination pixels + * \param srcAlphaFactor the SDL_BlendFactor applied to the alpha component of + * the source pixels + * \param dstAlphaFactor the SDL_BlendFactor applied to the alpha component of + * the destination pixels + * \param alphaOperation the SDL_BlendOperation used to combine the alpha + * component of the source and destination pixels + * \returns an SDL_BlendMode that represents the chosen factors and + * operations. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_GetRenderDrawBlendMode + * \sa SDL_SetTextureBlendMode + * \sa SDL_GetTextureBlendMode + */ +extern DECLSPEC SDL_BlendMode SDLCALL SDL_ComposeCustomBlendMode(SDL_BlendFactor srcColorFactor, + SDL_BlendFactor dstColorFactor, + SDL_BlendOperation colorOperation, + SDL_BlendFactor srcAlphaFactor, + SDL_BlendFactor dstAlphaFactor, + SDL_BlendOperation alphaOperation); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_blendmode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_clipboard.h b/include/SDL/SDL_clipboard.h new file mode 100644 index 0000000..7c351fb --- /dev/null +++ b/include/SDL/SDL_clipboard.h @@ -0,0 +1,141 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_clipboard.h + * + * Include file for SDL clipboard handling + */ + +#ifndef SDL_clipboard_h_ +#define SDL_clipboard_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * Put UTF-8 text into the clipboard. + * + * \param text the text to store in the clipboard + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetClipboardText + * \sa SDL_HasClipboardText + */ +extern DECLSPEC int SDLCALL SDL_SetClipboardText(const char *text); + +/** + * Get UTF-8 text from the clipboard, which must be freed with SDL_free(). + * + * This functions returns empty string if there was not enough memory left for + * a copy of the clipboard's content. + * + * \returns the clipboard text on success or an empty string on failure; call + * SDL_GetError() for more information. Caller must call SDL_free() + * on the returned pointer when done with it (even if there was an + * error). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasClipboardText + * \sa SDL_SetClipboardText + */ +extern DECLSPEC char * SDLCALL SDL_GetClipboardText(void); + +/** + * Query whether the clipboard exists and contains a non-empty text string. + * + * \returns SDL_TRUE if the clipboard has text, or SDL_FALSE if it does not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetClipboardText + * \sa SDL_SetClipboardText + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasClipboardText(void); + +/** + * Put UTF-8 text into the primary selection. + * + * \param text the text to store in the primary selection + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetPrimarySelectionText + * \sa SDL_HasPrimarySelectionText + */ +extern DECLSPEC int SDLCALL SDL_SetPrimarySelectionText(const char *text); + +/** + * Get UTF-8 text from the primary selection, which must be freed with + * SDL_free(). + * + * This functions returns empty string if there was not enough memory left for + * a copy of the primary selection's content. + * + * \returns the primary selection text on success or an empty string on + * failure; call SDL_GetError() for more information. Caller must + * call SDL_free() on the returned pointer when done with it (even if + * there was an error). + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_HasPrimarySelectionText + * \sa SDL_SetPrimarySelectionText + */ +extern DECLSPEC char * SDLCALL SDL_GetPrimarySelectionText(void); + +/** + * Query whether the primary selection exists and contains a non-empty text + * string. + * + * \returns SDL_TRUE if the primary selection has text, or SDL_FALSE if it + * does not. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetPrimarySelectionText + * \sa SDL_SetPrimarySelectionText + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasPrimarySelectionText(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_clipboard_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_config.h b/include/SDL/SDL_config.h new file mode 100644 index 0000000..01322c1 --- /dev/null +++ b/include/SDL/SDL_config.h @@ -0,0 +1,331 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_config_windows_h_ +#define SDL_config_windows_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* winsdkver.h defines _WIN32_MAXVER for SDK version detection. It is present since at least the Windows 7 SDK, + * but out of caution we'll only use it if the compiler supports __has_include() to confirm its presence. + * If your compiler doesn't support __has_include() but you have winsdkver.h, define HAVE_WINSDKVER_H. */ +#if !defined(HAVE_WINSDKVER_H) && defined(__has_include) +#if __has_include() +#define HAVE_WINSDKVER_H 1 +#endif +#endif + +#ifdef HAVE_WINSDKVER_H +#include +#endif + +/* sdkddkver.h defines more specific SDK version numbers. This is needed because older versions of the + * Windows 10 SDK have broken declarations for the C API for DirectX 12. */ +#if !defined(HAVE_SDKDDKVER_H) && defined(__has_include) +#if __has_include() +#define HAVE_SDKDDKVER_H 1 +#endif +#endif + +#ifdef HAVE_SDKDDKVER_H +#include +#endif + +/* This is a set of defines to configure the SDL features */ + +#if !defined(HAVE_STDINT_H) && !defined(_STDINT_H_) +/* Most everything except Visual Studio 2008 and earlier has stdint.h now */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +#else +#define HAVE_STDINT_H 1 +#endif /* Visual Studio 2008 */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +#ifdef __clang__ +# define HAVE_GCC_ATOMICS 1 +#endif + +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +#ifndef __WATCOMC__ +#define HAVE_DXGI_H 1 +#define HAVE_XINPUT_H 1 +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0A00 /* Windows 10 SDK */ +#define HAVE_WINDOWS_GAMING_INPUT_H 1 +#endif +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0602 /* Windows 8 SDK */ +#define HAVE_D3D11_H 1 +#define HAVE_ROAPI_H 1 +#endif +#if defined(WDK_NTDDI_VERSION) && WDK_NTDDI_VERSION > 0x0A000008 /* 10.0.19041.0 */ +#define HAVE_D3D12_H 1 +#endif +#if defined(_WIN32_MAXVER) && _WIN32_MAXVER >= 0x0603 /* Windows 8.1 SDK */ +#define HAVE_SHELLSCALINGAPI_H 1 +#endif +#define HAVE_MMDEVICEAPI_H 1 +#define HAVE_AUDIOCLIENT_H 1 +#define HAVE_TPCSHRD_H 1 +#define HAVE_SENSORSAPI_H 1 +#endif +#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_AMD64)) && (defined(_MSC_VER) && _MSC_VER >= 1600) +#define HAVE_IMMINTRIN_H 1 +#elif defined(__has_include) && (defined(__i386__) || defined(__x86_64)) +# if __has_include() +# define HAVE_IMMINTRIN_H 1 +# endif +#endif + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define STDC_HEADERS 1 +#define HAVE_CTYPE_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_STRING_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +/* OpenWatcom requires specific calling conventions for qsort and bsearch */ +#ifndef __WATCOMC__ +#define HAVE_QSORT 1 +#define HAVE_BSEARCH 1 +#endif +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__STRUPR */ +/* #undef HAVE__STRLWR */ +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +/* #undef HAVE_STRTOK_R */ +/* These functions have security warnings, so we won't use them */ +/* #undef HAVE__LTOA */ +/* #undef HAVE__ULTOA */ +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE__WCSICMP 1 +#define HAVE__WCSNICMP 1 +#define HAVE__WCSDUP 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_EXP 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_FMOD 1 +#define HAVE_LOG 1 +#define HAVE_LOG10 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SQRT 1 +#define HAVE_TAN 1 +#ifndef __WATCOMC__ +#define HAVE_ACOSF 1 +#define HAVE_ASINF 1 +#define HAVE_ATANF 1 +#define HAVE_ATAN2F 1 +#define HAVE_CEILF 1 +#define HAVE__COPYSIGN 1 +#define HAVE_COSF 1 +#define HAVE_EXPF 1 +#define HAVE_FABSF 1 +#define HAVE_FLOORF 1 +#define HAVE_FMODF 1 +#define HAVE_LOGF 1 +#define HAVE_LOG10F 1 +#define HAVE_POWF 1 +#define HAVE_SINF 1 +#define HAVE_SQRTF 1 +#define HAVE_TANF 1 +#endif +#if defined(_MSC_VER) +/* These functions were added with the VC++ 2013 C runtime library */ +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_VSSCANF 1 +#define HAVE_LROUND 1 +#define HAVE_LROUNDF 1 +#define HAVE_ROUND 1 +#define HAVE_ROUNDF 1 +#define HAVE_SCALBN 1 +#define HAVE_SCALBNF 1 +#define HAVE_TRUNC 1 +#define HAVE_TRUNCF 1 +#endif +/* This function is available with at least the VC++ 2008 C runtime library */ +#if _MSC_VER >= 1400 +#define HAVE__FSEEKI64 1 +#endif +#ifdef _USE_MATH_DEFINES +#define HAVE_M_PI 1 +#endif +#elif defined(__WATCOMC__) +#define HAVE__FSEEKI64 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_VSSCANF 1 +#define HAVE_ROUND 1 +#define HAVE_SCALBN 1 +#define HAVE_TRUNC 1 +#else +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#if defined(HAVE_MMDEVICEAPI_H) && defined(HAVE_AUDIOCLIENT_H) +#define SDL_AUDIO_DRIVER_WASAPI 1 +#endif +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_HIDAPI 1 +#ifndef __WINRT__ +#define SDL_JOYSTICK_RAWINPUT 1 +#endif +#define SDL_JOYSTICK_VIRTUAL 1 +#ifdef HAVE_WINDOWS_GAMING_INPUT_H +#define SDL_JOYSTICK_WGI 1 +#endif +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 + +/* Enable the sensor driver */ +#ifdef HAVE_SENSORSAPI_H +#define SDL_SENSOR_WINDOWS 1 +#else +#define SDL_SENSOR_DUMMY 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_GENERIC_COND_SUFFIX 1 +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D11) && defined(HAVE_D3D11_H) +#define SDL_VIDEO_RENDER_D3D11 1 +#endif +#if !defined(SDL_VIDEO_RENDER_D3D12) && defined(HAVE_D3D12_H) +#define SDL_VIDEO_RENDER_D3D12 1 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + +/* Enable Vulkan support */ +#define SDL_VIDEO_VULKAN 1 + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 + +#endif /* SDL_config_windows_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_config.h.cmake b/include/SDL/SDL_config.h.cmake new file mode 100644 index 0000000..c57266c --- /dev/null +++ b/include/SDL/SDL_config.h.cmake @@ -0,0 +1,445 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_h_ +#define SDL_config_h_ + +/** + * \file SDL_config.h.in + * + * This is a set of defines to configure the SDL features + */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* C language features */ +#cmakedefine const @HAVE_CONST@ +#cmakedefine inline @HAVE_INLINE@ +#cmakedefine volatile @HAVE_VOLATILE@ + +/* C datatypes */ +/* Define SIZEOF_VOIDP for 64/32 architectures */ +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif + +#cmakedefine HAVE_GCC_ATOMICS @HAVE_GCC_ATOMICS@ +#cmakedefine HAVE_GCC_SYNC_LOCK_TEST_AND_SET @HAVE_GCC_SYNC_LOCK_TEST_AND_SET@ + +#cmakedefine HAVE_D3D_H @HAVE_D3D_H@ +#cmakedefine HAVE_D3D11_H @HAVE_D3D11_H@ +#cmakedefine HAVE_DDRAW_H @HAVE_DDRAW_H@ +#cmakedefine HAVE_DSOUND_H @HAVE_DSOUND_H@ +#cmakedefine HAVE_DINPUT_H @HAVE_DINPUT_H@ +#cmakedefine HAVE_XAUDIO2_H @HAVE_XAUDIO2_H@ +#cmakedefine HAVE_XINPUT_H @HAVE_XINPUT_H@ +#cmakedefine HAVE_DXGI_H @HAVE_DXGI_H@ +#cmakedefine HAVE_XINPUT_GAMEPAD_EX @HAVE_XINPUT_GAMEPAD_EX@ +#cmakedefine HAVE_XINPUT_STATE_EX @HAVE_XINPUT_STATE_EX@ + +/* Comment this if you want to build without any C library requirements */ +#cmakedefine HAVE_LIBC 1 +#if HAVE_LIBC + +/* Useful headers */ +#cmakedefine HAVE_ALLOCA_H 1 +#cmakedefine HAVE_SYS_TYPES_H 1 +#cmakedefine HAVE_STDIO_H 1 +#cmakedefine STDC_HEADERS 1 +#cmakedefine HAVE_STDLIB_H 1 +#cmakedefine HAVE_STDARG_H 1 +#cmakedefine HAVE_MALLOC_H 1 +#cmakedefine HAVE_MEMORY_H 1 +#cmakedefine HAVE_STRING_H 1 +#cmakedefine HAVE_STRINGS_H 1 +#cmakedefine HAVE_WCHAR_H 1 +#cmakedefine HAVE_INTTYPES_H 1 +#cmakedefine HAVE_STDINT_H 1 +#cmakedefine HAVE_CTYPE_H 1 +#cmakedefine HAVE_MATH_H 1 +#cmakedefine HAVE_ICONV_H 1 +#cmakedefine HAVE_SIGNAL_H 1 +#cmakedefine HAVE_ALTIVEC_H 1 +#cmakedefine HAVE_PTHREAD_NP_H 1 +#cmakedefine HAVE_LIBUDEV_H 1 +#cmakedefine HAVE_DBUS_DBUS_H 1 +#cmakedefine HAVE_IBUS_IBUS_H 1 +#cmakedefine HAVE_FCITX_FRONTEND_H 1 +#cmakedefine HAVE_LIBSAMPLERATE_H 1 + +/* C library functions */ +#cmakedefine HAVE_MALLOC 1 +#cmakedefine HAVE_CALLOC 1 +#cmakedefine HAVE_REALLOC 1 +#cmakedefine HAVE_FREE 1 +#cmakedefine HAVE_ALLOCA 1 +#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */ +#cmakedefine HAVE_GETENV 1 +#cmakedefine HAVE_SETENV 1 +#cmakedefine HAVE_PUTENV 1 +#cmakedefine HAVE_UNSETENV 1 +#endif +#cmakedefine HAVE_QSORT 1 +#cmakedefine HAVE_ABS 1 +#cmakedefine HAVE_BCOPY 1 +#cmakedefine HAVE_MEMSET 1 +#cmakedefine HAVE_MEMCPY 1 +#cmakedefine HAVE_MEMMOVE 1 +#cmakedefine HAVE_MEMCMP 1 +#cmakedefine HAVE_WCSLEN 1 +#cmakedefine HAVE_WCSLCPY 1 +#cmakedefine HAVE_WCSLCAT 1 +#cmakedefine HAVE_WCSCMP 1 +#cmakedefine HAVE_STRLEN 1 +#cmakedefine HAVE_STRLCPY 1 +#cmakedefine HAVE_STRLCAT 1 +#cmakedefine HAVE_STRDUP 1 +#cmakedefine HAVE__STRREV 1 +#cmakedefine HAVE__STRUPR 1 +#cmakedefine HAVE__STRLWR 1 +#cmakedefine HAVE_INDEX 1 +#cmakedefine HAVE_RINDEX 1 +#cmakedefine HAVE_STRCHR 1 +#cmakedefine HAVE_STRRCHR 1 +#cmakedefine HAVE_STRSTR 1 +#cmakedefine HAVE_ITOA 1 +#cmakedefine HAVE__LTOA 1 +#cmakedefine HAVE__UITOA 1 +#cmakedefine HAVE__ULTOA 1 +#cmakedefine HAVE_STRTOL 1 +#cmakedefine HAVE_STRTOUL 1 +#cmakedefine HAVE__I64TOA 1 +#cmakedefine HAVE__UI64TOA 1 +#cmakedefine HAVE_STRTOLL 1 +#cmakedefine HAVE_STRTOULL 1 +#cmakedefine HAVE_STRTOD 1 +#cmakedefine HAVE_ATOI 1 +#cmakedefine HAVE_ATOF 1 +#cmakedefine HAVE_STRCMP 1 +#cmakedefine HAVE_STRNCMP 1 +#cmakedefine HAVE__STRICMP 1 +#cmakedefine HAVE_STRCASECMP 1 +#cmakedefine HAVE__STRNICMP 1 +#cmakedefine HAVE_STRNCASECMP 1 +#cmakedefine HAVE_VSSCANF 1 +#cmakedefine HAVE_VSNPRINTF 1 +#cmakedefine HAVE_M_PI 1 +#cmakedefine HAVE_ATAN 1 +#cmakedefine HAVE_ATAN2 1 +#cmakedefine HAVE_ACOS 1 +#cmakedefine HAVE_ASIN 1 +#cmakedefine HAVE_CEIL 1 +#cmakedefine HAVE_COPYSIGN 1 +#cmakedefine HAVE_COS 1 +#cmakedefine HAVE_COSF 1 +#cmakedefine HAVE_FABS 1 +#cmakedefine HAVE_FLOOR 1 +#cmakedefine HAVE_LOG 1 +#cmakedefine HAVE_POW 1 +#cmakedefine HAVE_SCALBN 1 +#cmakedefine HAVE_SIN 1 +#cmakedefine HAVE_SINF 1 +#cmakedefine HAVE_SQRT 1 +#cmakedefine HAVE_SQRTF 1 +#cmakedefine HAVE_TAN 1 +#cmakedefine HAVE_TANF 1 +#cmakedefine HAVE_FOPEN64 1 +#cmakedefine HAVE_FSEEKO 1 +#cmakedefine HAVE_FSEEKO64 1 +#cmakedefine HAVE_SIGACTION 1 +#cmakedefine HAVE_SA_SIGACTION 1 +#cmakedefine HAVE_SETJMP 1 +#cmakedefine HAVE_NANOSLEEP 1 +#cmakedefine HAVE_SYSCONF 1 +#cmakedefine HAVE_SYSCTLBYNAME 1 +#cmakedefine HAVE_CLOCK_GETTIME 1 +#cmakedefine HAVE_GETPAGESIZE 1 +#cmakedefine HAVE_MPROTECT 1 +#cmakedefine HAVE_ICONV 1 +#cmakedefine HAVE_PTHREAD_SETNAME_NP 1 +#cmakedefine HAVE_PTHREAD_SET_NAME_NP 1 +#cmakedefine HAVE_SEM_TIMEDWAIT 1 +#cmakedefine HAVE_GETAUXVAL 1 +#cmakedefine HAVE_POLL 1 + +#elif __WIN32__ +#cmakedefine HAVE_STDARG_H 1 +#cmakedefine HAVE_STDDEF_H 1 +#else +/* We may need some replacement for stdarg.h here */ +#include +#endif /* HAVE_LIBC */ + +/* SDL internal assertion support */ +#cmakedefine SDL_DEFAULT_ASSERT_LEVEL @SDL_DEFAULT_ASSERT_LEVEL@ + +/* Allow disabling of core subsystems */ +#cmakedefine SDL_ATOMIC_DISABLED @SDL_ATOMIC_DISABLED@ +#cmakedefine SDL_AUDIO_DISABLED @SDL_AUDIO_DISABLED@ +#cmakedefine SDL_CPUINFO_DISABLED @SDL_CPUINFO_DISABLED@ +#cmakedefine SDL_EVENTS_DISABLED @SDL_EVENTS_DISABLED@ +#cmakedefine SDL_FILE_DISABLED @SDL_FILE_DISABLED@ +#cmakedefine SDL_JOYSTICK_DISABLED @SDL_JOYSTICK_DISABLED@ +#cmakedefine SDL_HAPTIC_DISABLED @SDL_HAPTIC_DISABLED@ +#cmakedefine SDL_LOADSO_DISABLED @SDL_LOADSO_DISABLED@ +#cmakedefine SDL_RENDER_DISABLED @SDL_RENDER_DISABLED@ +#cmakedefine SDL_THREADS_DISABLED @SDL_THREADS_DISABLED@ +#cmakedefine SDL_TIMERS_DISABLED @SDL_TIMERS_DISABLED@ +#cmakedefine SDL_VIDEO_DISABLED @SDL_VIDEO_DISABLED@ +#cmakedefine SDL_POWER_DISABLED @SDL_POWER_DISABLED@ +#cmakedefine SDL_FILESYSTEM_DISABLED @SDL_FILESYSTEM_DISABLED@ + +/* Enable various audio drivers */ +#cmakedefine SDL_AUDIO_DRIVER_ALSA @SDL_AUDIO_DRIVER_ALSA@ +#cmakedefine SDL_AUDIO_DRIVER_ALSA_DYNAMIC @SDL_AUDIO_DRIVER_ALSA_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_ANDROID @SDL_AUDIO_DRIVER_ANDROID@ +#cmakedefine SDL_AUDIO_DRIVER_ARTS @SDL_AUDIO_DRIVER_ARTS@ +#cmakedefine SDL_AUDIO_DRIVER_ARTS_DYNAMIC @SDL_AUDIO_DRIVER_ARTS_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_COREAUDIO @SDL_AUDIO_DRIVER_COREAUDIO@ +#cmakedefine SDL_AUDIO_DRIVER_DISK @SDL_AUDIO_DRIVER_DISK@ +#cmakedefine SDL_AUDIO_DRIVER_DSOUND @SDL_AUDIO_DRIVER_DSOUND@ +#cmakedefine SDL_AUDIO_DRIVER_DUMMY @SDL_AUDIO_DRIVER_DUMMY@ +#cmakedefine SDL_AUDIO_DRIVER_EMSCRIPTEN @SDL_AUDIO_DRIVER_EMSCRIPTEN@ +#cmakedefine SDL_AUDIO_DRIVER_ESD @SDL_AUDIO_DRIVER_ESD@ +#cmakedefine SDL_AUDIO_DRIVER_ESD_DYNAMIC @SDL_AUDIO_DRIVER_ESD_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_FUSIONSOUND @SDL_AUDIO_DRIVER_FUSIONSOUND@ +#cmakedefine SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC @SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_HAIKU @SDL_AUDIO_DRIVER_HAIKU@ +#cmakedefine SDL_AUDIO_DRIVER_JACK @SDL_AUDIO_DRIVER_JACK@ +#cmakedefine SDL_AUDIO_DRIVER_JACK_DYNAMIC @SDL_AUDIO_DRIVER_JACK_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_NAS @SDL_AUDIO_DRIVER_NAS@ +#cmakedefine SDL_AUDIO_DRIVER_NAS_DYNAMIC @SDL_AUDIO_DRIVER_NAS_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_NETBSD @SDL_AUDIO_DRIVER_NETBSD@ +#cmakedefine SDL_AUDIO_DRIVER_OSS @SDL_AUDIO_DRIVER_OSS@ +#cmakedefine SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H @SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H@ +#cmakedefine SDL_AUDIO_DRIVER_PAUDIO @SDL_AUDIO_DRIVER_PAUDIO@ +#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO @SDL_AUDIO_DRIVER_PULSEAUDIO@ +#cmakedefine SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC @SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_QSA @SDL_AUDIO_DRIVER_QSA@ +#cmakedefine SDL_AUDIO_DRIVER_SNDIO @SDL_AUDIO_DRIVER_SNDIO@ +#cmakedefine SDL_AUDIO_DRIVER_SNDIO_DYNAMIC @SDL_AUDIO_DRIVER_SNDIO_DYNAMIC@ +#cmakedefine SDL_AUDIO_DRIVER_SUNAUDIO @SDL_AUDIO_DRIVER_SUNAUDIO@ +#cmakedefine SDL_AUDIO_DRIVER_WASAPI @SDL_AUDIO_DRIVER_WASAPI@ +#cmakedefine SDL_AUDIO_DRIVER_WINMM @SDL_AUDIO_DRIVER_WINMM@ +#cmakedefine SDL_AUDIO_DRIVER_XAUDIO2 @SDL_AUDIO_DRIVER_XAUDIO2@ + +/* Enable various input drivers */ +#cmakedefine SDL_INPUT_LINUXEV @SDL_INPUT_LINUXEV@ +#cmakedefine SDL_INPUT_LINUXKD @SDL_INPUT_LINUXKD@ +#cmakedefine SDL_INPUT_TSLIB @SDL_INPUT_TSLIB@ +#cmakedefine SDL_JOYSTICK_ANDROID @SDL_JOYSTICK_ANDROID@ +#cmakedefine SDL_JOYSTICK_HAIKU @SDL_JOYSTICK_HAIKU@ +#cmakedefine SDL_JOYSTICK_DINPUT @SDL_JOYSTICK_DINPUT@ +#cmakedefine SDL_JOYSTICK_XINPUT @SDL_JOYSTICK_XINPUT@ +#cmakedefine SDL_JOYSTICK_DUMMY @SDL_JOYSTICK_DUMMY@ +#cmakedefine SDL_JOYSTICK_IOKIT @SDL_JOYSTICK_IOKIT@ +#cmakedefine SDL_JOYSTICK_MFI @SDL_JOYSTICK_MFI@ +#cmakedefine SDL_JOYSTICK_LINUX @SDL_JOYSTICK_LINUX@ +#cmakedefine SDL_JOYSTICK_WINMM @SDL_JOYSTICK_WINMM@ +#cmakedefine SDL_JOYSTICK_USBHID @SDL_JOYSTICK_USBHID@ +#cmakedefine SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H @SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H@ +#cmakedefine SDL_JOYSTICK_EMSCRIPTEN @SDL_JOYSTICK_EMSCRIPTEN@ +#cmakedefine SDL_HAPTIC_DUMMY @SDL_HAPTIC_DUMMY@ +#cmakedefine SDL_HAPTIC_LINUX @SDL_HAPTIC_LINUX@ +#cmakedefine SDL_HAPTIC_IOKIT @SDL_HAPTIC_IOKIT@ +#cmakedefine SDL_HAPTIC_DINPUT @SDL_HAPTIC_DINPUT@ +#cmakedefine SDL_HAPTIC_XINPUT @SDL_HAPTIC_XINPUT@ +#cmakedefine SDL_HAPTIC_ANDROID @SDL_HAPTIC_ANDROID@ + +/* Enable various shared object loading systems */ +#cmakedefine SDL_LOADSO_DLOPEN @SDL_LOADSO_DLOPEN@ +#cmakedefine SDL_LOADSO_DUMMY @SDL_LOADSO_DUMMY@ +#cmakedefine SDL_LOADSO_LDG @SDL_LOADSO_LDG@ +#cmakedefine SDL_LOADSO_WINDOWS @SDL_LOADSO_WINDOWS@ + +/* Enable various threading systems */ +#cmakedefine SDL_THREAD_PTHREAD @SDL_THREAD_PTHREAD@ +#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX@ +#cmakedefine SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP @SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP@ +#cmakedefine SDL_THREAD_WINDOWS @SDL_THREAD_WINDOWS@ + +/* Enable various timer systems */ +#cmakedefine SDL_TIMER_HAIKU @SDL_TIMER_HAIKU@ +#cmakedefine SDL_TIMER_DUMMY @SDL_TIMER_DUMMY@ +#cmakedefine SDL_TIMER_UNIX @SDL_TIMER_UNIX@ +#cmakedefine SDL_TIMER_WINDOWS @SDL_TIMER_WINDOWS@ +#cmakedefine SDL_TIMER_WINCE @SDL_TIMER_WINCE@ + +/* Enable various video drivers */ +#cmakedefine SDL_VIDEO_DRIVER_ANDROID @SDL_VIDEO_DRIVER_ANDROID@ +#cmakedefine SDL_VIDEO_DRIVER_HAIKU @SDL_VIDEO_DRIVER_HAIKU@ +#cmakedefine SDL_VIDEO_DRIVER_COCOA @SDL_VIDEO_DRIVER_COCOA@ +#cmakedefine SDL_VIDEO_DRIVER_DIRECTFB @SDL_VIDEO_DRIVER_DIRECTFB@ +#cmakedefine SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC @SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC@ +#cmakedefine SDL_VIDEO_DRIVER_DUMMY @SDL_VIDEO_DRIVER_DUMMY@ +#cmakedefine SDL_VIDEO_DRIVER_WINDOWS @SDL_VIDEO_DRIVER_WINDOWS@ +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND @SDL_VIDEO_DRIVER_WAYLAND@ +#cmakedefine SDL_VIDEO_DRIVER_RPI @SDL_VIDEO_DRIVER_RPI@ +#cmakedefine SDL_VIDEO_DRIVER_VIVANTE @SDL_VIDEO_DRIVER_VIVANTE@ +#cmakedefine SDL_VIDEO_DRIVER_VIVANTE_VDK @SDL_VIDEO_DRIVER_VIVANTE_VDK@ + +#cmakedefine SDL_VIDEO_DRIVER_KMSDRM @SDL_VIDEO_DRIVER_KMSDRM@ +#cmakedefine SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC @SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC@ +#cmakedefine SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM @SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM@ + +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH @SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH@ +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC@ +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL@ +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR@ +#cmakedefine SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON@ + +#cmakedefine SDL_VIDEO_DRIVER_MIR @SDL_VIDEO_DRIVER_MIR@ +#cmakedefine SDL_VIDEO_DRIVER_MIR_DYNAMIC @SDL_VIDEO_DRIVER_MIR_DYNAMIC@ +#cmakedefine SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON @SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON@ +#cmakedefine SDL_VIDEO_DRIVER_EMSCRIPTEN @SDL_VIDEO_DRIVER_EMSCRIPTEN@ +#cmakedefine SDL_VIDEO_DRIVER_X11 @SDL_VIDEO_DRIVER_X11@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC @SDL_VIDEO_DRIVER_X11_DYNAMIC@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT @SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR @SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA @SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 @SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR @SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS @SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS@ +#cmakedefine SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE @SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XCURSOR @SDL_VIDEO_DRIVER_X11_XCURSOR@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XDBE @SDL_VIDEO_DRIVER_X11_XDBE@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XINERAMA @SDL_VIDEO_DRIVER_X11_XINERAMA@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XINPUT2 @SDL_VIDEO_DRIVER_X11_XINPUT2@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH @SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XRANDR @SDL_VIDEO_DRIVER_X11_XRANDR@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XSCRNSAVER @SDL_VIDEO_DRIVER_X11_XSCRNSAVER@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XSHAPE @SDL_VIDEO_DRIVER_X11_XSHAPE@ +#cmakedefine SDL_VIDEO_DRIVER_X11_XVIDMODE @SDL_VIDEO_DRIVER_X11_XVIDMODE@ +#cmakedefine SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS @SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS@ +#cmakedefine SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY @SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY@ +#cmakedefine SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM @SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM@ + +#cmakedefine SDL_VIDEO_RENDER_D3D @SDL_VIDEO_RENDER_D3D@ +#cmakedefine SDL_VIDEO_RENDER_D3D11 @SDL_VIDEO_RENDER_D3D11@ +#cmakedefine SDL_VIDEO_RENDER_OGL @SDL_VIDEO_RENDER_OGL@ +#cmakedefine SDL_VIDEO_RENDER_OGL_ES @SDL_VIDEO_RENDER_OGL_ES@ +#cmakedefine SDL_VIDEO_RENDER_OGL_ES2 @SDL_VIDEO_RENDER_OGL_ES2@ +#cmakedefine SDL_VIDEO_RENDER_DIRECTFB @SDL_VIDEO_RENDER_DIRECTFB@ + +/* Enable OpenGL support */ +#cmakedefine SDL_VIDEO_OPENGL @SDL_VIDEO_OPENGL@ +#cmakedefine SDL_VIDEO_OPENGL_ES @SDL_VIDEO_OPENGL_ES@ +#cmakedefine SDL_VIDEO_OPENGL_ES2 @SDL_VIDEO_OPENGL_ES2@ +#cmakedefine SDL_VIDEO_OPENGL_BGL @SDL_VIDEO_OPENGL_BGL@ +#cmakedefine SDL_VIDEO_OPENGL_CGL @SDL_VIDEO_OPENGL_CGL@ +#cmakedefine SDL_VIDEO_OPENGL_GLX @SDL_VIDEO_OPENGL_GLX@ +#cmakedefine SDL_VIDEO_OPENGL_WGL @SDL_VIDEO_OPENGL_WGL@ +#cmakedefine SDL_VIDEO_OPENGL_EGL @SDL_VIDEO_OPENGL_EGL@ +#cmakedefine SDL_VIDEO_OPENGL_OSMESA @SDL_VIDEO_OPENGL_OSMESA@ +#cmakedefine SDL_VIDEO_OPENGL_OSMESA_DYNAMIC @SDL_VIDEO_OPENGL_OSMESA_DYNAMIC@ + +/* Enable Vulkan support */ +#cmakedefine SDL_VIDEO_VULKAN @SDL_VIDEO_VULKAN@ + +/* Enable system power support */ +#cmakedefine SDL_POWER_ANDROID @SDL_POWER_ANDROID@ +#cmakedefine SDL_POWER_LINUX @SDL_POWER_LINUX@ +#cmakedefine SDL_POWER_WINDOWS @SDL_POWER_WINDOWS@ +#cmakedefine SDL_POWER_MACOSX @SDL_POWER_MACOSX@ +#cmakedefine SDL_POWER_HAIKU @SDL_POWER_HAIKU@ +#cmakedefine SDL_POWER_EMSCRIPTEN @SDL_POWER_EMSCRIPTEN@ +#cmakedefine SDL_POWER_HARDWIRED @SDL_POWER_HARDWIRED@ + +/* Enable system filesystem support */ +#cmakedefine SDL_FILESYSTEM_ANDROID @SDL_FILESYSTEM_ANDROID@ +#cmakedefine SDL_FILESYSTEM_HAIKU @SDL_FILESYSTEM_HAIKU@ +#cmakedefine SDL_FILESYSTEM_COCOA @SDL_FILESYSTEM_COCOA@ +#cmakedefine SDL_FILESYSTEM_DUMMY @SDL_FILESYSTEM_DUMMY@ +#cmakedefine SDL_FILESYSTEM_UNIX @SDL_FILESYSTEM_UNIX@ +#cmakedefine SDL_FILESYSTEM_WINDOWS @SDL_FILESYSTEM_WINDOWS@ +#cmakedefine SDL_FILESYSTEM_EMSCRIPTEN @SDL_FILESYSTEM_EMSCRIPTEN@ + +/* Enable assembly routines */ +#cmakedefine SDL_ASSEMBLY_ROUTINES @SDL_ASSEMBLY_ROUTINES@ +#cmakedefine SDL_ALTIVEC_BLITTERS @SDL_ALTIVEC_BLITTERS@ + +/* Enable dynamic libsamplerate support */ +#cmakedefine SDL_LIBSAMPLERATE_DYNAMIC @SDL_LIBSAMPLERATE_DYNAMIC@ + +/* Platform specific definitions */ +#if !defined(__WIN32__) +# if !defined(_STDINT_H_) && !defined(_STDINT_H) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) +typedef unsigned int size_t; +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +typedef unsigned long uintptr_t; +# endif /* if (stdint.h isn't available) */ +#else /* __WIN32__ */ +# if !defined(_STDINT_H_) && !defined(HAVE_STDINT_H) && !defined(_HAVE_STDINT_H) +# if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 +# elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +# ifndef _UINTPTR_T_DEFINED +# ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +# else +typedef unsigned int uintptr_t; +# endif +#define _UINTPTR_T_DEFINED +# endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +# if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +# endif +# if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +# endif +# else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +# ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +# endif +typedef unsigned int uintptr_t; +# endif /* __GNUC__ || _MSC_VER */ +# endif /* !_STDINT_H_ && !HAVE_STDINT_H */ +#endif /* __WIN32__ */ + +#endif /* SDL_config_h_ */ diff --git a/include/SDL/SDL_config.h.in b/include/SDL/SDL_config.h.in new file mode 100644 index 0000000..8b3d208 --- /dev/null +++ b/include/SDL/SDL_config.h.in @@ -0,0 +1,389 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_h_ +#define SDL_config_h_ + +/** + * \file SDL_config.h.in + * + * This is a set of defines to configure the SDL features + */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +/* Make sure that this isn't included by Visual C++ */ +#ifdef _MSC_VER +#error You should run hg revert SDL_config.h +#endif + +/* C language features */ +#undef const +#undef inline +#undef volatile + +/* C datatypes */ +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif +#undef HAVE_GCC_ATOMICS +#undef HAVE_GCC_SYNC_LOCK_TEST_AND_SET + +#undef HAVE_DDRAW_H +#undef HAVE_DINPUT_H +#undef HAVE_DSOUND_H +#undef HAVE_DXGI_H +#undef HAVE_XINPUT_H +#undef HAVE_XINPUT_GAMEPAD_EX +#undef HAVE_XINPUT_STATE_EX + +/* Comment this if you want to build without any C library requirements */ +#undef HAVE_LIBC +#if HAVE_LIBC + +/* Useful headers */ +#undef HAVE_ALLOCA_H +#undef HAVE_SYS_TYPES_H +#undef HAVE_STDIO_H +#undef STDC_HEADERS +#undef HAVE_STDLIB_H +#undef HAVE_STDARG_H +#undef HAVE_MALLOC_H +#undef HAVE_MEMORY_H +#undef HAVE_STRING_H +#undef HAVE_STRINGS_H +#undef HAVE_WCHAR_H +#undef HAVE_INTTYPES_H +#undef HAVE_STDINT_H +#undef HAVE_CTYPE_H +#undef HAVE_MATH_H +#undef HAVE_ICONV_H +#undef HAVE_SIGNAL_H +#undef HAVE_ALTIVEC_H +#undef HAVE_PTHREAD_NP_H +#undef HAVE_LIBUDEV_H +#undef HAVE_DBUS_DBUS_H +#undef HAVE_IBUS_IBUS_H +#undef HAVE_FCITX_FRONTEND_H +#undef HAVE_LIBSAMPLERATE_H + +/* C library functions */ +#undef HAVE_MALLOC +#undef HAVE_CALLOC +#undef HAVE_REALLOC +#undef HAVE_FREE +#undef HAVE_ALLOCA +#ifndef __WIN32__ /* Don't use C runtime versions of these on Windows */ +#undef HAVE_GETENV +#undef HAVE_SETENV +#undef HAVE_PUTENV +#undef HAVE_UNSETENV +#endif +#undef HAVE_QSORT +#undef HAVE_ABS +#undef HAVE_BCOPY +#undef HAVE_MEMSET +#undef HAVE_MEMCPY +#undef HAVE_MEMMOVE +#undef HAVE_MEMCMP +#undef HAVE_WCSLEN +#undef HAVE_WCSLCPY +#undef HAVE_WCSLCAT +#undef HAVE_WCSCMP +#undef HAVE_STRLEN +#undef HAVE_STRLCPY +#undef HAVE_STRLCAT +#undef HAVE_STRDUP +#undef HAVE__STRREV +#undef HAVE__STRUPR +#undef HAVE__STRLWR +#undef HAVE_INDEX +#undef HAVE_RINDEX +#undef HAVE_STRCHR +#undef HAVE_STRRCHR +#undef HAVE_STRSTR +#undef HAVE_ITOA +#undef HAVE__LTOA +#undef HAVE__UITOA +#undef HAVE__ULTOA +#undef HAVE_STRTOL +#undef HAVE_STRTOUL +#undef HAVE__I64TOA +#undef HAVE__UI64TOA +#undef HAVE_STRTOLL +#undef HAVE_STRTOULL +#undef HAVE_STRTOD +#undef HAVE_ATOI +#undef HAVE_ATOF +#undef HAVE_STRCMP +#undef HAVE_STRNCMP +#undef HAVE__STRICMP +#undef HAVE_STRCASECMP +#undef HAVE__STRNICMP +#undef HAVE_STRNCASECMP +#undef HAVE_SSCANF +#undef HAVE_VSSCANF +#undef HAVE_SNPRINTF +#undef HAVE_VSNPRINTF +#undef HAVE_M_PI +#undef HAVE_ATAN +#undef HAVE_ATAN2 +#undef HAVE_ACOS +#undef HAVE_ASIN +#undef HAVE_CEIL +#undef HAVE_COPYSIGN +#undef HAVE_COS +#undef HAVE_COSF +#undef HAVE_FABS +#undef HAVE_FLOOR +#undef HAVE_LOG +#undef HAVE_POW +#undef HAVE_SCALBN +#undef HAVE_SIN +#undef HAVE_SINF +#undef HAVE_SQRT +#undef HAVE_SQRTF +#undef HAVE_TAN +#undef HAVE_TANF +#undef HAVE_FOPEN64 +#undef HAVE_FSEEKO +#undef HAVE_FSEEKO64 +#undef HAVE_SIGACTION +#undef HAVE_SA_SIGACTION +#undef HAVE_SETJMP +#undef HAVE_NANOSLEEP +#undef HAVE_SYSCONF +#undef HAVE_SYSCTLBYNAME +#undef HAVE_CLOCK_GETTIME +#undef HAVE_GETPAGESIZE +#undef HAVE_MPROTECT +#undef HAVE_ICONV +#undef HAVE_PTHREAD_SETNAME_NP +#undef HAVE_PTHREAD_SET_NAME_NP +#undef HAVE_SEM_TIMEDWAIT +#undef HAVE_GETAUXVAL +#undef HAVE_POLL + +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDINT_H 1 +#endif /* HAVE_LIBC */ + +/* SDL internal assertion support */ +#undef SDL_DEFAULT_ASSERT_LEVEL + +/* Allow disabling of core subsystems */ +#undef SDL_ATOMIC_DISABLED +#undef SDL_AUDIO_DISABLED +#undef SDL_CPUINFO_DISABLED +#undef SDL_EVENTS_DISABLED +#undef SDL_FILE_DISABLED +#undef SDL_JOYSTICK_DISABLED +#undef SDL_HAPTIC_DISABLED +#undef SDL_LOADSO_DISABLED +#undef SDL_RENDER_DISABLED +#undef SDL_THREADS_DISABLED +#undef SDL_TIMERS_DISABLED +#undef SDL_VIDEO_DISABLED +#undef SDL_POWER_DISABLED +#undef SDL_FILESYSTEM_DISABLED + +/* Enable various audio drivers */ +#undef SDL_AUDIO_DRIVER_ALSA +#undef SDL_AUDIO_DRIVER_ALSA_DYNAMIC +#undef SDL_AUDIO_DRIVER_ANDROID +#undef SDL_AUDIO_DRIVER_ARTS +#undef SDL_AUDIO_DRIVER_ARTS_DYNAMIC +#undef SDL_AUDIO_DRIVER_COREAUDIO +#undef SDL_AUDIO_DRIVER_DISK +#undef SDL_AUDIO_DRIVER_DSOUND +#undef SDL_AUDIO_DRIVER_DUMMY +#undef SDL_AUDIO_DRIVER_EMSCRIPTEN +#undef SDL_AUDIO_DRIVER_ESD +#undef SDL_AUDIO_DRIVER_ESD_DYNAMIC +#undef SDL_AUDIO_DRIVER_FUSIONSOUND +#undef SDL_AUDIO_DRIVER_FUSIONSOUND_DYNAMIC +#undef SDL_AUDIO_DRIVER_HAIKU +#undef SDL_AUDIO_DRIVER_JACK +#undef SDL_AUDIO_DRIVER_JACK_DYNAMIC +#undef SDL_AUDIO_DRIVER_NACL +#undef SDL_AUDIO_DRIVER_NAS +#undef SDL_AUDIO_DRIVER_NAS_DYNAMIC +#undef SDL_AUDIO_DRIVER_NETBSD +#undef SDL_AUDIO_DRIVER_OSS +#undef SDL_AUDIO_DRIVER_OSS_SOUNDCARD_H +#undef SDL_AUDIO_DRIVER_PAUDIO +#undef SDL_AUDIO_DRIVER_PULSEAUDIO +#undef SDL_AUDIO_DRIVER_PULSEAUDIO_DYNAMIC +#undef SDL_AUDIO_DRIVER_QSA +#undef SDL_AUDIO_DRIVER_SNDIO +#undef SDL_AUDIO_DRIVER_SNDIO_DYNAMIC +#undef SDL_AUDIO_DRIVER_SUNAUDIO +#undef SDL_AUDIO_DRIVER_WASAPI +#undef SDL_AUDIO_DRIVER_WINMM +#undef SDL_AUDIO_DRIVER_XAUDIO2 + +/* Enable various input drivers */ +#undef SDL_INPUT_LINUXEV +#undef SDL_INPUT_LINUXKD +#undef SDL_INPUT_TSLIB +#undef SDL_JOYSTICK_HAIKU +#undef SDL_JOYSTICK_DINPUT +#undef SDL_JOYSTICK_XINPUT +#undef SDL_JOYSTICK_DUMMY +#undef SDL_JOYSTICK_IOKIT +#undef SDL_JOYSTICK_LINUX +#undef SDL_JOYSTICK_ANDROID +#undef SDL_JOYSTICK_WINMM +#undef SDL_JOYSTICK_USBHID +#undef SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H +#undef SDL_JOYSTICK_EMSCRIPTEN +#undef SDL_HAPTIC_DUMMY +#undef SDL_HAPTIC_LINUX +#undef SDL_HAPTIC_IOKIT +#undef SDL_HAPTIC_DINPUT +#undef SDL_HAPTIC_XINPUT + +/* Enable various shared object loading systems */ +#undef SDL_LOADSO_DLOPEN +#undef SDL_LOADSO_DUMMY +#undef SDL_LOADSO_LDG +#undef SDL_LOADSO_WINDOWS + +/* Enable various threading systems */ +#undef SDL_THREAD_PTHREAD +#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX +#undef SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP +#undef SDL_THREAD_WINDOWS + +/* Enable various timer systems */ +#undef SDL_TIMER_HAIKU +#undef SDL_TIMER_DUMMY +#undef SDL_TIMER_UNIX +#undef SDL_TIMER_WINDOWS + +/* Enable various video drivers */ +#undef SDL_VIDEO_DRIVER_HAIKU +#undef SDL_VIDEO_DRIVER_COCOA +#undef SDL_VIDEO_DRIVER_DIRECTFB +#undef SDL_VIDEO_DRIVER_DIRECTFB_DYNAMIC +#undef SDL_VIDEO_DRIVER_DUMMY +#undef SDL_VIDEO_DRIVER_WINDOWS +#undef SDL_VIDEO_DRIVER_WAYLAND +#undef SDL_VIDEO_DRIVER_WAYLAND_QT_TOUCH +#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC +#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_EGL +#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_CURSOR +#undef SDL_VIDEO_DRIVER_WAYLAND_DYNAMIC_XKBCOMMON +#undef SDL_VIDEO_DRIVER_MIR +#undef SDL_VIDEO_DRIVER_MIR_DYNAMIC +#undef SDL_VIDEO_DRIVER_MIR_DYNAMIC_XKBCOMMON +#undef SDL_VIDEO_DRIVER_X11 +#undef SDL_VIDEO_DRIVER_RPI +#undef SDL_VIDEO_DRIVER_KMSDRM +#undef SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC +#undef SDL_VIDEO_DRIVER_KMSDRM_DYNAMIC_GBM +#undef SDL_VIDEO_DRIVER_ANDROID +#undef SDL_VIDEO_DRIVER_EMSCRIPTEN +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XCURSOR +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS +#undef SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE +#undef SDL_VIDEO_DRIVER_X11_XCURSOR +#undef SDL_VIDEO_DRIVER_X11_XDBE +#undef SDL_VIDEO_DRIVER_X11_XINERAMA +#undef SDL_VIDEO_DRIVER_X11_XINPUT2 +#undef SDL_VIDEO_DRIVER_X11_XINPUT2_SUPPORTS_MULTITOUCH +#undef SDL_VIDEO_DRIVER_X11_XRANDR +#undef SDL_VIDEO_DRIVER_X11_XSCRNSAVER +#undef SDL_VIDEO_DRIVER_X11_XSHAPE +#undef SDL_VIDEO_DRIVER_X11_XVIDMODE +#undef SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS +#undef SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY +#undef SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM +#undef SDL_VIDEO_DRIVER_NACL +#undef SDL_VIDEO_DRIVER_VIVANTE +#undef SDL_VIDEO_DRIVER_VIVANTE_VDK +#undef SDL_VIDEO_DRIVER_QNX + +#undef SDL_VIDEO_RENDER_D3D +#undef SDL_VIDEO_RENDER_D3D11 +#undef SDL_VIDEO_RENDER_OGL +#undef SDL_VIDEO_RENDER_OGL_ES +#undef SDL_VIDEO_RENDER_OGL_ES2 +#undef SDL_VIDEO_RENDER_DIRECTFB + +/* Enable OpenGL support */ +#undef SDL_VIDEO_OPENGL +#undef SDL_VIDEO_OPENGL_ES +#undef SDL_VIDEO_OPENGL_ES2 +#undef SDL_VIDEO_OPENGL_BGL +#undef SDL_VIDEO_OPENGL_CGL +#undef SDL_VIDEO_OPENGL_EGL +#undef SDL_VIDEO_OPENGL_GLX +#undef SDL_VIDEO_OPENGL_WGL +#undef SDL_VIDEO_OPENGL_OSMESA +#undef SDL_VIDEO_OPENGL_OSMESA_DYNAMIC + +/* Enable Vulkan support */ +#undef SDL_VIDEO_VULKAN + +/* Enable system power support */ +#undef SDL_POWER_LINUX +#undef SDL_POWER_WINDOWS +#undef SDL_POWER_MACOSX +#undef SDL_POWER_HAIKU +#undef SDL_POWER_ANDROID +#undef SDL_POWER_EMSCRIPTEN +#undef SDL_POWER_HARDWIRED + +/* Enable system filesystem support */ +#undef SDL_FILESYSTEM_HAIKU +#undef SDL_FILESYSTEM_COCOA +#undef SDL_FILESYSTEM_DUMMY +#undef SDL_FILESYSTEM_UNIX +#undef SDL_FILESYSTEM_WINDOWS +#undef SDL_FILESYSTEM_NACL +#undef SDL_FILESYSTEM_ANDROID +#undef SDL_FILESYSTEM_EMSCRIPTEN + +/* Enable assembly routines */ +#undef SDL_ASSEMBLY_ROUTINES +#undef SDL_ALTIVEC_BLITTERS + +/* Enable ime support */ +#undef SDL_USE_IME + +/* Enable dynamic udev support */ +#undef SDL_UDEV_DYNAMIC + +/* Enable dynamic libsamplerate support */ +#undef SDL_LIBSAMPLERATE_DYNAMIC + +#endif /* SDL_config_h_ */ diff --git a/include/SDL/SDL_config_android.h b/include/SDL/SDL_config_android.h new file mode 100644 index 0000000..361bad8 --- /dev/null +++ b/include/SDL/SDL_config_android.h @@ -0,0 +1,157 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_android_h_ +#define SDL_config_android_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/** + * \file SDL_config_android.h + * + * This is a configuration that can be used to build SDL for Android + */ + +#include + +#define HAVE_GCC_ATOMICS 1 + +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +#define HAVE_CLOCK_GETTIME 1 + +#define SIZEOF_VOIDP 4 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_ANDROID 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_ANDROID 1 +#define SDL_HAPTIC_ANDROID 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DLOPEN 1 + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_ANDROID 1 + +/* Enable OpenGL ES */ +#define SDL_VIDEO_OPENGL_ES 1 +#define SDL_VIDEO_OPENGL_ES2 1 +#define SDL_VIDEO_OPENGL_EGL 1 +#define SDL_VIDEO_RENDER_OGL_ES 1 +#define SDL_VIDEO_RENDER_OGL_ES2 1 + +/* Enable Vulkan support */ +/* Android does not support Vulkan in native code using the "armeabi" ABI. */ +#if defined(__ARM_ARCH) && __ARM_ARCH < 7 +#define SDL_VIDEO_VULKAN 0 +#else +#define SDL_VIDEO_VULKAN 1 +#endif + +/* Enable system power support */ +#define SDL_POWER_ANDROID 1 + +/* Enable the filesystem driver */ +#define SDL_FILESYSTEM_ANDROID 1 + +#endif /* SDL_config_android_h_ */ diff --git a/include/SDL/SDL_config_iphoneos.h b/include/SDL/SDL_config_iphoneos.h new file mode 100644 index 0000000..deea030 --- /dev/null +++ b/include/SDL/SDL_config_iphoneos.h @@ -0,0 +1,166 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_iphoneos_h_ +#define SDL_config_iphoneos_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif + +#define HAVE_GCC_ATOMICS 1 + +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYSCTLBYNAME 1 + +/* enable iPhone version of Core Audio driver */ +#define SDL_AUDIO_DRIVER_COREAUDIO 1 +/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub haptic driver (src/haptic/dummy/\*.c) */ +#define SDL_HAPTIC_DUMMY 1 + +/* Enable MFi joystick support */ +#define SDL_JOYSTICK_MFI 1 + +/* Enable Unix style SO loading */ +#define SDL_LOADSO_DLOPEN 1 + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Supported video drivers */ +#define SDL_VIDEO_DRIVER_UIKIT 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +/* enable OpenGL ES */ +#define SDL_VIDEO_OPENGL_ES2 1 +#define SDL_VIDEO_OPENGL_ES 1 +#define SDL_VIDEO_RENDER_OGL_ES 1 +#define SDL_VIDEO_RENDER_OGL_ES2 1 + +/* Enable Vulkan support */ +#if !TARGET_OS_SIMULATOR && !TARGET_CPU_ARM // Only 64-bit devices have Metal +#define SDL_VIDEO_VULKAN 1 +#else +#define SDL_VIDEO_VULKAN 0 +#endif + +/* Enable system power support */ +#define SDL_POWER_UIKIT 1 + +/* enable iPhone keyboard support */ +#define SDL_IPHONE_KEYBOARD 1 + +/* enable iOS extended launch screen */ +#define SDL_IPHONE_LAUNCHSCREEN 1 + +/* Set max recognized G-force from accelerometer + See src/joystick/uikit/SDL_sysjoystick.m for notes on why this is needed + */ +#define SDL_IPHONE_MAX_GFORCE 5.0 + +/* enable filesystem support */ +#define SDL_FILESYSTEM_COCOA 1 + +#endif /* SDL_config_iphoneos_h_ */ diff --git a/include/SDL/SDL_config_macosx.h b/include/SDL/SDL_config_macosx.h new file mode 100644 index 0000000..9b09899 --- /dev/null +++ b/include/SDL/SDL_config_macosx.h @@ -0,0 +1,197 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_macosx_h_ +#define SDL_config_macosx_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ +#include + +/* This is a set of defines to configure the SDL features */ + +#ifdef __LP64__ + #define SIZEOF_VOIDP 8 +#else + #define SIZEOF_VOIDP 4 +#endif + +/* Useful headers */ +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYSCTLBYNAME 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_COREAUDIO 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_IOKIT 1 +#define SDL_HAPTIC_IOKIT 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DLOPEN 1 + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_COCOA 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 +#undef SDL_VIDEO_DRIVER_X11 +#define SDL_VIDEO_DRIVER_X11_DYNAMIC "/usr/X11R6/lib/libX11.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "/usr/X11R6/lib/libXext.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "/usr/X11R6/lib/libXinerama.1.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "/usr/X11R6/lib/libXi.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "/usr/X11R6/lib/libXrandr.2.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "/usr/X11R6/lib/libXss.1.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "/usr/X11R6/lib/libXxf86vm.1.dylib" +#define SDL_VIDEO_DRIVER_X11_XDBE 1 +#define SDL_VIDEO_DRIVER_X11_XINERAMA 1 +#define SDL_VIDEO_DRIVER_X11_XRANDR 1 +#define SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1 +#define SDL_VIDEO_DRIVER_X11_XSHAPE 1 +#define SDL_VIDEO_DRIVER_X11_XVIDMODE 1 +#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1 + +#ifdef MAC_OS_X_VERSION_10_8 +/* + * No matter the versions targeted, this is the 10.8 or later SDK, so you have + * to use the external Xquartz, which is a more modern Xlib. Previous SDKs + * used an older Xlib. + */ +#define SDL_VIDEO_DRIVER_X11_XINPUT2 1 +#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1 +#define SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1 +#endif + +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_CGL +#define SDL_VIDEO_OPENGL_CGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_GLX +#define SDL_VIDEO_OPENGL_GLX 1 +#endif + +/* Enable Vulkan support */ +/* Metal/MoltenVK/Vulkan only supported on 64-bit architectures with 10.11+ */ +#if TARGET_CPU_X86_64 && (MAC_OS_X_VERSION_MAX_ALLOWED >= 101100) +#define SDL_VIDEO_VULKAN 1 +#else +#define SDL_VIDEO_VULKAN 0 +#endif + +/* Enable system power support */ +#define SDL_POWER_MACOSX 1 + +/* enable filesystem support */ +#define SDL_FILESYSTEM_COCOA 1 + +/* Enable assembly routines */ +#define SDL_ASSEMBLY_ROUTINES 1 +#ifdef __ppc__ +#define SDL_ALTIVEC_BLITTERS 1 +#endif + +#endif /* SDL_config_macosx_h_ */ diff --git a/include/SDL/SDL_config_macosx.h.orig b/include/SDL/SDL_config_macosx.h.orig new file mode 100644 index 0000000..f03f1ae --- /dev/null +++ b/include/SDL/SDL_config_macosx.h.orig @@ -0,0 +1,197 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_macosx_h_ +#define SDL_config_macosx_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* This gets us MAC_OS_X_VERSION_MIN_REQUIRED... */ +#include + +/* This is a set of defines to configure the SDL features */ + +#ifdef __LP64__ + #define SIZEOF_VOIDP 8 +#else + #define SIZEOF_VOIDP 4 +#endif + +/* Useful headers */ +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYSCTLBYNAME 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_COREAUDIO 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_IOKIT 1 +#define SDL_HAPTIC_IOKIT 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_DLOPEN 1 + +/* Enable various threading systems */ +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX 1 + +/* Enable various timer systems */ +#define SDL_TIMER_UNIX 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_COCOA 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 +#undef SDL_VIDEO_DRIVER_X11 +#define SDL_VIDEO_DRIVER_X11_DYNAMIC "/usr/X11R6/lib/libX11.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XEXT "/usr/X11R6/lib/libXext.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINERAMA "/usr/X11R6/lib/libXinerama.1.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XINPUT2 "/usr/X11R6/lib/libXi.6.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XRANDR "/usr/X11R6/lib/libXrandr.2.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XSS "/usr/X11R6/lib/libXss.1.dylib" +#define SDL_VIDEO_DRIVER_X11_DYNAMIC_XVIDMODE "/usr/X11R6/lib/libXxf86vm.1.dylib" +#define SDL_VIDEO_DRIVER_X11_XDBE 1 +#define SDL_VIDEO_DRIVER_X11_XINERAMA 1 +#define SDL_VIDEO_DRIVER_X11_XRANDR 1 +#define SDL_VIDEO_DRIVER_X11_XSCRNSAVER 1 +#define SDL_VIDEO_DRIVER_X11_XSHAPE 1 +#define SDL_VIDEO_DRIVER_X11_XVIDMODE 1 +#define SDL_VIDEO_DRIVER_X11_HAS_XKBKEYCODETOKEYSYM 1 + +#ifdef MAC_OS_X_VERSION_10_8 +/* + * No matter the versions targeted, this is the 10.8 or later SDK, so you have + * to use the external Xquartz, which is a more modern Xlib. Previous SDKs + * used an older Xlib. + */ +#define SDL_VIDEO_DRIVER_X11_XINPUT2 1 +#define SDL_VIDEO_DRIVER_X11_SUPPORTS_GENERIC_EVENTS 1 +#define SDL_VIDEO_DRIVER_X11_CONST_PARAM_XEXTADDDISPLAY 1 +#endif + +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_CGL +#define SDL_VIDEO_OPENGL_CGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_GLX +#define SDL_VIDEO_OPENGL_GLX 1 +#endif + +/* Enable Vulkan support */ +/* Metal/MoltenVK/Vulkan only supported on 64-bit architectures and 10.11+ */ +#if TARGET_CPU_X86_64 +#define SDL_VIDEO_VULKAN 1 +#else +#define SDL_VIDEO_VULKAN 0 +#endif + +/* Enable system power support */ +#define SDL_POWER_MACOSX 1 + +/* enable filesystem support */ +#define SDL_FILESYSTEM_COCOA 1 + +/* Enable assembly routines */ +#define SDL_ASSEMBLY_ROUTINES 1 +#ifdef __ppc__ +#define SDL_ALTIVEC_BLITTERS 1 +#endif + +#endif /* SDL_config_macosx_h_ */ diff --git a/include/SDL/SDL_config_minimal.h b/include/SDL/SDL_config_minimal.h new file mode 100644 index 0000000..3112700 --- /dev/null +++ b/include/SDL/SDL_config_minimal.h @@ -0,0 +1,82 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_minimal_h_ +#define SDL_config_minimal_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/** + * \file SDL_config_minimal.h + * + * This is the minimal configuration that can be used to build SDL. + */ + +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 + +/* Most everything except Visual Studio 2008 and earlier has stdint.h now */ +#if defined(_MSC_VER) && (_MSC_VER < 1600) +/* Here are some reasonable defaults */ +typedef unsigned int size_t; +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +typedef unsigned long uintptr_t; +#else +#define HAVE_STDINT_H 1 +#endif /* Visual Studio 2008 */ + +#ifdef __GNUC__ +#define HAVE_GCC_SYNC_LOCK_TEST_AND_SET 1 +#endif + +/* Enable the dummy audio driver (src/audio/dummy/\*.c) */ +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable the stub joystick driver (src/joystick/dummy/\*.c) */ +#define SDL_JOYSTICK_DISABLED 1 + +/* Enable the stub haptic driver (src/haptic/dummy/\*.c) */ +#define SDL_HAPTIC_DISABLED 1 + +/* Enable the stub shared object loader (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + +/* Enable the stub thread support (src/thread/generic/\*.c) */ +#define SDL_THREADS_DISABLED 1 + +/* Enable the stub timer support (src/timer/dummy/\*.c) */ +#define SDL_TIMERS_DISABLED 1 + +/* Enable the dummy video driver (src/video/dummy/\*.c) */ +#define SDL_VIDEO_DRIVER_DUMMY 1 + +/* Enable the dummy filesystem driver (src/filesystem/dummy/\*.c) */ +#define SDL_FILESYSTEM_DUMMY 1 + +#endif /* SDL_config_minimal_h_ */ diff --git a/include/SDL/SDL_config_pandora.h b/include/SDL/SDL_config_pandora.h new file mode 100644 index 0000000..ea62fe5 --- /dev/null +++ b/include/SDL/SDL_config_pandora.h @@ -0,0 +1,128 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_pandora_h_ +#define SDL_config_pandora_h_ +#define SDL_config_h_ + +/* This is a set of defines to configure the SDL features */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +#ifdef __LP64__ +#define SIZEOF_VOIDP 8 +#else +#define SIZEOF_VOIDP 4 +#endif + +#define SDL_BYTEORDER 1234 + +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRLEN 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 + +#define SDL_AUDIO_DRIVER_DUMMY 1 +#define SDL_AUDIO_DRIVER_OSS 1 + +#define SDL_INPUT_LINUXEV 1 +#define SDL_INPUT_TSLIB 1 +#define SDL_JOYSTICK_LINUX 1 +#define SDL_HAPTIC_LINUX 1 + +#define SDL_LOADSO_DLOPEN 1 + +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1 + +#define SDL_TIMER_UNIX 1 +#define SDL_FILESYSTEM_UNIX 1 + +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_X11 1 +#define SDL_VIDEO_DRIVER_PANDORA 1 +#define SDL_VIDEO_RENDER_OGL_ES 1 +#define SDL_VIDEO_OPENGL_ES 1 + +#endif /* SDL_config_pandora_h_ */ diff --git a/include/SDL/SDL_config_psp.h b/include/SDL/SDL_config_psp.h new file mode 100644 index 0000000..28efb4c --- /dev/null +++ b/include/SDL/SDL_config_psp.h @@ -0,0 +1,144 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_psp_h_ +#define SDL_config_psp_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + + + +#ifdef __GNUC__ +#define HAVE_GCC_SYNC_LOCK_TEST_AND_SET 1 +#endif + +#define HAVE_GCC_ATOMICS 1 + +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +/* #define HAVE_SYSCONF 1 */ +/* #define HAVE_SIGACTION 1 */ + + +/* PSP isn't that sophisticated */ +#define LACKS_SYS_MMAN_H 1 + +/* Enable the stub thread support (src/thread/psp/\*.c) */ +#define SDL_THREAD_PSP 1 + +/* Enable the stub timer support (src/timer/psp/\*.c) */ +#define SDL_TIMERS_PSP 1 + +/* Enable the stub joystick driver (src/joystick/psp/\*.c) */ +#define SDL_JOYSTICK_PSP 1 + +/* Enable the stub audio driver (src/audio/psp/\*.c) */ +#define SDL_AUDIO_DRIVER_PSP 1 + +/* PSP video dirver */ +#define SDL_VIDEO_DRIVER_PSP 1 + +/* PSP render dirver */ +#define SDL_VIDEO_RENDER_PSP 1 + +#define SDL_POWER_PSP 1 + +/* !!! FIXME: what does PSP do for filesystem stuff? */ +#define SDL_FILESYSTEM_DUMMY 1 + +/* PSP doesn't have haptic device (src/haptic/dummy/\*.c) */ +#define SDL_HAPTIC_DISABLED 1 + +/* PSP can't load shared object (src/loadso/dummy/\*.c) */ +#define SDL_LOADSO_DISABLED 1 + + +#endif /* SDL_config_psp_h_ */ diff --git a/include/SDL/SDL_config_windows.h b/include/SDL/SDL_config_windows.h new file mode 100644 index 0000000..2456c84 --- /dev/null +++ b/include/SDL/SDL_config_windows.h @@ -0,0 +1,225 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_windows_h_ +#define SDL_config_windows_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* This is a set of defines to configure the SDL features */ + +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +#define HAVE_DDRAW_H 1 +#define HAVE_DINPUT_H 1 +#define HAVE_DSOUND_H 1 +#define HAVE_DXGI_H 1 +#define HAVE_XINPUT_H 1 + +/* This is disabled by default to avoid C runtime dependencies and manifest requirements */ +#ifdef HAVE_LIBC +/* Useful headers */ +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +#define HAVE__STRLWR 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE__LTOA 1 +#define HAVE__ULTOA 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_ACOS 1 +#define HAVE_ASIN 1 +#define HAVE_CEIL 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#if _MSC_VER >= 1800 +#define HAVE_STRTOLL 1 +#define HAVE_VSSCANF 1 +#define HAVE_COPYSIGN 1 +#define HAVE_SCALBN 1 +#endif +#if !defined(_MSC_VER) || defined(_USE_MATH_DEFINES) +#define HAVE_M_PI 1 +#endif +#else +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#endif + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_WASAPI 1 +#define SDL_AUDIO_DRIVER_DSOUND 1 +#define SDL_AUDIO_DRIVER_XAUDIO2 0 +#define SDL_AUDIO_DRIVER_WINMM 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#define SDL_JOYSTICK_DINPUT 1 +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_DINPUT 1 +#define SDL_HAPTIC_XINPUT 1 + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#define SDL_THREAD_WINDOWS 1 + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_WINDOWS 1 + +#ifndef SDL_VIDEO_RENDER_D3D +#define SDL_VIDEO_RENDER_D3D 1 +#endif +#ifndef SDL_VIDEO_RENDER_D3D11 +#define SDL_VIDEO_RENDER_D3D11 0 +#endif + +/* Enable OpenGL support */ +#ifndef SDL_VIDEO_OPENGL +#define SDL_VIDEO_OPENGL 1 +#endif +#ifndef SDL_VIDEO_OPENGL_WGL +#define SDL_VIDEO_OPENGL_WGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL +#define SDL_VIDEO_RENDER_OGL 1 +#endif +#ifndef SDL_VIDEO_RENDER_OGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_OPENGL_ES2 1 +#endif +#ifndef SDL_VIDEO_OPENGL_EGL +#define SDL_VIDEO_OPENGL_EGL 1 +#endif + +/* Enable Vulkan support */ +#define SDL_VIDEO_VULKAN 1 + +/* Enable system power support */ +#define SDL_POWER_WINDOWS 1 + +/* Enable filesystem support */ +#define SDL_FILESYSTEM_WINDOWS 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* SDL_config_windows_h_ */ diff --git a/include/SDL/SDL_config_winrt.h b/include/SDL/SDL_config_winrt.h new file mode 100644 index 0000000..24f9e17 --- /dev/null +++ b/include/SDL/SDL_config_winrt.h @@ -0,0 +1,215 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_winrt_h_ +#define SDL_config_winrt_h_ +#define SDL_config_h_ + +#include "SDL_platform.h" + +/* Make sure the Windows SDK's NTDDI_VERSION macro gets defined. This is used + by SDL to determine which version of the Windows SDK is being used. +*/ +#include + +/* Define possibly-undefined NTDDI values (used when compiling SDL against + older versions of the Windows SDK. +*/ +#ifndef NTDDI_WINBLUE +#define NTDDI_WINBLUE 0x06030000 +#endif +#ifndef NTDDI_WIN10 +#define NTDDI_WIN10 0x0A000000 +#endif + +/* This is a set of defines to configure the SDL features */ + +#if !defined(_STDINT_H_) && (!defined(HAVE_STDINT_H) || !_HAVE_STDINT_H) +#if defined(__GNUC__) || defined(__DMC__) || defined(__WATCOMC__) +#define HAVE_STDINT_H 1 +#elif defined(_MSC_VER) +typedef signed __int8 int8_t; +typedef unsigned __int8 uint8_t; +typedef signed __int16 int16_t; +typedef unsigned __int16 uint16_t; +typedef signed __int32 int32_t; +typedef unsigned __int32 uint32_t; +typedef signed __int64 int64_t; +typedef unsigned __int64 uint64_t; +#ifndef _UINTPTR_T_DEFINED +#ifdef _WIN64 +typedef unsigned __int64 uintptr_t; +#else +typedef unsigned int uintptr_t; +#endif +#define _UINTPTR_T_DEFINED +#endif +/* Older Visual C++ headers don't have the Win64-compatible typedefs... */ +#if ((_MSC_VER <= 1200) && (!defined(DWORD_PTR))) +#define DWORD_PTR DWORD +#endif +#if ((_MSC_VER <= 1200) && (!defined(LONG_PTR))) +#define LONG_PTR LONG +#endif +#else /* !__GNUC__ && !_MSC_VER */ +typedef signed char int8_t; +typedef unsigned char uint8_t; +typedef signed short int16_t; +typedef unsigned short uint16_t; +typedef signed int int32_t; +typedef unsigned int uint32_t; +typedef signed long long int64_t; +typedef unsigned long long uint64_t; +#ifndef _SIZE_T_DEFINED_ +#define _SIZE_T_DEFINED_ +typedef unsigned int size_t; +#endif +typedef unsigned int uintptr_t; +#endif /* __GNUC__ || _MSC_VER */ +#endif /* !_STDINT_H_ && !HAVE_STDINT_H */ + +#ifdef _WIN64 +# define SIZEOF_VOIDP 8 +#else +# define SIZEOF_VOIDP 4 +#endif + +/* Useful headers */ +#define HAVE_DXGI_H 1 +#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP +#define HAVE_XINPUT_H 1 +#endif +#define HAVE_LIBC 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_SIGNAL_H 1 + +/* C library functions */ +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_MEMCMP 1 +#define HAVE_STRLEN 1 +#define HAVE__STRREV 1 +#define HAVE__STRUPR 1 +//#define HAVE__STRLWR 1 // TODO, WinRT: consider using _strlwr_s instead +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +//#define HAVE_ITOA 1 // TODO, WinRT: consider using _itoa_s instead +//#define HAVE__LTOA 1 // TODO, WinRT: consider using _ltoa_s instead +//#define HAVE__ULTOA 1 // TODO, WinRT: consider using _ultoa_s instead +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +//#define HAVE_STRTOLL 1 +#define HAVE_STRTOD 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE__STRICMP 1 +#define HAVE__STRNICMP 1 +#define HAVE_VSNPRINTF 1 +//#define HAVE_SSCANF 1 // TODO, WinRT: consider using sscanf_s instead +#define HAVE_M_PI 1 +#define HAVE_ATAN 1 +#define HAVE_ATAN2 1 +#define HAVE_CEIL 1 +#define HAVE__COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_POW 1 +//#define HAVE_SCALBN 1 +#define HAVE__SCALB 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE__FSEEKI64 1 + +/* Enable various audio drivers */ +#define SDL_AUDIO_DRIVER_XAUDIO2 1 +#define SDL_AUDIO_DRIVER_DISK 1 +#define SDL_AUDIO_DRIVER_DUMMY 1 + +/* Enable various input drivers */ +#if WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP +#define SDL_JOYSTICK_DISABLED 1 +#define SDL_HAPTIC_DISABLED 1 +#else +#define SDL_JOYSTICK_XINPUT 1 +#define SDL_HAPTIC_XINPUT 1 +#endif + +/* Enable various shared object loading systems */ +#define SDL_LOADSO_WINDOWS 1 + +/* Enable various threading systems */ +#if (NTDDI_VERSION >= NTDDI_WINBLUE) +#define SDL_THREAD_WINDOWS 1 +#else +/* WinRT on Windows 8.0 and Windows Phone 8.0 don't support CreateThread() */ +#define SDL_THREAD_STDCPP 1 +#endif + +/* Enable various timer systems */ +#define SDL_TIMER_WINDOWS 1 + +/* Enable various video drivers */ +#define SDL_VIDEO_DRIVER_WINRT 1 +#define SDL_VIDEO_DRIVER_DUMMY 1 + +/* Enable OpenGL ES 2.0 (via a modified ANGLE library) */ +#define SDL_VIDEO_OPENGL_ES2 1 +#define SDL_VIDEO_OPENGL_EGL 1 + +/* Enable appropriate renderer(s) */ +#define SDL_VIDEO_RENDER_D3D11 1 + +#if SDL_VIDEO_OPENGL_ES2 +#define SDL_VIDEO_RENDER_OGL_ES2 1 +#endif + +/* Enable system power support */ +#define SDL_POWER_WINRT 1 + +/* Enable assembly routines (Win64 doesn't have inline asm) */ +#ifndef _WIN64 +#define SDL_ASSEMBLY_ROUTINES 1 +#endif + +#endif /* SDL_config_winrt_h_ */ diff --git a/include/SDL/SDL_config_wiz.h b/include/SDL/SDL_config_wiz.h new file mode 100644 index 0000000..5bb845a --- /dev/null +++ b/include/SDL/SDL_config_wiz.h @@ -0,0 +1,121 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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 SDL_config_wiz_h_ +#define SDL_config_wiz_h_ +#define SDL_config_h_ + +/* This is a set of defines to configure the SDL features */ + +/* General platform specific identifiers */ +#include "SDL_platform.h" + +#define SDL_BYTEORDER 1234 + +#define HAVE_ALLOCA_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_STDIO_H 1 +#define STDC_HEADERS 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_MATH_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_MALLOC 1 +#define HAVE_CALLOC 1 +#define HAVE_REALLOC 1 +#define HAVE_FREE 1 +#define HAVE_ALLOCA 1 +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_QSORT 1 +#define HAVE_ABS 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMSET 1 +#define HAVE_MEMCPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRLEN 1 +#define HAVE_STRDUP 1 +#define HAVE_STRCHR 1 +#define HAVE_STRRCHR 1 +#define HAVE_STRSTR 1 +#define HAVE_STRTOL 1 +#define HAVE_STRTOUL 1 +#define HAVE_STRTOLL 1 +#define HAVE_STRTOULL 1 +#define HAVE_ATOI 1 +#define HAVE_ATOF 1 +#define HAVE_STRCMP 1 +#define HAVE_STRNCMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRNCASECMP 1 +#define HAVE_VSSCANF 1 +#define HAVE_VSNPRINTF 1 +#define HAVE_M_PI 1 +#define HAVE_CEIL 1 +#define HAVE_COPYSIGN 1 +#define HAVE_COS 1 +#define HAVE_COSF 1 +#define HAVE_FABS 1 +#define HAVE_FLOOR 1 +#define HAVE_LOG 1 +#define HAVE_SCALBN 1 +#define HAVE_SIN 1 +#define HAVE_SINF 1 +#define HAVE_SQRT 1 +#define HAVE_SQRTF 1 +#define HAVE_TAN 1 +#define HAVE_TANF 1 +#define HAVE_SIGACTION 1 +#define HAVE_SETJMP 1 +#define HAVE_NANOSLEEP 1 +#define HAVE_POW 1 + +#define SDL_AUDIO_DRIVER_DUMMY 1 +#define SDL_AUDIO_DRIVER_OSS 1 + +#define SDL_INPUT_LINUXEV 1 +#define SDL_INPUT_TSLIB 1 +#define SDL_JOYSTICK_LINUX 1 +#define SDL_HAPTIC_LINUX 1 + +#define SDL_LOADSO_DLOPEN 1 + +#define SDL_THREAD_PTHREAD 1 +#define SDL_THREAD_PTHREAD_RECURSIVE_MUTEX_NP 1 + +#define SDL_TIMER_UNIX 1 + +#define SDL_VIDEO_DRIVER_DUMMY 1 +#define SDL_VIDEO_DRIVER_PANDORA 1 +#define SDL_VIDEO_RENDER_OGL_ES 1 +#define SDL_VIDEO_OPENGL_ES 1 + +#endif /* SDL_config_wiz_h_ */ diff --git a/include/SDL/SDL_copying.h b/include/SDL/SDL_copying.h new file mode 100644 index 0000000..8f60af6 --- /dev/null +++ b/include/SDL/SDL_copying.h @@ -0,0 +1,20 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2017 Sam Lantinga + + 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/include/SDL/SDL_cpuinfo.h b/include/SDL/SDL_cpuinfo.h new file mode 100644 index 0000000..ed5e979 --- /dev/null +++ b/include/SDL/SDL_cpuinfo.h @@ -0,0 +1,594 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_cpuinfo.h + * + * CPU feature detection for SDL. + */ + +#ifndef SDL_cpuinfo_h_ +#define SDL_cpuinfo_h_ + +#include "SDL_stdinc.h" + +/* Need to do this here because intrin.h has C++ code in it */ +/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */ +#if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64)) +#ifdef __clang__ +/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, + so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ + +#ifndef __PRFCHWINTRIN_H +#define __PRFCHWINTRIN_H + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_m_prefetch(void *__P) +{ + __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */); +} + +#endif /* __PRFCHWINTRIN_H */ +#endif /* __clang__ */ +#include +#ifndef _WIN64 +#ifndef __MMX__ +#define __MMX__ +#endif +#ifndef __3dNOW__ +#define __3dNOW__ +#endif +#endif +#ifndef __SSE__ +#define __SSE__ +#endif +#ifndef __SSE2__ +#define __SSE2__ +#endif +#ifndef __SSE3__ +#define __SSE3__ +#endif +#elif defined(__MINGW64_VERSION_MAJOR) +#include +#if !defined(SDL_DISABLE_ARM_NEON_H) && defined(__ARM_NEON) +# include +#endif +#else +/* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC_H to have it included. */ +#if defined(HAVE_ALTIVEC_H) && defined(__ALTIVEC__) && !defined(__APPLE_ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC_H) +#include +#endif +#if !defined(SDL_DISABLE_ARM_NEON_H) +# if defined(__ARM_NEON) +# include +# elif defined(__WINDOWS__) || defined(__WINRT__) || defined(__GDK__) +/* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */ +# if defined(_M_ARM) +# include +# include +# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */ +# endif +# if defined (_M_ARM64) +# include +# include +# define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */ +# define __ARM_ARCH 8 +# endif +# endif +#endif +#endif /* compiler version */ + +#if defined(__3dNOW__) && !defined(SDL_DISABLE_MM3DNOW_H) +#include +#endif +#if defined(__loongarch_sx) && !defined(SDL_DISABLE_LSX_H) +#include +#define __LSX__ +#endif +#if defined(__loongarch_asx) && !defined(SDL_DISABLE_LASX_H) +#include +#define __LASX__ +#endif +#if defined(HAVE_IMMINTRIN_H) && !defined(SDL_DISABLE_IMMINTRIN_H) +#include +#else +#if defined(__MMX__) && !defined(SDL_DISABLE_MMINTRIN_H) +#include +#endif +#if defined(__SSE__) && !defined(SDL_DISABLE_XMMINTRIN_H) +#include +#endif +#if defined(__SSE2__) && !defined(SDL_DISABLE_EMMINTRIN_H) +#include +#endif +#if defined(__SSE3__) && !defined(SDL_DISABLE_PMMINTRIN_H) +#include +#endif +#endif /* HAVE_IMMINTRIN_H */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* This is a guess for the cacheline size used for padding. + * Most x86 processors have a 64 byte cache line. + * The 64-bit PowerPC processors have a 128 byte cache line. + * We'll use the larger value to be generally safe. + */ +#define SDL_CACHELINE_SIZE 128 + +/** + * Get the number of CPU cores available. + * + * \returns the total number of logical CPU cores. On CPUs that include + * technologies such as hyperthreading, the number of logical cores + * may be more than the number of physical cores. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCount(void); + +/** + * Determine the L1 cache line size of the CPU. + * + * This is useful for determining multi-threaded structure padding or SIMD + * prefetch sizes. + * + * \returns the L1 cache line size of the CPU, in bytes. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_GetCPUCacheLineSize(void); + +/** + * Determine whether the CPU has the RDTSC instruction. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has the RDTSC instruction or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasRDTSC(void); + +/** + * Determine whether the CPU has AltiVec features. + * + * This always returns false on CPUs that aren't using PowerPC instruction + * sets. + * + * \returns SDL_TRUE if the CPU has AltiVec features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAltiVec(void); + +/** + * Determine whether the CPU has MMX features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has MMX features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasMMX(void); + +/** + * Determine whether the CPU has 3DNow! features. + * + * This always returns false on CPUs that aren't using AMD instruction sets. + * + * \returns SDL_TRUE if the CPU has 3DNow! features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Has3DNow(void); + +/** + * Determine whether the CPU has SSE features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE(void); + +/** + * Determine whether the CPU has SSE2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE2(void); + +/** + * Determine whether the CPU has SSE3 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE3 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE3(void); + +/** + * Determine whether the CPU has SSE4.1 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE4.1 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE41(void); + +/** + * Determine whether the CPU has SSE4.2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has SSE4.2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSSE42(void); + +/** + * Determine whether the CPU has AVX features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX2 + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX(void); + +/** + * Determine whether the CPU has AVX2 features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX2 features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_Has3DNow + * \sa SDL_HasAltiVec + * \sa SDL_HasAVX + * \sa SDL_HasMMX + * \sa SDL_HasRDTSC + * \sa SDL_HasSSE + * \sa SDL_HasSSE2 + * \sa SDL_HasSSE3 + * \sa SDL_HasSSE41 + * \sa SDL_HasSSE42 + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX2(void); + +/** + * Determine whether the CPU has AVX-512F (foundation) features. + * + * This always returns false on CPUs that aren't using Intel instruction sets. + * + * \returns SDL_TRUE if the CPU has AVX-512F features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_HasAVX + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasAVX512F(void); + +/** + * Determine whether the CPU has ARM SIMD (ARMv6) features. + * + * This is different from ARM NEON, which is a different instruction set. + * + * This always returns false on CPUs that aren't using ARM instruction sets. + * + * \returns SDL_TRUE if the CPU has ARM SIMD features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_HasNEON + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasARMSIMD(void); + +/** + * Determine whether the CPU has NEON (ARM SIMD) features. + * + * This always returns false on CPUs that aren't using ARM instruction sets. + * + * \returns SDL_TRUE if the CPU has ARM NEON features or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasNEON(void); + +/** + * Determine whether the CPU has LSX (LOONGARCH SIMD) features. + * + * This always returns false on CPUs that aren't using LOONGARCH instruction + * sets. + * + * \returns SDL_TRUE if the CPU has LOONGARCH LSX features or SDL_FALSE if + * not. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasLSX(void); + +/** + * Determine whether the CPU has LASX (LOONGARCH SIMD) features. + * + * This always returns false on CPUs that aren't using LOONGARCH instruction + * sets. + * + * \returns SDL_TRUE if the CPU has LOONGARCH LASX features or SDL_FALSE if + * not. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasLASX(void); + +/** + * Get the amount of RAM configured in the system. + * + * \returns the amount of RAM configured in the system in MiB. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC int SDLCALL SDL_GetSystemRAM(void); + +/** + * Report the alignment this system needs for SIMD allocations. + * + * This will return the minimum number of bytes to which a pointer must be + * aligned to be compatible with SIMD instructions on the current machine. For + * example, if the machine supports SSE only, it will return 16, but if it + * supports AVX-512F, it'll return 64 (etc). This only reports values for + * instruction sets SDL knows about, so if your SDL build doesn't have + * SDL_HasAVX512F(), then it might return 16 for the SSE support it sees and + * not 64 for the AVX-512 instructions that exist but SDL doesn't know about. + * Plan accordingly. + * + * \returns the alignment in bytes needed for available, known SIMD + * instructions. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC size_t SDLCALL SDL_SIMDGetAlignment(void); + +/** + * Allocate memory in a SIMD-friendly way. + * + * This will allocate a block of memory that is suitable for use with SIMD + * instructions. Specifically, it will be properly aligned and padded for the + * system's supported vector instructions. + * + * The memory returned will be padded such that it is safe to read or write an + * incomplete vector at the end of the memory block. This can be useful so you + * don't have to drop back to a scalar fallback at the end of your SIMD + * processing loop to deal with the final elements without overflowing the + * allocated buffer. + * + * You must free this memory with SDL_FreeSIMD(), not free() or SDL_free() or + * delete[], etc. + * + * Note that SDL will only deal with SIMD instruction sets it is aware of; for + * example, SDL 2.0.8 knows that SSE wants 16-byte vectors (SDL_HasSSE()), and + * AVX2 wants 32 bytes (SDL_HasAVX2()), but doesn't know that AVX-512 wants + * 64. To be clear: if you can't decide to use an instruction set with an + * SDL_Has*() function, don't use that instruction set with memory allocated + * through here. + * + * SDL_AllocSIMD(0) will return a non-NULL pointer, assuming the system isn't + * out of memory, but you are not allowed to dereference it (because you only + * own zero bytes of that buffer). + * + * \param len The length, in bytes, of the block to allocate. The actual + * allocated block might be larger due to padding, etc. + * \returns a pointer to the newly-allocated block, NULL if out of memory. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_SIMDGetAlignment + * \sa SDL_SIMDRealloc + * \sa SDL_SIMDFree + */ +extern DECLSPEC void * SDLCALL SDL_SIMDAlloc(const size_t len); + +/** + * Reallocate memory obtained from SDL_SIMDAlloc + * + * It is not valid to use this function on a pointer from anything but + * SDL_SIMDAlloc(). It can't be used on pointers from malloc, realloc, + * SDL_malloc, memalign, new[], etc. + * + * \param mem The pointer obtained from SDL_SIMDAlloc. This function also + * accepts NULL, at which point this function is the same as + * calling SDL_SIMDAlloc with a NULL pointer. + * \param len The length, in bytes, of the block to allocated. The actual + * allocated block might be larger due to padding, etc. Passing 0 + * will return a non-NULL pointer, assuming the system isn't out of + * memory. + * \returns a pointer to the newly-reallocated block, NULL if out of memory. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_SIMDGetAlignment + * \sa SDL_SIMDAlloc + * \sa SDL_SIMDFree + */ +extern DECLSPEC void * SDLCALL SDL_SIMDRealloc(void *mem, const size_t len); + +/** + * Deallocate memory obtained from SDL_SIMDAlloc + * + * It is not valid to use this function on a pointer from anything but + * SDL_SIMDAlloc() or SDL_SIMDRealloc(). It can't be used on pointers from + * malloc, realloc, SDL_malloc, memalign, new[], etc. + * + * However, SDL_SIMDFree(NULL) is a legal no-op. + * + * The memory pointed to by `ptr` is no longer valid for access upon return, + * and may be returned to the system or reused by a future allocation. The + * pointer passed to this function is no longer safe to dereference once this + * function returns, and should be discarded. + * + * \param ptr The pointer, returned from SDL_SIMDAlloc or SDL_SIMDRealloc, to + * deallocate. NULL is a legal no-op. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_SIMDAlloc + * \sa SDL_SIMDRealloc + */ +extern DECLSPEC void SDLCALL SDL_SIMDFree(void *ptr); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_cpuinfo_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_egl.h b/include/SDL/SDL_egl.h new file mode 100644 index 0000000..6f51c08 --- /dev/null +++ b/include/SDL/SDL_egl.h @@ -0,0 +1,2352 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_egl.h + * + * This is a simple file to encapsulate the EGL API headers. + */ +#if !defined(_MSC_VER) && !defined(__ANDROID__) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS) + +#if defined(__vita__) || defined(__psp2__) +#include +#endif + +#include +#include + +#else /* _MSC_VER */ + +/* EGL headers for Visual Studio */ + +#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_ */ + + +#ifndef __eglplatform_h_ +#define __eglplatform_h_ + +/* +** Copyright 2007-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for egl.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * You are encouraged to submit all modifications to the Khronos group so that + * they can be included in future versions of this file. Please submit changes + * by filing an issue or pull request on the public Khronos EGL Registry, at + * https://www.github.com/KhronosGroup/EGL-Registry/ + */ + +/*#include */ + +/* Macros used in EGL function prototype declarations. + * + * EGL functions should be prototyped as: + * + * EGLAPI return-type EGLAPIENTRY eglFunction(arguments); + * typedef return-type (EXPAPIENTRYP PFNEGLFUNCTIONPROC) (arguments); + * + * KHRONOS_APICALL and KHRONOS_APIENTRY are defined in KHR/khrplatform.h + */ + +#ifndef EGLAPI +#define EGLAPI KHRONOS_APICALL +#endif + +#ifndef EGLAPIENTRY +#define EGLAPIENTRY KHRONOS_APIENTRY +#endif +#define EGLAPIENTRYP EGLAPIENTRY* + +/* The types NativeDisplayType, NativeWindowType, and NativePixmapType + * are aliases of window-system-dependent types, such as X Display * or + * Windows Device Context. They must be defined in platform-specific + * code below. The EGL-prefixed versions of Native*Type are the same + * types, renamed in EGL 1.3 so all types in the API start with "EGL". + * + * Khronos STRONGLY RECOMMENDS that you use the default definitions + * provided below, since these changes affect both binary and source + * portability of applications using EGL running on different EGL + * implementations. + */ + +#if defined(EGL_NO_PLATFORM_SPECIFIC_TYPES) + +typedef void *EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(_WIN32) || defined(__VC32__) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) /* Win32 and WinCE */ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include + +typedef HDC EGLNativeDisplayType; +typedef HBITMAP EGLNativePixmapType; +typedef HWND EGLNativeWindowType; + +#elif defined(__EMSCRIPTEN__) + +typedef int EGLNativeDisplayType; +typedef int EGLNativePixmapType; +typedef int EGLNativeWindowType; + +#elif defined(__WINSCW__) || defined(__SYMBIAN32__) /* Symbian */ + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(WL_EGL_PLATFORM) + +typedef struct wl_display *EGLNativeDisplayType; +typedef struct wl_egl_pixmap *EGLNativePixmapType; +typedef struct wl_egl_window *EGLNativeWindowType; + +#elif defined(__GBM__) + +typedef struct gbm_device *EGLNativeDisplayType; +typedef struct gbm_bo *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__ANDROID__) || defined(ANDROID) + +struct ANativeWindow; +struct egl_native_pixmap_t; + +typedef void* EGLNativeDisplayType; +typedef struct egl_native_pixmap_t* EGLNativePixmapType; +typedef struct ANativeWindow* EGLNativeWindowType; + +#elif defined(USE_OZONE) + +typedef intptr_t EGLNativeDisplayType; +typedef intptr_t EGLNativePixmapType; +typedef intptr_t EGLNativeWindowType; + +#elif defined(USE_X11) + +/* X11 (tentative) */ +#include +#include + +typedef Display *EGLNativeDisplayType; +typedef Pixmap EGLNativePixmapType; +typedef Window EGLNativeWindowType; + +#elif defined(__unix__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__APPLE__) + +typedef int EGLNativeDisplayType; +typedef void *EGLNativePixmapType; +typedef void *EGLNativeWindowType; + +#elif defined(__HAIKU__) + +#include + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#elif defined(__Fuchsia__) + +typedef void *EGLNativeDisplayType; +typedef khronos_uintptr_t EGLNativePixmapType; +typedef khronos_uintptr_t EGLNativeWindowType; + +#else +#error "Platform not recognized" +#endif + +/* EGL 1.2 types, renamed for consistency in EGL 1.3 */ +typedef EGLNativeDisplayType NativeDisplayType; +typedef EGLNativePixmapType NativePixmapType; +typedef EGLNativeWindowType NativeWindowType; + + +/* Define EGLint. This must be a signed integral type large enough to contain + * all legal attribute names and values passed into and out of EGL, whether + * their type is boolean, bitmask, enumerant (symbolic constant), integer, + * handle, or other. While in general a 32-bit integer will suffice, if + * handles are 64 bit types, then EGLint should be defined as a signed 64-bit + * integer type. + */ +typedef khronos_int32_t EGLint; + + +/* C++ / C typecast macros for special EGL handle values */ +#if defined(__cplusplus) +#define EGL_CAST(type, value) (static_cast(value)) +#else +#define EGL_CAST(type, value) ((type) (value)) +#endif + +#endif /* __eglplatform_h */ + + +#ifndef __egl_h_ +#define __egl_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +** +** This header is generated from the Khronos EGL XML API Registry. +** The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.khronos.org/registry/egl +** +** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $ +*/ + +/*#include */ + +#ifndef EGL_EGL_PROTOTYPES +#define EGL_EGL_PROTOTYPES 1 +#endif + +/* Generated on date 20220525 */ + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: .* + * Default extensions included: None + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_VERSION_1_0 +#define EGL_VERSION_1_0 1 +typedef unsigned int EGLBoolean; +typedef void *EGLDisplay; +/*#include */ +/*#include */ +typedef void *EGLConfig; +typedef void *EGLSurface; +typedef void *EGLContext; +typedef void (*__eglMustCastToProperFunctionPointerType)(void); +#define EGL_ALPHA_SIZE 0x3021 +#define EGL_BAD_ACCESS 0x3002 +#define EGL_BAD_ALLOC 0x3003 +#define EGL_BAD_ATTRIBUTE 0x3004 +#define EGL_BAD_CONFIG 0x3005 +#define EGL_BAD_CONTEXT 0x3006 +#define EGL_BAD_CURRENT_SURFACE 0x3007 +#define EGL_BAD_DISPLAY 0x3008 +#define EGL_BAD_MATCH 0x3009 +#define EGL_BAD_NATIVE_PIXMAP 0x300A +#define EGL_BAD_NATIVE_WINDOW 0x300B +#define EGL_BAD_PARAMETER 0x300C +#define EGL_BAD_SURFACE 0x300D +#define EGL_BLUE_SIZE 0x3022 +#define EGL_BUFFER_SIZE 0x3020 +#define EGL_CONFIG_CAVEAT 0x3027 +#define EGL_CONFIG_ID 0x3028 +#define EGL_CORE_NATIVE_ENGINE 0x305B +#define EGL_DEPTH_SIZE 0x3025 +#define EGL_DONT_CARE EGL_CAST(EGLint,-1) +#define EGL_DRAW 0x3059 +#define EGL_EXTENSIONS 0x3055 +#define EGL_FALSE 0 +#define EGL_GREEN_SIZE 0x3023 +#define EGL_HEIGHT 0x3056 +#define EGL_LARGEST_PBUFFER 0x3058 +#define EGL_LEVEL 0x3029 +#define EGL_MAX_PBUFFER_HEIGHT 0x302A +#define EGL_MAX_PBUFFER_PIXELS 0x302B +#define EGL_MAX_PBUFFER_WIDTH 0x302C +#define EGL_NATIVE_RENDERABLE 0x302D +#define EGL_NATIVE_VISUAL_ID 0x302E +#define EGL_NATIVE_VISUAL_TYPE 0x302F +#define EGL_NONE 0x3038 +#define EGL_NON_CONFORMANT_CONFIG 0x3051 +#define EGL_NOT_INITIALIZED 0x3001 +#define EGL_NO_CONTEXT EGL_CAST(EGLContext,0) +#define EGL_NO_DISPLAY EGL_CAST(EGLDisplay,0) +#define EGL_NO_SURFACE EGL_CAST(EGLSurface,0) +#define EGL_PBUFFER_BIT 0x0001 +#define EGL_PIXMAP_BIT 0x0002 +#define EGL_READ 0x305A +#define EGL_RED_SIZE 0x3024 +#define EGL_SAMPLES 0x3031 +#define EGL_SAMPLE_BUFFERS 0x3032 +#define EGL_SLOW_CONFIG 0x3050 +#define EGL_STENCIL_SIZE 0x3026 +#define EGL_SUCCESS 0x3000 +#define EGL_SURFACE_TYPE 0x3033 +#define EGL_TRANSPARENT_BLUE_VALUE 0x3035 +#define EGL_TRANSPARENT_GREEN_VALUE 0x3036 +#define EGL_TRANSPARENT_RED_VALUE 0x3037 +#define EGL_TRANSPARENT_RGB 0x3052 +#define EGL_TRANSPARENT_TYPE 0x3034 +#define EGL_TRUE 1 +#define EGL_VENDOR 0x3053 +#define EGL_VERSION 0x3054 +#define EGL_WIDTH 0x3057 +#define EGL_WINDOW_BIT 0x0004 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCHOOSECONFIGPROC) (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOPYBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +typedef EGLContext (EGLAPIENTRYP PFNEGLCREATECONTEXTPROC) (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERSURFACEPROC) (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGATTRIBPROC) (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCONFIGSPROC) (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETCURRENTDISPLAYPROC) (void); +typedef EGLSurface (EGLAPIENTRYP PFNEGLGETCURRENTSURFACEPROC) (EGLint readdraw); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETDISPLAYPROC) (EGLNativeDisplayType display_id); +typedef EGLint (EGLAPIENTRYP PFNEGLGETERRORPROC) (void); +typedef __eglMustCastToProperFunctionPointerType (EGLAPIENTRYP PFNEGLGETPROCADDRESSPROC) (const char *procname); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLINITIALIZEPROC) (EGLDisplay dpy, EGLint *major, EGLint *minor); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLMAKECURRENTPROC) (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYCONTEXTPROC) (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYSTRINGPROC) (EGLDisplay dpy, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSPROC) (EGLDisplay dpy, EGLSurface surface); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLTERMINATEPROC) (EGLDisplay dpy); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITGLPROC) (void); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITNATIVEPROC) (EGLint engine); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig (EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLBoolean EGLAPIENTRY eglCopyBuffers (EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target); +EGLAPI EGLContext EGLAPIENTRY eglCreateContext (EGLDisplay dpy, EGLConfig config, EGLContext share_context, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferSurface (EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurface (EGLDisplay dpy, EGLConfig config, EGLNativePixmapType pixmap, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreateWindowSurface (EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyContext (EGLDisplay dpy, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySurface (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib (EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs (EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); +EGLAPI EGLDisplay EGLAPIENTRY eglGetCurrentDisplay (void); +EGLAPI EGLSurface EGLAPIENTRY eglGetCurrentSurface (EGLint readdraw); +EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay (EGLNativeDisplayType display_id); +EGLAPI EGLint EGLAPIENTRY eglGetError (void); +EGLAPI __eglMustCastToProperFunctionPointerType EGLAPIENTRY eglGetProcAddress (const char *procname); +EGLAPI EGLBoolean EGLAPIENTRY eglInitialize (EGLDisplay dpy, EGLint *major, EGLint *minor); +EGLAPI EGLBoolean EGLAPIENTRY eglMakeCurrent (EGLDisplay dpy, EGLSurface draw, EGLSurface read, EGLContext ctx); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryContext (EGLDisplay dpy, EGLContext ctx, EGLint attribute, EGLint *value); +EGLAPI const char *EGLAPIENTRY eglQueryString (EGLDisplay dpy, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffers (EGLDisplay dpy, EGLSurface surface); +EGLAPI EGLBoolean EGLAPIENTRY eglTerminate (EGLDisplay dpy); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitGL (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitNative (EGLint engine); +#endif +#endif /* EGL_VERSION_1_0 */ + +#ifndef EGL_VERSION_1_1 +#define EGL_VERSION_1_1 1 +#define EGL_BACK_BUFFER 0x3084 +#define EGL_BIND_TO_TEXTURE_RGB 0x3039 +#define EGL_BIND_TO_TEXTURE_RGBA 0x303A +#define EGL_CONTEXT_LOST 0x300E +#define EGL_MIN_SWAP_INTERVAL 0x303B +#define EGL_MAX_SWAP_INTERVAL 0x303C +#define EGL_MIPMAP_TEXTURE 0x3082 +#define EGL_MIPMAP_LEVEL 0x3083 +#define EGL_NO_TEXTURE 0x305C +#define EGL_TEXTURE_2D 0x305F +#define EGL_TEXTURE_FORMAT 0x3080 +#define EGL_TEXTURE_RGB 0x305D +#define EGL_TEXTURE_RGBA 0x305E +#define EGL_TEXTURE_TARGET 0x3081 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDTEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETEXIMAGEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSURFACEATTRIBPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPINTERVALPROC) (EGLDisplay dpy, EGLint interval); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseTexImage (EGLDisplay dpy, EGLSurface surface, EGLint buffer); +EGLAPI EGLBoolean EGLAPIENTRY eglSurfaceAttrib (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglSwapInterval (EGLDisplay dpy, EGLint interval); +#endif +#endif /* EGL_VERSION_1_1 */ + +#ifndef EGL_VERSION_1_2 +#define EGL_VERSION_1_2 1 +typedef unsigned int EGLenum; +typedef void *EGLClientBuffer; +#define EGL_ALPHA_FORMAT 0x3088 +#define EGL_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_ALPHA_FORMAT_PRE 0x308C +#define EGL_ALPHA_MASK_SIZE 0x303E +#define EGL_BUFFER_PRESERVED 0x3094 +#define EGL_BUFFER_DESTROYED 0x3095 +#define EGL_CLIENT_APIS 0x308D +#define EGL_COLORSPACE 0x3087 +#define EGL_COLORSPACE_sRGB 0x3089 +#define EGL_COLORSPACE_LINEAR 0x308A +#define EGL_COLOR_BUFFER_TYPE 0x303F +#define EGL_CONTEXT_CLIENT_TYPE 0x3097 +#define EGL_DISPLAY_SCALING 10000 +#define EGL_HORIZONTAL_RESOLUTION 0x3090 +#define EGL_LUMINANCE_BUFFER 0x308F +#define EGL_LUMINANCE_SIZE 0x303D +#define EGL_OPENGL_ES_BIT 0x0001 +#define EGL_OPENVG_BIT 0x0002 +#define EGL_OPENGL_ES_API 0x30A0 +#define EGL_OPENVG_API 0x30A1 +#define EGL_OPENVG_IMAGE 0x3096 +#define EGL_PIXEL_ASPECT_RATIO 0x3092 +#define EGL_RENDERABLE_TYPE 0x3040 +#define EGL_RENDER_BUFFER 0x3086 +#define EGL_RGB_BUFFER 0x308E +#define EGL_SINGLE_BUFFER 0x3085 +#define EGL_SWAP_BEHAVIOR 0x3093 +#define EGL_UNKNOWN EGL_CAST(EGLint,-1) +#define EGL_VERTICAL_RESOLUTION 0x3091 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDAPIPROC) (EGLenum api); +typedef EGLenum (EGLAPIENTRYP PFNEGLQUERYAPIPROC) (void); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPBUFFERFROMCLIENTBUFFERPROC) (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRELEASETHREADPROC) (void); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITCLIENTPROC) (void); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindAPI (EGLenum api); +EGLAPI EGLenum EGLAPIENTRY eglQueryAPI (void); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePbufferFromClientBuffer (EGLDisplay dpy, EGLenum buftype, EGLClientBuffer buffer, EGLConfig config, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglReleaseThread (void); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitClient (void); +#endif +#endif /* EGL_VERSION_1_2 */ + +#ifndef EGL_VERSION_1_3 +#define EGL_VERSION_1_3 1 +#define EGL_CONFORMANT 0x3042 +#define EGL_CONTEXT_CLIENT_VERSION 0x3098 +#define EGL_MATCH_NATIVE_PIXMAP 0x3041 +#define EGL_OPENGL_ES2_BIT 0x0004 +#define EGL_VG_ALPHA_FORMAT 0x3088 +#define EGL_VG_ALPHA_FORMAT_NONPRE 0x308B +#define EGL_VG_ALPHA_FORMAT_PRE 0x308C +#define EGL_VG_ALPHA_FORMAT_PRE_BIT 0x0040 +#define EGL_VG_COLORSPACE 0x3087 +#define EGL_VG_COLORSPACE_sRGB 0x3089 +#define EGL_VG_COLORSPACE_LINEAR 0x308A +#define EGL_VG_COLORSPACE_LINEAR_BIT 0x0020 +#endif /* EGL_VERSION_1_3 */ + +#ifndef EGL_VERSION_1_4 +#define EGL_VERSION_1_4 1 +#define EGL_DEFAULT_DISPLAY EGL_CAST(EGLNativeDisplayType,0) +#define EGL_MULTISAMPLE_RESOLVE_BOX_BIT 0x0200 +#define EGL_MULTISAMPLE_RESOLVE 0x3099 +#define EGL_MULTISAMPLE_RESOLVE_DEFAULT 0x309A +#define EGL_MULTISAMPLE_RESOLVE_BOX 0x309B +#define EGL_OPENGL_API 0x30A2 +#define EGL_OPENGL_BIT 0x0008 +#define EGL_SWAP_BEHAVIOR_PRESERVED_BIT 0x0400 +typedef EGLContext (EGLAPIENTRYP PFNEGLGETCURRENTCONTEXTPROC) (void); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLContext EGLAPIENTRY eglGetCurrentContext (void); +#endif +#endif /* EGL_VERSION_1_4 */ + +#ifndef EGL_VERSION_1_5 +#define EGL_VERSION_1_5 1 +typedef void *EGLSync; +typedef intptr_t EGLAttrib; +typedef khronos_utime_nanoseconds_t EGLTime; +typedef void *EGLImage; +#define EGL_CONTEXT_MAJOR_VERSION 0x3098 +#define EGL_CONTEXT_MINOR_VERSION 0x30FB +#define EGL_CONTEXT_OPENGL_PROFILE_MASK 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY 0x31BD +#define EGL_NO_RESET_NOTIFICATION 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET 0x31BF +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT 0x00000002 +#define EGL_CONTEXT_OPENGL_DEBUG 0x31B0 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE 0x31B1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS 0x31B2 +#define EGL_OPENGL_ES3_BIT 0x00000040 +#define EGL_CL_EVENT_HANDLE 0x309C +#define EGL_SYNC_CL_EVENT 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE 0x30FF +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE 0x30F0 +#define EGL_SYNC_TYPE 0x30F7 +#define EGL_SYNC_STATUS 0x30F1 +#define EGL_SYNC_CONDITION 0x30F8 +#define EGL_SIGNALED 0x30F2 +#define EGL_UNSIGNALED 0x30F3 +#define EGL_SYNC_FLUSH_COMMANDS_BIT 0x0001 +#define EGL_FOREVER 0xFFFFFFFFFFFFFFFFull +#define EGL_TIMEOUT_EXPIRED 0x30F5 +#define EGL_CONDITION_SATISFIED 0x30F6 +#define EGL_NO_SYNC EGL_CAST(EGLSync,0) +#define EGL_SYNC_FENCE 0x30F9 +#define EGL_GL_COLORSPACE 0x309D +#define EGL_GL_COLORSPACE_SRGB 0x3089 +#define EGL_GL_COLORSPACE_LINEAR 0x308A +#define EGL_GL_RENDERBUFFER 0x30B9 +#define EGL_GL_TEXTURE_2D 0x30B1 +#define EGL_GL_TEXTURE_LEVEL 0x30BC +#define EGL_GL_TEXTURE_3D 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET 0x30BD +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 0x30B8 +#define EGL_IMAGE_PRESERVED 0x30D2 +#define EGL_NO_IMAGE EGL_CAST(EGLImage,0) +typedef EGLSync (EGLAPIENTRYP PFNEGLCREATESYNCPROC) (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCPROC) (EGLDisplay dpy, EGLSync sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBPROC) (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); +typedef EGLImage (EGLAPIENTRYP PFNEGLCREATEIMAGEPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEPROC) (EGLDisplay dpy, EGLImage image); +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYPROC) (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLWAITSYNCPROC) (EGLDisplay dpy, EGLSync sync, EGLint flags); +#if EGL_EGL_PROTOTYPES +EGLAPI EGLSync EGLAPIENTRY eglCreateSync (EGLDisplay dpy, EGLenum type, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySync (EGLDisplay dpy, EGLSync sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags, EGLTime timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttrib (EGLDisplay dpy, EGLSync sync, EGLint attribute, EGLAttrib *value); +EGLAPI EGLImage EGLAPIENTRY eglCreateImage (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImage (EGLDisplay dpy, EGLImage image); +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplay (EGLenum platform, void *native_display, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurface (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLAttrib *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurface (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglWaitSync (EGLDisplay dpy, EGLSync sync, EGLint flags); +#endif +#endif /* EGL_VERSION_1_5 */ + +#ifdef __cplusplus +} +#endif + +#endif /* __egl_h_ */ + + +#ifndef __eglext_h_ +#define __eglext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +** +** This header is generated from the Khronos EGL XML API Registry. +** The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** http://www.khronos.org/registry/egl +** +** Khronos $Git commit SHA1: 6fb1daea15 $ on $Git commit date: 2022-05-25 09:41:13 -0600 $ +*/ + +/*#include */ + +#define EGL_EGLEXT_VERSION 20220525 + +/* Generated C header for: + * API: egl + * Versions considered: .* + * Versions emitted: _nomatch_^ + * Default extensions included: egl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef EGL_KHR_cl_event +#define EGL_KHR_cl_event 1 +#define EGL_CL_EVENT_HANDLE_KHR 0x309C +#define EGL_SYNC_CL_EVENT_KHR 0x30FE +#define EGL_SYNC_CL_EVENT_COMPLETE_KHR 0x30FF +#endif /* EGL_KHR_cl_event */ + +#ifndef EGL_KHR_cl_event2 +#define EGL_KHR_cl_event2 1 +typedef void *EGLSyncKHR; +typedef intptr_t EGLAttribKHR; +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNC64KHRPROC) (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSync64KHR (EGLDisplay dpy, EGLenum type, const EGLAttribKHR *attrib_list); +#endif +#endif /* EGL_KHR_cl_event2 */ + +#ifndef EGL_KHR_client_get_all_proc_addresses +#define EGL_KHR_client_get_all_proc_addresses 1 +#endif /* EGL_KHR_client_get_all_proc_addresses */ + +#ifndef EGL_KHR_config_attribs +#define EGL_KHR_config_attribs 1 +#define EGL_CONFORMANT_KHR 0x3042 +#define EGL_VG_COLORSPACE_LINEAR_BIT_KHR 0x0020 +#define EGL_VG_ALPHA_FORMAT_PRE_BIT_KHR 0x0040 +#endif /* EGL_KHR_config_attribs */ + +#ifndef EGL_KHR_context_flush_control +#define EGL_KHR_context_flush_control 1 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_NONE_KHR 0 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x2097 +#define EGL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x2098 +#endif /* EGL_KHR_context_flush_control */ + +#ifndef EGL_KHR_create_context +#define EGL_KHR_create_context 1 +#define EGL_CONTEXT_MAJOR_VERSION_KHR 0x3098 +#define EGL_CONTEXT_MINOR_VERSION_KHR 0x30FB +#define EGL_CONTEXT_FLAGS_KHR 0x30FC +#define EGL_CONTEXT_OPENGL_PROFILE_MASK_KHR 0x30FD +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_KHR 0x31BD +#define EGL_NO_RESET_NOTIFICATION_KHR 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_KHR 0x31BF +#define EGL_CONTEXT_OPENGL_DEBUG_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE_BIT_KHR 0x00000002 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_BIT_KHR 0x00000004 +#define EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT_KHR 0x00000001 +#define EGL_CONTEXT_OPENGL_COMPATIBILITY_PROFILE_BIT_KHR 0x00000002 +#define EGL_OPENGL_ES3_BIT_KHR 0x00000040 +#endif /* EGL_KHR_create_context */ + +#ifndef EGL_KHR_create_context_no_error +#define EGL_KHR_create_context_no_error 1 +#define EGL_CONTEXT_OPENGL_NO_ERROR_KHR 0x31B3 +#endif /* EGL_KHR_create_context_no_error */ + +#ifndef EGL_KHR_debug +#define EGL_KHR_debug 1 +typedef void *EGLLabelKHR; +typedef void *EGLObjectKHR; +typedef void (EGLAPIENTRY *EGLDEBUGPROCKHR)(EGLenum error,const char *command,EGLint messageType,EGLLabelKHR threadLabel,EGLLabelKHR objectLabel,const char* message); +#define EGL_OBJECT_THREAD_KHR 0x33B0 +#define EGL_OBJECT_DISPLAY_KHR 0x33B1 +#define EGL_OBJECT_CONTEXT_KHR 0x33B2 +#define EGL_OBJECT_SURFACE_KHR 0x33B3 +#define EGL_OBJECT_IMAGE_KHR 0x33B4 +#define EGL_OBJECT_SYNC_KHR 0x33B5 +#define EGL_OBJECT_STREAM_KHR 0x33B6 +#define EGL_DEBUG_MSG_CRITICAL_KHR 0x33B9 +#define EGL_DEBUG_MSG_ERROR_KHR 0x33BA +#define EGL_DEBUG_MSG_WARN_KHR 0x33BB +#define EGL_DEBUG_MSG_INFO_KHR 0x33BC +#define EGL_DEBUG_CALLBACK_KHR 0x33B8 +typedef EGLint (EGLAPIENTRYP PFNEGLDEBUGMESSAGECONTROLKHRPROC) (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEBUGKHRPROC) (EGLint attribute, EGLAttrib *value); +typedef EGLint (EGLAPIENTRYP PFNEGLLABELOBJECTKHRPROC) (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglDebugMessageControlKHR (EGLDEBUGPROCKHR callback, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDebugKHR (EGLint attribute, EGLAttrib *value); +EGLAPI EGLint EGLAPIENTRY eglLabelObjectKHR (EGLDisplay display, EGLenum objectType, EGLObjectKHR object, EGLLabelKHR label); +#endif +#endif /* EGL_KHR_debug */ + +#ifndef EGL_KHR_display_reference +#define EGL_KHR_display_reference 1 +#define EGL_TRACK_REFERENCES_KHR 0x3352 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBKHRPROC) (EGLDisplay dpy, EGLint name, EGLAttrib *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribKHR (EGLDisplay dpy, EGLint name, EGLAttrib *value); +#endif +#endif /* EGL_KHR_display_reference */ + +#ifndef EGL_KHR_fence_sync +#define EGL_KHR_fence_sync 1 +typedef khronos_utime_nanoseconds_t EGLTimeKHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR 0x30F0 +#define EGL_SYNC_CONDITION_KHR 0x30F8 +#define EGL_SYNC_FENCE_KHR 0x30F9 +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESYNCKHRPROC) (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateSyncKHR (EGLDisplay dpy, EGLenum type, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncKHR (EGLDisplay dpy, EGLSyncKHR sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags, EGLTimeKHR timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_fence_sync */ + +#ifndef EGL_KHR_get_all_proc_addresses +#define EGL_KHR_get_all_proc_addresses 1 +#endif /* EGL_KHR_get_all_proc_addresses */ + +#ifndef EGL_KHR_gl_colorspace +#define EGL_KHR_gl_colorspace 1 +#define EGL_GL_COLORSPACE_KHR 0x309D +#define EGL_GL_COLORSPACE_SRGB_KHR 0x3089 +#define EGL_GL_COLORSPACE_LINEAR_KHR 0x308A +#endif /* EGL_KHR_gl_colorspace */ + +#ifndef EGL_KHR_gl_renderbuffer_image +#define EGL_KHR_gl_renderbuffer_image 1 +#define EGL_GL_RENDERBUFFER_KHR 0x30B9 +#endif /* EGL_KHR_gl_renderbuffer_image */ + +#ifndef EGL_KHR_gl_texture_2D_image +#define EGL_KHR_gl_texture_2D_image 1 +#define EGL_GL_TEXTURE_2D_KHR 0x30B1 +#define EGL_GL_TEXTURE_LEVEL_KHR 0x30BC +#endif /* EGL_KHR_gl_texture_2D_image */ + +#ifndef EGL_KHR_gl_texture_3D_image +#define EGL_KHR_gl_texture_3D_image 1 +#define EGL_GL_TEXTURE_3D_KHR 0x30B2 +#define EGL_GL_TEXTURE_ZOFFSET_KHR 0x30BD +#endif /* EGL_KHR_gl_texture_3D_image */ + +#ifndef EGL_KHR_gl_texture_cubemap_image +#define EGL_KHR_gl_texture_cubemap_image 1 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_X_KHR 0x30B3 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_X_KHR 0x30B4 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Y_KHR 0x30B5 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_KHR 0x30B6 +#define EGL_GL_TEXTURE_CUBE_MAP_POSITIVE_Z_KHR 0x30B7 +#define EGL_GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_KHR 0x30B8 +#endif /* EGL_KHR_gl_texture_cubemap_image */ + +#ifndef EGL_KHR_image +#define EGL_KHR_image 1 +typedef void *EGLImageKHR; +#define EGL_NATIVE_PIXMAP_KHR 0x30B0 +#define EGL_NO_IMAGE_KHR EGL_CAST(EGLImageKHR,0) +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEIMAGEKHRPROC) (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYIMAGEKHRPROC) (EGLDisplay dpy, EGLImageKHR image); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateImageKHR (EGLDisplay dpy, EGLContext ctx, EGLenum target, EGLClientBuffer buffer, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyImageKHR (EGLDisplay dpy, EGLImageKHR image); +#endif +#endif /* EGL_KHR_image */ + +#ifndef EGL_KHR_image_base +#define EGL_KHR_image_base 1 +#define EGL_IMAGE_PRESERVED_KHR 0x30D2 +#endif /* EGL_KHR_image_base */ + +#ifndef EGL_KHR_image_pixmap +#define EGL_KHR_image_pixmap 1 +#endif /* EGL_KHR_image_pixmap */ + +#ifndef EGL_KHR_lock_surface +#define EGL_KHR_lock_surface 1 +#define EGL_READ_SURFACE_BIT_KHR 0x0001 +#define EGL_WRITE_SURFACE_BIT_KHR 0x0002 +#define EGL_LOCK_SURFACE_BIT_KHR 0x0080 +#define EGL_OPTIMAL_FORMAT_BIT_KHR 0x0100 +#define EGL_MATCH_FORMAT_KHR 0x3043 +#define EGL_FORMAT_RGB_565_EXACT_KHR 0x30C0 +#define EGL_FORMAT_RGB_565_KHR 0x30C1 +#define EGL_FORMAT_RGBA_8888_EXACT_KHR 0x30C2 +#define EGL_FORMAT_RGBA_8888_KHR 0x30C3 +#define EGL_MAP_PRESERVE_PIXELS_KHR 0x30C4 +#define EGL_LOCK_USAGE_HINT_KHR 0x30C5 +#define EGL_BITMAP_POINTER_KHR 0x30C6 +#define EGL_BITMAP_PITCH_KHR 0x30C7 +#define EGL_BITMAP_ORIGIN_KHR 0x30C8 +#define EGL_BITMAP_PIXEL_RED_OFFSET_KHR 0x30C9 +#define EGL_BITMAP_PIXEL_GREEN_OFFSET_KHR 0x30CA +#define EGL_BITMAP_PIXEL_BLUE_OFFSET_KHR 0x30CB +#define EGL_BITMAP_PIXEL_ALPHA_OFFSET_KHR 0x30CC +#define EGL_BITMAP_PIXEL_LUMINANCE_OFFSET_KHR 0x30CD +#define EGL_LOWER_LEFT_KHR 0x30CE +#define EGL_UPPER_LEFT_KHR 0x30CF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNLOCKSURFACEKHRPROC) (EGLDisplay dpy, EGLSurface surface); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglLockSurfaceKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglUnlockSurfaceKHR (EGLDisplay dpy, EGLSurface surface); +#endif +#endif /* EGL_KHR_lock_surface */ + +#ifndef EGL_KHR_lock_surface2 +#define EGL_KHR_lock_surface2 1 +#define EGL_BITMAP_PIXEL_SIZE_KHR 0x3110 +#endif /* EGL_KHR_lock_surface2 */ + +#ifndef EGL_KHR_lock_surface3 +#define EGL_KHR_lock_surface3 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACE64KHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurface64KHR (EGLDisplay dpy, EGLSurface surface, EGLint attribute, EGLAttribKHR *value); +#endif +#endif /* EGL_KHR_lock_surface3 */ + +#ifndef EGL_KHR_mutable_render_buffer +#define EGL_KHR_mutable_render_buffer 1 +#define EGL_MUTABLE_RENDER_BUFFER_BIT_KHR 0x1000 +#endif /* EGL_KHR_mutable_render_buffer */ + +#ifndef EGL_KHR_no_config_context +#define EGL_KHR_no_config_context 1 +#define EGL_NO_CONFIG_KHR EGL_CAST(EGLConfig,0) +#endif /* EGL_KHR_no_config_context */ + +#ifndef EGL_KHR_partial_update +#define EGL_KHR_partial_update 1 +#define EGL_BUFFER_AGE_KHR 0x313D +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETDAMAGEREGIONKHRPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSetDamageRegionKHR (EGLDisplay dpy, EGLSurface surface, EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_partial_update */ + +#ifndef EGL_KHR_platform_android +#define EGL_KHR_platform_android 1 +#define EGL_PLATFORM_ANDROID_KHR 0x3141 +#endif /* EGL_KHR_platform_android */ + +#ifndef EGL_KHR_platform_gbm +#define EGL_KHR_platform_gbm 1 +#define EGL_PLATFORM_GBM_KHR 0x31D7 +#endif /* EGL_KHR_platform_gbm */ + +#ifndef EGL_KHR_platform_wayland +#define EGL_KHR_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_KHR 0x31D8 +#endif /* EGL_KHR_platform_wayland */ + +#ifndef EGL_KHR_platform_x11 +#define EGL_KHR_platform_x11 1 +#define EGL_PLATFORM_X11_KHR 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_KHR 0x31D6 +#endif /* EGL_KHR_platform_x11 */ + +#ifndef EGL_KHR_reusable_sync +#define EGL_KHR_reusable_sync 1 +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_STATUS_KHR 0x30F1 +#define EGL_SIGNALED_KHR 0x30F2 +#define EGL_UNSIGNALED_KHR 0x30F3 +#define EGL_TIMEOUT_EXPIRED_KHR 0x30F5 +#define EGL_CONDITION_SATISFIED_KHR 0x30F6 +#define EGL_SYNC_TYPE_KHR 0x30F7 +#define EGL_SYNC_REUSABLE_KHR 0x30FA +#define EGL_SYNC_FLUSH_COMMANDS_BIT_KHR 0x0001 +#define EGL_FOREVER_KHR 0xFFFFFFFFFFFFFFFFull +#define EGL_NO_SYNC_KHR EGL_CAST(EGLSyncKHR,0) +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLenum mode); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_reusable_sync */ + +#ifndef EGL_KHR_stream +#define EGL_KHR_stream 1 +typedef void *EGLStreamKHR; +typedef khronos_uint64_t EGLuint64KHR; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_NO_STREAM_KHR EGL_CAST(EGLStreamKHR,0) +#define EGL_CONSUMER_LATENCY_USEC_KHR 0x3210 +#define EGL_PRODUCER_FRAME_KHR 0x3212 +#define EGL_CONSUMER_FRAME_KHR 0x3213 +#define EGL_STREAM_STATE_KHR 0x3214 +#define EGL_STREAM_STATE_CREATED_KHR 0x3215 +#define EGL_STREAM_STATE_CONNECTING_KHR 0x3216 +#define EGL_STREAM_STATE_EMPTY_KHR 0x3217 +#define EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR 0x3218 +#define EGL_STREAM_STATE_OLD_FRAME_AVAILABLE_KHR 0x3219 +#define EGL_STREAM_STATE_DISCONNECTED_KHR 0x321A +#define EGL_BAD_STREAM_KHR 0x321B +#define EGL_BAD_STATE_KHR 0x321C +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMKHRPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMU64KHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamKHR (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroyStreamKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLint *value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamu64KHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLuint64KHR *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_stream */ + +#ifndef EGL_KHR_stream_attrib +#define EGL_KHR_stream_attrib 1 +#ifdef KHRONOS_SUPPORT_INT64 +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMATTRIBKHRPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEATTRIBKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamAttribKHR (EGLDisplay dpy, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLAttrib *value); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseAttribKHR (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_KHR_stream_attrib */ + +#ifndef EGL_KHR_stream_consumer_gltexture +#define EGL_KHR_stream_consumer_gltexture 1 +#ifdef EGL_KHR_stream +#define EGL_CONSUMER_ACQUIRE_TIMEOUT_USEC_KHR 0x321E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERACQUIREKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERRELEASEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerAcquireKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerReleaseKHR (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_consumer_gltexture */ + +#ifndef EGL_KHR_stream_cross_process_fd +#define EGL_KHR_stream_cross_process_fd 1 +typedef int EGLNativeFileDescriptorKHR; +#ifdef EGL_KHR_stream +#define EGL_NO_FILE_DESCRIPTOR_KHR EGL_CAST(EGLNativeFileDescriptorKHR,-1) +typedef EGLNativeFileDescriptorKHR (EGLAPIENTRYP PFNEGLGETSTREAMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream); +typedef EGLStreamKHR (EGLAPIENTRYP PFNEGLCREATESTREAMFROMFILEDESCRIPTORKHRPROC) (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLNativeFileDescriptorKHR EGLAPIENTRY eglGetStreamFileDescriptorKHR (EGLDisplay dpy, EGLStreamKHR stream); +EGLAPI EGLStreamKHR EGLAPIENTRY eglCreateStreamFromFileDescriptorKHR (EGLDisplay dpy, EGLNativeFileDescriptorKHR file_descriptor); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_cross_process_fd */ + +#ifndef EGL_KHR_stream_fifo +#define EGL_KHR_stream_fifo 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_FIFO_LENGTH_KHR 0x31FC +#define EGL_STREAM_TIME_NOW_KHR 0x31FD +#define EGL_STREAM_TIME_CONSUMER_KHR 0x31FE +#define EGL_STREAM_TIME_PRODUCER_KHR 0x31FF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMTIMEKHRPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamTimeKHR (EGLDisplay dpy, EGLStreamKHR stream, EGLenum attribute, EGLTimeKHR *value); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_fifo */ + +#ifndef EGL_KHR_stream_producer_aldatalocator +#define EGL_KHR_stream_producer_aldatalocator 1 +#ifdef EGL_KHR_stream +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_aldatalocator */ + +#ifndef EGL_KHR_stream_producer_eglsurface +#define EGL_KHR_stream_producer_eglsurface 1 +#ifdef EGL_KHR_stream +#define EGL_STREAM_BIT_KHR 0x0800 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATESTREAMPRODUCERSURFACEKHRPROC) (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreateStreamProducerSurfaceKHR (EGLDisplay dpy, EGLConfig config, EGLStreamKHR stream, const EGLint *attrib_list); +#endif +#endif /* EGL_KHR_stream */ +#endif /* EGL_KHR_stream_producer_eglsurface */ + +#ifndef EGL_KHR_surfaceless_context +#define EGL_KHR_surfaceless_context 1 +#endif /* EGL_KHR_surfaceless_context */ + +#ifndef EGL_KHR_swap_buffers_with_damage +#define EGL_KHR_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEKHRPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageKHR (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_KHR_swap_buffers_with_damage */ + +#ifndef EGL_KHR_vg_parent_image +#define EGL_KHR_vg_parent_image 1 +#define EGL_VG_PARENT_IMAGE_KHR 0x30BA +#endif /* EGL_KHR_vg_parent_image */ + +#ifndef EGL_KHR_wait_sync +#define EGL_KHR_wait_sync 1 +typedef EGLint (EGLAPIENTRYP PFNEGLWAITSYNCKHRPROC) (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglWaitSyncKHR (EGLDisplay dpy, EGLSyncKHR sync, EGLint flags); +#endif +#endif /* EGL_KHR_wait_sync */ + +#ifndef EGL_ANDROID_GLES_layers +#define EGL_ANDROID_GLES_layers 1 +#endif /* EGL_ANDROID_GLES_layers */ + +#ifndef EGL_ANDROID_blob_cache +#define EGL_ANDROID_blob_cache 1 +typedef khronos_ssize_t EGLsizeiANDROID; +typedef void (*EGLSetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, const void *value, EGLsizeiANDROID valueSize); +typedef EGLsizeiANDROID (*EGLGetBlobFuncANDROID) (const void *key, EGLsizeiANDROID keySize, void *value, EGLsizeiANDROID valueSize); +typedef void (EGLAPIENTRYP PFNEGLSETBLOBCACHEFUNCSANDROIDPROC) (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI void EGLAPIENTRY eglSetBlobCacheFuncsANDROID (EGLDisplay dpy, EGLSetBlobFuncANDROID set, EGLGetBlobFuncANDROID get); +#endif +#endif /* EGL_ANDROID_blob_cache */ + +#ifndef EGL_ANDROID_create_native_client_buffer +#define EGL_ANDROID_create_native_client_buffer 1 +#define EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143 +#define EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001 +#define EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002 +#define EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004 +typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLCREATENATIVECLIENTBUFFERANDROIDPROC) (const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLClientBuffer EGLAPIENTRY eglCreateNativeClientBufferANDROID (const EGLint *attrib_list); +#endif +#endif /* EGL_ANDROID_create_native_client_buffer */ + +#ifndef EGL_ANDROID_framebuffer_target +#define EGL_ANDROID_framebuffer_target 1 +#define EGL_FRAMEBUFFER_TARGET_ANDROID 0x3147 +#endif /* EGL_ANDROID_framebuffer_target */ + +#ifndef EGL_ANDROID_front_buffer_auto_refresh +#define EGL_ANDROID_front_buffer_auto_refresh 1 +#define EGL_FRONT_BUFFER_AUTO_REFRESH_ANDROID 0x314C +#endif /* EGL_ANDROID_front_buffer_auto_refresh */ + +#ifndef EGL_ANDROID_get_frame_timestamps +#define EGL_ANDROID_get_frame_timestamps 1 +typedef khronos_stime_nanoseconds_t EGLnsecsANDROID; +#define EGL_TIMESTAMP_PENDING_ANDROID EGL_CAST(EGLnsecsANDROID,-2) +#define EGL_TIMESTAMP_INVALID_ANDROID EGL_CAST(EGLnsecsANDROID,-1) +#define EGL_TIMESTAMPS_ANDROID 0x3430 +#define EGL_COMPOSITE_DEADLINE_ANDROID 0x3431 +#define EGL_COMPOSITE_INTERVAL_ANDROID 0x3432 +#define EGL_COMPOSITE_TO_PRESENT_LATENCY_ANDROID 0x3433 +#define EGL_REQUESTED_PRESENT_TIME_ANDROID 0x3434 +#define EGL_RENDERING_COMPLETE_TIME_ANDROID 0x3435 +#define EGL_COMPOSITION_LATCH_TIME_ANDROID 0x3436 +#define EGL_FIRST_COMPOSITION_START_TIME_ANDROID 0x3437 +#define EGL_LAST_COMPOSITION_START_TIME_ANDROID 0x3438 +#define EGL_FIRST_COMPOSITION_GPU_FINISHED_TIME_ANDROID 0x3439 +#define EGL_DISPLAY_PRESENT_TIME_ANDROID 0x343A +#define EGL_DEQUEUE_READY_TIME_ANDROID 0x343B +#define EGL_READS_DONE_TIME_ANDROID 0x343C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETCOMPOSITORTIMINGANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETNEXTFRAMEIDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSUPPORTEDANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETFRAMETIMESTAMPSANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglGetCompositorTimingANDROID (EGLDisplay dpy, EGLSurface surface, EGLint numTimestamps, const EGLint *names, EGLnsecsANDROID *values); +EGLAPI EGLBoolean EGLAPIENTRY eglGetNextFrameIdANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR *frameId); +EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampSupportedANDROID (EGLDisplay dpy, EGLSurface surface, EGLint timestamp); +EGLAPI EGLBoolean EGLAPIENTRY eglGetFrameTimestampsANDROID (EGLDisplay dpy, EGLSurface surface, EGLuint64KHR frameId, EGLint numTimestamps, const EGLint *timestamps, EGLnsecsANDROID *values); +#endif +#endif /* EGL_ANDROID_get_frame_timestamps */ + +#ifndef EGL_ANDROID_get_native_client_buffer +#define EGL_ANDROID_get_native_client_buffer 1 +struct AHardwareBuffer; +typedef EGLClientBuffer (EGLAPIENTRYP PFNEGLGETNATIVECLIENTBUFFERANDROIDPROC) (const struct AHardwareBuffer *buffer); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLClientBuffer EGLAPIENTRY eglGetNativeClientBufferANDROID (const struct AHardwareBuffer *buffer); +#endif +#endif /* EGL_ANDROID_get_native_client_buffer */ + +#ifndef EGL_ANDROID_image_native_buffer +#define EGL_ANDROID_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_ANDROID 0x3140 +#endif /* EGL_ANDROID_image_native_buffer */ + +#ifndef EGL_ANDROID_native_fence_sync +#define EGL_ANDROID_native_fence_sync 1 +#define EGL_SYNC_NATIVE_FENCE_ANDROID 0x3144 +#define EGL_SYNC_NATIVE_FENCE_FD_ANDROID 0x3145 +#define EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146 +#define EGL_NO_NATIVE_FENCE_FD_ANDROID -1 +typedef EGLint (EGLAPIENTRYP PFNEGLDUPNATIVEFENCEFDANDROIDPROC) (EGLDisplay dpy, EGLSyncKHR sync); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLint EGLAPIENTRY eglDupNativeFenceFDANDROID (EGLDisplay dpy, EGLSyncKHR sync); +#endif +#endif /* EGL_ANDROID_native_fence_sync */ + +#ifndef EGL_ANDROID_presentation_time +#define EGL_ANDROID_presentation_time 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPRESENTATIONTIMEANDROIDPROC) (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPresentationTimeANDROID (EGLDisplay dpy, EGLSurface surface, EGLnsecsANDROID time); +#endif +#endif /* EGL_ANDROID_presentation_time */ + +#ifndef EGL_ANDROID_recordable +#define EGL_ANDROID_recordable 1 +#define EGL_RECORDABLE_ANDROID 0x3142 +#endif /* EGL_ANDROID_recordable */ + +#ifndef EGL_ANGLE_d3d_share_handle_client_buffer +#define EGL_ANGLE_d3d_share_handle_client_buffer 1 +#define EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200 +#endif /* EGL_ANGLE_d3d_share_handle_client_buffer */ + +#ifndef EGL_ANGLE_device_d3d +#define EGL_ANGLE_device_d3d 1 +#define EGL_D3D9_DEVICE_ANGLE 0x33A0 +#define EGL_D3D11_DEVICE_ANGLE 0x33A1 +#endif /* EGL_ANGLE_device_d3d */ + +#ifndef EGL_ANGLE_query_surface_pointer +#define EGL_ANGLE_query_surface_pointer 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSURFACEPOINTERANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySurfacePointerANGLE (EGLDisplay dpy, EGLSurface surface, EGLint attribute, void **value); +#endif +#endif /* EGL_ANGLE_query_surface_pointer */ + +#ifndef EGL_ANGLE_surface_d3d_texture_2d_share_handle +#define EGL_ANGLE_surface_d3d_texture_2d_share_handle 1 +#endif /* EGL_ANGLE_surface_d3d_texture_2d_share_handle */ + +#ifndef EGL_ANGLE_sync_control_rate +#define EGL_ANGLE_sync_control_rate 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETMSCRATEANGLEPROC) (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetMscRateANGLE (EGLDisplay dpy, EGLSurface surface, EGLint *numerator, EGLint *denominator); +#endif +#endif /* EGL_ANGLE_sync_control_rate */ + +#ifndef EGL_ANGLE_window_fixed_size +#define EGL_ANGLE_window_fixed_size 1 +#define EGL_FIXED_SIZE_ANGLE 0x3201 +#endif /* EGL_ANGLE_window_fixed_size */ + +#ifndef EGL_ARM_image_format +#define EGL_ARM_image_format 1 +#define EGL_COLOR_COMPONENT_TYPE_UNSIGNED_INTEGER_ARM 0x3287 +#define EGL_COLOR_COMPONENT_TYPE_INTEGER_ARM 0x3288 +#endif /* EGL_ARM_image_format */ + +#ifndef EGL_ARM_implicit_external_sync +#define EGL_ARM_implicit_external_sync 1 +#define EGL_SYNC_PRIOR_COMMANDS_IMPLICIT_EXTERNAL_ARM 0x328A +#endif /* EGL_ARM_implicit_external_sync */ + +#ifndef EGL_ARM_pixmap_multisample_discard +#define EGL_ARM_pixmap_multisample_discard 1 +#define EGL_DISCARD_SAMPLES_ARM 0x3286 +#endif /* EGL_ARM_pixmap_multisample_discard */ + +#ifndef EGL_EXT_bind_to_front +#define EGL_EXT_bind_to_front 1 +#define EGL_FRONT_BUFFER_EXT 0x3464 +#endif /* EGL_EXT_bind_to_front */ + +#ifndef EGL_EXT_buffer_age +#define EGL_EXT_buffer_age 1 +#define EGL_BUFFER_AGE_EXT 0x313D +#endif /* EGL_EXT_buffer_age */ + +#ifndef EGL_EXT_client_extensions +#define EGL_EXT_client_extensions 1 +#endif /* EGL_EXT_client_extensions */ + +#ifndef EGL_EXT_client_sync +#define EGL_EXT_client_sync 1 +#define EGL_SYNC_CLIENT_EXT 0x3364 +#define EGL_SYNC_CLIENT_SIGNAL_EXT 0x3365 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCLIENTSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglClientSignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_EXT_client_sync */ + +#ifndef EGL_EXT_compositor +#define EGL_EXT_compositor 1 +#define EGL_PRIMARY_COMPOSITOR_CONTEXT_EXT 0x3460 +#define EGL_EXTERNAL_REF_ID_EXT 0x3461 +#define EGL_COMPOSITOR_DROP_NEWEST_FRAME_EXT 0x3462 +#define EGL_COMPOSITOR_KEEP_NEWEST_FRAME_EXT 0x3463 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTLISTEXTPROC) (const EGLint *external_ref_ids, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETCONTEXTATTRIBUTESEXTPROC) (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWLISTEXTPROC) (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETWINDOWATTRIBUTESEXTPROC) (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORBINDTEXWINDOWEXTPROC) (EGLint external_win_id); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSETSIZEEXTPROC) (EGLint external_win_id, EGLint width, EGLint height); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLCOMPOSITORSWAPPOLICYEXTPROC) (EGLint external_win_id, EGLint policy); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextListEXT (const EGLint *external_ref_ids, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetContextAttributesEXT (EGLint external_ref_id, const EGLint *context_attributes, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowListEXT (EGLint external_ref_id, const EGLint *external_win_ids, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetWindowAttributesEXT (EGLint external_win_id, const EGLint *window_attributes, EGLint num_entries); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorBindTexWindowEXT (EGLint external_win_id); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSetSizeEXT (EGLint external_win_id, EGLint width, EGLint height); +EGLAPI EGLBoolean EGLAPIENTRY eglCompositorSwapPolicyEXT (EGLint external_win_id, EGLint policy); +#endif +#endif /* EGL_EXT_compositor */ + +#ifndef EGL_EXT_config_select_group +#define EGL_EXT_config_select_group 1 +#define EGL_CONFIG_SELECT_GROUP_EXT 0x34C0 +#endif /* EGL_EXT_config_select_group */ + +#ifndef EGL_EXT_create_context_robustness +#define EGL_EXT_create_context_robustness 1 +#define EGL_CONTEXT_OPENGL_ROBUST_ACCESS_EXT 0x30BF +#define EGL_CONTEXT_OPENGL_RESET_NOTIFICATION_STRATEGY_EXT 0x3138 +#define EGL_NO_RESET_NOTIFICATION_EXT 0x31BE +#define EGL_LOSE_CONTEXT_ON_RESET_EXT 0x31BF +#endif /* EGL_EXT_create_context_robustness */ + +#ifndef EGL_EXT_device_base +#define EGL_EXT_device_base 1 +typedef void *EGLDeviceEXT; +#define EGL_NO_DEVICE_EXT EGL_CAST(EGLDeviceEXT,0) +#define EGL_BAD_DEVICE_EXT 0x322B +#define EGL_DEVICE_EXT 0x322C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEATTRIBEXTPROC) (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYDEVICESTRINGEXTPROC) (EGLDeviceEXT device, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICESEXTPROC) (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBEXTPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceAttribEXT (EGLDeviceEXT device, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryDeviceStringEXT (EGLDeviceEXT device, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDevicesEXT (EGLint max_devices, EGLDeviceEXT *devices, EGLint *num_devices); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribEXT (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +#endif +#endif /* EGL_EXT_device_base */ + +#ifndef EGL_EXT_device_drm +#define EGL_EXT_device_drm 1 +#define EGL_DRM_DEVICE_FILE_EXT 0x3233 +#define EGL_DRM_MASTER_FD_EXT 0x333C +#endif /* EGL_EXT_device_drm */ + +#ifndef EGL_EXT_device_drm_render_node +#define EGL_EXT_device_drm_render_node 1 +#define EGL_DRM_RENDER_NODE_FILE_EXT 0x3377 +#endif /* EGL_EXT_device_drm_render_node */ + +#ifndef EGL_EXT_device_enumeration +#define EGL_EXT_device_enumeration 1 +#endif /* EGL_EXT_device_enumeration */ + +#ifndef EGL_EXT_device_openwf +#define EGL_EXT_device_openwf 1 +#define EGL_OPENWF_DEVICE_ID_EXT 0x3237 +#define EGL_OPENWF_DEVICE_EXT 0x333D +#endif /* EGL_EXT_device_openwf */ + +#ifndef EGL_EXT_device_persistent_id +#define EGL_EXT_device_persistent_id 1 +#define EGL_DEVICE_UUID_EXT 0x335C +#define EGL_DRIVER_UUID_EXT 0x335D +#define EGL_DRIVER_NAME_EXT 0x335E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDEVICEBINARYEXTPROC) (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDeviceBinaryEXT (EGLDeviceEXT device, EGLint name, EGLint max_size, void *value, EGLint *size); +#endif +#endif /* EGL_EXT_device_persistent_id */ + +#ifndef EGL_EXT_device_query +#define EGL_EXT_device_query 1 +#endif /* EGL_EXT_device_query */ + +#ifndef EGL_EXT_device_query_name +#define EGL_EXT_device_query_name 1 +#define EGL_RENDERER_EXT 0x335F +#endif /* EGL_EXT_device_query_name */ + +#ifndef EGL_EXT_explicit_device +#define EGL_EXT_explicit_device 1 +#endif /* EGL_EXT_explicit_device */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_linear +#define EGL_EXT_gl_colorspace_bt2020_linear 1 +#define EGL_GL_COLORSPACE_BT2020_LINEAR_EXT 0x333F +#endif /* EGL_EXT_gl_colorspace_bt2020_linear */ + +#ifndef EGL_EXT_gl_colorspace_bt2020_pq +#define EGL_EXT_gl_colorspace_bt2020_pq 1 +#define EGL_GL_COLORSPACE_BT2020_PQ_EXT 0x3340 +#endif /* EGL_EXT_gl_colorspace_bt2020_pq */ + +#ifndef EGL_EXT_gl_colorspace_display_p3 +#define EGL_EXT_gl_colorspace_display_p3 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_EXT 0x3363 +#endif /* EGL_EXT_gl_colorspace_display_p3 */ + +#ifndef EGL_EXT_gl_colorspace_display_p3_linear +#define EGL_EXT_gl_colorspace_display_p3_linear 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_LINEAR_EXT 0x3362 +#endif /* EGL_EXT_gl_colorspace_display_p3_linear */ + +#ifndef EGL_EXT_gl_colorspace_display_p3_passthrough +#define EGL_EXT_gl_colorspace_display_p3_passthrough 1 +#define EGL_GL_COLORSPACE_DISPLAY_P3_PASSTHROUGH_EXT 0x3490 +#endif /* EGL_EXT_gl_colorspace_display_p3_passthrough */ + +#ifndef EGL_EXT_gl_colorspace_scrgb +#define EGL_EXT_gl_colorspace_scrgb 1 +#define EGL_GL_COLORSPACE_SCRGB_EXT 0x3351 +#endif /* EGL_EXT_gl_colorspace_scrgb */ + +#ifndef EGL_EXT_gl_colorspace_scrgb_linear +#define EGL_EXT_gl_colorspace_scrgb_linear 1 +#define EGL_GL_COLORSPACE_SCRGB_LINEAR_EXT 0x3350 +#endif /* EGL_EXT_gl_colorspace_scrgb_linear */ + +#ifndef EGL_EXT_image_dma_buf_import +#define EGL_EXT_image_dma_buf_import 1 +#define EGL_LINUX_DMA_BUF_EXT 0x3270 +#define EGL_LINUX_DRM_FOURCC_EXT 0x3271 +#define EGL_DMA_BUF_PLANE0_FD_EXT 0x3272 +#define EGL_DMA_BUF_PLANE0_OFFSET_EXT 0x3273 +#define EGL_DMA_BUF_PLANE0_PITCH_EXT 0x3274 +#define EGL_DMA_BUF_PLANE1_FD_EXT 0x3275 +#define EGL_DMA_BUF_PLANE1_OFFSET_EXT 0x3276 +#define EGL_DMA_BUF_PLANE1_PITCH_EXT 0x3277 +#define EGL_DMA_BUF_PLANE2_FD_EXT 0x3278 +#define EGL_DMA_BUF_PLANE2_OFFSET_EXT 0x3279 +#define EGL_DMA_BUF_PLANE2_PITCH_EXT 0x327A +#define EGL_YUV_COLOR_SPACE_HINT_EXT 0x327B +#define EGL_SAMPLE_RANGE_HINT_EXT 0x327C +#define EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT 0x327D +#define EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT 0x327E +#define EGL_ITU_REC601_EXT 0x327F +#define EGL_ITU_REC709_EXT 0x3280 +#define EGL_ITU_REC2020_EXT 0x3281 +#define EGL_YUV_FULL_RANGE_EXT 0x3282 +#define EGL_YUV_NARROW_RANGE_EXT 0x3283 +#define EGL_YUV_CHROMA_SITING_0_EXT 0x3284 +#define EGL_YUV_CHROMA_SITING_0_5_EXT 0x3285 +#endif /* EGL_EXT_image_dma_buf_import */ + +#ifndef EGL_EXT_image_dma_buf_import_modifiers +#define EGL_EXT_image_dma_buf_import_modifiers 1 +#define EGL_DMA_BUF_PLANE3_FD_EXT 0x3440 +#define EGL_DMA_BUF_PLANE3_OFFSET_EXT 0x3441 +#define EGL_DMA_BUF_PLANE3_PITCH_EXT 0x3442 +#define EGL_DMA_BUF_PLANE0_MODIFIER_LO_EXT 0x3443 +#define EGL_DMA_BUF_PLANE0_MODIFIER_HI_EXT 0x3444 +#define EGL_DMA_BUF_PLANE1_MODIFIER_LO_EXT 0x3445 +#define EGL_DMA_BUF_PLANE1_MODIFIER_HI_EXT 0x3446 +#define EGL_DMA_BUF_PLANE2_MODIFIER_LO_EXT 0x3447 +#define EGL_DMA_BUF_PLANE2_MODIFIER_HI_EXT 0x3448 +#define EGL_DMA_BUF_PLANE3_MODIFIER_LO_EXT 0x3449 +#define EGL_DMA_BUF_PLANE3_MODIFIER_HI_EXT 0x344A +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFFORMATSEXTPROC) (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDMABUFMODIFIERSEXTPROC) (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufFormatsEXT (EGLDisplay dpy, EGLint max_formats, EGLint *formats, EGLint *num_formats); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDmaBufModifiersEXT (EGLDisplay dpy, EGLint format, EGLint max_modifiers, EGLuint64KHR *modifiers, EGLBoolean *external_only, EGLint *num_modifiers); +#endif +#endif /* EGL_EXT_image_dma_buf_import_modifiers */ + +#ifndef EGL_EXT_image_gl_colorspace +#define EGL_EXT_image_gl_colorspace 1 +#define EGL_GL_COLORSPACE_DEFAULT_EXT 0x314D +#endif /* EGL_EXT_image_gl_colorspace */ + +#ifndef EGL_EXT_image_implicit_sync_control +#define EGL_EXT_image_implicit_sync_control 1 +#define EGL_IMPORT_SYNC_TYPE_EXT 0x3470 +#define EGL_IMPORT_IMPLICIT_SYNC_EXT 0x3471 +#define EGL_IMPORT_EXPLICIT_SYNC_EXT 0x3472 +#endif /* EGL_EXT_image_implicit_sync_control */ + +#ifndef EGL_EXT_multiview_window +#define EGL_EXT_multiview_window 1 +#define EGL_MULTIVIEW_VIEW_COUNT_EXT 0x3134 +#endif /* EGL_EXT_multiview_window */ + +#ifndef EGL_EXT_output_base +#define EGL_EXT_output_base 1 +typedef void *EGLOutputLayerEXT; +typedef void *EGLOutputPortEXT; +#define EGL_NO_OUTPUT_LAYER_EXT EGL_CAST(EGLOutputLayerEXT,0) +#define EGL_NO_OUTPUT_PORT_EXT EGL_CAST(EGLOutputPortEXT,0) +#define EGL_BAD_OUTPUT_LAYER_EXT 0x322D +#define EGL_BAD_OUTPUT_PORT_EXT 0x322E +#define EGL_SWAP_INTERVAL_EXT 0x322F +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTLAYERSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETOUTPUTPORTSEXTPROC) (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTLAYERSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTATTRIBEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +typedef const char *(EGLAPIENTRYP PFNEGLQUERYOUTPUTPORTSTRINGEXTPROC) (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputLayersEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputLayerEXT *layers, EGLint max_layers, EGLint *num_layers); +EGLAPI EGLBoolean EGLAPIENTRY eglGetOutputPortsEXT (EGLDisplay dpy, const EGLAttrib *attrib_list, EGLOutputPortEXT *ports, EGLint max_ports, EGLint *num_ports); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputLayerAttribEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputLayerStringEXT (EGLDisplay dpy, EGLOutputLayerEXT layer, EGLint name); +EGLAPI EGLBoolean EGLAPIENTRY eglOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib value); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryOutputPortAttribEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint attribute, EGLAttrib *value); +EGLAPI const char *EGLAPIENTRY eglQueryOutputPortStringEXT (EGLDisplay dpy, EGLOutputPortEXT port, EGLint name); +#endif +#endif /* EGL_EXT_output_base */ + +#ifndef EGL_EXT_output_drm +#define EGL_EXT_output_drm 1 +#define EGL_DRM_CRTC_EXT 0x3234 +#define EGL_DRM_PLANE_EXT 0x3235 +#define EGL_DRM_CONNECTOR_EXT 0x3236 +#endif /* EGL_EXT_output_drm */ + +#ifndef EGL_EXT_output_openwf +#define EGL_EXT_output_openwf 1 +#define EGL_OPENWF_PIPELINE_ID_EXT 0x3238 +#define EGL_OPENWF_PORT_ID_EXT 0x3239 +#endif /* EGL_EXT_output_openwf */ + +#ifndef EGL_EXT_pixel_format_float +#define EGL_EXT_pixel_format_float 1 +#define EGL_COLOR_COMPONENT_TYPE_EXT 0x3339 +#define EGL_COLOR_COMPONENT_TYPE_FIXED_EXT 0x333A +#define EGL_COLOR_COMPONENT_TYPE_FLOAT_EXT 0x333B +#endif /* EGL_EXT_pixel_format_float */ + +#ifndef EGL_EXT_platform_base +#define EGL_EXT_platform_base 1 +typedef EGLDisplay (EGLAPIENTRYP PFNEGLGETPLATFORMDISPLAYEXTPROC) (EGLenum platform, void *native_display, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPLATFORMPIXMAPSURFACEEXTPROC) (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLDisplay EGLAPIENTRY eglGetPlatformDisplayEXT (EGLenum platform, void *native_display, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformWindowSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_window, const EGLint *attrib_list); +EGLAPI EGLSurface EGLAPIENTRY eglCreatePlatformPixmapSurfaceEXT (EGLDisplay dpy, EGLConfig config, void *native_pixmap, const EGLint *attrib_list); +#endif +#endif /* EGL_EXT_platform_base */ + +#ifndef EGL_EXT_platform_device +#define EGL_EXT_platform_device 1 +#define EGL_PLATFORM_DEVICE_EXT 0x313F +#endif /* EGL_EXT_platform_device */ + +#ifndef EGL_EXT_platform_wayland +#define EGL_EXT_platform_wayland 1 +#define EGL_PLATFORM_WAYLAND_EXT 0x31D8 +#endif /* EGL_EXT_platform_wayland */ + +#ifndef EGL_EXT_platform_x11 +#define EGL_EXT_platform_x11 1 +#define EGL_PLATFORM_X11_EXT 0x31D5 +#define EGL_PLATFORM_X11_SCREEN_EXT 0x31D6 +#endif /* EGL_EXT_platform_x11 */ + +#ifndef EGL_EXT_platform_xcb +#define EGL_EXT_platform_xcb 1 +#define EGL_PLATFORM_XCB_EXT 0x31DC +#define EGL_PLATFORM_XCB_SCREEN_EXT 0x31DE +#endif /* EGL_EXT_platform_xcb */ + +#ifndef EGL_EXT_present_opaque +#define EGL_EXT_present_opaque 1 +#define EGL_PRESENT_OPAQUE_EXT 0x31DF +#endif /* EGL_EXT_present_opaque */ + +#ifndef EGL_EXT_protected_content +#define EGL_EXT_protected_content 1 +#define EGL_PROTECTED_CONTENT_EXT 0x32C0 +#endif /* EGL_EXT_protected_content */ + +#ifndef EGL_EXT_protected_surface +#define EGL_EXT_protected_surface 1 +#endif /* EGL_EXT_protected_surface */ + +#ifndef EGL_EXT_stream_consumer_egloutput +#define EGL_EXT_stream_consumer_egloutput 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMEROUTPUTEXTPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerOutputEXT (EGLDisplay dpy, EGLStreamKHR stream, EGLOutputLayerEXT layer); +#endif +#endif /* EGL_EXT_stream_consumer_egloutput */ + +#ifndef EGL_EXT_surface_CTA861_3_metadata +#define EGL_EXT_surface_CTA861_3_metadata 1 +#define EGL_CTA861_3_MAX_CONTENT_LIGHT_LEVEL_EXT 0x3360 +#define EGL_CTA861_3_MAX_FRAME_AVERAGE_LEVEL_EXT 0x3361 +#endif /* EGL_EXT_surface_CTA861_3_metadata */ + +#ifndef EGL_EXT_surface_SMPTE2086_metadata +#define EGL_EXT_surface_SMPTE2086_metadata 1 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RX_EXT 0x3341 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_RY_EXT 0x3342 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GX_EXT 0x3343 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_GY_EXT 0x3344 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BX_EXT 0x3345 +#define EGL_SMPTE2086_DISPLAY_PRIMARY_BY_EXT 0x3346 +#define EGL_SMPTE2086_WHITE_POINT_X_EXT 0x3347 +#define EGL_SMPTE2086_WHITE_POINT_Y_EXT 0x3348 +#define EGL_SMPTE2086_MAX_LUMINANCE_EXT 0x3349 +#define EGL_SMPTE2086_MIN_LUMINANCE_EXT 0x334A +#define EGL_METADATA_SCALING_EXT 50000 +#endif /* EGL_EXT_surface_SMPTE2086_metadata */ + +#ifndef EGL_EXT_surface_compression +#define EGL_EXT_surface_compression 1 +#define EGL_SURFACE_COMPRESSION_EXT 0x34B0 +#define EGL_SURFACE_COMPRESSION_PLANE1_EXT 0x328E +#define EGL_SURFACE_COMPRESSION_PLANE2_EXT 0x328F +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x34B1 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x34B2 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x34B4 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x34B5 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x34B6 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x34B7 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x34B8 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x34B9 +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x34BA +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x34BB +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x34BC +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x34BD +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x34BE +#define EGL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x34BF +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSUPPORTEDCOMPRESSIONRATESEXTPROC) (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQuerySupportedCompressionRatesEXT (EGLDisplay dpy, EGLConfig config, const EGLAttrib *attrib_list, EGLint *rates, EGLint rate_size, EGLint *num_rates); +#endif +#endif /* EGL_EXT_surface_compression */ + +#ifndef EGL_EXT_swap_buffers_with_damage +#define EGL_EXT_swap_buffers_with_damage 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSWITHDAMAGEEXTPROC) (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersWithDamageEXT (EGLDisplay dpy, EGLSurface surface, const EGLint *rects, EGLint n_rects); +#endif +#endif /* EGL_EXT_swap_buffers_with_damage */ + +#ifndef EGL_EXT_sync_reuse +#define EGL_EXT_sync_reuse 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNSIGNALSYNCEXTPROC) (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglUnsignalSyncEXT (EGLDisplay dpy, EGLSync sync, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_EXT_sync_reuse */ + +#ifndef EGL_EXT_yuv_surface +#define EGL_EXT_yuv_surface 1 +#define EGL_YUV_ORDER_EXT 0x3301 +#define EGL_YUV_NUMBER_OF_PLANES_EXT 0x3311 +#define EGL_YUV_SUBSAMPLE_EXT 0x3312 +#define EGL_YUV_DEPTH_RANGE_EXT 0x3317 +#define EGL_YUV_CSC_STANDARD_EXT 0x330A +#define EGL_YUV_PLANE_BPP_EXT 0x331A +#define EGL_YUV_BUFFER_EXT 0x3300 +#define EGL_YUV_ORDER_YUV_EXT 0x3302 +#define EGL_YUV_ORDER_YVU_EXT 0x3303 +#define EGL_YUV_ORDER_YUYV_EXT 0x3304 +#define EGL_YUV_ORDER_UYVY_EXT 0x3305 +#define EGL_YUV_ORDER_YVYU_EXT 0x3306 +#define EGL_YUV_ORDER_VYUY_EXT 0x3307 +#define EGL_YUV_ORDER_AYUV_EXT 0x3308 +#define EGL_YUV_SUBSAMPLE_4_2_0_EXT 0x3313 +#define EGL_YUV_SUBSAMPLE_4_2_2_EXT 0x3314 +#define EGL_YUV_SUBSAMPLE_4_4_4_EXT 0x3315 +#define EGL_YUV_DEPTH_RANGE_LIMITED_EXT 0x3318 +#define EGL_YUV_DEPTH_RANGE_FULL_EXT 0x3319 +#define EGL_YUV_CSC_STANDARD_601_EXT 0x330B +#define EGL_YUV_CSC_STANDARD_709_EXT 0x330C +#define EGL_YUV_CSC_STANDARD_2020_EXT 0x330D +#define EGL_YUV_PLANE_BPP_0_EXT 0x331B +#define EGL_YUV_PLANE_BPP_8_EXT 0x331C +#define EGL_YUV_PLANE_BPP_10_EXT 0x331D +#endif /* EGL_EXT_yuv_surface */ + +#ifndef EGL_HI_clientpixmap +#define EGL_HI_clientpixmap 1 +struct EGLClientPixmapHI { + void *pData; + EGLint iWidth; + EGLint iHeight; + EGLint iStride; +}; +#define EGL_CLIENT_PIXMAP_POINTER_HI 0x8F74 +typedef EGLSurface (EGLAPIENTRYP PFNEGLCREATEPIXMAPSURFACEHIPROC) (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSurface EGLAPIENTRY eglCreatePixmapSurfaceHI (EGLDisplay dpy, EGLConfig config, struct EGLClientPixmapHI *pixmap); +#endif +#endif /* EGL_HI_clientpixmap */ + +#ifndef EGL_HI_colorformats +#define EGL_HI_colorformats 1 +#define EGL_COLOR_FORMAT_HI 0x8F70 +#define EGL_COLOR_RGB_HI 0x8F71 +#define EGL_COLOR_RGBA_HI 0x8F72 +#define EGL_COLOR_ARGB_HI 0x8F73 +#endif /* EGL_HI_colorformats */ + +#ifndef EGL_IMG_context_priority +#define EGL_IMG_context_priority 1 +#define EGL_CONTEXT_PRIORITY_LEVEL_IMG 0x3100 +#define EGL_CONTEXT_PRIORITY_HIGH_IMG 0x3101 +#define EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102 +#define EGL_CONTEXT_PRIORITY_LOW_IMG 0x3103 +#endif /* EGL_IMG_context_priority */ + +#ifndef EGL_IMG_image_plane_attribs +#define EGL_IMG_image_plane_attribs 1 +#define EGL_NATIVE_BUFFER_MULTIPLANE_SEPARATE_IMG 0x3105 +#define EGL_NATIVE_BUFFER_PLANE_OFFSET_IMG 0x3106 +#endif /* EGL_IMG_image_plane_attribs */ + +#ifndef EGL_MESA_drm_image +#define EGL_MESA_drm_image 1 +#define EGL_DRM_BUFFER_FORMAT_MESA 0x31D0 +#define EGL_DRM_BUFFER_USE_MESA 0x31D1 +#define EGL_DRM_BUFFER_FORMAT_ARGB32_MESA 0x31D2 +#define EGL_DRM_BUFFER_MESA 0x31D3 +#define EGL_DRM_BUFFER_STRIDE_MESA 0x31D4 +#define EGL_DRM_BUFFER_USE_SCANOUT_MESA 0x00000001 +#define EGL_DRM_BUFFER_USE_SHARE_MESA 0x00000002 +#define EGL_DRM_BUFFER_USE_CURSOR_MESA 0x00000004 +typedef EGLImageKHR (EGLAPIENTRYP PFNEGLCREATEDRMIMAGEMESAPROC) (EGLDisplay dpy, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDRMIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLImageKHR EGLAPIENTRY eglCreateDRMImageMESA (EGLDisplay dpy, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDRMImageMESA (EGLDisplay dpy, EGLImageKHR image, EGLint *name, EGLint *handle, EGLint *stride); +#endif +#endif /* EGL_MESA_drm_image */ + +#ifndef EGL_MESA_image_dma_buf_export +#define EGL_MESA_image_dma_buf_export 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEQUERYMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLEXPORTDMABUFIMAGEMESAPROC) (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageQueryMESA (EGLDisplay dpy, EGLImageKHR image, int *fourcc, int *num_planes, EGLuint64KHR *modifiers); +EGLAPI EGLBoolean EGLAPIENTRY eglExportDMABUFImageMESA (EGLDisplay dpy, EGLImageKHR image, int *fds, EGLint *strides, EGLint *offsets); +#endif +#endif /* EGL_MESA_image_dma_buf_export */ + +#ifndef EGL_MESA_platform_gbm +#define EGL_MESA_platform_gbm 1 +#define EGL_PLATFORM_GBM_MESA 0x31D7 +#endif /* EGL_MESA_platform_gbm */ + +#ifndef EGL_MESA_platform_surfaceless +#define EGL_MESA_platform_surfaceless 1 +#define EGL_PLATFORM_SURFACELESS_MESA 0x31DD +#endif /* EGL_MESA_platform_surfaceless */ + +#ifndef EGL_MESA_query_driver +#define EGL_MESA_query_driver 1 +typedef char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERCONFIGPROC) (EGLDisplay dpy); +typedef const char *(EGLAPIENTRYP PFNEGLGETDISPLAYDRIVERNAMEPROC) (EGLDisplay dpy); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI char *EGLAPIENTRY eglGetDisplayDriverConfig (EGLDisplay dpy); +EGLAPI const char *EGLAPIENTRY eglGetDisplayDriverName (EGLDisplay dpy); +#endif +#endif /* EGL_MESA_query_driver */ + +#ifndef EGL_NOK_swap_region +#define EGL_NOK_swap_region 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGIONNOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegionNOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region */ + +#ifndef EGL_NOK_swap_region2 +#define EGL_NOK_swap_region2 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSWAPBUFFERSREGION2NOKPROC) (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglSwapBuffersRegion2NOK (EGLDisplay dpy, EGLSurface surface, EGLint numRects, const EGLint *rects); +#endif +#endif /* EGL_NOK_swap_region2 */ + +#ifndef EGL_NOK_texture_from_pixmap +#define EGL_NOK_texture_from_pixmap 1 +#define EGL_Y_INVERTED_NOK 0x307F +#endif /* EGL_NOK_texture_from_pixmap */ + +#ifndef EGL_NV_3dvision_surface +#define EGL_NV_3dvision_surface 1 +#define EGL_AUTO_STEREO_NV 0x3136 +#endif /* EGL_NV_3dvision_surface */ + +#ifndef EGL_NV_context_priority_realtime +#define EGL_NV_context_priority_realtime 1 +#define EGL_CONTEXT_PRIORITY_REALTIME_NV 0x3357 +#endif /* EGL_NV_context_priority_realtime */ + +#ifndef EGL_NV_coverage_sample +#define EGL_NV_coverage_sample 1 +#define EGL_COVERAGE_BUFFERS_NV 0x30E0 +#define EGL_COVERAGE_SAMPLES_NV 0x30E1 +#endif /* EGL_NV_coverage_sample */ + +#ifndef EGL_NV_coverage_sample_resolve +#define EGL_NV_coverage_sample_resolve 1 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131 +#define EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132 +#define EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133 +#endif /* EGL_NV_coverage_sample_resolve */ + +#ifndef EGL_NV_cuda_event +#define EGL_NV_cuda_event 1 +#define EGL_CUDA_EVENT_HANDLE_NV 0x323B +#define EGL_SYNC_CUDA_EVENT_NV 0x323C +#define EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D +#endif /* EGL_NV_cuda_event */ + +#ifndef EGL_NV_depth_nonlinear +#define EGL_NV_depth_nonlinear 1 +#define EGL_DEPTH_ENCODING_NV 0x30E2 +#define EGL_DEPTH_ENCODING_NONE_NV 0 +#define EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3 +#endif /* EGL_NV_depth_nonlinear */ + +#ifndef EGL_NV_device_cuda +#define EGL_NV_device_cuda 1 +#define EGL_CUDA_DEVICE_NV 0x323A +#endif /* EGL_NV_device_cuda */ + +#ifndef EGL_NV_native_query +#define EGL_NV_native_query 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEDISPLAYNVPROC) (EGLDisplay dpy, EGLNativeDisplayType *display_id); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEWINDOWNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYNATIVEPIXMAPNVPROC) (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeDisplayNV (EGLDisplay dpy, EGLNativeDisplayType *display_id); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativeWindowNV (EGLDisplay dpy, EGLSurface surf, EGLNativeWindowType *window); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryNativePixmapNV (EGLDisplay dpy, EGLSurface surf, EGLNativePixmapType *pixmap); +#endif +#endif /* EGL_NV_native_query */ + +#ifndef EGL_NV_post_convert_rounding +#define EGL_NV_post_convert_rounding 1 +#endif /* EGL_NV_post_convert_rounding */ + +#ifndef EGL_NV_post_sub_buffer +#define EGL_NV_post_sub_buffer 1 +#define EGL_POST_SUB_BUFFER_SUPPORTED_NV 0x30BE +typedef EGLBoolean (EGLAPIENTRYP PFNEGLPOSTSUBBUFFERNVPROC) (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglPostSubBufferNV (EGLDisplay dpy, EGLSurface surface, EGLint x, EGLint y, EGLint width, EGLint height); +#endif +#endif /* EGL_NV_post_sub_buffer */ + +#ifndef EGL_NV_quadruple_buffer +#define EGL_NV_quadruple_buffer 1 +#define EGL_QUADRUPLE_BUFFER_NV 0x3231 +#endif /* EGL_NV_quadruple_buffer */ + +#ifndef EGL_NV_robustness_video_memory_purge +#define EGL_NV_robustness_video_memory_purge 1 +#define EGL_GENERATE_RESET_ON_VIDEO_MEMORY_PURGE_NV 0x334C +#endif /* EGL_NV_robustness_video_memory_purge */ + +#ifndef EGL_NV_stream_consumer_eglimage +#define EGL_NV_stream_consumer_eglimage 1 +#define EGL_STREAM_CONSUMER_IMAGE_NV 0x3373 +#define EGL_STREAM_IMAGE_ADD_NV 0x3374 +#define EGL_STREAM_IMAGE_REMOVE_NV 0x3375 +#define EGL_STREAM_IMAGE_AVAILABLE_NV 0x3376 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMIMAGECONSUMERCONNECTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list); +typedef EGLint (EGLAPIENTRYP PFNEGLQUERYSTREAMCONSUMEREVENTNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMACQUIREIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMRELEASEIMAGENVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamImageConsumerConnectNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint num_modifiers, const EGLuint64KHR *modifiers, const EGLAttrib *attrib_list); +EGLAPI EGLint EGLAPIENTRY eglQueryStreamConsumerEventNV (EGLDisplay dpy, EGLStreamKHR stream, EGLTime timeout, EGLenum *event, EGLAttrib *aux); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamAcquireImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage *pImage, EGLSync sync); +EGLAPI EGLBoolean EGLAPIENTRY eglStreamReleaseImageNV (EGLDisplay dpy, EGLStreamKHR stream, EGLImage image, EGLSync sync); +#endif +#endif /* EGL_NV_stream_consumer_eglimage */ + +#ifndef EGL_NV_stream_consumer_gltexture_yuv +#define EGL_NV_stream_consumer_gltexture_yuv 1 +#define EGL_YUV_PLANE0_TEXTURE_UNIT_NV 0x332C +#define EGL_YUV_PLANE1_TEXTURE_UNIT_NV 0x332D +#define EGL_YUV_PLANE2_TEXTURE_UNIT_NV 0x332E +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMCONSUMERGLTEXTUREEXTERNALATTRIBSNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamConsumerGLTextureExternalAttribsNV (EGLDisplay dpy, EGLStreamKHR stream, const EGLAttrib *attrib_list); +#endif +#endif /* EGL_NV_stream_consumer_gltexture_yuv */ + +#ifndef EGL_NV_stream_cross_display +#define EGL_NV_stream_cross_display 1 +#define EGL_STREAM_CROSS_DISPLAY_NV 0x334E +#endif /* EGL_NV_stream_cross_display */ + +#ifndef EGL_NV_stream_cross_object +#define EGL_NV_stream_cross_object 1 +#define EGL_STREAM_CROSS_OBJECT_NV 0x334D +#endif /* EGL_NV_stream_cross_object */ + +#ifndef EGL_NV_stream_cross_partition +#define EGL_NV_stream_cross_partition 1 +#define EGL_STREAM_CROSS_PARTITION_NV 0x323F +#endif /* EGL_NV_stream_cross_partition */ + +#ifndef EGL_NV_stream_cross_process +#define EGL_NV_stream_cross_process 1 +#define EGL_STREAM_CROSS_PROCESS_NV 0x3245 +#endif /* EGL_NV_stream_cross_process */ + +#ifndef EGL_NV_stream_cross_system +#define EGL_NV_stream_cross_system 1 +#define EGL_STREAM_CROSS_SYSTEM_NV 0x334F +#endif /* EGL_NV_stream_cross_system */ + +#ifndef EGL_NV_stream_dma +#define EGL_NV_stream_dma 1 +#define EGL_STREAM_DMA_NV 0x3371 +#define EGL_STREAM_DMA_SERVER_NV 0x3372 +#endif /* EGL_NV_stream_dma */ + +#ifndef EGL_NV_stream_fifo_next +#define EGL_NV_stream_fifo_next 1 +#define EGL_PENDING_FRAME_NV 0x3329 +#define EGL_STREAM_TIME_PENDING_NV 0x332A +#endif /* EGL_NV_stream_fifo_next */ + +#ifndef EGL_NV_stream_fifo_synchronous +#define EGL_NV_stream_fifo_synchronous 1 +#define EGL_STREAM_FIFO_SYNCHRONOUS_NV 0x3336 +#endif /* EGL_NV_stream_fifo_synchronous */ + +#ifndef EGL_NV_stream_flush +#define EGL_NV_stream_flush 1 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSTREAMFLUSHNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglStreamFlushNV (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_NV_stream_flush */ + +#ifndef EGL_NV_stream_frame_limits +#define EGL_NV_stream_frame_limits 1 +#define EGL_PRODUCER_MAX_FRAME_HINT_NV 0x3337 +#define EGL_CONSUMER_MAX_FRAME_HINT_NV 0x3338 +#endif /* EGL_NV_stream_frame_limits */ + +#ifndef EGL_NV_stream_metadata +#define EGL_NV_stream_metadata 1 +#define EGL_MAX_STREAM_METADATA_BLOCKS_NV 0x3250 +#define EGL_MAX_STREAM_METADATA_BLOCK_SIZE_NV 0x3251 +#define EGL_MAX_STREAM_METADATA_TOTAL_SIZE_NV 0x3252 +#define EGL_PRODUCER_METADATA_NV 0x3253 +#define EGL_CONSUMER_METADATA_NV 0x3254 +#define EGL_PENDING_METADATA_NV 0x3328 +#define EGL_METADATA0_SIZE_NV 0x3255 +#define EGL_METADATA1_SIZE_NV 0x3256 +#define EGL_METADATA2_SIZE_NV 0x3257 +#define EGL_METADATA3_SIZE_NV 0x3258 +#define EGL_METADATA0_TYPE_NV 0x3259 +#define EGL_METADATA1_TYPE_NV 0x325A +#define EGL_METADATA2_TYPE_NV 0x325B +#define EGL_METADATA3_TYPE_NV 0x325C +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYDISPLAYATTRIBNVPROC) (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSETSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYSTREAMMETADATANVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglQueryDisplayAttribNV (EGLDisplay dpy, EGLint attribute, EGLAttrib *value); +EGLAPI EGLBoolean EGLAPIENTRY eglSetStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLint n, EGLint offset, EGLint size, const void *data); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryStreamMetadataNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum name, EGLint n, EGLint offset, EGLint size, void *data); +#endif +#endif /* EGL_NV_stream_metadata */ + +#ifndef EGL_NV_stream_origin +#define EGL_NV_stream_origin 1 +#define EGL_STREAM_FRAME_ORIGIN_X_NV 0x3366 +#define EGL_STREAM_FRAME_ORIGIN_Y_NV 0x3367 +#define EGL_STREAM_FRAME_MAJOR_AXIS_NV 0x3368 +#define EGL_CONSUMER_AUTO_ORIENTATION_NV 0x3369 +#define EGL_PRODUCER_AUTO_ORIENTATION_NV 0x336A +#define EGL_LEFT_NV 0x336B +#define EGL_RIGHT_NV 0x336C +#define EGL_TOP_NV 0x336D +#define EGL_BOTTOM_NV 0x336E +#define EGL_X_AXIS_NV 0x336F +#define EGL_Y_AXIS_NV 0x3370 +#endif /* EGL_NV_stream_origin */ + +#ifndef EGL_NV_stream_remote +#define EGL_NV_stream_remote 1 +#define EGL_STREAM_STATE_INITIALIZING_NV 0x3240 +#define EGL_STREAM_TYPE_NV 0x3241 +#define EGL_STREAM_PROTOCOL_NV 0x3242 +#define EGL_STREAM_ENDPOINT_NV 0x3243 +#define EGL_STREAM_LOCAL_NV 0x3244 +#define EGL_STREAM_PRODUCER_NV 0x3247 +#define EGL_STREAM_CONSUMER_NV 0x3248 +#define EGL_STREAM_PROTOCOL_FD_NV 0x3246 +#endif /* EGL_NV_stream_remote */ + +#ifndef EGL_NV_stream_reset +#define EGL_NV_stream_reset 1 +#define EGL_SUPPORT_RESET_NV 0x3334 +#define EGL_SUPPORT_REUSE_NV 0x3335 +typedef EGLBoolean (EGLAPIENTRYP PFNEGLRESETSTREAMNVPROC) (EGLDisplay dpy, EGLStreamKHR stream); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglResetStreamNV (EGLDisplay dpy, EGLStreamKHR stream); +#endif +#endif /* EGL_NV_stream_reset */ + +#ifndef EGL_NV_stream_socket +#define EGL_NV_stream_socket 1 +#define EGL_STREAM_PROTOCOL_SOCKET_NV 0x324B +#define EGL_SOCKET_HANDLE_NV 0x324C +#define EGL_SOCKET_TYPE_NV 0x324D +#endif /* EGL_NV_stream_socket */ + +#ifndef EGL_NV_stream_socket_inet +#define EGL_NV_stream_socket_inet 1 +#define EGL_SOCKET_TYPE_INET_NV 0x324F +#endif /* EGL_NV_stream_socket_inet */ + +#ifndef EGL_NV_stream_socket_unix +#define EGL_NV_stream_socket_unix 1 +#define EGL_SOCKET_TYPE_UNIX_NV 0x324E +#endif /* EGL_NV_stream_socket_unix */ + +#ifndef EGL_NV_stream_sync +#define EGL_NV_stream_sync 1 +#define EGL_SYNC_NEW_FRAME_NV 0x321F +typedef EGLSyncKHR (EGLAPIENTRYP PFNEGLCREATESTREAMSYNCNVPROC) (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncKHR EGLAPIENTRY eglCreateStreamSyncNV (EGLDisplay dpy, EGLStreamKHR stream, EGLenum type, const EGLint *attrib_list); +#endif +#endif /* EGL_NV_stream_sync */ + +#ifndef EGL_NV_sync +#define EGL_NV_sync 1 +typedef void *EGLSyncNV; +typedef khronos_utime_nanoseconds_t EGLTimeNV; +#ifdef KHRONOS_SUPPORT_INT64 +#define EGL_SYNC_PRIOR_COMMANDS_COMPLETE_NV 0x30E6 +#define EGL_SYNC_STATUS_NV 0x30E7 +#define EGL_SIGNALED_NV 0x30E8 +#define EGL_UNSIGNALED_NV 0x30E9 +#define EGL_SYNC_FLUSH_COMMANDS_BIT_NV 0x0001 +#define EGL_FOREVER_NV 0xFFFFFFFFFFFFFFFFull +#define EGL_ALREADY_SIGNALED_NV 0x30EA +#define EGL_TIMEOUT_EXPIRED_NV 0x30EB +#define EGL_CONDITION_SATISFIED_NV 0x30EC +#define EGL_SYNC_TYPE_NV 0x30ED +#define EGL_SYNC_CONDITION_NV 0x30EE +#define EGL_SYNC_FENCE_NV 0x30EF +#define EGL_NO_SYNC_NV EGL_CAST(EGLSyncNV,0) +typedef EGLSyncNV (EGLAPIENTRYP PFNEGLCREATEFENCESYNCNVPROC) (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLDESTROYSYNCNVPROC) (EGLSyncNV sync); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLFENCENVPROC) (EGLSyncNV sync); +typedef EGLint (EGLAPIENTRYP PFNEGLCLIENTWAITSYNCNVPROC) (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLSIGNALSYNCNVPROC) (EGLSyncNV sync, EGLenum mode); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLGETSYNCATTRIBNVPROC) (EGLSyncNV sync, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLSyncNV EGLAPIENTRY eglCreateFenceSyncNV (EGLDisplay dpy, EGLenum condition, const EGLint *attrib_list); +EGLAPI EGLBoolean EGLAPIENTRY eglDestroySyncNV (EGLSyncNV sync); +EGLAPI EGLBoolean EGLAPIENTRY eglFenceNV (EGLSyncNV sync); +EGLAPI EGLint EGLAPIENTRY eglClientWaitSyncNV (EGLSyncNV sync, EGLint flags, EGLTimeNV timeout); +EGLAPI EGLBoolean EGLAPIENTRY eglSignalSyncNV (EGLSyncNV sync, EGLenum mode); +EGLAPI EGLBoolean EGLAPIENTRY eglGetSyncAttribNV (EGLSyncNV sync, EGLint attribute, EGLint *value); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_sync */ + +#ifndef EGL_NV_system_time +#define EGL_NV_system_time 1 +typedef khronos_utime_nanoseconds_t EGLuint64NV; +#ifdef KHRONOS_SUPPORT_INT64 +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMEFREQUENCYNVPROC) (void); +typedef EGLuint64NV (EGLAPIENTRYP PFNEGLGETSYSTEMTIMENVPROC) (void); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeFrequencyNV (void); +EGLAPI EGLuint64NV EGLAPIENTRY eglGetSystemTimeNV (void); +#endif +#endif /* KHRONOS_SUPPORT_INT64 */ +#endif /* EGL_NV_system_time */ + +#ifndef EGL_NV_triple_buffer +#define EGL_NV_triple_buffer 1 +#define EGL_TRIPLE_BUFFER_NV 0x3230 +#endif /* EGL_NV_triple_buffer */ + +#ifndef EGL_TIZEN_image_native_buffer +#define EGL_TIZEN_image_native_buffer 1 +#define EGL_NATIVE_BUFFER_TIZEN 0x32A0 +#endif /* EGL_TIZEN_image_native_buffer */ + +#ifndef EGL_TIZEN_image_native_surface +#define EGL_TIZEN_image_native_surface 1 +#define EGL_NATIVE_SURFACE_TIZEN 0x32A1 +#endif /* EGL_TIZEN_image_native_surface */ + +#ifndef EGL_WL_bind_wayland_display +#define EGL_WL_bind_wayland_display 1 +#define PFNEGLBINDWAYLANDDISPLAYWL PFNEGLBINDWAYLANDDISPLAYWLPROC +#define PFNEGLUNBINDWAYLANDDISPLAYWL PFNEGLUNBINDWAYLANDDISPLAYWLPROC +#define PFNEGLQUERYWAYLANDBUFFERWL PFNEGLQUERYWAYLANDBUFFERWLPROC +struct wl_display; +struct wl_resource; +#define EGL_WAYLAND_BUFFER_WL 0x31D5 +#define EGL_WAYLAND_PLANE_WL 0x31D6 +#define EGL_TEXTURE_Y_U_V_WL 0x31D7 +#define EGL_TEXTURE_Y_UV_WL 0x31D8 +#define EGL_TEXTURE_Y_XUXV_WL 0x31D9 +#define EGL_TEXTURE_EXTERNAL_WL 0x31DA +#define EGL_WAYLAND_Y_INVERTED_WL 0x31DB +typedef EGLBoolean (EGLAPIENTRYP PFNEGLBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLUNBINDWAYLANDDISPLAYWLPROC) (EGLDisplay dpy, struct wl_display *display); +typedef EGLBoolean (EGLAPIENTRYP PFNEGLQUERYWAYLANDBUFFERWLPROC) (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI EGLBoolean EGLAPIENTRY eglBindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); +EGLAPI EGLBoolean EGLAPIENTRY eglUnbindWaylandDisplayWL (EGLDisplay dpy, struct wl_display *display); +EGLAPI EGLBoolean EGLAPIENTRY eglQueryWaylandBufferWL (EGLDisplay dpy, struct wl_resource *buffer, EGLint attribute, EGLint *value); +#endif +#endif /* EGL_WL_bind_wayland_display */ + +#ifndef EGL_WL_create_wayland_buffer_from_image +#define EGL_WL_create_wayland_buffer_from_image 1 +#define PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWL PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC +struct wl_buffer; +typedef struct wl_buffer *(EGLAPIENTRYP PFNEGLCREATEWAYLANDBUFFERFROMIMAGEWLPROC) (EGLDisplay dpy, EGLImageKHR image); +#ifdef EGL_EGLEXT_PROTOTYPES +EGLAPI struct wl_buffer *EGLAPIENTRY eglCreateWaylandBufferFromImageWL (EGLDisplay dpy, EGLImageKHR image); +#endif +#endif /* EGL_WL_create_wayland_buffer_from_image */ + +#ifdef __cplusplus +} +#endif + +#endif /* __eglext_h_ */ + +#endif /* _MSC_VER */ diff --git a/include/SDL/SDL_endian.h b/include/SDL/SDL_endian.h new file mode 100644 index 0000000..582c3a8 --- /dev/null +++ b/include/SDL/SDL_endian.h @@ -0,0 +1,348 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_endian.h + * + * Functions for reading and writing endian-specific values + */ + +#ifndef SDL_endian_h_ +#define SDL_endian_h_ + +#include "SDL_stdinc.h" + +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +/* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version, + so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */ +#ifdef __clang__ +#ifndef __PRFCHWINTRIN_H +#define __PRFCHWINTRIN_H +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_m_prefetch(void *__P) +{ + __builtin_prefetch(__P, 0, 3 /* _MM_HINT_T0 */); +} +#endif /* __PRFCHWINTRIN_H */ +#endif /* __clang__ */ + +#include +#endif + +/** + * \name The two types of endianness + */ +/* @{ */ +#define SDL_LIL_ENDIAN 1234 +#define SDL_BIG_ENDIAN 4321 +/* @} */ + +#ifndef SDL_BYTEORDER /* Not defined in SDL_config.h? */ +#ifdef __linux__ +#include +#define SDL_BYTEORDER __BYTE_ORDER +#elif defined(__OpenBSD__) || defined(__DragonFly__) +#include +#define SDL_BYTEORDER BYTE_ORDER +#elif defined(__FreeBSD__) || defined(__NetBSD__) +#include +#define SDL_BYTEORDER BYTE_ORDER +/* predefs from newer gcc and clang versions: */ +#elif defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__BYTE_ORDER__) +#if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#error Unsupported endianness +#endif /**/ +#else +#if defined(__hppa__) || \ + defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \ + (defined(__MIPS__) && defined(__MIPSEB__)) || \ + defined(__ppc__) || defined(__POWERPC__) || defined(__powerpc__) || defined(__PPC__) || \ + defined(__sparc__) +#define SDL_BYTEORDER SDL_BIG_ENDIAN +#else +#define SDL_BYTEORDER SDL_LIL_ENDIAN +#endif +#endif /* __linux__ */ +#endif /* !SDL_BYTEORDER */ + +#ifndef SDL_FLOATWORDORDER /* Not defined in SDL_config.h? */ +/* predefs from newer gcc versions: */ +#if defined(__ORDER_LITTLE_ENDIAN__) && defined(__ORDER_BIG_ENDIAN__) && defined(__FLOAT_WORD_ORDER__) +#if (__FLOAT_WORD_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN +#elif (__FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__) +#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN +#else +#error Unsupported endianness +#endif /**/ +#elif defined(__MAVERICK__) +/* For Maverick, float words are always little-endian. */ +#define SDL_FLOATWORDORDER SDL_LIL_ENDIAN +#elif (defined(__arm__) || defined(__thumb__)) && !defined(__VFP_FP__) && !defined(__ARM_EABI__) +/* For FPA, float words are always big-endian. */ +#define SDL_FLOATWORDORDER SDL_BIG_ENDIAN +#else +/* By default, assume that floats words follow the memory system mode. */ +#define SDL_FLOATWORDORDER SDL_BYTEORDER +#endif /* __FLOAT_WORD_ORDER__ */ +#endif /* !SDL_FLOATWORDORDER */ + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_endian.h + */ + +/* various modern compilers may have builtin swap */ +#if defined(__GNUC__) || defined(__clang__) +# define HAS_BUILTIN_BSWAP16 (_SDL_HAS_BUILTIN(__builtin_bswap16)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)) +# define HAS_BUILTIN_BSWAP32 (_SDL_HAS_BUILTIN(__builtin_bswap32)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) +# define HAS_BUILTIN_BSWAP64 (_SDL_HAS_BUILTIN(__builtin_bswap64)) || \ + (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + + /* this one is broken */ +# define HAS_BROKEN_BSWAP (__GNUC__ == 2 && __GNUC_MINOR__ <= 95) +#else +# define HAS_BUILTIN_BSWAP16 0 +# define HAS_BUILTIN_BSWAP32 0 +# define HAS_BUILTIN_BSWAP64 0 +# define HAS_BROKEN_BSWAP 0 +#endif + +#if HAS_BUILTIN_BSWAP16 +#define SDL_Swap16(x) __builtin_bswap16(x) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) +#pragma intrinsic(_byteswap_ushort) +#define SDL_Swap16(x) _byteswap_ushort(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=q"(x):"0"(x)); + return x; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("xchgb %b0,%h0": "=Q"(x):"0"(x)); + return x; +} +#elif (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + int result; + + __asm__("rlwimi %0,%2,8,16,23": "=&r"(result):"0"(x >> 8), "r"(x)); + return (Uint16)result; +} +#elif (defined(__m68k__) && !defined(__mcoldfire__)) +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + __asm__("rorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint16 SDL_Swap16(Uint16); +#pragma aux SDL_Swap16 = \ + "xchg al, ah" \ + parm [ax] \ + modify [ax]; +#else +SDL_FORCE_INLINE Uint16 +SDL_Swap16(Uint16 x) +{ + return SDL_static_cast(Uint16, ((x << 8) | (x >> 8))); +} +#endif + +#if HAS_BUILTIN_BSWAP32 +#define SDL_Swap32(x) __builtin_bswap32(x) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) +#pragma intrinsic(_byteswap_ulong) +#define SDL_Swap32(x) _byteswap_ulong(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswap %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("bswapl %0": "=r"(x):"0"(x)); + return x; +} +#elif (defined(__powerpc__) || defined(__ppc__)) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + Uint32 result; + + __asm__("rlwimi %0,%2,24,16,23": "=&r"(result): "0" (x>>24), "r"(x)); + __asm__("rlwimi %0,%2,8,8,15" : "=&r"(result): "0" (result), "r"(x)); + __asm__("rlwimi %0,%2,24,0,7" : "=&r"(result): "0" (result), "r"(x)); + return result; +} +#elif (defined(__m68k__) && !defined(__mcoldfire__)) +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + __asm__("rorw #8,%0\n\tswap %0\n\trorw #8,%0": "=d"(x): "0"(x):"cc"); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint32 SDL_Swap32(Uint32); +#pragma aux SDL_Swap32 = \ + "bswap eax" \ + parm [eax] \ + modify [eax]; +#else +SDL_FORCE_INLINE Uint32 +SDL_Swap32(Uint32 x) +{ + return SDL_static_cast(Uint32, ((x << 24) | ((x << 8) & 0x00FF0000) | + ((x >> 8) & 0x0000FF00) | (x >> 24))); +} +#endif + +#if HAS_BUILTIN_BSWAP64 +#define SDL_Swap64(x) __builtin_bswap64(x) +#elif defined(_MSC_VER) && (_MSC_VER >= 1400) +#pragma intrinsic(_byteswap_uint64) +#define SDL_Swap64(x) _byteswap_uint64(x) +#elif defined(__i386__) && !HAS_BROKEN_BSWAP +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + union { + struct { + Uint32 a, b; + } s; + Uint64 u; + } v; + v.u = x; + __asm__("bswapl %0 ; bswapl %1 ; xchgl %0,%1" + : "=r"(v.s.a), "=r"(v.s.b) + : "0" (v.s.a), "1"(v.s.b)); + return v.u; +} +#elif defined(__x86_64__) +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + __asm__("bswapq %0": "=r"(x):"0"(x)); + return x; +} +#elif defined(__WATCOMC__) && defined(__386__) +extern __inline Uint64 SDL_Swap64(Uint64); +#pragma aux SDL_Swap64 = \ + "bswap eax" \ + "bswap edx" \ + "xchg eax,edx" \ + parm [eax edx] \ + modify [eax edx]; +#else +SDL_FORCE_INLINE Uint64 +SDL_Swap64(Uint64 x) +{ + Uint32 hi, lo; + + /* Separate into high and low 32-bit values and swap them */ + lo = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x >>= 32; + hi = SDL_static_cast(Uint32, x & 0xFFFFFFFF); + x = SDL_Swap32(lo); + x <<= 32; + x |= SDL_Swap32(hi); + return (x); +} +#endif + + +SDL_FORCE_INLINE float +SDL_SwapFloat(float x) +{ + union { + float f; + Uint32 ui32; + } swapper; + swapper.f = x; + swapper.ui32 = SDL_Swap32(swapper.ui32); + return swapper.f; +} + +/* remove extra macros */ +#undef HAS_BROKEN_BSWAP +#undef HAS_BUILTIN_BSWAP16 +#undef HAS_BUILTIN_BSWAP32 +#undef HAS_BUILTIN_BSWAP64 + +/** + * \name Swap to native + * Byteswap item from the specified endianness to the native endianness. + */ +/* @{ */ +#if SDL_BYTEORDER == SDL_LIL_ENDIAN +#define SDL_SwapLE16(X) (X) +#define SDL_SwapLE32(X) (X) +#define SDL_SwapLE64(X) (X) +#define SDL_SwapFloatLE(X) (X) +#define SDL_SwapBE16(X) SDL_Swap16(X) +#define SDL_SwapBE32(X) SDL_Swap32(X) +#define SDL_SwapBE64(X) SDL_Swap64(X) +#define SDL_SwapFloatBE(X) SDL_SwapFloat(X) +#else +#define SDL_SwapLE16(X) SDL_Swap16(X) +#define SDL_SwapLE32(X) SDL_Swap32(X) +#define SDL_SwapLE64(X) SDL_Swap64(X) +#define SDL_SwapFloatLE(X) SDL_SwapFloat(X) +#define SDL_SwapBE16(X) (X) +#define SDL_SwapBE32(X) (X) +#define SDL_SwapBE64(X) (X) +#define SDL_SwapFloatBE(X) (X) +#endif +/* @} *//* Swap to native */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_endian_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_error.h b/include/SDL/SDL_error.h new file mode 100644 index 0000000..31c2261 --- /dev/null +++ b/include/SDL/SDL_error.h @@ -0,0 +1,163 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_error.h + * + * Simple error message routines for SDL. + */ + +#ifndef SDL_error_h_ +#define SDL_error_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Public functions */ + + +/** + * Set the SDL error message for the current thread. + * + * Calling this function will replace any previous error message that was set. + * + * This function always returns -1, since SDL frequently uses -1 to signify an + * failing result, leading to this idiom: + * + * ```c + * if (error_code) { + * return SDL_SetError("This operation has failed: %d", error_code); + * } + * ``` + * + * \param fmt a printf()-style message format string + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any + * \returns always -1. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ClearError + * \sa SDL_GetError + */ +extern DECLSPEC int SDLCALL SDL_SetError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Retrieve a message about the last error that occurred on the current + * thread. + * + * It is possible for multiple errors to occur before calling SDL_GetError(). + * Only the last error is returned. + * + * The message is only applicable when an SDL function has signaled an error. + * You must check the return values of SDL function calls to determine when to + * appropriately call SDL_GetError(). You should *not* use the results of + * SDL_GetError() to decide if an error has occurred! Sometimes SDL will set + * an error string even when reporting success. + * + * SDL will *not* clear the error string for successful API calls. You *must* + * check return values for failure cases before you can assume the error + * string applies. + * + * Error strings are set per-thread, so an error set in a different thread + * will not interfere with the current thread's operation. + * + * The returned string is internally allocated and must not be freed by the + * application. + * + * \returns a message with information about the specific error that occurred, + * or an empty string if there hasn't been an error message set since + * the last call to SDL_ClearError(). The message is only applicable + * when an SDL function has signaled an error. You must check the + * return values of SDL function calls to determine when to + * appropriately call SDL_GetError(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ClearError + * \sa SDL_SetError + */ +extern DECLSPEC const char *SDLCALL SDL_GetError(void); + +/** + * Get the last error message that was set for the current thread. + * + * This allows the caller to copy the error string into a provided buffer, but + * otherwise operates exactly the same as SDL_GetError(). + * + * \param errstr A buffer to fill with the last error message that was set for + * the current thread + * \param maxlen The size of the buffer pointed to by the errstr parameter + * \returns the pointer passed in as the `errstr` parameter. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GetError + */ +extern DECLSPEC char * SDLCALL SDL_GetErrorMsg(char *errstr, int maxlen); + +/** + * Clear any previous error message for this thread. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetError + * \sa SDL_SetError + */ +extern DECLSPEC void SDLCALL SDL_ClearError(void); + +/** + * \name Internal error functions + * + * \internal + * Private error reporting function - used internally. + */ +/* @{ */ +#define SDL_OutOfMemory() SDL_Error(SDL_ENOMEM) +#define SDL_Unsupported() SDL_Error(SDL_UNSUPPORTED) +#define SDL_InvalidParamError(param) SDL_SetError("Parameter '%s' is invalid", (param)) +typedef enum +{ + SDL_ENOMEM, + SDL_EFREAD, + SDL_EFWRITE, + SDL_EFSEEK, + SDL_UNSUPPORTED, + SDL_LASTERROR +} SDL_errorcode; +/* SDL_Error() unconditionally returns -1. */ +extern DECLSPEC int SDLCALL SDL_Error(SDL_errorcode code); +/* @} *//* Internal error functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_error_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_events.h b/include/SDL/SDL_events.h new file mode 100644 index 0000000..9d09703 --- /dev/null +++ b/include/SDL/SDL_events.h @@ -0,0 +1,1166 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_events.h + * + * Include file for SDL event handling. + */ + +#ifndef SDL_events_h_ +#define SDL_events_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_keyboard.h" +#include "SDL_mouse.h" +#include "SDL_joystick.h" +#include "SDL_gamecontroller.h" +#include "SDL_quit.h" +#include "SDL_gesture.h" +#include "SDL_touch.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* General keyboard/mouse state definitions */ +#define SDL_RELEASED 0 +#define SDL_PRESSED 1 + +/** + * The types of events that can be delivered. + */ +typedef enum +{ + SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */ + + /* Application events */ + SDL_QUIT = 0x100, /**< User-requested quit */ + + /* These application events have special meaning on iOS, see README-ios.md for details */ + SDL_APP_TERMINATING, /**< The application is being terminated by the OS + Called on iOS in applicationWillTerminate() + Called on Android in onDestroy() + */ + SDL_APP_LOWMEMORY, /**< The application is low on memory, free memory if possible. + Called on iOS in applicationDidReceiveMemoryWarning() + Called on Android in onLowMemory() + */ + SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background + Called on iOS in applicationWillResignActive() + Called on Android in onPause() + */ + SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time + Called on iOS in applicationDidEnterBackground() + Called on Android in onPause() + */ + SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground + Called on iOS in applicationWillEnterForeground() + Called on Android in onResume() + */ + SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive + Called on iOS in applicationDidBecomeActive() + Called on Android in onResume() + */ + + SDL_LOCALECHANGED, /**< The user's locale preferences have changed. */ + + /* Display events */ + SDL_DISPLAYEVENT = 0x150, /**< Display state change */ + + /* Window events */ + SDL_WINDOWEVENT = 0x200, /**< Window state change */ + SDL_SYSWMEVENT, /**< System specific event */ + + /* Keyboard events */ + SDL_KEYDOWN = 0x300, /**< Key pressed */ + SDL_KEYUP, /**< Key released */ + SDL_TEXTEDITING, /**< Keyboard text editing (composition) */ + SDL_TEXTINPUT, /**< Keyboard text input */ + SDL_KEYMAPCHANGED, /**< Keymap changed due to a system event such as an + input language or keyboard layout change. + */ + SDL_TEXTEDITING_EXT, /**< Extended keyboard text editing (composition) */ + + /* Mouse events */ + SDL_MOUSEMOTION = 0x400, /**< Mouse moved */ + SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */ + SDL_MOUSEBUTTONUP, /**< Mouse button released */ + SDL_MOUSEWHEEL, /**< Mouse wheel motion */ + + /* Joystick events */ + SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */ + SDL_JOYBALLMOTION, /**< Joystick trackball motion */ + SDL_JOYHATMOTION, /**< Joystick hat position change */ + SDL_JOYBUTTONDOWN, /**< Joystick button pressed */ + SDL_JOYBUTTONUP, /**< Joystick button released */ + SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */ + SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */ + SDL_JOYBATTERYUPDATED, /**< Joystick battery level change */ + + /* Game controller events */ + SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */ + SDL_CONTROLLERBUTTONDOWN, /**< Game controller button pressed */ + SDL_CONTROLLERBUTTONUP, /**< Game controller button released */ + SDL_CONTROLLERDEVICEADDED, /**< A new Game controller has been inserted into the system */ + SDL_CONTROLLERDEVICEREMOVED, /**< An opened Game controller has been removed */ + SDL_CONTROLLERDEVICEREMAPPED, /**< The controller mapping was updated */ + SDL_CONTROLLERTOUCHPADDOWN, /**< Game controller touchpad was touched */ + SDL_CONTROLLERTOUCHPADMOTION, /**< Game controller touchpad finger was moved */ + SDL_CONTROLLERTOUCHPADUP, /**< Game controller touchpad finger was lifted */ + SDL_CONTROLLERSENSORUPDATE, /**< Game controller sensor was updated */ + + /* Touch events */ + SDL_FINGERDOWN = 0x700, + SDL_FINGERUP, + SDL_FINGERMOTION, + + /* Gesture events */ + SDL_DOLLARGESTURE = 0x800, + SDL_DOLLARRECORD, + SDL_MULTIGESTURE, + + /* Clipboard events */ + SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard or primary selection changed */ + + /* Drag and drop events */ + SDL_DROPFILE = 0x1000, /**< The system requests a file open */ + SDL_DROPTEXT, /**< text/plain drag-and-drop event */ + SDL_DROPBEGIN, /**< A new set of drops is beginning (NULL filename) */ + SDL_DROPCOMPLETE, /**< Current set of drops is now complete (NULL filename) */ + + /* Audio hotplug events */ + SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */ + SDL_AUDIODEVICEREMOVED, /**< An audio device has been removed. */ + + /* Sensor events */ + SDL_SENSORUPDATE = 0x1200, /**< A sensor was updated */ + + /* Render events */ + SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */ + SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */ + + /* Internal events */ + SDL_POLLSENTINEL = 0x7F00, /**< Signals the end of an event poll cycle */ + + /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use, + * and should be allocated with SDL_RegisterEvents() + */ + SDL_USEREVENT = 0x8000, + + /** + * This last event is only for bounding internal arrays + */ + SDL_LASTEVENT = 0xFFFF +} SDL_EventType; + +/** + * \brief Fields shared by every event + */ +typedef struct SDL_CommonEvent +{ + Uint32 type; + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_CommonEvent; + +/** + * \brief Display state change event data (event.display.*) + */ +typedef struct SDL_DisplayEvent +{ + Uint32 type; /**< ::SDL_DISPLAYEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 display; /**< The associated display index */ + Uint8 event; /**< ::SDL_DisplayEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ +} SDL_DisplayEvent; + +/** + * \brief Window state change event data (event.window.*) + */ +typedef struct SDL_WindowEvent +{ + Uint32 type; /**< ::SDL_WINDOWEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The associated window */ + Uint8 event; /**< ::SDL_WindowEventID */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint32 data1; /**< event dependent data */ + Sint32 data2; /**< event dependent data */ +} SDL_WindowEvent; + +/** + * \brief Keyboard button event structure (event.key.*) + */ +typedef struct SDL_KeyboardEvent +{ + Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 repeat; /**< Non-zero if this is a key repeat */ + Uint8 padding2; + Uint8 padding3; + SDL_Keysym keysym; /**< The key that was pressed or released */ +} SDL_KeyboardEvent; + +#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text editing event structure (event.edit.*) + */ +typedef struct SDL_TextEditingEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingEvent; + +/** + * \brief Extended keyboard text editing event structure (event.editExt.*) when text would be + * truncated if stored in the text buffer SDL_TextEditingEvent + */ +typedef struct SDL_TextEditingExtEvent +{ + Uint32 type; /**< ::SDL_TEXTEDITING_EXT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char* text; /**< The editing text, which should be freed with SDL_free(), and will not be NULL */ + Sint32 start; /**< The start cursor of selected editing text */ + Sint32 length; /**< The length of selected editing text */ +} SDL_TextEditingExtEvent; + +#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32) +/** + * \brief Keyboard text input event structure (event.text.*) + */ +typedef struct SDL_TextInputEvent +{ + Uint32 type; /**< ::SDL_TEXTINPUT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with keyboard focus, if any */ + char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */ +} SDL_TextInputEvent; + +/** + * \brief Mouse motion event structure (event.motion.*) + */ +typedef struct SDL_MouseMotionEvent +{ + Uint32 type; /**< ::SDL_MOUSEMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint32 state; /**< The current button state */ + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ + Sint32 xrel; /**< The relative motion in the X direction */ + Sint32 yrel; /**< The relative motion in the Y direction */ +} SDL_MouseMotionEvent; + +/** + * \brief Mouse button event structure (event.button.*) + */ +typedef struct SDL_MouseButtonEvent +{ + Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Uint8 button; /**< The mouse button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 clicks; /**< 1 for single-click, 2 for double-click, etc. */ + Uint8 padding1; + Sint32 x; /**< X coordinate, relative to window */ + Sint32 y; /**< Y coordinate, relative to window */ +} SDL_MouseButtonEvent; + +/** + * \brief Mouse wheel event structure (event.wheel.*) + */ +typedef struct SDL_MouseWheelEvent +{ + Uint32 type; /**< ::SDL_MOUSEWHEEL */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The window with mouse focus, if any */ + Uint32 which; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */ + Sint32 x; /**< The amount scrolled horizontally, positive to the right and negative to the left */ + Sint32 y; /**< The amount scrolled vertically, positive away from the user and negative toward the user */ + Uint32 direction; /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */ + float preciseX; /**< The amount scrolled horizontally, positive to the right and negative to the left, with float precision (added in 2.0.18) */ + float preciseY; /**< The amount scrolled vertically, positive away from the user and negative toward the user, with float precision (added in 2.0.18) */ + Sint32 mouseX; /**< X coordinate, relative to window (added in 2.26.0) */ + Sint32 mouseY; /**< Y coordinate, relative to window (added in 2.26.0) */ +} SDL_MouseWheelEvent; + +/** + * \brief Joystick axis motion event structure (event.jaxis.*) + */ +typedef struct SDL_JoyAxisEvent +{ + Uint32 type; /**< ::SDL_JOYAXISMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The joystick axis index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_JoyAxisEvent; + +/** + * \brief Joystick trackball motion event structure (event.jball.*) + */ +typedef struct SDL_JoyBallEvent +{ + Uint32 type; /**< ::SDL_JOYBALLMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 ball; /**< The joystick trackball index */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 xrel; /**< The relative motion in the X direction */ + Sint16 yrel; /**< The relative motion in the Y direction */ +} SDL_JoyBallEvent; + +/** + * \brief Joystick hat position change event structure (event.jhat.*) + */ +typedef struct SDL_JoyHatEvent +{ + Uint32 type; /**< ::SDL_JOYHATMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 hat; /**< The joystick hat index */ + Uint8 value; /**< The hat position value. + * \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP + * \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT + * \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN + * + * Note that zero means the POV is centered. + */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyHatEvent; + +/** + * \brief Joystick button event structure (event.jbutton.*) + */ +typedef struct SDL_JoyButtonEvent +{ + Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The joystick button index */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_JoyButtonEvent; + +/** + * \brief Joystick device event structure (event.jdevice.*) + */ +typedef struct SDL_JoyDeviceEvent +{ + Uint32 type; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */ +} SDL_JoyDeviceEvent; + +/** + * \brief Joysick battery level change event structure (event.jbattery.*) + */ +typedef struct SDL_JoyBatteryEvent +{ + Uint32 type; /**< ::SDL_JOYBATTERYUPDATED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + SDL_JoystickPowerLevel level; /**< The joystick battery level */ +} SDL_JoyBatteryEvent; + +/** + * \brief Game controller axis motion event structure (event.caxis.*) + */ +typedef struct SDL_ControllerAxisEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERAXISMOTION */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 axis; /**< The controller axis (SDL_GameControllerAxis) */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; + Sint16 value; /**< The axis value (range: -32768 to 32767) */ + Uint16 padding4; +} SDL_ControllerAxisEvent; + + +/** + * \brief Game controller button event structure (event.cbutton.*) + */ +typedef struct SDL_ControllerButtonEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Uint8 button; /**< The controller button (SDL_GameControllerButton) */ + Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */ + Uint8 padding1; + Uint8 padding2; +} SDL_ControllerButtonEvent; + + +/** + * \brief Controller device event structure (event.cdevice.*) + */ +typedef struct SDL_ControllerDeviceEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */ +} SDL_ControllerDeviceEvent; + +/** + * \brief Game controller touchpad event structure (event.ctouchpad.*) + */ +typedef struct SDL_ControllerTouchpadEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERTOUCHPADDOWN or ::SDL_CONTROLLERTOUCHPADMOTION or ::SDL_CONTROLLERTOUCHPADUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Sint32 touchpad; /**< The index of the touchpad */ + Sint32 finger; /**< The index of the finger on the touchpad */ + float x; /**< Normalized in the range 0...1 with 0 being on the left */ + float y; /**< Normalized in the range 0...1 with 0 being at the top */ + float pressure; /**< Normalized in the range 0...1 */ +} SDL_ControllerTouchpadEvent; + +/** + * \brief Game controller sensor event structure (event.csensor.*) + */ +typedef struct SDL_ControllerSensorEvent +{ + Uint32 type; /**< ::SDL_CONTROLLERSENSORUPDATE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_JoystickID which; /**< The joystick instance id */ + Sint32 sensor; /**< The type of the sensor, one of the values of ::SDL_SensorType */ + float data[3]; /**< Up to 3 values from the sensor, as defined in SDL_sensor.h */ + Uint64 timestamp_us; /**< The timestamp of the sensor reading in microseconds, if the hardware provides this information. */ +} SDL_ControllerSensorEvent; + +/** + * \brief Audio device event structure (event.adevice.*) + */ +typedef struct SDL_AudioDeviceEvent +{ + Uint32 type; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 which; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */ + Uint8 iscapture; /**< zero if an output device, non-zero if a capture device. */ + Uint8 padding1; + Uint8 padding2; + Uint8 padding3; +} SDL_AudioDeviceEvent; + + +/** + * \brief Touch finger event structure (event.tfinger.*) + */ +typedef struct SDL_TouchFingerEvent +{ + Uint32 type; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + SDL_FingerID fingerId; + float x; /**< Normalized in the range 0...1 */ + float y; /**< Normalized in the range 0...1 */ + float dx; /**< Normalized in the range -1...1 */ + float dy; /**< Normalized in the range -1...1 */ + float pressure; /**< Normalized in the range 0...1 */ + Uint32 windowID; /**< The window underneath the finger, if any */ +} SDL_TouchFingerEvent; + + +/** + * \brief Multiple Finger Gesture Event (event.mgesture.*) + */ +typedef struct SDL_MultiGestureEvent +{ + Uint32 type; /**< ::SDL_MULTIGESTURE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + float dTheta; + float dDist; + float x; + float y; + Uint16 numFingers; + Uint16 padding; +} SDL_MultiGestureEvent; + + +/** + * \brief Dollar Gesture Event (event.dgesture.*) + */ +typedef struct SDL_DollarGestureEvent +{ + Uint32 type; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_TouchID touchId; /**< The touch device id */ + SDL_GestureID gestureId; + Uint32 numFingers; + float error; + float x; /**< Normalized center of gesture */ + float y; /**< Normalized center of gesture */ +} SDL_DollarGestureEvent; + + +/** + * \brief An event used to request a file open by the system (event.drop.*) + * This event is enabled by default, you can disable it with SDL_EventState(). + * \note If this event is enabled, you must free the filename in the event. + */ +typedef struct SDL_DropEvent +{ + Uint32 type; /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + char *file; /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */ + Uint32 windowID; /**< The window that was dropped on, if any */ +} SDL_DropEvent; + + +/** + * \brief Sensor event structure (event.sensor.*) + */ +typedef struct SDL_SensorEvent +{ + Uint32 type; /**< ::SDL_SENSORUPDATE */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Sint32 which; /**< The instance ID of the sensor */ + float data[6]; /**< Up to 6 values from the sensor - additional values can be queried using SDL_SensorGetData() */ + Uint64 timestamp_us; /**< The timestamp of the sensor reading in microseconds, if the hardware provides this information. */ +} SDL_SensorEvent; + +/** + * \brief The "quit requested" event + */ +typedef struct SDL_QuitEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_QuitEvent; + +/** + * \brief OS Specific event + */ +typedef struct SDL_OSEvent +{ + Uint32 type; /**< ::SDL_QUIT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ +} SDL_OSEvent; + +/** + * \brief A user-defined event type (event.user.*) + */ +typedef struct SDL_UserEvent +{ + Uint32 type; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + Uint32 windowID; /**< The associated window if any */ + Sint32 code; /**< User defined event code */ + void *data1; /**< User defined data pointer */ + void *data2; /**< User defined data pointer */ +} SDL_UserEvent; + + +struct SDL_SysWMmsg; +typedef struct SDL_SysWMmsg SDL_SysWMmsg; + +/** + * \brief A video driver dependent system event (event.syswm.*) + * This event is disabled by default, you can enable it with SDL_EventState() + * + * \note If you want to use this event, you should include SDL_syswm.h. + */ +typedef struct SDL_SysWMEvent +{ + Uint32 type; /**< ::SDL_SYSWMEVENT */ + Uint32 timestamp; /**< In milliseconds, populated using SDL_GetTicks() */ + SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */ +} SDL_SysWMEvent; + +/** + * \brief General event structure + */ +typedef union SDL_Event +{ + Uint32 type; /**< Event type, shared with all events */ + SDL_CommonEvent common; /**< Common event data */ + SDL_DisplayEvent display; /**< Display event data */ + SDL_WindowEvent window; /**< Window event data */ + SDL_KeyboardEvent key; /**< Keyboard event data */ + SDL_TextEditingEvent edit; /**< Text editing event data */ + SDL_TextEditingExtEvent editExt; /**< Extended text editing event data */ + SDL_TextInputEvent text; /**< Text input event data */ + SDL_MouseMotionEvent motion; /**< Mouse motion event data */ + SDL_MouseButtonEvent button; /**< Mouse button event data */ + SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */ + SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */ + SDL_JoyBallEvent jball; /**< Joystick ball event data */ + SDL_JoyHatEvent jhat; /**< Joystick hat event data */ + SDL_JoyButtonEvent jbutton; /**< Joystick button event data */ + SDL_JoyDeviceEvent jdevice; /**< Joystick device change event data */ + SDL_JoyBatteryEvent jbattery; /**< Joystick battery event data */ + SDL_ControllerAxisEvent caxis; /**< Game Controller axis event data */ + SDL_ControllerButtonEvent cbutton; /**< Game Controller button event data */ + SDL_ControllerDeviceEvent cdevice; /**< Game Controller device event data */ + SDL_ControllerTouchpadEvent ctouchpad; /**< Game Controller touchpad event data */ + SDL_ControllerSensorEvent csensor; /**< Game Controller sensor event data */ + SDL_AudioDeviceEvent adevice; /**< Audio device event data */ + SDL_SensorEvent sensor; /**< Sensor event data */ + SDL_QuitEvent quit; /**< Quit request event data */ + SDL_UserEvent user; /**< Custom event data */ + SDL_SysWMEvent syswm; /**< System dependent window event data */ + SDL_TouchFingerEvent tfinger; /**< Touch finger event data */ + SDL_MultiGestureEvent mgesture; /**< Gesture event data */ + SDL_DollarGestureEvent dgesture; /**< Gesture event data */ + SDL_DropEvent drop; /**< Drag and drop event data */ + + /* This is necessary for ABI compatibility between Visual C++ and GCC. + Visual C++ will respect the push pack pragma and use 52 bytes (size of + SDL_TextEditingEvent, the largest structure for 32-bit and 64-bit + architectures) for this union, and GCC will use the alignment of the + largest datatype within the union, which is 8 bytes on 64-bit + architectures. + + So... we'll add padding to force the size to be 56 bytes for both. + + On architectures where pointers are 16 bytes, this needs rounding up to + the next multiple of 16, 64, and on architectures where pointers are + even larger the size of SDL_UserEvent will dominate as being 3 pointers. + */ + Uint8 padding[sizeof(void *) <= 8 ? 56 : sizeof(void *) == 16 ? 64 : 3 * sizeof(void *)]; +} SDL_Event; + +/* Make sure we haven't broken binary compatibility */ +SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == sizeof(((SDL_Event *)NULL)->padding)); + + +/* Function prototypes */ + +/** + * Pump the event loop, gathering events from the input devices. + * + * This function updates the event queue and internal input device state. + * + * **WARNING**: This should only be run in the thread that initialized the + * video subsystem, and for extra safety, you should consider only doing those + * things on the main thread in any case. + * + * SDL_PumpEvents() gathers all the pending input information from devices and + * places it in the event queue. Without calls to SDL_PumpEvents() no events + * would ever be placed on the queue. Often the need for calls to + * SDL_PumpEvents() is hidden from the user since SDL_PollEvent() and + * SDL_WaitEvent() implicitly call SDL_PumpEvents(). However, if you are not + * polling or waiting for events (e.g. you are filtering them), then you must + * call SDL_PumpEvents() to force an event queue update. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_WaitEvent + */ +extern DECLSPEC void SDLCALL SDL_PumpEvents(void); + +/* @{ */ +typedef enum +{ + SDL_ADDEVENT, + SDL_PEEKEVENT, + SDL_GETEVENT +} SDL_eventaction; + +/** + * Check the event queue for messages and optionally return them. + * + * `action` may be any of the following: + * + * - `SDL_ADDEVENT`: up to `numevents` events will be added to the back of the + * event queue. + * - `SDL_PEEKEVENT`: `numevents` events at the front of the event queue, + * within the specified minimum and maximum type, will be returned to the + * caller and will _not_ be removed from the queue. + * - `SDL_GETEVENT`: up to `numevents` events at the front of the event queue, + * within the specified minimum and maximum type, will be returned to the + * caller and will be removed from the queue. + * + * You may have to call SDL_PumpEvents() before calling this function. + * Otherwise, the events may not be ready to be filtered when you call + * SDL_PeepEvents(). + * + * This function is thread-safe. + * + * \param events destination buffer for the retrieved events + * \param numevents if action is SDL_ADDEVENT, the number of events to add + * back to the event queue; if action is SDL_PEEKEVENT or + * SDL_GETEVENT, the maximum number of events to retrieve + * \param action action to take; see [[#action|Remarks]] for details + * \param minType minimum value of the event type to be considered; + * SDL_FIRSTEVENT is a safe choice + * \param maxType maximum value of the event type to be considered; + * SDL_LASTEVENT is a safe choice + * \returns the number of events actually stored or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_PushEvent + */ +extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents, + SDL_eventaction action, + Uint32 minType, Uint32 maxType); +/* @} */ + +/** + * Check for the existence of a certain event type in the event queue. + * + * If you need to check for a range of event types, use SDL_HasEvents() + * instead. + * + * \param type the type of event to be queried; see SDL_EventType for details + * \returns SDL_TRUE if events matching `type` are present, or SDL_FALSE if + * events matching `type` are not present. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasEvents + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type); + + +/** + * Check for the existence of certain event types in the event queue. + * + * If you need to check for a single event type, use SDL_HasEvent() instead. + * + * \param minType the low end of event type to be queried, inclusive; see + * SDL_EventType for details + * \param maxType the high end of event type to be queried, inclusive; see + * SDL_EventType for details + * \returns SDL_TRUE if events with type >= `minType` and <= `maxType` are + * present, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasEvents + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType); + +/** + * Clear events of a specific type from the event queue. + * + * This will unconditionally remove any events from the queue that match + * `type`. If you need to remove a range of event types, use SDL_FlushEvents() + * instead. + * + * It's also normal to just ignore events you don't care about in your event + * loop without calling this function. + * + * This function only affects currently queued events. If you want to make + * sure that all pending OS events are flushed, you can call SDL_PumpEvents() + * on the main thread immediately before the flush call. + * + * \param type the type of event to be cleared; see SDL_EventType for details + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FlushEvents + */ +extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type); + +/** + * Clear events of a range of types from the event queue. + * + * This will unconditionally remove any events from the queue that are in the + * range of `minType` to `maxType`, inclusive. If you need to remove a single + * event type, use SDL_FlushEvent() instead. + * + * It's also normal to just ignore events you don't care about in your event + * loop without calling this function. + * + * This function only affects currently queued events. If you want to make + * sure that all pending OS events are flushed, you can call SDL_PumpEvents() + * on the main thread immediately before the flush call. + * + * \param minType the low end of event type to be cleared, inclusive; see + * SDL_EventType for details + * \param maxType the high end of event type to be cleared, inclusive; see + * SDL_EventType for details + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FlushEvent + */ +extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType); + +/** + * Poll for currently pending events. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. The 1 returned refers to + * this event, immediately stored in the SDL Event structure -- not an event + * to follow. + * + * If `event` is NULL, it simply returns 1 if there is an event in the queue, + * but will not remove it from the queue. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that set the video mode. + * + * SDL_PollEvent() is the favored way of receiving system events since it can + * be done from the main loop and does not suspend the main loop while waiting + * on an event to be posted. + * + * The common practice is to fully process the event queue once every frame, + * usually as a first step before updating the game's state: + * + * ```c + * while (game_is_still_running) { + * SDL_Event event; + * while (SDL_PollEvent(&event)) { // poll until all events are handled! + * // decide what to do with this event. + * } + * + * // update game state, draw the current frame + * } + * ``` + * + * \param event the SDL_Event structure to be filled with the next event from + * the queue, or NULL + * \returns 1 if there is a pending event or 0 if there are none available. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventFilter + * \sa SDL_PeepEvents + * \sa SDL_PushEvent + * \sa SDL_SetEventFilter + * \sa SDL_WaitEvent + * \sa SDL_WaitEventTimeout + */ +extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event); + +/** + * Wait indefinitely for the next available event. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that initialized the video subsystem. + * + * \param event the SDL_Event structure to be filled in with the next event + * from the queue, or NULL + * \returns 1 on success or 0 if there was an error while waiting for events; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_WaitEventTimeout + */ +extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event); + +/** + * Wait until the specified timeout (in milliseconds) for the next available + * event. + * + * If `event` is not NULL, the next event is removed from the queue and stored + * in the SDL_Event structure pointed to by `event`. + * + * As this function may implicitly call SDL_PumpEvents(), you can only call + * this function in the thread that initialized the video subsystem. + * + * \param event the SDL_Event structure to be filled in with the next event + * from the queue, or NULL + * \param timeout the maximum number of milliseconds to wait for the next + * available event + * \returns 1 on success or 0 if there was an error while waiting for events; + * call SDL_GetError() for more information. This also returns 0 if + * the timeout elapsed without an event arriving. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PollEvent + * \sa SDL_PumpEvents + * \sa SDL_WaitEvent + */ +extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event, + int timeout); + +/** + * Add an event to the event queue. + * + * The event queue can actually be used as a two way communication channel. + * Not only can events be read from the queue, but the user can also push + * their own events onto it. `event` is a pointer to the event structure you + * wish to push onto the queue. The event is copied into the queue, and the + * caller may dispose of the memory pointed to after SDL_PushEvent() returns. + * + * Note: Pushing device input events onto the queue doesn't modify the state + * of the device within SDL. + * + * This function is thread-safe, and can be called from other threads safely. + * + * Note: Events pushed onto the queue with SDL_PushEvent() get passed through + * the event filter but events added with SDL_PeepEvents() do not. + * + * For pushing application-specific events, please use SDL_RegisterEvents() to + * get an event type that does not conflict with other code that also wants + * its own custom event types. + * + * \param event the SDL_Event to be added to the queue + * \returns 1 on success, 0 if the event was filtered, or a negative error + * code on failure; call SDL_GetError() for more information. A + * common reason for error is the event queue being full. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PeepEvents + * \sa SDL_PollEvent + * \sa SDL_RegisterEvents + */ +extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event); + +/** + * A function pointer used for callbacks that watch the event queue. + * + * \param userdata what was passed as `userdata` to SDL_SetEventFilter() + * or SDL_AddEventWatch, etc + * \param event the event that triggered the callback + * \returns 1 to permit event to be added to the queue, and 0 to disallow + * it. When used with SDL_AddEventWatch, the return value is ignored. + * + * \sa SDL_SetEventFilter + * \sa SDL_AddEventWatch + */ +typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event); + +/** + * Set up a filter to process all events before they change internal state and + * are posted to the internal event queue. + * + * If the filter function returns 1 when called, then the event will be added + * to the internal queue. If it returns 0, then the event will be dropped from + * the queue, but the internal state will still be updated. This allows + * selective filtering of dynamically arriving events. + * + * **WARNING**: Be very careful of what you do in the event filter function, + * as it may run in a different thread! + * + * On platforms that support it, if the quit event is generated by an + * interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the + * application at the next event poll. + * + * There is one caveat when dealing with the ::SDL_QuitEvent event type. The + * event filter is only called when the window manager desires to close the + * application window. If the event filter returns 1, then the window will be + * closed, otherwise the window will remain open if possible. + * + * Note: Disabled events never make it to the event filter function; see + * SDL_EventState(). + * + * Note: If you just want to inspect events without filtering, you should use + * SDL_AddEventWatch() instead. + * + * Note: Events pushed onto the queue with SDL_PushEvent() get passed through + * the event filter, but events pushed onto the queue with SDL_PeepEvents() do + * not. + * + * \param filter An SDL_EventFilter function to call when an event happens + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddEventWatch + * \sa SDL_EventState + * \sa SDL_GetEventFilter + * \sa SDL_PeepEvents + * \sa SDL_PushEvent + */ +extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter, + void *userdata); + +/** + * Query the current event filter. + * + * This function can be used to "chain" filters, by saving the existing filter + * before replacing it with a function that will call that saved filter. + * + * \param filter the current callback function will be stored here + * \param userdata the pointer that is passed to the current event filter will + * be stored here + * \returns SDL_TRUE on success or SDL_FALSE if there is no event filter set. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetEventFilter + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter, + void **userdata); + +/** + * Add a callback to be triggered when an event is added to the event queue. + * + * `filter` will be called when an event happens, and its return value is + * ignored. + * + * **WARNING**: Be very careful of what you do in the event filter function, + * as it may run in a different thread! + * + * If the quit event is generated by a signal (e.g. SIGINT), it will bypass + * the internal queue and be delivered to the watch callback immediately, and + * arrive at the next event poll. + * + * Note: the callback is called for events posted by the user through + * SDL_PushEvent(), but not for disabled events, nor for events by a filter + * callback set with SDL_SetEventFilter(), nor for events posted by the user + * through SDL_PeepEvents(). + * + * \param filter an SDL_EventFilter function to call when an event happens. + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DelEventWatch + * \sa SDL_SetEventFilter + */ +extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Remove an event watch callback added with SDL_AddEventWatch(). + * + * This function takes the same input as SDL_AddEventWatch() to identify and + * delete the corresponding callback. + * + * \param filter the function originally passed to SDL_AddEventWatch() + * \param userdata the pointer originally passed to SDL_AddEventWatch() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddEventWatch + */ +extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter, + void *userdata); + +/** + * Run a specific filter function on the current event queue, removing any + * events for which the filter returns 0. + * + * See SDL_SetEventFilter() for more information. Unlike SDL_SetEventFilter(), + * this function does not change the filter permanently, it only uses the + * supplied filter until this function returns. + * + * \param filter the SDL_EventFilter function to call when an event happens + * \param userdata a pointer that is passed to `filter` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventFilter + * \sa SDL_SetEventFilter + */ +extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter, + void *userdata); + +/* @{ */ +#define SDL_QUERY -1 +#define SDL_IGNORE 0 +#define SDL_DISABLE 0 +#define SDL_ENABLE 1 + +/** + * Set the state of processing events by type. + * + * `state` may be any of the following: + * + * - `SDL_QUERY`: returns the current processing state of the specified event + * - `SDL_IGNORE` (aka `SDL_DISABLE`): the event will automatically be dropped + * from the event queue and will not be filtered + * - `SDL_ENABLE`: the event will be processed normally + * + * \param type the type of event; see SDL_EventType for details + * \param state how to process the event + * \returns `SDL_DISABLE` or `SDL_ENABLE`, representing the processing state + * of the event before this function makes any changes to it. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetEventState + */ +extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state); +/* @} */ +#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY) + +/** + * Allocate a set of user-defined events, and return the beginning event + * number for that set of events. + * + * Calling this function with `numevents` <= 0 is an error and will return + * (Uint32)-1. + * + * Note, (Uint32)-1 means the maximum unsigned 32-bit integer value (or + * 0xFFFFFFFF), but is clearer to write. + * + * \param numevents the number of events to be allocated + * \returns the beginning event number, or (Uint32)-1 if there are not enough + * user-defined events left. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PushEvent + */ +extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_events_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_filesystem.h b/include/SDL/SDL_filesystem.h new file mode 100644 index 0000000..4cad657 --- /dev/null +++ b/include/SDL/SDL_filesystem.h @@ -0,0 +1,149 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_filesystem.h + * + * \brief Include file for filesystem SDL API functions + */ + +#ifndef SDL_filesystem_h_ +#define SDL_filesystem_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the directory where the application was run from. + * + * This is not necessarily a fast call, so you should call this once near + * startup and save the string if you need it. + * + * **Mac OS X and iOS Specific Functionality**: If the application is in a + * ".app" bundle, this function returns the Resource directory (e.g. + * MyApp.app/Contents/Resources/). This behaviour can be overridden by adding + * a property to the Info.plist file. Adding a string key with the name + * SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the + * behaviour. + * + * Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an + * application in /Applications/SDLApp/MyApp.app): + * + * - `resource`: bundle resource directory (the default). For example: + * `/Applications/SDLApp/MyApp.app/Contents/Resources` + * - `bundle`: the Bundle directory. For example: + * `/Applications/SDLApp/MyApp.app/` + * - `parent`: the containing directory of the bundle. For example: + * `/Applications/SDLApp/` + * + * **Nintendo 3DS Specific Functionality**: This function returns "romfs" + * directory of the application as it is uncommon to store resources outside + * the executable. As such it is not a writable directory. + * + * The returned path is guaranteed to end with a path separator ('\' on + * Windows, '/' on most other platforms). + * + * The pointer returned is owned by the caller. Please call SDL_free() on the + * pointer when done with it. + * + * \returns an absolute path in UTF-8 encoding to the application data + * directory. NULL will be returned on error or when the platform + * doesn't implement this functionality, call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_GetPrefPath + */ +extern DECLSPEC char *SDLCALL SDL_GetBasePath(void); + +/** + * Get the user-and-app-specific path where files can be written. + * + * Get the "pref dir". This is meant to be where users can write personal + * files (preferences and save games, etc) that are specific to your + * application. This directory is unique per user, per application. + * + * This function will decide the appropriate location in the native + * filesystem, create the directory if necessary, and return a string of the + * absolute path to the directory in UTF-8 encoding. + * + * On Windows, the string might look like: + * + * `C:\\Users\\bob\\AppData\\Roaming\\My Company\\My Program Name\\` + * + * On Linux, the string might look like: + * + * `/home/bob/.local/share/My Program Name/` + * + * On Mac OS X, the string might look like: + * + * `/Users/bob/Library/Application Support/My Program Name/` + * + * You should assume the path returned by this function is the only safe place + * to write files (and that SDL_GetBasePath(), while it might be writable, or + * even the parent of the returned path, isn't where you should be writing + * things). + * + * Both the org and app strings may become part of a directory name, so please + * follow these rules: + * + * - Try to use the same org string (_including case-sensitivity_) for all + * your applications that use this function. + * - Always use a unique app string for each one, and make sure it never + * changes for an app once you've decided on it. + * - Unicode characters are legal, as long as it's UTF-8 encoded, but... + * - ...only use letters, numbers, and spaces. Avoid punctuation like "Game + * Name 2: Bad Guy's Revenge!" ... "Game Name 2" is sufficient. + * + * The returned path is guaranteed to end with a path separator ('\' on + * Windows, '/' on most other platforms). + * + * The pointer returned is owned by the caller. Please call SDL_free() on the + * pointer when done with it. + * + * \param org the name of your organization + * \param app the name of your application + * \returns a UTF-8 string of the user directory in platform-dependent + * notation. NULL if there's a problem (creating directory failed, + * etc.). + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_GetBasePath + */ +extern DECLSPEC char *SDLCALL SDL_GetPrefPath(const char *org, const char *app); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_filesystem_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_gamecontroller.h b/include/SDL/SDL_gamecontroller.h new file mode 100644 index 0000000..d66e1b0 --- /dev/null +++ b/include/SDL/SDL_gamecontroller.h @@ -0,0 +1,1074 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_gamecontroller.h + * + * Include file for SDL game controller event handling + */ + +#ifndef SDL_gamecontroller_h_ +#define SDL_gamecontroller_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_rwops.h" +#include "SDL_sensor.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_gamecontroller.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_GAMECONTROLLER flag. This causes SDL to scan the system + * for game controllers, and load appropriate drivers. + * + * If you would like to receive controller updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/** + * The gamecontroller structure used to identify an SDL game controller + */ +struct _SDL_GameController; +typedef struct _SDL_GameController SDL_GameController; + +typedef enum +{ + SDL_CONTROLLER_TYPE_UNKNOWN = 0, + SDL_CONTROLLER_TYPE_XBOX360, + SDL_CONTROLLER_TYPE_XBOXONE, + SDL_CONTROLLER_TYPE_PS3, + SDL_CONTROLLER_TYPE_PS4, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_PRO, + SDL_CONTROLLER_TYPE_VIRTUAL, + SDL_CONTROLLER_TYPE_PS5, + SDL_CONTROLLER_TYPE_AMAZON_LUNA, + SDL_CONTROLLER_TYPE_GOOGLE_STADIA, + SDL_CONTROLLER_TYPE_NVIDIA_SHIELD, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_LEFT, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT, + SDL_CONTROLLER_TYPE_NINTENDO_SWITCH_JOYCON_PAIR +} SDL_GameControllerType; + +typedef enum +{ + SDL_CONTROLLER_BINDTYPE_NONE = 0, + SDL_CONTROLLER_BINDTYPE_BUTTON, + SDL_CONTROLLER_BINDTYPE_AXIS, + SDL_CONTROLLER_BINDTYPE_HAT +} SDL_GameControllerBindType; + +/** + * Get the SDL joystick layer binding for this controller button/axis mapping + */ +typedef struct SDL_GameControllerButtonBind +{ + SDL_GameControllerBindType bindType; + union + { + int button; + int axis; + struct { + int hat; + int hat_mask; + } hat; + } value; + +} SDL_GameControllerButtonBind; + + +/** + * To count the number of game controllers in the system for the following: + * + * ```c + * int nJoysticks = SDL_NumJoysticks(); + * int nGameControllers = 0; + * for (int i = 0; i < nJoysticks; i++) { + * if (SDL_IsGameController(i)) { + * nGameControllers++; + * } + * } + * ``` + * + * Using the SDL_HINT_GAMECONTROLLERCONFIG hint or the SDL_GameControllerAddMapping() you can add support for controllers SDL is unaware of or cause an existing controller to have a different binding. The format is: + * guid,name,mappings + * + * Where GUID is the string value from SDL_JoystickGetGUIDString(), name is the human readable string for the device and mappings are controller mappings to joystick ones. + * Under Windows there is a reserved GUID of "xinput" that covers any XInput devices. + * The mapping format for joystick is: + * bX - a joystick button, index X + * hX.Y - hat X with value Y + * aX - axis X of the joystick + * Buttons can be used as a controller axis and vice versa. + * + * This string shows an example of a valid mapping for a controller + * + * ```c + * "03000000341a00003608000000000000,PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7", + * ``` + */ + +/** + * Load a set of Game Controller mappings from a seekable SDL data stream. + * + * You can call this function several times, if needed, to load different + * database files. + * + * If a new mapping is loaded for an already known controller GUID, the later + * version will overwrite the one currently loaded. + * + * Mappings not belonging to the current platform or with no platform field + * specified will be ignored (i.e. mappings for Linux will be ignored in + * Windows, etc). + * + * This function will load the text database entirely in memory before + * processing it, so take this into consideration if you are in a memory + * constrained environment. + * + * \param rw the data stream for the mappings to be added + * \param freerw non-zero to close the stream after being read + * \returns the number of mappings added or -1 on error; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GameControllerAddMapping + * \sa SDL_GameControllerAddMappingsFromFile + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMappingsFromRW(SDL_RWops * rw, int freerw); + +/** + * Load a set of mappings from a file, filtered by the current SDL_GetPlatform() + * + * Convenience macro. + */ +#define SDL_GameControllerAddMappingsFromFile(file) SDL_GameControllerAddMappingsFromRW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Add support for controllers that SDL is unaware of or to cause an existing + * controller to have a different binding. + * + * The mapping string has the format "GUID,name,mapping", where GUID is the + * string value from SDL_JoystickGetGUIDString(), name is the human readable + * string for the device and mappings are controller mappings to joystick + * ones. Under Windows there is a reserved GUID of "xinput" that covers all + * XInput devices. The mapping format for joystick is: {| |bX |a joystick + * button, index X |- |hX.Y |hat X with value Y |- |aX |axis X of the joystick + * |} Buttons can be used as a controller axes and vice versa. + * + * This string shows an example of a valid mapping for a controller: + * + * ```c + * "341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7" + * ``` + * + * \param mappingString the mapping string + * \returns 1 if a new mapping is added, 0 if an existing mapping is updated, + * -1 on error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerMapping + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC int SDLCALL SDL_GameControllerAddMapping(const char* mappingString); + +/** + * Get the number of mappings installed. + * + * \returns the number of mappings. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerNumMappings(void); + +/** + * Get the mapping at a particular index. + * + * \returns the mapping string. Must be freed with SDL_free(). Returns NULL if + * the index is out of range. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForIndex(int mapping_index); + +/** + * Get the game controller mapping string for a given GUID. + * + * The returned string must be freed with SDL_free(). + * + * \param guid a structure containing the GUID for which a mapping is desired + * \returns a mapping string or NULL on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUID + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMappingForGUID(SDL_JoystickGUID guid); + +/** + * Get the current mapping of a Game Controller. + * + * The returned string must be freed with SDL_free(). + * + * Details about mappings are discussed with SDL_GameControllerAddMapping(). + * + * \param gamecontroller the game controller you want to get the current + * mapping for + * \returns a string that has the controller's mapping or NULL if no mapping + * is available; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerAddMapping + * \sa SDL_GameControllerMappingForGUID + */ +extern DECLSPEC char * SDLCALL SDL_GameControllerMapping(SDL_GameController *gamecontroller); + +/** + * Check if the given joystick is supported by the game controller interface. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, up to + * SDL_NumJoysticks() + * \returns SDL_TRUE if the given joystick is supported by the game controller + * interface, SDL_FALSE if it isn't or it's an invalid index. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerNameForIndex + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsGameController(int joystick_index); + +/** + * Get the implementation dependent name for the game controller. + * + * This function can be called before any controllers are opened. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the implementation-dependent name for the game controller, or NULL + * if there is no name or the index is invalid. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerName + * \sa SDL_GameControllerOpen + * \sa SDL_IsGameController + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerNameForIndex(int joystick_index); + +/** + * Get the implementation dependent path for the game controller. + * + * This function can be called before any controllers are opened. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the implementation-dependent path for the game controller, or NULL + * if there is no path or the index is invalid. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GameControllerPath + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerPathForIndex(int joystick_index); + +/** + * Get the type of a game controller. + * + * This can be called before any controllers are opened. + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the controller type. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerTypeForIndex(int joystick_index); + +/** + * Get the mapping of a game controller. + * + * This can be called before any controllers are opened. + * + * \param joystick_index the device_index of a device, from zero to + * SDL_NumJoysticks()-1 + * \returns the mapping string. Must be freed with SDL_free(). Returns NULL if + * no mapping is available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC char *SDLCALL SDL_GameControllerMappingForDeviceIndex(int joystick_index); + +/** + * Open a game controller for use. + * + * `joystick_index` is the same as the `device_index` passed to + * SDL_JoystickOpen(). + * + * The index passed as an argument refers to the N'th game controller on the + * system. This index is not the value which will identify this controller in + * future controller events. The joystick's instance id (SDL_JoystickID) will + * be used there instead. + * + * \param joystick_index the device_index of a device, up to + * SDL_NumJoysticks() + * \returns a gamecontroller identifier or NULL if an error occurred; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerClose + * \sa SDL_GameControllerNameForIndex + * \sa SDL_IsGameController + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerOpen(int joystick_index); + +/** + * Get the SDL_GameController associated with an instance id. + * + * \param joyid the instance id to get the SDL_GameController for + * \returns an SDL_GameController on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromInstanceID(SDL_JoystickID joyid); + +/** + * Get the SDL_GameController associated with a player index. + * + * Please note that the player index is _not_ the device index, nor is it the + * instance id! + * + * \param player_index the player index, which is not the device index or the + * instance id! + * \returns the SDL_GameController associated with a player index. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_GameControllerGetPlayerIndex + * \sa SDL_GameControllerSetPlayerIndex + */ +extern DECLSPEC SDL_GameController *SDLCALL SDL_GameControllerFromPlayerIndex(int player_index); + +/** + * Get the implementation-dependent name for an opened game controller. + * + * This is the same name as returned by SDL_GameControllerNameForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns the implementation dependent name for the game controller, or NULL + * if there is no name or the identifier passed is invalid. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerNameForIndex + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerName(SDL_GameController *gamecontroller); + +/** + * Get the implementation-dependent path for an opened game controller. + * + * This is the same path as returned by SDL_GameControllerNameForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns the implementation dependent path for the game controller, or NULL + * if there is no path or the identifier passed is invalid. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GameControllerPathForIndex + */ +extern DECLSPEC const char *SDLCALL SDL_GameControllerPath(SDL_GameController *gamecontroller); + +/** + * Get the type of this currently opened controller + * + * This is the same name as returned by SDL_GameControllerTypeForIndex(), but + * it takes a controller identifier instead of the (unstable) device index. + * + * \param gamecontroller the game controller object to query. + * \returns the controller type. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_GameControllerType SDLCALL SDL_GameControllerGetType(SDL_GameController *gamecontroller); + +/** + * Get the player index of an opened game controller. + * + * For XInput controllers this returns the XInput user index. + * + * \param gamecontroller the game controller object to query. + * \returns the player index for controller, or -1 if it's not available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetPlayerIndex(SDL_GameController *gamecontroller); + +/** + * Set the player index of an opened game controller. + * + * \param gamecontroller the game controller object to adjust. + * \param player_index Player index to assign to this controller, or -1 to + * clear the player index and turn off player LEDs. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerSetPlayerIndex(SDL_GameController *gamecontroller, int player_index); + +/** + * Get the USB vendor ID of an opened controller, if available. + * + * If the vendor ID isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB vendor ID, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetVendor(SDL_GameController *gamecontroller); + +/** + * Get the USB product ID of an opened controller, if available. + * + * If the product ID isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB product ID, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProduct(SDL_GameController *gamecontroller); + +/** + * Get the product version of an opened controller, if available. + * + * If the product version isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the USB product version, or zero if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetProductVersion(SDL_GameController *gamecontroller); + +/** + * Get the firmware version of an opened controller, if available. + * + * If the firmware version isn't available this function returns 0. + * + * \param gamecontroller the game controller object to query. + * \return the controller firmware version, or zero if unavailable. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC Uint16 SDLCALL SDL_GameControllerGetFirmwareVersion(SDL_GameController *gamecontroller); + +/** + * Get the serial number of an opened controller, if available. + * + * Returns the serial number of the controller, or NULL if it is not + * available. + * + * \param gamecontroller the game controller object to query. + * \return the serial number, or NULL if unavailable. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC const char * SDLCALL SDL_GameControllerGetSerial(SDL_GameController *gamecontroller); + +/** + * Check if a controller has been opened and is currently connected. + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * \returns SDL_TRUE if the controller has been opened and is currently + * connected, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerClose + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerGetAttached(SDL_GameController *gamecontroller); + +/** + * Get the Joystick ID from a Game Controller. + * + * This function will give you a SDL_Joystick object, which allows you to use + * the SDL_Joystick functions with a SDL_GameController object. This would be + * useful for getting a joystick's position at any given time, even if it + * hasn't moved (moving it would produce an event, which would have the axis' + * value). + * + * The pointer returned is owned by the SDL_GameController. You should not + * call SDL_JoystickClose() on it, for example, since doing so will likely + * cause SDL to crash. + * + * \param gamecontroller the game controller object that you want to get a + * joystick from + * \returns a SDL_Joystick object; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_GameControllerGetJoystick(SDL_GameController *gamecontroller); + +/** + * Query or change current state of Game Controller events. + * + * If controller events are disabled, you must call SDL_GameControllerUpdate() + * yourself and check the state of the controller when you want controller + * information. + * + * Any number can be passed to SDL_GameControllerEventState(), but only -1, 0, + * and 1 will have any effect. Other numbers will just be returned. + * + * \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE` + * \returns the same value passed to the function, with exception to -1 + * (SDL_QUERY), which will return the current state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickEventState + */ +extern DECLSPEC int SDLCALL SDL_GameControllerEventState(int state); + +/** + * Manually pump game controller updates if not using the loop. + * + * This function is called automatically by the event loop if events are + * enabled. Under such circumstances, it will not be necessary to call this + * function. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_GameControllerUpdate(void); + + +/** + * The list of axes available from a controller + * + * Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX, + * and are centered within ~8000 of zero, though advanced UI will allow users to set + * or autodetect the dead zone, which varies between controllers. + * + * Trigger axis values range from 0 to SDL_JOYSTICK_AXIS_MAX. + */ +typedef enum +{ + SDL_CONTROLLER_AXIS_INVALID = -1, + SDL_CONTROLLER_AXIS_LEFTX, + SDL_CONTROLLER_AXIS_LEFTY, + SDL_CONTROLLER_AXIS_RIGHTX, + SDL_CONTROLLER_AXIS_RIGHTY, + SDL_CONTROLLER_AXIS_TRIGGERLEFT, + SDL_CONTROLLER_AXIS_TRIGGERRIGHT, + SDL_CONTROLLER_AXIS_MAX +} SDL_GameControllerAxis; + +/** + * Convert a string into SDL_GameControllerAxis enum. + * + * This function is called internally to translate SDL_GameController mapping + * strings for the underlying joystick device into the consistent + * SDL_GameController mapping. You do not normally need to call this function + * unless you are parsing SDL_GameController mappings in your own code. + * + * Note specially that "righttrigger" and "lefttrigger" map to + * `SDL_CONTROLLER_AXIS_TRIGGERRIGHT` and `SDL_CONTROLLER_AXIS_TRIGGERLEFT`, + * respectively. + * + * \param str string representing a SDL_GameController axis + * \returns the SDL_GameControllerAxis enum corresponding to the input string, + * or `SDL_CONTROLLER_AXIS_INVALID` if no match was found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetStringForAxis + */ +extern DECLSPEC SDL_GameControllerAxis SDLCALL SDL_GameControllerGetAxisFromString(const char *str); + +/** + * Convert from an SDL_GameControllerAxis enum to a string. + * + * The caller should not SDL_free() the returned string. + * + * \param axis an enum value for a given SDL_GameControllerAxis + * \returns a string for the given axis, or NULL if an invalid axis is + * specified. The string returned is of the format used by + * SDL_GameController mapping strings. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetAxisFromString + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForAxis(SDL_GameControllerAxis axis); + +/** + * Get the SDL joystick layer binding for a controller axis mapping. + * + * \param gamecontroller a game controller + * \param axis an axis enum value (one of the SDL_GameControllerAxis values) + * \returns a SDL_GameControllerButtonBind describing the bind. On failure + * (like the given Controller axis doesn't exist on the device), its + * `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetBindForButton + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForAxis(SDL_GameController *gamecontroller, + SDL_GameControllerAxis axis); + +/** + * Query whether a game controller has a given axis. + * + * This merely reports whether the controller's mapping defined this axis, as + * that is all the information SDL has about the physical device. + * + * \param gamecontroller a game controller + * \param axis an axis enum value (an SDL_GameControllerAxis value) + * \returns SDL_TRUE if the controller has this axis, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL +SDL_GameControllerHasAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + +/** + * Get the current state of an axis control on a game controller. + * + * The axis indices start at index 0. + * + * The state is a value ranging from -32768 to 32767. Triggers, however, range + * from 0 to 32767 (they never return a negative value). + * + * \param gamecontroller a game controller + * \param axis an axis index (one of the SDL_GameControllerAxis values) + * \returns axis state (including 0) on success or 0 (also) on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetButton + */ +extern DECLSPEC Sint16 SDLCALL +SDL_GameControllerGetAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + +/** + * The list of buttons available from a controller + */ +typedef enum +{ + SDL_CONTROLLER_BUTTON_INVALID = -1, + SDL_CONTROLLER_BUTTON_A, + SDL_CONTROLLER_BUTTON_B, + SDL_CONTROLLER_BUTTON_X, + SDL_CONTROLLER_BUTTON_Y, + SDL_CONTROLLER_BUTTON_BACK, + SDL_CONTROLLER_BUTTON_GUIDE, + SDL_CONTROLLER_BUTTON_START, + SDL_CONTROLLER_BUTTON_LEFTSTICK, + SDL_CONTROLLER_BUTTON_RIGHTSTICK, + SDL_CONTROLLER_BUTTON_LEFTSHOULDER, + SDL_CONTROLLER_BUTTON_RIGHTSHOULDER, + SDL_CONTROLLER_BUTTON_DPAD_UP, + SDL_CONTROLLER_BUTTON_DPAD_DOWN, + SDL_CONTROLLER_BUTTON_DPAD_LEFT, + SDL_CONTROLLER_BUTTON_DPAD_RIGHT, + SDL_CONTROLLER_BUTTON_MISC1, /* Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button */ + SDL_CONTROLLER_BUTTON_PADDLE1, /* Xbox Elite paddle P1 */ + SDL_CONTROLLER_BUTTON_PADDLE2, /* Xbox Elite paddle P3 */ + SDL_CONTROLLER_BUTTON_PADDLE3, /* Xbox Elite paddle P2 */ + SDL_CONTROLLER_BUTTON_PADDLE4, /* Xbox Elite paddle P4 */ + SDL_CONTROLLER_BUTTON_TOUCHPAD, /* PS4/PS5 touchpad button */ + SDL_CONTROLLER_BUTTON_MAX +} SDL_GameControllerButton; + +/** + * Convert a string into an SDL_GameControllerButton enum. + * + * This function is called internally to translate SDL_GameController mapping + * strings for the underlying joystick device into the consistent + * SDL_GameController mapping. You do not normally need to call this function + * unless you are parsing SDL_GameController mappings in your own code. + * + * \param str string representing a SDL_GameController axis + * \returns the SDL_GameControllerButton enum corresponding to the input + * string, or `SDL_CONTROLLER_AXIS_INVALID` if no match was found. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_GameControllerButton SDLCALL SDL_GameControllerGetButtonFromString(const char *str); + +/** + * Convert from an SDL_GameControllerButton enum to a string. + * + * The caller should not SDL_free() the returned string. + * + * \param button an enum value for a given SDL_GameControllerButton + * \returns a string for the given button, or NULL if an invalid button is + * specified. The string returned is of the format used by + * SDL_GameController mapping strings. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetButtonFromString + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetStringForButton(SDL_GameControllerButton button); + +/** + * Get the SDL joystick layer binding for a controller button mapping. + * + * \param gamecontroller a game controller + * \param button an button enum value (an SDL_GameControllerButton value) + * \returns a SDL_GameControllerButtonBind describing the bind. On failure + * (like the given Controller button doesn't exist on the device), + * its `.bindType` will be `SDL_CONTROLLER_BINDTYPE_NONE`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetBindForAxis + */ +extern DECLSPEC SDL_GameControllerButtonBind SDLCALL +SDL_GameControllerGetBindForButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Query whether a game controller has a given button. + * + * This merely reports whether the controller's mapping defined this button, + * as that is all the information SDL has about the physical device. + * + * \param gamecontroller a game controller + * \param button a button enum value (an SDL_GameControllerButton value) + * \returns SDL_TRUE if the controller has this button, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Get the current state of a button on a game controller. + * + * \param gamecontroller a game controller + * \param button a button index (one of the SDL_GameControllerButton values) + * \returns 1 for pressed state or 0 for not pressed state or error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerGetAxis + */ +extern DECLSPEC Uint8 SDLCALL SDL_GameControllerGetButton(SDL_GameController *gamecontroller, + SDL_GameControllerButton button); + +/** + * Get the number of touchpads on a game controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpads(SDL_GameController *gamecontroller); + +/** + * Get the number of supported simultaneous fingers on a touchpad on a game + * controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetNumTouchpadFingers(SDL_GameController *gamecontroller, int touchpad); + +/** + * Get the current state of a finger on a touchpad on a game controller. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetTouchpadFinger(SDL_GameController *gamecontroller, int touchpad, int finger, Uint8 *state, float *x, float *y, float *pressure); + +/** + * Return whether a game controller has a particular sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \returns SDL_TRUE if the sensor exists, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasSensor(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Set whether data reporting for a game controller sensor is enabled. + * + * \param gamecontroller The controller to update + * \param type The type of sensor to enable/disable + * \param enabled Whether data reporting should be enabled + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSetSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type, SDL_bool enabled); + +/** + * Query whether sensor data reporting is enabled for a game controller. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \returns SDL_TRUE if the sensor is enabled, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerIsSensorEnabled(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Get the data rate (number of events per second) of a game controller + * sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \return the data rate, or 0.0f if the data rate is not available. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC float SDLCALL SDL_GameControllerGetSensorDataRate(SDL_GameController *gamecontroller, SDL_SensorType type); + +/** + * Get the current state of a game controller sensor. + * + * The number of values and interpretation of the data is sensor dependent. + * See SDL_sensor.h for the details for each type of sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \return 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorData(SDL_GameController *gamecontroller, SDL_SensorType type, float *data, int num_values); + +/** + * Get the current state of a game controller sensor with the timestamp of the + * last update. + * + * The number of values and interpretation of the data is sensor dependent. + * See SDL_sensor.h for the details for each type of sensor. + * + * \param gamecontroller The controller to query + * \param type The type of sensor to query + * \param timestamp A pointer filled with the timestamp in microseconds of the + * current sensor reading if available, or 0 if not + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \return 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.26.0. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerGetSensorDataWithTimestamp(SDL_GameController *gamecontroller, SDL_SensorType type, Uint64 *timestamp, float *data, int num_values); + +/** + * Start a rumble effect on a game controller. + * + * Each call to this function cancels any previous rumble effect, and calling + * it with 0 intensity stops any rumbling. + * + * \param gamecontroller The controller to vibrate + * \param low_frequency_rumble The intensity of the low frequency (left) + * rumble motor, from 0 to 0xFFFF + * \param high_frequency_rumble The intensity of the high frequency (right) + * rumble motor, from 0 to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if rumble isn't supported on this controller + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_GameControllerHasRumble + */ +extern DECLSPEC int SDLCALL SDL_GameControllerRumble(SDL_GameController *gamecontroller, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); + +/** + * Start a rumble effect in the game controller's triggers. + * + * Each call to this function cancels any previous trigger rumble effect, and + * calling it with 0 intensity stops any rumbling. + * + * Note that this is rumbling of the _triggers_ and not the game controller as + * a whole. This is currently only supported on Xbox One controllers. If you + * want the (more common) whole-controller rumble, use + * SDL_GameControllerRumble() instead. + * + * \param gamecontroller The controller to vibrate + * \param left_rumble The intensity of the left trigger rumble motor, from 0 + * to 0xFFFF + * \param right_rumble The intensity of the right trigger rumble motor, from 0 + * to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if trigger rumble isn't supported on this controller + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GameControllerHasRumbleTriggers + */ +extern DECLSPEC int SDLCALL SDL_GameControllerRumbleTriggers(SDL_GameController *gamecontroller, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); + +/** + * Query whether a game controller has an LED. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have a + * modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasLED(SDL_GameController *gamecontroller); + +/** + * Query whether a game controller has rumble support. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have rumble + * support + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerRumble + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasRumble(SDL_GameController *gamecontroller); + +/** + * Query whether a game controller has rumble support on triggers. + * + * \param gamecontroller The controller to query + * \returns SDL_TRUE, or SDL_FALSE if this controller does not have trigger + * rumble support + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerRumbleTriggers + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GameControllerHasRumbleTriggers(SDL_GameController *gamecontroller); + +/** + * Update a game controller's LED color. + * + * \param gamecontroller The controller to update + * \param red The intensity of the red LED + * \param green The intensity of the green LED + * \param blue The intensity of the blue LED + * \returns 0, or -1 if this controller does not have a modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSetLED(SDL_GameController *gamecontroller, Uint8 red, Uint8 green, Uint8 blue); + +/** + * Send a controller specific effect packet + * + * \param gamecontroller The controller to affect + * \param data The data to send to the controller + * \param size The size of the data to send to the controller + * \returns 0, or -1 if this controller or driver doesn't support effect + * packets + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_GameControllerSendEffect(SDL_GameController *gamecontroller, const void *data, int size); + +/** + * Close a game controller previously opened with SDL_GameControllerOpen(). + * + * \param gamecontroller a game controller identifier previously returned by + * SDL_GameControllerOpen() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerOpen + */ +extern DECLSPEC void SDLCALL SDL_GameControllerClose(SDL_GameController *gamecontroller); + +/** + * Return the sfSymbolsName for a given button on a game controller on Apple + * platforms. + * + * \param gamecontroller the controller to query + * \param button a button on the game controller + * \returns the sfSymbolsName or NULL if the name can't be found + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerGetAppleSFSymbolsNameForAxis + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForButton(SDL_GameController *gamecontroller, SDL_GameControllerButton button); + +/** + * Return the sfSymbolsName for a given axis on a game controller on Apple + * platforms. + * + * \param gamecontroller the controller to query + * \param axis an axis on the game controller + * \returns the sfSymbolsName or NULL if the name can't be found + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GameControllerGetAppleSFSymbolsNameForButton + */ +extern DECLSPEC const char* SDLCALL SDL_GameControllerGetAppleSFSymbolsNameForAxis(SDL_GameController *gamecontroller, SDL_GameControllerAxis axis); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_gamecontroller_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_gesture.h b/include/SDL/SDL_gesture.h new file mode 100644 index 0000000..db70b4d --- /dev/null +++ b/include/SDL/SDL_gesture.h @@ -0,0 +1,117 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_gesture.h + * + * Include file for SDL gesture event handling. + */ + +#ifndef SDL_gesture_h_ +#define SDL_gesture_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "SDL_touch.h" + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_GestureID; + +/* Function prototypes */ + +/** + * Begin recording a gesture on a specified touch device or all touch devices. + * + * If the parameter `touchId` is -1 (i.e., all devices), this function will + * always return 1, regardless of whether there actually are any devices. + * + * \param touchId the touch device id, or -1 for all touch devices + * \returns 1 on success or 0 if the specified device could not be found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchDevice + */ +extern DECLSPEC int SDLCALL SDL_RecordGesture(SDL_TouchID touchId); + + +/** + * Save all currently loaded Dollar Gesture templates. + * + * \param dst a SDL_RWops to save to + * \returns the number of saved templates on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadDollarTemplates + * \sa SDL_SaveDollarTemplate + */ +extern DECLSPEC int SDLCALL SDL_SaveAllDollarTemplates(SDL_RWops *dst); + +/** + * Save a currently loaded Dollar Gesture template. + * + * \param gestureId a gesture id + * \param dst a SDL_RWops to save to + * \returns 1 on success or 0 on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadDollarTemplates + * \sa SDL_SaveAllDollarTemplates + */ +extern DECLSPEC int SDLCALL SDL_SaveDollarTemplate(SDL_GestureID gestureId,SDL_RWops *dst); + + +/** + * Load Dollar Gesture templates from a file. + * + * \param touchId a touch id + * \param src a SDL_RWops to load from + * \returns the number of loaded templates on success or a negative error code + * (or 0) on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SaveAllDollarTemplates + * \sa SDL_SaveDollarTemplate + */ +extern DECLSPEC int SDLCALL SDL_LoadDollarTemplates(SDL_TouchID touchId, SDL_RWops *src); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_gesture_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_guid.h b/include/SDL/SDL_guid.h new file mode 100644 index 0000000..d964223 --- /dev/null +++ b/include/SDL/SDL_guid.h @@ -0,0 +1,100 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_guid.h + * + * Include file for handling ::SDL_GUID values. + */ + +#ifndef SDL_guid_h_ +#define SDL_guid_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * An SDL_GUID is a 128-bit identifier for an input device that + * identifies that device across runs of SDL programs on the same + * platform. If the device is detached and then re-attached to a + * different port, or if the base system is rebooted, the device + * should still report the same GUID. + * + * GUIDs are as precise as possible but are not guaranteed to + * distinguish physically distinct but equivalent devices. For + * example, two game controllers from the same vendor with the same + * product ID and revision may have the same GUID. + * + * GUIDs may be platform-dependent (i.e., the same device may report + * different GUIDs on different operating systems). + */ +typedef struct { + Uint8 data[16]; +} SDL_GUID; + +/* Function prototypes */ + +/** + * Get an ASCII string representation for a given ::SDL_GUID. + * + * You should supply at least 33 bytes for pszGUID. + * + * \param guid the ::SDL_GUID you wish to convert to string + * \param pszGUID buffer in which to write the ASCII string + * \param cbGUID the size of pszGUID + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GUIDFromString + */ +extern DECLSPEC void SDLCALL SDL_GUIDToString(SDL_GUID guid, char *pszGUID, int cbGUID); + +/** + * Convert a GUID string into a ::SDL_GUID structure. + * + * Performs no error checking. If this function is given a string containing + * an invalid GUID, the function will silently succeed, but the GUID generated + * will not be useful. + * + * \param pchGUID string containing an ASCII representation of a GUID + * \returns a ::SDL_GUID structure. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GUIDToString + */ +extern DECLSPEC SDL_GUID SDLCALL SDL_GUIDFromString(const char *pchGUID); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_guid_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_haptic.h b/include/SDL/SDL_haptic.h new file mode 100644 index 0000000..2462a1e --- /dev/null +++ b/include/SDL/SDL_haptic.h @@ -0,0 +1,1341 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_haptic.h + * + * \brief The SDL haptic subsystem allows you to control haptic (force feedback) + * devices. + * + * The basic usage is as follows: + * - Initialize the subsystem (::SDL_INIT_HAPTIC). + * - Open a haptic device. + * - SDL_HapticOpen() to open from index. + * - SDL_HapticOpenFromJoystick() to open from an existing joystick. + * - Create an effect (::SDL_HapticEffect). + * - Upload the effect with SDL_HapticNewEffect(). + * - Run the effect with SDL_HapticRunEffect(). + * - (optional) Free the effect with SDL_HapticDestroyEffect(). + * - Close the haptic device with SDL_HapticClose(). + * + * \par Simple rumble example: + * \code + * SDL_Haptic *haptic; + * + * // Open the device + * haptic = SDL_HapticOpen( 0 ); + * if (haptic == NULL) + * return -1; + * + * // Initialize simple rumble + * if (SDL_HapticRumbleInit( haptic ) != 0) + * return -1; + * + * // Play effect at 50% strength for 2 seconds + * if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0) + * return -1; + * SDL_Delay( 2000 ); + * + * // Clean up + * SDL_HapticClose( haptic ); + * \endcode + * + * \par Complete example: + * \code + * int test_haptic( SDL_Joystick * joystick ) { + * SDL_Haptic *haptic; + * SDL_HapticEffect effect; + * int effect_id; + * + * // Open the device + * haptic = SDL_HapticOpenFromJoystick( joystick ); + * if (haptic == NULL) return -1; // Most likely joystick isn't haptic + * + * // See if it can do sine waves + * if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) { + * SDL_HapticClose(haptic); // No sine effect + * return -1; + * } + * + * // Create the effect + * SDL_memset( &effect, 0, sizeof(SDL_HapticEffect) ); // 0 is safe default + * effect.type = SDL_HAPTIC_SINE; + * effect.periodic.direction.type = SDL_HAPTIC_POLAR; // Polar coordinates + * effect.periodic.direction.dir[0] = 18000; // Force comes from south + * effect.periodic.period = 1000; // 1000 ms + * effect.periodic.magnitude = 20000; // 20000/32767 strength + * effect.periodic.length = 5000; // 5 seconds long + * effect.periodic.attack_length = 1000; // Takes 1 second to get max strength + * effect.periodic.fade_length = 1000; // Takes 1 second to fade away + * + * // Upload the effect + * effect_id = SDL_HapticNewEffect( haptic, &effect ); + * + * // Test the effect + * SDL_HapticRunEffect( haptic, effect_id, 1 ); + * SDL_Delay( 5000); // Wait for the effect to finish + * + * // We destroy the effect, although closing the device also does this + * SDL_HapticDestroyEffect( haptic, effect_id ); + * + * // Close the device + * SDL_HapticClose(haptic); + * + * return 0; // Success + * } + * \endcode + */ + +#ifndef SDL_haptic_h_ +#define SDL_haptic_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_joystick.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* FIXME: For SDL 2.1, adjust all the magnitude variables to be Uint16 (0xFFFF). + * + * At the moment the magnitude variables are mixed between signed/unsigned, and + * it is also not made clear that ALL of those variables expect a max of 0x7FFF. + * + * Some platforms may have higher precision than that (Linux FF, Windows XInput) + * so we should fix the inconsistency in favor of higher possible precision, + * adjusting for platforms that use different scales. + * -flibit + */ + +/** + * \typedef SDL_Haptic + * + * \brief The haptic structure used to identify an SDL haptic. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticClose + */ +struct _SDL_Haptic; +typedef struct _SDL_Haptic SDL_Haptic; + + +/** + * \name Haptic features + * + * Different haptic features a device can have. + */ +/* @{ */ + +/** + * \name Haptic effects + */ +/* @{ */ + +/** + * \brief Constant effect supported. + * + * Constant haptic effect. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_CONSTANT (1u<<0) + +/** + * \brief Sine wave effect supported. + * + * Periodic haptic effect that simulates sine waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SINE (1u<<1) + +/** + * \brief Left/Right effect supported. + * + * Haptic effect for direct control over high/low frequency motors. + * + * \sa SDL_HapticLeftRight + * \warning this value was SDL_HAPTIC_SQUARE right before 2.0.0 shipped. Sorry, + * we ran out of bits, and this is important for XInput devices. + */ +#define SDL_HAPTIC_LEFTRIGHT (1u<<2) + +/* !!! FIXME: put this back when we have more bits in 2.1 */ +/* #define SDL_HAPTIC_SQUARE (1<<2) */ + +/** + * \brief Triangle wave effect supported. + * + * Periodic haptic effect that simulates triangular waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_TRIANGLE (1u<<3) + +/** + * \brief Sawtoothup wave effect supported. + * + * Periodic haptic effect that simulates saw tooth up waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHUP (1u<<4) + +/** + * \brief Sawtoothdown wave effect supported. + * + * Periodic haptic effect that simulates saw tooth down waves. + * + * \sa SDL_HapticPeriodic + */ +#define SDL_HAPTIC_SAWTOOTHDOWN (1u<<5) + +/** + * \brief Ramp effect supported. + * + * Ramp haptic effect. + * + * \sa SDL_HapticRamp + */ +#define SDL_HAPTIC_RAMP (1u<<6) + +/** + * \brief Spring effect supported - uses axes position. + * + * Condition haptic effect that simulates a spring. Effect is based on the + * axes position. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_SPRING (1u<<7) + +/** + * \brief Damper effect supported - uses axes velocity. + * + * Condition haptic effect that simulates dampening. Effect is based on the + * axes velocity. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_DAMPER (1u<<8) + +/** + * \brief Inertia effect supported - uses axes acceleration. + * + * Condition haptic effect that simulates inertia. Effect is based on the axes + * acceleration. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_INERTIA (1u<<9) + +/** + * \brief Friction effect supported - uses axes movement. + * + * Condition haptic effect that simulates friction. Effect is based on the + * axes movement. + * + * \sa SDL_HapticCondition + */ +#define SDL_HAPTIC_FRICTION (1u<<10) + +/** + * \brief Custom effect is supported. + * + * User defined custom haptic effect. + */ +#define SDL_HAPTIC_CUSTOM (1u<<11) + +/* @} *//* Haptic effects */ + +/* These last few are features the device has, not effects */ + +/** + * \brief Device can set global gain. + * + * Device supports setting the global gain. + * + * \sa SDL_HapticSetGain + */ +#define SDL_HAPTIC_GAIN (1u<<12) + +/** + * \brief Device can set autocenter. + * + * Device supports setting autocenter. + * + * \sa SDL_HapticSetAutocenter + */ +#define SDL_HAPTIC_AUTOCENTER (1u<<13) + +/** + * \brief Device can be queried for effect status. + * + * Device supports querying effect status. + * + * \sa SDL_HapticGetEffectStatus + */ +#define SDL_HAPTIC_STATUS (1u<<14) + +/** + * \brief Device can be paused. + * + * Devices supports being paused. + * + * \sa SDL_HapticPause + * \sa SDL_HapticUnpause + */ +#define SDL_HAPTIC_PAUSE (1u<<15) + + +/** + * \name Direction encodings + */ +/* @{ */ + +/** + * \brief Uses polar coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_POLAR 0 + +/** + * \brief Uses cartesian coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_CARTESIAN 1 + +/** + * \brief Uses spherical coordinates for the direction. + * + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_SPHERICAL 2 + +/** + * \brief Use this value to play an effect on the steering wheel axis. This + * provides better compatibility across platforms and devices as SDL will guess + * the correct axis. + * \sa SDL_HapticDirection + */ +#define SDL_HAPTIC_STEERING_AXIS 3 + +/* @} *//* Direction encodings */ + +/* @} *//* Haptic features */ + +/* + * Misc defines. + */ + +/** + * \brief Used to play a device an infinite number of times. + * + * \sa SDL_HapticRunEffect + */ +#define SDL_HAPTIC_INFINITY 4294967295U + + +/** + * \brief Structure that represents a haptic direction. + * + * This is the direction where the force comes from, + * instead of the direction in which the force is exerted. + * + * Directions can be specified by: + * - ::SDL_HAPTIC_POLAR : Specified by polar coordinates. + * - ::SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates. + * - ::SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates. + * + * Cardinal directions of the haptic device are relative to the positioning + * of the device. North is considered to be away from the user. + * + * The following diagram represents the cardinal directions: + * \verbatim + .--. + |__| .-------. + |=.| |.-----.| + |--| || || + | | |'-----'| + |__|~')_____(' + [ COMPUTER ] + + + North (0,-1) + ^ + | + | + (-1,0) West <----[ HAPTIC ]----> East (1,0) + | + | + v + South (0,1) + + + [ USER ] + \|||/ + (o o) + ---ooO-(_)-Ooo--- + \endverbatim + * + * If type is ::SDL_HAPTIC_POLAR, direction is encoded by hundredths of a + * degree starting north and turning clockwise. ::SDL_HAPTIC_POLAR only uses + * the first \c dir parameter. The cardinal directions would be: + * - North: 0 (0 degrees) + * - East: 9000 (90 degrees) + * - South: 18000 (180 degrees) + * - West: 27000 (270 degrees) + * + * If type is ::SDL_HAPTIC_CARTESIAN, direction is encoded by three positions + * (X axis, Y axis and Z axis (with 3 axes)). ::SDL_HAPTIC_CARTESIAN uses + * the first three \c dir parameters. The cardinal directions would be: + * - North: 0,-1, 0 + * - East: 1, 0, 0 + * - South: 0, 1, 0 + * - West: -1, 0, 0 + * + * The Z axis represents the height of the effect if supported, otherwise + * it's unused. In cartesian encoding (1, 2) would be the same as (2, 4), you + * can use any multiple you want, only the direction matters. + * + * If type is ::SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. + * The first two \c dir parameters are used. The \c dir parameters are as + * follows (all values are in hundredths of degrees): + * - Degrees from (1, 0) rotated towards (0, 1). + * - Degrees towards (0, 0, 1) (device needs at least 3 axes). + * + * + * Example of force coming from the south with all encodings (force coming + * from the south means the user will have to pull the stick to counteract): + * \code + * SDL_HapticDirection direction; + * + * // Cartesian directions + * direction.type = SDL_HAPTIC_CARTESIAN; // Using cartesian direction encoding. + * direction.dir[0] = 0; // X position + * direction.dir[1] = 1; // Y position + * // Assuming the device has 2 axes, we don't need to specify third parameter. + * + * // Polar directions + * direction.type = SDL_HAPTIC_POLAR; // We'll be using polar direction encoding. + * direction.dir[0] = 18000; // Polar only uses first parameter + * + * // Spherical coordinates + * direction.type = SDL_HAPTIC_SPHERICAL; // Spherical encoding + * direction.dir[0] = 9000; // Since we only have two axes we don't need more parameters. + * \endcode + * + * \sa SDL_HAPTIC_POLAR + * \sa SDL_HAPTIC_CARTESIAN + * \sa SDL_HAPTIC_SPHERICAL + * \sa SDL_HAPTIC_STEERING_AXIS + * \sa SDL_HapticEffect + * \sa SDL_HapticNumAxes + */ +typedef struct SDL_HapticDirection +{ + Uint8 type; /**< The type of encoding. */ + Sint32 dir[3]; /**< The encoded direction. */ +} SDL_HapticDirection; + + +/** + * \brief A structure containing a template for a Constant effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_CONSTANT effect. + * + * A constant effect applies a constant force in the specified direction + * to the joystick. + * + * \sa SDL_HAPTIC_CONSTANT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticConstant +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CONSTANT */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Constant */ + Sint16 level; /**< Strength of the constant effect. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticConstant; + +/** + * \brief A structure containing a template for a Periodic effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SINE + * - ::SDL_HAPTIC_LEFTRIGHT + * - ::SDL_HAPTIC_TRIANGLE + * - ::SDL_HAPTIC_SAWTOOTHUP + * - ::SDL_HAPTIC_SAWTOOTHDOWN + * + * A periodic effect consists in a wave-shaped effect that repeats itself + * over time. The type determines the shape of the wave and the parameters + * determine the dimensions of the wave. + * + * Phase is given by hundredth of a degree meaning that giving the phase a value + * of 9000 will displace it 25% of its period. Here are sample values: + * - 0: No phase displacement. + * - 9000: Displaced 25% of its period. + * - 18000: Displaced 50% of its period. + * - 27000: Displaced 75% of its period. + * - 36000: Displaced 100% of its period, same as 0, but 0 is preferred. + * + * Examples: + * \verbatim + SDL_HAPTIC_SINE + __ __ __ __ + / \ / \ / \ / + / \__/ \__/ \__/ + + SDL_HAPTIC_SQUARE + __ __ __ __ __ + | | | | | | | | | | + | |__| |__| |__| |__| | + + SDL_HAPTIC_TRIANGLE + /\ /\ /\ /\ /\ + / \ / \ / \ / \ / + / \/ \/ \/ \/ + + SDL_HAPTIC_SAWTOOTHUP + /| /| /| /| /| /| /| + / | / | / | / | / | / | / | + / |/ |/ |/ |/ |/ |/ | + + SDL_HAPTIC_SAWTOOTHDOWN + \ |\ |\ |\ |\ |\ |\ | + \ | \ | \ | \ | \ | \ | \ | + \| \| \| \| \| \| \| + \endverbatim + * + * \sa SDL_HAPTIC_SINE + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HAPTIC_TRIANGLE + * \sa SDL_HAPTIC_SAWTOOTHUP + * \sa SDL_HAPTIC_SAWTOOTHDOWN + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticPeriodic +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SINE, ::SDL_HAPTIC_LEFTRIGHT, + ::SDL_HAPTIC_TRIANGLE, ::SDL_HAPTIC_SAWTOOTHUP or + ::SDL_HAPTIC_SAWTOOTHDOWN */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Periodic */ + Uint16 period; /**< Period of the wave. */ + Sint16 magnitude; /**< Peak value; if negative, equivalent to 180 degrees extra phase shift. */ + Sint16 offset; /**< Mean value of the wave. */ + Uint16 phase; /**< Positive phase shift given by hundredth of a degree. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticPeriodic; + +/** + * \brief A structure containing a template for a Condition effect. + * + * The struct handles the following effects: + * - ::SDL_HAPTIC_SPRING: Effect based on axes position. + * - ::SDL_HAPTIC_DAMPER: Effect based on axes velocity. + * - ::SDL_HAPTIC_INERTIA: Effect based on axes acceleration. + * - ::SDL_HAPTIC_FRICTION: Effect based on axes movement. + * + * Direction is handled by condition internals instead of a direction member. + * The condition effect specific members have three parameters. The first + * refers to the X axis, the second refers to the Y axis and the third + * refers to the Z axis. The right terms refer to the positive side of the + * axis and the left terms refer to the negative side of the axis. Please + * refer to the ::SDL_HapticDirection diagram for which side is positive and + * which is negative. + * + * \sa SDL_HapticDirection + * \sa SDL_HAPTIC_SPRING + * \sa SDL_HAPTIC_DAMPER + * \sa SDL_HAPTIC_INERTIA + * \sa SDL_HAPTIC_FRICTION + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCondition +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_SPRING, ::SDL_HAPTIC_DAMPER, + ::SDL_HAPTIC_INERTIA or ::SDL_HAPTIC_FRICTION */ + SDL_HapticDirection direction; /**< Direction of the effect - Not used ATM. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Condition */ + Uint16 right_sat[3]; /**< Level when joystick is to the positive side; max 0xFFFF. */ + Uint16 left_sat[3]; /**< Level when joystick is to the negative side; max 0xFFFF. */ + Sint16 right_coeff[3]; /**< How fast to increase the force towards the positive side. */ + Sint16 left_coeff[3]; /**< How fast to increase the force towards the negative side. */ + Uint16 deadband[3]; /**< Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered. */ + Sint16 center[3]; /**< Position of the dead zone. */ +} SDL_HapticCondition; + +/** + * \brief A structure containing a template for a Ramp effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_RAMP effect. + * + * The ramp effect starts at start strength and ends at end strength. + * It augments in linear fashion. If you use attack and fade with a ramp + * the effects get added to the ramp effect making the effect become + * quadratic instead of linear. + * + * \sa SDL_HAPTIC_RAMP + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticRamp +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_RAMP */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Ramp */ + Sint16 start; /**< Beginning strength level. */ + Sint16 end; /**< Ending strength level. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticRamp; + +/** + * \brief A structure containing a template for a Left/Right effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_LEFTRIGHT effect. + * + * The Left/Right effect is used to explicitly control the large and small + * motors, commonly found in modern game controllers. The small (right) motor + * is high frequency, and the large (left) motor is low frequency. + * + * \sa SDL_HAPTIC_LEFTRIGHT + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticLeftRight +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_LEFTRIGHT */ + + /* Replay */ + Uint32 length; /**< Duration of the effect in milliseconds. */ + + /* Rumble */ + Uint16 large_magnitude; /**< Control of the large controller motor. */ + Uint16 small_magnitude; /**< Control of the small controller motor. */ +} SDL_HapticLeftRight; + +/** + * \brief A structure containing a template for the ::SDL_HAPTIC_CUSTOM effect. + * + * This struct is exclusively for the ::SDL_HAPTIC_CUSTOM effect. + * + * A custom force feedback effect is much like a periodic effect, where the + * application can define its exact shape. You will have to allocate the + * data yourself. Data should consist of channels * samples Uint16 samples. + * + * If channels is one, the effect is rotated using the defined direction. + * Otherwise it uses the samples in data for the different axes. + * + * \sa SDL_HAPTIC_CUSTOM + * \sa SDL_HapticEffect + */ +typedef struct SDL_HapticCustom +{ + /* Header */ + Uint16 type; /**< ::SDL_HAPTIC_CUSTOM */ + SDL_HapticDirection direction; /**< Direction of the effect. */ + + /* Replay */ + Uint32 length; /**< Duration of the effect. */ + Uint16 delay; /**< Delay before starting the effect. */ + + /* Trigger */ + Uint16 button; /**< Button that triggers the effect. */ + Uint16 interval; /**< How soon it can be triggered again after button. */ + + /* Custom */ + Uint8 channels; /**< Axes to use, minimum of one. */ + Uint16 period; /**< Sample periods. */ + Uint16 samples; /**< Amount of samples. */ + Uint16 *data; /**< Should contain channels*samples items. */ + + /* Envelope */ + Uint16 attack_length; /**< Duration of the attack. */ + Uint16 attack_level; /**< Level at the start of the attack. */ + Uint16 fade_length; /**< Duration of the fade. */ + Uint16 fade_level; /**< Level at the end of the fade. */ +} SDL_HapticCustom; + +/** + * \brief The generic template for any haptic effect. + * + * All values max at 32767 (0x7FFF). Signed values also can be negative. + * Time values unless specified otherwise are in milliseconds. + * + * You can also pass ::SDL_HAPTIC_INFINITY to length instead of a 0-32767 + * value. Neither delay, interval, attack_length nor fade_length support + * ::SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends. + * + * Additionally, the ::SDL_HAPTIC_RAMP effect does not support a duration of + * ::SDL_HAPTIC_INFINITY. + * + * Button triggers may not be supported on all devices, it is advised to not + * use them if possible. Buttons start at index 1 instead of index 0 like + * the joystick. + * + * If both attack_length and fade_level are 0, the envelope is not used, + * otherwise both values are used. + * + * Common parts: + * \code + * // Replay - All effects have this + * Uint32 length; // Duration of effect (ms). + * Uint16 delay; // Delay before starting effect. + * + * // Trigger - All effects have this + * Uint16 button; // Button that triggers effect. + * Uint16 interval; // How soon before effect can be triggered again. + * + * // Envelope - All effects except condition effects have this + * Uint16 attack_length; // Duration of the attack (ms). + * Uint16 attack_level; // Level at the start of the attack. + * Uint16 fade_length; // Duration of the fade out (ms). + * Uint16 fade_level; // Level at the end of the fade. + * \endcode + * + * + * Here we have an example of a constant effect evolution in time: + * \verbatim + Strength + ^ + | + | effect level --> _________________ + | / \ + | / \ + | / \ + | / \ + | attack_level --> | \ + | | | <--- fade_level + | + +--------------------------------------------------> Time + [--] [---] + attack_length fade_length + + [------------------][-----------------------] + delay length + \endverbatim + * + * Note either the attack_level or the fade_level may be above the actual + * effect level. + * + * \sa SDL_HapticConstant + * \sa SDL_HapticPeriodic + * \sa SDL_HapticCondition + * \sa SDL_HapticRamp + * \sa SDL_HapticLeftRight + * \sa SDL_HapticCustom + */ +typedef union SDL_HapticEffect +{ + /* Common for all force feedback effects */ + Uint16 type; /**< Effect type. */ + SDL_HapticConstant constant; /**< Constant effect. */ + SDL_HapticPeriodic periodic; /**< Periodic effect. */ + SDL_HapticCondition condition; /**< Condition effect. */ + SDL_HapticRamp ramp; /**< Ramp effect. */ + SDL_HapticLeftRight leftright; /**< Left/Right effect. */ + SDL_HapticCustom custom; /**< Custom effect. */ +} SDL_HapticEffect; + + +/* Function prototypes */ + +/** + * Count the number of haptic devices attached to the system. + * + * \returns the number of haptic devices detected on the system or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticName + */ +extern DECLSPEC int SDLCALL SDL_NumHaptics(void); + +/** + * Get the implementation dependent name of a haptic device. + * + * This can be called before any joysticks are opened. If no name can be + * found, this function returns NULL. + * + * \param device_index index of the device to query. + * \returns the name of the device or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_NumHaptics + */ +extern DECLSPEC const char *SDLCALL SDL_HapticName(int device_index); + +/** + * Open a haptic device for use. + * + * The index passed as an argument refers to the N'th haptic device on this + * system. + * + * When opening a haptic device, its gain will be set to maximum and + * autocenter will be disabled. To modify these values use SDL_HapticSetGain() + * and SDL_HapticSetAutocenter(). + * + * \param device_index index of the device to open + * \returns the device identifier or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticClose + * \sa SDL_HapticIndex + * \sa SDL_HapticOpenFromJoystick + * \sa SDL_HapticOpenFromMouse + * \sa SDL_HapticPause + * \sa SDL_HapticSetAutocenter + * \sa SDL_HapticSetGain + * \sa SDL_HapticStopAll + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpen(int device_index); + +/** + * Check if the haptic device at the designated index has been opened. + * + * \param device_index the index of the device to query + * \returns 1 if it has been opened, 0 if it hasn't or on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticIndex + * \sa SDL_HapticOpen + */ +extern DECLSPEC int SDLCALL SDL_HapticOpened(int device_index); + +/** + * Get the index of a haptic device. + * + * \param haptic the SDL_Haptic device to query + * \returns the index of the specified haptic device or a negative error code + * on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticOpened + */ +extern DECLSPEC int SDLCALL SDL_HapticIndex(SDL_Haptic * haptic); + +/** + * Query whether or not the current mouse has haptic capabilities. + * + * \returns SDL_TRUE if the mouse is haptic or SDL_FALSE if it isn't. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpenFromMouse + */ +extern DECLSPEC int SDLCALL SDL_MouseIsHaptic(void); + +/** + * Try to open a haptic device from the current mouse. + * + * \returns the haptic device identifier or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_MouseIsHaptic + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromMouse(void); + +/** + * Query if a joystick has haptic features. + * + * \param joystick the SDL_Joystick to test for haptic capabilities + * \returns SDL_TRUE if the joystick is haptic, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpenFromJoystick + */ +extern DECLSPEC int SDLCALL SDL_JoystickIsHaptic(SDL_Joystick * joystick); + +/** + * Open a haptic device for use from a joystick device. + * + * You must still close the haptic device separately. It will not be closed + * with the joystick. + * + * When opened from a joystick you should first close the haptic device before + * closing the joystick device. If not, on some implementations the haptic + * device will also get unallocated and you'll be unable to use force feedback + * on that device. + * + * \param joystick the SDL_Joystick to create a haptic device from + * \returns a valid haptic device identifier on success or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticClose + * \sa SDL_HapticOpen + * \sa SDL_JoystickIsHaptic + */ +extern DECLSPEC SDL_Haptic *SDLCALL SDL_HapticOpenFromJoystick(SDL_Joystick * + joystick); + +/** + * Close a haptic device previously opened with SDL_HapticOpen(). + * + * \param haptic the SDL_Haptic device to close + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + */ +extern DECLSPEC void SDLCALL SDL_HapticClose(SDL_Haptic * haptic); + +/** + * Get the number of effects a haptic device can store. + * + * On some platforms this isn't fully supported, and therefore is an + * approximation. Always check to see if your created effect was actually + * created and do not rely solely on SDL_HapticNumEffects(). + * + * \param haptic the SDL_Haptic device to query + * \returns the number of effects the haptic device can store or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNumEffectsPlaying + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffects(SDL_Haptic * haptic); + +/** + * Get the number of effects a haptic device can play at the same time. + * + * This is not supported on all platforms, but will always return a value. + * + * \param haptic the SDL_Haptic device to query maximum playing effects + * \returns the number of effects the haptic device can play at the same time + * or a negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNumEffects + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic); + +/** + * Get the haptic device's supported features in bitwise manner. + * + * \param haptic the SDL_Haptic device to query + * \returns a list of supported haptic features in bitwise manner (OR'd), or 0 + * on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticEffectSupported + * \sa SDL_HapticNumEffects + */ +extern DECLSPEC unsigned int SDLCALL SDL_HapticQuery(SDL_Haptic * haptic); + + +/** + * Get the number of haptic axes the device has. + * + * The number of haptic axes might be useful if working with the + * SDL_HapticDirection effect. + * + * \param haptic the SDL_Haptic device to query + * \returns the number of axes on success or a negative error code on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_HapticNumAxes(SDL_Haptic * haptic); + +/** + * Check to see if an effect is supported by a haptic device. + * + * \param haptic the SDL_Haptic device to query + * \param effect the desired effect to query + * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNewEffect + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticEffectSupported(SDL_Haptic * haptic, + SDL_HapticEffect * + effect); + +/** + * Create a new haptic effect on a specified device. + * + * \param haptic an SDL_Haptic device to create the effect on + * \param effect an SDL_HapticEffect structure containing the properties of + * the effect to create + * \returns the ID of the effect on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticRunEffect + * \sa SDL_HapticUpdateEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticNewEffect(SDL_Haptic * haptic, + SDL_HapticEffect * effect); + +/** + * Update the properties of an effect. + * + * Can be used dynamically, although behavior when dynamically changing + * direction may be strange. Specifically the effect may re-upload itself and + * start playing from the start. You also cannot change the type either when + * running SDL_HapticUpdateEffect(). + * + * \param haptic the SDL_Haptic device that has the effect + * \param effect the identifier of the effect to update + * \param data an SDL_HapticEffect structure containing the new effect + * properties to use + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticNewEffect + * \sa SDL_HapticRunEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticUpdateEffect(SDL_Haptic * haptic, + int effect, + SDL_HapticEffect * data); + +/** + * Run the haptic effect on its associated haptic device. + * + * To repeat the effect over and over indefinitely, set `iterations` to + * `SDL_HAPTIC_INFINITY`. (Repeats the envelope - attack and fade.) To make + * one instance of the effect last indefinitely (so the effect does not fade), + * set the effect's `length` in its structure/union to `SDL_HAPTIC_INFINITY` + * instead. + * + * \param haptic the SDL_Haptic device to run the effect on + * \param effect the ID of the haptic effect to run + * \param iterations the number of iterations to run the effect; use + * `SDL_HAPTIC_INFINITY` to repeat forever + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticGetEffectStatus + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticRunEffect(SDL_Haptic * haptic, + int effect, + Uint32 iterations); + +/** + * Stop the haptic effect on its associated haptic device. + * + * * + * + * \param haptic the SDL_Haptic device to stop the effect on + * \param effect the ID of the haptic effect to stop + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticDestroyEffect + * \sa SDL_HapticRunEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticStopEffect(SDL_Haptic * haptic, + int effect); + +/** + * Destroy a haptic effect on the device. + * + * This will stop the effect if it's running. Effects are automatically + * destroyed when the device is closed. + * + * \param haptic the SDL_Haptic device to destroy the effect on + * \param effect the ID of the haptic effect to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticNewEffect + */ +extern DECLSPEC void SDLCALL SDL_HapticDestroyEffect(SDL_Haptic * haptic, + int effect); + +/** + * Get the status of the current effect on the specified haptic device. + * + * Device must support the SDL_HAPTIC_STATUS feature. + * + * \param haptic the SDL_Haptic device to query for the effect status on + * \param effect the ID of the haptic effect to query its status + * \returns 0 if it isn't playing, 1 if it is playing, or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRunEffect + * \sa SDL_HapticStopEffect + */ +extern DECLSPEC int SDLCALL SDL_HapticGetEffectStatus(SDL_Haptic * haptic, + int effect); + +/** + * Set the global gain of the specified haptic device. + * + * Device must support the SDL_HAPTIC_GAIN feature. + * + * The user may specify the maximum gain by setting the environment variable + * `SDL_HAPTIC_GAIN_MAX` which should be between 0 and 100. All calls to + * SDL_HapticSetGain() will scale linearly using `SDL_HAPTIC_GAIN_MAX` as the + * maximum. + * + * \param haptic the SDL_Haptic device to set the gain on + * \param gain value to set the gain to, should be between 0 and 100 (0 - 100) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetGain(SDL_Haptic * haptic, int gain); + +/** + * Set the global autocenter of the device. + * + * Autocenter should be between 0 and 100. Setting it to 0 will disable + * autocentering. + * + * Device must support the SDL_HAPTIC_AUTOCENTER feature. + * + * \param haptic the SDL_Haptic device to set autocentering on + * \param autocenter value to set autocenter to (0-100) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticQuery + */ +extern DECLSPEC int SDLCALL SDL_HapticSetAutocenter(SDL_Haptic * haptic, + int autocenter); + +/** + * Pause a haptic device. + * + * Device must support the `SDL_HAPTIC_PAUSE` feature. Call + * SDL_HapticUnpause() to resume playback. + * + * Do not modify the effects nor add new ones while the device is paused. That + * can cause all sorts of weird errors. + * + * \param haptic the SDL_Haptic device to pause + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticUnpause + */ +extern DECLSPEC int SDLCALL SDL_HapticPause(SDL_Haptic * haptic); + +/** + * Unpause a haptic device. + * + * Call to unpause after SDL_HapticPause(). + * + * \param haptic the SDL_Haptic device to unpause + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticPause + */ +extern DECLSPEC int SDLCALL SDL_HapticUnpause(SDL_Haptic * haptic); + +/** + * Stop all the currently playing effects on a haptic device. + * + * \param haptic the SDL_Haptic device to stop + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_HapticStopAll(SDL_Haptic * haptic); + +/** + * Check whether rumble is supported on a haptic device. + * + * \param haptic haptic device to check for rumble support + * \returns SDL_TRUE if effect is supported, SDL_FALSE if it isn't, or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleSupported(SDL_Haptic * haptic); + +/** + * Initialize a haptic device for simple rumble playback. + * + * \param haptic the haptic device to initialize for simple rumble playback + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticOpen + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleStop + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleInit(SDL_Haptic * haptic); + +/** + * Run a simple rumble effect on a haptic device. + * + * \param haptic the haptic device to play the rumble effect on + * \param strength strength of the rumble to play as a 0-1 float value + * \param length length of the rumble to play in milliseconds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumbleStop + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length ); + +/** + * Stop the simple rumble on a haptic device. + * + * \param haptic the haptic device to stop the rumble effect on + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HapticRumbleInit + * \sa SDL_HapticRumblePlay + * \sa SDL_HapticRumbleSupported + */ +extern DECLSPEC int SDLCALL SDL_HapticRumbleStop(SDL_Haptic * haptic); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_haptic_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_hidapi.h b/include/SDL/SDL_hidapi.h new file mode 100644 index 0000000..0575100 --- /dev/null +++ b/include/SDL/SDL_hidapi.h @@ -0,0 +1,451 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_hidapi.h + * + * Header file for SDL HIDAPI functions. + * + * This is an adaptation of the original HIDAPI interface by Alan Ott, + * and includes source code licensed under the following BSD license: + * + Copyright (c) 2010, Alan Ott, Signal 11 Software + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Signal 11 Software nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + * + * If you would like a version of SDL without this code, you can build SDL + * with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for example + * on iOS or tvOS to avoid a dependency on the CoreBluetooth framework. + */ + +#ifndef SDL_hidapi_h_ +#define SDL_hidapi_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A handle representing an open HID device + */ +struct SDL_hid_device_; +typedef struct SDL_hid_device_ SDL_hid_device; /**< opaque hidapi structure */ + +/** hidapi info structure */ +/** + * \brief Information about a connected HID device + */ +typedef struct SDL_hid_device_info +{ + /** Platform-specific device path */ + char *path; + /** Device Vendor ID */ + unsigned short vendor_id; + /** Device Product ID */ + unsigned short product_id; + /** Serial Number */ + wchar_t *serial_number; + /** Device Release Number in binary-coded decimal, + also known as Device Version Number */ + unsigned short release_number; + /** Manufacturer String */ + wchar_t *manufacturer_string; + /** Product string */ + wchar_t *product_string; + /** Usage Page for this Device/Interface + (Windows/Mac only). */ + unsigned short usage_page; + /** Usage for this Device/Interface + (Windows/Mac only).*/ + unsigned short usage; + /** The USB interface which this logical device + represents. + + * Valid on both Linux implementations in all cases. + * Valid on the Windows implementation only if the device + contains more than one interface. */ + int interface_number; + + /** Additional information about the USB interface. + Valid on libusb and Android implementations. */ + int interface_class; + int interface_subclass; + int interface_protocol; + + /** Pointer to the next device */ + struct SDL_hid_device_info *next; +} SDL_hid_device_info; + + +/** + * Initialize the HIDAPI library. + * + * This function initializes the HIDAPI library. Calling it is not strictly + * necessary, as it will be called automatically by SDL_hid_enumerate() and + * any of the SDL_hid_open_*() functions if it is needed. This function should + * be called at the beginning of execution however, if there is a chance of + * HIDAPI handles being opened by different threads simultaneously. + * + * Each call to this function should have a matching call to SDL_hid_exit() + * + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_exit + */ +extern DECLSPEC int SDLCALL SDL_hid_init(void); + +/** + * Finalize the HIDAPI library. + * + * This function frees all of the static data associated with HIDAPI. It + * should be called at the end of execution to avoid memory leaks. + * + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_init + */ +extern DECLSPEC int SDLCALL SDL_hid_exit(void); + +/** + * Check to see if devices may have been added or removed. + * + * Enumerating the HID devices is an expensive operation, so you can call this + * to see if there have been any system device changes since the last call to + * this function. A change in the counter returned doesn't necessarily mean + * that anything has changed, but you can call SDL_hid_enumerate() to get an + * updated device list. + * + * Calling this function for the first time may cause a thread or other system + * resource to be allocated to track device change notifications. + * + * \returns a change counter that is incremented with each potential device + * change, or 0 if device change detection isn't available. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_enumerate + */ +extern DECLSPEC Uint32 SDLCALL SDL_hid_device_change_count(void); + +/** + * Enumerate the HID Devices. + * + * This function returns a linked list of all the HID devices attached to the + * system which match vendor_id and product_id. If `vendor_id` is set to 0 + * then any vendor matches. If `product_id` is set to 0 then any product + * matches. If `vendor_id` and `product_id` are both set to 0, then all HID + * devices will be returned. + * + * \param vendor_id The Vendor ID (VID) of the types of device to open. + * \param product_id The Product ID (PID) of the types of device to open. + * \returns a pointer to a linked list of type SDL_hid_device_info, containing + * information about the HID devices attached to the system, or NULL + * in the case of failure. Free this linked list by calling + * SDL_hid_free_enumeration(). + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_hid_device_change_count + */ +extern DECLSPEC SDL_hid_device_info * SDLCALL SDL_hid_enumerate(unsigned short vendor_id, unsigned short product_id); + +/** + * Free an enumeration Linked List + * + * This function frees a linked list created by SDL_hid_enumerate(). + * + * \param devs Pointer to a list of struct_device returned from + * SDL_hid_enumerate(). + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_free_enumeration(SDL_hid_device_info *devs); + +/** + * Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally + * a serial number. + * + * If `serial_number` is NULL, the first device with the specified VID and PID + * is opened. + * + * \param vendor_id The Vendor ID (VID) of the device to open. + * \param product_id The Product ID (PID) of the device to open. + * \param serial_number The Serial Number of the device to open (Optionally + * NULL). + * \returns a pointer to a SDL_hid_device object on success or NULL on + * failure. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); + +/** + * Open a HID device by its path name. + * + * The path name be determined by calling SDL_hid_enumerate(), or a + * platform-specific path name can be used (eg: /dev/hidraw0 on Linux). + * + * \param path The path name of the device to open + * \returns a pointer to a SDL_hid_device object on success or NULL on + * failure. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC SDL_hid_device * SDLCALL SDL_hid_open_path(const char *path, int bExclusive /* = false */); + +/** + * Write an Output report to a HID device. + * + * The first byte of `data` must contain the Report ID. For devices which only + * support a single report, this must be set to 0x0. The remaining bytes + * contain the report data. Since the Report ID is mandatory, calls to + * SDL_hid_write() will always contain one more byte than the report contains. + * For example, if a hid report is 16 bytes long, 17 bytes must be passed to + * SDL_hid_write(), the Report ID (or 0x0, for devices with a single report), + * followed by the report data (16 bytes). In this example, the length passed + * in would be 17. + * + * SDL_hid_write() will send the data on the first OUT endpoint, if one + * exists. If it does not, it will send the data through the Control Endpoint + * (Endpoint 0). + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data The data to send, including the report number as the first + * byte. + * \param length The length in bytes of the data to send. + * \returns the actual number of bytes written and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_write(SDL_hid_device *dev, const unsigned char *data, size_t length); + +/** + * Read an Input report from a HID device with timeout. + * + * Input reports are returned to the host through the INTERRUPT IN endpoint. + * The first byte will contain the Report number if the device uses numbered + * reports. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into. + * \param length The number of bytes to read. For devices with multiple + * reports, make sure to read an extra byte for the report + * number. + * \param milliseconds timeout in milliseconds or -1 for blocking wait. + * \returns the actual number of bytes read and -1 on error. If no packet was + * available to be read within the timeout period, this function + * returns 0. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_read_timeout(SDL_hid_device *dev, unsigned char *data, size_t length, int milliseconds); + +/** + * Read an Input report from a HID device. + * + * Input reports are returned to the host through the INTERRUPT IN endpoint. + * The first byte will contain the Report number if the device uses numbered + * reports. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into. + * \param length The number of bytes to read. For devices with multiple + * reports, make sure to read an extra byte for the report + * number. + * \returns the actual number of bytes read and -1 on error. If no packet was + * available to be read and the handle is in non-blocking mode, this + * function returns 0. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_read(SDL_hid_device *dev, unsigned char *data, size_t length); + +/** + * Set the device handle to be non-blocking. + * + * In non-blocking mode calls to SDL_hid_read() will return immediately with a + * value of 0 if there is no data to be read. In blocking mode, SDL_hid_read() + * will wait (block) until there is data to read before returning. + * + * Nonblocking can be turned on and off at any time. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param nonblock enable or not the nonblocking reads - 1 to enable + * nonblocking - 0 to disable nonblocking. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_set_nonblocking(SDL_hid_device *dev, int nonblock); + +/** + * Send a Feature report to the device. + * + * Feature reports are sent over the Control endpoint as a Set_Report + * transfer. The first byte of `data` must contain the Report ID. For devices + * which only support a single report, this must be set to 0x0. The remaining + * bytes contain the report data. Since the Report ID is mandatory, calls to + * SDL_hid_send_feature_report() will always contain one more byte than the + * report contains. For example, if a hid report is 16 bytes long, 17 bytes + * must be passed to SDL_hid_send_feature_report(): the Report ID (or 0x0, for + * devices which do not use numbered reports), followed by the report data (16 + * bytes). In this example, the length passed in would be 17. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data The data to send, including the report number as the first + * byte. + * \param length The length in bytes of the data to send, including the report + * number. + * \returns the actual number of bytes written and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_send_feature_report(SDL_hid_device *dev, const unsigned char *data, size_t length); + +/** + * Get a feature report from a HID device. + * + * Set the first byte of `data` to the Report ID of the report to be read. + * Make sure to allow space for this extra byte in `data`. Upon return, the + * first byte will still contain the Report ID, and the report data will start + * in data[1]. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param data A buffer to put the read data into, including the Report ID. + * Set the first byte of `data` to the Report ID of the report to + * be read, or set it to zero if your device does not use numbered + * reports. + * \param length The number of bytes to read, including an extra byte for the + * report ID. The buffer can be longer than the actual report. + * \returns the number of bytes read plus one for the report ID (which is + * still in the first byte), or -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_feature_report(SDL_hid_device *dev, unsigned char *data, size_t length); + +/** + * Close a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_close(SDL_hid_device *dev); + +/** + * Get The Manufacturer String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_manufacturer_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get The Product String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_product_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get The Serial Number String from a HID device. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_serial_number_string(SDL_hid_device *dev, wchar_t *string, size_t maxlen); + +/** + * Get a string from a HID device, based on its string index. + * + * \param dev A device handle returned from SDL_hid_open(). + * \param string_index The index of the string to get. + * \param string A wide string buffer to put the data into. + * \param maxlen The length of the buffer in multiples of wchar_t. + * \returns 0 on success and -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_hid_get_indexed_string(SDL_hid_device *dev, int string_index, wchar_t *string, size_t maxlen); + +/** + * Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers + * + * \param active SDL_TRUE to start the scan, SDL_FALSE to stop the scan + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void SDLCALL SDL_hid_ble_scan(SDL_bool active); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_hidapi_h_ */ + +/* vi: set sts=4 ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_hints.h b/include/SDL/SDL_hints.h new file mode 100644 index 0000000..1317924 --- /dev/null +++ b/include/SDL/SDL_hints.h @@ -0,0 +1,2569 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_hints.h + * + * Official documentation for SDL configuration variables + * + * This file contains functions to set and get configuration hints, + * as well as listing each of them alphabetically. + * + * The convention for naming hints is SDL_HINT_X, where "SDL_X" is + * the environment variable that can be used to override the default. + * + * In general these hints are just that - they may or may not be + * supported or applicable on any given platform, but they provide + * a way for an application or user to give the library a hint as + * to how they would like the library to work. + */ + +#ifndef SDL_hints_h_ +#define SDL_hints_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A variable controlling whether the Android / iOS built-in + * accelerometer should be listed as a joystick device. + * + * This variable can be set to the following values: + * "0" - The accelerometer is not listed as a joystick + * "1" - The accelerometer is available as a 3 axis joystick (the default). + */ +#define SDL_HINT_ACCELEROMETER_AS_JOYSTICK "SDL_ACCELEROMETER_AS_JOYSTICK" + +/** + * \brief Specify the behavior of Alt+Tab while the keyboard is grabbed. + * + * By default, SDL emulates Alt+Tab functionality while the keyboard is grabbed + * and your window is full-screen. This prevents the user from getting stuck in + * your application if you've enabled keyboard grab. + * + * The variable can be set to the following values: + * "0" - SDL will not handle Alt+Tab. Your application is responsible + for handling Alt+Tab while the keyboard is grabbed. + * "1" - SDL will minimize your window when Alt+Tab is pressed (default) +*/ +#define SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED "SDL_ALLOW_ALT_TAB_WHILE_GRABBED" + +/** + * \brief If set to "0" then never set the top most bit on a SDL Window, even if the video mode expects it. + * This is a debugging aid for developers and not expected to be used by end users. The default is "1" + * + * This variable can be set to the following values: + * "0" - don't allow topmost + * "1" - allow topmost + */ +#define SDL_HINT_ALLOW_TOPMOST "SDL_ALLOW_TOPMOST" + +/** + * \brief Android APK expansion main file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION" + +/** + * \brief Android APK expansion patch file version. Should be a string number like "1", "2" etc. + * + * Must be set together with SDL_HINT_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION. + * + * If both hints were set then SDL_RWFromFile() will look into expansion files + * after a given relative path was not found in the internal storage and assets. + * + * By default this hint is not set and the APK expansion files are not searched. + */ +#define SDL_HINT_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION "SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION" + +/** + * \brief A variable to control whether the event loop will block itself when the app is paused. + * + * The variable can be set to the following values: + * "0" - Non blocking. + * "1" - Blocking. (default) + * + * The value should be set before SDL is initialized. + */ +#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE "SDL_ANDROID_BLOCK_ON_PAUSE" + +/** + * \brief A variable to control whether SDL will pause audio in background + * (Requires SDL_ANDROID_BLOCK_ON_PAUSE as "Non blocking") + * + * The variable can be set to the following values: + * "0" - Non paused. + * "1" - Paused. (default) + * + * The value should be set before SDL is initialized. + */ +#define SDL_HINT_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO "SDL_ANDROID_BLOCK_ON_PAUSE_PAUSEAUDIO" + +/** + * \brief A variable to control whether we trap the Android back button to handle it manually. + * This is necessary for the right mouse button to work on some Android devices, or + * to be able to trap the back button for use in your code reliably. If set to true, + * the back button will show up as an SDL_KEYDOWN / SDL_KEYUP pair with a keycode of + * SDL_SCANCODE_AC_BACK. + * + * The variable can be set to the following values: + * "0" - Back button will be handled as usual for system. (default) + * "1" - Back button will be trapped, allowing you to handle the key press + * manually. (This will also let right mouse click work on systems + * where the right mouse button functions as back.) + * + * The value of this hint is used at runtime, so it can be changed at any time. + */ +#define SDL_HINT_ANDROID_TRAP_BACK_BUTTON "SDL_ANDROID_TRAP_BACK_BUTTON" + +/** + * \brief Specify an application name. + * + * This hint lets you specify the application name sent to the OS when + * required. For example, this will often appear in volume control applets for + * audio streams, and in lists of applications which are inhibiting the + * screensaver. You should use a string that describes your program ("My Game + * 2: The Revenge") + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: probably the application's name or "SDL Application" if SDL + * doesn't have any better information. + * + * Note that, for audio streams, this can be overridden with + * SDL_HINT_AUDIO_DEVICE_APP_NAME. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_APP_NAME "SDL_APP_NAME" + +/** + * \brief A variable controlling whether controllers used with the Apple TV + * generate UI events. + * + * When UI events are generated by controller input, the app will be + * backgrounded when the Apple TV remote's menu button is pressed, and when the + * pause or B buttons on gamepads are pressed. + * + * More information about properly making use of controllers for the Apple TV + * can be found here: + * https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/ + * + * This variable can be set to the following values: + * "0" - Controller input does not generate UI events (the default). + * "1" - Controller input generates UI events. + */ +#define SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS "SDL_APPLE_TV_CONTROLLER_UI_EVENTS" + +/** + * \brief A variable controlling whether the Apple TV remote's joystick axes + * will automatically match the rotation of the remote. + * + * This variable can be set to the following values: + * "0" - Remote orientation does not affect joystick axes (the default). + * "1" - Joystick axes are based on the orientation of the remote. + */ +#define SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION "SDL_APPLE_TV_REMOTE_ALLOW_ROTATION" + +/** + * \brief A variable controlling the audio category on iOS and Mac OS X + * + * This variable can be set to the following values: + * + * "ambient" - Use the AVAudioSessionCategoryAmbient audio category, will be muted by the phone mute switch (default) + * "playback" - Use the AVAudioSessionCategoryPlayback category + * + * For more information, see Apple's documentation: + * https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html + */ +#define SDL_HINT_AUDIO_CATEGORY "SDL_AUDIO_CATEGORY" + +/** + * \brief Specify an application name for an audio device. + * + * Some audio backends (such as PulseAudio) allow you to describe your audio + * stream. Among other things, this description might show up in a system + * control panel that lets the user adjust the volume on specific audio + * streams instead of using one giant master volume slider. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your program ("My Game 2: The Revenge") + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: this will be the name set with SDL_HINT_APP_NAME, if that hint is + * set. Otherwise, it'll probably the application's name or "SDL Application" + * if SDL doesn't have any better information. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_APP_NAME "SDL_AUDIO_DEVICE_APP_NAME" + +/** + * \brief Specify an application name for an audio device. + * + * Some audio backends (such as PulseAudio) allow you to describe your audio + * stream. Among other things, this description might show up in a system + * control panel that lets the user adjust the volume on specific audio + * streams instead of using one giant master volume slider. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your what your program is playing ("audio stream" is + * probably sufficient in many cases, but this could be useful for something + * like "team chat" if you have a headset playing VoIP audio separately). + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "audio stream" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_STREAM_NAME "SDL_AUDIO_DEVICE_STREAM_NAME" + +/** + * \brief Specify an application role for an audio device. + * + * Some audio backends (such as Pipewire) allow you to describe the role of + * your audio stream. Among other things, this description might show up in + * a system control panel or software for displaying and manipulating media + * playback/capture graphs. + * + * This hints lets you transmit that information to the OS. The contents of + * this hint are used while opening an audio device. You should use a string + * that describes your what your program is playing (Game, Music, Movie, + * etc...). + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "Game" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_AUDIO_DEVICE_STREAM_ROLE "SDL_AUDIO_DEVICE_STREAM_ROLE" + +/** + * \brief A variable controlling speed/quality tradeoff of audio resampling. + * + * If available, SDL can use libsamplerate ( http://www.mega-nerd.com/SRC/ ) + * to handle audio resampling. There are different resampling modes available + * that produce different levels of quality, using more CPU. + * + * If this hint isn't specified to a valid setting, or libsamplerate isn't + * available, SDL will use the default, internal resampling algorithm. + * + * As of SDL 2.26, SDL_ConvertAudio() respects this hint when libsamplerate is available. + * + * This hint is currently only checked at audio subsystem initialization. + * + * This variable can be set to the following values: + * + * "0" or "default" - Use SDL's internal resampling (Default when not set - low quality, fast) + * "1" or "fast" - Use fast, slightly higher quality resampling, if available + * "2" or "medium" - Use medium quality resampling, if available + * "3" or "best" - Use high quality resampling, if available + */ +#define SDL_HINT_AUDIO_RESAMPLING_MODE "SDL_AUDIO_RESAMPLING_MODE" + +/** + * \brief A variable controlling whether SDL updates joystick state when getting input events + * + * This variable can be set to the following values: + * + * "0" - You'll call SDL_JoystickUpdate() manually + * "1" - SDL will automatically call SDL_JoystickUpdate() (default) + * + * This hint can be toggled on and off at runtime. + */ +#define SDL_HINT_AUTO_UPDATE_JOYSTICKS "SDL_AUTO_UPDATE_JOYSTICKS" + +/** + * \brief A variable controlling whether SDL updates sensor state when getting input events + * + * This variable can be set to the following values: + * + * "0" - You'll call SDL_SensorUpdate() manually + * "1" - SDL will automatically call SDL_SensorUpdate() (default) + * + * This hint can be toggled on and off at runtime. + */ +#define SDL_HINT_AUTO_UPDATE_SENSORS "SDL_AUTO_UPDATE_SENSORS" + +/** + * \brief Prevent SDL from using version 4 of the bitmap header when saving BMPs. + * + * The bitmap header version 4 is required for proper alpha channel support and + * SDL will use it when required. Should this not be desired, this hint can + * force the use of the 40 byte header version which is supported everywhere. + * + * The variable can be set to the following values: + * "0" - Surfaces with a colorkey or an alpha channel are saved to a + * 32-bit BMP file with an alpha mask. SDL will use the bitmap + * header version 4 and set the alpha mask accordingly. + * "1" - Surfaces with a colorkey or an alpha channel are saved to a + * 32-bit BMP file without an alpha mask. The alpha channel data + * will be in the file, but applications are going to ignore it. + * + * The default value is "0". + */ +#define SDL_HINT_BMP_SAVE_LEGACY_FORMAT "SDL_BMP_SAVE_LEGACY_FORMAT" + +/** + * \brief Override for SDL_GetDisplayUsableBounds() + * + * If set, this hint will override the expected results for + * SDL_GetDisplayUsableBounds() for display index 0. Generally you don't want + * to do this, but this allows an embedded system to request that some of the + * screen be reserved for other uses when paired with a well-behaved + * application. + * + * The contents of this hint must be 4 comma-separated integers, the first + * is the bounds x, then y, width and height, in that order. + */ +#define SDL_HINT_DISPLAY_USABLE_BOUNDS "SDL_DISPLAY_USABLE_BOUNDS" + +/** + * \brief Disable giving back control to the browser automatically + * when running with asyncify + * + * With -s ASYNCIFY, SDL2 calls emscripten_sleep during operations + * such as refreshing the screen or polling events. + * + * This hint only applies to the emscripten platform + * + * The variable can be set to the following values: + * "0" - Disable emscripten_sleep calls (if you give back browser control manually or use asyncify for other purposes) + * "1" - Enable emscripten_sleep calls (the default) + */ +#define SDL_HINT_EMSCRIPTEN_ASYNCIFY "SDL_EMSCRIPTEN_ASYNCIFY" + +/** + * \brief override the binding element for keyboard inputs for Emscripten builds + * + * This hint only applies to the emscripten platform + * + * The variable can be one of + * "#window" - The javascript window object (this is the default) + * "#document" - The javascript document object + * "#screen" - the javascript window.screen object + * "#canvas" - the WebGL canvas element + * any other string without a leading # sign applies to the element on the page with that ID. + */ +#define SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT "SDL_EMSCRIPTEN_KEYBOARD_ELEMENT" + +/** + * \brief A variable that controls whether Steam Controllers should be exposed using the SDL joystick and game controller APIs + * + * The variable can be set to the following values: + * "0" - Do not scan for Steam Controllers + * "1" - Scan for Steam Controllers (the default) + * + * The default value is "1". This hint must be set before initializing the joystick subsystem. + */ +#define SDL_HINT_ENABLE_STEAM_CONTROLLERS "SDL_ENABLE_STEAM_CONTROLLERS" + +/** + * \brief A variable controlling verbosity of the logging of SDL events pushed onto the internal queue. + * + * This variable can be set to the following values, from least to most verbose: + * + * "0" - Don't log any events (default) + * "1" - Log most events (other than the really spammy ones). + * "2" - Include mouse and finger motion events. + * "3" - Include SDL_SysWMEvent events. + * + * This is generally meant to be used to debug SDL itself, but can be useful + * for application developers that need better visibility into what is going + * on in the event queue. Logged events are sent through SDL_Log(), which + * means by default they appear on stdout on most platforms or maybe + * OutputDebugString() on Windows, and can be funneled by the app with + * SDL_LogSetOutputFunction(), etc. + * + * This hint can be toggled on and off at runtime, if you only need to log + * events for a small subset of program execution. + */ +#define SDL_HINT_EVENT_LOGGING "SDL_EVENT_LOGGING" + +/** + * \brief A variable controlling whether raising the window should be done more forcefully + * + * This variable can be set to the following values: + * "0" - No forcing (the default) + * "1" - Extra level of forcing + * + * At present, this is only an issue under MS Windows, which makes it nearly impossible to + * programmatically move a window to the foreground, for "security" reasons. See + * http://stackoverflow.com/a/34414846 for a discussion. + */ +#define SDL_HINT_FORCE_RAISEWINDOW "SDL_HINT_FORCE_RAISEWINDOW" + +/** + * \brief A variable controlling how 3D acceleration is used to accelerate the SDL screen surface. + * + * SDL can try to accelerate the SDL screen surface by using streaming + * textures with a 3D rendering engine. This variable controls whether and + * how this is done. + * + * This variable can be set to the following values: + * "0" - Disable 3D acceleration + * "1" - Enable 3D acceleration, using the default renderer. + * "X" - Enable 3D acceleration, using X where X is one of the valid rendering drivers. (e.g. "direct3d", "opengl", etc.) + * + * By default SDL tries to make a best guess for each platform whether + * to use acceleration or not. + */ +#define SDL_HINT_FRAMEBUFFER_ACCELERATION "SDL_FRAMEBUFFER_ACCELERATION" + +/** + * \brief A variable that lets you manually hint extra gamecontroller db entries. + * + * The variable should be newline delimited rows of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG "SDL_GAMECONTROLLERCONFIG" + +/** + * \brief A variable that lets you provide a file with extra gamecontroller db entries. + * + * The file should contain lines of gamecontroller config data, see SDL_gamecontroller.h + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + * You can update mappings after the system is initialized with SDL_GameControllerMappingForGUID() and SDL_GameControllerAddMapping() + */ +#define SDL_HINT_GAMECONTROLLERCONFIG_FILE "SDL_GAMECONTROLLERCONFIG_FILE" + +/** + * \brief A variable that overrides the automatic controller type detection + * + * The variable should be comma separated entries, in the form: VID/PID=type + * + * The VID and PID should be hexadecimal with exactly 4 digits, e.g. 0x00fd + * + * The type should be one of: + * Xbox360 + * XboxOne + * PS3 + * PS4 + * PS5 + * SwitchPro + * + * This hint affects what driver is used, and must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + */ +#define SDL_HINT_GAMECONTROLLERTYPE "SDL_GAMECONTROLLERTYPE" + +/** + * \brief A variable containing a list of devices to skip when scanning for game controllers. + * + * The format of the string is a comma separated list of USB VID/PID pairs + * in hexadecimal form, e.g. + * + * 0xAAAA/0xBBBB,0xCCCC/0xDDDD + * + * The variable can also take the form of @file, in which case the named + * file will be loaded and interpreted as the value of the variable. + */ +#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES "SDL_GAMECONTROLLER_IGNORE_DEVICES" + +/** + * \brief If set, all devices will be skipped when scanning for game controllers except for the ones listed in this variable. + * + * The format of the string is a comma separated list of USB VID/PID pairs + * in hexadecimal form, e.g. + * + * 0xAAAA/0xBBBB,0xCCCC/0xDDDD + * + * The variable can also take the form of @file, in which case the named + * file will be loaded and interpreted as the value of the variable. + */ +#define SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT "SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT" + +/** + * \brief If set, game controller face buttons report their values according to their labels instead of their positional layout. + * + * For example, on Nintendo Switch controllers, normally you'd get: + * + * (Y) + * (X) (B) + * (A) + * + * but if this hint is set, you'll get: + * + * (X) + * (Y) (A) + * (B) + * + * The variable can be set to the following values: + * "0" - Report the face buttons by position, as though they were on an Xbox controller. + * "1" - Report the face buttons by label instead of position + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_GAMECONTROLLER_USE_BUTTON_LABELS "SDL_GAMECONTROLLER_USE_BUTTON_LABELS" + +/** + * \brief A variable controlling whether grabbing input grabs the keyboard + * + * This variable can be set to the following values: + * "0" - Grab will affect only the mouse + * "1" - Grab will affect mouse and keyboard + * + * By default SDL will not grab the keyboard so system shortcuts still work. + */ +#define SDL_HINT_GRAB_KEYBOARD "SDL_GRAB_KEYBOARD" + +/** + * \brief A variable containing a list of devices to ignore in SDL_hid_enumerate() + * + * For example, to ignore the Shanwan DS3 controller and any Valve controller, you might + * have the string "0x2563/0x0523,0x28de/0x0000" + */ +#define SDL_HINT_HIDAPI_IGNORE_DEVICES "SDL_HIDAPI_IGNORE_DEVICES" + +/** + * \brief A variable controlling whether the idle timer is disabled on iOS. + * + * When an iOS app does not receive touches for some time, the screen is + * dimmed automatically. For games where the accelerometer is the only input + * this is problematic. This functionality can be disabled by setting this + * hint. + * + * As of SDL 2.0.4, SDL_EnableScreenSaver() and SDL_DisableScreenSaver() + * accomplish the same thing on iOS. They should be preferred over this hint. + * + * This variable can be set to the following values: + * "0" - Enable idle timer + * "1" - Disable idle timer + */ +#define SDL_HINT_IDLE_TIMER_DISABLED "SDL_IOS_IDLE_TIMER_DISABLED" + +/** + * \brief A variable to control whether certain IMEs should handle text editing internally instead of sending SDL_TEXTEDITING events. + * + * The variable can be set to the following values: + * "0" - SDL_TEXTEDITING events are sent, and it is the application's + * responsibility to render the text from these events and + * differentiate it somehow from committed text. (default) + * "1" - If supported by the IME then SDL_TEXTEDITING events are not sent, + * and text that is being composed will be rendered in its own UI. + */ +#define SDL_HINT_IME_INTERNAL_EDITING "SDL_IME_INTERNAL_EDITING" + +/** + * \brief A variable to control whether certain IMEs should show native UI components (such as the Candidate List) instead of suppressing them. + * + * The variable can be set to the following values: + * "0" - Native UI components are not display. (default) + * "1" - Native UI components are displayed. + */ +#define SDL_HINT_IME_SHOW_UI "SDL_IME_SHOW_UI" + +/** + * \brief A variable to control if extended IME text support is enabled. + * If enabled then SDL_TextEditingExtEvent will be issued if the text would be truncated otherwise. + * Additionally SDL_TextInputEvent will be dispatched multiple times so that it is not truncated. + * + * The variable can be set to the following values: + * "0" - Legacy behavior. Text can be truncated, no heap allocations. (default) + * "1" - Modern behavior. + */ +#define SDL_HINT_IME_SUPPORT_EXTENDED_TEXT "SDL_IME_SUPPORT_EXTENDED_TEXT" + +/** + * \brief A variable controlling whether the home indicator bar on iPhone X + * should be hidden. + * + * This variable can be set to the following values: + * "0" - The indicator bar is not hidden (default for windowed applications) + * "1" - The indicator bar is hidden and is shown when the screen is touched (useful for movie playback applications) + * "2" - The indicator bar is dim and the first swipe makes it visible and the second swipe performs the "home" action (default for fullscreen applications) + */ +#define SDL_HINT_IOS_HIDE_HOME_INDICATOR "SDL_IOS_HIDE_HOME_INDICATOR" + +/** + * \brief A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background. + * + * The variable can be set to the following values: + * "0" - Disable joystick & gamecontroller input events when the + * application is in the background. + * "1" - Enable joystick & gamecontroller input events when the + * application is in the background. + * + * The default value is "0". This hint may be set at any time. + */ +#define SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS "SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS" + +/** + * \brief A variable controlling whether the HIDAPI joystick drivers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI drivers are not used + * "1" - HIDAPI drivers are used (the default) + * + * This variable is the default for all drivers, but can be overridden by the hints for specific drivers below. + */ +#define SDL_HINT_JOYSTICK_HIDAPI "SDL_JOYSTICK_HIDAPI" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo GameCube controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE "SDL_JOYSTICK_HIDAPI_GAMECUBE" + +/** + * \brief A variable controlling whether "low_frequency_rumble" and "high_frequency_rumble" is used to implement + * the GameCube controller's 3 rumble modes, Stop(0), Rumble(1), and StopHard(2) + * this is useful for applications that need full compatibility for things like ADSR envelopes. + * Stop is implemented by setting "low_frequency_rumble" to "0" and "high_frequency_rumble" ">0" + * Rumble is both at any arbitrary value, + * StopHard is implemented by setting both "low_frequency_rumble" and "high_frequency_rumble" to "0" + * + * This variable can be set to the following values: + * "0" - Normal rumble behavior is behavior is used (default) + * "1" - Proper GameCube controller rumble behavior is used + * + */ +#define SDL_HINT_JOYSTICK_GAMECUBE_RUMBLE_BRAKE "SDL_JOYSTICK_GAMECUBE_RUMBLE_BRAKE" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Switch Joy-Cons should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS "SDL_JOYSTICK_HIDAPI_JOY_CONS" + +/** + * \brief A variable controlling whether Nintendo Switch Joy-Con controllers will be combined into a single Pro-like controller when using the HIDAPI driver + * + * This variable can be set to the following values: + * "0" - Left and right Joy-Con controllers will not be combined and each will be a mini-gamepad + * "1" - Left and right Joy-Con controllers will be combined into a single controller (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS "SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS" + +/** + * \brief A variable controlling whether Nintendo Switch Joy-Con controllers will be in vertical mode when using the HIDAPI driver + * + * This variable can be set to the following values: + * "0" - Left and right Joy-Con controllers will not be in vertical mode (the default) + * "1" - Left and right Joy-Con controllers will be in vertical mode + * + * This hint must be set before calling SDL_Init(SDL_INIT_GAMECONTROLLER) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS "SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS" + +/** + * \brief A variable controlling whether the HIDAPI driver for Amazon Luna controllers connected via Bluetooth should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_LUNA "SDL_JOYSTICK_HIDAPI_LUNA" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Online classic controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC "SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC" + +/** + * \brief A variable controlling whether the HIDAPI driver for NVIDIA SHIELD controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SHIELD "SDL_JOYSTICK_HIDAPI_SHIELD" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS3 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI on macOS, and "0" on other platforms. + * + * It is not possible to use this driver on Windows, due to limitations in the default drivers + * installed. See https://github.com/ViGEm/DsHidMini for an alternative driver on Windows. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS3 "SDL_JOYSTICK_HIDAPI_PS3" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS4 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" + +/** + * \brief A variable controlling whether extended input reports should be used for PS4 controllers when using the HIDAPI driver. + * + * This variable can be set to the following values: + * "0" - extended reports are not enabled (the default) + * "1" - extended reports + * + * Extended input reports allow rumble on Bluetooth PS4 controllers, but + * break DirectInput handling for applications that don't use SDL. + * + * Once extended reports are enabled, they can not be disabled without + * power cycling the controller. + * + * For compatibility with applications written for versions of SDL prior + * to the introduction of PS5 controller support, this value will also + * control the state of extended reports on PS5 controllers when the + * SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE hint is not explicitly set. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" + +/** + * \brief A variable controlling whether the HIDAPI driver for PS5 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5 "SDL_JOYSTICK_HIDAPI_PS5" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a PS5 controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED "SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED" + +/** + * \brief A variable controlling whether extended input reports should be used for PS5 controllers when using the HIDAPI driver. + * + * This variable can be set to the following values: + * "0" - extended reports are not enabled (the default) + * "1" - extended reports + * + * Extended input reports allow rumble on Bluetooth PS5 controllers, but + * break DirectInput handling for applications that don't use SDL. + * + * Once extended reports are enabled, they can not be disabled without + * power cycling the controller. + * + * For compatibility with applications written for versions of SDL prior + * to the introduction of PS5 controller support, this value defaults to + * the value of SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS5_RUMBLE "SDL_JOYSTICK_HIDAPI_PS5_RUMBLE" + +/** + * \brief A variable controlling whether the HIDAPI driver for Google Stadia controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STADIA "SDL_JOYSTICK_HIDAPI_STADIA" + +/** + * \brief A variable controlling whether the HIDAPI driver for Bluetooth Steam Controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used for Steam Controllers, which requires Bluetooth access + * and may prompt the user for permission on iOS and Android. + * + * The default is "0" + */ +#define SDL_HINT_JOYSTICK_HIDAPI_STEAM "SDL_JOYSTICK_HIDAPI_STEAM" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Switch controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH "SDL_JOYSTICK_HIDAPI_SWITCH" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Pro controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED "SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Joy-Con controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED "SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Nintendo Switch controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED "SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for Nintendo Wii and Wii U controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * This driver doesn't work with the dolphinbar, so the default is SDL_FALSE for now. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_WII "SDL_JOYSTICK_HIDAPI_WII" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Wii controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED "SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is "0" on Windows, otherwise the value of SDL_HINT_JOYSTICK_HIDAPI + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX "SDL_JOYSTICK_HIDAPI_XBOX" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox 360 controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 "SDL_JOYSTICK_HIDAPI_XBOX_360" + +/** + * \brief A variable controlling whether the player LEDs should be lit to indicate which player is associated with an Xbox 360 controller. + * + * This variable can be set to the following values: + * "0" - player LEDs are not enabled + * "1" - player LEDs are enabled (the default) + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED "SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox 360 wireless controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360 + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS "SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS" + +/** + * \brief A variable controlling whether the HIDAPI driver for XBox One controllers should be used. + * + * This variable can be set to the following values: + * "0" - HIDAPI driver is not used + * "1" - HIDAPI driver is used + * + * The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE "SDL_JOYSTICK_HIDAPI_XBOX_ONE" + +/** + * \brief A variable controlling whether the Home button LED should be turned on when an Xbox One controller is opened + * + * This variable can be set to the following values: + * "0" - home button LED is turned off + * "1" - home button LED is turned on + * + * By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. The default brightness is 0.4. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED "SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED" + +/** + * \brief A variable controlling whether the RAWINPUT joystick drivers should be used for better handling XInput-capable devices. + * + * This variable can be set to the following values: + * "0" - RAWINPUT drivers are not used + * "1" - RAWINPUT drivers are used (the default) + */ +#define SDL_HINT_JOYSTICK_RAWINPUT "SDL_JOYSTICK_RAWINPUT" + +/** + * \brief A variable controlling whether the RAWINPUT driver should pull correlated data from XInput. + * + * This variable can be set to the following values: + * "0" - RAWINPUT driver will only use data from raw input APIs + * "1" - RAWINPUT driver will also pull data from XInput, providing + * better trigger axes, guide button presses, and rumble support + * for Xbox controllers + * + * The default is "1". This hint applies to any joysticks opened after setting the hint. + */ +#define SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT "SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT" + +/** + * \brief A variable controlling whether the ROG Chakram mice should show up as joysticks + * + * This variable can be set to the following values: + * "0" - ROG Chakram mice do not show up as joysticks (the default) + * "1" - ROG Chakram mice show up as joysticks + */ +#define SDL_HINT_JOYSTICK_ROG_CHAKRAM "SDL_JOYSTICK_ROG_CHAKRAM" + +/** + * \brief A variable controlling whether a separate thread should be used + * for handling joystick detection and raw input messages on Windows + * + * This variable can be set to the following values: + * "0" - A separate thread is not used (the default) + * "1" - A separate thread is used for handling raw input messages + * + */ +#define SDL_HINT_JOYSTICK_THREAD "SDL_JOYSTICK_THREAD" + +/** + * \brief Determines whether SDL enforces that DRM master is required in order + * to initialize the KMSDRM video backend. + * + * The DRM subsystem has a concept of a "DRM master" which is a DRM client that + * has the ability to set planes, set cursor, etc. When SDL is DRM master, it + * can draw to the screen using the SDL rendering APIs. Without DRM master, SDL + * is still able to process input and query attributes of attached displays, + * but it cannot change display state or draw to the screen directly. + * + * In some cases, it can be useful to have the KMSDRM backend even if it cannot + * be used for rendering. An app may want to use SDL for input processing while + * using another rendering API (such as an MMAL overlay on Raspberry Pi) or + * using its own code to render to DRM overlays that SDL doesn't support. + * + * This hint must be set before initializing the video subsystem. + * + * This variable can be set to the following values: + * "0" - SDL will allow usage of the KMSDRM backend without DRM master + * "1" - SDL Will require DRM master to use the KMSDRM backend (default) + */ +#define SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER "SDL_KMSDRM_REQUIRE_DRM_MASTER" + +/** + * \brief A comma separated list of devices to open as joysticks + * + * This variable is currently only used by the Linux joystick driver. + */ +#define SDL_HINT_JOYSTICK_DEVICE "SDL_JOYSTICK_DEVICE" + +/** + * \brief A variable controlling whether joysticks on Linux will always treat 'hat' axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking whether they may be analog. + * + * This variable can be set to the following values: + * "0" - Only map hat axis inputs to digital hat outputs if the input axes appear to actually be digital (the default) + * "1" - Always handle the input axes numbered ABS_HAT0X to ABS_HAT3Y as digital hats + */ +#define SDL_HINT_LINUX_DIGITAL_HATS "SDL_LINUX_DIGITAL_HATS" + +/** + * \brief A variable controlling whether digital hats on Linux will apply deadzones to their underlying input axes or use unfiltered values. + * + * This variable can be set to the following values: + * "0" - Return digital hat values based on unfiltered input axis values + * "1" - Return digital hat values with deadzones on the input axes taken into account (the default) + */ +#define SDL_HINT_LINUX_HAT_DEADZONES "SDL_LINUX_HAT_DEADZONES" + +/** + * \brief A variable controlling whether to use the classic /dev/input/js* joystick interface or the newer /dev/input/event* joystick interface on Linux + * + * This variable can be set to the following values: + * "0" - Use /dev/input/event* + * "1" - Use /dev/input/js* + * + * By default the /dev/input/event* interfaces are used + */ +#define SDL_HINT_LINUX_JOYSTICK_CLASSIC "SDL_LINUX_JOYSTICK_CLASSIC" + +/** + * \brief A variable controlling whether joysticks on Linux adhere to their HID-defined deadzones or return unfiltered values. + * + * This variable can be set to the following values: + * "0" - Return unfiltered joystick axis values (the default) + * "1" - Return axis values with deadzones taken into account + */ +#define SDL_HINT_LINUX_JOYSTICK_DEADZONES "SDL_LINUX_JOYSTICK_DEADZONES" + +/** +* \brief When set don't force the SDL app to become a foreground process +* +* This hint only applies to Mac OS X. +* +*/ +#define SDL_HINT_MAC_BACKGROUND_APP "SDL_MAC_BACKGROUND_APP" + +/** + * \brief A variable that determines whether ctrl+click should generate a right-click event on Mac + * + * If present, holding ctrl while left clicking will generate a right click + * event when on Mac. + */ +#define SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK "SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK" + +/** + * \brief A variable controlling whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing + * + * This variable can be set to the following values: + * "0" - Dispatching OpenGL context updates will block the dispatching thread until the main thread finishes processing (default). + * "1" - Dispatching OpenGL context updates will allow the dispatching thread to continue execution. + * + * Generally you want the default, but if you have OpenGL code in a background thread on a Mac, and the main thread + * hangs because it's waiting for that background thread, but that background thread is also hanging because it's + * waiting for the main thread to do an update, this might fix your issue. + * + * This hint only applies to macOS. + * + * This hint is available since SDL 2.24.0. + * + */ +#define SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH "SDL_MAC_OPENGL_ASYNC_DISPATCH" + +/** + * \brief A variable setting the double click radius, in pixels. + */ +#define SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS "SDL_MOUSE_DOUBLE_CLICK_RADIUS" + +/** + * \brief A variable setting the double click time, in milliseconds. + */ +#define SDL_HINT_MOUSE_DOUBLE_CLICK_TIME "SDL_MOUSE_DOUBLE_CLICK_TIME" + +/** + * \brief Allow mouse click events when clicking to focus an SDL window + * + * This variable can be set to the following values: + * "0" - Ignore mouse clicks that activate a window + * "1" - Generate events for mouse clicks that activate a window + * + * By default SDL will ignore mouse clicks that activate a window + */ +#define SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH "SDL_MOUSE_FOCUS_CLICKTHROUGH" + +/** + * \brief A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode + */ +#define SDL_HINT_MOUSE_NORMAL_SPEED_SCALE "SDL_MOUSE_NORMAL_SPEED_SCALE" + +/** + * \brief A variable controlling whether relative mouse mode constrains the mouse to the center of the window + * + * This variable can be set to the following values: + * "0" - Relative mouse mode constrains the mouse to the window + * "1" - Relative mouse mode constrains the mouse to the center of the window + * + * Constraining to the center of the window works better for FPS games and when the + * application is running over RDP. Constraining to the whole window works better + * for 2D games and increases the chance that the mouse will be in the correct + * position when using high DPI mice. + * + * By default SDL will constrain the mouse to the center of the window + */ +#define SDL_HINT_MOUSE_RELATIVE_MODE_CENTER "SDL_MOUSE_RELATIVE_MODE_CENTER" + +/** + * \brief A variable controlling whether relative mouse mode is implemented using mouse warping + * + * This variable can be set to the following values: + * "0" - Relative mouse mode uses raw input + * "1" - Relative mouse mode uses mouse warping + * + * By default SDL will use raw input for relative mouse mode + */ +#define SDL_HINT_MOUSE_RELATIVE_MODE_WARP "SDL_MOUSE_RELATIVE_MODE_WARP" + +/** + * \brief A variable controlling whether relative mouse motion is affected by renderer scaling + * + * This variable can be set to the following values: + * "0" - Relative motion is unaffected by DPI or renderer's logical size + * "1" - Relative motion is scaled according to DPI scaling and logical size + * + * By default relative mouse deltas are affected by DPI and renderer scaling + */ +#define SDL_HINT_MOUSE_RELATIVE_SCALING "SDL_MOUSE_RELATIVE_SCALING" + +/** + * \brief A variable setting the scale for mouse motion, in floating point, when the mouse is in relative mode + */ +#define SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE "SDL_MOUSE_RELATIVE_SPEED_SCALE" + +/** + * \brief A variable controlling whether the system mouse acceleration curve is used for relative mouse motion. + * + * This variable can be set to the following values: + * "0" - Relative mouse motion will be unscaled (the default) + * "1" - Relative mouse motion will be scaled using the system mouse acceleration curve. + * + * If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will override the system speed scale. + */ +#define SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE "SDL_MOUSE_RELATIVE_SYSTEM_SCALE" + +/** + * \brief A variable controlling whether a motion event should be generated for mouse warping in relative mode. + * + * This variable can be set to the following values: + * "0" - Warping the mouse will not generate a motion event in relative mode + * "1" - Warping the mouse will generate a motion event in relative mode + * + * By default warping the mouse will not generate motion events in relative mode. This avoids the application having to filter out large relative motion due to warping. + */ +#define SDL_HINT_MOUSE_RELATIVE_WARP_MOTION "SDL_MOUSE_RELATIVE_WARP_MOTION" + +/** + * \brief A variable controlling whether mouse events should generate synthetic touch events + * + * This variable can be set to the following values: + * "0" - Mouse events will not generate touch events (default for desktop platforms) + * "1" - Mouse events will generate touch events (default for mobile platforms, such as Android and iOS) + */ +#define SDL_HINT_MOUSE_TOUCH_EVENTS "SDL_MOUSE_TOUCH_EVENTS" + +/** + * \brief A variable controlling whether the mouse is captured while mouse buttons are pressed + * + * This variable can be set to the following values: + * "0" - The mouse is not captured while mouse buttons are pressed + * "1" - The mouse is captured while mouse buttons are pressed + * + * By default the mouse is captured while mouse buttons are pressed so if the mouse is dragged + * outside the window, the application continues to receive mouse events until the button is + * released. + */ +#define SDL_HINT_MOUSE_AUTO_CAPTURE "SDL_MOUSE_AUTO_CAPTURE" + +/** + * \brief Tell SDL not to catch the SIGINT or SIGTERM signals. + * + * This hint only applies to Unix-like platforms, and should set before + * any calls to SDL_Init() + * + * The variable can be set to the following values: + * "0" - SDL will install a SIGINT and SIGTERM handler, and when it + * catches a signal, convert it into an SDL_QUIT event. + * "1" - SDL will not install a signal handler at all. + */ +#define SDL_HINT_NO_SIGNAL_HANDLERS "SDL_NO_SIGNAL_HANDLERS" + +/** + * \brief A variable controlling what driver to use for OpenGL ES contexts. + * + * On some platforms, currently Windows and X11, OpenGL drivers may support + * creating contexts with an OpenGL ES profile. By default SDL uses these + * profiles, when available, otherwise it attempts to load an OpenGL ES + * library, e.g. that provided by the ANGLE project. This variable controls + * whether SDL follows this default behaviour or will always load an + * OpenGL ES library. + * + * Circumstances where this is useful include + * - Testing an app with a particular OpenGL ES implementation, e.g ANGLE, + * or emulator, e.g. those from ARM, Imagination or Qualcomm. + * - Resolving OpenGL ES function addresses at link time by linking with + * the OpenGL ES library instead of querying them at run time with + * SDL_GL_GetProcAddress(). + * + * Caution: for an application to work with the default behaviour across + * different OpenGL drivers it must query the OpenGL ES function + * addresses at run time using SDL_GL_GetProcAddress(). + * + * This variable is ignored on most platforms because OpenGL ES is native + * or not supported. + * + * This variable can be set to the following values: + * "0" - Use ES profile of OpenGL, if available. (Default when not set.) + * "1" - Load OpenGL ES library using the default library names. + * + */ +#define SDL_HINT_OPENGL_ES_DRIVER "SDL_OPENGL_ES_DRIVER" + +/** + * \brief A variable controlling which orientations are allowed on iOS/Android. + * + * In some circumstances it is necessary to be able to explicitly control + * which UI orientations are allowed. + * + * This variable is a space delimited list of the following values: + * "LandscapeLeft", "LandscapeRight", "Portrait" "PortraitUpsideDown" + */ +#define SDL_HINT_ORIENTATIONS "SDL_IOS_ORIENTATIONS" + +/** + * \brief A variable controlling the use of a sentinel event when polling the event queue + * + * This variable can be set to the following values: + * "0" - Disable poll sentinels + * "1" - Enable poll sentinels + * + * When polling for events, SDL_PumpEvents is used to gather new events from devices. + * If a device keeps producing new events between calls to SDL_PumpEvents, a poll loop will + * become stuck until the new events stop. + * This is most noticeable when moving a high frequency mouse. + * + * By default, poll sentinels are enabled. + */ +#define SDL_HINT_POLL_SENTINEL "SDL_POLL_SENTINEL" + +/** + * \brief Override for SDL_GetPreferredLocales() + * + * If set, this will be favored over anything the OS might report for the + * user's preferred locales. Changing this hint at runtime will not generate + * a SDL_LOCALECHANGED event (but if you can change the hint, you can push + * your own event, if you want). + * + * The format of this hint is a comma-separated list of language and locale, + * combined with an underscore, as is a common format: "en_GB". Locale is + * optional: "en". So you might have a list like this: "en_GB,jp,es_PT" + */ +#define SDL_HINT_PREFERRED_LOCALES "SDL_PREFERRED_LOCALES" + +/** + * \brief A variable describing the content orientation on QtWayland-based platforms. + * + * On QtWayland platforms, windows are rotated client-side to allow for custom + * transitions. In order to correctly position overlays (e.g. volume bar) and + * gestures (e.g. events view, close/minimize gestures), the system needs to + * know in which orientation the application is currently drawing its contents. + * + * This does not cause the window to be rotated or resized, the application + * needs to take care of drawing the content in the right orientation (the + * framebuffer is always in portrait mode). + * + * This variable can be one of the following values: + * "primary" (default), "portrait", "landscape", "inverted-portrait", "inverted-landscape" + */ +#define SDL_HINT_QTWAYLAND_CONTENT_ORIENTATION "SDL_QTWAYLAND_CONTENT_ORIENTATION" + +/** + * \brief Flags to set on QtWayland windows to integrate with the native window manager. + * + * On QtWayland platforms, this hint controls the flags to set on the windows. + * For example, on Sailfish OS "OverridesSystemGestures" disables swipe gestures. + * + * This variable is a space-separated list of the following values (empty = no flags): + * "OverridesSystemGestures", "StaysOnTop", "BypassWindowManager" + */ +#define SDL_HINT_QTWAYLAND_WINDOW_FLAGS "SDL_QTWAYLAND_WINDOW_FLAGS" + +/** + * \brief A variable controlling whether the 2D render API is compatible or efficient. + * + * This variable can be set to the following values: + * + * "0" - Don't use batching to make rendering more efficient. + * "1" - Use batching, but might cause problems if app makes its own direct OpenGL calls. + * + * Up to SDL 2.0.9, the render API would draw immediately when requested. Now + * it batches up draw requests and sends them all to the GPU only when forced + * to (during SDL_RenderPresent, when changing render targets, by updating a + * texture that the batch needs, etc). This is significantly more efficient, + * but it can cause problems for apps that expect to render on top of the + * render API's output. As such, SDL will disable batching if a specific + * render backend is requested (since this might indicate that the app is + * planning to use the underlying graphics API directly). This hint can + * be used to explicitly request batching in this instance. It is a contract + * that you will either never use the underlying graphics API directly, or + * if you do, you will call SDL_RenderFlush() before you do so any current + * batch goes to the GPU before your work begins. Not following this contract + * will result in undefined behavior. + */ +#define SDL_HINT_RENDER_BATCHING "SDL_RENDER_BATCHING" + +/** + * \brief A variable controlling how the 2D render API renders lines + * + * This variable can be set to the following values: + * "0" - Use the default line drawing method (Bresenham's line algorithm as of SDL 2.0.20) + * "1" - Use the driver point API using Bresenham's line algorithm (correct, draws many points) + * "2" - Use the driver line API (occasionally misses line endpoints based on hardware driver quirks, was the default before 2.0.20) + * "3" - Use the driver geometry API (correct, draws thicker diagonal lines) + * + * This variable should be set when the renderer is created. + */ +#define SDL_HINT_RENDER_LINE_METHOD "SDL_RENDER_LINE_METHOD" + +/** + * \brief A variable controlling whether to enable Direct3D 11+'s Debug Layer. + * + * This variable does not have any effect on the Direct3D 9 based renderer. + * + * This variable can be set to the following values: + * "0" - Disable Debug Layer use + * "1" - Enable Debug Layer use + * + * By default, SDL does not use Direct3D Debug Layer. + */ +#define SDL_HINT_RENDER_DIRECT3D11_DEBUG "SDL_RENDER_DIRECT3D11_DEBUG" + +/** + * \brief A variable controlling whether the Direct3D device is initialized for thread-safe operations. + * + * This variable can be set to the following values: + * "0" - Thread-safety is not enabled (faster) + * "1" - Thread-safety is enabled + * + * By default the Direct3D device is created with thread-safety disabled. + */ +#define SDL_HINT_RENDER_DIRECT3D_THREADSAFE "SDL_RENDER_DIRECT3D_THREADSAFE" + +/** + * \brief A variable specifying which render driver to use. + * + * If the application doesn't pick a specific renderer to use, this variable + * specifies the name of the preferred renderer. If the preferred renderer + * can't be initialized, the normal default renderer is used. + * + * This variable is case insensitive and can be set to the following values: + * "direct3d" + * "direct3d11" + * "direct3d12" + * "opengl" + * "opengles2" + * "opengles" + * "metal" + * "software" + * + * The default varies by platform, but it's the first one in the list that + * is available on the current platform. + */ +#define SDL_HINT_RENDER_DRIVER "SDL_RENDER_DRIVER" + +/** + * \brief A variable controlling the scaling policy for SDL_RenderSetLogicalSize. + * + * This variable can be set to the following values: + * "0" or "letterbox" - Uses letterbox/sidebars to fit the entire rendering on screen + * "1" or "overscan" - Will zoom the rendering so it fills the entire screen, allowing edges to be drawn offscreen + * + * By default letterbox is used + */ +#define SDL_HINT_RENDER_LOGICAL_SIZE_MODE "SDL_RENDER_LOGICAL_SIZE_MODE" + +/** + * \brief A variable controlling whether the OpenGL render driver uses shaders if they are available. + * + * This variable can be set to the following values: + * "0" - Disable shaders + * "1" - Enable shaders + * + * By default shaders are used if OpenGL supports them. + */ +#define SDL_HINT_RENDER_OPENGL_SHADERS "SDL_RENDER_OPENGL_SHADERS" + +/** + * \brief A variable controlling the scaling quality + * + * This variable can be set to the following values: + * "0" or "nearest" - Nearest pixel sampling + * "1" or "linear" - Linear filtering (supported by OpenGL and Direct3D) + * "2" or "best" - Currently this is the same as "linear" + * + * By default nearest pixel sampling is used + */ +#define SDL_HINT_RENDER_SCALE_QUALITY "SDL_RENDER_SCALE_QUALITY" + +/** + * \brief A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing. + * + * This variable can be set to the following values: + * "0" - Disable vsync + * "1" - Enable vsync + * + * By default SDL does not sync screen surface updates with vertical refresh. + */ +#define SDL_HINT_RENDER_VSYNC "SDL_RENDER_VSYNC" + +/** + * \brief A variable controlling if VSYNC is automatically disable if doesn't reach the enough FPS + * + * This variable can be set to the following values: + * "0" - It will be using VSYNC as defined in the main flag. Default + * "1" - If VSYNC was previously enabled, then it will disable VSYNC if doesn't reach enough speed + * + * By default SDL does not enable the automatic VSYNC + */ +#define SDL_HINT_PS2_DYNAMIC_VSYNC "SDL_PS2_DYNAMIC_VSYNC" + +/** + * \brief A variable to control whether the return key on the soft keyboard + * should hide the soft keyboard on Android and iOS. + * + * The variable can be set to the following values: + * "0" - The return key will be handled as a key event. This is the behaviour of SDL <= 2.0.3. (default) + * "1" - The return key will hide the keyboard. + * + * The value of this hint is used at runtime, so it can be changed at any time. + */ +#define SDL_HINT_RETURN_KEY_HIDES_IME "SDL_RETURN_KEY_HIDES_IME" + +/** + * \brief Tell SDL which Dispmanx layer to use on a Raspberry PI + * + * Also known as Z-order. The variable can take a negative or positive value. + * The default is 10000. + */ +#define SDL_HINT_RPI_VIDEO_LAYER "SDL_RPI_VIDEO_LAYER" + +/** + * \brief Specify an "activity name" for screensaver inhibition. + * + * Some platforms, notably Linux desktops, list the applications which are + * inhibiting the screensaver or other power-saving features. + * + * This hint lets you specify the "activity name" sent to the OS when + * SDL_DisableScreenSaver() is used (or the screensaver is automatically + * disabled). The contents of this hint are used when the screensaver is + * disabled. You should use a string that describes what your program is doing + * (and, therefore, why the screensaver is disabled). For example, "Playing a + * game" or "Watching a video". + * + * Setting this to "" or leaving it unset will have SDL use a reasonable + * default: "Playing a game" or something similar. + * + * On targets where this is not supported, this hint does nothing. + */ +#define SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME "SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME" + +/** + * \brief Specifies whether SDL_THREAD_PRIORITY_TIME_CRITICAL should be treated as realtime. + * + * On some platforms, like Linux, a realtime priority thread may be subject to restrictions + * that require special handling by the application. This hint exists to let SDL know that + * the app is prepared to handle said restrictions. + * + * On Linux, SDL will apply the following configuration to any thread that becomes realtime: + * * The SCHED_RESET_ON_FORK bit will be set on the scheduling policy, + * * An RLIMIT_RTTIME budget will be configured to the rtkit specified limit. + * * Exceeding this limit will result in the kernel sending SIGKILL to the app, + * * Refer to the man pages for more information. + * + * This variable can be set to the following values: + * "0" - default platform specific behaviour + * "1" - Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling policy + */ +#define SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL "SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL" + +/** +* \brief A string specifying additional information to use with SDL_SetThreadPriority. +* +* By default SDL_SetThreadPriority will make appropriate system changes in order to +* apply a thread priority. For example on systems using pthreads the scheduler policy +* is changed automatically to a policy that works well with a given priority. +* Code which has specific requirements can override SDL's default behavior with this hint. +* +* pthread hint values are "current", "other", "fifo" and "rr". +* Currently no other platform hint values are defined but may be in the future. +* +* \note On Linux, the kernel may send SIGKILL to realtime tasks which exceed the distro +* configured execution budget for rtkit. This budget can be queried through RLIMIT_RTTIME +* after calling SDL_SetThreadPriority(). +*/ +#define SDL_HINT_THREAD_PRIORITY_POLICY "SDL_THREAD_PRIORITY_POLICY" + +/** +* \brief A string specifying SDL's threads stack size in bytes or "0" for the backend's default size +* +* Use this hint in case you need to set SDL's threads stack size to other than the default. +* This is specially useful if you build SDL against a non glibc libc library (such as musl) which +* provides a relatively small default thread stack size (a few kilobytes versus the default 8MB glibc uses). +* Support for this hint is currently available only in the pthread, Windows, and PSP backend. +* +* Instead of this hint, in 2.0.9 and later, you can use +* SDL_CreateThreadWithStackSize(). This hint only works with the classic +* SDL_CreateThread(). +*/ +#define SDL_HINT_THREAD_STACK_SIZE "SDL_THREAD_STACK_SIZE" + +/** + * \brief A variable that controls the timer resolution, in milliseconds. + * + * The higher resolution the timer, the more frequently the CPU services + * timer interrupts, and the more precise delays are, but this takes up + * power and CPU time. This hint is only used on Windows. + * + * See this blog post for more information: + * http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/ + * + * If this variable is set to "0", the system timer resolution is not set. + * + * The default value is "1". This hint may be set at any time. + */ +#define SDL_HINT_TIMER_RESOLUTION "SDL_TIMER_RESOLUTION" + +/** + * \brief A variable controlling whether touch events should generate synthetic mouse events + * + * This variable can be set to the following values: + * "0" - Touch events will not generate mouse events + * "1" - Touch events will generate mouse events + * + * By default SDL will generate mouse events for touch events + */ +#define SDL_HINT_TOUCH_MOUSE_EVENTS "SDL_TOUCH_MOUSE_EVENTS" + +/** + * \brief A variable controlling which touchpad should generate synthetic mouse events + * + * This variable can be set to the following values: + * "0" - Only front touchpad should generate mouse events. Default + * "1" - Only back touchpad should generate mouse events. + * "2" - Both touchpads should generate mouse events. + * + * By default SDL will generate mouse events for all touch devices + */ +#define SDL_HINT_VITA_TOUCH_MOUSE_DEVICE "SDL_HINT_VITA_TOUCH_MOUSE_DEVICE" + +/** + * \brief A variable controlling whether the Android / tvOS remotes + * should be listed as joystick devices, instead of sending keyboard events. + * + * This variable can be set to the following values: + * "0" - Remotes send enter/escape/arrow key events + * "1" - Remotes are available as 2 axis, 2 button joysticks (the default). + */ +#define SDL_HINT_TV_REMOTE_AS_JOYSTICK "SDL_TV_REMOTE_AS_JOYSTICK" + +/** + * \brief A variable controlling whether the screensaver is enabled. + * + * This variable can be set to the following values: + * "0" - Disable screensaver + * "1" - Enable screensaver + * + * By default SDL will disable the screensaver. + */ +#define SDL_HINT_VIDEO_ALLOW_SCREENSAVER "SDL_VIDEO_ALLOW_SCREENSAVER" + +/** + * \brief Tell the video driver that we only want a double buffer. + * + * By default, most lowlevel 2D APIs will use a triple buffer scheme that + * wastes no CPU time on waiting for vsync after issuing a flip, but + * introduces a frame of latency. On the other hand, using a double buffer + * scheme instead is recommended for cases where low latency is an important + * factor because we save a whole frame of latency. + * We do so by waiting for vsync immediately after issuing a flip, usually just + * after eglSwapBuffers call in the backend's *_SwapWindow function. + * + * Since it's driver-specific, it's only supported where possible and + * implemented. Currently supported the following drivers: + * + * - KMSDRM (kmsdrm) + * - Raspberry Pi (raspberrypi) + */ +#define SDL_HINT_VIDEO_DOUBLE_BUFFER "SDL_VIDEO_DOUBLE_BUFFER" + +/** + * \brief A variable controlling whether the EGL window is allowed to be + * composited as transparent, rather than opaque. + * + * Most window systems will always render windows opaque, even if the surface + * format has an alpha channel. This is not always true, however, so by default + * SDL will try to enforce opaque composition. To override this behavior, you + * can set this hint to "1". + */ +#define SDL_HINT_VIDEO_EGL_ALLOW_TRANSPARENCY "SDL_VIDEO_EGL_ALLOW_TRANSPARENCY" + +/** + * \brief A variable controlling whether the graphics context is externally managed. + * + * This variable can be set to the following values: + * "0" - SDL will manage graphics contexts that are attached to windows. + * "1" - Disable graphics context management on windows. + * + * By default SDL will manage OpenGL contexts in certain situations. For example, on Android the + * context will be automatically saved and restored when pausing the application. Additionally, some + * platforms will assume usage of OpenGL if Vulkan isn't used. Setting this to "1" will prevent this + * behavior, which is desireable when the application manages the graphics context, such as + * an externally managed OpenGL context or attaching a Vulkan surface to the window. + */ +#define SDL_HINT_VIDEO_EXTERNAL_CONTEXT "SDL_VIDEO_EXTERNAL_CONTEXT" + +/** + * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS) + */ +#define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" + +/** + * \brief A variable that dictates policy for fullscreen Spaces on Mac OS X. + * + * This hint only applies to Mac OS X. + * + * The variable can be set to the following values: + * "0" - Disable Spaces support (FULLSCREEN_DESKTOP won't use them and + * SDL_WINDOW_RESIZABLE windows won't offer the "fullscreen" + * button on their titlebars). + * "1" - Enable Spaces support (FULLSCREEN_DESKTOP will use them and + * SDL_WINDOW_RESIZABLE windows will offer the "fullscreen" + * button on their titlebars). + * + * The default value is "1". This hint must be set before any windows are created. + */ +#define SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES "SDL_VIDEO_MAC_FULLSCREEN_SPACES" + +/** + * \brief Minimize your SDL_Window if it loses key focus when in fullscreen mode. Defaults to false. + * \warning Before SDL 2.0.14, this defaulted to true! In 2.0.14, we're + * seeing if "true" causes more problems than it solves in modern times. + * + */ +#define SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS "SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS" + +/** + * \brief A variable controlling whether the libdecor Wayland backend is allowed to be used. + * + * This variable can be set to the following values: + * "0" - libdecor use is disabled. + * "1" - libdecor use is enabled (default). + * + * libdecor is used over xdg-shell when xdg-decoration protocol is unavailable. + */ +#define SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR "SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR" + +/** + * \brief A variable controlling whether the libdecor Wayland backend is preferred over native decrations. + * + * When this hint is set, libdecor will be used to provide window decorations, even if xdg-decoration is + * available. (Note that, by default, libdecor will use xdg-decoration itself if available). + * + * This variable can be set to the following values: + * "0" - libdecor is enabled only if server-side decorations are unavailable. + * "1" - libdecor is always enabled if available. + * + * libdecor is used over xdg-shell when xdg-decoration protocol is unavailable. + */ +#define SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR "SDL_VIDEO_WAYLAND_PREFER_LIBDECOR" + +/** + * \brief A variable controlling whether video mode emulation is enabled under Wayland. + * + * When this hint is set, a standard set of emulated CVT video modes will be exposed for use by the application. + * If it is disabled, the only modes exposed will be the logical desktop size and, in the case of a scaled + * desktop, the native display resolution. + * + * This variable can be set to the following values: + * "0" - Video mode emulation is disabled. + * "1" - Video mode emulation is enabled. + * + * By default video mode emulation is enabled. + */ +#define SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION "SDL_VIDEO_WAYLAND_MODE_EMULATION" + +/** + * \brief Enable or disable mouse pointer warp emulation, needed by some older games. + * + * When this hint is set, any SDL will emulate mouse warps using relative mouse mode. + * This is required for some older games (such as Source engine games), which warp the + * mouse to the centre of the screen rather than using relative mouse motion. Note that + * relative mouse mode may have different mouse acceleration behaviour than pointer warps. + * + * This variable can be set to the following values: + * "0" - All mouse warps fail, as mouse warping is not available under wayland. + * "1" - Some mouse warps will be emulated by forcing relative mouse mode. + * + * If not set, this is automatically enabled unless an application uses relative mouse + * mode directly. + */ +#define SDL_HINT_VIDEO_WAYLAND_EMULATE_MOUSE_WARP "SDL_VIDEO_WAYLAND_EMULATE_MOUSE_WARP" + +/** +* \brief A variable that is the address of another SDL_Window* (as a hex string formatted with "%p"). +* +* If this hint is set before SDL_CreateWindowFrom() and the SDL_Window* it is set to has +* SDL_WINDOW_OPENGL set (and running on WGL only, currently), then two things will occur on the newly +* created SDL_Window: +* +* 1. Its pixel format will be set to the same pixel format as this SDL_Window. This is +* needed for example when sharing an OpenGL context across multiple windows. +* +* 2. The flag SDL_WINDOW_OPENGL will be set on the new window so it can be used for +* OpenGL rendering. +* +* This variable can be set to the following values: +* The address (as a string "%p") of the SDL_Window* that new windows created with SDL_CreateWindowFrom() should +* share a pixel format with. +*/ +#define SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT "SDL_VIDEO_WINDOW_SHARE_PIXEL_FORMAT" + +/** + * \brief When calling SDL_CreateWindowFrom(), make the window compatible with OpenGL. + * + * This variable can be set to the following values: + * "0" - Don't add any graphics flags to the SDL_WindowFlags + * "1" - Add SDL_WINDOW_OPENGL to the SDL_WindowFlags + * + * By default SDL will not make the foreign window compatible with OpenGL. + */ +#define SDL_HINT_VIDEO_FOREIGN_WINDOW_OPENGL "SDL_VIDEO_FOREIGN_WINDOW_OPENGL" + +/** + * \brief When calling SDL_CreateWindowFrom(), make the window compatible with Vulkan. + * + * This variable can be set to the following values: + * "0" - Don't add any graphics flags to the SDL_WindowFlags + * "1" - Add SDL_WINDOW_VULKAN to the SDL_WindowFlags + * + * By default SDL will not make the foreign window compatible with Vulkan. + */ +#define SDL_HINT_VIDEO_FOREIGN_WINDOW_VULKAN "SDL_VIDEO_FOREIGN_WINDOW_VULKAN" + +/** +* \brief A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries +* +* SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It +* can use two different sets of binaries, those compiled by the user from source +* or those provided by the Chrome browser. In the later case, these binaries require +* that SDL loads a DLL providing the shader compiler. +* +* This variable can be set to the following values: +* "d3dcompiler_46.dll" - default, best for Vista or later. +* "d3dcompiler_43.dll" - for XP support. +* "none" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries. +* +*/ +#define SDL_HINT_VIDEO_WIN_D3DCOMPILER "SDL_VIDEO_WIN_D3DCOMPILER" + +/** + * \brief A variable controlling whether X11 should use GLX or EGL by default + * + * This variable can be set to the following values: + * "0" - Use GLX + * "1" - Use EGL + * + * By default SDL will use GLX when both are present. + */ +#define SDL_HINT_VIDEO_X11_FORCE_EGL "SDL_VIDEO_X11_FORCE_EGL" + +/** + * \brief A variable controlling whether the X11 _NET_WM_BYPASS_COMPOSITOR hint should be used. + * + * This variable can be set to the following values: + * "0" - Disable _NET_WM_BYPASS_COMPOSITOR + * "1" - Enable _NET_WM_BYPASS_COMPOSITOR + * + * By default SDL will use _NET_WM_BYPASS_COMPOSITOR + * + */ +#define SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR "SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR" + +/** + * \brief A variable controlling whether the X11 _NET_WM_PING protocol should be supported. + * + * This variable can be set to the following values: + * "0" - Disable _NET_WM_PING + * "1" - Enable _NET_WM_PING + * + * By default SDL will use _NET_WM_PING, but for applications that know they + * will not always be able to respond to ping requests in a timely manner they can + * turn it off to avoid the window manager thinking the app is hung. + * The hint is checked in CreateWindow. + */ +#define SDL_HINT_VIDEO_X11_NET_WM_PING "SDL_VIDEO_X11_NET_WM_PING" + +/** + * \brief A variable forcing the visual ID chosen for new X11 windows + * + */ +#define SDL_HINT_VIDEO_X11_WINDOW_VISUALID "SDL_VIDEO_X11_WINDOW_VISUALID" + +/** + * \brief A no-longer-used variable controlling whether the X11 Xinerama extension should be used. + * + * Before SDL 2.0.24, this would let apps and users disable Xinerama support on X11. + * Now SDL never uses Xinerama, and does not check for this hint at all. + * The preprocessor define is left here for source compatibility. + */ +#define SDL_HINT_VIDEO_X11_XINERAMA "SDL_VIDEO_X11_XINERAMA" + +/** + * \brief A variable controlling whether the X11 XRandR extension should be used. + * + * This variable can be set to the following values: + * "0" - Disable XRandR + * "1" - Enable XRandR + * + * By default SDL will use XRandR. + */ +#define SDL_HINT_VIDEO_X11_XRANDR "SDL_VIDEO_X11_XRANDR" + +/** + * \brief A no-longer-used variable controlling whether the X11 VidMode extension should be used. + * + * Before SDL 2.0.24, this would let apps and users disable XVidMode support on X11. + * Now SDL never uses XVidMode, and does not check for this hint at all. + * The preprocessor define is left here for source compatibility. + */ +#define SDL_HINT_VIDEO_X11_XVIDMODE "SDL_VIDEO_X11_XVIDMODE" + +/** + * \brief Controls how the fact chunk affects the loading of a WAVE file. + * + * The fact chunk stores information about the number of samples of a WAVE + * file. The Standards Update from Microsoft notes that this value can be used + * to 'determine the length of the data in seconds'. This is especially useful + * for compressed formats (for which this is a mandatory chunk) if they produce + * multiple sample frames per block and truncating the block is not allowed. + * The fact chunk can exactly specify how many sample frames there should be + * in this case. + * + * Unfortunately, most application seem to ignore the fact chunk and so SDL + * ignores it by default as well. + * + * This variable can be set to the following values: + * + * "truncate" - Use the number of samples to truncate the wave data if + * the fact chunk is present and valid + * "strict" - Like "truncate", but raise an error if the fact chunk + * is invalid, not present for non-PCM formats, or if the + * data chunk doesn't have that many samples + * "ignorezero" - Like "truncate", but ignore fact chunk if the number of + * samples is zero + * "ignore" - Ignore fact chunk entirely (default) + */ +#define SDL_HINT_WAVE_FACT_CHUNK "SDL_WAVE_FACT_CHUNK" + +/** + * \brief Controls how the size of the RIFF chunk affects the loading of a WAVE file. + * + * The size of the RIFF chunk (which includes all the sub-chunks of the WAVE + * file) is not always reliable. In case the size is wrong, it's possible to + * just ignore it and step through the chunks until a fixed limit is reached. + * + * Note that files that have trailing data unrelated to the WAVE file or + * corrupt files may slow down the loading process without a reliable boundary. + * By default, SDL stops after 10000 chunks to prevent wasting time. Use the + * environment variable SDL_WAVE_CHUNK_LIMIT to adjust this value. + * + * This variable can be set to the following values: + * + * "force" - Always use the RIFF chunk size as a boundary for the chunk search + * "ignorezero" - Like "force", but a zero size searches up to 4 GiB (default) + * "ignore" - Ignore the RIFF chunk size and always search up to 4 GiB + * "maximum" - Search for chunks until the end of file (not recommended) + */ +#define SDL_HINT_WAVE_RIFF_CHUNK_SIZE "SDL_WAVE_RIFF_CHUNK_SIZE" + +/** + * \brief Controls how a truncated WAVE file is handled. + * + * A WAVE file is considered truncated if any of the chunks are incomplete or + * the data chunk size is not a multiple of the block size. By default, SDL + * decodes until the first incomplete block, as most applications seem to do. + * + * This variable can be set to the following values: + * + * "verystrict" - Raise an error if the file is truncated + * "strict" - Like "verystrict", but the size of the RIFF chunk is ignored + * "dropframe" - Decode until the first incomplete sample frame + * "dropblock" - Decode until the first incomplete block (default) + */ +#define SDL_HINT_WAVE_TRUNCATION "SDL_WAVE_TRUNCATION" + +/** + * \brief Tell SDL not to name threads on Windows with the 0x406D1388 Exception. + * The 0x406D1388 Exception is a trick used to inform Visual Studio of a + * thread's name, but it tends to cause problems with other debuggers, + * and the .NET runtime. Note that SDL 2.0.6 and later will still use + * the (safer) SetThreadDescription API, introduced in the Windows 10 + * Creators Update, if available. + * + * The variable can be set to the following values: + * "0" - SDL will raise the 0x406D1388 Exception to name threads. + * This is the default behavior of SDL <= 2.0.4. + * "1" - SDL will not raise this exception, and threads will be unnamed. (default) + * This is necessary with .NET languages or debuggers that aren't Visual Studio. + */ +#define SDL_HINT_WINDOWS_DISABLE_THREAD_NAMING "SDL_WINDOWS_DISABLE_THREAD_NAMING" + +/** + * \brief A variable controlling whether the windows message loop is processed by SDL + * + * This variable can be set to the following values: + * "0" - The window message loop is not run + * "1" - The window message loop is processed in SDL_PumpEvents() + * + * By default SDL will process the windows message loop + */ +#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" + +/** + * \brief Force SDL to use Critical Sections for mutexes on Windows. + * On Windows 7 and newer, Slim Reader/Writer Locks are available. + * They offer better performance, allocate no kernel ressources and + * use less memory. SDL will fall back to Critical Sections on older + * OS versions or if forced to by this hint. + * + * This variable can be set to the following values: + * "0" - Use SRW Locks when available. If not, fall back to Critical Sections. (default) + * "1" - Force the use of Critical Sections in all cases. + * + */ +#define SDL_HINT_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS "SDL_WINDOWS_FORCE_MUTEX_CRITICAL_SECTIONS" + +/** + * \brief Force SDL to use Kernel Semaphores on Windows. + * Kernel Semaphores are inter-process and require a context + * switch on every interaction. On Windows 8 and newer, the + * WaitOnAddress API is available. Using that and atomics to + * implement semaphores increases performance. + * SDL will fall back to Kernel Objects on older OS versions + * or if forced to by this hint. + * + * This variable can be set to the following values: + * "0" - Use Atomics and WaitOnAddress API when available. If not, fall back to Kernel Objects. (default) + * "1" - Force the use of Kernel Objects in all cases. + * + */ +#define SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL "SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL" + +/** + * \brief A variable to specify custom icon resource id from RC file on Windows platform + */ +#define SDL_HINT_WINDOWS_INTRESOURCE_ICON "SDL_WINDOWS_INTRESOURCE_ICON" +#define SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL "SDL_WINDOWS_INTRESOURCE_ICON_SMALL" + +/** + * \brief Tell SDL not to generate window-close events for Alt+F4 on Windows. + * + * The variable can be set to the following values: + * "0" - SDL will generate a window-close event when it sees Alt+F4. + * "1" - SDL will only do normal key handling for Alt+F4. + */ +#define SDL_HINT_WINDOWS_NO_CLOSE_ON_ALT_F4 "SDL_WINDOWS_NO_CLOSE_ON_ALT_F4" + +/** + * \brief Use the D3D9Ex API introduced in Windows Vista, instead of normal D3D9. + * Direct3D 9Ex contains changes to state management that can eliminate device + * loss errors during scenarios like Alt+Tab or UAC prompts. D3D9Ex may require + * some changes to your application to cope with the new behavior, so this + * is disabled by default. + * + * This hint must be set before initializing the video subsystem. + * + * For more information on Direct3D 9Ex, see: + * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista#direct3d-9ex + * - https://docs.microsoft.com/en-us/windows/win32/direct3darticles/direct3d-9ex-improvements + * + * This variable can be set to the following values: + * "0" - Use the original Direct3D 9 API (default) + * "1" - Use the Direct3D 9Ex API on Vista and later (and fall back if D3D9Ex is unavailable) + * + */ +#define SDL_HINT_WINDOWS_USE_D3D9EX "SDL_WINDOWS_USE_D3D9EX" + +/** + * \brief Controls whether SDL will declare the process to be DPI aware. + * + * This hint must be set before initializing the video subsystem. + * + * The main purpose of declaring DPI awareness is to disable OS bitmap scaling of SDL windows on monitors with + * a DPI scale factor. + * + * This hint is equivalent to requesting DPI awareness via external means (e.g. calling SetProcessDpiAwarenessContext) + * and does not cause SDL to use a virtualized coordinate system, so it will generally give you 1 SDL coordinate = 1 pixel + * even on high-DPI displays. + * + * For more information, see: + * https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows + * + * This variable can be set to the following values: + * "" - Do not change the DPI awareness (default). + * "unaware" - Declare the process as DPI unaware. (Windows 8.1 and later). + * "system" - Request system DPI awareness. (Vista and later). + * "permonitor" - Request per-monitor DPI awareness. (Windows 8.1 and later). + * "permonitorv2" - Request per-monitor V2 DPI awareness. (Windows 10, version 1607 and later). + * The most visible difference from "permonitor" is that window title bar will be scaled + * to the visually correct size when dragging between monitors with different scale factors. + * This is the preferred DPI awareness level. + * + * If the requested DPI awareness is not available on the currently running OS, SDL will try to request the best + * available match. + */ +#define SDL_HINT_WINDOWS_DPI_AWARENESS "SDL_WINDOWS_DPI_AWARENESS" + +/** + * \brief Uses DPI-scaled points as the SDL coordinate system on Windows. + * + * This changes the SDL coordinate system units to be DPI-scaled points, rather than pixels everywhere. + * This means windows will be appropriately sized, even when created on high-DPI displays with scaling. + * + * e.g. requesting a 640x480 window from SDL, on a display with 125% scaling in Windows display settings, + * will create a window with an 800x600 client area (in pixels). + * + * Setting this to "1" implicitly requests process DPI awareness (setting SDL_WINDOWS_DPI_AWARENESS is unnecessary), + * and forces SDL_WINDOW_ALLOW_HIGHDPI on all windows. + * + * This variable can be set to the following values: + * "0" - SDL coordinates equal Windows coordinates. No automatic window resizing when dragging + * between monitors with different scale factors (unless this is performed by + * Windows itself, which is the case when the process is DPI unaware). + * "1" - SDL coordinates are in DPI-scaled points. Automatically resize windows as needed on + * displays with non-100% scale factors. + */ +#define SDL_HINT_WINDOWS_DPI_SCALING "SDL_WINDOWS_DPI_SCALING" + +/** + * \brief A variable controlling whether the window frame and title bar are interactive when the cursor is hidden + * + * This variable can be set to the following values: + * "0" - The window frame is not interactive when the cursor is hidden (no move, resize, etc) + * "1" - The window frame is interactive when the cursor is hidden + * + * By default SDL will allow interaction with the window frame when the cursor is hidden + */ +#define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" + +/** +* \brief A variable controlling whether the window is activated when the SDL_ShowWindow function is called +* +* This variable can be set to the following values: +* "0" - The window is activated when the SDL_ShowWindow function is called +* "1" - The window is not activated when the SDL_ShowWindow function is called +* +* By default SDL will activate the window when the SDL_ShowWindow function is called +*/ +#define SDL_HINT_WINDOW_NO_ACTIVATION_WHEN_SHOWN "SDL_WINDOW_NO_ACTIVATION_WHEN_SHOWN" + +/** \brief Allows back-button-press events on Windows Phone to be marked as handled + * + * Windows Phone devices typically feature a Back button. When pressed, + * the OS will emit back-button-press events, which apps are expected to + * handle in an appropriate manner. If apps do not explicitly mark these + * events as 'Handled', then the OS will invoke its default behavior for + * unhandled back-button-press events, which on Windows Phone 8 and 8.1 is to + * terminate the app (and attempt to switch to the previous app, or to the + * device's home screen). + * + * Setting the SDL_HINT_WINRT_HANDLE_BACK_BUTTON hint to "1" will cause SDL + * to mark back-button-press events as Handled, if and when one is sent to + * the app. + * + * Internally, Windows Phone sends back button events as parameters to + * special back-button-press callback functions. Apps that need to respond + * to back-button-press events are expected to register one or more + * callback functions for such, shortly after being launched (during the + * app's initialization phase). After the back button is pressed, the OS + * will invoke these callbacks. If the app's callback(s) do not explicitly + * mark the event as handled by the time they return, or if the app never + * registers one of these callback, the OS will consider the event + * un-handled, and it will apply its default back button behavior (terminate + * the app). + * + * SDL registers its own back-button-press callback with the Windows Phone + * OS. This callback will emit a pair of SDL key-press events (SDL_KEYDOWN + * and SDL_KEYUP), each with a scancode of SDL_SCANCODE_AC_BACK, after which + * it will check the contents of the hint, SDL_HINT_WINRT_HANDLE_BACK_BUTTON. + * If the hint's value is set to "1", the back button event's Handled + * property will get set to 'true'. If the hint's value is set to something + * else, or if it is unset, SDL will leave the event's Handled property + * alone. (By default, the OS sets this property to 'false', to note.) + * + * SDL apps can either set SDL_HINT_WINRT_HANDLE_BACK_BUTTON well before a + * back button is pressed, or can set it in direct-response to a back button + * being pressed. + * + * In order to get notified when a back button is pressed, SDL apps should + * register a callback function with SDL_AddEventWatch(), and have it listen + * for SDL_KEYDOWN events that have a scancode of SDL_SCANCODE_AC_BACK. + * (Alternatively, SDL_KEYUP events can be listened-for. Listening for + * either event type is suitable.) Any value of SDL_HINT_WINRT_HANDLE_BACK_BUTTON + * set by such a callback, will be applied to the OS' current + * back-button-press event. + * + * More details on back button behavior in Windows Phone apps can be found + * at the following page, on Microsoft's developer site: + * http://msdn.microsoft.com/en-us/library/windowsphone/develop/jj247550(v=vs.105).aspx + */ +#define SDL_HINT_WINRT_HANDLE_BACK_BUTTON "SDL_WINRT_HANDLE_BACK_BUTTON" + +/** \brief Label text for a WinRT app's privacy policy link + * + * Network-enabled WinRT apps must include a privacy policy. On Windows 8, 8.1, and RT, + * Microsoft mandates that this policy be available via the Windows Settings charm. + * SDL provides code to add a link there, with its label text being set via the + * optional hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that a privacy policy's contents are not set via this hint. A separate + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_URL, is used to link to the actual text of the + * policy. + * + * The contents of this hint should be encoded as a UTF8 string. + * + * The default value is "Privacy Policy". This hint should only be set during app + * initialization, preferably before any calls to SDL_Init(). + * + * For additional information on linking to a privacy policy, see the documentation for + * SDL_HINT_WINRT_PRIVACY_POLICY_URL. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_LABEL "SDL_WINRT_PRIVACY_POLICY_LABEL" + +/** + * \brief A URL to a WinRT app's privacy policy + * + * All network-enabled WinRT apps must make a privacy policy available to its + * users. On Windows 8, 8.1, and RT, Microsoft mandates that this policy be + * be available in the Windows Settings charm, as accessed from within the app. + * SDL provides code to add a URL-based link there, which can point to the app's + * privacy policy. + * + * To setup a URL to an app's privacy policy, set SDL_HINT_WINRT_PRIVACY_POLICY_URL + * before calling any SDL_Init() functions. The contents of the hint should + * be a valid URL. For example, "http://www.example.com". + * + * The default value is "", which will prevent SDL from adding a privacy policy + * link to the Settings charm. This hint should only be set during app init. + * + * The label text of an app's "Privacy Policy" link may be customized via another + * hint, SDL_HINT_WINRT_PRIVACY_POLICY_LABEL. + * + * Please note that on Windows Phone, Microsoft does not provide standard UI + * for displaying a privacy policy link, and as such, SDL_HINT_WINRT_PRIVACY_POLICY_URL + * will not get used on that platform. Network-enabled phone apps should display + * their privacy policy through some other, in-app means. + */ +#define SDL_HINT_WINRT_PRIVACY_POLICY_URL "SDL_WINRT_PRIVACY_POLICY_URL" + +/** + * \brief Mark X11 windows as override-redirect. + * + * If set, this _might_ increase framerate at the expense of the desktop + * not working as expected. Override-redirect windows aren't noticed by the + * window manager at all. + * + * You should probably only use this for fullscreen windows, and you probably + * shouldn't even use it for that. But it's here if you want to try! + */ +#define SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT "SDL_X11_FORCE_OVERRIDE_REDIRECT" + +/** + * \brief A variable that lets you disable the detection and use of Xinput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable XInput detection (only uses direct input) + * "1" - Enable XInput detection (the default) + */ +#define SDL_HINT_XINPUT_ENABLED "SDL_XINPUT_ENABLED" + + /** + * \brief A variable that lets you disable the detection and use of DirectInput gamepad devices + * + * The variable can be set to the following values: + * "0" - Disable DirectInput detection (only uses XInput) + * "1" - Enable DirectInput detection (the default) + */ +#define SDL_HINT_DIRECTINPUT_ENABLED "SDL_DIRECTINPUT_ENABLED" + +/** + * \brief A variable that causes SDL to use the old axis and button mapping for XInput devices. + * + * This hint is for backwards compatibility only and will be removed in SDL 2.1 + * + * The default value is "0". This hint must be set before SDL_Init() + */ +#define SDL_HINT_XINPUT_USE_OLD_JOYSTICK_MAPPING "SDL_XINPUT_USE_OLD_JOYSTICK_MAPPING" + +/** + * \brief A variable that causes SDL to not ignore audio "monitors" + * + * This is currently only used for PulseAudio and ignored elsewhere. + * + * By default, SDL ignores audio devices that aren't associated with physical + * hardware. Changing this hint to "1" will expose anything SDL sees that + * appears to be an audio source or sink. This will add "devices" to the list + * that the user probably doesn't want or need, but it can be useful in + * scenarios where you want to hook up SDL to some sort of virtual device, + * etc. + * + * The default value is "0". This hint must be set before SDL_Init(). + * + * This hint is available since SDL 2.0.16. Before then, virtual devices are + * always ignored. + */ +#define SDL_HINT_AUDIO_INCLUDE_MONITORS "SDL_AUDIO_INCLUDE_MONITORS" + +/** + * \brief A variable that forces X11 windows to create as a custom type. + * + * This is currently only used for X11 and ignored elsewhere. + * + * During SDL_CreateWindow, SDL uses the _NET_WM_WINDOW_TYPE X11 property + * to report to the window manager the type of window it wants to create. + * This might be set to various things if SDL_WINDOW_TOOLTIP or + * SDL_WINDOW_POPUP_MENU, etc, were specified. For "normal" windows that + * haven't set a specific type, this hint can be used to specify a custom + * type. For example, a dock window might set this to + * "_NET_WM_WINDOW_TYPE_DOCK". + * + * If not set or set to "", this hint is ignored. This hint must be set + * before the SDL_CreateWindow() call that it is intended to affect. + * + * This hint is available since SDL 2.0.22. + */ +#define SDL_HINT_X11_WINDOW_TYPE "SDL_X11_WINDOW_TYPE" + +/** + * \brief A variable that decides whether to send SDL_QUIT when closing the final window. + * + * By default, SDL sends an SDL_QUIT event when there is only one window + * and it receives an SDL_WINDOWEVENT_CLOSE event, under the assumption most + * apps would also take the loss of this window as a signal to terminate the + * program. + * + * However, it's not unreasonable in some cases to have the program continue + * to live on, perhaps to create new windows later. + * + * Changing this hint to "0" will cause SDL to not send an SDL_QUIT event + * when the final window is requesting to close. Note that in this case, + * there are still other legitimate reasons one might get an SDL_QUIT + * event: choosing "Quit" from the macOS menu bar, sending a SIGINT (ctrl-c) + * on Unix, etc. + * + * The default value is "1". This hint can be changed at any time. + * + * This hint is available since SDL 2.0.22. Before then, you always get + * an SDL_QUIT event when closing the final window. + */ +#define SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE "SDL_QUIT_ON_LAST_WINDOW_CLOSE" + + +/** + * \brief A variable that decides what video backend to use. + * + * By default, SDL will try all available video backends in a reasonable + * order until it finds one that can work, but this hint allows the app + * or user to force a specific target, such as "x11" if, say, you are + * on Wayland but want to try talking to the X server instead. + * + * This functionality has existed since SDL 2.0.0 (indeed, before that) + * but before 2.0.22 this was an environment variable only. In 2.0.22, + * it was upgraded to a full SDL hint, so you can set the environment + * variable as usual or programatically set the hint with SDL_SetHint, + * which won't propagate to child processes. + * + * The default value is unset, in which case SDL will try to figure out + * the best video backend on your behalf. This hint needs to be set + * before SDL_Init() is called to be useful. + * + * This hint is available since SDL 2.0.22. Before then, you could set + * the environment variable to get the same effect. + */ +#define SDL_HINT_VIDEODRIVER "SDL_VIDEODRIVER" + +/** + * \brief A variable that decides what audio backend to use. + * + * By default, SDL will try all available audio backends in a reasonable + * order until it finds one that can work, but this hint allows the app + * or user to force a specific target, such as "alsa" if, say, you are + * on PulseAudio but want to try talking to the lower level instead. + * + * This functionality has existed since SDL 2.0.0 (indeed, before that) + * but before 2.0.22 this was an environment variable only. In 2.0.22, + * it was upgraded to a full SDL hint, so you can set the environment + * variable as usual or programatically set the hint with SDL_SetHint, + * which won't propagate to child processes. + * + * The default value is unset, in which case SDL will try to figure out + * the best audio backend on your behalf. This hint needs to be set + * before SDL_Init() is called to be useful. + * + * This hint is available since SDL 2.0.22. Before then, you could set + * the environment variable to get the same effect. + */ +#define SDL_HINT_AUDIODRIVER "SDL_AUDIODRIVER" + +/** + * \brief A variable that decides what KMSDRM device to use. + * + * Internally, SDL might open something like "/dev/dri/cardNN" to + * access KMSDRM functionality, where "NN" is a device index number. + * + * SDL makes a guess at the best index to use (usually zero), but the + * app or user can set this hint to a number between 0 and 99 to + * force selection. + * + * This hint is available since SDL 2.24.0. + */ +#define SDL_HINT_KMSDRM_DEVICE_INDEX "SDL_KMSDRM_DEVICE_INDEX" + + +/** + * \brief A variable that treats trackpads as touch devices. + * + * On macOS (and possibly other platforms in the future), SDL will report + * touches on a trackpad as mouse input, which is generally what users + * expect from this device; however, these are often actually full + * multitouch-capable touch devices, so it might be preferable to some apps + * to treat them as such. + * + * Setting this hint to true will make the trackpad input report as a + * multitouch device instead of a mouse. The default is false. + * + * Note that most platforms don't support this hint. As of 2.24.0, it + * only supports MacBooks' trackpads on macOS. Others may follow later. + * + * This hint is checked during SDL_Init and can not be changed after. + * + * This hint is available since SDL 2.24.0. + */ +#define SDL_HINT_TRACKPAD_IS_TOUCH_ONLY "SDL_TRACKPAD_IS_TOUCH_ONLY" + + +/** + * \brief An enumeration of hint priorities + */ +typedef enum +{ + SDL_HINT_DEFAULT, + SDL_HINT_NORMAL, + SDL_HINT_OVERRIDE +} SDL_HintPriority; + + +/** + * Set a hint with a specific priority. + * + * The priority controls the behavior when setting a hint that already has a + * value. Hints will replace existing hints of their priority and lower. + * Environment variables are considered to have override priority. + * + * \param name the hint to set + * \param value the value of the hint variable + * \param priority the SDL_HintPriority level for the hint + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHintWithPriority(const char *name, + const char *value, + SDL_HintPriority priority); + +/** + * Set a hint with normal priority. + * + * Hints will not be set if there is an existing override hint or environment + * variable that takes precedence. You can use SDL_SetHintWithPriority() to + * set the hint with override priority instead. + * + * \param name the hint to set + * \param value the value of the hint variable + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHintWithPriority + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetHint(const char *name, + const char *value); + +/** + * Reset a hint to the default value. + * + * This will reset a hint to the value of the environment variable, or NULL if + * the environment isn't set. Callbacks will be called normally with this + * change. + * + * \param name the hint to set + * \returns SDL_TRUE if the hint was set, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_ResetHint(const char *name); + +/** + * Reset all hints to the default values. + * + * This will reset all hints to the value of the associated environment + * variable, or NULL if the environment isn't set. Callbacks will be called + * normally with this change. + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + * \sa SDL_ResetHint + */ +extern DECLSPEC void SDLCALL SDL_ResetHints(void); + +/** + * Get the value of a hint. + * + * \param name the hint to query + * \returns the string value of a hint or NULL if the hint isn't set. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetHint + * \sa SDL_SetHintWithPriority + */ +extern DECLSPEC const char * SDLCALL SDL_GetHint(const char *name); + +/** + * Get the boolean value of a hint variable. + * + * \param name the name of the hint to get the boolean value from + * \param default_value the value to return if the hint does not exist + * \returns the boolean value of a hint or the provided default value if the + * hint does not exist. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetHint + * \sa SDL_SetHint + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetHintBoolean(const char *name, SDL_bool default_value); + +/** + * Type definition of the hint callback function. + * + * \param userdata what was passed as `userdata` to SDL_AddHintCallback() + * \param name what was passed as `name` to SDL_AddHintCallback() + * \param oldValue the previous hint value + * \param newValue the new value hint is to be set to + */ +typedef void (SDLCALL *SDL_HintCallback)(void *userdata, const char *name, const char *oldValue, const char *newValue); + +/** + * Add a function to watch a particular hint. + * + * \param name the hint to watch + * \param callback An SDL_HintCallback function that will be called when the + * hint value changes + * \param userdata a pointer to pass to the callback function + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DelHintCallback + */ +extern DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * Remove a function watching a particular hint. + * + * \param name the hint being watched + * \param callback An SDL_HintCallback function that will be called when the + * hint value changes + * \param userdata a pointer being passed to the callback function + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddHintCallback + */ +extern DECLSPEC void SDLCALL SDL_DelHintCallback(const char *name, + SDL_HintCallback callback, + void *userdata); + +/** + * Clear all hints. + * + * This function is automatically called during SDL_Quit(), and deletes all + * callbacks without calling them and frees all memory associated with hints. + * If you're calling this from application code you probably want to call + * SDL_ResetHints() instead. + * + * This function will be removed from the API the next time we rev the ABI. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ResetHints + */ +extern DECLSPEC void SDLCALL SDL_ClearHints(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_hints_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_joystick.h b/include/SDL/SDL_joystick.h new file mode 100644 index 0000000..07d6a2e --- /dev/null +++ b/include/SDL/SDL_joystick.h @@ -0,0 +1,1066 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_joystick.h + * + * Include file for SDL joystick event handling + * + * The term "device_index" identifies currently plugged in joystick devices between 0 and SDL_NumJoysticks(), with the exact joystick + * behind a device_index changing as joysticks are plugged and unplugged. + * + * The term "instance_id" is the current instantiation of a joystick device in the system, if the joystick is removed and then re-inserted + * then it will get a new instance_id, instance_id's are monotonically increasing identifiers of a joystick plugged in. + * + * The term "player_index" is the number assigned to a player on a specific + * controller. For XInput controllers this returns the XInput user index. + * Many joysticks will not be able to supply this information. + * + * The term JoystickGUID is a stable 128-bit identifier for a joystick device that does not change over time, it identifies class of + * the device (a X360 wired controller for example). This identifier is platform dependent. + */ + +#ifndef SDL_joystick_h_ +#define SDL_joystick_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_guid.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \file SDL_joystick.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_JOYSTICK flag. This causes SDL to scan the system + * for joysticks, and load appropriate drivers. + * + * If you would like to receive joystick updates while the application + * is in the background, you should set the following hint before calling + * SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS + */ + +/** + * The joystick structure used to identify an SDL joystick + */ +struct _SDL_Joystick; +typedef struct _SDL_Joystick SDL_Joystick; + +/* A structure that encodes the stable unique id for a joystick device */ +typedef SDL_GUID SDL_JoystickGUID; + +/** + * This is a unique ID for a joystick for the time it is connected to the system, + * and is never reused for the lifetime of the application. If the joystick is + * disconnected and reconnected, it will get a new ID. + * + * The ID value starts at 0 and increments from there. The value -1 is an invalid ID. + */ +typedef Sint32 SDL_JoystickID; + +typedef enum +{ + SDL_JOYSTICK_TYPE_UNKNOWN, + SDL_JOYSTICK_TYPE_GAMECONTROLLER, + SDL_JOYSTICK_TYPE_WHEEL, + SDL_JOYSTICK_TYPE_ARCADE_STICK, + SDL_JOYSTICK_TYPE_FLIGHT_STICK, + SDL_JOYSTICK_TYPE_DANCE_PAD, + SDL_JOYSTICK_TYPE_GUITAR, + SDL_JOYSTICK_TYPE_DRUM_KIT, + SDL_JOYSTICK_TYPE_ARCADE_PAD, + SDL_JOYSTICK_TYPE_THROTTLE +} SDL_JoystickType; + +typedef enum +{ + SDL_JOYSTICK_POWER_UNKNOWN = -1, + SDL_JOYSTICK_POWER_EMPTY, /* <= 5% */ + SDL_JOYSTICK_POWER_LOW, /* <= 20% */ + SDL_JOYSTICK_POWER_MEDIUM, /* <= 70% */ + SDL_JOYSTICK_POWER_FULL, /* <= 100% */ + SDL_JOYSTICK_POWER_WIRED, + SDL_JOYSTICK_POWER_MAX +} SDL_JoystickPowerLevel; + +/* Set max recognized G-force from accelerometer + See src/joystick/uikit/SDL_sysjoystick.m for notes on why this is needed + */ +#define SDL_IPHONE_MAX_GFORCE 5.0 + + +/* Function prototypes */ + +/** + * Locking for multi-threaded access to the joystick API + * + * If you are using the joystick API or handling events from multiple threads + * you should use these locking functions to protect access to the joysticks. + * + * In particular, you are guaranteed that the joystick list won't change, so + * the API functions that take a joystick index will be valid, and joystick + * and game controller events will not be delivered. + * + * As of SDL 2.26.0, you can take the joystick lock around reinitializing the + * joystick subsystem, to prevent other threads from seeing joysticks in an + * uninitialized state. However, all open joysticks will be closed and SDL + * functions called with them will fail. + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_LockJoysticks(void); + + +/** + * Unlocking for multi-threaded access to the joystick API + * + * If you are using the joystick API or handling events from multiple threads + * you should use these locking functions to protect access to the joysticks. + * + * In particular, you are guaranteed that the joystick list won't change, so + * the API functions that take a joystick index will be valid, and joystick + * and game controller events will not be delivered. + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_UnlockJoysticks(void); + +/** + * Count the number of joysticks attached to the system. + * + * \returns the number of attached joysticks on success or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickName + * \sa SDL_JoystickPath + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_NumJoysticks(void); + +/** + * Get the implementation dependent name of a joystick. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system) + * \returns the name of the selected joystick. If no name can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickName + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickNameForIndex(int device_index); + +/** + * Get the implementation dependent path of a joystick. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system) + * \returns the path of the selected joystick. If no path can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_JoystickPath + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickPathForIndex(int device_index); + +/** + * Get the player index of a joystick, or -1 if it's not available This can be + * called before any joysticks are opened. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetDevicePlayerIndex(int device_index); + +/** + * Get the implementation-dependent GUID for the joystick at a given device + * index. + * + * This function can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the GUID of the selected joystick. If called on an invalid index, + * this function returns a zero GUID + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetGUID + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetDeviceGUID(int device_index); + +/** + * Get the USB vendor ID of a joystick, if available. + * + * This can be called before any joysticks are opened. If the vendor ID isn't + * available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the USB vendor ID of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceVendor(int device_index); + +/** + * Get the USB product ID of a joystick, if available. + * + * This can be called before any joysticks are opened. If the product ID isn't + * available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the USB product ID of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProduct(int device_index); + +/** + * Get the product version of a joystick, if available. + * + * This can be called before any joysticks are opened. If the product version + * isn't available this function returns 0. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the product version of the selected joystick. If called on an + * invalid index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetDeviceProductVersion(int device_index); + +/** + * Get the type of a joystick, if available. + * + * This can be called before any joysticks are opened. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the SDL_JoystickType of the selected joystick. If called on an + * invalid index, this function returns `SDL_JOYSTICK_TYPE_UNKNOWN` + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetDeviceType(int device_index); + +/** + * Get the instance ID of a joystick. + * + * This can be called before any joysticks are opened. If the index is out of + * range, this function will return -1. + * + * \param device_index the index of the joystick to query (the N'th joystick + * on the system + * \returns the instance id of the selected joystick. If called on an invalid + * index, this function returns zero + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickGetDeviceInstanceID(int device_index); + +/** + * Open a joystick for use. + * + * The `device_index` argument refers to the N'th joystick presently + * recognized by SDL on the system. It is **NOT** the same as the instance ID + * used to identify the joystick in future events. See + * SDL_JoystickInstanceID() for more details about instance IDs. + * + * The joystick subsystem must be initialized before a joystick can be opened + * for use. + * + * \param device_index the index of the joystick to query + * \returns a joystick identifier or NULL if an error occurred; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickClose + * \sa SDL_JoystickInstanceID + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickOpen(int device_index); + +/** + * Get the SDL_Joystick associated with an instance id. + * + * \param instance_id the instance id to get the SDL_Joystick for + * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromInstanceID(SDL_JoystickID instance_id); + +/** + * Get the SDL_Joystick associated with a player index. + * + * \param player_index the player index to get the SDL_Joystick for + * \returns an SDL_Joystick on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC SDL_Joystick *SDLCALL SDL_JoystickFromPlayerIndex(int player_index); + +/** + * Attach a new virtual joystick. + * + * \returns the joystick's device index, or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtual(SDL_JoystickType type, + int naxes, + int nbuttons, + int nhats); + +/** + * The structure that defines an extended virtual joystick description + * + * The caller must zero the structure and then initialize the version with `SDL_VIRTUAL_JOYSTICK_DESC_VERSION` before passing it to SDL_JoystickAttachVirtualEx() + * All other elements of this structure are optional and can be left 0. + * + * \sa SDL_JoystickAttachVirtualEx + */ +typedef struct SDL_VirtualJoystickDesc +{ + Uint16 version; /**< `SDL_VIRTUAL_JOYSTICK_DESC_VERSION` */ + Uint16 type; /**< `SDL_JoystickType` */ + Uint16 naxes; /**< the number of axes on this joystick */ + Uint16 nbuttons; /**< the number of buttons on this joystick */ + Uint16 nhats; /**< the number of hats on this joystick */ + Uint16 vendor_id; /**< the USB vendor ID of this joystick */ + Uint16 product_id; /**< the USB product ID of this joystick */ + Uint16 padding; /**< unused */ + Uint32 button_mask; /**< A mask of which buttons are valid for this controller + e.g. (1 << SDL_CONTROLLER_BUTTON_A) */ + Uint32 axis_mask; /**< A mask of which axes are valid for this controller + e.g. (1 << SDL_CONTROLLER_AXIS_LEFTX) */ + const char *name; /**< the name of the joystick */ + + void *userdata; /**< User data pointer passed to callbacks */ + void (SDLCALL *Update)(void *userdata); /**< Called when the joystick state should be updated */ + void (SDLCALL *SetPlayerIndex)(void *userdata, int player_index); /**< Called when the player index is set */ + int (SDLCALL *Rumble)(void *userdata, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble); /**< Implements SDL_JoystickRumble() */ + int (SDLCALL *RumbleTriggers)(void *userdata, Uint16 left_rumble, Uint16 right_rumble); /**< Implements SDL_JoystickRumbleTriggers() */ + int (SDLCALL *SetLED)(void *userdata, Uint8 red, Uint8 green, Uint8 blue); /**< Implements SDL_JoystickSetLED() */ + int (SDLCALL *SendEffect)(void *userdata, const void *data, int size); /**< Implements SDL_JoystickSendEffect() */ + +} SDL_VirtualJoystickDesc; + +/** + * \brief The current version of the SDL_VirtualJoystickDesc structure + */ +#define SDL_VIRTUAL_JOYSTICK_DESC_VERSION 1 + +/** + * Attach a new virtual joystick with extended properties. + * + * \returns the joystick's device index, or -1 if an error occurred. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_JoystickAttachVirtualEx(const SDL_VirtualJoystickDesc *desc); + +/** + * Detach a virtual joystick. + * + * \param device_index a value previously returned from + * SDL_JoystickAttachVirtual() + * \returns 0 on success, or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickDetachVirtual(int device_index); + +/** + * Query whether or not the joystick at a given device index is virtual. + * + * \param device_index a joystick device index. + * \returns SDL_TRUE if the joystick is virtual, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickIsVirtual(int device_index); + +/** + * Set values on an opened, virtual-joystick's axis. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * Note that when sending trigger axes, you should scale the value to the full + * range of Sint16. For example, a trigger at rest would have the value of + * `SDL_JOYSTICK_AXIS_MIN`. + * + * \param joystick the virtual joystick on which to set state. + * \param axis the specific axis on the virtual joystick to set. + * \param value the new value for the specified axis. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualAxis(SDL_Joystick *joystick, int axis, Sint16 value); + +/** + * Set values on an opened, virtual-joystick's button. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * \param joystick the virtual joystick on which to set state. + * \param button the specific button on the virtual joystick to set. + * \param value the new value for the specified button. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualButton(SDL_Joystick *joystick, int button, Uint8 value); + +/** + * Set values on an opened, virtual-joystick's hat. + * + * Please note that values set here will not be applied until the next call to + * SDL_JoystickUpdate, which can either be called directly, or can be called + * indirectly through various other SDL APIs, including, but not limited to + * the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, + * SDL_WaitEvent. + * + * \param joystick the virtual joystick on which to set state. + * \param hat the specific hat on the virtual joystick to set. + * \param value the new value for the specified hat. + * \returns 0 on success, -1 on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetVirtualHat(SDL_Joystick *joystick, int hat, Uint8 value); + +/** + * Get the implementation dependent name of a joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the name of the selected joystick. If no name can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNameForIndex + * \sa SDL_JoystickOpen + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickName(SDL_Joystick *joystick); + +/** + * Get the implementation dependent path of a joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the path of the selected joystick. If no path can be found, this + * function returns NULL; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_JoystickPathForIndex + */ +extern DECLSPEC const char *SDLCALL SDL_JoystickPath(SDL_Joystick *joystick); + +/** + * Get the player index of an opened joystick. + * + * For XInput controllers this returns the XInput user index. Many joysticks + * will not be able to supply this information. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the player index, or -1 if it's not available. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetPlayerIndex(SDL_Joystick *joystick); + +/** + * Set the player index of an opened joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \param player_index Player index to assign to this joystick, or -1 to clear + * the player index and turn off player LEDs. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC void SDLCALL SDL_JoystickSetPlayerIndex(SDL_Joystick *joystick, int player_index); + +/** + * Get the implementation-dependent GUID for the joystick. + * + * This function requires an open joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the GUID of the given joystick. If called on an invalid index, + * this function returns a zero GUID; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUID(SDL_Joystick *joystick); + +/** + * Get the USB vendor ID of an opened joystick, if available. + * + * If the vendor ID isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the USB vendor ID of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetVendor(SDL_Joystick *joystick); + +/** + * Get the USB product ID of an opened joystick, if available. + * + * If the product ID isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the USB product ID of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProduct(SDL_Joystick *joystick); + +/** + * Get the product version of an opened joystick, if available. + * + * If the product version isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the product version of the selected joystick, or 0 if unavailable. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetProductVersion(SDL_Joystick *joystick); + +/** + * Get the firmware version of an opened joystick, if available. + * + * If the firmware version isn't available this function returns 0. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the firmware version of the selected joystick, or 0 if + * unavailable. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC Uint16 SDLCALL SDL_JoystickGetFirmwareVersion(SDL_Joystick *joystick); + +/** + * Get the serial number of an opened joystick, if available. + * + * Returns the serial number of the joystick, or NULL if it is not available. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the serial number of the selected joystick, or NULL if + * unavailable. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC const char * SDLCALL SDL_JoystickGetSerial(SDL_Joystick *joystick); + +/** + * Get the type of an opened joystick. + * + * \param joystick the SDL_Joystick obtained from SDL_JoystickOpen() + * \returns the SDL_JoystickType of the selected joystick. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_JoystickType SDLCALL SDL_JoystickGetType(SDL_Joystick *joystick); + +/** + * Get an ASCII string representation for a given SDL_JoystickGUID. + * + * You should supply at least 33 bytes for pszGUID. + * + * \param guid the SDL_JoystickGUID you wish to convert to string + * \param pszGUID buffer in which to write the ASCII string + * \param cbGUID the size of pszGUID + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetDeviceGUID + * \sa SDL_JoystickGetGUID + * \sa SDL_JoystickGetGUIDFromString + */ +extern DECLSPEC void SDLCALL SDL_JoystickGetGUIDString(SDL_JoystickGUID guid, char *pszGUID, int cbGUID); + +/** + * Convert a GUID string into a SDL_JoystickGUID structure. + * + * Performs no error checking. If this function is given a string containing + * an invalid GUID, the function will silently succeed, but the GUID generated + * will not be useful. + * + * \param pchGUID string containing an ASCII representation of a GUID + * \returns a SDL_JoystickGUID structure. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetGUIDString + */ +extern DECLSPEC SDL_JoystickGUID SDLCALL SDL_JoystickGetGUIDFromString(const char *pchGUID); + +/** + * Get the device information encoded in a SDL_JoystickGUID structure + * + * \param guid the SDL_JoystickGUID you wish to get info about + * \param vendor A pointer filled in with the device VID, or 0 if not + * available + * \param product A pointer filled in with the device PID, or 0 if not + * available + * \param version A pointer filled in with the device version, or 0 if not + * available + * \param crc16 A pointer filled in with a CRC used to distinguish different + * products with the same VID/PID, or 0 if not available + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_JoystickGetDeviceGUID + */ +extern DECLSPEC void SDLCALL SDL_GetJoystickGUIDInfo(SDL_JoystickGUID guid, Uint16 *vendor, Uint16 *product, Uint16 *version, Uint16 *crc16); + +/** + * Get the status of a specified joystick. + * + * \param joystick the joystick to query + * \returns SDL_TRUE if the joystick has been opened, SDL_FALSE if it has not; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickClose + * \sa SDL_JoystickOpen + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAttached(SDL_Joystick *joystick); + +/** + * Get the instance ID of an opened joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the instance ID of the specified joystick on success or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickOpen + */ +extern DECLSPEC SDL_JoystickID SDLCALL SDL_JoystickInstanceID(SDL_Joystick *joystick); + +/** + * Get the number of general axis controls on a joystick. + * + * Often, the directional pad on a game controller will either look like 4 + * separate buttons or a POV hat, and not axes, but all of this is up to the + * device and platform. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of axis controls/number of axes on success or a + * negative error code on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetAxis + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumAxes(SDL_Joystick *joystick); + +/** + * Get the number of trackballs on a joystick. + * + * Joystick trackballs have only relative motion events associated with them + * and their state cannot be polled. + * + * Most joysticks do not have trackballs. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of trackballs on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetBall + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumBalls(SDL_Joystick *joystick); + +/** + * Get the number of POV hats on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of POV hats on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetHat + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumHats(SDL_Joystick *joystick); + +/** + * Get the number of buttons on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \returns the number of buttons on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickGetButton + * \sa SDL_JoystickOpen + */ +extern DECLSPEC int SDLCALL SDL_JoystickNumButtons(SDL_Joystick *joystick); + +/** + * Update the current state of the open joysticks. + * + * This is called automatically by the event loop if any joystick events are + * enabled. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickEventState + */ +extern DECLSPEC void SDLCALL SDL_JoystickUpdate(void); + +/** + * Enable/disable joystick event polling. + * + * If joystick events are disabled, you must call SDL_JoystickUpdate() + * yourself and manually check the state of the joystick when you want + * joystick information. + * + * It is recommended that you leave joystick event handling enabled. + * + * **WARNING**: Calling this function may delete all events currently in SDL's + * event queue. + * + * \param state can be one of `SDL_QUERY`, `SDL_IGNORE`, or `SDL_ENABLE` + * \returns 1 if enabled, 0 if disabled, or a negative error code on failure; + * call SDL_GetError() for more information. + * + * If `state` is `SDL_QUERY` then the current state is returned, + * otherwise the new processing state is returned. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GameControllerEventState + */ +extern DECLSPEC int SDLCALL SDL_JoystickEventState(int state); + +#define SDL_JOYSTICK_AXIS_MAX 32767 +#define SDL_JOYSTICK_AXIS_MIN -32768 + +/** + * Get the current state of an axis control on a joystick. + * + * SDL makes no promises about what part of the joystick any given axis refers + * to. Your game should have some sort of configuration UI to let users + * specify what each axis should be bound to. Alternately, SDL's higher-level + * Game Controller API makes a great effort to apply order to this lower-level + * interface, so you know that a specific axis is the "left thumb stick," etc. + * + * The value returned by SDL_JoystickGetAxis() is a signed integer (-32768 to + * 32767) representing the current position of the axis. It may be necessary + * to impose certain tolerances on these values to account for jitter. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param axis the axis to query; the axis indices start at index 0 + * \returns a 16-bit signed integer representing the current position of the + * axis or 0 on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumAxes + */ +extern DECLSPEC Sint16 SDLCALL SDL_JoystickGetAxis(SDL_Joystick *joystick, + int axis); + +/** + * Get the initial state of an axis control on a joystick. + * + * The state is a value ranging from -32768 to 32767. + * + * The axis indices start at index 0. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param axis the axis to query; the axis indices start at index 0 + * \param state Upon return, the initial value is supplied here. + * \return SDL_TRUE if this axis has any initial value, or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickGetAxisInitialState(SDL_Joystick *joystick, + int axis, Sint16 *state); + +/** + * \name Hat positions + */ +/* @{ */ +#define SDL_HAT_CENTERED 0x00 +#define SDL_HAT_UP 0x01 +#define SDL_HAT_RIGHT 0x02 +#define SDL_HAT_DOWN 0x04 +#define SDL_HAT_LEFT 0x08 +#define SDL_HAT_RIGHTUP (SDL_HAT_RIGHT|SDL_HAT_UP) +#define SDL_HAT_RIGHTDOWN (SDL_HAT_RIGHT|SDL_HAT_DOWN) +#define SDL_HAT_LEFTUP (SDL_HAT_LEFT|SDL_HAT_UP) +#define SDL_HAT_LEFTDOWN (SDL_HAT_LEFT|SDL_HAT_DOWN) +/* @} */ + +/** + * Get the current state of a POV hat on a joystick. + * + * The returned value will be one of the following positions: + * + * - `SDL_HAT_CENTERED` + * - `SDL_HAT_UP` + * - `SDL_HAT_RIGHT` + * - `SDL_HAT_DOWN` + * - `SDL_HAT_LEFT` + * - `SDL_HAT_RIGHTUP` + * - `SDL_HAT_RIGHTDOWN` + * - `SDL_HAT_LEFTUP` + * - `SDL_HAT_LEFTDOWN` + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param hat the hat index to get the state from; indices start at index 0 + * \returns the current hat position. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumHats + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetHat(SDL_Joystick *joystick, + int hat); + +/** + * Get the ball axis change since the last poll. + * + * Trackballs can only return relative motion since the last call to + * SDL_JoystickGetBall(), these motion deltas are placed into `dx` and `dy`. + * + * Most joysticks do not have trackballs. + * + * \param joystick the SDL_Joystick to query + * \param ball the ball index to query; ball indices start at index 0 + * \param dx stores the difference in the x axis position since the last poll + * \param dy stores the difference in the y axis position since the last poll + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumBalls + */ +extern DECLSPEC int SDLCALL SDL_JoystickGetBall(SDL_Joystick *joystick, + int ball, int *dx, int *dy); + +/** + * Get the current state of a button on a joystick. + * + * \param joystick an SDL_Joystick structure containing joystick information + * \param button the button index to get the state from; indices start at + * index 0 + * \returns 1 if the specified button is pressed, 0 otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickNumButtons + */ +extern DECLSPEC Uint8 SDLCALL SDL_JoystickGetButton(SDL_Joystick *joystick, + int button); + +/** + * Start a rumble effect. + * + * Each call to this function cancels any previous rumble effect, and calling + * it with 0 intensity stops any rumbling. + * + * \param joystick The joystick to vibrate + * \param low_frequency_rumble The intensity of the low frequency (left) + * rumble motor, from 0 to 0xFFFF + * \param high_frequency_rumble The intensity of the high frequency (right) + * rumble motor, from 0 to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if rumble isn't supported on this joystick + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_JoystickHasRumble + */ +extern DECLSPEC int SDLCALL SDL_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms); + +/** + * Start a rumble effect in the joystick's triggers + * + * Each call to this function cancels any previous trigger rumble effect, and + * calling it with 0 intensity stops any rumbling. + * + * Note that this is rumbling of the _triggers_ and not the game controller as + * a whole. This is currently only supported on Xbox One controllers. If you + * want the (more common) whole-controller rumble, use SDL_JoystickRumble() + * instead. + * + * \param joystick The joystick to vibrate + * \param left_rumble The intensity of the left trigger rumble motor, from 0 + * to 0xFFFF + * \param right_rumble The intensity of the right trigger rumble motor, from 0 + * to 0xFFFF + * \param duration_ms The duration of the rumble effect, in milliseconds + * \returns 0, or -1 if trigger rumble isn't supported on this joystick + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_JoystickHasRumbleTriggers + */ +extern DECLSPEC int SDLCALL SDL_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 right_rumble, Uint32 duration_ms); + +/** + * Query whether a joystick has an LED. + * + * An example of a joystick LED is the light on the back of a PlayStation 4's + * DualShock 4 controller. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has a modifiable LED, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasLED(SDL_Joystick *joystick); + +/** + * Query whether a joystick has rumble support. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has rumble, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_JoystickRumble + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasRumble(SDL_Joystick *joystick); + +/** + * Query whether a joystick has rumble support on triggers. + * + * \param joystick The joystick to query + * \return SDL_TRUE if the joystick has trigger rumble, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_JoystickRumbleTriggers + */ +extern DECLSPEC SDL_bool SDLCALL SDL_JoystickHasRumbleTriggers(SDL_Joystick *joystick); + +/** + * Update a joystick's LED color. + * + * An example of a joystick LED is the light on the back of a PlayStation 4's + * DualShock 4 controller. + * + * \param joystick The joystick to update + * \param red The intensity of the red LED + * \param green The intensity of the green LED + * \param blue The intensity of the blue LED + * \returns 0 on success, -1 if this joystick does not have a modifiable LED + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSetLED(SDL_Joystick *joystick, Uint8 red, Uint8 green, Uint8 blue); + +/** + * Send a joystick specific effect packet + * + * \param joystick The joystick to affect + * \param data The data to send to the joystick + * \param size The size of the data to send to the joystick + * \returns 0, or -1 if this joystick or driver doesn't support effect packets + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_JoystickSendEffect(SDL_Joystick *joystick, const void *data, int size); + +/** + * Close a joystick previously opened with SDL_JoystickOpen(). + * + * \param joystick The joystick device to close + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_JoystickOpen + */ +extern DECLSPEC void SDLCALL SDL_JoystickClose(SDL_Joystick *joystick); + +/** + * Get the battery level of a joystick as SDL_JoystickPowerLevel. + * + * \param joystick the SDL_Joystick to query + * \returns the current battery level as SDL_JoystickPowerLevel on success or + * `SDL_JOYSTICK_POWER_UNKNOWN` if it is unknown + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC SDL_JoystickPowerLevel SDLCALL SDL_JoystickCurrentPowerLevel(SDL_Joystick *joystick); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_joystick_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_keyboard.h b/include/SDL/SDL_keyboard.h new file mode 100644 index 0000000..86a37ad --- /dev/null +++ b/include/SDL/SDL_keyboard.h @@ -0,0 +1,353 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_keyboard.h + * + * Include file for SDL keyboard event handling + */ + +#ifndef SDL_keyboard_h_ +#define SDL_keyboard_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_keycode.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The SDL keysym structure, used in key events. + * + * \note If you are looking for translated character input, see the ::SDL_TEXTINPUT event. + */ +typedef struct SDL_Keysym +{ + SDL_Scancode scancode; /**< SDL physical key code - see ::SDL_Scancode for details */ + SDL_Keycode sym; /**< SDL virtual key code - see ::SDL_Keycode for details */ + Uint16 mod; /**< current key modifiers */ + Uint32 unused; +} SDL_Keysym; + +/* Function prototypes */ + +/** + * Query the window which currently has keyboard focus. + * + * \returns the window with keyboard focus. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetKeyboardFocus(void); + +/** + * Get a snapshot of the current state of the keyboard. + * + * The pointer returned is a pointer to an internal SDL array. It will be + * valid for the whole lifetime of the application and should not be freed by + * the caller. + * + * A array element with a value of 1 means that the key is pressed and a value + * of 0 means that it is not. Indexes into this array are obtained by using + * SDL_Scancode values. + * + * Use SDL_PumpEvents() to update the state array. + * + * This function gives you the current state after all events have been + * processed, so if a key or button has been pressed and released before you + * process events, then the pressed state will never show up in the + * SDL_GetKeyboardState() calls. + * + * Note: This function doesn't take into account whether shift has been + * pressed or not. + * + * \param numkeys if non-NULL, receives the length of the returned array + * \returns a pointer to an array of key states. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PumpEvents + * \sa SDL_ResetKeyboard + */ +extern DECLSPEC const Uint8 *SDLCALL SDL_GetKeyboardState(int *numkeys); + +/** + * Clear the state of the keyboard + * + * This function will generate key up events for all pressed keys. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetKeyboardState + */ +extern DECLSPEC void SDLCALL SDL_ResetKeyboard(void); + +/** + * Get the current key modifier state for the keyboard. + * + * \returns an OR'd combination of the modifier keys for the keyboard. See + * SDL_Keymod for details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyboardState + * \sa SDL_SetModState + */ +extern DECLSPEC SDL_Keymod SDLCALL SDL_GetModState(void); + +/** + * Set the current key modifier state for the keyboard. + * + * The inverse of SDL_GetModState(), SDL_SetModState() allows you to impose + * modifier key states on your application. Simply pass your desired modifier + * states into `modstate`. This value may be a bitwise, OR'd combination of + * SDL_Keymod values. + * + * This does not change the keyboard state, only the key modifier flags that + * SDL reports. + * + * \param modstate the desired SDL_Keymod for the keyboard + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetModState + */ +extern DECLSPEC void SDLCALL SDL_SetModState(SDL_Keymod modstate); + +/** + * Get the key code corresponding to the given scancode according to the + * current keyboard layout. + * + * See SDL_Keycode for details. + * + * \param scancode the desired SDL_Scancode to query + * \returns the SDL_Keycode that corresponds to the given SDL_Scancode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyName + * \sa SDL_GetScancodeFromKey + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromScancode(SDL_Scancode scancode); + +/** + * Get the scancode corresponding to the given key code according to the + * current keyboard layout. + * + * See SDL_Scancode for details. + * + * \param key the desired SDL_Keycode to query + * \returns the SDL_Scancode that corresponds to the given SDL_Keycode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetScancodeName + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromKey(SDL_Keycode key); + +/** + * Get a human-readable name for a scancode. + * + * See SDL_Scancode for details. + * + * **Warning**: The returned name is by design not stable across platforms, + * e.g. the name for `SDL_SCANCODE_LGUI` is "Left GUI" under Linux but "Left + * Windows" under Microsoft Windows, and some scancodes like + * `SDL_SCANCODE_NONUSBACKSLASH` don't have any name at all. There are even + * scancodes that share names, e.g. `SDL_SCANCODE_RETURN` and + * `SDL_SCANCODE_RETURN2` (both called "Return"). This function is therefore + * unsuitable for creating a stable cross-platform two-way mapping between + * strings and scancodes. + * + * \param scancode the desired SDL_Scancode to query + * \returns a pointer to the name for the scancode. If the scancode doesn't + * have a name this function returns an empty string (""). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetScancodeFromKey + * \sa SDL_GetScancodeFromName + */ +extern DECLSPEC const char *SDLCALL SDL_GetScancodeName(SDL_Scancode scancode); + +/** + * Get a scancode from a human-readable name. + * + * \param name the human-readable scancode name + * \returns the SDL_Scancode, or `SDL_SCANCODE_UNKNOWN` if the name wasn't + * recognized; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromName + * \sa SDL_GetScancodeFromKey + * \sa SDL_GetScancodeName + */ +extern DECLSPEC SDL_Scancode SDLCALL SDL_GetScancodeFromName(const char *name); + +/** + * Get a human-readable name for a key. + * + * See SDL_Scancode and SDL_Keycode for details. + * + * \param key the desired SDL_Keycode to query + * \returns a pointer to a UTF-8 string that stays valid at least until the + * next call to this function. If you need it around any longer, you + * must copy it. If the key doesn't have a name, this function + * returns an empty string (""). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromName + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetScancodeFromKey + */ +extern DECLSPEC const char *SDLCALL SDL_GetKeyName(SDL_Keycode key); + +/** + * Get a key code from a human-readable name. + * + * \param name the human-readable key name + * \returns key code, or `SDLK_UNKNOWN` if the name wasn't recognized; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetKeyFromScancode + * \sa SDL_GetKeyName + * \sa SDL_GetScancodeFromName + */ +extern DECLSPEC SDL_Keycode SDLCALL SDL_GetKeyFromName(const char *name); + +/** + * Start accepting Unicode text input events. + * + * This function will start accepting Unicode text input events in the focused + * SDL window, and start emitting SDL_TextInputEvent (SDL_TEXTINPUT) and + * SDL_TextEditingEvent (SDL_TEXTEDITING) events. Please use this function in + * pair with SDL_StopTextInput(). + * + * On some platforms using this function activates the screen keyboard. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetTextInputRect + * \sa SDL_StopTextInput + */ +extern DECLSPEC void SDLCALL SDL_StartTextInput(void); + +/** + * Check whether or not Unicode text input events are enabled. + * + * \returns SDL_TRUE if text input events are enabled else SDL_FALSE. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputActive(void); + +/** + * Stop receiving any text input events. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC void SDLCALL SDL_StopTextInput(void); + +/** + * Dismiss the composition window/IME without disabling the subsystem. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_StartTextInput + * \sa SDL_StopTextInput + */ +extern DECLSPEC void SDLCALL SDL_ClearComposition(void); + +/** + * Returns if an IME Composite or Candidate window is currently shown. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTextInputShown(void); + +/** + * Set the rectangle used to type Unicode text inputs. + * + * To start text input in a given location, this function is intended to be + * called before SDL_StartTextInput, although some platforms support moving + * the rectangle even while text input (and a composition) is active. + * + * Note: If you want to use the system native IME window, try setting hint + * **SDL_HINT_IME_SHOW_UI** to **1**, otherwise this function won't give you + * any feedback. + * + * \param rect the SDL_Rect structure representing the rectangle to receive + * text (ignored if NULL) + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + */ +extern DECLSPEC void SDLCALL SDL_SetTextInputRect(const SDL_Rect *rect); + +/** + * Check whether the platform has screen keyboard support. + * + * \returns SDL_TRUE if the platform has some screen keyboard support or + * SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_StartTextInput + * \sa SDL_IsScreenKeyboardShown + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasScreenKeyboardSupport(void); + +/** + * Check whether the screen keyboard is shown for given window. + * + * \param window the window for which screen keyboard should be queried + * \returns SDL_TRUE if screen keyboard is shown or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasScreenKeyboardSupport + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenKeyboardShown(SDL_Window *window); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_keyboard_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_keycode.h b/include/SDL/SDL_keycode.h new file mode 100644 index 0000000..2523506 --- /dev/null +++ b/include/SDL/SDL_keycode.h @@ -0,0 +1,358 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_keycode.h + * + * Defines constants which identify keyboard keys and modifiers. + */ + +#ifndef SDL_keycode_h_ +#define SDL_keycode_h_ + +#include "SDL_stdinc.h" +#include "SDL_scancode.h" + +/** + * \brief The SDL virtual key representation. + * + * Values of this type are used to represent keyboard keys using the current + * layout of the keyboard. These values include Unicode values representing + * the unmodified character that would be generated by pressing the key, or + * an SDLK_* constant for those keys that do not generate characters. + * + * A special exception is the number keys at the top of the keyboard which + * always map to SDLK_0...SDLK_9, regardless of layout. + */ +typedef Sint32 SDL_Keycode; + +#define SDLK_SCANCODE_MASK (1<<30) +#define SDL_SCANCODE_TO_KEYCODE(X) (X | SDLK_SCANCODE_MASK) + +typedef enum +{ + SDLK_UNKNOWN = 0, + + SDLK_RETURN = '\r', + SDLK_ESCAPE = '\x1B', + SDLK_BACKSPACE = '\b', + SDLK_TAB = '\t', + SDLK_SPACE = ' ', + SDLK_EXCLAIM = '!', + SDLK_QUOTEDBL = '"', + SDLK_HASH = '#', + SDLK_PERCENT = '%', + SDLK_DOLLAR = '$', + SDLK_AMPERSAND = '&', + SDLK_QUOTE = '\'', + SDLK_LEFTPAREN = '(', + SDLK_RIGHTPAREN = ')', + SDLK_ASTERISK = '*', + SDLK_PLUS = '+', + SDLK_COMMA = ',', + SDLK_MINUS = '-', + SDLK_PERIOD = '.', + SDLK_SLASH = '/', + SDLK_0 = '0', + SDLK_1 = '1', + SDLK_2 = '2', + SDLK_3 = '3', + SDLK_4 = '4', + SDLK_5 = '5', + SDLK_6 = '6', + SDLK_7 = '7', + SDLK_8 = '8', + SDLK_9 = '9', + SDLK_COLON = ':', + SDLK_SEMICOLON = ';', + SDLK_LESS = '<', + SDLK_EQUALS = '=', + SDLK_GREATER = '>', + SDLK_QUESTION = '?', + SDLK_AT = '@', + + /* + Skip uppercase letters + */ + + SDLK_LEFTBRACKET = '[', + SDLK_BACKSLASH = '\\', + SDLK_RIGHTBRACKET = ']', + SDLK_CARET = '^', + SDLK_UNDERSCORE = '_', + SDLK_BACKQUOTE = '`', + SDLK_a = 'a', + SDLK_b = 'b', + SDLK_c = 'c', + SDLK_d = 'd', + SDLK_e = 'e', + SDLK_f = 'f', + SDLK_g = 'g', + SDLK_h = 'h', + SDLK_i = 'i', + SDLK_j = 'j', + SDLK_k = 'k', + SDLK_l = 'l', + SDLK_m = 'm', + SDLK_n = 'n', + SDLK_o = 'o', + SDLK_p = 'p', + SDLK_q = 'q', + SDLK_r = 'r', + SDLK_s = 's', + SDLK_t = 't', + SDLK_u = 'u', + SDLK_v = 'v', + SDLK_w = 'w', + SDLK_x = 'x', + SDLK_y = 'y', + SDLK_z = 'z', + + SDLK_CAPSLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK), + + SDLK_F1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1), + SDLK_F2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2), + SDLK_F3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3), + SDLK_F4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4), + SDLK_F5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5), + SDLK_F6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6), + SDLK_F7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7), + SDLK_F8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8), + SDLK_F9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9), + SDLK_F10 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10), + SDLK_F11 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11), + SDLK_F12 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12), + + SDLK_PRINTSCREEN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN), + SDLK_SCROLLLOCK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK), + SDLK_PAUSE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE), + SDLK_INSERT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT), + SDLK_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME), + SDLK_PAGEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP), + SDLK_DELETE = '\x7F', + SDLK_END = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END), + SDLK_PAGEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN), + SDLK_RIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT), + SDLK_LEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT), + SDLK_DOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN), + SDLK_UP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP), + + SDLK_NUMLOCKCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR), + SDLK_KP_DIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE), + SDLK_KP_MULTIPLY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY), + SDLK_KP_MINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS), + SDLK_KP_PLUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS), + SDLK_KP_ENTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER), + SDLK_KP_1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1), + SDLK_KP_2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2), + SDLK_KP_3 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3), + SDLK_KP_4 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4), + SDLK_KP_5 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5), + SDLK_KP_6 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6), + SDLK_KP_7 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7), + SDLK_KP_8 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8), + SDLK_KP_9 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9), + SDLK_KP_0 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0), + SDLK_KP_PERIOD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD), + + SDLK_APPLICATION = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION), + SDLK_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER), + SDLK_KP_EQUALS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS), + SDLK_F13 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13), + SDLK_F14 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14), + SDLK_F15 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15), + SDLK_F16 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16), + SDLK_F17 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17), + SDLK_F18 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18), + SDLK_F19 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19), + SDLK_F20 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20), + SDLK_F21 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21), + SDLK_F22 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22), + SDLK_F23 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23), + SDLK_F24 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24), + SDLK_EXECUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE), + SDLK_HELP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP), + SDLK_MENU = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU), + SDLK_SELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT), + SDLK_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP), + SDLK_AGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN), + SDLK_UNDO = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO), + SDLK_CUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT), + SDLK_COPY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY), + SDLK_PASTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE), + SDLK_FIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND), + SDLK_MUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE), + SDLK_VOLUMEUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP), + SDLK_VOLUMEDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN), + SDLK_KP_COMMA = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA), + SDLK_KP_EQUALSAS400 = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400), + + SDLK_ALTERASE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE), + SDLK_SYSREQ = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ), + SDLK_CANCEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL), + SDLK_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR), + SDLK_PRIOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR), + SDLK_RETURN2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2), + SDLK_SEPARATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR), + SDLK_OUT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT), + SDLK_OPER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER), + SDLK_CLEARAGAIN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN), + SDLK_CRSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL), + SDLK_EXSEL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL), + + SDLK_KP_00 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00), + SDLK_KP_000 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000), + SDLK_THOUSANDSSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR), + SDLK_DECIMALSEPARATOR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR), + SDLK_CURRENCYUNIT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT), + SDLK_CURRENCYSUBUNIT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT), + SDLK_KP_LEFTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN), + SDLK_KP_RIGHTPAREN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN), + SDLK_KP_LEFTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE), + SDLK_KP_RIGHTBRACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE), + SDLK_KP_TAB = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB), + SDLK_KP_BACKSPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE), + SDLK_KP_A = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A), + SDLK_KP_B = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B), + SDLK_KP_C = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C), + SDLK_KP_D = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D), + SDLK_KP_E = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E), + SDLK_KP_F = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F), + SDLK_KP_XOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR), + SDLK_KP_POWER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER), + SDLK_KP_PERCENT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT), + SDLK_KP_LESS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS), + SDLK_KP_GREATER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER), + SDLK_KP_AMPERSAND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND), + SDLK_KP_DBLAMPERSAND = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND), + SDLK_KP_VERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR), + SDLK_KP_DBLVERTICALBAR = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR), + SDLK_KP_COLON = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON), + SDLK_KP_HASH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH), + SDLK_KP_SPACE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE), + SDLK_KP_AT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT), + SDLK_KP_EXCLAM = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM), + SDLK_KP_MEMSTORE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE), + SDLK_KP_MEMRECALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL), + SDLK_KP_MEMCLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR), + SDLK_KP_MEMADD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD), + SDLK_KP_MEMSUBTRACT = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT), + SDLK_KP_MEMMULTIPLY = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY), + SDLK_KP_MEMDIVIDE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE), + SDLK_KP_PLUSMINUS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS), + SDLK_KP_CLEAR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR), + SDLK_KP_CLEARENTRY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY), + SDLK_KP_BINARY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY), + SDLK_KP_OCTAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL), + SDLK_KP_DECIMAL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL), + SDLK_KP_HEXADECIMAL = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL), + + SDLK_LCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL), + SDLK_LSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT), + SDLK_LALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT), + SDLK_LGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI), + SDLK_RCTRL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL), + SDLK_RSHIFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT), + SDLK_RALT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT), + SDLK_RGUI = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI), + + SDLK_MODE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE), + + SDLK_AUDIONEXT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIONEXT), + SDLK_AUDIOPREV = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPREV), + SDLK_AUDIOSTOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOSTOP), + SDLK_AUDIOPLAY = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOPLAY), + SDLK_AUDIOMUTE = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOMUTE), + SDLK_MEDIASELECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIASELECT), + SDLK_WWW = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WWW), + SDLK_MAIL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MAIL), + SDLK_CALCULATOR = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALCULATOR), + SDLK_COMPUTER = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COMPUTER), + SDLK_AC_SEARCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH), + SDLK_AC_HOME = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME), + SDLK_AC_BACK = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK), + SDLK_AC_FORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD), + SDLK_AC_STOP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP), + SDLK_AC_REFRESH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH), + SDLK_AC_BOOKMARKS = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS), + + SDLK_BRIGHTNESSDOWN = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSDOWN), + SDLK_BRIGHTNESSUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_BRIGHTNESSUP), + SDLK_DISPLAYSWITCH = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DISPLAYSWITCH), + SDLK_KBDILLUMTOGGLE = + SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMTOGGLE), + SDLK_KBDILLUMDOWN = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMDOWN), + SDLK_KBDILLUMUP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KBDILLUMUP), + SDLK_EJECT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EJECT), + SDLK_SLEEP = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP), + SDLK_APP1 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP1), + SDLK_APP2 = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APP2), + + SDLK_AUDIOREWIND = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOREWIND), + SDLK_AUDIOFASTFORWARD = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AUDIOFASTFORWARD), + + SDLK_SOFTLEFT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT), + SDLK_SOFTRIGHT = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT), + SDLK_CALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL), + SDLK_ENDCALL = SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL) +} SDL_KeyCode; + +/** + * \brief Enumeration of valid key mods (possibly OR'd together). + */ +typedef enum +{ + KMOD_NONE = 0x0000, + KMOD_LSHIFT = 0x0001, + KMOD_RSHIFT = 0x0002, + KMOD_LCTRL = 0x0040, + KMOD_RCTRL = 0x0080, + KMOD_LALT = 0x0100, + KMOD_RALT = 0x0200, + KMOD_LGUI = 0x0400, + KMOD_RGUI = 0x0800, + KMOD_NUM = 0x1000, + KMOD_CAPS = 0x2000, + KMOD_MODE = 0x4000, + KMOD_SCROLL = 0x8000, + + KMOD_CTRL = KMOD_LCTRL | KMOD_RCTRL, + KMOD_SHIFT = KMOD_LSHIFT | KMOD_RSHIFT, + KMOD_ALT = KMOD_LALT | KMOD_RALT, + KMOD_GUI = KMOD_LGUI | KMOD_RGUI, + + KMOD_RESERVED = KMOD_SCROLL /* This is for source-level compatibility with SDL 2.0.0. */ +} SDL_Keymod; + +#endif /* SDL_keycode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_loadso.h b/include/SDL/SDL_loadso.h new file mode 100644 index 0000000..ca59b68 --- /dev/null +++ b/include/SDL/SDL_loadso.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_loadso.h + * + * System dependent library loading routines + * + * Some things to keep in mind: + * \li These functions only work on C function names. Other languages may + * have name mangling and intrinsic language support that varies from + * compiler to compiler. + * \li Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * \li Avoid namespace collisions. If you load a symbol from the library, + * it is not defined whether or not it goes into the global symbol + * namespace for the application. If it does and it conflicts with + * symbols in your code or other shared libraries, you will not get + * the results you expect. :) + */ + +#ifndef SDL_loadso_h_ +#define SDL_loadso_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Dynamically load a shared object. + * + * \param sofile a system-dependent name of the object file + * \returns an opaque pointer to the object handle or NULL if there was an + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadFunction + * \sa SDL_UnloadObject + */ +extern DECLSPEC void *SDLCALL SDL_LoadObject(const char *sofile); + +/** + * Look up the address of the named function in a shared object. + * + * This function pointer is no longer valid after calling SDL_UnloadObject(). + * + * This function can only look up C function names. Other languages may have + * name mangling and intrinsic language support that varies from compiler to + * compiler. + * + * Make sure you declare your function pointers with the same calling + * convention as the actual library function. Your code will crash + * mysteriously if you do not do this. + * + * If the requested function doesn't exist, NULL is returned. + * + * \param handle a valid shared object handle returned by SDL_LoadObject() + * \param name the name of the function to look up + * \returns a pointer to the function or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadObject + * \sa SDL_UnloadObject + */ +extern DECLSPEC void *SDLCALL SDL_LoadFunction(void *handle, + const char *name); + +/** + * Unload a shared object from memory. + * + * \param handle a valid shared object handle returned by SDL_LoadObject() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadFunction + * \sa SDL_LoadObject + */ +extern DECLSPEC void SDLCALL SDL_UnloadObject(void *handle); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_loadso_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_locale.h b/include/SDL/SDL_locale.h new file mode 100644 index 0000000..482dbef --- /dev/null +++ b/include/SDL/SDL_locale.h @@ -0,0 +1,103 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_locale.h + * + * Include file for SDL locale services + */ + +#ifndef _SDL_locale_h +#define _SDL_locale_h + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + + +typedef struct SDL_Locale +{ + const char *language; /**< A language name, like "en" for English. */ + const char *country; /**< A country, like "US" for America. Can be NULL. */ +} SDL_Locale; + +/** + * Report the user's preferred locale. + * + * This returns an array of SDL_Locale structs, the final item zeroed out. + * When the caller is done with this array, it should call SDL_free() on the + * returned value; all the memory involved is allocated in a single block, so + * a single SDL_free() will suffice. + * + * Returned language strings are in the format xx, where 'xx' is an ISO-639 + * language specifier (such as "en" for English, "de" for German, etc). + * Country strings are in the format YY, where "YY" is an ISO-3166 country + * code (such as "US" for the United States, "CA" for Canada, etc). Country + * might be NULL if there's no specific guidance on them (so you might get { + * "en", "US" } for American English, but { "en", NULL } means "English + * language, generically"). Language strings are never NULL, except to + * terminate the array. + * + * Please note that not all of these strings are 2 characters; some are three + * or more. + * + * The returned list of locales are in the order of the user's preference. For + * example, a German citizen that is fluent in US English and knows enough + * Japanese to navigate around Tokyo might have a list like: { "de", "en_US", + * "jp", NULL }. Someone from England might prefer British English (where + * "color" is spelled "colour", etc), but will settle for anything like it: { + * "en_GB", "en", NULL }. + * + * This function returns NULL on error, including when the platform does not + * supply this information at all. + * + * This might be a "slow" call that has to query the operating system. It's + * best to ask for this once and save the results. However, this list can + * change, usually because the user has changed a system preference outside of + * your program; SDL will send an SDL_LOCALECHANGED event in this case, if + * possible, and you can call this function again to get an updated copy of + * preferred locales. + * + * \return array of locales, terminated with a locale with a NULL language + * field. Will return NULL on error. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_Locale * SDLCALL SDL_GetPreferredLocales(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* _SDL_locale_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_log.h b/include/SDL/SDL_log.h new file mode 100644 index 0000000..da733c4 --- /dev/null +++ b/include/SDL/SDL_log.h @@ -0,0 +1,404 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_log.h + * + * Simple log messages with categories and priorities. + * + * By default logs are quiet, but if you're debugging SDL you might want: + * + * SDL_LogSetAllPriority(SDL_LOG_PRIORITY_WARN); + * + * Here's where the messages go on different platforms: + * Windows: debug output stream + * Android: log output + * Others: standard error output (stderr) + */ + +#ifndef SDL_log_h_ +#define SDL_log_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief The maximum size of a log message prior to SDL 2.0.24 + * + * As of 2.0.24 there is no limit to the length of SDL log messages. + */ +#define SDL_MAX_LOG_MESSAGE 4096 + +/** + * \brief The predefined log categories + * + * By default the application category is enabled at the INFO level, + * the assert category is enabled at the WARN level, test is enabled + * at the VERBOSE level and all other categories are enabled at the + * CRITICAL level. + */ +typedef enum +{ + SDL_LOG_CATEGORY_APPLICATION, + SDL_LOG_CATEGORY_ERROR, + SDL_LOG_CATEGORY_ASSERT, + SDL_LOG_CATEGORY_SYSTEM, + SDL_LOG_CATEGORY_AUDIO, + SDL_LOG_CATEGORY_VIDEO, + SDL_LOG_CATEGORY_RENDER, + SDL_LOG_CATEGORY_INPUT, + SDL_LOG_CATEGORY_TEST, + + /* Reserved for future SDL library use */ + SDL_LOG_CATEGORY_RESERVED1, + SDL_LOG_CATEGORY_RESERVED2, + SDL_LOG_CATEGORY_RESERVED3, + SDL_LOG_CATEGORY_RESERVED4, + SDL_LOG_CATEGORY_RESERVED5, + SDL_LOG_CATEGORY_RESERVED6, + SDL_LOG_CATEGORY_RESERVED7, + SDL_LOG_CATEGORY_RESERVED8, + SDL_LOG_CATEGORY_RESERVED9, + SDL_LOG_CATEGORY_RESERVED10, + + /* Beyond this point is reserved for application use, e.g. + enum { + MYAPP_CATEGORY_AWESOME1 = SDL_LOG_CATEGORY_CUSTOM, + MYAPP_CATEGORY_AWESOME2, + MYAPP_CATEGORY_AWESOME3, + ... + }; + */ + SDL_LOG_CATEGORY_CUSTOM +} SDL_LogCategory; + +/** + * \brief The predefined log priorities + */ +typedef enum +{ + SDL_LOG_PRIORITY_VERBOSE = 1, + SDL_LOG_PRIORITY_DEBUG, + SDL_LOG_PRIORITY_INFO, + SDL_LOG_PRIORITY_WARN, + SDL_LOG_PRIORITY_ERROR, + SDL_LOG_PRIORITY_CRITICAL, + SDL_NUM_LOG_PRIORITIES +} SDL_LogPriority; + + +/** + * Set the priority of all log categories. + * + * \param priority the SDL_LogPriority to assign + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetPriority + */ +extern DECLSPEC void SDLCALL SDL_LogSetAllPriority(SDL_LogPriority priority); + +/** + * Set the priority of a particular log category. + * + * \param category the category to assign a priority to + * \param priority the SDL_LogPriority to assign + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogGetPriority + * \sa SDL_LogSetAllPriority + */ +extern DECLSPEC void SDLCALL SDL_LogSetPriority(int category, + SDL_LogPriority priority); + +/** + * Get the priority of a particular log category. + * + * \param category the category to query + * \returns the SDL_LogPriority for the requested category + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetPriority + */ +extern DECLSPEC SDL_LogPriority SDLCALL SDL_LogGetPriority(int category); + +/** + * Reset all priorities to default. + * + * This is called by SDL_Quit(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetAllPriority + * \sa SDL_LogSetPriority + */ +extern DECLSPEC void SDLCALL SDL_LogResetPriorities(void); + +/** + * Log a message with SDL_LOG_CATEGORY_APPLICATION and SDL_LOG_PRIORITY_INFO. + * + * = * \param fmt a printf() style message format string + * + * \param ... additional parameters matching % tokens in the `fmt` string, if + * any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * Log a message with SDL_LOG_PRIORITY_VERBOSE. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogVerbose(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_DEBUG. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogDebug(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_INFO. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogInfo(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_WARN. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + */ +extern DECLSPEC void SDLCALL SDL_LogWarn(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_ERROR. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogError(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with SDL_LOG_PRIORITY_CRITICAL. + * + * \param category the category of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogCritical(int category, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * Log a message with the specified category and priority. + * + * \param category the category of the message + * \param priority the priority of the message + * \param fmt a printf() style message format string + * \param ... additional parameters matching % tokens in the **fmt** string, + * if any + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessageV + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogMessage(int category, + SDL_LogPriority priority, + SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(3); + +/** + * Log a message with the specified category and priority. + * + * \param category the category of the message + * \param priority the priority of the message + * \param fmt a printf() style message format string + * \param ap a variable argument list + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Log + * \sa SDL_LogCritical + * \sa SDL_LogDebug + * \sa SDL_LogError + * \sa SDL_LogInfo + * \sa SDL_LogMessage + * \sa SDL_LogVerbose + * \sa SDL_LogWarn + */ +extern DECLSPEC void SDLCALL SDL_LogMessageV(int category, + SDL_LogPriority priority, + const char *fmt, va_list ap); + +/** + * The prototype for the log output callback function. + * + * This function is called by SDL when there is new text to be logged. + * + * \param userdata what was passed as `userdata` to SDL_LogSetOutputFunction() + * \param category the category of the message + * \param priority the priority of the message + * \param message the message being output + */ +typedef void (SDLCALL *SDL_LogOutputFunction)(void *userdata, int category, SDL_LogPriority priority, const char *message); + +/** + * Get the current log output function. + * + * \param callback an SDL_LogOutputFunction filled in with the current log + * callback + * \param userdata a pointer filled in with the pointer that is passed to + * `callback` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogSetOutputFunction + */ +extern DECLSPEC void SDLCALL SDL_LogGetOutputFunction(SDL_LogOutputFunction *callback, void **userdata); + +/** + * Replace the default log output function with one of your own. + * + * \param callback an SDL_LogOutputFunction to call instead of the default + * \param userdata a pointer that is passed to `callback` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LogGetOutputFunction + */ +extern DECLSPEC void SDLCALL SDL_LogSetOutputFunction(SDL_LogOutputFunction callback, void *userdata); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_log_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_main.h b/include/SDL/SDL_main.h new file mode 100644 index 0000000..14d39f1 --- /dev/null +++ b/include/SDL/SDL_main.h @@ -0,0 +1,275 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_main_h_ +#define SDL_main_h_ + +#include "SDL_stdinc.h" + +/** + * \file SDL_main.h + * + * Redefine main() on some platforms so that it is called by SDL. + */ + +#ifndef SDL_MAIN_HANDLED +#if defined(__WIN32__) +/* On Windows SDL provides WinMain(), which parses the command line and passes + the arguments to your main function. + + If you provide your own WinMain(), you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__WINRT__) +/* On WinRT, SDL provides a main function that initializes CoreApplication, + creating an instance of IFrameworkView in the process. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. In non-XAML apps, the file, + src/main/winrt/SDL_WinRT_main_NonXAML.cpp, or a copy of it, must be compiled + into the app itself. In XAML apps, the function, SDL_WinRTRunApp must be + called, with a pointer to the Direct3D-hosted XAML control passed in. +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__GDK__) +/* On GDK, SDL provides a main function that initializes the game runtime. + + Please note that #include'ing SDL_main.h is not enough to get a main() + function working. You must either link against SDL2main or, if not possible, + call the SDL_GDKRunApp function from your entry point. +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__IPHONEOS__) +/* On iOS SDL provides a main function that creates an application delegate + and starts the iOS application run loop. + + If you link with SDL dynamically on iOS, the main function can't be in a + shared library, so you need to link with libSDLmain.a, which includes a + stub main function that calls into the shared library to start execution. + + See src/video/uikit/SDL_uikitappdelegate.m for more details. + */ +#define SDL_MAIN_NEEDED + +#elif defined(__ANDROID__) +/* On Android SDL provides a Java class in SDLActivity.java that is the + main activity entry point. + + See docs/README-android.md for more details on extending that class. + */ +#define SDL_MAIN_NEEDED + +/* We need to export SDL_main so it can be launched from Java */ +#define SDLMAIN_DECLSPEC DECLSPEC + +#elif defined(__NACL__) +/* On NACL we use ppapi_simple to set up the application helper code, + then wait for the first PSE_INSTANCE_DIDCHANGEVIEW event before + starting the user main function. + All user code is run in a separate thread by ppapi_simple, thus + allowing for blocking io to take place via nacl_io +*/ +#define SDL_MAIN_NEEDED + +#elif defined(__PSP__) +/* On PSP SDL provides a main function that sets the module info, + activates the GPU and starts the thread required to be able to exit + the software. + + If you provide this yourself, you may define SDL_MAIN_HANDLED + */ +#define SDL_MAIN_AVAILABLE + +#elif defined(__PS2__) +#define SDL_MAIN_AVAILABLE + +#define SDL_PS2_SKIP_IOP_RESET() \ + void reset_IOP(); \ + void reset_IOP() {} + +#elif defined(__3DS__) +/* + On N3DS, SDL provides a main function that sets up the screens + and storage. + + If you provide this yourself, you may define SDL_MAIN_HANDLED +*/ +#define SDL_MAIN_AVAILABLE + +#endif +#endif /* SDL_MAIN_HANDLED */ + +#ifndef SDLMAIN_DECLSPEC +#define SDLMAIN_DECLSPEC +#endif + +/** + * \file SDL_main.h + * + * The application's main() function must be called with C linkage, + * and should be declared like this: + * \code + * #ifdef __cplusplus + * extern "C" + * #endif + * int main(int argc, char *argv[]) + * { + * } + * \endcode + */ + +#if defined(SDL_MAIN_NEEDED) || defined(SDL_MAIN_AVAILABLE) +#define main SDL_main +#endif + +#include "begin_code.h" +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The prototype for the application's main() function + */ +typedef int (*SDL_main_func)(int argc, char *argv[]); +extern SDLMAIN_DECLSPEC int SDL_main(int argc, char *argv[]); + + +/** + * Circumvent failure of SDL_Init() when not using SDL_main() as an entry + * point. + * + * This function is defined in SDL_main.h, along with the preprocessor rule to + * redefine main() as SDL_main(). Thus to ensure that your main() function + * will not be changed it is necessary to define SDL_MAIN_HANDLED before + * including SDL.h. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_Init + */ +extern DECLSPEC void SDLCALL SDL_SetMainReady(void); + +#if defined(__WIN32__) || defined(__GDK__) + +/** + * Register a win32 window class for SDL's use. + * + * This can be called to set the application window class at startup. It is + * safe to call this multiple times, as long as every call is eventually + * paired with a call to SDL_UnregisterApp, but a second registration attempt + * while a previous registration is still active will be ignored, other than + * to increment a counter. + * + * Most applications do not need to, and should not, call this directly; SDL + * will call it when initializing the video subsystem. + * + * \param name the window class name, in UTF-8 encoding. If NULL, SDL + * currently uses "SDL_app" but this isn't guaranteed. + * \param style the value to use in WNDCLASSEX::style. If `name` is NULL, SDL + * currently uses `(CS_BYTEALIGNCLIENT | CS_OWNDC)` regardless of + * what is specified here. + * \param hInst the HINSTANCE to use in WNDCLASSEX::hInstance. If zero, SDL + * will use `GetModuleHandle(NULL)` instead. + * \returns 0 on success, -1 on error. SDL_GetError() may have details. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC int SDLCALL SDL_RegisterApp(const char *name, Uint32 style, void *hInst); + +/** + * Deregister the win32 window class from an SDL_RegisterApp call. + * + * This can be called to undo the effects of SDL_RegisterApp. + * + * Most applications do not need to, and should not, call this directly; SDL + * will call it when deinitializing the video subsystem. + * + * It is safe to call this multiple times, as long as every call is eventually + * paired with a prior call to SDL_RegisterApp. The window class will only be + * deregistered when the registration counter in SDL_RegisterApp decrements to + * zero through calls to this function. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC void SDLCALL SDL_UnregisterApp(void); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + + +#ifdef __WINRT__ + +/** + * Initialize and launch an SDL/WinRT application. + * + * \param mainFunction the SDL app's C-style main(), an SDL_main_func + * \param reserved reserved for future use; should be NULL + * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve + * more information on the failure. + * + * \since This function is available since SDL 2.0.3. + */ +extern DECLSPEC int SDLCALL SDL_WinRTRunApp(SDL_main_func mainFunction, void * reserved); + +#endif /* __WINRT__ */ + +#if defined(__IPHONEOS__) + +/** + * Initializes and launches an SDL application. + * + * \param argc The argc parameter from the application's main() function + * \param argv The argv parameter from the application's main() function + * \param mainFunction The SDL app's C-style main(), an SDL_main_func + * \return the return value from mainFunction + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_UIKitRunApp(int argc, char *argv[], SDL_main_func mainFunction); + +#endif /* __IPHONEOS__ */ + +#ifdef __GDK__ + +/** + * Initialize and launch an SDL GDK application. + * + * \param mainFunction the SDL app's C-style main(), an SDL_main_func + * \param reserved reserved for future use; should be NULL + * \returns 0 on success or -1 on failure; call SDL_GetError() to retrieve + * more information on the failure. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_GDKRunApp(SDL_main_func mainFunction, void *reserved); + +#endif /* __GDK__ */ + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_main_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_messagebox.h b/include/SDL/SDL_messagebox.h new file mode 100644 index 0000000..7896fd1 --- /dev/null +++ b/include/SDL/SDL_messagebox.h @@ -0,0 +1,193 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_messagebox_h_ +#define SDL_messagebox_h_ + +#include "SDL_stdinc.h" +#include "SDL_video.h" /* For SDL_Window */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * SDL_MessageBox flags. If supported will display warning icon, etc. + */ +typedef enum +{ + SDL_MESSAGEBOX_ERROR = 0x00000010, /**< error dialog */ + SDL_MESSAGEBOX_WARNING = 0x00000020, /**< warning dialog */ + SDL_MESSAGEBOX_INFORMATION = 0x00000040, /**< informational dialog */ + SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT = 0x00000080, /**< buttons placed left to right */ + SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT = 0x00000100 /**< buttons placed right to left */ +} SDL_MessageBoxFlags; + +/** + * Flags for SDL_MessageBoxButtonData. + */ +typedef enum +{ + SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = 0x00000001, /**< Marks the default button when return is hit */ + SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = 0x00000002 /**< Marks the default button when escape is hit */ +} SDL_MessageBoxButtonFlags; + +/** + * Individual button data. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxButtonFlags */ + int buttonid; /**< User defined button id (value returned via SDL_ShowMessageBox) */ + const char * text; /**< The UTF-8 button text */ +} SDL_MessageBoxButtonData; + +/** + * RGB value used in a message box color scheme + */ +typedef struct +{ + Uint8 r, g, b; +} SDL_MessageBoxColor; + +typedef enum +{ + SDL_MESSAGEBOX_COLOR_BACKGROUND, + SDL_MESSAGEBOX_COLOR_TEXT, + SDL_MESSAGEBOX_COLOR_BUTTON_BORDER, + SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND, + SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED, + SDL_MESSAGEBOX_COLOR_MAX +} SDL_MessageBoxColorType; + +/** + * A set of colors to use for message box dialogs + */ +typedef struct +{ + SDL_MessageBoxColor colors[SDL_MESSAGEBOX_COLOR_MAX]; +} SDL_MessageBoxColorScheme; + +/** + * MessageBox structure containing title, text, window, etc. + */ +typedef struct +{ + Uint32 flags; /**< ::SDL_MessageBoxFlags */ + SDL_Window *window; /**< Parent window, can be NULL */ + const char *title; /**< UTF-8 title */ + const char *message; /**< UTF-8 message text */ + + int numbuttons; + const SDL_MessageBoxButtonData *buttons; + + const SDL_MessageBoxColorScheme *colorScheme; /**< ::SDL_MessageBoxColorScheme, can be NULL to use system settings */ +} SDL_MessageBoxData; + +/** + * Create a modal message box. + * + * If your needs aren't complex, it might be easier to use + * SDL_ShowSimpleMessageBox. + * + * This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or closes the + * messagebox. + * + * This function may be called at any time, even before SDL_Init(). This makes + * it useful for reporting errors like a failure to create a renderer or + * OpenGL context. + * + * On X11, SDL rolls its own dialog box with X11 primitives instead of a + * formal toolkit like GTK+ or Qt. + * + * Note that if SDL_Init() would fail because there isn't any available video + * target, this function is likely to fail for the same reasons. If this is a + * concern, check the return value from this function and fall back to writing + * to stderr if you can. + * + * \param messageboxdata the SDL_MessageBoxData structure with title, text and + * other options + * \param buttonid the pointer to which user id of hit button should be copied + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowSimpleMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid); + +/** + * Display a simple modal message box. + * + * If your needs aren't complex, this function is preferred over + * SDL_ShowMessageBox. + * + * `flags` may be any of the following: + * + * - `SDL_MESSAGEBOX_ERROR`: error dialog + * - `SDL_MESSAGEBOX_WARNING`: warning dialog + * - `SDL_MESSAGEBOX_INFORMATION`: informational dialog + * + * This function should be called on the thread that created the parent + * window, or on the main thread if the messagebox has no parent. It will + * block execution of that thread until the user clicks a button or closes the + * messagebox. + * + * This function may be called at any time, even before SDL_Init(). This makes + * it useful for reporting errors like a failure to create a renderer or + * OpenGL context. + * + * On X11, SDL rolls its own dialog box with X11 primitives instead of a + * formal toolkit like GTK+ or Qt. + * + * Note that if SDL_Init() would fail because there isn't any available video + * target, this function is likely to fail for the same reasons. If this is a + * concern, check the return value from this function and fall back to writing + * to stderr if you can. + * + * \param flags an SDL_MessageBoxFlags value + * \param title UTF-8 title text + * \param message UTF-8 message text + * \param window the parent window, or NULL for no parent + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowMessageBox + */ +extern DECLSPEC int SDLCALL SDL_ShowSimpleMessageBox(Uint32 flags, const char *title, const char *message, SDL_Window *window); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_messagebox_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_metal.h b/include/SDL/SDL_metal.h new file mode 100644 index 0000000..f36e348 --- /dev/null +++ b/include/SDL/SDL_metal.h @@ -0,0 +1,113 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_metal.h + * + * Header file for functions to creating Metal layers and views on SDL windows. + */ + +#ifndef SDL_metal_h_ +#define SDL_metal_h_ + +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS/tvOS). + * + * \note This can be cast directly to an NSView or UIView. + */ +typedef void *SDL_MetalView; + +/** + * \name Metal support functions + */ +/* @{ */ + +/** + * Create a CAMetalLayer-backed NSView/UIView and attach it to the specified + * window. + * + * On macOS, this does *not* associate a MTLDevice with the CAMetalLayer on + * its own. It is up to user code to do that. + * + * The returned handle can be casted directly to a NSView or UIView. To access + * the backing CAMetalLayer, call SDL_Metal_GetLayer(). + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_Metal_DestroyView + * \sa SDL_Metal_GetLayer + */ +extern DECLSPEC SDL_MetalView SDLCALL SDL_Metal_CreateView(SDL_Window * window); + +/** + * Destroy an existing SDL_MetalView object. + * + * This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was + * called after SDL_CreateWindow. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_Metal_CreateView + */ +extern DECLSPEC void SDLCALL SDL_Metal_DestroyView(SDL_MetalView view); + +/** + * Get a pointer to the backing CAMetalLayer for the given view. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_Metal_CreateView + */ +extern DECLSPEC void *SDLCALL SDL_Metal_GetLayer(SDL_MetalView view); + +/** + * Get the size of a window's underlying drawable in pixels (for use with + * setting viewport, scissor & etc). + * + * \param window SDL_Window from which the drawable size should be queried + * \param w Pointer to variable for storing the width in pixels, may be NULL + * \param h Pointer to variable for storing the height in pixels, may be NULL + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_GetWindowSize + * \sa SDL_CreateWindow + */ +extern DECLSPEC void SDLCALL SDL_Metal_GetDrawableSize(SDL_Window* window, int *w, + int *h); + +/* @} *//* Metal support functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_metal_h_ */ diff --git a/include/SDL/SDL_misc.h b/include/SDL/SDL_misc.h new file mode 100644 index 0000000..13ed9c7 --- /dev/null +++ b/include/SDL/SDL_misc.h @@ -0,0 +1,79 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_misc.h + * + * \brief Include file for SDL API functions that don't fit elsewhere. + */ + +#ifndef SDL_misc_h_ +#define SDL_misc_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" + +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Open a URL/URI in the browser or other appropriate external application. + * + * Open a URL in a separate, system-provided application. How this works will + * vary wildly depending on the platform. This will likely launch what makes + * sense to handle a specific URL's protocol (a web browser for `http://`, + * etc), but it might also be able to launch file managers for directories and + * other things. + * + * What happens when you open a URL varies wildly as well: your game window + * may lose focus (and may or may not lose focus if your game was fullscreen + * or grabbing input at the time). On mobile devices, your app will likely + * move to the background or your process might be paused. Any given platform + * may or may not handle a given URL. + * + * If this is unimplemented (or simply unavailable) for a platform, this will + * fail with an error. A successful result does not mean the URL loaded, just + * that we launched _something_ to handle it (or at least believe we did). + * + * All this to say: this function can be useful, but you should definitely + * test it on every platform you target. + * + * \param url A valid URL/URI to open. Use `file:///full/path/to/file` for + * local files, if supported. + * \returns 0 on success, or -1 on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC int SDLCALL SDL_OpenURL(const char *url); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_misc_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_mouse.h b/include/SDL/SDL_mouse.h new file mode 100644 index 0000000..c5712ef --- /dev/null +++ b/include/SDL/SDL_mouse.h @@ -0,0 +1,465 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_mouse.h + * + * Include file for SDL mouse event handling. + */ + +#ifndef SDL_mouse_h_ +#define SDL_mouse_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct SDL_Cursor SDL_Cursor; /**< Implementation dependent */ + +/** + * \brief Cursor types for SDL_CreateSystemCursor(). + */ +typedef enum +{ + SDL_SYSTEM_CURSOR_ARROW, /**< Arrow */ + SDL_SYSTEM_CURSOR_IBEAM, /**< I-beam */ + SDL_SYSTEM_CURSOR_WAIT, /**< Wait */ + SDL_SYSTEM_CURSOR_CROSSHAIR, /**< Crosshair */ + SDL_SYSTEM_CURSOR_WAITARROW, /**< Small wait cursor (or Wait if not available) */ + SDL_SYSTEM_CURSOR_SIZENWSE, /**< Double arrow pointing northwest and southeast */ + SDL_SYSTEM_CURSOR_SIZENESW, /**< Double arrow pointing northeast and southwest */ + SDL_SYSTEM_CURSOR_SIZEWE, /**< Double arrow pointing west and east */ + SDL_SYSTEM_CURSOR_SIZENS, /**< Double arrow pointing north and south */ + SDL_SYSTEM_CURSOR_SIZEALL, /**< Four pointed arrow pointing north, south, east, and west */ + SDL_SYSTEM_CURSOR_NO, /**< Slashed circle or crossbones */ + SDL_SYSTEM_CURSOR_HAND, /**< Hand */ + SDL_NUM_SYSTEM_CURSORS +} SDL_SystemCursor; + +/** + * \brief Scroll direction types for the Scroll event + */ +typedef enum +{ + SDL_MOUSEWHEEL_NORMAL, /**< The scroll direction is normal */ + SDL_MOUSEWHEEL_FLIPPED /**< The scroll direction is flipped / natural */ +} SDL_MouseWheelDirection; + +/* Function prototypes */ + +/** + * Get the window which currently has mouse focus. + * + * \returns the window with mouse focus. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetMouseFocus(void); + +/** + * Retrieve the current state of the mouse. + * + * The current button state is returned as a button bitmask, which can be + * tested using the `SDL_BUTTON(X)` macros (where `X` is generally 1 for the + * left, 2 for middle, 3 for the right button), and `x` and `y` are set to the + * mouse cursor position relative to the focus window. You can pass NULL for + * either `x` or `y`. + * + * \param x the x coordinate of the mouse cursor position relative to the + * focus window + * \param y the y coordinate of the mouse cursor position relative to the + * focus window + * \returns a 32-bit button bitmask of the current button state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetGlobalMouseState + * \sa SDL_GetRelativeMouseState + * \sa SDL_PumpEvents + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetMouseState(int *x, int *y); + +/** + * Get the current state of the mouse in relation to the desktop. + * + * This works similarly to SDL_GetMouseState(), but the coordinates will be + * reported relative to the top-left of the desktop. This can be useful if you + * need to track the mouse outside of a specific window and SDL_CaptureMouse() + * doesn't fit your needs. For example, it could be useful if you need to + * track the mouse while dragging a window, where coordinates relative to a + * window might not be in sync at all times. + * + * Note: SDL_GetMouseState() returns the mouse position as SDL understands it + * from the last pump of the event queue. This function, however, queries the + * OS for the current mouse position, and as such, might be a slightly less + * efficient function. Unless you know what you're doing and have a good + * reason to use this function, you probably want SDL_GetMouseState() instead. + * + * \param x filled in with the current X coord relative to the desktop; can be + * NULL + * \param y filled in with the current Y coord relative to the desktop; can be + * NULL + * \returns the current button state as a bitmask which can be tested using + * the SDL_BUTTON(X) macros. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_CaptureMouse + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetGlobalMouseState(int *x, int *y); + +/** + * Retrieve the relative state of the mouse. + * + * The current button state is returned as a button bitmask, which can be + * tested using the `SDL_BUTTON(X)` macros (where `X` is generally 1 for the + * left, 2 for middle, 3 for the right button), and `x` and `y` are set to the + * mouse deltas since the last call to SDL_GetRelativeMouseState() or since + * event initialization. You can pass NULL for either `x` or `y`. + * + * \param x a pointer filled with the last recorded x coordinate of the mouse + * \param y a pointer filled with the last recorded y coordinate of the mouse + * \returns a 32-bit button bitmask of the relative button state. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetMouseState + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetRelativeMouseState(int *x, int *y); + +/** + * Move the mouse cursor to the given position within the window. + * + * This function generates a mouse motion event if relative mode is not + * enabled. If relative mode is enabled, you can force mouse events for the + * warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint. + * + * Note that this function will appear to succeed, but not actually move the + * mouse when used over Microsoft Remote Desktop. + * + * \param window the window to move the mouse into, or NULL for the current + * mouse focus + * \param x the x coordinate within the window + * \param y the y coordinate within the window + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WarpMouseGlobal + */ +extern DECLSPEC void SDLCALL SDL_WarpMouseInWindow(SDL_Window * window, + int x, int y); + +/** + * Move the mouse to the given position in global screen space. + * + * This function generates a mouse motion event. + * + * A failure of this function usually means that it is unsupported by a + * platform. + * + * Note that this function will appear to succeed, but not actually move the + * mouse when used over Microsoft Remote Desktop. + * + * \param x the x coordinate + * \param y the y coordinate + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_WarpMouseInWindow + */ +extern DECLSPEC int SDLCALL SDL_WarpMouseGlobal(int x, int y); + +/** + * Set relative mouse mode. + * + * While the mouse is in relative mode, the cursor is hidden, and the driver + * will try to report continuous motion in the current window. Only relative + * motion events will be delivered, the mouse position will not change. + * + * Note that this function will not be able to provide continuous relative + * motion when used over Microsoft Remote Desktop, instead motion is limited + * to the bounds of the screen. + * + * This function will flush any pending mouse motion. + * + * \param enabled SDL_TRUE to enable relative mode, SDL_FALSE to disable. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * If relative mode is not supported, this returns -1. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRelativeMouseMode + */ +extern DECLSPEC int SDLCALL SDL_SetRelativeMouseMode(SDL_bool enabled); + +/** + * Capture the mouse and to track input outside an SDL window. + * + * Capturing enables your app to obtain mouse events globally, instead of just + * within your window. Not all video targets support this function. When + * capturing is enabled, the current window will get all mouse events, but + * unlike relative mode, no change is made to the cursor and it is not + * restrained to your window. + * + * This function may also deny mouse input to other windows--both those in + * your application and others on the system--so you should use this function + * sparingly, and in small bursts. For example, you might want to track the + * mouse while the user is dragging something, until the user releases a mouse + * button. It is not recommended that you capture the mouse for long periods + * of time, such as the entire time your app is running. For that, you should + * probably use SDL_SetRelativeMouseMode() or SDL_SetWindowGrab(), depending + * on your goals. + * + * While captured, mouse events still report coordinates relative to the + * current (foreground) window, but those coordinates may be outside the + * bounds of the window (including negative values). Capturing is only allowed + * for the foreground window. If the window loses focus while capturing, the + * capture will be disabled automatically. + * + * While capturing is enabled, the current window will have the + * `SDL_WINDOW_MOUSE_CAPTURE` flag set. + * + * Please note that as of SDL 2.0.22, SDL will attempt to "auto capture" the + * mouse while the user is pressing a button; this is to try and make mouse + * behavior more consistent between platforms, and deal with the common case + * of a user dragging the mouse outside of the window. This means that if you + * are calling SDL_CaptureMouse() only to deal with this situation, you no + * longer have to (although it is safe to do so). If this causes problems for + * your app, you can disable auto capture by setting the + * `SDL_HINT_MOUSE_AUTO_CAPTURE` hint to zero. + * + * \param enabled SDL_TRUE to enable capturing, SDL_FALSE to disable. + * \returns 0 on success or -1 if not supported; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetGlobalMouseState + */ +extern DECLSPEC int SDLCALL SDL_CaptureMouse(SDL_bool enabled); + +/** + * Query whether relative mouse mode is enabled. + * + * \returns SDL_TRUE if relative mode is enabled or SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRelativeMouseMode + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetRelativeMouseMode(void); + +/** + * Create a cursor using the specified bitmap data and mask (in MSB format). + * + * `mask` has to be in MSB (Most Significant Bit) format. + * + * The cursor width (`w`) must be a multiple of 8 bits. + * + * The cursor is created in black and white according to the following: + * + * - data=0, mask=1: white + * - data=1, mask=1: black + * - data=0, mask=0: transparent + * - data=1, mask=0: inverted color if possible, black if not. + * + * Cursors created with this function must be freed with SDL_FreeCursor(). + * + * If you want to have a color cursor, or create your cursor from an + * SDL_Surface, you should use SDL_CreateColorCursor(). Alternately, you can + * hide the cursor and draw your own as part of your game's rendering, but it + * will be bound to the framerate. + * + * Also, since SDL 2.0.0, SDL_CreateSystemCursor() is available, which + * provides twelve readily available system cursors to pick from. + * + * \param data the color value for each pixel of the cursor + * \param mask the mask value for each pixel of the cursor + * \param w the width of the cursor + * \param h the height of the cursor + * \param hot_x the X-axis location of the upper left corner of the cursor + * relative to the actual mouse position + * \param hot_y the Y-axis location of the upper left corner of the cursor + * relative to the actual mouse position + * \returns a new cursor with the specified parameters on success or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeCursor + * \sa SDL_SetCursor + * \sa SDL_ShowCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateCursor(const Uint8 * data, + const Uint8 * mask, + int w, int h, int hot_x, + int hot_y); + +/** + * Create a color cursor. + * + * \param surface an SDL_Surface structure representing the cursor image + * \param hot_x the x position of the cursor hot spot + * \param hot_y the y position of the cursor hot spot + * \returns the new cursor on success or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_FreeCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateColorCursor(SDL_Surface *surface, + int hot_x, + int hot_y); + +/** + * Create a system cursor. + * + * \param id an SDL_SystemCursor enum value + * \returns a cursor on success or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_CreateSystemCursor(SDL_SystemCursor id); + +/** + * Set the active cursor. + * + * This function sets the currently active cursor to the specified one. If the + * cursor is currently visible, the change will be immediately represented on + * the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if + * this is desired for any reason. + * + * \param cursor a cursor to make active + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_GetCursor + * \sa SDL_ShowCursor + */ +extern DECLSPEC void SDLCALL SDL_SetCursor(SDL_Cursor * cursor); + +/** + * Get the active cursor. + * + * This function returns a pointer to the current cursor which is owned by the + * library. It is not necessary to free the cursor with SDL_FreeCursor(). + * + * \returns the active cursor or NULL if there is no mouse. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetCursor(void); + +/** + * Get the default cursor. + * + * \returns the default cursor on success or NULL on failure. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSystemCursor + */ +extern DECLSPEC SDL_Cursor *SDLCALL SDL_GetDefaultCursor(void); + +/** + * Free a previously-created cursor. + * + * Use this function to free cursor resources created with SDL_CreateCursor(), + * SDL_CreateColorCursor() or SDL_CreateSystemCursor(). + * + * \param cursor the cursor to free + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateColorCursor + * \sa SDL_CreateCursor + * \sa SDL_CreateSystemCursor + */ +extern DECLSPEC void SDLCALL SDL_FreeCursor(SDL_Cursor * cursor); + +/** + * Toggle whether or not the cursor is shown. + * + * The cursor starts off displayed but can be turned off. Passing `SDL_ENABLE` + * displays the cursor and passing `SDL_DISABLE` hides it. + * + * The current state of the mouse cursor can be queried by passing + * `SDL_QUERY`; either `SDL_DISABLE` or `SDL_ENABLE` will be returned. + * + * \param toggle `SDL_ENABLE` to show the cursor, `SDL_DISABLE` to hide it, + * `SDL_QUERY` to query the current state without changing it. + * \returns `SDL_ENABLE` if the cursor is shown, or `SDL_DISABLE` if the + * cursor is hidden, or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateCursor + * \sa SDL_SetCursor + */ +extern DECLSPEC int SDLCALL SDL_ShowCursor(int toggle); + +/** + * Used as a mask when testing buttons in buttonstate. + * + * - Button 1: Left mouse button + * - Button 2: Middle mouse button + * - Button 3: Right mouse button + */ +#define SDL_BUTTON(X) (1 << ((X)-1)) +#define SDL_BUTTON_LEFT 1 +#define SDL_BUTTON_MIDDLE 2 +#define SDL_BUTTON_RIGHT 3 +#define SDL_BUTTON_X1 4 +#define SDL_BUTTON_X2 5 +#define SDL_BUTTON_LMASK SDL_BUTTON(SDL_BUTTON_LEFT) +#define SDL_BUTTON_MMASK SDL_BUTTON(SDL_BUTTON_MIDDLE) +#define SDL_BUTTON_RMASK SDL_BUTTON(SDL_BUTTON_RIGHT) +#define SDL_BUTTON_X1MASK SDL_BUTTON(SDL_BUTTON_X1) +#define SDL_BUTTON_X2MASK SDL_BUTTON(SDL_BUTTON_X2) + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_mouse_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_mutex.h b/include/SDL/SDL_mutex.h new file mode 100644 index 0000000..54b6a53 --- /dev/null +++ b/include/SDL/SDL_mutex.h @@ -0,0 +1,471 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_mutex_h_ +#define SDL_mutex_h_ + +/** + * \file SDL_mutex.h + * + * Functions to provide thread synchronization primitives. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Synchronization functions which can time out return this value + * if they time out. + */ +#define SDL_MUTEX_TIMEDOUT 1 + +/** + * This is the timeout value which corresponds to never time out. + */ +#define SDL_MUTEX_MAXWAIT (~(Uint32)0) + + +/** + * \name Mutex functions + */ +/* @{ */ + +/* The SDL mutex structure, defined in SDL_sysmutex.c */ +struct SDL_mutex; +typedef struct SDL_mutex SDL_mutex; + +/** + * Create a new mutex. + * + * All newly-created mutexes begin in the _unlocked_ state. + * + * Calls to SDL_LockMutex() will not return while the mutex is locked by + * another thread. See SDL_TryLockMutex() to attempt to lock without blocking. + * + * SDL mutexes are reentrant. + * + * \returns the initialized and unlocked mutex or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroyMutex + * \sa SDL_LockMutex + * \sa SDL_TryLockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC SDL_mutex *SDLCALL SDL_CreateMutex(void); + +/** + * Lock the mutex. + * + * This will block until the mutex is available, which is to say it is in the + * unlocked state and the OS has chosen the caller as the next thread to lock + * it. Of all threads waiting to lock the mutex, only one may do so at a time. + * + * It is legal for the owning thread to lock an already-locked mutex. It must + * unlock it the same number of times before it is actually made available for + * other threads in the system (this is known as a "recursive mutex"). + * + * \param mutex the mutex to lock + * \return 0, or -1 on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_LockMutex(SDL_mutex * mutex); +#define SDL_mutexP(m) SDL_LockMutex(m) + +/** + * Try to lock a mutex without blocking. + * + * This works just like SDL_LockMutex(), but if the mutex is not available, + * this function returns `SDL_MUTEX_TIMEOUT` immediately. + * + * This technique is useful if you need exclusive access to a resource but + * don't want to wait for it, and will return to it to try again later. + * + * \param mutex the mutex to try to lock + * \returns 0, `SDL_MUTEX_TIMEDOUT`, or -1 on error; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateMutex + * \sa SDL_DestroyMutex + * \sa SDL_LockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC int SDLCALL SDL_TryLockMutex(SDL_mutex * mutex); + +/** + * Unlock the mutex. + * + * It is legal for the owning thread to lock an already-locked mutex. It must + * unlock it the same number of times before it is actually made available for + * other threads in the system (this is known as a "recursive mutex"). + * + * It is an error to unlock a mutex that has not been locked by the current + * thread, and doing so results in undefined behavior. + * + * It is also an error to unlock a mutex that isn't locked at all. + * + * \param mutex the mutex to unlock. + * \returns 0, or -1 on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_UnlockMutex(SDL_mutex * mutex); +#define SDL_mutexV(m) SDL_UnlockMutex(m) + +/** + * Destroy a mutex created with SDL_CreateMutex(). + * + * This function must be called on any mutex that is no longer needed. Failure + * to destroy a mutex will result in a system memory or resource leak. While + * it is safe to destroy a mutex that is _unlocked_, it is not safe to attempt + * to destroy a locked mutex, and may result in undefined behavior depending + * on the platform. + * + * \param mutex the mutex to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateMutex + * \sa SDL_LockMutex + * \sa SDL_TryLockMutex + * \sa SDL_UnlockMutex + */ +extern DECLSPEC void SDLCALL SDL_DestroyMutex(SDL_mutex * mutex); + +/* @} *//* Mutex functions */ + + +/** + * \name Semaphore functions + */ +/* @{ */ + +/* The SDL semaphore structure, defined in SDL_syssem.c */ +struct SDL_semaphore; +typedef struct SDL_semaphore SDL_sem; + +/** + * Create a semaphore. + * + * This function creates a new semaphore and initializes it with the value + * `initial_value`. Each wait operation on the semaphore will atomically + * decrement the semaphore value and potentially block if the semaphore value + * is 0. Each post operation will atomically increment the semaphore value and + * wake waiting threads and allow them to retry the wait operation. + * + * \param initial_value the starting value of the semaphore + * \returns a new semaphore or NULL on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC SDL_sem *SDLCALL SDL_CreateSemaphore(Uint32 initial_value); + +/** + * Destroy a semaphore. + * + * It is not safe to destroy a semaphore if there are threads currently + * waiting on it. + * + * \param sem the semaphore to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC void SDLCALL SDL_DestroySemaphore(SDL_sem * sem); + +/** + * Wait until a semaphore has a positive value and then decrements it. + * + * This function suspends the calling thread until either the semaphore + * pointed to by `sem` has a positive value or the call is interrupted by a + * signal or error. If the call is successful it will atomically decrement the + * semaphore value. + * + * This function is the equivalent of calling SDL_SemWaitTimeout() with a time + * length of `SDL_MUTEX_MAXWAIT`. + * + * \param sem the semaphore wait on + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemWait(SDL_sem * sem); + +/** + * See if a semaphore has a positive value and decrement it if it does. + * + * This function checks to see if the semaphore pointed to by `sem` has a + * positive value and atomically decrements the semaphore value if it does. If + * the semaphore doesn't have a positive value, the function immediately + * returns SDL_MUTEX_TIMEDOUT. + * + * \param sem the semaphore to wait on + * \returns 0 if the wait succeeds, `SDL_MUTEX_TIMEDOUT` if the wait would + * block, or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemTryWait(SDL_sem * sem); + +/** + * Wait until a semaphore has a positive value and then decrements it. + * + * This function suspends the calling thread until either the semaphore + * pointed to by `sem` has a positive value, the call is interrupted by a + * signal or error, or the specified time has elapsed. If the call is + * successful it will atomically decrement the semaphore value. + * + * \param sem the semaphore to wait on + * \param ms the length of the timeout, in milliseconds + * \returns 0 if the wait succeeds, `SDL_MUTEX_TIMEDOUT` if the wait does not + * succeed in the allotted time, or a negative error code on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemPost + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + */ +extern DECLSPEC int SDLCALL SDL_SemWaitTimeout(SDL_sem * sem, Uint32 ms); + +/** + * Atomically increment a semaphore's value and wake waiting threads. + * + * \param sem the semaphore to increment + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + * \sa SDL_DestroySemaphore + * \sa SDL_SemTryWait + * \sa SDL_SemValue + * \sa SDL_SemWait + * \sa SDL_SemWaitTimeout + */ +extern DECLSPEC int SDLCALL SDL_SemPost(SDL_sem * sem); + +/** + * Get the current value of a semaphore. + * + * \param sem the semaphore to query + * \returns the current value of the semaphore. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSemaphore + */ +extern DECLSPEC Uint32 SDLCALL SDL_SemValue(SDL_sem * sem); + +/* @} *//* Semaphore functions */ + + +/** + * \name Condition variable functions + */ +/* @{ */ + +/* The SDL condition variable structure, defined in SDL_syscond.c */ +struct SDL_cond; +typedef struct SDL_cond SDL_cond; + +/** + * Create a condition variable. + * + * \returns a new condition variable or NULL on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_DestroyCond + */ +extern DECLSPEC SDL_cond *SDLCALL SDL_CreateCond(void); + +/** + * Destroy a condition variable. + * + * \param cond the condition variable to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + */ +extern DECLSPEC void SDLCALL SDL_DestroyCond(SDL_cond * cond); + +/** + * Restart one of the threads that are waiting on the condition variable. + * + * \param cond the condition variable to signal + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondSignal(SDL_cond * cond); + +/** + * Restart all threads that are waiting on the condition variable. + * + * \param cond the condition variable to signal + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondBroadcast(SDL_cond * cond); + +/** + * Wait until a condition variable is signaled. + * + * This function unlocks the specified `mutex` and waits for another thread to + * call SDL_CondSignal() or SDL_CondBroadcast() on the condition variable + * `cond`. Once the condition variable is signaled, the mutex is re-locked and + * the function returns. + * + * The mutex must be locked before calling this function. + * + * This function is the equivalent of calling SDL_CondWaitTimeout() with a + * time length of `SDL_MUTEX_MAXWAIT`. + * + * \param cond the condition variable to wait on + * \param mutex the mutex used to coordinate thread access + * \returns 0 when it is signaled or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWaitTimeout + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondWait(SDL_cond * cond, SDL_mutex * mutex); + +/** + * Wait until a condition variable is signaled or a certain time has passed. + * + * This function unlocks the specified `mutex` and waits for another thread to + * call SDL_CondSignal() or SDL_CondBroadcast() on the condition variable + * `cond`, or for the specified time to elapse. Once the condition variable is + * signaled or the time elapsed, the mutex is re-locked and the function + * returns. + * + * The mutex must be locked before calling this function. + * + * \param cond the condition variable to wait on + * \param mutex the mutex used to coordinate thread access + * \param ms the maximum time to wait, in milliseconds, or `SDL_MUTEX_MAXWAIT` + * to wait indefinitely + * \returns 0 if the condition variable is signaled, `SDL_MUTEX_TIMEDOUT` if + * the condition is not signaled in the allotted time, or a negative + * error code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CondBroadcast + * \sa SDL_CondSignal + * \sa SDL_CondWait + * \sa SDL_CreateCond + * \sa SDL_DestroyCond + */ +extern DECLSPEC int SDLCALL SDL_CondWaitTimeout(SDL_cond * cond, + SDL_mutex * mutex, Uint32 ms); + +/* @} *//* Condition variable functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_mutex_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_name.h b/include/SDL/SDL_name.h new file mode 100644 index 0000000..5c3e07a --- /dev/null +++ b/include/SDL/SDL_name.h @@ -0,0 +1,33 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDLname_h_ +#define SDLname_h_ + +#if defined(__STDC__) || defined(__cplusplus) +#define NeedFunctionPrototypes 1 +#endif + +#define SDL_NAME(X) SDL_##X + +#endif /* SDLname_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_opengl.h b/include/SDL/SDL_opengl.h new file mode 100644 index 0000000..0ba8912 --- /dev/null +++ b/include/SDL/SDL_opengl.h @@ -0,0 +1,2132 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_opengl.h + * + * This is a simple file to encapsulate the OpenGL API headers. + */ + +/** + * \def NO_SDL_GLEXT + * + * Define this if you have your own version of glext.h and want to disable the + * version included in SDL_opengl.h. + */ + +#ifndef SDL_opengl_h_ +#define SDL_opengl_h_ + +#include "SDL_config.h" + +#ifndef __IPHONEOS__ /* No OpenGL on iOS. */ + +/* + * Mesa 3-D graphics library + * + * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. + * Copyright (C) 2009 VMware, Inc. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is 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 Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS 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 SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + + +#ifndef __gl_h_ +#define __gl_h_ + +#if defined(USE_MGL_NAMESPACE) +#include "gl_mangle.h" +#endif + + +/********************************************************************** + * Begin system-specific stuff. + */ + +#if defined(_WIN32) && !defined(__WIN32__) && !defined(__CYGWIN__) +#define __WIN32__ +#endif + +#if defined(__WIN32__) && !defined(__CYGWIN__) +# if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(BUILD_GL32) /* tag specify we're building mesa as a DLL */ +# define GLAPI __declspec(dllexport) +# elif (defined(_MSC_VER) || defined(__MINGW32__)) && defined(_DLL) /* tag specifying we're building for DLL runtime support */ +# define GLAPI __declspec(dllimport) +# else /* for use with static link lib build of Win32 edition only */ +# define GLAPI extern +# endif /* _STATIC_MESA support */ +# if defined(__MINGW32__) && defined(GL_NO_STDCALL) || defined(UNDER_CE) /* The generated DLLs by MingW with STDCALL are not compatible with the ones done by Microsoft's compilers */ +# define GLAPIENTRY +# else +# define GLAPIENTRY __stdcall +# endif +#elif defined(__CYGWIN__) && defined(USE_OPENGL32) /* use native windows opengl32 */ +# define GLAPI extern +# define GLAPIENTRY __stdcall +#elif defined(__OS2__) || defined(__EMX__) /* native os/2 opengl */ +# define GLAPI extern +# define GLAPIENTRY _System +# define APIENTRY _System +# if defined(__GNUC__) && !defined(_System) +# define _System +# endif +#elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) +# define GLAPI __attribute__((visibility("default"))) +# define GLAPIENTRY +#endif /* WIN32 && !CYGWIN */ + +/* + * WINDOWS: Include windows.h here to define APIENTRY. + * It is also useful when applications include this file by + * including only glut.h, since glut.h depends on windows.h. + * Applications needing to include windows.h with parms other + * than "WIN32_LEAN_AND_MEAN" may include windows.h before + * glut.h or gl.h. + */ +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#ifndef NOMINMAX /* don't define min() and max(). */ +#define NOMINMAX +#endif +#include +#endif + +#ifndef GLAPI +#define GLAPI extern +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY +#endif + +#ifndef APIENTRY +#define APIENTRY GLAPIENTRY +#endif + +/* "P" suffix to be used for a pointer to a function */ +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif + +#ifndef GLAPIENTRYP +#define GLAPIENTRYP GLAPIENTRY * +#endif + +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export on +#endif + +/* + * End system-specific stuff. + **********************************************************************/ + + + +#ifdef __cplusplus +extern "C" { +#endif + + + +#define GL_VERSION_1_1 1 +#define GL_VERSION_1_2 1 +#define GL_VERSION_1_3 1 +#define GL_ARB_imaging 1 + + +/* + * Datatypes + */ +typedef unsigned int GLenum; +typedef unsigned char GLboolean; +typedef unsigned int GLbitfield; +typedef void GLvoid; +typedef signed char GLbyte; /* 1-byte signed */ +typedef short GLshort; /* 2-byte signed */ +typedef int GLint; /* 4-byte signed */ +typedef unsigned char GLubyte; /* 1-byte unsigned */ +typedef unsigned short GLushort; /* 2-byte unsigned */ +typedef unsigned int GLuint; /* 4-byte unsigned */ +typedef int GLsizei; /* 4-byte signed */ +typedef float GLfloat; /* single precision float */ +typedef float GLclampf; /* single precision float in [0,1] */ +typedef double GLdouble; /* double precision float */ +typedef double GLclampd; /* double precision float in [0,1] */ + + + +/* + * Constants + */ + +/* Boolean values */ +#define GL_FALSE 0 +#define GL_TRUE 1 + +/* Data types */ +#define GL_BYTE 0x1400 +#define GL_UNSIGNED_BYTE 0x1401 +#define GL_SHORT 0x1402 +#define GL_UNSIGNED_SHORT 0x1403 +#define GL_INT 0x1404 +#define GL_UNSIGNED_INT 0x1405 +#define GL_FLOAT 0x1406 +#define GL_2_BYTES 0x1407 +#define GL_3_BYTES 0x1408 +#define GL_4_BYTES 0x1409 +#define GL_DOUBLE 0x140A + +/* Primitives */ +#define GL_POINTS 0x0000 +#define GL_LINES 0x0001 +#define GL_LINE_LOOP 0x0002 +#define GL_LINE_STRIP 0x0003 +#define GL_TRIANGLES 0x0004 +#define GL_TRIANGLE_STRIP 0x0005 +#define GL_TRIANGLE_FAN 0x0006 +#define GL_QUADS 0x0007 +#define GL_QUAD_STRIP 0x0008 +#define GL_POLYGON 0x0009 + +/* Vertex Arrays */ +#define GL_VERTEX_ARRAY 0x8074 +#define GL_NORMAL_ARRAY 0x8075 +#define GL_COLOR_ARRAY 0x8076 +#define GL_INDEX_ARRAY 0x8077 +#define GL_TEXTURE_COORD_ARRAY 0x8078 +#define GL_EDGE_FLAG_ARRAY 0x8079 +#define GL_VERTEX_ARRAY_SIZE 0x807A +#define GL_VERTEX_ARRAY_TYPE 0x807B +#define GL_VERTEX_ARRAY_STRIDE 0x807C +#define GL_NORMAL_ARRAY_TYPE 0x807E +#define GL_NORMAL_ARRAY_STRIDE 0x807F +#define GL_COLOR_ARRAY_SIZE 0x8081 +#define GL_COLOR_ARRAY_TYPE 0x8082 +#define GL_COLOR_ARRAY_STRIDE 0x8083 +#define GL_INDEX_ARRAY_TYPE 0x8085 +#define GL_INDEX_ARRAY_STRIDE 0x8086 +#define GL_TEXTURE_COORD_ARRAY_SIZE 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE 0x808A +#define GL_EDGE_FLAG_ARRAY_STRIDE 0x808C +#define GL_VERTEX_ARRAY_POINTER 0x808E +#define GL_NORMAL_ARRAY_POINTER 0x808F +#define GL_COLOR_ARRAY_POINTER 0x8090 +#define GL_INDEX_ARRAY_POINTER 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER 0x8093 +#define GL_V2F 0x2A20 +#define GL_V3F 0x2A21 +#define GL_C4UB_V2F 0x2A22 +#define GL_C4UB_V3F 0x2A23 +#define GL_C3F_V3F 0x2A24 +#define GL_N3F_V3F 0x2A25 +#define GL_C4F_N3F_V3F 0x2A26 +#define GL_T2F_V3F 0x2A27 +#define GL_T4F_V4F 0x2A28 +#define GL_T2F_C4UB_V3F 0x2A29 +#define GL_T2F_C3F_V3F 0x2A2A +#define GL_T2F_N3F_V3F 0x2A2B +#define GL_T2F_C4F_N3F_V3F 0x2A2C +#define GL_T4F_C4F_N3F_V4F 0x2A2D + +/* Matrix Mode */ +#define GL_MATRIX_MODE 0x0BA0 +#define GL_MODELVIEW 0x1700 +#define GL_PROJECTION 0x1701 +#define GL_TEXTURE 0x1702 + +/* Points */ +#define GL_POINT_SMOOTH 0x0B10 +#define GL_POINT_SIZE 0x0B11 +#define GL_POINT_SIZE_GRANULARITY 0x0B13 +#define GL_POINT_SIZE_RANGE 0x0B12 + +/* Lines */ +#define GL_LINE_SMOOTH 0x0B20 +#define GL_LINE_STIPPLE 0x0B24 +#define GL_LINE_STIPPLE_PATTERN 0x0B25 +#define GL_LINE_STIPPLE_REPEAT 0x0B26 +#define GL_LINE_WIDTH 0x0B21 +#define GL_LINE_WIDTH_GRANULARITY 0x0B23 +#define GL_LINE_WIDTH_RANGE 0x0B22 + +/* Polygons */ +#define GL_POINT 0x1B00 +#define GL_LINE 0x1B01 +#define GL_FILL 0x1B02 +#define GL_CW 0x0900 +#define GL_CCW 0x0901 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_POLYGON_MODE 0x0B40 +#define GL_POLYGON_SMOOTH 0x0B41 +#define GL_POLYGON_STIPPLE 0x0B42 +#define GL_EDGE_FLAG 0x0B43 +#define GL_CULL_FACE 0x0B44 +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_POINT 0x2A01 +#define GL_POLYGON_OFFSET_LINE 0x2A02 +#define GL_POLYGON_OFFSET_FILL 0x8037 + +/* Display Lists */ +#define GL_COMPILE 0x1300 +#define GL_COMPILE_AND_EXECUTE 0x1301 +#define GL_LIST_BASE 0x0B32 +#define GL_LIST_INDEX 0x0B33 +#define GL_LIST_MODE 0x0B30 + +/* Depth buffer */ +#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_DEPTH_TEST 0x0B71 +#define GL_DEPTH_BITS 0x0D56 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_COMPONENT 0x1902 + +/* Lighting */ +#define GL_LIGHTING 0x0B50 +#define GL_LIGHT0 0x4000 +#define GL_LIGHT1 0x4001 +#define GL_LIGHT2 0x4002 +#define GL_LIGHT3 0x4003 +#define GL_LIGHT4 0x4004 +#define GL_LIGHT5 0x4005 +#define GL_LIGHT6 0x4006 +#define GL_LIGHT7 0x4007 +#define GL_SPOT_EXPONENT 0x1205 +#define GL_SPOT_CUTOFF 0x1206 +#define GL_CONSTANT_ATTENUATION 0x1207 +#define GL_LINEAR_ATTENUATION 0x1208 +#define GL_QUADRATIC_ATTENUATION 0x1209 +#define GL_AMBIENT 0x1200 +#define GL_DIFFUSE 0x1201 +#define GL_SPECULAR 0x1202 +#define GL_SHININESS 0x1601 +#define GL_EMISSION 0x1600 +#define GL_POSITION 0x1203 +#define GL_SPOT_DIRECTION 0x1204 +#define GL_AMBIENT_AND_DIFFUSE 0x1602 +#define GL_COLOR_INDEXES 0x1603 +#define GL_LIGHT_MODEL_TWO_SIDE 0x0B52 +#define GL_LIGHT_MODEL_LOCAL_VIEWER 0x0B51 +#define GL_LIGHT_MODEL_AMBIENT 0x0B53 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_SHADE_MODEL 0x0B54 +#define GL_FLAT 0x1D00 +#define GL_SMOOTH 0x1D01 +#define GL_COLOR_MATERIAL 0x0B57 +#define GL_COLOR_MATERIAL_FACE 0x0B55 +#define GL_COLOR_MATERIAL_PARAMETER 0x0B56 +#define GL_NORMALIZE 0x0BA1 + +/* User clipping planes */ +#define GL_CLIP_PLANE0 0x3000 +#define GL_CLIP_PLANE1 0x3001 +#define GL_CLIP_PLANE2 0x3002 +#define GL_CLIP_PLANE3 0x3003 +#define GL_CLIP_PLANE4 0x3004 +#define GL_CLIP_PLANE5 0x3005 + +/* Accumulation buffer */ +#define GL_ACCUM_RED_BITS 0x0D58 +#define GL_ACCUM_GREEN_BITS 0x0D59 +#define GL_ACCUM_BLUE_BITS 0x0D5A +#define GL_ACCUM_ALPHA_BITS 0x0D5B +#define GL_ACCUM_CLEAR_VALUE 0x0B80 +#define GL_ACCUM 0x0100 +#define GL_ADD 0x0104 +#define GL_LOAD 0x0101 +#define GL_MULT 0x0103 +#define GL_RETURN 0x0102 + +/* Alpha testing */ +#define GL_ALPHA_TEST 0x0BC0 +#define GL_ALPHA_TEST_REF 0x0BC2 +#define GL_ALPHA_TEST_FUNC 0x0BC1 + +/* Blending */ +#define GL_BLEND 0x0BE2 +#define GL_BLEND_SRC 0x0BE1 +#define GL_BLEND_DST 0x0BE0 +#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 + +/* Render Mode */ +#define GL_FEEDBACK 0x1C01 +#define GL_RENDER 0x1C00 +#define GL_SELECT 0x1C02 + +/* Feedback */ +#define GL_2D 0x0600 +#define GL_3D 0x0601 +#define GL_3D_COLOR 0x0602 +#define GL_3D_COLOR_TEXTURE 0x0603 +#define GL_4D_COLOR_TEXTURE 0x0604 +#define GL_POINT_TOKEN 0x0701 +#define GL_LINE_TOKEN 0x0702 +#define GL_LINE_RESET_TOKEN 0x0707 +#define GL_POLYGON_TOKEN 0x0703 +#define GL_BITMAP_TOKEN 0x0704 +#define GL_DRAW_PIXEL_TOKEN 0x0705 +#define GL_COPY_PIXEL_TOKEN 0x0706 +#define GL_PASS_THROUGH_TOKEN 0x0700 +#define GL_FEEDBACK_BUFFER_POINTER 0x0DF0 +#define GL_FEEDBACK_BUFFER_SIZE 0x0DF1 +#define GL_FEEDBACK_BUFFER_TYPE 0x0DF2 + +/* Selection */ +#define GL_SELECTION_BUFFER_POINTER 0x0DF3 +#define GL_SELECTION_BUFFER_SIZE 0x0DF4 + +/* Fog */ +#define GL_FOG 0x0B60 +#define GL_FOG_MODE 0x0B65 +#define GL_FOG_DENSITY 0x0B62 +#define GL_FOG_COLOR 0x0B66 +#define GL_FOG_INDEX 0x0B61 +#define GL_FOG_START 0x0B63 +#define GL_FOG_END 0x0B64 +#define GL_LINEAR 0x2601 +#define GL_EXP 0x0800 +#define GL_EXP2 0x0801 + +/* Logic Ops */ +#define GL_LOGIC_OP 0x0BF1 +#define GL_INDEX_LOGIC_OP 0x0BF1 +#define GL_COLOR_LOGIC_OP 0x0BF2 +#define GL_LOGIC_OP_MODE 0x0BF0 +#define GL_CLEAR 0x1500 +#define GL_SET 0x150F +#define GL_COPY 0x1503 +#define GL_COPY_INVERTED 0x150C +#define GL_NOOP 0x1505 +#define GL_INVERT 0x150A +#define GL_AND 0x1501 +#define GL_NAND 0x150E +#define GL_OR 0x1507 +#define GL_NOR 0x1508 +#define GL_XOR 0x1506 +#define GL_EQUIV 0x1509 +#define GL_AND_REVERSE 0x1502 +#define GL_AND_INVERTED 0x1504 +#define GL_OR_REVERSE 0x150B +#define GL_OR_INVERTED 0x150D + +/* Stencil */ +#define GL_STENCIL_BITS 0x0D57 +#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_STENCIL_INDEX 0x1901 +#define GL_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 + +/* Buffers, Pixel Drawing/Reading */ +#define GL_NONE 0 +#define GL_LEFT 0x0406 +#define GL_RIGHT 0x0407 +/*GL_FRONT 0x0404 */ +/*GL_BACK 0x0405 */ +/*GL_FRONT_AND_BACK 0x0408 */ +#define GL_FRONT_LEFT 0x0400 +#define GL_FRONT_RIGHT 0x0401 +#define GL_BACK_LEFT 0x0402 +#define GL_BACK_RIGHT 0x0403 +#define GL_AUX0 0x0409 +#define GL_AUX1 0x040A +#define GL_AUX2 0x040B +#define GL_AUX3 0x040C +#define GL_COLOR_INDEX 0x1900 +#define GL_RED 0x1903 +#define GL_GREEN 0x1904 +#define GL_BLUE 0x1905 +#define GL_ALPHA 0x1906 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_ALPHA_BITS 0x0D55 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_INDEX_BITS 0x0D51 +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_AUX_BUFFERS 0x0C00 +#define GL_READ_BUFFER 0x0C02 +#define GL_DRAW_BUFFER 0x0C01 +#define GL_DOUBLEBUFFER 0x0C32 +#define GL_STEREO 0x0C33 +#define GL_BITMAP 0x1A00 +#define GL_COLOR 0x1800 +#define GL_DEPTH 0x1801 +#define GL_STENCIL 0x1802 +#define GL_DITHER 0x0BD0 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 + +/* Implementation limits */ +#define GL_MAX_LIST_NESTING 0x0B31 +#define GL_MAX_EVAL_ORDER 0x0D30 +#define GL_MAX_LIGHTS 0x0D31 +#define GL_MAX_CLIP_PLANES 0x0D32 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_PIXEL_MAP_TABLE 0x0D34 +#define GL_MAX_ATTRIB_STACK_DEPTH 0x0D35 +#define GL_MAX_MODELVIEW_STACK_DEPTH 0x0D36 +#define GL_MAX_NAME_STACK_DEPTH 0x0D37 +#define GL_MAX_PROJECTION_STACK_DEPTH 0x0D38 +#define GL_MAX_TEXTURE_STACK_DEPTH 0x0D39 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_MAX_CLIENT_ATTRIB_STACK_DEPTH 0x0D3B + +/* Gets */ +#define GL_ATTRIB_STACK_DEPTH 0x0BB0 +#define GL_CLIENT_ATTRIB_STACK_DEPTH 0x0BB1 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_CURRENT_INDEX 0x0B01 +#define GL_CURRENT_COLOR 0x0B00 +#define GL_CURRENT_NORMAL 0x0B02 +#define GL_CURRENT_RASTER_COLOR 0x0B04 +#define GL_CURRENT_RASTER_DISTANCE 0x0B09 +#define GL_CURRENT_RASTER_INDEX 0x0B05 +#define GL_CURRENT_RASTER_POSITION 0x0B07 +#define GL_CURRENT_RASTER_TEXTURE_COORDS 0x0B06 +#define GL_CURRENT_RASTER_POSITION_VALID 0x0B08 +#define GL_CURRENT_TEXTURE_COORDS 0x0B03 +#define GL_INDEX_CLEAR_VALUE 0x0C20 +#define GL_INDEX_MODE 0x0C30 +#define GL_INDEX_WRITEMASK 0x0C21 +#define GL_MODELVIEW_MATRIX 0x0BA6 +#define GL_MODELVIEW_STACK_DEPTH 0x0BA3 +#define GL_NAME_STACK_DEPTH 0x0D70 +#define GL_PROJECTION_MATRIX 0x0BA7 +#define GL_PROJECTION_STACK_DEPTH 0x0BA4 +#define GL_RENDER_MODE 0x0C40 +#define GL_RGBA_MODE 0x0C31 +#define GL_TEXTURE_MATRIX 0x0BA8 +#define GL_TEXTURE_STACK_DEPTH 0x0BA5 +#define GL_VIEWPORT 0x0BA2 + +/* Evaluators */ +#define GL_AUTO_NORMAL 0x0D80 +#define GL_MAP1_COLOR_4 0x0D90 +#define GL_MAP1_INDEX 0x0D91 +#define GL_MAP1_NORMAL 0x0D92 +#define GL_MAP1_TEXTURE_COORD_1 0x0D93 +#define GL_MAP1_TEXTURE_COORD_2 0x0D94 +#define GL_MAP1_TEXTURE_COORD_3 0x0D95 +#define GL_MAP1_TEXTURE_COORD_4 0x0D96 +#define GL_MAP1_VERTEX_3 0x0D97 +#define GL_MAP1_VERTEX_4 0x0D98 +#define GL_MAP2_COLOR_4 0x0DB0 +#define GL_MAP2_INDEX 0x0DB1 +#define GL_MAP2_NORMAL 0x0DB2 +#define GL_MAP2_TEXTURE_COORD_1 0x0DB3 +#define GL_MAP2_TEXTURE_COORD_2 0x0DB4 +#define GL_MAP2_TEXTURE_COORD_3 0x0DB5 +#define GL_MAP2_TEXTURE_COORD_4 0x0DB6 +#define GL_MAP2_VERTEX_3 0x0DB7 +#define GL_MAP2_VERTEX_4 0x0DB8 +#define GL_MAP1_GRID_DOMAIN 0x0DD0 +#define GL_MAP1_GRID_SEGMENTS 0x0DD1 +#define GL_MAP2_GRID_DOMAIN 0x0DD2 +#define GL_MAP2_GRID_SEGMENTS 0x0DD3 +#define GL_COEFF 0x0A00 +#define GL_ORDER 0x0A01 +#define GL_DOMAIN 0x0A02 + +/* Hints */ +#define GL_PERSPECTIVE_CORRECTION_HINT 0x0C50 +#define GL_POINT_SMOOTH_HINT 0x0C51 +#define GL_LINE_SMOOTH_HINT 0x0C52 +#define GL_POLYGON_SMOOTH_HINT 0x0C53 +#define GL_FOG_HINT 0x0C54 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 + +/* Scissor box */ +#define GL_SCISSOR_BOX 0x0C10 +#define GL_SCISSOR_TEST 0x0C11 + +/* Pixel Mode / Transfer */ +#define GL_MAP_COLOR 0x0D10 +#define GL_MAP_STENCIL 0x0D11 +#define GL_INDEX_SHIFT 0x0D12 +#define GL_INDEX_OFFSET 0x0D13 +#define GL_RED_SCALE 0x0D14 +#define GL_RED_BIAS 0x0D15 +#define GL_GREEN_SCALE 0x0D18 +#define GL_GREEN_BIAS 0x0D19 +#define GL_BLUE_SCALE 0x0D1A +#define GL_BLUE_BIAS 0x0D1B +#define GL_ALPHA_SCALE 0x0D1C +#define GL_ALPHA_BIAS 0x0D1D +#define GL_DEPTH_SCALE 0x0D1E +#define GL_DEPTH_BIAS 0x0D1F +#define GL_PIXEL_MAP_S_TO_S_SIZE 0x0CB1 +#define GL_PIXEL_MAP_I_TO_I_SIZE 0x0CB0 +#define GL_PIXEL_MAP_I_TO_R_SIZE 0x0CB2 +#define GL_PIXEL_MAP_I_TO_G_SIZE 0x0CB3 +#define GL_PIXEL_MAP_I_TO_B_SIZE 0x0CB4 +#define GL_PIXEL_MAP_I_TO_A_SIZE 0x0CB5 +#define GL_PIXEL_MAP_R_TO_R_SIZE 0x0CB6 +#define GL_PIXEL_MAP_G_TO_G_SIZE 0x0CB7 +#define GL_PIXEL_MAP_B_TO_B_SIZE 0x0CB8 +#define GL_PIXEL_MAP_A_TO_A_SIZE 0x0CB9 +#define GL_PIXEL_MAP_S_TO_S 0x0C71 +#define GL_PIXEL_MAP_I_TO_I 0x0C70 +#define GL_PIXEL_MAP_I_TO_R 0x0C72 +#define GL_PIXEL_MAP_I_TO_G 0x0C73 +#define GL_PIXEL_MAP_I_TO_B 0x0C74 +#define GL_PIXEL_MAP_I_TO_A 0x0C75 +#define GL_PIXEL_MAP_R_TO_R 0x0C76 +#define GL_PIXEL_MAP_G_TO_G 0x0C77 +#define GL_PIXEL_MAP_B_TO_B 0x0C78 +#define GL_PIXEL_MAP_A_TO_A 0x0C79 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_PACK_LSB_FIRST 0x0D01 +#define GL_PACK_ROW_LENGTH 0x0D02 +#define GL_PACK_SKIP_PIXELS 0x0D04 +#define GL_PACK_SKIP_ROWS 0x0D03 +#define GL_PACK_SWAP_BYTES 0x0D00 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_UNPACK_LSB_FIRST 0x0CF1 +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#define GL_UNPACK_SKIP_PIXELS 0x0CF4 +#define GL_UNPACK_SKIP_ROWS 0x0CF3 +#define GL_UNPACK_SWAP_BYTES 0x0CF0 +#define GL_ZOOM_X 0x0D16 +#define GL_ZOOM_Y 0x0D17 + +/* Texture mapping */ +#define GL_TEXTURE_ENV 0x2300 +#define GL_TEXTURE_ENV_MODE 0x2200 +#define GL_TEXTURE_1D 0x0DE0 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_TEXTURE_WRAP_S 0x2802 +#define GL_TEXTURE_WRAP_T 0x2803 +#define GL_TEXTURE_MAG_FILTER 0x2800 +#define GL_TEXTURE_MIN_FILTER 0x2801 +#define GL_TEXTURE_ENV_COLOR 0x2201 +#define GL_TEXTURE_GEN_S 0x0C60 +#define GL_TEXTURE_GEN_T 0x0C61 +#define GL_TEXTURE_GEN_R 0x0C62 +#define GL_TEXTURE_GEN_Q 0x0C63 +#define GL_TEXTURE_GEN_MODE 0x2500 +#define GL_TEXTURE_BORDER_COLOR 0x1004 +#define GL_TEXTURE_WIDTH 0x1000 +#define GL_TEXTURE_HEIGHT 0x1001 +#define GL_TEXTURE_BORDER 0x1005 +#define GL_TEXTURE_COMPONENTS 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_TEXTURE_LUMINANCE_SIZE 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE 0x8061 +#define GL_NEAREST_MIPMAP_NEAREST 0x2700 +#define GL_NEAREST_MIPMAP_LINEAR 0x2702 +#define GL_LINEAR_MIPMAP_NEAREST 0x2701 +#define GL_LINEAR_MIPMAP_LINEAR 0x2703 +#define GL_OBJECT_LINEAR 0x2401 +#define GL_OBJECT_PLANE 0x2501 +#define GL_EYE_LINEAR 0x2400 +#define GL_EYE_PLANE 0x2502 +#define GL_SPHERE_MAP 0x2402 +#define GL_DECAL 0x2101 +#define GL_MODULATE 0x2100 +#define GL_NEAREST 0x2600 +#define GL_REPEAT 0x2901 +#define GL_CLAMP 0x2900 +#define GL_S 0x2000 +#define GL_T 0x2001 +#define GL_R 0x2002 +#define GL_Q 0x2003 + +/* Utility */ +#define GL_VENDOR 0x1F00 +#define GL_RENDERER 0x1F01 +#define GL_VERSION 0x1F02 +#define GL_EXTENSIONS 0x1F03 + +/* Errors */ +#define GL_NO_ERROR 0 +#define GL_INVALID_ENUM 0x0500 +#define GL_INVALID_VALUE 0x0501 +#define GL_INVALID_OPERATION 0x0502 +#define GL_STACK_OVERFLOW 0x0503 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_OUT_OF_MEMORY 0x0505 + +/* glPush/PopAttrib bits */ +#define GL_CURRENT_BIT 0x00000001 +#define GL_POINT_BIT 0x00000002 +#define GL_LINE_BIT 0x00000004 +#define GL_POLYGON_BIT 0x00000008 +#define GL_POLYGON_STIPPLE_BIT 0x00000010 +#define GL_PIXEL_MODE_BIT 0x00000020 +#define GL_LIGHTING_BIT 0x00000040 +#define GL_FOG_BIT 0x00000080 +#define GL_DEPTH_BUFFER_BIT 0x00000100 +#define GL_ACCUM_BUFFER_BIT 0x00000200 +#define GL_STENCIL_BUFFER_BIT 0x00000400 +#define GL_VIEWPORT_BIT 0x00000800 +#define GL_TRANSFORM_BIT 0x00001000 +#define GL_ENABLE_BIT 0x00002000 +#define GL_COLOR_BUFFER_BIT 0x00004000 +#define GL_HINT_BIT 0x00008000 +#define GL_EVAL_BIT 0x00010000 +#define GL_LIST_BIT 0x00020000 +#define GL_TEXTURE_BIT 0x00040000 +#define GL_SCISSOR_BIT 0x00080000 +#define GL_ALL_ATTRIB_BITS 0x000FFFFF + + +/* OpenGL 1.1 */ +#define GL_PROXY_TEXTURE_1D 0x8063 +#define GL_PROXY_TEXTURE_2D 0x8064 +#define GL_TEXTURE_PRIORITY 0x8066 +#define GL_TEXTURE_RESIDENT 0x8067 +#define GL_TEXTURE_BINDING_1D 0x8068 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_TEXTURE_INTERNAL_FORMAT 0x1003 +#define GL_ALPHA4 0x803B +#define GL_ALPHA8 0x803C +#define GL_ALPHA12 0x803D +#define GL_ALPHA16 0x803E +#define GL_LUMINANCE4 0x803F +#define GL_LUMINANCE8 0x8040 +#define GL_LUMINANCE12 0x8041 +#define GL_LUMINANCE16 0x8042 +#define GL_LUMINANCE4_ALPHA4 0x8043 +#define GL_LUMINANCE6_ALPHA2 0x8044 +#define GL_LUMINANCE8_ALPHA8 0x8045 +#define GL_LUMINANCE12_ALPHA4 0x8046 +#define GL_LUMINANCE12_ALPHA12 0x8047 +#define GL_LUMINANCE16_ALPHA16 0x8048 +#define GL_INTENSITY 0x8049 +#define GL_INTENSITY4 0x804A +#define GL_INTENSITY8 0x804B +#define GL_INTENSITY12 0x804C +#define GL_INTENSITY16 0x804D +#define GL_R3_G3_B2 0x2A10 +#define GL_RGB4 0x804F +#define GL_RGB5 0x8050 +#define GL_RGB8 0x8051 +#define GL_RGB10 0x8052 +#define GL_RGB12 0x8053 +#define GL_RGB16 0x8054 +#define GL_RGBA2 0x8055 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGBA8 0x8058 +#define GL_RGB10_A2 0x8059 +#define GL_RGBA12 0x805A +#define GL_RGBA16 0x805B +#define GL_CLIENT_PIXEL_STORE_BIT 0x00000001 +#define GL_CLIENT_VERTEX_ARRAY_BIT 0x00000002 +#define GL_ALL_CLIENT_ATTRIB_BITS 0xFFFFFFFF +#define GL_CLIENT_ALL_ATTRIB_BITS 0xFFFFFFFF + + + +/* + * Miscellaneous + */ + +GLAPI void GLAPIENTRY glClearIndex( GLfloat c ); + +GLAPI void GLAPIENTRY glClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glClear( GLbitfield mask ); + +GLAPI void GLAPIENTRY glIndexMask( GLuint mask ); + +GLAPI void GLAPIENTRY glColorMask( GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha ); + +GLAPI void GLAPIENTRY glAlphaFunc( GLenum func, GLclampf ref ); + +GLAPI void GLAPIENTRY glBlendFunc( GLenum sfactor, GLenum dfactor ); + +GLAPI void GLAPIENTRY glLogicOp( GLenum opcode ); + +GLAPI void GLAPIENTRY glCullFace( GLenum mode ); + +GLAPI void GLAPIENTRY glFrontFace( GLenum mode ); + +GLAPI void GLAPIENTRY glPointSize( GLfloat size ); + +GLAPI void GLAPIENTRY glLineWidth( GLfloat width ); + +GLAPI void GLAPIENTRY glLineStipple( GLint factor, GLushort pattern ); + +GLAPI void GLAPIENTRY glPolygonMode( GLenum face, GLenum mode ); + +GLAPI void GLAPIENTRY glPolygonOffset( GLfloat factor, GLfloat units ); + +GLAPI void GLAPIENTRY glPolygonStipple( const GLubyte *mask ); + +GLAPI void GLAPIENTRY glGetPolygonStipple( GLubyte *mask ); + +GLAPI void GLAPIENTRY glEdgeFlag( GLboolean flag ); + +GLAPI void GLAPIENTRY glEdgeFlagv( const GLboolean *flag ); + +GLAPI void GLAPIENTRY glScissor( GLint x, GLint y, GLsizei width, GLsizei height); + +GLAPI void GLAPIENTRY glClipPlane( GLenum plane, const GLdouble *equation ); + +GLAPI void GLAPIENTRY glGetClipPlane( GLenum plane, GLdouble *equation ); + +GLAPI void GLAPIENTRY glDrawBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glReadBuffer( GLenum mode ); + +GLAPI void GLAPIENTRY glEnable( GLenum cap ); + +GLAPI void GLAPIENTRY glDisable( GLenum cap ); + +GLAPI GLboolean GLAPIENTRY glIsEnabled( GLenum cap ); + + +GLAPI void GLAPIENTRY glEnableClientState( GLenum cap ); /* 1.1 */ + +GLAPI void GLAPIENTRY glDisableClientState( GLenum cap ); /* 1.1 */ + + +GLAPI void GLAPIENTRY glGetBooleanv( GLenum pname, GLboolean *params ); + +GLAPI void GLAPIENTRY glGetDoublev( GLenum pname, GLdouble *params ); + +GLAPI void GLAPIENTRY glGetFloatv( GLenum pname, GLfloat *params ); + +GLAPI void GLAPIENTRY glGetIntegerv( GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glPushAttrib( GLbitfield mask ); + +GLAPI void GLAPIENTRY glPopAttrib( void ); + + +GLAPI void GLAPIENTRY glPushClientAttrib( GLbitfield mask ); /* 1.1 */ + +GLAPI void GLAPIENTRY glPopClientAttrib( void ); /* 1.1 */ + + +GLAPI GLint GLAPIENTRY glRenderMode( GLenum mode ); + +GLAPI GLenum GLAPIENTRY glGetError( void ); + +GLAPI const GLubyte * GLAPIENTRY glGetString( GLenum name ); + +GLAPI void GLAPIENTRY glFinish( void ); + +GLAPI void GLAPIENTRY glFlush( void ); + +GLAPI void GLAPIENTRY glHint( GLenum target, GLenum mode ); + + +/* + * Depth Buffer + */ + +GLAPI void GLAPIENTRY glClearDepth( GLclampd depth ); + +GLAPI void GLAPIENTRY glDepthFunc( GLenum func ); + +GLAPI void GLAPIENTRY glDepthMask( GLboolean flag ); + +GLAPI void GLAPIENTRY glDepthRange( GLclampd near_val, GLclampd far_val ); + + +/* + * Accumulation Buffer + */ + +GLAPI void GLAPIENTRY glClearAccum( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha ); + +GLAPI void GLAPIENTRY glAccum( GLenum op, GLfloat value ); + + +/* + * Transformation + */ + +GLAPI void GLAPIENTRY glMatrixMode( GLenum mode ); + +GLAPI void GLAPIENTRY glOrtho( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glFrustum( GLdouble left, GLdouble right, + GLdouble bottom, GLdouble top, + GLdouble near_val, GLdouble far_val ); + +GLAPI void GLAPIENTRY glViewport( GLint x, GLint y, + GLsizei width, GLsizei height ); + +GLAPI void GLAPIENTRY glPushMatrix( void ); + +GLAPI void GLAPIENTRY glPopMatrix( void ); + +GLAPI void GLAPIENTRY glLoadIdentity( void ); + +GLAPI void GLAPIENTRY glLoadMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glLoadMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glMultMatrixd( const GLdouble *m ); +GLAPI void GLAPIENTRY glMultMatrixf( const GLfloat *m ); + +GLAPI void GLAPIENTRY glRotated( GLdouble angle, + GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRotatef( GLfloat angle, + GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glScaled( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glScalef( GLfloat x, GLfloat y, GLfloat z ); + +GLAPI void GLAPIENTRY glTranslated( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glTranslatef( GLfloat x, GLfloat y, GLfloat z ); + + +/* + * Display Lists + */ + +GLAPI GLboolean GLAPIENTRY glIsList( GLuint list ); + +GLAPI void GLAPIENTRY glDeleteLists( GLuint list, GLsizei range ); + +GLAPI GLuint GLAPIENTRY glGenLists( GLsizei range ); + +GLAPI void GLAPIENTRY glNewList( GLuint list, GLenum mode ); + +GLAPI void GLAPIENTRY glEndList( void ); + +GLAPI void GLAPIENTRY glCallList( GLuint list ); + +GLAPI void GLAPIENTRY glCallLists( GLsizei n, GLenum type, + const GLvoid *lists ); + +GLAPI void GLAPIENTRY glListBase( GLuint base ); + + +/* + * Drawing Functions + */ + +GLAPI void GLAPIENTRY glBegin( GLenum mode ); + +GLAPI void GLAPIENTRY glEnd( void ); + + +GLAPI void GLAPIENTRY glVertex2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glVertex2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glVertex2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glVertex2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glVertex3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glVertex3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glVertex3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glVertex3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glVertex4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glVertex4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glVertex4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glVertex2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex2iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex3iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glVertex4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glVertex4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glVertex4iv( const GLint *v ); +GLAPI void GLAPIENTRY glVertex4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glNormal3b( GLbyte nx, GLbyte ny, GLbyte nz ); +GLAPI void GLAPIENTRY glNormal3d( GLdouble nx, GLdouble ny, GLdouble nz ); +GLAPI void GLAPIENTRY glNormal3f( GLfloat nx, GLfloat ny, GLfloat nz ); +GLAPI void GLAPIENTRY glNormal3i( GLint nx, GLint ny, GLint nz ); +GLAPI void GLAPIENTRY glNormal3s( GLshort nx, GLshort ny, GLshort nz ); + +GLAPI void GLAPIENTRY glNormal3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glNormal3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glNormal3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glNormal3iv( const GLint *v ); +GLAPI void GLAPIENTRY glNormal3sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glIndexd( GLdouble c ); +GLAPI void GLAPIENTRY glIndexf( GLfloat c ); +GLAPI void GLAPIENTRY glIndexi( GLint c ); +GLAPI void GLAPIENTRY glIndexs( GLshort c ); +GLAPI void GLAPIENTRY glIndexub( GLubyte c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glIndexdv( const GLdouble *c ); +GLAPI void GLAPIENTRY glIndexfv( const GLfloat *c ); +GLAPI void GLAPIENTRY glIndexiv( const GLint *c ); +GLAPI void GLAPIENTRY glIndexsv( const GLshort *c ); +GLAPI void GLAPIENTRY glIndexubv( const GLubyte *c ); /* 1.1 */ + +GLAPI void GLAPIENTRY glColor3b( GLbyte red, GLbyte green, GLbyte blue ); +GLAPI void GLAPIENTRY glColor3d( GLdouble red, GLdouble green, GLdouble blue ); +GLAPI void GLAPIENTRY glColor3f( GLfloat red, GLfloat green, GLfloat blue ); +GLAPI void GLAPIENTRY glColor3i( GLint red, GLint green, GLint blue ); +GLAPI void GLAPIENTRY glColor3s( GLshort red, GLshort green, GLshort blue ); +GLAPI void GLAPIENTRY glColor3ub( GLubyte red, GLubyte green, GLubyte blue ); +GLAPI void GLAPIENTRY glColor3ui( GLuint red, GLuint green, GLuint blue ); +GLAPI void GLAPIENTRY glColor3us( GLushort red, GLushort green, GLushort blue ); + +GLAPI void GLAPIENTRY glColor4b( GLbyte red, GLbyte green, + GLbyte blue, GLbyte alpha ); +GLAPI void GLAPIENTRY glColor4d( GLdouble red, GLdouble green, + GLdouble blue, GLdouble alpha ); +GLAPI void GLAPIENTRY glColor4f( GLfloat red, GLfloat green, + GLfloat blue, GLfloat alpha ); +GLAPI void GLAPIENTRY glColor4i( GLint red, GLint green, + GLint blue, GLint alpha ); +GLAPI void GLAPIENTRY glColor4s( GLshort red, GLshort green, + GLshort blue, GLshort alpha ); +GLAPI void GLAPIENTRY glColor4ub( GLubyte red, GLubyte green, + GLubyte blue, GLubyte alpha ); +GLAPI void GLAPIENTRY glColor4ui( GLuint red, GLuint green, + GLuint blue, GLuint alpha ); +GLAPI void GLAPIENTRY glColor4us( GLushort red, GLushort green, + GLushort blue, GLushort alpha ); + + +GLAPI void GLAPIENTRY glColor3bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor3iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor3sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor3ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor3uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor3usv( const GLushort *v ); + +GLAPI void GLAPIENTRY glColor4bv( const GLbyte *v ); +GLAPI void GLAPIENTRY glColor4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glColor4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glColor4iv( const GLint *v ); +GLAPI void GLAPIENTRY glColor4sv( const GLshort *v ); +GLAPI void GLAPIENTRY glColor4ubv( const GLubyte *v ); +GLAPI void GLAPIENTRY glColor4uiv( const GLuint *v ); +GLAPI void GLAPIENTRY glColor4usv( const GLushort *v ); + + +GLAPI void GLAPIENTRY glTexCoord1d( GLdouble s ); +GLAPI void GLAPIENTRY glTexCoord1f( GLfloat s ); +GLAPI void GLAPIENTRY glTexCoord1i( GLint s ); +GLAPI void GLAPIENTRY glTexCoord1s( GLshort s ); + +GLAPI void GLAPIENTRY glTexCoord2d( GLdouble s, GLdouble t ); +GLAPI void GLAPIENTRY glTexCoord2f( GLfloat s, GLfloat t ); +GLAPI void GLAPIENTRY glTexCoord2i( GLint s, GLint t ); +GLAPI void GLAPIENTRY glTexCoord2s( GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glTexCoord3d( GLdouble s, GLdouble t, GLdouble r ); +GLAPI void GLAPIENTRY glTexCoord3f( GLfloat s, GLfloat t, GLfloat r ); +GLAPI void GLAPIENTRY glTexCoord3i( GLint s, GLint t, GLint r ); +GLAPI void GLAPIENTRY glTexCoord3s( GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glTexCoord4d( GLdouble s, GLdouble t, GLdouble r, GLdouble q ); +GLAPI void GLAPIENTRY glTexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q ); +GLAPI void GLAPIENTRY glTexCoord4i( GLint s, GLint t, GLint r, GLint q ); +GLAPI void GLAPIENTRY glTexCoord4s( GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glTexCoord1dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord1fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord1iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord1sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord2iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord3iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glTexCoord4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glTexCoord4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glTexCoord4iv( const GLint *v ); +GLAPI void GLAPIENTRY glTexCoord4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRasterPos2d( GLdouble x, GLdouble y ); +GLAPI void GLAPIENTRY glRasterPos2f( GLfloat x, GLfloat y ); +GLAPI void GLAPIENTRY glRasterPos2i( GLint x, GLint y ); +GLAPI void GLAPIENTRY glRasterPos2s( GLshort x, GLshort y ); + +GLAPI void GLAPIENTRY glRasterPos3d( GLdouble x, GLdouble y, GLdouble z ); +GLAPI void GLAPIENTRY glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ); +GLAPI void GLAPIENTRY glRasterPos3i( GLint x, GLint y, GLint z ); +GLAPI void GLAPIENTRY glRasterPos3s( GLshort x, GLshort y, GLshort z ); + +GLAPI void GLAPIENTRY glRasterPos4d( GLdouble x, GLdouble y, GLdouble z, GLdouble w ); +GLAPI void GLAPIENTRY glRasterPos4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w ); +GLAPI void GLAPIENTRY glRasterPos4i( GLint x, GLint y, GLint z, GLint w ); +GLAPI void GLAPIENTRY glRasterPos4s( GLshort x, GLshort y, GLshort z, GLshort w ); + +GLAPI void GLAPIENTRY glRasterPos2dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos2fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos2iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos2sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos3dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos3fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos3iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos3sv( const GLshort *v ); + +GLAPI void GLAPIENTRY glRasterPos4dv( const GLdouble *v ); +GLAPI void GLAPIENTRY glRasterPos4fv( const GLfloat *v ); +GLAPI void GLAPIENTRY glRasterPos4iv( const GLint *v ); +GLAPI void GLAPIENTRY glRasterPos4sv( const GLshort *v ); + + +GLAPI void GLAPIENTRY glRectd( GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2 ); +GLAPI void GLAPIENTRY glRectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 ); +GLAPI void GLAPIENTRY glRecti( GLint x1, GLint y1, GLint x2, GLint y2 ); +GLAPI void GLAPIENTRY glRects( GLshort x1, GLshort y1, GLshort x2, GLshort y2 ); + + +GLAPI void GLAPIENTRY glRectdv( const GLdouble *v1, const GLdouble *v2 ); +GLAPI void GLAPIENTRY glRectfv( const GLfloat *v1, const GLfloat *v2 ); +GLAPI void GLAPIENTRY glRectiv( const GLint *v1, const GLint *v2 ); +GLAPI void GLAPIENTRY glRectsv( const GLshort *v1, const GLshort *v2 ); + + +/* + * Vertex Arrays (1.1) + */ + +GLAPI void GLAPIENTRY glVertexPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glNormalPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glColorPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glIndexPointer( GLenum type, GLsizei stride, + const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glTexCoordPointer( GLint size, GLenum type, + GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glEdgeFlagPointer( GLsizei stride, const GLvoid *ptr ); + +GLAPI void GLAPIENTRY glGetPointerv( GLenum pname, GLvoid **params ); + +GLAPI void GLAPIENTRY glArrayElement( GLint i ); + +GLAPI void GLAPIENTRY glDrawArrays( GLenum mode, GLint first, GLsizei count ); + +GLAPI void GLAPIENTRY glDrawElements( GLenum mode, GLsizei count, + GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glInterleavedArrays( GLenum format, GLsizei stride, + const GLvoid *pointer ); + +/* + * Lighting + */ + +GLAPI void GLAPIENTRY glShadeModel( GLenum mode ); + +GLAPI void GLAPIENTRY glLightf( GLenum light, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLighti( GLenum light, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightfv( GLenum light, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glLightiv( GLenum light, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetLightfv( GLenum light, GLenum pname, + GLfloat *params ); +GLAPI void GLAPIENTRY glGetLightiv( GLenum light, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glLightModelf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glLightModeli( GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glLightModelfv( GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glLightModeliv( GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glMaterialf( GLenum face, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glMateriali( GLenum face, GLenum pname, GLint param ); +GLAPI void GLAPIENTRY glMaterialfv( GLenum face, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glMaterialiv( GLenum face, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetMaterialfv( GLenum face, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetMaterialiv( GLenum face, GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glColorMaterial( GLenum face, GLenum mode ); + + +/* + * Raster functions + */ + +GLAPI void GLAPIENTRY glPixelZoom( GLfloat xfactor, GLfloat yfactor ); + +GLAPI void GLAPIENTRY glPixelStoref( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelStorei( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelTransferf( GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glPixelTransferi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glPixelMapfv( GLenum map, GLsizei mapsize, + const GLfloat *values ); +GLAPI void GLAPIENTRY glPixelMapuiv( GLenum map, GLsizei mapsize, + const GLuint *values ); +GLAPI void GLAPIENTRY glPixelMapusv( GLenum map, GLsizei mapsize, + const GLushort *values ); + +GLAPI void GLAPIENTRY glGetPixelMapfv( GLenum map, GLfloat *values ); +GLAPI void GLAPIENTRY glGetPixelMapuiv( GLenum map, GLuint *values ); +GLAPI void GLAPIENTRY glGetPixelMapusv( GLenum map, GLushort *values ); + +GLAPI void GLAPIENTRY glBitmap( GLsizei width, GLsizei height, + GLfloat xorig, GLfloat yorig, + GLfloat xmove, GLfloat ymove, + const GLubyte *bitmap ); + +GLAPI void GLAPIENTRY glReadPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + GLvoid *pixels ); + +GLAPI void GLAPIENTRY glDrawPixels( GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glCopyPixels( GLint x, GLint y, + GLsizei width, GLsizei height, + GLenum type ); + +/* + * Stenciling + */ + +GLAPI void GLAPIENTRY glStencilFunc( GLenum func, GLint ref, GLuint mask ); + +GLAPI void GLAPIENTRY glStencilMask( GLuint mask ); + +GLAPI void GLAPIENTRY glStencilOp( GLenum fail, GLenum zfail, GLenum zpass ); + +GLAPI void GLAPIENTRY glClearStencil( GLint s ); + + + +/* + * Texture mapping + */ + +GLAPI void GLAPIENTRY glTexGend( GLenum coord, GLenum pname, GLdouble param ); +GLAPI void GLAPIENTRY glTexGenf( GLenum coord, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexGeni( GLenum coord, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexGendv( GLenum coord, GLenum pname, const GLdouble *params ); +GLAPI void GLAPIENTRY glTexGenfv( GLenum coord, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexGeniv( GLenum coord, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexGendv( GLenum coord, GLenum pname, GLdouble *params ); +GLAPI void GLAPIENTRY glGetTexGenfv( GLenum coord, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexGeniv( GLenum coord, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexEnvf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexEnvi( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexEnvfv( GLenum target, GLenum pname, const GLfloat *params ); +GLAPI void GLAPIENTRY glTexEnviv( GLenum target, GLenum pname, const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexEnvfv( GLenum target, GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexEnviv( GLenum target, GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexParameterf( GLenum target, GLenum pname, GLfloat param ); +GLAPI void GLAPIENTRY glTexParameteri( GLenum target, GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glTexParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); +GLAPI void GLAPIENTRY glTexParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glGetTexParameterfv( GLenum target, + GLenum pname, GLfloat *params); +GLAPI void GLAPIENTRY glGetTexParameteriv( GLenum target, + GLenum pname, GLint *params ); + +GLAPI void GLAPIENTRY glGetTexLevelParameterfv( GLenum target, GLint level, + GLenum pname, GLfloat *params ); +GLAPI void GLAPIENTRY glGetTexLevelParameteriv( GLenum target, GLint level, + GLenum pname, GLint *params ); + + +GLAPI void GLAPIENTRY glTexImage1D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexImage2D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLint border, GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glGetTexImage( GLenum target, GLint level, + GLenum format, GLenum type, + GLvoid *pixels ); + + +/* 1.1 functions */ + +GLAPI void GLAPIENTRY glGenTextures( GLsizei n, GLuint *textures ); + +GLAPI void GLAPIENTRY glDeleteTextures( GLsizei n, const GLuint *textures); + +GLAPI void GLAPIENTRY glBindTexture( GLenum target, GLuint texture ); + +GLAPI void GLAPIENTRY glPrioritizeTextures( GLsizei n, + const GLuint *textures, + const GLclampf *priorities ); + +GLAPI GLboolean GLAPIENTRY glAreTexturesResident( GLsizei n, + const GLuint *textures, + GLboolean *residences ); + +GLAPI GLboolean GLAPIENTRY glIsTexture( GLuint texture ); + + +GLAPI void GLAPIENTRY glTexSubImage1D( GLenum target, GLint level, + GLint xoffset, + GLsizei width, GLenum format, + GLenum type, const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLsizei width, GLsizei height, + GLenum format, GLenum type, + const GLvoid *pixels ); + + +GLAPI void GLAPIENTRY glCopyTexImage1D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexImage2D( GLenum target, GLint level, + GLenum internalformat, + GLint x, GLint y, + GLsizei width, GLsizei height, + GLint border ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage1D( GLenum target, GLint level, + GLint xoffset, GLint x, GLint y, + GLsizei width ); + + +GLAPI void GLAPIENTRY glCopyTexSubImage2D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint x, GLint y, + GLsizei width, GLsizei height ); + + +/* + * Evaluators + */ + +GLAPI void GLAPIENTRY glMap1d( GLenum target, GLdouble u1, GLdouble u2, + GLint stride, + GLint order, const GLdouble *points ); +GLAPI void GLAPIENTRY glMap1f( GLenum target, GLfloat u1, GLfloat u2, + GLint stride, + GLint order, const GLfloat *points ); + +GLAPI void GLAPIENTRY glMap2d( GLenum target, + GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, + GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, + const GLdouble *points ); +GLAPI void GLAPIENTRY glMap2f( GLenum target, + GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, + GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, + const GLfloat *points ); + +GLAPI void GLAPIENTRY glGetMapdv( GLenum target, GLenum query, GLdouble *v ); +GLAPI void GLAPIENTRY glGetMapfv( GLenum target, GLenum query, GLfloat *v ); +GLAPI void GLAPIENTRY glGetMapiv( GLenum target, GLenum query, GLint *v ); + +GLAPI void GLAPIENTRY glEvalCoord1d( GLdouble u ); +GLAPI void GLAPIENTRY glEvalCoord1f( GLfloat u ); + +GLAPI void GLAPIENTRY glEvalCoord1dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord1fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glEvalCoord2d( GLdouble u, GLdouble v ); +GLAPI void GLAPIENTRY glEvalCoord2f( GLfloat u, GLfloat v ); + +GLAPI void GLAPIENTRY glEvalCoord2dv( const GLdouble *u ); +GLAPI void GLAPIENTRY glEvalCoord2fv( const GLfloat *u ); + +GLAPI void GLAPIENTRY glMapGrid1d( GLint un, GLdouble u1, GLdouble u2 ); +GLAPI void GLAPIENTRY glMapGrid1f( GLint un, GLfloat u1, GLfloat u2 ); + +GLAPI void GLAPIENTRY glMapGrid2d( GLint un, GLdouble u1, GLdouble u2, + GLint vn, GLdouble v1, GLdouble v2 ); +GLAPI void GLAPIENTRY glMapGrid2f( GLint un, GLfloat u1, GLfloat u2, + GLint vn, GLfloat v1, GLfloat v2 ); + +GLAPI void GLAPIENTRY glEvalPoint1( GLint i ); + +GLAPI void GLAPIENTRY glEvalPoint2( GLint i, GLint j ); + +GLAPI void GLAPIENTRY glEvalMesh1( GLenum mode, GLint i1, GLint i2 ); + +GLAPI void GLAPIENTRY glEvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 ); + + +/* + * Fog + */ + +GLAPI void GLAPIENTRY glFogf( GLenum pname, GLfloat param ); + +GLAPI void GLAPIENTRY glFogi( GLenum pname, GLint param ); + +GLAPI void GLAPIENTRY glFogfv( GLenum pname, const GLfloat *params ); + +GLAPI void GLAPIENTRY glFogiv( GLenum pname, const GLint *params ); + + +/* + * Selection and Feedback + */ + +GLAPI void GLAPIENTRY glFeedbackBuffer( GLsizei size, GLenum type, GLfloat *buffer ); + +GLAPI void GLAPIENTRY glPassThrough( GLfloat token ); + +GLAPI void GLAPIENTRY glSelectBuffer( GLsizei size, GLuint *buffer ); + +GLAPI void GLAPIENTRY glInitNames( void ); + +GLAPI void GLAPIENTRY glLoadName( GLuint name ); + +GLAPI void GLAPIENTRY glPushName( GLuint name ); + +GLAPI void GLAPIENTRY glPopName( void ); + + + +/* + * OpenGL 1.2 + */ + +#define GL_RESCALE_NORMAL 0x803A +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MAX_ELEMENTS_VERTICES 0x80E8 +#define GL_MAX_ELEMENTS_INDICES 0x80E9 +#define GL_BGR 0x80E0 +#define GL_BGRA 0x80E1 +#define GL_UNSIGNED_BYTE_3_3_2 0x8032 +#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 0x8033 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV 0x8365 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV 0x8366 +#define GL_UNSIGNED_INT_8_8_8_8 0x8035 +#define GL_UNSIGNED_INT_8_8_8_8_REV 0x8367 +#define GL_UNSIGNED_INT_10_10_10_2 0x8036 +#define GL_UNSIGNED_INT_2_10_10_10_REV 0x8368 +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#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_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#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_TEXTURE_BINDING_3D 0x806A + +GLAPI void GLAPIENTRY glDrawRangeElements( GLenum mode, GLuint start, + GLuint end, GLsizei count, GLenum type, const GLvoid *indices ); + +GLAPI void GLAPIENTRY glTexImage3D( GLenum target, GLint level, + GLint internalFormat, + GLsizei width, GLsizei height, + GLsizei depth, GLint border, + GLenum format, GLenum type, + const GLvoid *pixels ); + +GLAPI void GLAPIENTRY glTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLsizei width, + GLsizei height, GLsizei depth, + GLenum format, + GLenum type, const GLvoid *pixels); + +GLAPI void GLAPIENTRY glCopyTexSubImage3D( GLenum target, GLint level, + GLint xoffset, GLint yoffset, + GLint zoffset, GLint x, + GLint y, GLsizei width, + GLsizei height ); + +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid *indices); +typedef void (APIENTRYP PFNGLTEXIMAGE3DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels); +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 GLvoid *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); + + +/* + * GL_ARB_imaging + */ + +#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_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX 0x802E +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_BLEND_EQUATION 0x8009 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +#define GL_FUNC_ADD 0x8006 +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#define GL_BLEND_COLOR 0x8005 + + +GLAPI void GLAPIENTRY glColorTable( GLenum target, GLenum internalformat, + GLsizei width, GLenum format, + GLenum type, const GLvoid *table ); + +GLAPI void GLAPIENTRY glColorSubTable( GLenum target, + GLsizei start, GLsizei count, + GLenum format, GLenum type, + const GLvoid *data ); + +GLAPI void GLAPIENTRY glColorTableParameteriv(GLenum target, GLenum pname, + const GLint *params); + +GLAPI void GLAPIENTRY glColorTableParameterfv(GLenum target, GLenum pname, + const GLfloat *params); + +GLAPI void GLAPIENTRY glCopyColorSubTable( GLenum target, GLsizei start, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyColorTable( GLenum target, GLenum internalformat, + GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glGetColorTable( GLenum target, GLenum format, + GLenum type, GLvoid *table ); + +GLAPI void GLAPIENTRY glGetColorTableParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetColorTableParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glBlendEquation( GLenum mode ); + +GLAPI void GLAPIENTRY glBlendColor( GLclampf red, GLclampf green, + GLclampf blue, GLclampf alpha ); + +GLAPI void GLAPIENTRY glHistogram( GLenum target, GLsizei width, + GLenum internalformat, GLboolean sink ); + +GLAPI void GLAPIENTRY glResetHistogram( GLenum target ); + +GLAPI void GLAPIENTRY glGetHistogram( GLenum target, GLboolean reset, + GLenum format, GLenum type, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetHistogramParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetHistogramParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glMinmax( GLenum target, GLenum internalformat, + GLboolean sink ); + +GLAPI void GLAPIENTRY glResetMinmax( GLenum target ); + +GLAPI void GLAPIENTRY glGetMinmax( GLenum target, GLboolean reset, + GLenum format, GLenum types, + GLvoid *values ); + +GLAPI void GLAPIENTRY glGetMinmaxParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetMinmaxParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glConvolutionFilter1D( GLenum target, + GLenum internalformat, GLsizei width, GLenum format, GLenum type, + const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *image ); + +GLAPI void GLAPIENTRY glConvolutionParameterf( GLenum target, GLenum pname, + GLfloat params ); + +GLAPI void GLAPIENTRY glConvolutionParameterfv( GLenum target, GLenum pname, + const GLfloat *params ); + +GLAPI void GLAPIENTRY glConvolutionParameteri( GLenum target, GLenum pname, + GLint params ); + +GLAPI void GLAPIENTRY glConvolutionParameteriv( GLenum target, GLenum pname, + const GLint *params ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter1D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width ); + +GLAPI void GLAPIENTRY glCopyConvolutionFilter2D( GLenum target, + GLenum internalformat, GLint x, GLint y, GLsizei width, + GLsizei height); + +GLAPI void GLAPIENTRY glGetConvolutionFilter( GLenum target, GLenum format, + GLenum type, GLvoid *image ); + +GLAPI void GLAPIENTRY glGetConvolutionParameterfv( GLenum target, GLenum pname, + GLfloat *params ); + +GLAPI void GLAPIENTRY glGetConvolutionParameteriv( GLenum target, GLenum pname, + GLint *params ); + +GLAPI void GLAPIENTRY glSeparableFilter2D( GLenum target, + GLenum internalformat, GLsizei width, GLsizei height, GLenum format, + GLenum type, const GLvoid *row, const GLvoid *column ); + +GLAPI void GLAPIENTRY glGetSeparableFilter( GLenum target, GLenum format, + GLenum type, GLvoid *row, GLvoid *column, GLvoid *span ); + + + + +/* + * OpenGL 1.3 + */ + +/* multitexture */ +#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_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +/* texture_cube_map */ +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#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 +/* texture_compression */ +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#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 +/* multisample */ +#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_MULTISAMPLE_BIT 0x20000000 +/* transpose_matrix */ +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +/* texture_env_combine */ +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +/* texture_env_dot3 */ +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +/* texture_border_clamp */ +#define GL_CLAMP_TO_BORDER 0x812D + +GLAPI void GLAPIENTRY glActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glClientActiveTexture( GLenum texture ); + +GLAPI void GLAPIENTRY glCompressedTexImage1D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage2D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexImage3D( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glCompressedTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const GLvoid *data ); + +GLAPI void GLAPIENTRY glGetCompressedTexImage( GLenum target, GLint lod, GLvoid *img ); + +GLAPI void GLAPIENTRY glMultiTexCoord1d( GLenum target, GLdouble s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1f( GLenum target, GLfloat s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1i( GLenum target, GLint s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord1s( GLenum target, GLshort s ); + +GLAPI void GLAPIENTRY glMultiTexCoord1sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2d( GLenum target, GLdouble s, GLdouble t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2f( GLenum target, GLfloat s, GLfloat t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2i( GLenum target, GLint s, GLint t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord2s( GLenum target, GLshort s, GLshort t ); + +GLAPI void GLAPIENTRY glMultiTexCoord2sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3d( GLenum target, GLdouble s, GLdouble t, GLdouble r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3f( GLenum target, GLfloat s, GLfloat t, GLfloat r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3i( GLenum target, GLint s, GLint t, GLint r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord3s( GLenum target, GLshort s, GLshort t, GLshort r ); + +GLAPI void GLAPIENTRY glMultiTexCoord3sv( GLenum target, const GLshort *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4d( GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4dv( GLenum target, const GLdouble *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4f( GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4fv( GLenum target, const GLfloat *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4i( GLenum target, GLint s, GLint t, GLint r, GLint q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4iv( GLenum target, const GLint *v ); + +GLAPI void GLAPIENTRY glMultiTexCoord4s( GLenum target, GLshort s, GLshort t, GLshort r, GLshort q ); + +GLAPI void GLAPIENTRY glMultiTexCoord4sv( GLenum target, const GLshort *v ); + + +GLAPI void GLAPIENTRY glLoadTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glLoadTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixd( const GLdouble m[16] ); + +GLAPI void GLAPIENTRY glMultTransposeMatrixf( const GLfloat m[16] ); + +GLAPI void GLAPIENTRY glSampleCoverage( GLclampf value, GLboolean invert ); + + +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const GLvoid *data); +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 GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const GLvoid *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, GLvoid *img); + + + +/* + * GL_ARB_multitexture (ARB extension 1 and OpenGL 1.2.1) + */ +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 + +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 + +GLAPI void GLAPIENTRY glActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glClientActiveTextureARB(GLenum texture); +GLAPI void GLAPIENTRY glMultiTexCoord1dARB(GLenum target, GLdouble s); +GLAPI void GLAPIENTRY glMultiTexCoord1dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord1fARB(GLenum target, GLfloat s); +GLAPI void GLAPIENTRY glMultiTexCoord1fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord1iARB(GLenum target, GLint s); +GLAPI void GLAPIENTRY glMultiTexCoord1ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord1sARB(GLenum target, GLshort s); +GLAPI void GLAPIENTRY glMultiTexCoord1svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord2dARB(GLenum target, GLdouble s, GLdouble t); +GLAPI void GLAPIENTRY glMultiTexCoord2dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t); +GLAPI void GLAPIENTRY glMultiTexCoord2fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord2iARB(GLenum target, GLint s, GLint t); +GLAPI void GLAPIENTRY glMultiTexCoord2ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord2sARB(GLenum target, GLshort s, GLshort t); +GLAPI void GLAPIENTRY glMultiTexCoord2svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord3dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void GLAPIENTRY glMultiTexCoord3dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void GLAPIENTRY glMultiTexCoord3fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord3iARB(GLenum target, GLint s, GLint t, GLint r); +GLAPI void GLAPIENTRY glMultiTexCoord3ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord3sARB(GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void GLAPIENTRY glMultiTexCoord3svARB(GLenum target, const GLshort *v); +GLAPI void GLAPIENTRY glMultiTexCoord4dARB(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void GLAPIENTRY glMultiTexCoord4dvARB(GLenum target, const GLdouble *v); +GLAPI void GLAPIENTRY glMultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void GLAPIENTRY glMultiTexCoord4fvARB(GLenum target, const GLfloat *v); +GLAPI void GLAPIENTRY glMultiTexCoord4iARB(GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void GLAPIENTRY glMultiTexCoord4ivARB(GLenum target, const GLint *v); +GLAPI void GLAPIENTRY glMultiTexCoord4sARB(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void GLAPIENTRY glMultiTexCoord4svARB(GLenum target, const GLshort *v); + +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); + +#endif /* GL_ARB_multitexture */ + + + +/* + * Define this token if you want "old-style" header file behaviour (extensions + * defined in gl.h). Otherwise, extensions will be included from glext.h. + */ +#if !defined(NO_SDL_GLEXT) && !defined(GL_GLEXT_LEGACY) +#include "SDL_opengl_glext.h" +#endif /* GL_GLEXT_LEGACY */ + + + +/********************************************************************** + * Begin system-specific stuff + */ +#if defined(PRAGMA_EXPORT_SUPPORTED) +#pragma export off +#endif + +/* + * End system-specific stuff + **********************************************************************/ + + +#ifdef __cplusplus +} +#endif + +#endif /* __gl_h_ */ + +#endif /* !__IPHONEOS__ */ + +#endif /* SDL_opengl_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_opengl_glext.h b/include/SDL/SDL_opengl_glext.h new file mode 100644 index 0000000..8527e17 --- /dev/null +++ b/include/SDL/SDL_opengl_glext.h @@ -0,0 +1,13209 @@ +#ifndef __gl_glext_h_ +#define __gl_glext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN 1 +#endif +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif +#ifndef APIENTRYP +#define APIENTRYP APIENTRY * +#endif +#ifndef GLAPI +#define GLAPI extern +#endif + +#define GL_GLEXT_VERSION 20220530 + +/*#include */ +#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_ */ + +/* Generated C header for: + * API: gl + * Profile: compatibility + * Versions considered: .* + * Versions emitted: 1\.[2-9]|[234]\.[0-9] + * Default extensions included: gl + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_VERSION_1_2 +#define GL_VERSION_1_2 1 +#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_RESCALE_NORMAL 0x803A +#define GL_LIGHT_MODEL_COLOR_CONTROL 0x81F8 +#define GL_SINGLE_COLOR 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR 0x81FA +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +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); +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); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElements (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +GLAPI void APIENTRY glTexImage3D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_VERSION_1_2 */ + +#ifndef GL_VERSION_1_3 +#define GL_VERSION_1_3 1 +#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_CLIENT_ACTIVE_TEXTURE 0x84E1 +#define GL_MAX_TEXTURE_UNITS 0x84E2 +#define GL_TRANSPOSE_MODELVIEW_MATRIX 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX 0x84E6 +#define GL_MULTISAMPLE_BIT 0x20000000 +#define GL_NORMAL_MAP 0x8511 +#define GL_REFLECTION_MAP 0x8512 +#define GL_COMPRESSED_ALPHA 0x84E9 +#define GL_COMPRESSED_LUMINANCE 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA 0x84EB +#define GL_COMPRESSED_INTENSITY 0x84EC +#define GL_COMBINE 0x8570 +#define GL_COMBINE_RGB 0x8571 +#define GL_COMBINE_ALPHA 0x8572 +#define GL_SOURCE0_RGB 0x8580 +#define GL_SOURCE1_RGB 0x8581 +#define GL_SOURCE2_RGB 0x8582 +#define GL_SOURCE0_ALPHA 0x8588 +#define GL_SOURCE1_ALPHA 0x8589 +#define GL_SOURCE2_ALPHA 0x858A +#define GL_OPERAND0_RGB 0x8590 +#define GL_OPERAND1_RGB 0x8591 +#define GL_OPERAND2_RGB 0x8592 +#define GL_OPERAND0_ALPHA 0x8598 +#define GL_OPERAND1_ALPHA 0x8599 +#define GL_OPERAND2_ALPHA 0x859A +#define GL_RGB_SCALE 0x8573 +#define GL_ADD_SIGNED 0x8574 +#define GL_INTERPOLATE 0x8575 +#define GL_SUBTRACT 0x84E7 +#define GL_CONSTANT 0x8576 +#define GL_PRIMARY_COLOR 0x8577 +#define GL_PREVIOUS 0x8578 +#define GL_DOT3_RGB 0x86AE +#define GL_DOT3_RGBA 0x86AF +typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +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); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint level, void *img); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTexture (GLenum texture); +GLAPI void APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GLAPI void APIENTRY glCompressedTexImage3D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1D (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImage (GLenum target, GLint level, void *img); +GLAPI void APIENTRY glClientActiveTexture (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1d (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1f (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1i (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1s (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2d (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2f (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2i (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2s (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3d (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3f (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3i (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3s (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4d (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dv (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4f (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fv (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4i (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4iv (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4s (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4sv (GLenum target, const GLshort *v); +GLAPI void APIENTRY glLoadTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixd (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixf (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixd (const GLdouble *m); +#endif +#endif /* GL_VERSION_1_3 */ + +#ifndef GL_VERSION_1_4 +#define GL_VERSION_1_4 1 +#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_POINT_SIZE_MIN 0x8126 +#define GL_POINT_SIZE_MAX 0x8127 +#define GL_POINT_DISTANCE_ATTENUATION 0x8129 +#define GL_GENERATE_MIPMAP 0x8191 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#define GL_FOG_COORDINATE_SOURCE 0x8450 +#define GL_FOG_COORDINATE 0x8451 +#define GL_FRAGMENT_DEPTH 0x8452 +#define GL_CURRENT_FOG_COORDINATE 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER 0x8456 +#define GL_FOG_COORDINATE_ARRAY 0x8457 +#define GL_COLOR_SUM 0x8458 +#define GL_CURRENT_SECONDARY_COLOR 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER 0x845D +#define GL_SECONDARY_COLOR_ARRAY 0x845E +#define GL_TEXTURE_FILTER_CONTROL 0x8500 +#define GL_DEPTH_TEXTURE_MODE 0x884B +#define GL_COMPARE_R_TO_TEXTURE 0x884E +#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 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFOGCOORDFPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLWINDOWPOS2DPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GLAPI void APIENTRY glMultiDrawArrays (GLenum mode, const GLint *first, const GLsizei *count, GLsizei drawcount); +GLAPI void APIENTRY glMultiDrawElements (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount); +GLAPI void APIENTRY glPointParameterf (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfv (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glPointParameteri (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameteriv (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFogCoordf (GLfloat coord); +GLAPI void APIENTRY glFogCoordfv (const GLfloat *coord); +GLAPI void APIENTRY glFogCoordd (GLdouble coord); +GLAPI void APIENTRY glFogCoorddv (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointer (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glSecondaryColor3b (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bv (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3d (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dv (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3f (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fv (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3i (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3iv (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3s (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3sv (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ub (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubv (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3ui (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uiv (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3us (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usv (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointer (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glWindowPos2d (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2f (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2i (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2iv (const GLint *v); +GLAPI void APIENTRY glWindowPos2s (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2sv (const GLshort *v); +GLAPI void APIENTRY glWindowPos3d (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dv (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3f (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fv (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3i (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3iv (const GLint *v); +GLAPI void APIENTRY glWindowPos3s (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3sv (const GLshort *v); +GLAPI void APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GLAPI void APIENTRY glBlendEquation (GLenum mode); +#endif +#endif /* GL_VERSION_1_4 */ + +#ifndef GL_VERSION_1_5 +#define GL_VERSION_1_5 1 +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_intptr_t GLintptr; +#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_VERTEX_ARRAY_BUFFER_BINDING 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING 0x889E +#define GL_FOG_COORD_SRC 0x8450 +#define GL_FOG_COORD 0x8451 +#define GL_CURRENT_FOG_COORD 0x8453 +#define GL_FOG_COORD_ARRAY_TYPE 0x8454 +#define GL_FOG_COORD_ARRAY_STRIDE 0x8455 +#define GL_FOG_COORD_ARRAY_POINTER 0x8456 +#define GL_FOG_COORD_ARRAY 0x8457 +#define GL_FOG_COORD_ARRAY_BUFFER_BINDING 0x889D +#define GL_SRC0_RGB 0x8580 +#define GL_SRC1_RGB 0x8581 +#define GL_SRC2_RGB 0x8582 +#define GL_SRC0_ALPHA 0x8588 +#define GL_SRC2_ALPHA 0x858A +typedef void (APIENTRYP PFNGLGENQUERIESPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueries (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueries (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQuery (GLuint id); +GLAPI void APIENTRY glBeginQuery (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQuery (GLenum target); +GLAPI void APIENTRY glGetQueryiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectiv (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuiv (GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBuffer (GLuint buffer); +GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glGetBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void *APIENTRY glMapBuffer (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBuffer (GLenum target); +GLAPI void APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointerv (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_VERSION_1_5 */ + +#ifndef GL_VERSION_2_0 +#define GL_VERSION_2_0 1 +typedef char GLchar; +#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_VERTEX_PROGRAM_TWO_SIDE 0x8643 +#define GL_POINT_SPRITE 0x8861 +#define GL_COORD_REPLACE 0x8862 +#define GL_MAX_TEXTURE_COORDS 0x8871 +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLDRAWBUFFERSPROC) (GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glDrawBuffers (GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GLAPI void APIENTRY glCompileShader (GLuint shader); +GLAPI GLuint APIENTRY glCreateProgram (void); +GLAPI GLuint APIENTRY glCreateShader (GLenum type); +GLAPI void APIENTRY glDeleteProgram (GLuint program); +GLAPI void APIENTRY glDeleteShader (GLuint shader); +GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader); +GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index); +GLAPI void APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgram (GLuint program); +GLAPI GLboolean APIENTRY glIsShader (GLuint shader); +GLAPI void APIENTRY glLinkProgram (GLuint program); +GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GLAPI void APIENTRY glUseProgram (GLuint program); +GLAPI void APIENTRY glUniform1f (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1i (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glValidateProgram (GLuint program); +GLAPI void APIENTRY glVertexAttrib1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1s (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2s (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3s (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nbv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4Niv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4Nsv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4Nub (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4Nubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4Nuiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4Nusv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4s (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +#endif +#endif /* GL_VERSION_2_0 */ + +#ifndef GL_VERSION_2_1 +#define GL_VERSION_2_1 1 +#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_CURRENT_RASTER_SECONDARY_COLOR 0x845F +#define GL_SLUMINANCE_ALPHA 0x8C44 +#define GL_SLUMINANCE8_ALPHA8 0x8C45 +#define GL_SLUMINANCE 0x8C46 +#define GL_SLUMINANCE8 0x8C47 +#define GL_COMPRESSED_SLUMINANCE 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA 0x8C4B +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformMatrix2x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix2x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3x4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4x3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_VERSION_2_1 */ + +#ifndef GL_VERSION_3_0 +#define GL_VERSION_3_0 1 +typedef khronos_uint16_t GLhalf; +#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_INDEX 0x8222 +#define GL_TEXTURE_LUMINANCE_TYPE 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE 0x8C15 +#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_CLAMP_VERTEX_COLOR 0x891A +#define GL_CLAMP_FRAGMENT_COLOR 0x891B +#define GL_ALPHA_INTEGER 0x8D97 +typedef void (APIENTRYP PFNGLCOLORMASKIPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLENABLEIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEIPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDIPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLCLAMPCOLORPROC) (GLenum target, GLenum clamp); +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVPROC) (GLuint index, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLGETUNIFORMUIVPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARBUFFERIVPROC) (GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERUIVPROC) (GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFVPROC) (GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARBUFFERFIPROC) (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFERPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void *(APIENTRYP PFNGLMAPBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaski (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GLAPI void APIENTRY glGetBooleani_v (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glGetIntegeri_v (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glEnablei (GLenum target, GLuint index); +GLAPI void APIENTRY glDisablei (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledi (GLenum target, GLuint index); +GLAPI void APIENTRY glBeginTransformFeedback (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedback (void); +GLAPI void APIENTRY glBindBufferRange (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferBase (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryings (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVarying (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glClampColor (GLenum target, GLenum clamp); +GLAPI void APIENTRY glBeginConditionalRender (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRender (void); +GLAPI void APIENTRY glVertexAttribIPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIiv (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuiv (GLuint index, GLenum pname, GLuint *params); +GLAPI void APIENTRY glVertexAttribI1i (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2i (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3i (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4i (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1ui (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2ui (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3ui (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4ui (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4iv (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uiv (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bv (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4sv (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubv (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usv (GLuint index, const GLushort *v); +GLAPI void APIENTRY glGetUniformuiv (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocation (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocation (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1ui (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2ui (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3ui (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4ui (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uiv (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glTexParameterIiv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuiv (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIiv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuiv (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearBufferiv (GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearBufferuiv (GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearBufferfv (GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearBufferfi (GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index); +GLAPI GLboolean APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebuffer (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatus (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmap (GLenum target); +GLAPI void APIENTRY glBlitFramebuffer (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glRenderbufferStorageMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glFramebufferTextureLayer (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void *APIENTRY glMapBufferRange (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedBufferRange (GLenum target, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glBindVertexArray (GLuint array); +GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArray (GLuint array); +#endif +#endif /* GL_VERSION_3_0 */ + +#ifndef GL_VERSION_3_1 +#define GL_VERSION_3_1 1 +#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 0xFFFFFFFFu +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +typedef void (APIENTRYP PFNGLTEXBUFFERPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXPROC) (GLuint index); +typedef void (APIENTRYP PFNGLCOPYBUFFERSUBDATAPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETUNIFORMINDICESPROC) (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMSIVPROC) (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMNAMEPROC) (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +typedef GLuint (APIENTRYP PFNGLGETUNIFORMBLOCKINDEXPROC) (GLuint program, const GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKIVPROC) (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC) (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +typedef void (APIENTRYP PFNGLUNIFORMBLOCKBINDINGPROC) (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstanced (GLenum mode, GLint first, GLsizei count, GLsizei instancecount); +GLAPI void APIENTRY glDrawElementsInstanced (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount); +GLAPI void APIENTRY glTexBuffer (GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glPrimitiveRestartIndex (GLuint index); +GLAPI void APIENTRY glCopyBufferSubData (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glGetUniformIndices (GLuint program, GLsizei uniformCount, const GLchar *const*uniformNames, GLuint *uniformIndices); +GLAPI void APIENTRY glGetActiveUniformsiv (GLuint program, GLsizei uniformCount, const GLuint *uniformIndices, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformName (GLuint program, GLuint uniformIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformName); +GLAPI GLuint APIENTRY glGetUniformBlockIndex (GLuint program, const GLchar *uniformBlockName); +GLAPI void APIENTRY glGetActiveUniformBlockiv (GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetActiveUniformBlockName (GLuint program, GLuint uniformBlockIndex, GLsizei bufSize, GLsizei *length, GLchar *uniformBlockName); +GLAPI void APIENTRY glUniformBlockBinding (GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); +#endif +#endif /* GL_VERSION_3_1 */ + +#ifndef GL_VERSION_3_2 +#define GL_VERSION_3_2 1 +typedef struct __GLsync *GLsync; +typedef khronos_uint64_t GLuint64; +typedef khronos_int64_t GLint64; +#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 0xFFFFFFFFFFFFFFFFull +#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 +typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXPROC) (GLenum mode); +typedef GLsync (APIENTRYP PFNGLFENCESYNCPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (APIENTRYP PFNGLISSYNCPROC) (GLsync sync); +typedef void (APIENTRYP PFNGLDELETESYNCPROC) (GLsync sync); +typedef GLenum (APIENTRYP PFNGLCLIENTWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLWAITSYNCPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (APIENTRYP PFNGLGETINTEGER64VPROC) (GLenum pname, GLint64 *data); +typedef void (APIENTRYP PFNGLGETSYNCIVPROC) (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERI64VPROC) (GLenum target, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKIPROC) (GLuint maskNumber, GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawRangeElementsBaseVertex (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GLAPI void APIENTRY glMultiDrawElementsBaseVertex (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +GLAPI void APIENTRY glProvokingVertex (GLenum mode); +GLAPI GLsync APIENTRY glFenceSync (GLenum condition, GLbitfield flags); +GLAPI GLboolean APIENTRY glIsSync (GLsync sync); +GLAPI void APIENTRY glDeleteSync (GLsync sync); +GLAPI GLenum APIENTRY glClientWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glWaitSync (GLsync sync, GLbitfield flags, GLuint64 timeout); +GLAPI void APIENTRY glGetInteger64v (GLenum pname, GLint64 *data); +GLAPI void APIENTRY glGetSynciv (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI void APIENTRY glGetInteger64i_v (GLenum target, GLuint index, GLint64 *data); +GLAPI void APIENTRY glGetBufferParameteri64v (GLenum target, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glFramebufferTexture (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glTexImage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexImage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glGetMultisamplefv (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaski (GLuint maskNumber, GLbitfield mask); +#endif +#endif /* GL_VERSION_3_2 */ + +#ifndef GL_VERSION_3_3 +#define GL_VERSION_3_3 1 +#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 +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATAINDEXPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGENSAMPLERSPROC) (GLsizei count, GLuint *samplers); +typedef void (APIENTRYP PFNGLDELETESAMPLERSPROC) (GLsizei count, const GLuint *samplers); +typedef GLboolean (APIENTRYP PFNGLISSAMPLERPROC) (GLuint sampler); +typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIPROC) (GLuint sampler, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFPROC) (GLuint sampler, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIIVPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERFVPROC) (GLuint sampler, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVPROC) (GLuint sampler, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLQUERYCOUNTERPROC) (GLuint id, GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORPROC) (GLuint index, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP1UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP2UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP3UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIPROC) (GLuint index, GLenum type, GLboolean normalized, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBP4UIVPROC) (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP2UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP2UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP3UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP3UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXP4UIPROC) (GLenum type, GLuint value); +typedef void (APIENTRYP PFNGLVERTEXP4UIVPROC) (GLenum type, const GLuint *value); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP1UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP2UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLTEXCOORDP4UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP1UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP2UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP3UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIPROC) (GLenum texture, GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORDP4UIVPROC) (GLenum texture, GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLNORMALP3UIPROC) (GLenum type, GLuint coords); +typedef void (APIENTRYP PFNGLNORMALP3UIVPROC) (GLenum type, const GLuint *coords); +typedef void (APIENTRYP PFNGLCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP3UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLCOLORP4UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLCOLORP4UIVPROC) (GLenum type, const GLuint *color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIPROC) (GLenum type, GLuint color); +typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC) (GLenum type, const GLuint *color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindFragDataLocationIndexed (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataIndex (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGenSamplers (GLsizei count, GLuint *samplers); +GLAPI void APIENTRY glDeleteSamplers (GLsizei count, const GLuint *samplers); +GLAPI GLboolean APIENTRY glIsSampler (GLuint sampler); +GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler); +GLAPI void APIENTRY glSamplerParameteri (GLuint sampler, GLenum pname, GLint param); +GLAPI void APIENTRY glSamplerParameteriv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterf (GLuint sampler, GLenum pname, GLfloat param); +GLAPI void APIENTRY glSamplerParameterfv (GLuint sampler, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glSamplerParameterIiv (GLuint sampler, GLenum pname, const GLint *param); +GLAPI void APIENTRY glSamplerParameterIuiv (GLuint sampler, GLenum pname, const GLuint *param); +GLAPI void APIENTRY glGetSamplerParameteriv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterIiv (GLuint sampler, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSamplerParameterfv (GLuint sampler, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetSamplerParameterIuiv (GLuint sampler, GLenum pname, GLuint *params); +GLAPI void APIENTRY glQueryCounter (GLuint id, GLenum target); +GLAPI void APIENTRY glGetQueryObjecti64v (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64v (GLuint id, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glVertexAttribDivisor (GLuint index, GLuint divisor); +GLAPI void APIENTRY glVertexAttribP1ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP1uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP2ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP2uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP3ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP3uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexAttribP4ui (GLuint index, GLenum type, GLboolean normalized, GLuint value); +GLAPI void APIENTRY glVertexAttribP4uiv (GLuint index, GLenum type, GLboolean normalized, const GLuint *value); +GLAPI void APIENTRY glVertexP2ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP2uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP3ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP3uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glVertexP4ui (GLenum type, GLuint value); +GLAPI void APIENTRY glVertexP4uiv (GLenum type, const GLuint *value); +GLAPI void APIENTRY glTexCoordP1ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP1uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP2ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP2uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glTexCoordP4ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glTexCoordP4uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP1ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP1uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP2ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP2uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP3ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP3uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glMultiTexCoordP4ui (GLenum texture, GLenum type, GLuint coords); +GLAPI void APIENTRY glMultiTexCoordP4uiv (GLenum texture, GLenum type, const GLuint *coords); +GLAPI void APIENTRY glNormalP3ui (GLenum type, GLuint coords); +GLAPI void APIENTRY glNormalP3uiv (GLenum type, const GLuint *coords); +GLAPI void APIENTRY glColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP3uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glColorP4ui (GLenum type, GLuint color); +GLAPI void APIENTRY glColorP4uiv (GLenum type, const GLuint *color); +GLAPI void APIENTRY glSecondaryColorP3ui (GLenum type, GLuint color); +GLAPI void APIENTRY glSecondaryColorP3uiv (GLenum type, const GLuint *color); +#endif +#endif /* GL_VERSION_3_3 */ + +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC) (GLfloat value); +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect); +typedef void (APIENTRYP PFNGLUNIFORM1DPROC) (GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLUNIFORM2DPROC) (GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLUNIFORM3DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLUNIFORM4DPROC) (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC) (GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC) (GLuint program, GLint location, GLdouble *params); +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC) (GLuint program, GLenum shadertype, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC) (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC) (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC) (GLenum shadertype, GLsizei count, const GLuint *indices); +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC) (GLenum shadertype, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC) (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC) (GLenum pname, const GLfloat *values); +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC) (GLenum mode, GLuint id); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC) (GLenum mode, GLuint id, GLuint stream); +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC) (GLenum target, GLuint index, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShading (GLfloat value); +GLAPI void APIENTRY glBlendEquationi (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparatei (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunci (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparatei (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glDrawArraysIndirect (GLenum mode, const void *indirect); +GLAPI void APIENTRY glDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect); +GLAPI void APIENTRY glUniform1d (GLint location, GLdouble x); +GLAPI void APIENTRY glUniform2d (GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glUniform3d (GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glUniform4d (GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glUniform1dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform2dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform3dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniform4dv (GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix2x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix3x4dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x2dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glUniformMatrix4x3dv (GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glGetUniformdv (GLuint program, GLint location, GLdouble *params); +GLAPI GLint APIENTRY glGetSubroutineUniformLocation (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI GLuint APIENTRY glGetSubroutineIndex (GLuint program, GLenum shadertype, const GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineUniformiv (GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI void APIENTRY glGetActiveSubroutineUniformName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetActiveSubroutineName (GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glUniformSubroutinesuiv (GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI void APIENTRY glGetUniformSubroutineuiv (GLenum shadertype, GLint location, GLuint *params); +GLAPI void APIENTRY glGetProgramStageiv (GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI void APIENTRY glPatchParameteri (GLenum pname, GLint value); +GLAPI void APIENTRY glPatchParameterfv (GLenum pname, const GLfloat *values); +GLAPI void APIENTRY glBindTransformFeedback (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacks (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedback (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedback (void); +GLAPI void APIENTRY glResumeTransformFeedback (void); +GLAPI void APIENTRY glDrawTransformFeedback (GLenum mode, GLuint id); +GLAPI void APIENTRY glDrawTransformFeedbackStream (GLenum mode, GLuint id, GLuint stream); +GLAPI void APIENTRY glBeginQueryIndexed (GLenum target, GLuint index, GLuint id); +GLAPI void APIENTRY glEndQueryIndexed (GLenum target, GLuint index); +GLAPI void APIENTRY glGetQueryIndexediv (GLenum target, GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_VERSION_4_0 */ + +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC) (GLuint pipeline, GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC) (GLenum type, GLsizei count, const GLchar *const*strings); +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC) (GLsizei n, const GLuint *pipelines); +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC) (GLuint program, GLint location, GLdouble v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC) (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC) (GLuint pipeline); +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC) (GLuint index, GLdouble n, GLdouble f); +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReleaseShaderCompiler (void); +GLAPI void APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI void APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GLAPI void APIENTRY glClearDepthf (GLfloat d); +GLAPI void APIENTRY glGetProgramBinary (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI void APIENTRY glProgramBinary (GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI void APIENTRY glProgramParameteri (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glUseProgramStages (GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI void APIENTRY glActiveShaderProgram (GLuint pipeline, GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramv (GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI void APIENTRY glBindProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glDeleteProgramPipelines (GLsizei n, const GLuint *pipelines); +GLAPI void APIENTRY glGenProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI GLboolean APIENTRY glIsProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineiv (GLuint pipeline, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1i (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform1iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform1f (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform1fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1d (GLuint program, GLint location, GLdouble v0); +GLAPI void APIENTRY glProgramUniform1dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform1ui (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform1uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2i (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform2iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2f (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform2fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2d (GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI void APIENTRY glProgramUniform2dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2ui (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform2uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform3iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform3fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI void APIENTRY glProgramUniform3dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform3uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4i (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform4iv (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4f (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform4fv (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4d (GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI void APIENTRY glProgramUniform4dv (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4ui (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform4uiv (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dv (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glValidateProgramPipeline (GLuint pipeline); +GLAPI void APIENTRY glGetProgramPipelineInfoLog (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI void APIENTRY glVertexAttribL1d (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2d (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3d (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4d (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dv (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointer (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdv (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glViewportArrayv (GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glViewportIndexedf (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI void APIENTRY glViewportIndexedfv (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glScissorArrayv (GLuint first, GLsizei count, const GLint *v); +GLAPI void APIENTRY glScissorIndexed (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorIndexedv (GLuint index, const GLint *v); +GLAPI void APIENTRY glDepthRangeArrayv (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexed (GLuint index, GLdouble n, GLdouble f); +GLAPI void APIENTRY glGetFloati_v (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoublei_v (GLenum target, GLuint index, GLdouble *data); +#endif +#endif /* GL_VERSION_4_1 */ + +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC) (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC) (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC) (GLenum mode, GLuint id, GLsizei instancecount); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC) (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedBaseInstance (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI void APIENTRY glDrawElementsInstancedBaseVertexBaseInstance (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI void APIENTRY glGetInternalformativ (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); +GLAPI void APIENTRY glGetActiveAtomicCounterBufferiv (GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI void APIENTRY glBindImageTexture (GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI void APIENTRY glMemoryBarrier (GLbitfield barriers); +GLAPI void APIENTRY glTexStorage1D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3D (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glDrawTransformFeedbackInstanced (GLenum mode, GLuint id, GLsizei instancecount); +GLAPI void APIENTRY glDrawTransformFeedbackStreamInstanced (GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +#endif +#endif /* GL_VERSION_4_2 */ + +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC) (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC) (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC) (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 *params); +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC) (GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC) (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC) (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC) (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC) (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC) (GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC) (GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC) (GLDEBUGPROC callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC) (void); +typedef void (APIENTRYP PFNGLOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearBufferData (GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearBufferSubData (GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glDispatchCompute (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI void APIENTRY glDispatchComputeIndirect (GLintptr indirect); +GLAPI void APIENTRY glCopyImageSubData (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glFramebufferParameteri (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInternalformati64v (GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 *params); +GLAPI void APIENTRY glInvalidateTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glInvalidateTexImage (GLuint texture, GLint level); +GLAPI void APIENTRY glInvalidateBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glInvalidateBufferData (GLuint buffer); +GLAPI void APIENTRY glInvalidateFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateSubFramebuffer (GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glMultiDrawArraysIndirect (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirect (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glGetProgramInterfaceiv (GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI GLuint APIENTRY glGetProgramResourceIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glGetProgramResourceName (GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI void APIENTRY glGetProgramResourceiv (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); +GLAPI GLint APIENTRY glGetProgramResourceLocation (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI GLint APIENTRY glGetProgramResourceLocationIndex (GLuint program, GLenum programInterface, const GLchar *name); +GLAPI void APIENTRY glShaderStorageBlockBinding (GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI void APIENTRY glTexBufferRange (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTexStorage2DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTexStorage3DMultisample (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureView (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI void APIENTRY glBindVertexBuffer (GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormat (GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribIFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribLFormat (GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexAttribBinding (GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexBindingDivisor (GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glDebugMessageControl (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsert (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallback (GLDEBUGPROC callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLog (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI void APIENTRY glPushDebugGroup (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI void APIENTRY glPopDebugGroup (void); +GLAPI void APIENTRY glObjectLabel (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabel (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI void APIENTRY glObjectPtrLabel (const void *ptr, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectPtrLabel (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_VERSION_4_3 */ + +#ifndef GL_VERSION_4_4 +#define GL_VERSION_4_4 1 +#define GL_MAX_VERTEX_ATTRIB_STRIDE 0x82E5 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_TEXTURE_BUFFER_BINDING 0x8C2A +#define GL_MAP_PERSISTENT_BIT 0x0040 +#define GL_MAP_COHERENT_BIT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT 0x0100 +#define GL_CLIENT_STORAGE_BIT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE 0x821F +#define GL_BUFFER_STORAGE_FLAGS 0x8220 +#define GL_CLEAR_TEXTURE 0x9365 +#define GL_LOCATION_COMPONENT 0x934A +#define GL_TRANSFORM_FEEDBACK_BUFFER_INDEX 0x934B +#define GL_TRANSFORM_FEEDBACK_BUFFER_STRIDE 0x934C +#define GL_QUERY_BUFFER 0x9192 +#define GL_QUERY_BUFFER_BARRIER_BIT 0x00008000 +#define GL_QUERY_BUFFER_BINDING 0x9193 +#define GL_QUERY_RESULT_NO_WAIT 0x9194 +#define GL_MIRROR_CLAMP_TO_EDGE 0x8743 +typedef void (APIENTRYP PFNGLBUFFERSTORAGEPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARTEXIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARTEXSUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLBINDBUFFERSBASEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +typedef void (APIENTRYP PFNGLBINDBUFFERSRANGEPROC) (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +typedef void (APIENTRYP PFNGLBINDTEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDSAMPLERSPROC) (GLuint first, GLsizei count, const GLuint *samplers); +typedef void (APIENTRYP PFNGLBINDIMAGETEXTURESPROC) (GLuint first, GLsizei count, const GLuint *textures); +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERSPROC) (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorage (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearTexImage (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearTexSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glBindBuffersBase (GLenum target, GLuint first, GLsizei count, const GLuint *buffers); +GLAPI void APIENTRY glBindBuffersRange (GLenum target, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizeiptr *sizes); +GLAPI void APIENTRY glBindTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindSamplers (GLuint first, GLsizei count, const GLuint *samplers); +GLAPI void APIENTRY glBindImageTextures (GLuint first, GLsizei count, const GLuint *textures); +GLAPI void APIENTRY glBindVertexBuffers (GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +#endif +#endif /* GL_VERSION_4_4 */ + +#ifndef GL_VERSION_4_5 +#define GL_VERSION_4_5 1 +#define GL_CONTEXT_LOST 0x0507 +#define GL_NEGATIVE_ONE_TO_ONE 0x935E +#define GL_ZERO_TO_ONE 0x935F +#define GL_CLIP_ORIGIN 0x935C +#define GL_CLIP_DEPTH_MODE 0x935D +#define GL_QUERY_WAIT_INVERTED 0x8E17 +#define GL_QUERY_NO_WAIT_INVERTED 0x8E18 +#define GL_QUERY_BY_REGION_WAIT_INVERTED 0x8E19 +#define GL_QUERY_BY_REGION_NO_WAIT_INVERTED 0x8E1A +#define GL_MAX_CULL_DISTANCES 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES 0x82FA +#define GL_TEXTURE_TARGET 0x1006 +#define GL_QUERY_TARGET 0x82EA +#define GL_GUILTY_CONTEXT_RESET 0x8253 +#define GL_INNOCENT_CONTEXT_RESET 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET 0x8252 +#define GL_NO_RESET_NOTIFICATION 0x8261 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT 0x00000004 +#define GL_COLOR_TABLE 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE 0x80D2 +#define GL_PROXY_COLOR_TABLE 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE 0x80D5 +#define GL_CONVOLUTION_1D 0x8010 +#define GL_CONVOLUTION_2D 0x8011 +#define GL_SEPARABLE_2D 0x8012 +#define GL_HISTOGRAM 0x8024 +#define GL_PROXY_HISTOGRAM 0x8025 +#define GL_MINMAX 0x802E +#define GL_CONTEXT_RELEASE_BEHAVIOR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH 0x82FC +typedef void (APIENTRYP PFNGLCLIPCONTROLPROC) (GLenum origin, GLenum depth); +typedef void (APIENTRYP PFNGLCREATETRANSFORMFEEDBACKSPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC) (GLuint xfb, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC) (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKIVPROC) (GLuint xfb, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATEBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLCOPYNAMEDBUFFERSUBDATAPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERPROC) (GLuint buffer, GLenum access); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFERPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERI64VPROC) (GLuint buffer, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLCREATEFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC) (GLuint framebuffer, GLenum buf); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC) (GLuint framebuffer, GLenum src); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +typedef void (APIENTRYP PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC) (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFVPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +typedef void (APIENTRYP PFNGLCLEARNAMEDFRAMEBUFFERFIPROC) (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +typedef void (APIENTRYP PFNGLBLITNAMEDFRAMEBUFFERPROC) (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC) (GLuint framebuffer, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATERENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATETEXTURESPROC) (GLenum target, GLsizei n, GLuint *textures); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERPROC) (GLuint texture, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEPROC) (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DPROC) (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC) (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DPROC) (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFPROC) (GLuint texture, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIPROC) (GLuint texture, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLBINDTEXTUREUNITPROC) (GLuint unit, GLuint texture); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC) (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVPROC) (GLuint texture, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVPROC) (GLuint texture, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVPROC) (GLuint texture, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVPROC) (GLuint texture, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVPROC) (GLuint texture, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCREATEVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLVERTEXARRAYELEMENTBUFFERPROC) (GLuint vaobj, GLuint buffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBUFFERSPROC) (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBBINDINGPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBIFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYATTRIBLFORMATPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDINGDIVISORPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYIVPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXEDIVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINDEXED64IVPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +typedef void (APIENTRYP PFNGLCREATESAMPLERSPROC) (GLsizei n, GLuint *samplers); +typedef void (APIENTRYP PFNGLCREATEPROGRAMPIPELINESPROC) (GLsizei n, GLuint *pipelines); +typedef void (APIENTRYP PFNGLCREATEQUERIESPROC) (GLenum target, GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUI64VPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLGETQUERYBUFFEROBJECTUIVPROC) (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +typedef void (APIENTRYP PFNGLMEMORYBARRIERBYREGIONPROC) (GLbitfield barriers); +typedef void (APIENTRYP PFNGLGETTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSPROC) (void); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEPROC) (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLREADNPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNMAPDVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLTEXTUREBARRIERPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClipControl (GLenum origin, GLenum depth); +GLAPI void APIENTRY glCreateTransformFeedbacks (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glTransformFeedbackBufferBase (GLuint xfb, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackBufferRange (GLuint xfb, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glGetTransformFeedbackiv (GLuint xfb, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki_v (GLuint xfb, GLenum pname, GLuint index, GLint *param); +GLAPI void APIENTRY glGetTransformFeedbacki64_v (GLuint xfb, GLenum pname, GLuint index, GLint64 *param); +GLAPI void APIENTRY glCreateBuffers (GLsizei n, GLuint *buffers); +GLAPI void APIENTRY glNamedBufferStorage (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferData (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glCopyNamedBufferSubData (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glClearNamedBufferData (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubData (GLuint buffer, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void *APIENTRY glMapNamedBuffer (GLuint buffer, GLenum access); +GLAPI void *APIENTRY glMapNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI GLboolean APIENTRY glUnmapNamedBuffer (GLuint buffer); +GLAPI void APIENTRY glFlushMappedNamedBufferRange (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glGetNamedBufferParameteriv (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferParameteri64v (GLuint buffer, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetNamedBufferPointerv (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubData (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glCreateFramebuffers (GLsizei n, GLuint *framebuffers); +GLAPI void APIENTRY glNamedFramebufferRenderbuffer (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glNamedFramebufferParameteri (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glNamedFramebufferTexture (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayer (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferDrawBuffer (GLuint framebuffer, GLenum buf); +GLAPI void APIENTRY glNamedFramebufferDrawBuffers (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glNamedFramebufferReadBuffer (GLuint framebuffer, GLenum src); +GLAPI void APIENTRY glInvalidateNamedFramebufferData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments); +GLAPI void APIENTRY glInvalidateNamedFramebufferSubData (GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glClearNamedFramebufferiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLint *value); +GLAPI void APIENTRY glClearNamedFramebufferuiv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLuint *value); +GLAPI void APIENTRY glClearNamedFramebufferfv (GLuint framebuffer, GLenum buffer, GLint drawbuffer, const GLfloat *value); +GLAPI void APIENTRY glClearNamedFramebufferfi (GLuint framebuffer, GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); +GLAPI void APIENTRY glBlitNamedFramebuffer (GLuint readFramebuffer, GLuint drawFramebuffer, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatus (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glGetNamedFramebufferParameteriv (GLuint framebuffer, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameteriv (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateRenderbuffers (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glNamedRenderbufferStorage (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisample (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameteriv (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateTextures (GLenum target, GLsizei n, GLuint *textures); +GLAPI void APIENTRY glTextureBuffer (GLuint texture, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureBufferRange (GLuint texture, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3D (GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisample (GLuint texture, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCompressedTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCopyTextureSubImage1D (GLuint texture, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTextureSubImage3D (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureParameterf (GLuint texture, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfv (GLuint texture, GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glTextureParameteri (GLuint texture, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterIiv (GLuint texture, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuiv (GLuint texture, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glTextureParameteriv (GLuint texture, GLenum pname, const GLint *param); +GLAPI void APIENTRY glGenerateTextureMipmap (GLuint texture); +GLAPI void APIENTRY glBindTextureUnit (GLuint unit, GLuint texture); +GLAPI void APIENTRY glGetTextureImage (GLuint texture, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureImage (GLuint texture, GLint level, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetTextureLevelParameterfv (GLuint texture, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameteriv (GLuint texture, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterfv (GLuint texture, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterIiv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuiv (GLuint texture, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetTextureParameteriv (GLuint texture, GLenum pname, GLint *params); +GLAPI void APIENTRY glCreateVertexArrays (GLsizei n, GLuint *arrays); +GLAPI void APIENTRY glDisableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glEnableVertexArrayAttrib (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glVertexArrayElementBuffer (GLuint vaobj, GLuint buffer); +GLAPI void APIENTRY glVertexArrayVertexBuffer (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexBuffers (GLuint vaobj, GLuint first, GLsizei count, const GLuint *buffers, const GLintptr *offsets, const GLsizei *strides); +GLAPI void APIENTRY glVertexArrayAttribBinding (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayAttribFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribIFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayAttribLFormat (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayBindingDivisor (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glGetVertexArrayiv (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexediv (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayIndexed64iv (GLuint vaobj, GLuint index, GLenum pname, GLint64 *param); +GLAPI void APIENTRY glCreateSamplers (GLsizei n, GLuint *samplers); +GLAPI void APIENTRY glCreateProgramPipelines (GLsizei n, GLuint *pipelines); +GLAPI void APIENTRY glCreateQueries (GLenum target, GLsizei n, GLuint *ids); +GLAPI void APIENTRY glGetQueryBufferObjecti64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectui64v (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glGetQueryBufferObjectuiv (GLuint id, GLuint buffer, GLenum pname, GLintptr offset); +GLAPI void APIENTRY glMemoryBarrierByRegion (GLbitfield barriers); +GLAPI void APIENTRY glGetTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetCompressedTextureSubImage (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei bufSize, void *pixels); +GLAPI GLenum APIENTRY glGetGraphicsResetStatus (void); +GLAPI void APIENTRY glGetnCompressedTexImage (GLenum target, GLint lod, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *pixels); +GLAPI void APIENTRY glGetnUniformdv (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnUniformfv (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformiv (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuiv (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glReadnPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnMapdv (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfv (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapiv (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfv (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuiv (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusv (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStipple (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTable (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilter (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilter (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glTextureBarrier (void); +#endif +#endif /* GL_VERSION_4_5 */ + +#ifndef GL_VERSION_4_6 +#define GL_VERSION_4_6 1 +#define GL_SHADER_BINARY_FORMAT_SPIR_V 0x9551 +#define GL_SPIR_V_BINARY 0x9552 +#define GL_PARAMETER_BUFFER 0x80EE +#define GL_PARAMETER_BUFFER_BINDING 0x80EF +#define GL_CONTEXT_FLAG_NO_ERROR_BIT 0x00000008 +#define GL_VERTICES_SUBMITTED 0x82EE +#define GL_PRIMITIVES_SUBMITTED 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES 0x82F7 +#define GL_POLYGON_OFFSET_CLAMP 0x8E1B +#define GL_SPIR_V_EXTENSIONS 0x9553 +#define GL_NUM_SPIR_V_EXTENSIONS 0x9554 +#define GL_TEXTURE_MAX_ANISOTROPY 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY 0x84FF +#define GL_TRANSFORM_FEEDBACK_OVERFLOW 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW 0x82ED +typedef void (APIENTRYP PFNGLSPECIALIZESHADERPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpecializeShader (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +GLAPI void APIENTRY glMultiDrawArraysIndirectCount (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCount (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glPolygonOffsetClamp (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_VERSION_4_6 */ + +#ifndef GL_ARB_ES2_compatibility +#define GL_ARB_ES2_compatibility 1 +#endif /* GL_ARB_ES2_compatibility */ + +#ifndef GL_ARB_ES3_1_compatibility +#define GL_ARB_ES3_1_compatibility 1 +#endif /* GL_ARB_ES3_1_compatibility */ + +#ifndef GL_ARB_ES3_2_compatibility +#define GL_ARB_ES3_2_compatibility 1 +#define GL_PRIMITIVE_BOUNDING_BOX_ARB 0x92BE +#define GL_MULTISAMPLE_LINE_WIDTH_RANGE_ARB 0x9381 +#define GL_MULTISAMPLE_LINE_WIDTH_GRANULARITY_ARB 0x9382 +typedef void (APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXARBPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveBoundingBoxARB (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_ARB_ES3_2_compatibility */ + +#ifndef GL_ARB_ES3_compatibility +#define GL_ARB_ES3_compatibility 1 +#endif /* GL_ARB_ES3_compatibility */ + +#ifndef GL_ARB_arrays_of_arrays +#define GL_ARB_arrays_of_arrays 1 +#endif /* GL_ARB_arrays_of_arrays */ + +#ifndef GL_ARB_base_instance +#define GL_ARB_base_instance 1 +#endif /* GL_ARB_base_instance */ + +#ifndef GL_ARB_bindless_texture +#define GL_ARB_bindless_texture 1 +typedef khronos_uint64_t GLuint64EXT; +#define GL_UNSIGNED_INT64_ARB 0x140F +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLEARBPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEARBPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLEARBPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64ARBPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64ARBPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTARBPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64ARBPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VARBPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VARBPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleARB (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleARB (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentARB (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleARB (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentARB (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentARB (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64ARB (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64ARB (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentARB (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentARB (GLuint64 handle); +GLAPI void APIENTRY glVertexAttribL1ui64ARB (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL1ui64vARB (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLui64vARB (GLuint index, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_ARB_bindless_texture */ + +#ifndef GL_ARB_blend_func_extended +#define GL_ARB_blend_func_extended 1 +#endif /* GL_ARB_blend_func_extended */ + +#ifndef GL_ARB_buffer_storage +#define GL_ARB_buffer_storage 1 +#endif /* GL_ARB_buffer_storage */ + +#ifndef GL_ARB_cl_event +#define GL_ARB_cl_event 1 +struct _cl_context; +struct _cl_event; +#define GL_SYNC_CL_EVENT_ARB 0x8240 +#define GL_SYNC_CL_EVENT_COMPLETE_ARB 0x8241 +typedef GLsync (APIENTRYP PFNGLCREATESYNCFROMCLEVENTARBPROC) (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glCreateSyncFromCLeventARB (struct _cl_context *context, struct _cl_event *event, GLbitfield flags); +#endif +#endif /* GL_ARB_cl_event */ + +#ifndef GL_ARB_clear_buffer_object +#define GL_ARB_clear_buffer_object 1 +#endif /* GL_ARB_clear_buffer_object */ + +#ifndef GL_ARB_clear_texture +#define GL_ARB_clear_texture 1 +#endif /* GL_ARB_clear_texture */ + +#ifndef GL_ARB_clip_control +#define GL_ARB_clip_control 1 +#endif /* GL_ARB_clip_control */ + +#ifndef GL_ARB_color_buffer_float +#define GL_ARB_color_buffer_float 1 +#define GL_RGBA_FLOAT_MODE_ARB 0x8820 +#define GL_CLAMP_VERTEX_COLOR_ARB 0x891A +#define GL_CLAMP_FRAGMENT_COLOR_ARB 0x891B +#define GL_CLAMP_READ_COLOR_ARB 0x891C +#define GL_FIXED_ONLY_ARB 0x891D +typedef void (APIENTRYP PFNGLCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClampColorARB (GLenum target, GLenum clamp); +#endif +#endif /* GL_ARB_color_buffer_float */ + +#ifndef GL_ARB_compatibility +#define GL_ARB_compatibility 1 +#endif /* GL_ARB_compatibility */ + +#ifndef GL_ARB_compressed_texture_pixel_storage +#define GL_ARB_compressed_texture_pixel_storage 1 +#endif /* GL_ARB_compressed_texture_pixel_storage */ + +#ifndef GL_ARB_compute_shader +#define GL_ARB_compute_shader 1 +#endif /* GL_ARB_compute_shader */ + +#ifndef GL_ARB_compute_variable_group_size +#define GL_ARB_compute_variable_group_size 1 +#define GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB 0x9344 +#define GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB 0x90EB +#define GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB 0x9345 +#define GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB 0x91BF +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEGROUPSIZEARBPROC) (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDispatchComputeGroupSizeARB (GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z, GLuint group_size_x, GLuint group_size_y, GLuint group_size_z); +#endif +#endif /* GL_ARB_compute_variable_group_size */ + +#ifndef GL_ARB_conditional_render_inverted +#define GL_ARB_conditional_render_inverted 1 +#endif /* GL_ARB_conditional_render_inverted */ + +#ifndef GL_ARB_conservative_depth +#define GL_ARB_conservative_depth 1 +#endif /* GL_ARB_conservative_depth */ + +#ifndef GL_ARB_copy_buffer +#define GL_ARB_copy_buffer 1 +#endif /* GL_ARB_copy_buffer */ + +#ifndef GL_ARB_copy_image +#define GL_ARB_copy_image 1 +#endif /* GL_ARB_copy_image */ + +#ifndef GL_ARB_cull_distance +#define GL_ARB_cull_distance 1 +#endif /* GL_ARB_cull_distance */ + +#ifndef GL_ARB_debug_output +#define GL_ARB_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_ARB 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_ARB 0x8245 +#define GL_DEBUG_SOURCE_API_ARB 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_ARB 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_ARB 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_ARB 0x824A +#define GL_DEBUG_SOURCE_OTHER_ARB 0x824B +#define GL_DEBUG_TYPE_ERROR_ARB 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_ARB 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_ARB 0x8250 +#define GL_DEBUG_TYPE_OTHER_ARB 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_ARB 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_ARB 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_ARB 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_ARB 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_ARB 0x9147 +#define GL_DEBUG_SEVERITY_LOW_ARB 0x9148 +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLARBPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTARBPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKARBPROC) (GLDEBUGPROCARB callback, const void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGARBPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageControlARB (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertARB (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackARB (GLDEBUGPROCARB callback, const void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogARB (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +#endif +#endif /* GL_ARB_debug_output */ + +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#endif /* GL_ARB_depth_buffer_float */ + +#ifndef GL_ARB_depth_clamp +#define GL_ARB_depth_clamp 1 +#endif /* GL_ARB_depth_clamp */ + +#ifndef GL_ARB_depth_texture +#define GL_ARB_depth_texture 1 +#define GL_DEPTH_COMPONENT16_ARB 0x81A5 +#define GL_DEPTH_COMPONENT24_ARB 0x81A6 +#define GL_DEPTH_COMPONENT32_ARB 0x81A7 +#define GL_TEXTURE_DEPTH_SIZE_ARB 0x884A +#define GL_DEPTH_TEXTURE_MODE_ARB 0x884B +#endif /* GL_ARB_depth_texture */ + +#ifndef GL_ARB_derivative_control +#define GL_ARB_derivative_control 1 +#endif /* GL_ARB_derivative_control */ + +#ifndef GL_ARB_direct_state_access +#define GL_ARB_direct_state_access 1 +#endif /* GL_ARB_direct_state_access */ + +#ifndef GL_ARB_draw_buffers +#define GL_ARB_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ARB 0x8824 +#define GL_DRAW_BUFFER0_ARB 0x8825 +#define GL_DRAW_BUFFER1_ARB 0x8826 +#define GL_DRAW_BUFFER2_ARB 0x8827 +#define GL_DRAW_BUFFER3_ARB 0x8828 +#define GL_DRAW_BUFFER4_ARB 0x8829 +#define GL_DRAW_BUFFER5_ARB 0x882A +#define GL_DRAW_BUFFER6_ARB 0x882B +#define GL_DRAW_BUFFER7_ARB 0x882C +#define GL_DRAW_BUFFER8_ARB 0x882D +#define GL_DRAW_BUFFER9_ARB 0x882E +#define GL_DRAW_BUFFER10_ARB 0x882F +#define GL_DRAW_BUFFER11_ARB 0x8830 +#define GL_DRAW_BUFFER12_ARB 0x8831 +#define GL_DRAW_BUFFER13_ARB 0x8832 +#define GL_DRAW_BUFFER14_ARB 0x8833 +#define GL_DRAW_BUFFER15_ARB 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSARBPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersARB (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ARB_draw_buffers */ + +#ifndef GL_ARB_draw_buffers_blend +#define GL_ARB_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDEQUATIONIARBPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIARBPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (APIENTRYP PFNGLBLENDFUNCIARBPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIARBPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationiARB (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateiARB (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI void APIENTRY glBlendFunciARB (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateiARB (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +#endif +#endif /* GL_ARB_draw_buffers_blend */ + +#ifndef GL_ARB_draw_elements_base_vertex +#define GL_ARB_draw_elements_base_vertex 1 +#endif /* GL_ARB_draw_elements_base_vertex */ + +#ifndef GL_ARB_draw_indirect +#define GL_ARB_draw_indirect 1 +#endif /* GL_ARB_draw_indirect */ + +#ifndef GL_ARB_draw_instanced +#define GL_ARB_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDARBPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedARB (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedARB (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_ARB_draw_instanced */ + +#ifndef GL_ARB_enhanced_layouts +#define GL_ARB_enhanced_layouts 1 +#endif /* GL_ARB_enhanced_layouts */ + +#ifndef GL_ARB_explicit_attrib_location +#define GL_ARB_explicit_attrib_location 1 +#endif /* GL_ARB_explicit_attrib_location */ + +#ifndef GL_ARB_explicit_uniform_location +#define GL_ARB_explicit_uniform_location 1 +#endif /* GL_ARB_explicit_uniform_location */ + +#ifndef GL_ARB_fragment_coord_conventions +#define GL_ARB_fragment_coord_conventions 1 +#endif /* GL_ARB_fragment_coord_conventions */ + +#ifndef GL_ARB_fragment_layer_viewport +#define GL_ARB_fragment_layer_viewport 1 +#endif /* GL_ARB_fragment_layer_viewport */ + +#ifndef GL_ARB_fragment_program +#define GL_ARB_fragment_program 1 +#define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#define GL_PROGRAM_FORMAT_ASCII_ARB 0x8875 +#define GL_PROGRAM_LENGTH_ARB 0x8627 +#define GL_PROGRAM_FORMAT_ARB 0x8876 +#define GL_PROGRAM_BINDING_ARB 0x8677 +#define GL_PROGRAM_INSTRUCTIONS_ARB 0x88A0 +#define GL_MAX_PROGRAM_INSTRUCTIONS_ARB 0x88A1 +#define GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A2 +#define GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB 0x88A3 +#define GL_PROGRAM_TEMPORARIES_ARB 0x88A4 +#define GL_MAX_PROGRAM_TEMPORARIES_ARB 0x88A5 +#define GL_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A6 +#define GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB 0x88A7 +#define GL_PROGRAM_PARAMETERS_ARB 0x88A8 +#define GL_MAX_PROGRAM_PARAMETERS_ARB 0x88A9 +#define GL_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AA +#define GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB 0x88AB +#define GL_PROGRAM_ATTRIBS_ARB 0x88AC +#define GL_MAX_PROGRAM_ATTRIBS_ARB 0x88AD +#define GL_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AE +#define GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB 0x88AF +#define GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB 0x88B4 +#define GL_MAX_PROGRAM_ENV_PARAMETERS_ARB 0x88B5 +#define GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB 0x88B6 +#define GL_PROGRAM_ALU_INSTRUCTIONS_ARB 0x8805 +#define GL_PROGRAM_TEX_INSTRUCTIONS_ARB 0x8806 +#define GL_PROGRAM_TEX_INDIRECTIONS_ARB 0x8807 +#define GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x8808 +#define GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x8809 +#define GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x880A +#define GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB 0x880B +#define GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB 0x880C +#define GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB 0x880D +#define GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB 0x880E +#define GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB 0x880F +#define GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB 0x8810 +#define GL_PROGRAM_STRING_ARB 0x8628 +#define GL_PROGRAM_ERROR_POSITION_ARB 0x864B +#define GL_CURRENT_MATRIX_ARB 0x8641 +#define GL_TRANSPOSE_CURRENT_MATRIX_ARB 0x88B7 +#define GL_CURRENT_MATRIX_STACK_DEPTH_ARB 0x8640 +#define GL_MAX_PROGRAM_MATRICES_ARB 0x862F +#define GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB 0x862E +#define GL_MAX_TEXTURE_COORDS_ARB 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_ARB 0x8872 +#define GL_PROGRAM_ERROR_STRING_ARB 0x8874 +#define GL_MATRIX0_ARB 0x88C0 +#define GL_MATRIX1_ARB 0x88C1 +#define GL_MATRIX2_ARB 0x88C2 +#define GL_MATRIX3_ARB 0x88C3 +#define GL_MATRIX4_ARB 0x88C4 +#define GL_MATRIX5_ARB 0x88C5 +#define GL_MATRIX6_ARB 0x88C6 +#define GL_MATRIX7_ARB 0x88C7 +#define GL_MATRIX8_ARB 0x88C8 +#define GL_MATRIX9_ARB 0x88C9 +#define GL_MATRIX10_ARB 0x88CA +#define GL_MATRIX11_ARB 0x88CB +#define GL_MATRIX12_ARB 0x88CC +#define GL_MATRIX13_ARB 0x88CD +#define GL_MATRIX14_ARB 0x88CE +#define GL_MATRIX15_ARB 0x88CF +#define GL_MATRIX16_ARB 0x88D0 +#define GL_MATRIX17_ARB 0x88D1 +#define GL_MATRIX18_ARB 0x88D2 +#define GL_MATRIX19_ARB 0x88D3 +#define GL_MATRIX20_ARB 0x88D4 +#define GL_MATRIX21_ARB 0x88D5 +#define GL_MATRIX22_ARB 0x88D6 +#define GL_MATRIX23_ARB 0x88D7 +#define GL_MATRIX24_ARB 0x88D8 +#define GL_MATRIX25_ARB 0x88D9 +#define GL_MATRIX26_ARB 0x88DA +#define GL_MATRIX27_ARB 0x88DB +#define GL_MATRIX28_ARB 0x88DC +#define GL_MATRIX29_ARB 0x88DD +#define GL_MATRIX30_ARB 0x88DE +#define GL_MATRIX31_ARB 0x88DF +typedef void (APIENTRYP PFNGLPROGRAMSTRINGARBPROC) (GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLBINDPROGRAMARBPROC) (GLenum target, GLuint program); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSARBPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLGENPROGRAMSARBPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DARBPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4DVARBPROC) (GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FARBPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) (GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) (GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERFVARBPROC) (GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGARBPROC) (GLenum target, GLenum pname, void *string); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMARBPROC) (GLuint program); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramStringARB (GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glBindProgramARB (GLenum target, GLuint program); +GLAPI void APIENTRY glDeleteProgramsARB (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glGenProgramsARB (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glProgramEnvParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramEnvParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramEnvParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramEnvParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameter4dARB (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramLocalParameter4dvARB (GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glProgramLocalParameter4fARB (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramLocalParameter4fvARB (GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetProgramEnvParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramEnvParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramLocalParameterdvARB (GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetProgramLocalParameterfvARB (GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetProgramivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringARB (GLenum target, GLenum pname, void *string); +GLAPI GLboolean APIENTRY glIsProgramARB (GLuint program); +#endif +#endif /* GL_ARB_fragment_program */ + +#ifndef GL_ARB_fragment_program_shadow +#define GL_ARB_fragment_program_shadow 1 +#endif /* GL_ARB_fragment_program_shadow */ + +#ifndef GL_ARB_fragment_shader +#define GL_ARB_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ARB 0x8B30 +#define GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB 0x8B49 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB 0x8B8B +#endif /* GL_ARB_fragment_shader */ + +#ifndef GL_ARB_fragment_shader_interlock +#define GL_ARB_fragment_shader_interlock 1 +#endif /* GL_ARB_fragment_shader_interlock */ + +#ifndef GL_ARB_framebuffer_no_attachments +#define GL_ARB_framebuffer_no_attachments 1 +#endif /* GL_ARB_framebuffer_no_attachments */ + +#ifndef GL_ARB_framebuffer_object +#define GL_ARB_framebuffer_object 1 +#endif /* GL_ARB_framebuffer_object */ + +#ifndef GL_ARB_framebuffer_sRGB +#define GL_ARB_framebuffer_sRGB 1 +#endif /* GL_ARB_framebuffer_sRGB */ + +#ifndef GL_ARB_geometry_shader4 +#define GL_ARB_geometry_shader4 1 +#define GL_LINES_ADJACENCY_ARB 0x000A +#define GL_LINE_STRIP_ADJACENCY_ARB 0x000B +#define GL_TRIANGLES_ADJACENCY_ARB 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_ARB 0x000D +#define GL_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB 0x8C29 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB 0x8DA7 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB 0x8DA9 +#define GL_GEOMETRY_SHADER_ARB 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_ARB 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_ARB 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_ARB 0x8DDC +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_ARB 0x8DDE +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB 0x8DE1 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIARBPROC) (GLuint program, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEARBPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriARB (GLuint program, GLenum pname, GLint value); +GLAPI void APIENTRY glFramebufferTextureARB (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureLayerARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glFramebufferTextureFaceARB (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_ARB_geometry_shader4 */ + +#ifndef GL_ARB_get_program_binary +#define GL_ARB_get_program_binary 1 +#endif /* GL_ARB_get_program_binary */ + +#ifndef GL_ARB_get_texture_sub_image +#define GL_ARB_get_texture_sub_image 1 +#endif /* GL_ARB_get_texture_sub_image */ + +#ifndef GL_ARB_gl_spirv +#define GL_ARB_gl_spirv 1 +#define GL_SHADER_BINARY_FORMAT_SPIR_V_ARB 0x9551 +#define GL_SPIR_V_BINARY_ARB 0x9552 +typedef void (APIENTRYP PFNGLSPECIALIZESHADERARBPROC) (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpecializeShaderARB (GLuint shader, const GLchar *pEntryPoint, GLuint numSpecializationConstants, const GLuint *pConstantIndex, const GLuint *pConstantValue); +#endif +#endif /* GL_ARB_gl_spirv */ + +#ifndef GL_ARB_gpu_shader5 +#define GL_ARB_gpu_shader5 1 +#endif /* GL_ARB_gpu_shader5 */ + +#ifndef GL_ARB_gpu_shader_fp64 +#define GL_ARB_gpu_shader_fp64 1 +#endif /* GL_ARB_gpu_shader_fp64 */ + +#ifndef GL_ARB_gpu_shader_int64 +#define GL_ARB_gpu_shader_int64 1 +#define GL_INT64_ARB 0x140E +#define GL_INT64_VEC2_ARB 0x8FE9 +#define GL_INT64_VEC3_ARB 0x8FEA +#define GL_INT64_VEC4_ARB 0x8FEB +#define GL_UNSIGNED_INT64_VEC2_ARB 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_ARB 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_ARB 0x8FF7 +typedef void (APIENTRYP PFNGLUNIFORM1I64ARBPROC) (GLint location, GLint64 x); +typedef void (APIENTRYP PFNGLUNIFORM2I64ARBPROC) (GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP PFNGLUNIFORM3I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP PFNGLUNIFORM4I64ARBPROC) (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VARBPROC) (GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64ARBPROC) (GLint location, GLuint64 x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64ARBPROC) (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VARBPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VARBPROC) (GLuint program, GLint location, GLint64 *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLuint64 *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUI64VARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64ARBPROC) (GLuint program, GLint location, GLint64 x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64ARBPROC) (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64ARBPROC) (GLuint program, GLint location, GLuint64 x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64ARBPROC) (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VARBPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64ARB (GLint location, GLint64 x); +GLAPI void APIENTRY glUniform2i64ARB (GLint location, GLint64 x, GLint64 y); +GLAPI void APIENTRY glUniform3i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z); +GLAPI void APIENTRY glUniform4i64ARB (GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +GLAPI void APIENTRY glUniform1i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform2i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform3i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform4i64vARB (GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glUniform1ui64ARB (GLint location, GLuint64 x); +GLAPI void APIENTRY glUniform2ui64ARB (GLint location, GLuint64 x, GLuint64 y); +GLAPI void APIENTRY glUniform3ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +GLAPI void APIENTRY glUniform4ui64ARB (GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +GLAPI void APIENTRY glUniform1ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform2ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform3ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glUniform4ui64vARB (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glGetUniformi64vARB (GLuint program, GLint location, GLint64 *params); +GLAPI void APIENTRY glGetUniformui64vARB (GLuint program, GLint location, GLuint64 *params); +GLAPI void APIENTRY glGetnUniformi64vARB (GLuint program, GLint location, GLsizei bufSize, GLint64 *params); +GLAPI void APIENTRY glGetnUniformui64vARB (GLuint program, GLint location, GLsizei bufSize, GLuint64 *params); +GLAPI void APIENTRY glProgramUniform1i64ARB (GLuint program, GLint location, GLint64 x); +GLAPI void APIENTRY glProgramUniform2i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y); +GLAPI void APIENTRY glProgramUniform3i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z); +GLAPI void APIENTRY glProgramUniform4i64ARB (GLuint program, GLint location, GLint64 x, GLint64 y, GLint64 z, GLint64 w); +GLAPI void APIENTRY glProgramUniform1i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform2i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform3i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform4i64vARB (GLuint program, GLint location, GLsizei count, const GLint64 *value); +GLAPI void APIENTRY glProgramUniform1ui64ARB (GLuint program, GLint location, GLuint64 x); +GLAPI void APIENTRY glProgramUniform2ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y); +GLAPI void APIENTRY glProgramUniform3ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z); +GLAPI void APIENTRY glProgramUniform4ui64ARB (GLuint program, GLint location, GLuint64 x, GLuint64 y, GLuint64 z, GLuint64 w); +GLAPI void APIENTRY glProgramUniform1ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform2ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform3ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniform4ui64vARB (GLuint program, GLint location, GLsizei count, const GLuint64 *value); +#endif +#endif /* GL_ARB_gpu_shader_int64 */ + +#ifndef GL_ARB_half_float_pixel +#define GL_ARB_half_float_pixel 1 +typedef khronos_uint16_t GLhalfARB; +#define GL_HALF_FLOAT_ARB 0x140B +#endif /* GL_ARB_half_float_pixel */ + +#ifndef GL_ARB_half_float_vertex +#define GL_ARB_half_float_vertex 1 +#endif /* GL_ARB_half_float_vertex */ + +#ifndef GL_ARB_imaging +#define GL_ARB_imaging 1 +#define GL_CONVOLUTION_BORDER_MODE 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS 0x8015 +#define GL_REDUCE 0x8016 +#define GL_CONVOLUTION_FORMAT 0x8017 +#define GL_CONVOLUTION_WIDTH 0x8018 +#define GL_CONVOLUTION_HEIGHT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS 0x8023 +#define GL_HISTOGRAM_WIDTH 0x8026 +#define GL_HISTOGRAM_FORMAT 0x8027 +#define GL_HISTOGRAM_RED_SIZE 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE 0x802C +#define GL_HISTOGRAM_SINK 0x802D +#define GL_MINMAX_FORMAT 0x802F +#define GL_MINMAX_SINK 0x8030 +#define GL_TABLE_TOO_LARGE 0x8031 +#define GL_COLOR_MATRIX 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS 0x80BB +#define GL_COLOR_TABLE_SCALE 0x80D6 +#define GL_COLOR_TABLE_BIAS 0x80D7 +#define GL_COLOR_TABLE_FORMAT 0x80D8 +#define GL_COLOR_TABLE_WIDTH 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE 0x80DF +#define GL_CONSTANT_BORDER 0x8151 +#define GL_REPLICATE_BORDER 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR 0x8154 +typedef void (APIENTRYP PFNGLCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLEPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTERPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTERPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTable (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTable (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTable (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glColorSubTable (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTable (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glConvolutionFilter1D (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterf (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteri (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameteriv (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2D (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilter (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilter (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2D (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +GLAPI void APIENTRY glGetHistogram (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmax (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfv (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameteriv (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogram (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmax (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogram (GLenum target); +GLAPI void APIENTRY glResetMinmax (GLenum target); +#endif +#endif /* GL_ARB_imaging */ + +#ifndef GL_ARB_indirect_parameters +#define GL_ARB_indirect_parameters 1 +#define GL_PARAMETER_BUFFER_ARB 0x80EE +#define GL_PARAMETER_BUFFER_BINDING_ARB 0x80EF +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTCOUNTARBPROC) (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTCOUNTARBPROC) (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectCountARB (GLenum mode, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectCountARB (GLenum mode, GLenum type, const void *indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_ARB_indirect_parameters */ + +#ifndef GL_ARB_instanced_arrays +#define GL_ARB_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB 0x88FE +typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribDivisorARB (GLuint index, GLuint divisor); +#endif +#endif /* GL_ARB_instanced_arrays */ + +#ifndef GL_ARB_internalformat_query +#define GL_ARB_internalformat_query 1 +#endif /* GL_ARB_internalformat_query */ + +#ifndef GL_ARB_internalformat_query2 +#define GL_ARB_internalformat_query2 1 +#define GL_SRGB_DECODE_ARB 0x8299 +#define GL_VIEW_CLASS_EAC_R11 0x9383 +#define GL_VIEW_CLASS_EAC_RG11 0x9384 +#define GL_VIEW_CLASS_ETC2_RGB 0x9385 +#define GL_VIEW_CLASS_ETC2_RGBA 0x9386 +#define GL_VIEW_CLASS_ETC2_EAC_RGBA 0x9387 +#define GL_VIEW_CLASS_ASTC_4x4_RGBA 0x9388 +#define GL_VIEW_CLASS_ASTC_5x4_RGBA 0x9389 +#define GL_VIEW_CLASS_ASTC_5x5_RGBA 0x938A +#define GL_VIEW_CLASS_ASTC_6x5_RGBA 0x938B +#define GL_VIEW_CLASS_ASTC_6x6_RGBA 0x938C +#define GL_VIEW_CLASS_ASTC_8x5_RGBA 0x938D +#define GL_VIEW_CLASS_ASTC_8x6_RGBA 0x938E +#define GL_VIEW_CLASS_ASTC_8x8_RGBA 0x938F +#define GL_VIEW_CLASS_ASTC_10x5_RGBA 0x9390 +#define GL_VIEW_CLASS_ASTC_10x6_RGBA 0x9391 +#define GL_VIEW_CLASS_ASTC_10x8_RGBA 0x9392 +#define GL_VIEW_CLASS_ASTC_10x10_RGBA 0x9393 +#define GL_VIEW_CLASS_ASTC_12x10_RGBA 0x9394 +#define GL_VIEW_CLASS_ASTC_12x12_RGBA 0x9395 +#endif /* GL_ARB_internalformat_query2 */ + +#ifndef GL_ARB_invalidate_subdata +#define GL_ARB_invalidate_subdata 1 +#endif /* GL_ARB_invalidate_subdata */ + +#ifndef GL_ARB_map_buffer_alignment +#define GL_ARB_map_buffer_alignment 1 +#endif /* GL_ARB_map_buffer_alignment */ + +#ifndef GL_ARB_map_buffer_range +#define GL_ARB_map_buffer_range 1 +#endif /* GL_ARB_map_buffer_range */ + +#ifndef GL_ARB_matrix_palette +#define GL_ARB_matrix_palette 1 +#define GL_MATRIX_PALETTE_ARB 0x8840 +#define GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB 0x8841 +#define GL_MAX_PALETTE_MATRICES_ARB 0x8842 +#define GL_CURRENT_PALETTE_MATRIX_ARB 0x8843 +#define GL_MATRIX_INDEX_ARRAY_ARB 0x8844 +#define GL_CURRENT_MATRIX_INDEX_ARB 0x8845 +#define GL_MATRIX_INDEX_ARRAY_SIZE_ARB 0x8846 +#define GL_MATRIX_INDEX_ARRAY_TYPE_ARB 0x8847 +#define GL_MATRIX_INDEX_ARRAY_STRIDE_ARB 0x8848 +#define GL_MATRIX_INDEX_ARRAY_POINTER_ARB 0x8849 +typedef void (APIENTRYP PFNGLCURRENTPALETTEMATRIXARBPROC) (GLint index); +typedef void (APIENTRYP PFNGLMATRIXINDEXUBVARBPROC) (GLint size, const GLubyte *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUSVARBPROC) (GLint size, const GLushort *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXUIVARBPROC) (GLint size, const GLuint *indices); +typedef void (APIENTRYP PFNGLMATRIXINDEXPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCurrentPaletteMatrixARB (GLint index); +GLAPI void APIENTRY glMatrixIndexubvARB (GLint size, const GLubyte *indices); +GLAPI void APIENTRY glMatrixIndexusvARB (GLint size, const GLushort *indices); +GLAPI void APIENTRY glMatrixIndexuivARB (GLint size, const GLuint *indices); +GLAPI void APIENTRY glMatrixIndexPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_ARB_matrix_palette */ + +#ifndef GL_ARB_multi_bind +#define GL_ARB_multi_bind 1 +#endif /* GL_ARB_multi_bind */ + +#ifndef GL_ARB_multi_draw_indirect +#define GL_ARB_multi_draw_indirect 1 +#endif /* GL_ARB_multi_draw_indirect */ + +#ifndef GL_ARB_multisample +#define GL_ARB_multisample 1 +#define GL_MULTISAMPLE_ARB 0x809D +#define GL_SAMPLE_ALPHA_TO_COVERAGE_ARB 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_ARB 0x809F +#define GL_SAMPLE_COVERAGE_ARB 0x80A0 +#define GL_SAMPLE_BUFFERS_ARB 0x80A8 +#define GL_SAMPLES_ARB 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE_ARB 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT_ARB 0x80AB +#define GL_MULTISAMPLE_BIT_ARB 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLECOVERAGEARBPROC) (GLfloat value, GLboolean invert); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleCoverageARB (GLfloat value, GLboolean invert); +#endif +#endif /* GL_ARB_multisample */ + +#ifndef GL_ARB_multitexture +#define GL_ARB_multitexture 1 +#define GL_TEXTURE0_ARB 0x84C0 +#define GL_TEXTURE1_ARB 0x84C1 +#define GL_TEXTURE2_ARB 0x84C2 +#define GL_TEXTURE3_ARB 0x84C3 +#define GL_TEXTURE4_ARB 0x84C4 +#define GL_TEXTURE5_ARB 0x84C5 +#define GL_TEXTURE6_ARB 0x84C6 +#define GL_TEXTURE7_ARB 0x84C7 +#define GL_TEXTURE8_ARB 0x84C8 +#define GL_TEXTURE9_ARB 0x84C9 +#define GL_TEXTURE10_ARB 0x84CA +#define GL_TEXTURE11_ARB 0x84CB +#define GL_TEXTURE12_ARB 0x84CC +#define GL_TEXTURE13_ARB 0x84CD +#define GL_TEXTURE14_ARB 0x84CE +#define GL_TEXTURE15_ARB 0x84CF +#define GL_TEXTURE16_ARB 0x84D0 +#define GL_TEXTURE17_ARB 0x84D1 +#define GL_TEXTURE18_ARB 0x84D2 +#define GL_TEXTURE19_ARB 0x84D3 +#define GL_TEXTURE20_ARB 0x84D4 +#define GL_TEXTURE21_ARB 0x84D5 +#define GL_TEXTURE22_ARB 0x84D6 +#define GL_TEXTURE23_ARB 0x84D7 +#define GL_TEXTURE24_ARB 0x84D8 +#define GL_TEXTURE25_ARB 0x84D9 +#define GL_TEXTURE26_ARB 0x84DA +#define GL_TEXTURE27_ARB 0x84DB +#define GL_TEXTURE28_ARB 0x84DC +#define GL_TEXTURE29_ARB 0x84DD +#define GL_TEXTURE30_ARB 0x84DE +#define GL_TEXTURE31_ARB 0x84DF +#define GL_ACTIVE_TEXTURE_ARB 0x84E0 +#define GL_CLIENT_ACTIVE_TEXTURE_ARB 0x84E1 +#define GL_MAX_TEXTURE_UNITS_ARB 0x84E2 +typedef void (APIENTRYP PFNGLACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLCLIENTACTIVETEXTUREARBPROC) (GLenum texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DARBPROC) (GLenum target, GLdouble s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FARBPROC) (GLenum target, GLfloat s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IARBPROC) (GLenum target, GLint s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SARBPROC) (GLenum target, GLshort s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DARBPROC) (GLenum target, GLdouble s, GLdouble t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FARBPROC) (GLenum target, GLfloat s, GLfloat t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IARBPROC) (GLenum target, GLint s, GLint t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SARBPROC) (GLenum target, GLshort s, GLshort t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IARBPROC) (GLenum target, GLint s, GLint t, GLint r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3SVARBPROC) (GLenum target, const GLshort *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DARBPROC) (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4DVARBPROC) (GLenum target, const GLdouble *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FARBPROC) (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4FVARBPROC) (GLenum target, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IARBPROC) (GLenum target, GLint s, GLint t, GLint r, GLint q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4IVARBPROC) (GLenum target, const GLint *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SARBPROC) (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4SVARBPROC) (GLenum target, const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glClientActiveTextureARB (GLenum texture); +GLAPI void APIENTRY glMultiTexCoord1dARB (GLenum target, GLdouble s); +GLAPI void APIENTRY glMultiTexCoord1dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord1fARB (GLenum target, GLfloat s); +GLAPI void APIENTRY glMultiTexCoord1fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord1iARB (GLenum target, GLint s); +GLAPI void APIENTRY glMultiTexCoord1ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord1sARB (GLenum target, GLshort s); +GLAPI void APIENTRY glMultiTexCoord1svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord2dARB (GLenum target, GLdouble s, GLdouble t); +GLAPI void APIENTRY glMultiTexCoord2dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord2fARB (GLenum target, GLfloat s, GLfloat t); +GLAPI void APIENTRY glMultiTexCoord2fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord2iARB (GLenum target, GLint s, GLint t); +GLAPI void APIENTRY glMultiTexCoord2ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord2sARB (GLenum target, GLshort s, GLshort t); +GLAPI void APIENTRY glMultiTexCoord2svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord3dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r); +GLAPI void APIENTRY glMultiTexCoord3dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord3fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r); +GLAPI void APIENTRY glMultiTexCoord3fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord3iARB (GLenum target, GLint s, GLint t, GLint r); +GLAPI void APIENTRY glMultiTexCoord3ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord3sARB (GLenum target, GLshort s, GLshort t, GLshort r); +GLAPI void APIENTRY glMultiTexCoord3svARB (GLenum target, const GLshort *v); +GLAPI void APIENTRY glMultiTexCoord4dARB (GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q); +GLAPI void APIENTRY glMultiTexCoord4dvARB (GLenum target, const GLdouble *v); +GLAPI void APIENTRY glMultiTexCoord4fARB (GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q); +GLAPI void APIENTRY glMultiTexCoord4fvARB (GLenum target, const GLfloat *v); +GLAPI void APIENTRY glMultiTexCoord4iARB (GLenum target, GLint s, GLint t, GLint r, GLint q); +GLAPI void APIENTRY glMultiTexCoord4ivARB (GLenum target, const GLint *v); +GLAPI void APIENTRY glMultiTexCoord4sARB (GLenum target, GLshort s, GLshort t, GLshort r, GLshort q); +GLAPI void APIENTRY glMultiTexCoord4svARB (GLenum target, const GLshort *v); +#endif +#endif /* GL_ARB_multitexture */ + +#ifndef GL_ARB_occlusion_query +#define GL_ARB_occlusion_query 1 +#define GL_QUERY_COUNTER_BITS_ARB 0x8864 +#define GL_CURRENT_QUERY_ARB 0x8865 +#define GL_QUERY_RESULT_ARB 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_ARB 0x8867 +#define GL_SAMPLES_PASSED_ARB 0x8914 +typedef void (APIENTRYP PFNGLGENQUERIESARBPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEQUERIESARBPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISQUERYARBPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINQUERYARBPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLENDQUERYARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETQUERYIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTIVARBPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUIVARBPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueriesARB (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteQueriesARB (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsQueryARB (GLuint id); +GLAPI void APIENTRY glBeginQueryARB (GLenum target, GLuint id); +GLAPI void APIENTRY glEndQueryARB (GLenum target); +GLAPI void APIENTRY glGetQueryivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectivARB (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetQueryObjectuivARB (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_ARB_occlusion_query */ + +#ifndef GL_ARB_occlusion_query2 +#define GL_ARB_occlusion_query2 1 +#endif /* GL_ARB_occlusion_query2 */ + +#ifndef GL_ARB_parallel_shader_compile +#define GL_ARB_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_ARB 0x91B0 +#define GL_COMPLETION_STATUS_ARB 0x91B1 +typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSARBPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMaxShaderCompilerThreadsARB (GLuint count); +#endif +#endif /* GL_ARB_parallel_shader_compile */ + +#ifndef GL_ARB_pipeline_statistics_query +#define GL_ARB_pipeline_statistics_query 1 +#define GL_VERTICES_SUBMITTED_ARB 0x82EE +#define GL_PRIMITIVES_SUBMITTED_ARB 0x82EF +#define GL_VERTEX_SHADER_INVOCATIONS_ARB 0x82F0 +#define GL_TESS_CONTROL_SHADER_PATCHES_ARB 0x82F1 +#define GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB 0x82F2 +#define GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB 0x82F3 +#define GL_FRAGMENT_SHADER_INVOCATIONS_ARB 0x82F4 +#define GL_COMPUTE_SHADER_INVOCATIONS_ARB 0x82F5 +#define GL_CLIPPING_INPUT_PRIMITIVES_ARB 0x82F6 +#define GL_CLIPPING_OUTPUT_PRIMITIVES_ARB 0x82F7 +#endif /* GL_ARB_pipeline_statistics_query */ + +#ifndef GL_ARB_pixel_buffer_object +#define GL_ARB_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_ARB 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_ARB 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_ARB 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_ARB 0x88EF +#endif /* GL_ARB_pixel_buffer_object */ + +#ifndef GL_ARB_point_parameters +#define GL_ARB_point_parameters 1 +#define GL_POINT_SIZE_MIN_ARB 0x8126 +#define GL_POINT_SIZE_MAX_ARB 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 +#define GL_POINT_DISTANCE_ATTENUATION_ARB 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFARBPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVARBPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfARB (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvARB (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_ARB_point_parameters */ + +#ifndef GL_ARB_point_sprite +#define GL_ARB_point_sprite 1 +#define GL_POINT_SPRITE_ARB 0x8861 +#define GL_COORD_REPLACE_ARB 0x8862 +#endif /* GL_ARB_point_sprite */ + +#ifndef GL_ARB_polygon_offset_clamp +#define GL_ARB_polygon_offset_clamp 1 +#endif /* GL_ARB_polygon_offset_clamp */ + +#ifndef GL_ARB_post_depth_coverage +#define GL_ARB_post_depth_coverage 1 +#endif /* GL_ARB_post_depth_coverage */ + +#ifndef GL_ARB_program_interface_query +#define GL_ARB_program_interface_query 1 +#endif /* GL_ARB_program_interface_query */ + +#ifndef GL_ARB_provoking_vertex +#define GL_ARB_provoking_vertex 1 +#endif /* GL_ARB_provoking_vertex */ + +#ifndef GL_ARB_query_buffer_object +#define GL_ARB_query_buffer_object 1 +#endif /* GL_ARB_query_buffer_object */ + +#ifndef GL_ARB_robust_buffer_access_behavior +#define GL_ARB_robust_buffer_access_behavior 1 +#endif /* GL_ARB_robust_buffer_access_behavior */ + +#ifndef GL_ARB_robustness +#define GL_ARB_robustness 1 +#define GL_CONTEXT_FLAG_ROBUST_ACCESS_BIT_ARB 0x00000004 +#define GL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 +#define GL_GUILTY_CONTEXT_RESET_ARB 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_ARB 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_ARB 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 +#define GL_NO_RESET_NOTIFICATION_ARB 0x8261 +typedef GLenum (APIENTRYP PFNGLGETGRAPHICSRESETSTATUSARBPROC) (void); +typedef void (APIENTRYP PFNGLGETNTEXIMAGEARBPROC) (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLREADNPIXELSARBPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (APIENTRYP PFNGLGETNCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint lod, GLsizei bufSize, void *img); +typedef void (APIENTRYP PFNGLGETNUNIFORMFVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMUIVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +typedef void (APIENTRYP PFNGLGETNUNIFORMDVARBPROC) (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNMAPDVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +typedef void (APIENTRYP PFNGLGETNMAPFVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLGETNMAPIVARBPROC) (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +typedef void (APIENTRYP PFNGLGETNPIXELMAPFVARBPROC) (GLenum map, GLsizei bufSize, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUIVARBPROC) (GLenum map, GLsizei bufSize, GLuint *values); +typedef void (APIENTRYP PFNGLGETNPIXELMAPUSVARBPROC) (GLenum map, GLsizei bufSize, GLushort *values); +typedef void (APIENTRYP PFNGLGETNPOLYGONSTIPPLEARBPROC) (GLsizei bufSize, GLubyte *pattern); +typedef void (APIENTRYP PFNGLGETNCOLORTABLEARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +typedef void (APIENTRYP PFNGLGETNCONVOLUTIONFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +typedef void (APIENTRYP PFNGLGETNSEPARABLEFILTERARBPROC) (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +typedef void (APIENTRYP PFNGLGETNHISTOGRAMARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +typedef void (APIENTRYP PFNGLGETNMINMAXARBPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glGetGraphicsResetStatusARB (void); +GLAPI void APIENTRY glGetnTexImageARB (GLenum target, GLint level, GLenum format, GLenum type, GLsizei bufSize, void *img); +GLAPI void APIENTRY glReadnPixelsARB (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GLAPI void APIENTRY glGetnCompressedTexImageARB (GLenum target, GLint lod, GLsizei bufSize, void *img); +GLAPI void APIENTRY glGetnUniformfvARB (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GLAPI void APIENTRY glGetnUniformivARB (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GLAPI void APIENTRY glGetnUniformuivARB (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +GLAPI void APIENTRY glGetnUniformdvARB (GLuint program, GLint location, GLsizei bufSize, GLdouble *params); +GLAPI void APIENTRY glGetnMapdvARB (GLenum target, GLenum query, GLsizei bufSize, GLdouble *v); +GLAPI void APIENTRY glGetnMapfvARB (GLenum target, GLenum query, GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glGetnMapivARB (GLenum target, GLenum query, GLsizei bufSize, GLint *v); +GLAPI void APIENTRY glGetnPixelMapfvARB (GLenum map, GLsizei bufSize, GLfloat *values); +GLAPI void APIENTRY glGetnPixelMapuivARB (GLenum map, GLsizei bufSize, GLuint *values); +GLAPI void APIENTRY glGetnPixelMapusvARB (GLenum map, GLsizei bufSize, GLushort *values); +GLAPI void APIENTRY glGetnPolygonStippleARB (GLsizei bufSize, GLubyte *pattern); +GLAPI void APIENTRY glGetnColorTableARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *table); +GLAPI void APIENTRY glGetnConvolutionFilterARB (GLenum target, GLenum format, GLenum type, GLsizei bufSize, void *image); +GLAPI void APIENTRY glGetnSeparableFilterARB (GLenum target, GLenum format, GLenum type, GLsizei rowBufSize, void *row, GLsizei columnBufSize, void *column, void *span); +GLAPI void APIENTRY glGetnHistogramARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +GLAPI void APIENTRY glGetnMinmaxARB (GLenum target, GLboolean reset, GLenum format, GLenum type, GLsizei bufSize, void *values); +#endif +#endif /* GL_ARB_robustness */ + +#ifndef GL_ARB_robustness_isolation +#define GL_ARB_robustness_isolation 1 +#endif /* GL_ARB_robustness_isolation */ + +#ifndef GL_ARB_sample_locations +#define GL_ARB_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_ARB 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_ARB 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_ARB 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_ARB 0x9340 +#define GL_SAMPLE_LOCATION_ARB 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_ARB 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_ARB 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_ARB 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVARBPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLEVALUATEDEPTHVALUESARBPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvARB (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvARB (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glEvaluateDepthValuesARB (void); +#endif +#endif /* GL_ARB_sample_locations */ + +#ifndef GL_ARB_sample_shading +#define GL_ARB_sample_shading 1 +#define GL_SAMPLE_SHADING_ARB 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_ARB 0x8C37 +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGARBPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMinSampleShadingARB (GLfloat value); +#endif +#endif /* GL_ARB_sample_shading */ + +#ifndef GL_ARB_sampler_objects +#define GL_ARB_sampler_objects 1 +#endif /* GL_ARB_sampler_objects */ + +#ifndef GL_ARB_seamless_cube_map +#define GL_ARB_seamless_cube_map 1 +#endif /* GL_ARB_seamless_cube_map */ + +#ifndef GL_ARB_seamless_cubemap_per_texture +#define GL_ARB_seamless_cubemap_per_texture 1 +#endif /* GL_ARB_seamless_cubemap_per_texture */ + +#ifndef GL_ARB_separate_shader_objects +#define GL_ARB_separate_shader_objects 1 +#endif /* GL_ARB_separate_shader_objects */ + +#ifndef GL_ARB_shader_atomic_counter_ops +#define GL_ARB_shader_atomic_counter_ops 1 +#endif /* GL_ARB_shader_atomic_counter_ops */ + +#ifndef GL_ARB_shader_atomic_counters +#define GL_ARB_shader_atomic_counters 1 +#endif /* GL_ARB_shader_atomic_counters */ + +#ifndef GL_ARB_shader_ballot +#define GL_ARB_shader_ballot 1 +#endif /* GL_ARB_shader_ballot */ + +#ifndef GL_ARB_shader_bit_encoding +#define GL_ARB_shader_bit_encoding 1 +#endif /* GL_ARB_shader_bit_encoding */ + +#ifndef GL_ARB_shader_clock +#define GL_ARB_shader_clock 1 +#endif /* GL_ARB_shader_clock */ + +#ifndef GL_ARB_shader_draw_parameters +#define GL_ARB_shader_draw_parameters 1 +#endif /* GL_ARB_shader_draw_parameters */ + +#ifndef GL_ARB_shader_group_vote +#define GL_ARB_shader_group_vote 1 +#endif /* GL_ARB_shader_group_vote */ + +#ifndef GL_ARB_shader_image_load_store +#define GL_ARB_shader_image_load_store 1 +#endif /* GL_ARB_shader_image_load_store */ + +#ifndef GL_ARB_shader_image_size +#define GL_ARB_shader_image_size 1 +#endif /* GL_ARB_shader_image_size */ + +#ifndef GL_ARB_shader_objects +#define GL_ARB_shader_objects 1 +#ifdef __APPLE__ +typedef void *GLhandleARB; +#else +typedef unsigned int GLhandleARB; +#endif +typedef char GLcharARB; +#define GL_PROGRAM_OBJECT_ARB 0x8B40 +#define GL_SHADER_OBJECT_ARB 0x8B48 +#define GL_OBJECT_TYPE_ARB 0x8B4E +#define GL_OBJECT_SUBTYPE_ARB 0x8B4F +#define GL_FLOAT_VEC2_ARB 0x8B50 +#define GL_FLOAT_VEC3_ARB 0x8B51 +#define GL_FLOAT_VEC4_ARB 0x8B52 +#define GL_INT_VEC2_ARB 0x8B53 +#define GL_INT_VEC3_ARB 0x8B54 +#define GL_INT_VEC4_ARB 0x8B55 +#define GL_BOOL_ARB 0x8B56 +#define GL_BOOL_VEC2_ARB 0x8B57 +#define GL_BOOL_VEC3_ARB 0x8B58 +#define GL_BOOL_VEC4_ARB 0x8B59 +#define GL_FLOAT_MAT2_ARB 0x8B5A +#define GL_FLOAT_MAT3_ARB 0x8B5B +#define GL_FLOAT_MAT4_ARB 0x8B5C +#define GL_SAMPLER_1D_ARB 0x8B5D +#define GL_SAMPLER_2D_ARB 0x8B5E +#define GL_SAMPLER_3D_ARB 0x8B5F +#define GL_SAMPLER_CUBE_ARB 0x8B60 +#define GL_SAMPLER_1D_SHADOW_ARB 0x8B61 +#define GL_SAMPLER_2D_SHADOW_ARB 0x8B62 +#define GL_SAMPLER_2D_RECT_ARB 0x8B63 +#define GL_SAMPLER_2D_RECT_SHADOW_ARB 0x8B64 +#define GL_OBJECT_DELETE_STATUS_ARB 0x8B80 +#define GL_OBJECT_COMPILE_STATUS_ARB 0x8B81 +#define GL_OBJECT_LINK_STATUS_ARB 0x8B82 +#define GL_OBJECT_VALIDATE_STATUS_ARB 0x8B83 +#define GL_OBJECT_INFO_LOG_LENGTH_ARB 0x8B84 +#define GL_OBJECT_ATTACHED_OBJECTS_ARB 0x8B85 +#define GL_OBJECT_ACTIVE_UNIFORMS_ARB 0x8B86 +#define GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB 0x8B87 +#define GL_OBJECT_SHADER_SOURCE_LENGTH_ARB 0x8B88 +typedef void (APIENTRYP PFNGLDELETEOBJECTARBPROC) (GLhandleARB obj); +typedef GLhandleARB (APIENTRYP PFNGLGETHANDLEARBPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLDETACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB attachedObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATESHADEROBJECTARBPROC) (GLenum shaderType); +typedef void (APIENTRYP PFNGLSHADERSOURCEARBPROC) (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +typedef void (APIENTRYP PFNGLCOMPILESHADERARBPROC) (GLhandleARB shaderObj); +typedef GLhandleARB (APIENTRYP PFNGLCREATEPROGRAMOBJECTARBPROC) (void); +typedef void (APIENTRYP PFNGLATTACHOBJECTARBPROC) (GLhandleARB containerObj, GLhandleARB obj); +typedef void (APIENTRYP PFNGLLINKPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUSEPROGRAMOBJECTARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMARBPROC) (GLhandleARB programObj); +typedef void (APIENTRYP PFNGLUNIFORM1FARBPROC) (GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLUNIFORM2FARBPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLUNIFORM3FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLUNIFORM4FARBPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLUNIFORM1IARBPROC) (GLint location, GLint v0); +typedef void (APIENTRYP PFNGLUNIFORM2IARBPROC) (GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLUNIFORM3IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLUNIFORM4IARBPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLUNIFORM1FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM2FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM3FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM4FVARBPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORM1IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM2IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM3IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORM4IVARBPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVARBPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERFVARBPROC) (GLhandleARB obj, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVARBPROC) (GLhandleARB obj, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETINFOLOGARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +typedef void (APIENTRYP PFNGLGETATTACHEDOBJECTSARBPROC) (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEUNIFORMARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef void (APIENTRYP PFNGLGETUNIFORMFVARBPROC) (GLhandleARB programObj, GLint location, GLfloat *params); +typedef void (APIENTRYP PFNGLGETUNIFORMIVARBPROC) (GLhandleARB programObj, GLint location, GLint *params); +typedef void (APIENTRYP PFNGLGETSHADERSOURCEARBPROC) (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteObjectARB (GLhandleARB obj); +GLAPI GLhandleARB APIENTRY glGetHandleARB (GLenum pname); +GLAPI void APIENTRY glDetachObjectARB (GLhandleARB containerObj, GLhandleARB attachedObj); +GLAPI GLhandleARB APIENTRY glCreateShaderObjectARB (GLenum shaderType); +GLAPI void APIENTRY glShaderSourceARB (GLhandleARB shaderObj, GLsizei count, const GLcharARB **string, const GLint *length); +GLAPI void APIENTRY glCompileShaderARB (GLhandleARB shaderObj); +GLAPI GLhandleARB APIENTRY glCreateProgramObjectARB (void); +GLAPI void APIENTRY glAttachObjectARB (GLhandleARB containerObj, GLhandleARB obj); +GLAPI void APIENTRY glLinkProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUseProgramObjectARB (GLhandleARB programObj); +GLAPI void APIENTRY glValidateProgramARB (GLhandleARB programObj); +GLAPI void APIENTRY glUniform1fARB (GLint location, GLfloat v0); +GLAPI void APIENTRY glUniform2fARB (GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glUniform3fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glUniform4fARB (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glUniform1iARB (GLint location, GLint v0); +GLAPI void APIENTRY glUniform2iARB (GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glUniform3iARB (GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glUniform4iARB (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glUniform1fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform2fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform3fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform4fvARB (GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glUniform1ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform2ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform3ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniform4ivARB (GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glUniformMatrix2fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix3fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glUniformMatrix4fvARB (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glGetObjectParameterfvARB (GLhandleARB obj, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectParameterivARB (GLhandleARB obj, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetInfoLogARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *infoLog); +GLAPI void APIENTRY glGetAttachedObjectsARB (GLhandleARB containerObj, GLsizei maxCount, GLsizei *count, GLhandleARB *obj); +GLAPI GLint APIENTRY glGetUniformLocationARB (GLhandleARB programObj, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveUniformARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI void APIENTRY glGetUniformfvARB (GLhandleARB programObj, GLint location, GLfloat *params); +GLAPI void APIENTRY glGetUniformivARB (GLhandleARB programObj, GLint location, GLint *params); +GLAPI void APIENTRY glGetShaderSourceARB (GLhandleARB obj, GLsizei maxLength, GLsizei *length, GLcharARB *source); +#endif +#endif /* GL_ARB_shader_objects */ + +#ifndef GL_ARB_shader_precision +#define GL_ARB_shader_precision 1 +#endif /* GL_ARB_shader_precision */ + +#ifndef GL_ARB_shader_stencil_export +#define GL_ARB_shader_stencil_export 1 +#endif /* GL_ARB_shader_stencil_export */ + +#ifndef GL_ARB_shader_storage_buffer_object +#define GL_ARB_shader_storage_buffer_object 1 +#endif /* GL_ARB_shader_storage_buffer_object */ + +#ifndef GL_ARB_shader_subroutine +#define GL_ARB_shader_subroutine 1 +#endif /* GL_ARB_shader_subroutine */ + +#ifndef GL_ARB_shader_texture_image_samples +#define GL_ARB_shader_texture_image_samples 1 +#endif /* GL_ARB_shader_texture_image_samples */ + +#ifndef GL_ARB_shader_texture_lod +#define GL_ARB_shader_texture_lod 1 +#endif /* GL_ARB_shader_texture_lod */ + +#ifndef GL_ARB_shader_viewport_layer_array +#define GL_ARB_shader_viewport_layer_array 1 +#endif /* GL_ARB_shader_viewport_layer_array */ + +#ifndef GL_ARB_shading_language_100 +#define GL_ARB_shading_language_100 1 +#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8B8C +#endif /* GL_ARB_shading_language_100 */ + +#ifndef GL_ARB_shading_language_420pack +#define GL_ARB_shading_language_420pack 1 +#endif /* GL_ARB_shading_language_420pack */ + +#ifndef GL_ARB_shading_language_include +#define GL_ARB_shading_language_include 1 +#define GL_SHADER_INCLUDE_ARB 0x8DAE +#define GL_NAMED_STRING_LENGTH_ARB 0x8DE9 +#define GL_NAMED_STRING_TYPE_ARB 0x8DEA +typedef void (APIENTRYP PFNGLNAMEDSTRINGARBPROC) (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +typedef void (APIENTRYP PFNGLDELETENAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLCOMPILESHADERINCLUDEARBPROC) (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +typedef GLboolean (APIENTRYP PFNGLISNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGARBPROC) (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +typedef void (APIENTRYP PFNGLGETNAMEDSTRINGIVARBPROC) (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glNamedStringARB (GLenum type, GLint namelen, const GLchar *name, GLint stringlen, const GLchar *string); +GLAPI void APIENTRY glDeleteNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glCompileShaderIncludeARB (GLuint shader, GLsizei count, const GLchar *const*path, const GLint *length); +GLAPI GLboolean APIENTRY glIsNamedStringARB (GLint namelen, const GLchar *name); +GLAPI void APIENTRY glGetNamedStringARB (GLint namelen, const GLchar *name, GLsizei bufSize, GLint *stringlen, GLchar *string); +GLAPI void APIENTRY glGetNamedStringivARB (GLint namelen, const GLchar *name, GLenum pname, GLint *params); +#endif +#endif /* GL_ARB_shading_language_include */ + +#ifndef GL_ARB_shading_language_packing +#define GL_ARB_shading_language_packing 1 +#endif /* GL_ARB_shading_language_packing */ + +#ifndef GL_ARB_shadow +#define GL_ARB_shadow 1 +#define GL_TEXTURE_COMPARE_MODE_ARB 0x884C +#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884D +#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884E +#endif /* GL_ARB_shadow */ + +#ifndef GL_ARB_shadow_ambient +#define GL_ARB_shadow_ambient 1 +#define GL_TEXTURE_COMPARE_FAIL_VALUE_ARB 0x80BF +#endif /* GL_ARB_shadow_ambient */ + +#ifndef GL_ARB_sparse_buffer +#define GL_ARB_sparse_buffer 1 +#define GL_SPARSE_STORAGE_BIT_ARB 0x0400 +#define GL_SPARSE_BUFFER_PAGE_SIZE_ARB 0x82F8 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTARBPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTARBPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentARB (GLenum target, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentARB (GLuint buffer, GLintptr offset, GLsizeiptr size, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_buffer */ + +#ifndef GL_ARB_sparse_texture +#define GL_ARB_sparse_texture 1 +#define GL_TEXTURE_SPARSE_ARB 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_ARB 0x91A7 +#define GL_NUM_SPARSE_LEVELS_ARB 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_ARB 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_ARB 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_ARB 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_ARB 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_ARB 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB 0x91A9 +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexPageCommitmentARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#endif +#endif /* GL_ARB_sparse_texture */ + +#ifndef GL_ARB_sparse_texture2 +#define GL_ARB_sparse_texture2 1 +#endif /* GL_ARB_sparse_texture2 */ + +#ifndef GL_ARB_sparse_texture_clamp +#define GL_ARB_sparse_texture_clamp 1 +#endif /* GL_ARB_sparse_texture_clamp */ + +#ifndef GL_ARB_spirv_extensions +#define GL_ARB_spirv_extensions 1 +#endif /* GL_ARB_spirv_extensions */ + +#ifndef GL_ARB_stencil_texturing +#define GL_ARB_stencil_texturing 1 +#endif /* GL_ARB_stencil_texturing */ + +#ifndef GL_ARB_sync +#define GL_ARB_sync 1 +#endif /* GL_ARB_sync */ + +#ifndef GL_ARB_tessellation_shader +#define GL_ARB_tessellation_shader 1 +#endif /* GL_ARB_tessellation_shader */ + +#ifndef GL_ARB_texture_barrier +#define GL_ARB_texture_barrier 1 +#endif /* GL_ARB_texture_barrier */ + +#ifndef GL_ARB_texture_border_clamp +#define GL_ARB_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_ARB 0x812D +#endif /* GL_ARB_texture_border_clamp */ + +#ifndef GL_ARB_texture_buffer_object +#define GL_ARB_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_ARB 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_ARB 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_ARB 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_ARB 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFERARBPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferARB (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_ARB_texture_buffer_object */ + +#ifndef GL_ARB_texture_buffer_object_rgb32 +#define GL_ARB_texture_buffer_object_rgb32 1 +#endif /* GL_ARB_texture_buffer_object_rgb32 */ + +#ifndef GL_ARB_texture_buffer_range +#define GL_ARB_texture_buffer_range 1 +#endif /* GL_ARB_texture_buffer_range */ + +#ifndef GL_ARB_texture_compression +#define GL_ARB_texture_compression 1 +#define GL_COMPRESSED_ALPHA_ARB 0x84E9 +#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA +#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB +#define GL_COMPRESSED_INTENSITY_ARB 0x84EC +#define GL_COMPRESSED_RGB_ARB 0x84ED +#define GL_COMPRESSED_RGBA_ARB 0x84EE +#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF +#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0 +#define GL_TEXTURE_COMPRESSED_ARB 0x86A1 +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3 +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXIMAGE1DARBPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DARBPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE1DARBPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXIMAGEARBPROC) (GLenum target, GLint level, void *img); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCompressedTexImage3DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage2DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexImage1DARB (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage3DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage2DARB (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glCompressedTexSubImage1DARB (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *data); +GLAPI void APIENTRY glGetCompressedTexImageARB (GLenum target, GLint level, void *img); +#endif +#endif /* GL_ARB_texture_compression */ + +#ifndef GL_ARB_texture_compression_bptc +#define GL_ARB_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_ARB 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB 0x8E8F +#endif /* GL_ARB_texture_compression_bptc */ + +#ifndef GL_ARB_texture_compression_rgtc +#define GL_ARB_texture_compression_rgtc 1 +#endif /* GL_ARB_texture_compression_rgtc */ + +#ifndef GL_ARB_texture_cube_map +#define GL_ARB_texture_cube_map 1 +#define GL_NORMAL_MAP_ARB 0x8511 +#define GL_REFLECTION_MAP_ARB 0x8512 +#define GL_TEXTURE_CUBE_MAP_ARB 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARB 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARB 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB 0x851C +#endif /* GL_ARB_texture_cube_map */ + +#ifndef GL_ARB_texture_cube_map_array +#define GL_ARB_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_ARB 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB 0x900F +#endif /* GL_ARB_texture_cube_map_array */ + +#ifndef GL_ARB_texture_env_add +#define GL_ARB_texture_env_add 1 +#endif /* GL_ARB_texture_env_add */ + +#ifndef GL_ARB_texture_env_combine +#define GL_ARB_texture_env_combine 1 +#define GL_COMBINE_ARB 0x8570 +#define GL_COMBINE_RGB_ARB 0x8571 +#define GL_COMBINE_ALPHA_ARB 0x8572 +#define GL_SOURCE0_RGB_ARB 0x8580 +#define GL_SOURCE1_RGB_ARB 0x8581 +#define GL_SOURCE2_RGB_ARB 0x8582 +#define GL_SOURCE0_ALPHA_ARB 0x8588 +#define GL_SOURCE1_ALPHA_ARB 0x8589 +#define GL_SOURCE2_ALPHA_ARB 0x858A +#define GL_OPERAND0_RGB_ARB 0x8590 +#define GL_OPERAND1_RGB_ARB 0x8591 +#define GL_OPERAND2_RGB_ARB 0x8592 +#define GL_OPERAND0_ALPHA_ARB 0x8598 +#define GL_OPERAND1_ALPHA_ARB 0x8599 +#define GL_OPERAND2_ALPHA_ARB 0x859A +#define GL_RGB_SCALE_ARB 0x8573 +#define GL_ADD_SIGNED_ARB 0x8574 +#define GL_INTERPOLATE_ARB 0x8575 +#define GL_SUBTRACT_ARB 0x84E7 +#define GL_CONSTANT_ARB 0x8576 +#define GL_PRIMARY_COLOR_ARB 0x8577 +#define GL_PREVIOUS_ARB 0x8578 +#endif /* GL_ARB_texture_env_combine */ + +#ifndef GL_ARB_texture_env_crossbar +#define GL_ARB_texture_env_crossbar 1 +#endif /* GL_ARB_texture_env_crossbar */ + +#ifndef GL_ARB_texture_env_dot3 +#define GL_ARB_texture_env_dot3 1 +#define GL_DOT3_RGB_ARB 0x86AE +#define GL_DOT3_RGBA_ARB 0x86AF +#endif /* GL_ARB_texture_env_dot3 */ + +#ifndef GL_ARB_texture_filter_anisotropic +#define GL_ARB_texture_filter_anisotropic 1 +#endif /* GL_ARB_texture_filter_anisotropic */ + +#ifndef GL_ARB_texture_filter_minmax +#define GL_ARB_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_ARB 0x9366 +#define GL_WEIGHTED_AVERAGE_ARB 0x9367 +#endif /* GL_ARB_texture_filter_minmax */ + +#ifndef GL_ARB_texture_float +#define GL_ARB_texture_float 1 +#define GL_TEXTURE_RED_TYPE_ARB 0x8C10 +#define GL_TEXTURE_GREEN_TYPE_ARB 0x8C11 +#define GL_TEXTURE_BLUE_TYPE_ARB 0x8C12 +#define GL_TEXTURE_ALPHA_TYPE_ARB 0x8C13 +#define GL_TEXTURE_LUMINANCE_TYPE_ARB 0x8C14 +#define GL_TEXTURE_INTENSITY_TYPE_ARB 0x8C15 +#define GL_TEXTURE_DEPTH_TYPE_ARB 0x8C16 +#define GL_UNSIGNED_NORMALIZED_ARB 0x8C17 +#define GL_RGBA32F_ARB 0x8814 +#define GL_RGB32F_ARB 0x8815 +#define GL_ALPHA32F_ARB 0x8816 +#define GL_INTENSITY32F_ARB 0x8817 +#define GL_LUMINANCE32F_ARB 0x8818 +#define GL_LUMINANCE_ALPHA32F_ARB 0x8819 +#define GL_RGBA16F_ARB 0x881A +#define GL_RGB16F_ARB 0x881B +#define GL_ALPHA16F_ARB 0x881C +#define GL_INTENSITY16F_ARB 0x881D +#define GL_LUMINANCE16F_ARB 0x881E +#define GL_LUMINANCE_ALPHA16F_ARB 0x881F +#endif /* GL_ARB_texture_float */ + +#ifndef GL_ARB_texture_gather +#define GL_ARB_texture_gather 1 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB 0x8E5F +#define GL_MAX_PROGRAM_TEXTURE_GATHER_COMPONENTS_ARB 0x8F9F +#endif /* GL_ARB_texture_gather */ + +#ifndef GL_ARB_texture_mirror_clamp_to_edge +#define GL_ARB_texture_mirror_clamp_to_edge 1 +#endif /* GL_ARB_texture_mirror_clamp_to_edge */ + +#ifndef GL_ARB_texture_mirrored_repeat +#define GL_ARB_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_ARB 0x8370 +#endif /* GL_ARB_texture_mirrored_repeat */ + +#ifndef GL_ARB_texture_multisample +#define GL_ARB_texture_multisample 1 +#endif /* GL_ARB_texture_multisample */ + +#ifndef GL_ARB_texture_non_power_of_two +#define GL_ARB_texture_non_power_of_two 1 +#endif /* GL_ARB_texture_non_power_of_two */ + +#ifndef GL_ARB_texture_query_levels +#define GL_ARB_texture_query_levels 1 +#endif /* GL_ARB_texture_query_levels */ + +#ifndef GL_ARB_texture_query_lod +#define GL_ARB_texture_query_lod 1 +#endif /* GL_ARB_texture_query_lod */ + +#ifndef GL_ARB_texture_rectangle +#define GL_ARB_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_ARB 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_ARB 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_ARB 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB 0x84F8 +#endif /* GL_ARB_texture_rectangle */ + +#ifndef GL_ARB_texture_rg +#define GL_ARB_texture_rg 1 +#endif /* GL_ARB_texture_rg */ + +#ifndef GL_ARB_texture_rgb10_a2ui +#define GL_ARB_texture_rgb10_a2ui 1 +#endif /* GL_ARB_texture_rgb10_a2ui */ + +#ifndef GL_ARB_texture_stencil8 +#define GL_ARB_texture_stencil8 1 +#endif /* GL_ARB_texture_stencil8 */ + +#ifndef GL_ARB_texture_storage +#define GL_ARB_texture_storage 1 +#endif /* GL_ARB_texture_storage */ + +#ifndef GL_ARB_texture_storage_multisample +#define GL_ARB_texture_storage_multisample 1 +#endif /* GL_ARB_texture_storage_multisample */ + +#ifndef GL_ARB_texture_swizzle +#define GL_ARB_texture_swizzle 1 +#endif /* GL_ARB_texture_swizzle */ + +#ifndef GL_ARB_texture_view +#define GL_ARB_texture_view 1 +#endif /* GL_ARB_texture_view */ + +#ifndef GL_ARB_timer_query +#define GL_ARB_timer_query 1 +#endif /* GL_ARB_timer_query */ + +#ifndef GL_ARB_transform_feedback2 +#define GL_ARB_transform_feedback2 1 +#endif /* GL_ARB_transform_feedback2 */ + +#ifndef GL_ARB_transform_feedback3 +#define GL_ARB_transform_feedback3 1 +#endif /* GL_ARB_transform_feedback3 */ + +#ifndef GL_ARB_transform_feedback_instanced +#define GL_ARB_transform_feedback_instanced 1 +#endif /* GL_ARB_transform_feedback_instanced */ + +#ifndef GL_ARB_transform_feedback_overflow_query +#define GL_ARB_transform_feedback_overflow_query 1 +#define GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB 0x82EC +#define GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB 0x82ED +#endif /* GL_ARB_transform_feedback_overflow_query */ + +#ifndef GL_ARB_transpose_matrix +#define GL_ARB_transpose_matrix 1 +#define GL_TRANSPOSE_MODELVIEW_MATRIX_ARB 0x84E3 +#define GL_TRANSPOSE_PROJECTION_MATRIX_ARB 0x84E4 +#define GL_TRANSPOSE_TEXTURE_MATRIX_ARB 0x84E5 +#define GL_TRANSPOSE_COLOR_MATRIX_ARB 0x84E6 +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXFARBPROC) (const GLfloat *m); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXDARBPROC) (const GLdouble *m); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLoadTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glLoadTransposeMatrixdARB (const GLdouble *m); +GLAPI void APIENTRY glMultTransposeMatrixfARB (const GLfloat *m); +GLAPI void APIENTRY glMultTransposeMatrixdARB (const GLdouble *m); +#endif +#endif /* GL_ARB_transpose_matrix */ + +#ifndef GL_ARB_uniform_buffer_object +#define GL_ARB_uniform_buffer_object 1 +#endif /* GL_ARB_uniform_buffer_object */ + +#ifndef GL_ARB_vertex_array_bgra +#define GL_ARB_vertex_array_bgra 1 +#endif /* GL_ARB_vertex_array_bgra */ + +#ifndef GL_ARB_vertex_array_object +#define GL_ARB_vertex_array_object 1 +#endif /* GL_ARB_vertex_array_object */ + +#ifndef GL_ARB_vertex_attrib_64bit +#define GL_ARB_vertex_attrib_64bit 1 +#endif /* GL_ARB_vertex_attrib_64bit */ + +#ifndef GL_ARB_vertex_attrib_binding +#define GL_ARB_vertex_attrib_binding 1 +#endif /* GL_ARB_vertex_attrib_binding */ + +#ifndef GL_ARB_vertex_blend +#define GL_ARB_vertex_blend 1 +#define GL_MAX_VERTEX_UNITS_ARB 0x86A4 +#define GL_ACTIVE_VERTEX_UNITS_ARB 0x86A5 +#define GL_WEIGHT_SUM_UNITY_ARB 0x86A6 +#define GL_VERTEX_BLEND_ARB 0x86A7 +#define GL_CURRENT_WEIGHT_ARB 0x86A8 +#define GL_WEIGHT_ARRAY_TYPE_ARB 0x86A9 +#define GL_WEIGHT_ARRAY_STRIDE_ARB 0x86AA +#define GL_WEIGHT_ARRAY_SIZE_ARB 0x86AB +#define GL_WEIGHT_ARRAY_POINTER_ARB 0x86AC +#define GL_WEIGHT_ARRAY_ARB 0x86AD +#define GL_MODELVIEW0_ARB 0x1700 +#define GL_MODELVIEW1_ARB 0x850A +#define GL_MODELVIEW2_ARB 0x8722 +#define GL_MODELVIEW3_ARB 0x8723 +#define GL_MODELVIEW4_ARB 0x8724 +#define GL_MODELVIEW5_ARB 0x8725 +#define GL_MODELVIEW6_ARB 0x8726 +#define GL_MODELVIEW7_ARB 0x8727 +#define GL_MODELVIEW8_ARB 0x8728 +#define GL_MODELVIEW9_ARB 0x8729 +#define GL_MODELVIEW10_ARB 0x872A +#define GL_MODELVIEW11_ARB 0x872B +#define GL_MODELVIEW12_ARB 0x872C +#define GL_MODELVIEW13_ARB 0x872D +#define GL_MODELVIEW14_ARB 0x872E +#define GL_MODELVIEW15_ARB 0x872F +#define GL_MODELVIEW16_ARB 0x8730 +#define GL_MODELVIEW17_ARB 0x8731 +#define GL_MODELVIEW18_ARB 0x8732 +#define GL_MODELVIEW19_ARB 0x8733 +#define GL_MODELVIEW20_ARB 0x8734 +#define GL_MODELVIEW21_ARB 0x8735 +#define GL_MODELVIEW22_ARB 0x8736 +#define GL_MODELVIEW23_ARB 0x8737 +#define GL_MODELVIEW24_ARB 0x8738 +#define GL_MODELVIEW25_ARB 0x8739 +#define GL_MODELVIEW26_ARB 0x873A +#define GL_MODELVIEW27_ARB 0x873B +#define GL_MODELVIEW28_ARB 0x873C +#define GL_MODELVIEW29_ARB 0x873D +#define GL_MODELVIEW30_ARB 0x873E +#define GL_MODELVIEW31_ARB 0x873F +typedef void (APIENTRYP PFNGLWEIGHTBVARBPROC) (GLint size, const GLbyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTSVARBPROC) (GLint size, const GLshort *weights); +typedef void (APIENTRYP PFNGLWEIGHTIVARBPROC) (GLint size, const GLint *weights); +typedef void (APIENTRYP PFNGLWEIGHTFVARBPROC) (GLint size, const GLfloat *weights); +typedef void (APIENTRYP PFNGLWEIGHTDVARBPROC) (GLint size, const GLdouble *weights); +typedef void (APIENTRYP PFNGLWEIGHTUBVARBPROC) (GLint size, const GLubyte *weights); +typedef void (APIENTRYP PFNGLWEIGHTUSVARBPROC) (GLint size, const GLushort *weights); +typedef void (APIENTRYP PFNGLWEIGHTUIVARBPROC) (GLint size, const GLuint *weights); +typedef void (APIENTRYP PFNGLWEIGHTPOINTERARBPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXBLENDARBPROC) (GLint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWeightbvARB (GLint size, const GLbyte *weights); +GLAPI void APIENTRY glWeightsvARB (GLint size, const GLshort *weights); +GLAPI void APIENTRY glWeightivARB (GLint size, const GLint *weights); +GLAPI void APIENTRY glWeightfvARB (GLint size, const GLfloat *weights); +GLAPI void APIENTRY glWeightdvARB (GLint size, const GLdouble *weights); +GLAPI void APIENTRY glWeightubvARB (GLint size, const GLubyte *weights); +GLAPI void APIENTRY glWeightusvARB (GLint size, const GLushort *weights); +GLAPI void APIENTRY glWeightuivARB (GLint size, const GLuint *weights); +GLAPI void APIENTRY glWeightPointerARB (GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexBlendARB (GLint count); +#endif +#endif /* GL_ARB_vertex_blend */ + +#ifndef GL_ARB_vertex_buffer_object +#define GL_ARB_vertex_buffer_object 1 +typedef khronos_ssize_t GLsizeiptrARB; +typedef khronos_intptr_t GLintptrARB; +#define GL_BUFFER_SIZE_ARB 0x8764 +#define GL_BUFFER_USAGE_ARB 0x8765 +#define GL_ARRAY_BUFFER_ARB 0x8892 +#define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#define GL_VERTEX_ARRAY_BUFFER_BINDING_ARB 0x8896 +#define GL_NORMAL_ARRAY_BUFFER_BINDING_ARB 0x8897 +#define GL_COLOR_ARRAY_BUFFER_BINDING_ARB 0x8898 +#define GL_INDEX_ARRAY_BUFFER_BINDING_ARB 0x8899 +#define GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB 0x889A +#define GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB 0x889B +#define GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB 0x889C +#define GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB 0x889D +#define GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB 0x889E +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB 0x889F +#define GL_READ_ONLY_ARB 0x88B8 +#define GL_WRITE_ONLY_ARB 0x88B9 +#define GL_READ_WRITE_ARB 0x88BA +#define GL_BUFFER_ACCESS_ARB 0x88BB +#define GL_BUFFER_MAPPED_ARB 0x88BC +#define GL_BUFFER_MAP_POINTER_ARB 0x88BD +#define GL_STREAM_DRAW_ARB 0x88E0 +#define GL_STREAM_READ_ARB 0x88E1 +#define GL_STREAM_COPY_ARB 0x88E2 +#define GL_STATIC_DRAW_ARB 0x88E4 +#define GL_STATIC_READ_ARB 0x88E5 +#define GL_STATIC_COPY_ARB 0x88E6 +#define GL_DYNAMIC_DRAW_ARB 0x88E8 +#define GL_DYNAMIC_READ_ARB 0x88E9 +#define GL_DYNAMIC_COPY_ARB 0x88EA +typedef void (APIENTRYP PFNGLBINDBUFFERARBPROC) (GLenum target, GLuint buffer); +typedef void (APIENTRYP PFNGLDELETEBUFFERSARBPROC) (GLsizei n, const GLuint *buffers); +typedef void (APIENTRYP PFNGLGENBUFFERSARBPROC) (GLsizei n, GLuint *buffers); +typedef GLboolean (APIENTRYP PFNGLISBUFFERARBPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLBUFFERDATAARBPROC) (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +typedef void (APIENTRYP PFNGLGETBUFFERSUBDATAARBPROC) (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +typedef void *(APIENTRYP PFNGLMAPBUFFERARBPROC) (GLenum target, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPBUFFERARBPROC) (GLenum target); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERIVARBPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETBUFFERPOINTERVARBPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindBufferARB (GLenum target, GLuint buffer); +GLAPI void APIENTRY glDeleteBuffersARB (GLsizei n, const GLuint *buffers); +GLAPI void APIENTRY glGenBuffersARB (GLsizei n, GLuint *buffers); +GLAPI GLboolean APIENTRY glIsBufferARB (GLuint buffer); +GLAPI void APIENTRY glBufferDataARB (GLenum target, GLsizeiptrARB size, const void *data, GLenum usage); +GLAPI void APIENTRY glBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, const void *data); +GLAPI void APIENTRY glGetBufferSubDataARB (GLenum target, GLintptrARB offset, GLsizeiptrARB size, void *data); +GLAPI void *APIENTRY glMapBufferARB (GLenum target, GLenum access); +GLAPI GLboolean APIENTRY glUnmapBufferARB (GLenum target); +GLAPI void APIENTRY glGetBufferParameterivARB (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetBufferPointervARB (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_ARB_vertex_buffer_object */ + +#ifndef GL_ARB_vertex_program +#define GL_ARB_vertex_program 1 +#define GL_COLOR_SUM_ARB 0x8458 +#define GL_VERTEX_PROGRAM_ARB 0x8620 +#define GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB 0x8622 +#define GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB 0x8623 +#define GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB 0x8624 +#define GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB 0x8625 +#define GL_CURRENT_VERTEX_ATTRIB_ARB 0x8626 +#define GL_VERTEX_PROGRAM_POINT_SIZE_ARB 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_ARB 0x8643 +#define GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB 0x8645 +#define GL_MAX_VERTEX_ATTRIBS_ARB 0x8869 +#define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB 0x886A +#define GL_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B0 +#define GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB 0x88B1 +#define GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B2 +#define GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB 0x88B3 +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DARBPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FARBPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SARBPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DARBPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FARBPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SARBPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NBVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NIVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NSVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBARBPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4NUSVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4BVARBPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DARBPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVARBPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FARBPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVARBPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4IVARBPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SARBPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVARBPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVARBPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UIVARBPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4USVARBPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERARBPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYARBPROC) (GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVARBPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVARBPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVARBPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVARBPROC) (GLuint index, GLenum pname, void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttrib1dARB (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fARB (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sARB (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dARB (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fARB (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sARB (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sARB (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NbvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4NivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4NsvARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4NubARB (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4NubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4NuivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4NusvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttrib4bvARB (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttrib4dARB (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvARB (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fARB (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvARB (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4ivARB (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttrib4sARB (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svARB (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubvARB (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttrib4uivARB (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttrib4usvARB (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribPointerARB (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glEnableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glDisableVertexAttribArrayARB (GLuint index); +GLAPI void APIENTRY glGetVertexAttribdvARB (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvARB (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivARB (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervARB (GLuint index, GLenum pname, void **pointer); +#endif +#endif /* GL_ARB_vertex_program */ + +#ifndef GL_ARB_vertex_shader +#define GL_ARB_vertex_shader 1 +#define GL_VERTEX_SHADER_ARB 0x8B31 +#define GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB 0x8B4A +#define GL_MAX_VARYING_FLOATS_ARB 0x8B4B +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB 0x8B4C +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB 0x8B4D +#define GL_OBJECT_ACTIVE_ATTRIBUTES_ARB 0x8B89 +#define GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB 0x8B8A +typedef void (APIENTRYP PFNGLBINDATTRIBLOCATIONARBPROC) (GLhandleARB programObj, GLuint index, const GLcharARB *name); +typedef void (APIENTRYP PFNGLGETACTIVEATTRIBARBPROC) (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONARBPROC) (GLhandleARB programObj, const GLcharARB *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindAttribLocationARB (GLhandleARB programObj, GLuint index, const GLcharARB *name); +GLAPI void APIENTRY glGetActiveAttribARB (GLhandleARB programObj, GLuint index, GLsizei maxLength, GLsizei *length, GLint *size, GLenum *type, GLcharARB *name); +GLAPI GLint APIENTRY glGetAttribLocationARB (GLhandleARB programObj, const GLcharARB *name); +#endif +#endif /* GL_ARB_vertex_shader */ + +#ifndef GL_ARB_vertex_type_10f_11f_11f_rev +#define GL_ARB_vertex_type_10f_11f_11f_rev 1 +#endif /* GL_ARB_vertex_type_10f_11f_11f_rev */ + +#ifndef GL_ARB_vertex_type_2_10_10_10_rev +#define GL_ARB_vertex_type_2_10_10_10_rev 1 +#endif /* GL_ARB_vertex_type_2_10_10_10_rev */ + +#ifndef GL_ARB_viewport_array +#define GL_ARB_viewport_array 1 +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYDVNVPROC) (GLuint first, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDDNVPROC) (GLuint index, GLdouble n, GLdouble f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangeArraydvNV (GLuint first, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glDepthRangeIndexeddNV (GLuint index, GLdouble n, GLdouble f); +#endif +#endif /* GL_ARB_viewport_array */ + +#ifndef GL_ARB_window_pos +#define GL_ARB_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DARBPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FARBPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IARBPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SARBPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVARBPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DARBPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVARBPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FARBPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVARBPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IARBPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVARBPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SARBPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVARBPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dARB (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fARB (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iARB (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos2sARB (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svARB (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dARB (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvARB (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fARB (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvARB (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iARB (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivARB (const GLint *v); +GLAPI void APIENTRY glWindowPos3sARB (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svARB (const GLshort *v); +#endif +#endif /* GL_ARB_window_pos */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 +#endif /* GL_KHR_no_error */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +typedef void (APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); +#endif +#endif /* GL_KHR_parallel_shader_compile */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS 0x90F3 +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_shader_subgroup +#define GL_KHR_shader_subgroup 1 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#endif /* GL_KHR_shader_subgroup */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +#ifndef GL_OES_byte_coordinates +#define GL_OES_byte_coordinates 1 +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BOESPROC) (GLenum texture, GLbyte s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BOESPROC) (GLenum texture, GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BOESPROC) (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4BVOESPROC) (GLenum texture, const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD1BOESPROC) (GLbyte s); +typedef void (APIENTRYP PFNGLTEXCOORD1BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2BOESPROC) (GLbyte s, GLbyte t); +typedef void (APIENTRYP PFNGLTEXCOORD2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3BOESPROC) (GLbyte s, GLbyte t, GLbyte r); +typedef void (APIENTRYP PFNGLTEXCOORD3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4BOESPROC) (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +typedef void (APIENTRYP PFNGLTEXCOORD4BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX2BOESPROC) (GLbyte x, GLbyte y); +typedef void (APIENTRYP PFNGLVERTEX2BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX3BOESPROC) (GLbyte x, GLbyte y, GLbyte z); +typedef void (APIENTRYP PFNGLVERTEX3BVOESPROC) (const GLbyte *coords); +typedef void (APIENTRYP PFNGLVERTEX4BOESPROC) (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +typedef void (APIENTRYP PFNGLVERTEX4BVOESPROC) (const GLbyte *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiTexCoord1bOES (GLenum texture, GLbyte s); +GLAPI void APIENTRY glMultiTexCoord1bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord2bOES (GLenum texture, GLbyte s, GLbyte t); +GLAPI void APIENTRY glMultiTexCoord2bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord3bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glMultiTexCoord3bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glMultiTexCoord4bOES (GLenum texture, GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glMultiTexCoord4bvOES (GLenum texture, const GLbyte *coords); +GLAPI void APIENTRY glTexCoord1bOES (GLbyte s); +GLAPI void APIENTRY glTexCoord1bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord2bOES (GLbyte s, GLbyte t); +GLAPI void APIENTRY glTexCoord2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord3bOES (GLbyte s, GLbyte t, GLbyte r); +GLAPI void APIENTRY glTexCoord3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glTexCoord4bOES (GLbyte s, GLbyte t, GLbyte r, GLbyte q); +GLAPI void APIENTRY glTexCoord4bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex2bOES (GLbyte x, GLbyte y); +GLAPI void APIENTRY glVertex2bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex3bOES (GLbyte x, GLbyte y, GLbyte z); +GLAPI void APIENTRY glVertex3bvOES (const GLbyte *coords); +GLAPI void APIENTRY glVertex4bOES (GLbyte x, GLbyte y, GLbyte z, GLbyte w); +GLAPI void APIENTRY glVertex4bvOES (const GLbyte *coords); +#endif +#endif /* GL_OES_byte_coordinates */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_fixed_point +#define GL_OES_fixed_point 1 +typedef khronos_int32_t GLfixed; +#define GL_FIXED_OES 0x140C +typedef void (APIENTRYP PFNGLALPHAFUNCXOESPROC) (GLenum func, GLfixed ref); +typedef void (APIENTRYP PFNGLCLEARCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARDEPTHXOESPROC) (GLfixed depth); +typedef void (APIENTRYP PFNGLCLIPPLANEXOESPROC) (GLenum plane, const GLfixed *equation); +typedef void (APIENTRYP PFNGLCOLOR4XOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLDEPTHRANGEXOESPROC) (GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLFOGXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLFOGXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLFRUSTUMXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEXOESPROC) (GLenum plane, GLfixed *equation); +typedef void (APIENTRYP PFNGLGETFIXEDVOESPROC) (GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXENVXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLLIGHTMODELXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTMODELXVOESPROC) (GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLLIGHTXVOESPROC) (GLenum light, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLLINEWIDTHXOESPROC) (GLfixed width); +typedef void (APIENTRYP PFNGLLOADMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLMATERIALXVOESPROC) (GLenum face, GLenum pname, const GLfixed *param); +typedef void (APIENTRYP PFNGLMULTMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLNORMAL3XOESPROC) (GLfixed nx, GLfixed ny, GLfixed nz); +typedef void (APIENTRYP PFNGLORTHOXOESPROC) (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +typedef void (APIENTRYP PFNGLPOINTPARAMETERXVOESPROC) (GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLPOINTSIZEXOESPROC) (GLfixed size); +typedef void (APIENTRYP PFNGLPOLYGONOFFSETXOESPROC) (GLfixed factor, GLfixed units); +typedef void (APIENTRYP PFNGLROTATEXOESPROC) (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLSCALEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLTEXENVXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXENVXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLTRANSLATEXOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLACCUMXOESPROC) (GLenum op, GLfixed value); +typedef void (APIENTRYP PFNGLBITMAPXOESPROC) (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +typedef void (APIENTRYP PFNGLBLENDCOLORXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCLEARACCUMXOESPROC) (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +typedef void (APIENTRYP PFNGLCOLOR3XOESPROC) (GLfixed red, GLfixed green, GLfixed blue); +typedef void (APIENTRYP PFNGLCOLOR3XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCOLOR4XVOESPROC) (const GLfixed *components); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXOESPROC) (GLenum target, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLEVALCOORD1XOESPROC) (GLfixed u); +typedef void (APIENTRYP PFNGLEVALCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLEVALCOORD2XOESPROC) (GLfixed u, GLfixed v); +typedef void (APIENTRYP PFNGLEVALCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLFEEDBACKBUFFERXOESPROC) (GLsizei n, GLenum type, const GLfixed *buffer); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERXVOESPROC) (GLenum target, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETLIGHTXOESPROC) (GLenum light, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETMAPXVOESPROC) (GLenum target, GLenum query, GLfixed *v); +typedef void (APIENTRYP PFNGLGETMATERIALXOESPROC) (GLenum face, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLGETPIXELMAPXVPROC) (GLenum map, GLint size, GLfixed *values); +typedef void (APIENTRYP PFNGLGETTEXGENXVOESPROC) (GLenum coord, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLGETTEXLEVELPARAMETERXVOESPROC) (GLenum target, GLint level, GLenum pname, GLfixed *params); +typedef void (APIENTRYP PFNGLINDEXXOESPROC) (GLfixed component); +typedef void (APIENTRYP PFNGLINDEXXVOESPROC) (const GLfixed *component); +typedef void (APIENTRYP PFNGLLOADTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMAP1XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +typedef void (APIENTRYP PFNGLMAP2XOESPROC) (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +typedef void (APIENTRYP PFNGLMAPGRID1XOESPROC) (GLint n, GLfixed u1, GLfixed u2); +typedef void (APIENTRYP PFNGLMAPGRID2XOESPROC) (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +typedef void (APIENTRYP PFNGLMULTTRANSPOSEMATRIXXOESPROC) (const GLfixed *m); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XOESPROC) (GLenum texture, GLfixed s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XOESPROC) (GLenum texture, GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XOESPROC) (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4XVOESPROC) (GLenum texture, const GLfixed *coords); +typedef void (APIENTRYP PFNGLNORMAL3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLPASSTHROUGHXOESPROC) (GLfixed token); +typedef void (APIENTRYP PFNGLPIXELMAPXPROC) (GLenum map, GLint size, const GLfixed *values); +typedef void (APIENTRYP PFNGLPIXELSTOREXPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELTRANSFERXOESPROC) (GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLPIXELZOOMXOESPROC) (GLfixed xfactor, GLfixed yfactor); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESXOESPROC) (GLsizei n, const GLuint *textures, const GLfixed *priorities); +typedef void (APIENTRYP PFNGLRASTERPOS2XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLRASTERPOS2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS3XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLRASTERPOS3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRASTERPOS4XOESPROC) (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +typedef void (APIENTRYP PFNGLRASTERPOS4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLRECTXOESPROC) (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +typedef void (APIENTRYP PFNGLRECTXVOESPROC) (const GLfixed *v1, const GLfixed *v2); +typedef void (APIENTRYP PFNGLTEXCOORD1XOESPROC) (GLfixed s); +typedef void (APIENTRYP PFNGLTEXCOORD1XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD2XOESPROC) (GLfixed s, GLfixed t); +typedef void (APIENTRYP PFNGLTEXCOORD2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD3XOESPROC) (GLfixed s, GLfixed t, GLfixed r); +typedef void (APIENTRYP PFNGLTEXCOORD3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXCOORD4XOESPROC) (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +typedef void (APIENTRYP PFNGLTEXCOORD4XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLTEXGENXOESPROC) (GLenum coord, GLenum pname, GLfixed param); +typedef void (APIENTRYP PFNGLTEXGENXVOESPROC) (GLenum coord, GLenum pname, const GLfixed *params); +typedef void (APIENTRYP PFNGLVERTEX2XOESPROC) (GLfixed x); +typedef void (APIENTRYP PFNGLVERTEX2XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX3XOESPROC) (GLfixed x, GLfixed y); +typedef void (APIENTRYP PFNGLVERTEX3XVOESPROC) (const GLfixed *coords); +typedef void (APIENTRYP PFNGLVERTEX4XOESPROC) (GLfixed x, GLfixed y, GLfixed z); +typedef void (APIENTRYP PFNGLVERTEX4XVOESPROC) (const GLfixed *coords); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaFuncxOES (GLenum func, GLfixed ref); +GLAPI void APIENTRY glClearColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearDepthxOES (GLfixed depth); +GLAPI void APIENTRY glClipPlanexOES (GLenum plane, const GLfixed *equation); +GLAPI void APIENTRY glColor4xOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glDepthRangexOES (GLfixed n, GLfixed f); +GLAPI void APIENTRY glFogxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glFogxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glFrustumxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glGetClipPlanexOES (GLenum plane, GLfixed *equation); +GLAPI void APIENTRY glGetFixedvOES (GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexEnvxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glLightModelxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightModelxvOES (GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glLightxOES (GLenum light, GLenum pname, GLfixed param); +GLAPI void APIENTRY glLightxvOES (GLenum light, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glLineWidthxOES (GLfixed width); +GLAPI void APIENTRY glLoadMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glMaterialxvOES (GLenum face, GLenum pname, const GLfixed *param); +GLAPI void APIENTRY glMultMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord4xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glNormal3xOES (GLfixed nx, GLfixed ny, GLfixed nz); +GLAPI void APIENTRY glOrthoxOES (GLfixed l, GLfixed r, GLfixed b, GLfixed t, GLfixed n, GLfixed f); +GLAPI void APIENTRY glPointParameterxvOES (GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glPointSizexOES (GLfixed size); +GLAPI void APIENTRY glPolygonOffsetxOES (GLfixed factor, GLfixed units); +GLAPI void APIENTRY glRotatexOES (GLfixed angle, GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glScalexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glTexEnvxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexEnvxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTexParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glTranslatexOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glAccumxOES (GLenum op, GLfixed value); +GLAPI void APIENTRY glBitmapxOES (GLsizei width, GLsizei height, GLfixed xorig, GLfixed yorig, GLfixed xmove, GLfixed ymove, const GLubyte *bitmap); +GLAPI void APIENTRY glBlendColorxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glClearAccumxOES (GLfixed red, GLfixed green, GLfixed blue, GLfixed alpha); +GLAPI void APIENTRY glColor3xOES (GLfixed red, GLfixed green, GLfixed blue); +GLAPI void APIENTRY glColor3xvOES (const GLfixed *components); +GLAPI void APIENTRY glColor4xvOES (const GLfixed *components); +GLAPI void APIENTRY glConvolutionParameterxOES (GLenum target, GLenum pname, GLfixed param); +GLAPI void APIENTRY glConvolutionParameterxvOES (GLenum target, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glEvalCoord1xOES (GLfixed u); +GLAPI void APIENTRY glEvalCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glEvalCoord2xOES (GLfixed u, GLfixed v); +GLAPI void APIENTRY glEvalCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glFeedbackBufferxOES (GLsizei n, GLenum type, const GLfixed *buffer); +GLAPI void APIENTRY glGetConvolutionParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetHistogramParameterxvOES (GLenum target, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetLightxOES (GLenum light, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetMapxvOES (GLenum target, GLenum query, GLfixed *v); +GLAPI void APIENTRY glGetMaterialxOES (GLenum face, GLenum pname, GLfixed param); +GLAPI void APIENTRY glGetPixelMapxv (GLenum map, GLint size, GLfixed *values); +GLAPI void APIENTRY glGetTexGenxvOES (GLenum coord, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glGetTexLevelParameterxvOES (GLenum target, GLint level, GLenum pname, GLfixed *params); +GLAPI void APIENTRY glIndexxOES (GLfixed component); +GLAPI void APIENTRY glIndexxvOES (const GLfixed *component); +GLAPI void APIENTRY glLoadTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMap1xOES (GLenum target, GLfixed u1, GLfixed u2, GLint stride, GLint order, GLfixed points); +GLAPI void APIENTRY glMap2xOES (GLenum target, GLfixed u1, GLfixed u2, GLint ustride, GLint uorder, GLfixed v1, GLfixed v2, GLint vstride, GLint vorder, GLfixed points); +GLAPI void APIENTRY glMapGrid1xOES (GLint n, GLfixed u1, GLfixed u2); +GLAPI void APIENTRY glMapGrid2xOES (GLint n, GLfixed u1, GLfixed u2, GLfixed v1, GLfixed v2); +GLAPI void APIENTRY glMultTransposeMatrixxOES (const GLfixed *m); +GLAPI void APIENTRY glMultiTexCoord1xOES (GLenum texture, GLfixed s); +GLAPI void APIENTRY glMultiTexCoord1xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord2xOES (GLenum texture, GLfixed s, GLfixed t); +GLAPI void APIENTRY glMultiTexCoord2xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord3xOES (GLenum texture, GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glMultiTexCoord3xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glMultiTexCoord4xvOES (GLenum texture, const GLfixed *coords); +GLAPI void APIENTRY glNormal3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glPassThroughxOES (GLfixed token); +GLAPI void APIENTRY glPixelMapx (GLenum map, GLint size, const GLfixed *values); +GLAPI void APIENTRY glPixelStorex (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelTransferxOES (GLenum pname, GLfixed param); +GLAPI void APIENTRY glPixelZoomxOES (GLfixed xfactor, GLfixed yfactor); +GLAPI void APIENTRY glPrioritizeTexturesxOES (GLsizei n, const GLuint *textures, const GLfixed *priorities); +GLAPI void APIENTRY glRasterPos2xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glRasterPos2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos3xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glRasterPos3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRasterPos4xOES (GLfixed x, GLfixed y, GLfixed z, GLfixed w); +GLAPI void APIENTRY glRasterPos4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glRectxOES (GLfixed x1, GLfixed y1, GLfixed x2, GLfixed y2); +GLAPI void APIENTRY glRectxvOES (const GLfixed *v1, const GLfixed *v2); +GLAPI void APIENTRY glTexCoord1xOES (GLfixed s); +GLAPI void APIENTRY glTexCoord1xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord2xOES (GLfixed s, GLfixed t); +GLAPI void APIENTRY glTexCoord2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord3xOES (GLfixed s, GLfixed t, GLfixed r); +GLAPI void APIENTRY glTexCoord3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexCoord4xOES (GLfixed s, GLfixed t, GLfixed r, GLfixed q); +GLAPI void APIENTRY glTexCoord4xvOES (const GLfixed *coords); +GLAPI void APIENTRY glTexGenxOES (GLenum coord, GLenum pname, GLfixed param); +GLAPI void APIENTRY glTexGenxvOES (GLenum coord, GLenum pname, const GLfixed *params); +GLAPI void APIENTRY glVertex2xOES (GLfixed x); +GLAPI void APIENTRY glVertex2xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex3xOES (GLfixed x, GLfixed y); +GLAPI void APIENTRY glVertex3xvOES (const GLfixed *coords); +GLAPI void APIENTRY glVertex4xOES (GLfixed x, GLfixed y, GLfixed z); +GLAPI void APIENTRY glVertex4xvOES (const GLfixed *coords); +#endif +#endif /* GL_OES_fixed_point */ + +#ifndef GL_OES_query_matrix +#define GL_OES_query_matrix 1 +typedef GLbitfield (APIENTRYP PFNGLQUERYMATRIXXOESPROC) (GLfixed *mantissa, GLint *exponent); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLbitfield APIENTRY glQueryMatrixxOES (GLfixed *mantissa, GLint *exponent); +#endif +#endif /* GL_OES_query_matrix */ + +#ifndef GL_OES_read_format +#define GL_OES_read_format 1 +#define GL_IMPLEMENTATION_COLOR_READ_TYPE_OES 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES 0x8B9B +#endif /* GL_OES_read_format */ + +#ifndef GL_OES_single_precision +#define GL_OES_single_precision 1 +typedef void (APIENTRYP PFNGLCLEARDEPTHFOESPROC) (GLclampf depth); +typedef void (APIENTRYP PFNGLCLIPPLANEFOESPROC) (GLenum plane, const GLfloat *equation); +typedef void (APIENTRYP PFNGLDEPTHRANGEFOESPROC) (GLclampf n, GLclampf f); +typedef void (APIENTRYP PFNGLFRUSTUMFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +typedef void (APIENTRYP PFNGLGETCLIPPLANEFOESPROC) (GLenum plane, GLfloat *equation); +typedef void (APIENTRYP PFNGLORTHOFOESPROC) (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glClearDepthfOES (GLclampf depth); +GLAPI void APIENTRY glClipPlanefOES (GLenum plane, const GLfloat *equation); +GLAPI void APIENTRY glDepthRangefOES (GLclampf n, GLclampf f); +GLAPI void APIENTRY glFrustumfOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +GLAPI void APIENTRY glGetClipPlanefOES (GLenum plane, GLfloat *equation); +GLAPI void APIENTRY glOrthofOES (GLfloat l, GLfloat r, GLfloat b, GLfloat t, GLfloat n, GLfloat f); +#endif +#endif /* GL_OES_single_precision */ + +#ifndef GL_3DFX_multisample +#define GL_3DFX_multisample 1 +#define GL_MULTISAMPLE_3DFX 0x86B2 +#define GL_SAMPLE_BUFFERS_3DFX 0x86B3 +#define GL_SAMPLES_3DFX 0x86B4 +#define GL_MULTISAMPLE_BIT_3DFX 0x20000000 +#endif /* GL_3DFX_multisample */ + +#ifndef GL_3DFX_tbuffer +#define GL_3DFX_tbuffer 1 +typedef void (APIENTRYP PFNGLTBUFFERMASK3DFXPROC) (GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTbufferMask3DFX (GLuint mask); +#endif +#endif /* GL_3DFX_tbuffer */ + +#ifndef GL_3DFX_texture_compression_FXT1 +#define GL_3DFX_texture_compression_FXT1 1 +#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0 +#define GL_COMPRESSED_RGBA_FXT1_3DFX 0x86B1 +#endif /* GL_3DFX_texture_compression_FXT1 */ + +#ifndef GL_AMD_blend_minmax_factor +#define GL_AMD_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_AMD_blend_minmax_factor */ + +#ifndef GL_AMD_conservative_depth +#define GL_AMD_conservative_depth 1 +#endif /* GL_AMD_conservative_depth */ + +#ifndef GL_AMD_debug_output +#define GL_AMD_debug_output 1 +typedef void (APIENTRY *GLDEBUGPROCAMD)(GLuint id,GLenum category,GLenum severity,GLsizei length,const GLchar *message,void *userParam); +#define GL_MAX_DEBUG_MESSAGE_LENGTH_AMD 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_AMD 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_AMD 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_AMD 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_AMD 0x9147 +#define GL_DEBUG_SEVERITY_LOW_AMD 0x9148 +#define GL_DEBUG_CATEGORY_API_ERROR_AMD 0x9149 +#define GL_DEBUG_CATEGORY_WINDOW_SYSTEM_AMD 0x914A +#define GL_DEBUG_CATEGORY_DEPRECATION_AMD 0x914B +#define GL_DEBUG_CATEGORY_UNDEFINED_BEHAVIOR_AMD 0x914C +#define GL_DEBUG_CATEGORY_PERFORMANCE_AMD 0x914D +#define GL_DEBUG_CATEGORY_SHADER_COMPILER_AMD 0x914E +#define GL_DEBUG_CATEGORY_APPLICATION_AMD 0x914F +#define GL_DEBUG_CATEGORY_OTHER_AMD 0x9150 +typedef void (APIENTRYP PFNGLDEBUGMESSAGEENABLEAMDPROC) (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTAMDPROC) (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKAMDPROC) (GLDEBUGPROCAMD callback, void *userParam); +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGAMDPROC) (GLuint count, GLsizei bufSize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDebugMessageEnableAMD (GLenum category, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI void APIENTRY glDebugMessageInsertAMD (GLenum category, GLenum severity, GLuint id, GLsizei length, const GLchar *buf); +GLAPI void APIENTRY glDebugMessageCallbackAMD (GLDEBUGPROCAMD callback, void *userParam); +GLAPI GLuint APIENTRY glGetDebugMessageLogAMD (GLuint count, GLsizei bufSize, GLenum *categories, GLuint *severities, GLuint *ids, GLsizei *lengths, GLchar *message); +#endif +#endif /* GL_AMD_debug_output */ + +#ifndef GL_AMD_depth_clamp_separate +#define GL_AMD_depth_clamp_separate 1 +#define GL_DEPTH_CLAMP_NEAR_AMD 0x901E +#define GL_DEPTH_CLAMP_FAR_AMD 0x901F +#endif /* GL_AMD_depth_clamp_separate */ + +#ifndef GL_AMD_draw_buffers_blend +#define GL_AMD_draw_buffers_blend 1 +typedef void (APIENTRYP PFNGLBLENDFUNCINDEXEDAMDPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (APIENTRYP PFNGLBLENDEQUATIONINDEXEDAMDPROC) (GLuint buf, GLenum mode); +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEINDEXEDAMDPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncIndexedAMD (GLuint buf, GLenum src, GLenum dst); +GLAPI void APIENTRY glBlendFuncSeparateIndexedAMD (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI void APIENTRY glBlendEquationIndexedAMD (GLuint buf, GLenum mode); +GLAPI void APIENTRY glBlendEquationSeparateIndexedAMD (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_AMD_draw_buffers_blend */ + +#ifndef GL_AMD_framebuffer_multisample_advanced +#define GL_AMD_framebuffer_multisample_advanced 1 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_AMD_framebuffer_multisample_advanced */ + +#ifndef GL_AMD_framebuffer_sample_positions +#define GL_AMD_framebuffer_sample_positions 1 +#define GL_SUBSAMPLE_DISTANCE_AMD 0x883F +#define GL_PIXELS_PER_SAMPLE_PATTERN_X_AMD 0x91AE +#define GL_PIXELS_PER_SAMPLE_PATTERN_Y_AMD 0x91AF +#define GL_ALL_PIXELS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLEPOSITIONSFVAMDPROC) (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERFVAMDPROC) (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERFVAMDPROC) (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSamplePositionsfvAMD (GLenum target, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +GLAPI void APIENTRY glNamedFramebufferSamplePositionsfvAMD (GLuint framebuffer, GLuint numsamples, GLuint pixelindex, const GLfloat *values); +GLAPI void APIENTRY glGetFramebufferParameterfvAMD (GLenum target, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +GLAPI void APIENTRY glGetNamedFramebufferParameterfvAMD (GLuint framebuffer, GLenum pname, GLuint numsamples, GLuint pixelindex, GLsizei size, GLfloat *values); +#endif +#endif /* GL_AMD_framebuffer_sample_positions */ + +#ifndef GL_AMD_gcn_shader +#define GL_AMD_gcn_shader 1 +#endif /* GL_AMD_gcn_shader */ + +#ifndef GL_AMD_gpu_shader_half_float +#define GL_AMD_gpu_shader_half_float 1 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_FLOAT16_MAT2_AMD 0x91C5 +#define GL_FLOAT16_MAT3_AMD 0x91C6 +#define GL_FLOAT16_MAT4_AMD 0x91C7 +#define GL_FLOAT16_MAT2x3_AMD 0x91C8 +#define GL_FLOAT16_MAT2x4_AMD 0x91C9 +#define GL_FLOAT16_MAT3x2_AMD 0x91CA +#define GL_FLOAT16_MAT3x4_AMD 0x91CB +#define GL_FLOAT16_MAT4x2_AMD 0x91CC +#define GL_FLOAT16_MAT4x3_AMD 0x91CD +#endif /* GL_AMD_gpu_shader_half_float */ + +#ifndef GL_AMD_gpu_shader_int16 +#define GL_AMD_gpu_shader_int16 1 +#endif /* GL_AMD_gpu_shader_int16 */ + +#ifndef GL_AMD_gpu_shader_int64 +#define GL_AMD_gpu_shader_int64 1 +typedef khronos_int64_t GLint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +typedef void (APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GLAPI void APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GLAPI void APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GLAPI void APIENTRY glGetUniformui64vNV (GLuint program, GLint location, GLuint64EXT *params); +GLAPI void APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GLAPI void APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GLAPI void APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GLAPI void APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_AMD_gpu_shader_int64 */ + +#ifndef GL_AMD_interleaved_elements +#define GL_AMD_interleaved_elements 1 +#define GL_VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 +#define GL_VERTEX_ID_SWIZZLE_AMD 0x91A5 +typedef void (APIENTRYP PFNGLVERTEXATTRIBPARAMETERIAMDPROC) (GLuint index, GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribParameteriAMD (GLuint index, GLenum pname, GLint param); +#endif +#endif /* GL_AMD_interleaved_elements */ + +#ifndef GL_AMD_multi_draw_indirect +#define GL_AMD_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTAMDPROC) (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTAMDPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectAMD (GLenum mode, const void *indirect, GLsizei primcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawElementsIndirectAMD (GLenum mode, GLenum type, const void *indirect, GLsizei primcount, GLsizei stride); +#endif +#endif /* GL_AMD_multi_draw_indirect */ + +#ifndef GL_AMD_name_gen_delete +#define GL_AMD_name_gen_delete 1 +#define GL_DATA_BUFFER_AMD 0x9151 +#define GL_PERFORMANCE_MONITOR_AMD 0x9152 +#define GL_QUERY_OBJECT_AMD 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_AMD 0x9154 +#define GL_SAMPLER_OBJECT_AMD 0x9155 +typedef void (APIENTRYP PFNGLGENNAMESAMDPROC) (GLenum identifier, GLuint num, GLuint *names); +typedef void (APIENTRYP PFNGLDELETENAMESAMDPROC) (GLenum identifier, GLuint num, const GLuint *names); +typedef GLboolean (APIENTRYP PFNGLISNAMEAMDPROC) (GLenum identifier, GLuint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenNamesAMD (GLenum identifier, GLuint num, GLuint *names); +GLAPI void APIENTRY glDeleteNamesAMD (GLenum identifier, GLuint num, const GLuint *names); +GLAPI GLboolean APIENTRY glIsNameAMD (GLenum identifier, GLuint name); +#endif +#endif /* GL_AMD_name_gen_delete */ + +#ifndef GL_AMD_occlusion_query_event +#define GL_AMD_occlusion_query_event 1 +#define GL_OCCLUSION_QUERY_EVENT_MASK_AMD 0x874F +#define GL_QUERY_DEPTH_PASS_EVENT_BIT_AMD 0x00000001 +#define GL_QUERY_DEPTH_FAIL_EVENT_BIT_AMD 0x00000002 +#define GL_QUERY_STENCIL_FAIL_EVENT_BIT_AMD 0x00000004 +#define GL_QUERY_DEPTH_BOUNDS_FAIL_EVENT_BIT_AMD 0x00000008 +#define GL_QUERY_ALL_EVENT_BITS_AMD 0xFFFFFFFF +typedef void (APIENTRYP PFNGLQUERYOBJECTPARAMETERUIAMDPROC) (GLenum target, GLuint id, GLenum pname, GLuint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glQueryObjectParameteruiAMD (GLenum target, GLuint id, GLenum pname, GLuint param); +#endif +#endif /* GL_AMD_occlusion_query_event */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GLAPI void APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GLAPI void APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GLAPI void APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GLAPI void APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GLAPI void APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GLAPI void APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GLAPI void APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GLAPI void APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_pinned_memory +#define GL_AMD_pinned_memory 1 +#define GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD 0x9160 +#endif /* GL_AMD_pinned_memory */ + +#ifndef GL_AMD_query_buffer_object +#define GL_AMD_query_buffer_object 1 +#define GL_QUERY_BUFFER_AMD 0x9192 +#define GL_QUERY_BUFFER_BINDING_AMD 0x9193 +#define GL_QUERY_RESULT_NO_WAIT_AMD 0x9194 +#endif /* GL_AMD_query_buffer_object */ + +#ifndef GL_AMD_sample_positions +#define GL_AMD_sample_positions 1 +typedef void (APIENTRYP PFNGLSETMULTISAMPLEFVAMDPROC) (GLenum pname, GLuint index, const GLfloat *val); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSetMultisamplefvAMD (GLenum pname, GLuint index, const GLfloat *val); +#endif +#endif /* GL_AMD_sample_positions */ + +#ifndef GL_AMD_seamless_cubemap_per_texture +#define GL_AMD_seamless_cubemap_per_texture 1 +#endif /* GL_AMD_seamless_cubemap_per_texture */ + +#ifndef GL_AMD_shader_atomic_counter_ops +#define GL_AMD_shader_atomic_counter_ops 1 +#endif /* GL_AMD_shader_atomic_counter_ops */ + +#ifndef GL_AMD_shader_ballot +#define GL_AMD_shader_ballot 1 +#endif /* GL_AMD_shader_ballot */ + +#ifndef GL_AMD_shader_explicit_vertex_parameter +#define GL_AMD_shader_explicit_vertex_parameter 1 +#endif /* GL_AMD_shader_explicit_vertex_parameter */ + +#ifndef GL_AMD_shader_gpu_shader_half_float_fetch +#define GL_AMD_shader_gpu_shader_half_float_fetch 1 +#endif /* GL_AMD_shader_gpu_shader_half_float_fetch */ + +#ifndef GL_AMD_shader_image_load_store_lod +#define GL_AMD_shader_image_load_store_lod 1 +#endif /* GL_AMD_shader_image_load_store_lod */ + +#ifndef GL_AMD_shader_stencil_export +#define GL_AMD_shader_stencil_export 1 +#endif /* GL_AMD_shader_stencil_export */ + +#ifndef GL_AMD_shader_trinary_minmax +#define GL_AMD_shader_trinary_minmax 1 +#endif /* GL_AMD_shader_trinary_minmax */ + +#ifndef GL_AMD_sparse_texture +#define GL_AMD_sparse_texture 1 +#define GL_VIRTUAL_PAGE_SIZE_X_AMD 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_AMD 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_AMD 0x9197 +#define GL_MAX_SPARSE_TEXTURE_SIZE_AMD 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_AMD 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS 0x919A +#define GL_MIN_SPARSE_LEVEL_AMD 0x919B +#define GL_MIN_LOD_WARNING_AMD 0x919C +#define GL_TEXTURE_STORAGE_SPARSE_BIT_AMD 0x00000001 +typedef void (APIENTRYP PFNGLTEXSTORAGESPARSEAMDPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +typedef void (APIENTRYP PFNGLTEXTURESTORAGESPARSEAMDPROC) (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorageSparseAMD (GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +GLAPI void APIENTRY glTextureStorageSparseAMD (GLuint texture, GLenum target, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLsizei layers, GLbitfield flags); +#endif +#endif /* GL_AMD_sparse_texture */ + +#ifndef GL_AMD_stencil_operation_extended +#define GL_AMD_stencil_operation_extended 1 +#define GL_SET_AMD 0x874A +#define GL_REPLACE_VALUE_AMD 0x874B +#define GL_STENCIL_OP_VALUE_AMD 0x874C +#define GL_STENCIL_BACK_OP_VALUE_AMD 0x874D +typedef void (APIENTRYP PFNGLSTENCILOPVALUEAMDPROC) (GLenum face, GLuint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpValueAMD (GLenum face, GLuint value); +#endif +#endif /* GL_AMD_stencil_operation_extended */ + +#ifndef GL_AMD_texture_gather_bias_lod +#define GL_AMD_texture_gather_bias_lod 1 +#endif /* GL_AMD_texture_gather_bias_lod */ + +#ifndef GL_AMD_texture_texture4 +#define GL_AMD_texture_texture4 1 +#endif /* GL_AMD_texture_texture4 */ + +#ifndef GL_AMD_transform_feedback3_lines_triangles +#define GL_AMD_transform_feedback3_lines_triangles 1 +#endif /* GL_AMD_transform_feedback3_lines_triangles */ + +#ifndef GL_AMD_transform_feedback4 +#define GL_AMD_transform_feedback4 1 +#define GL_STREAM_RASTERIZATION_AMD 0x91A0 +#endif /* GL_AMD_transform_feedback4 */ + +#ifndef GL_AMD_vertex_shader_layer +#define GL_AMD_vertex_shader_layer 1 +#endif /* GL_AMD_vertex_shader_layer */ + +#ifndef GL_AMD_vertex_shader_tessellator +#define GL_AMD_vertex_shader_tessellator 1 +#define GL_SAMPLER_BUFFER_AMD 0x9001 +#define GL_INT_SAMPLER_BUFFER_AMD 0x9002 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_AMD 0x9003 +#define GL_TESSELLATION_MODE_AMD 0x9004 +#define GL_TESSELLATION_FACTOR_AMD 0x9005 +#define GL_DISCRETE_AMD 0x9006 +#define GL_CONTINUOUS_AMD 0x9007 +typedef void (APIENTRYP PFNGLTESSELLATIONFACTORAMDPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLTESSELLATIONMODEAMDPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTessellationFactorAMD (GLfloat factor); +GLAPI void APIENTRY glTessellationModeAMD (GLenum mode); +#endif +#endif /* GL_AMD_vertex_shader_tessellator */ + +#ifndef GL_AMD_vertex_shader_viewport_index +#define GL_AMD_vertex_shader_viewport_index 1 +#endif /* GL_AMD_vertex_shader_viewport_index */ + +#ifndef GL_APPLE_aux_depth_stencil +#define GL_APPLE_aux_depth_stencil 1 +#define GL_AUX_DEPTH_STENCIL_APPLE 0x8A14 +#endif /* GL_APPLE_aux_depth_stencil */ + +#ifndef GL_APPLE_client_storage +#define GL_APPLE_client_storage 1 +#define GL_UNPACK_CLIENT_STORAGE_APPLE 0x85B2 +#endif /* GL_APPLE_client_storage */ + +#ifndef GL_APPLE_element_array +#define GL_APPLE_element_array 1 +#define GL_ELEMENT_ARRAY_APPLE 0x8A0C +#define GL_ELEMENT_ARRAY_TYPE_APPLE 0x8A0D +#define GL_ELEMENT_ARRAY_POINTER_APPLE 0x8A0E +typedef void (APIENTRYP PFNGLELEMENTPOINTERAPPLEPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC) (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerAPPLE (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayAPPLE (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, GLint first, GLsizei count); +GLAPI void APIENTRY glMultiDrawElementArrayAPPLE (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawRangeElementArrayAPPLE (GLenum mode, GLuint start, GLuint end, const GLint *first, const GLsizei *count, GLsizei primcount); +#endif +#endif /* GL_APPLE_element_array */ + +#ifndef GL_APPLE_fence +#define GL_APPLE_fence 1 +#define GL_DRAW_PIXELS_APPLE 0x8A0A +#define GL_FENCE_APPLE 0x8A0B +typedef void (APIENTRYP PFNGLGENFENCESAPPLEPROC) (GLsizei n, GLuint *fences); +typedef void (APIENTRYP PFNGLDELETEFENCESAPPLEPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLSETFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLISFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCEAPPLEPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLFINISHFENCEAPPLEPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTOBJECTAPPLEPROC) (GLenum object, GLuint name); +typedef void (APIENTRYP PFNGLFINISHOBJECTAPPLEPROC) (GLenum object, GLint name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenFencesAPPLE (GLsizei n, GLuint *fences); +GLAPI void APIENTRY glDeleteFencesAPPLE (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glSetFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glIsFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceAPPLE (GLuint fence); +GLAPI void APIENTRY glFinishFenceAPPLE (GLuint fence); +GLAPI GLboolean APIENTRY glTestObjectAPPLE (GLenum object, GLuint name); +GLAPI void APIENTRY glFinishObjectAPPLE (GLenum object, GLint name); +#endif +#endif /* GL_APPLE_fence */ + +#ifndef GL_APPLE_float_pixels +#define GL_APPLE_float_pixels 1 +#define GL_HALF_APPLE 0x140B +#define GL_RGBA_FLOAT32_APPLE 0x8814 +#define GL_RGB_FLOAT32_APPLE 0x8815 +#define GL_ALPHA_FLOAT32_APPLE 0x8816 +#define GL_INTENSITY_FLOAT32_APPLE 0x8817 +#define GL_LUMINANCE_FLOAT32_APPLE 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_APPLE 0x8819 +#define GL_RGBA_FLOAT16_APPLE 0x881A +#define GL_RGB_FLOAT16_APPLE 0x881B +#define GL_ALPHA_FLOAT16_APPLE 0x881C +#define GL_INTENSITY_FLOAT16_APPLE 0x881D +#define GL_LUMINANCE_FLOAT16_APPLE 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_APPLE 0x881F +#define GL_COLOR_FLOAT_APPLE 0x8A0F +#endif /* GL_APPLE_float_pixels */ + +#ifndef GL_APPLE_flush_buffer_range +#define GL_APPLE_flush_buffer_range 1 +#define GL_BUFFER_SERIALIZED_MODIFY_APPLE 0x8A12 +#define GL_BUFFER_FLUSHING_UNMAP_APPLE 0x8A13 +typedef void (APIENTRYP PFNGLBUFFERPARAMETERIAPPLEPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC) (GLenum target, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferParameteriAPPLE (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glFlushMappedBufferRangeAPPLE (GLenum target, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_APPLE_flush_buffer_range */ + +#ifndef GL_APPLE_object_purgeable +#define GL_APPLE_object_purgeable 1 +#define GL_BUFFER_OBJECT_APPLE 0x85B3 +#define GL_RELEASED_APPLE 0x8A19 +#define GL_VOLATILE_APPLE 0x8A1A +#define GL_RETAINED_APPLE 0x8A1B +#define GL_UNDEFINED_APPLE 0x8A1C +#define GL_PURGEABLE_APPLE 0x8A1D +typedef GLenum (APIENTRYP PFNGLOBJECTPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef GLenum (APIENTRYP PFNGLOBJECTUNPURGEABLEAPPLEPROC) (GLenum objectType, GLuint name, GLenum option); +typedef void (APIENTRYP PFNGLGETOBJECTPARAMETERIVAPPLEPROC) (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLenum APIENTRY glObjectPurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI GLenum APIENTRY glObjectUnpurgeableAPPLE (GLenum objectType, GLuint name, GLenum option); +GLAPI void APIENTRY glGetObjectParameterivAPPLE (GLenum objectType, GLuint name, GLenum pname, GLint *params); +#endif +#endif /* GL_APPLE_object_purgeable */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_row_bytes +#define GL_APPLE_row_bytes 1 +#define GL_PACK_ROW_BYTES_APPLE 0x8A15 +#define GL_UNPACK_ROW_BYTES_APPLE 0x8A16 +#endif /* GL_APPLE_row_bytes */ + +#ifndef GL_APPLE_specular_vector +#define GL_APPLE_specular_vector 1 +#define GL_LIGHT_MODEL_SPECULAR_VECTOR_APPLE 0x85B0 +#endif /* GL_APPLE_specular_vector */ + +#ifndef GL_APPLE_texture_range +#define GL_APPLE_texture_range 1 +#define GL_TEXTURE_RANGE_LENGTH_APPLE 0x85B7 +#define GL_TEXTURE_RANGE_POINTER_APPLE 0x85B8 +#define GL_TEXTURE_STORAGE_HINT_APPLE 0x85BC +#define GL_STORAGE_PRIVATE_APPLE 0x85BD +#define GL_STORAGE_CACHED_APPLE 0x85BE +#define GL_STORAGE_SHARED_APPLE 0x85BF +typedef void (APIENTRYP PFNGLTEXTURERANGEAPPLEPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureRangeAPPLE (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glGetTexParameterPointervAPPLE (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_APPLE_texture_range */ + +#ifndef GL_APPLE_transform_hint +#define GL_APPLE_transform_hint 1 +#define GL_TRANSFORM_HINT_APPLE 0x85B1 +#endif /* GL_APPLE_transform_hint */ + +#ifndef GL_APPLE_vertex_array_object +#define GL_APPLE_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_APPLE 0x85B5 +typedef void (APIENTRYP PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array); +typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays); +typedef void (APIENTRYP PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (APIENTRYP PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindVertexArrayAPPLE (GLuint array); +GLAPI void APIENTRY glDeleteVertexArraysAPPLE (GLsizei n, const GLuint *arrays); +GLAPI void APIENTRY glGenVertexArraysAPPLE (GLsizei n, GLuint *arrays); +GLAPI GLboolean APIENTRY glIsVertexArrayAPPLE (GLuint array); +#endif +#endif /* GL_APPLE_vertex_array_object */ + +#ifndef GL_APPLE_vertex_array_range +#define GL_APPLE_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_APPLE 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE 0x851E +#define GL_VERTEX_ARRAY_STORAGE_HINT_APPLE 0x851F +#define GL_VERTEX_ARRAY_RANGE_POINTER_APPLE 0x8521 +#define GL_STORAGE_CLIENT_APPLE 0x85B4 +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC) (GLsizei length, void *pointer); +typedef void (APIENTRYP PFNGLVERTEXARRAYPARAMETERIAPPLEPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glFlushVertexArrayRangeAPPLE (GLsizei length, void *pointer); +GLAPI void APIENTRY glVertexArrayParameteriAPPLE (GLenum pname, GLint param); +#endif +#endif /* GL_APPLE_vertex_array_range */ + +#ifndef GL_APPLE_vertex_program_evaluators +#define GL_APPLE_vertex_program_evaluators 1 +#define GL_VERTEX_ATTRIB_MAP1_APPLE 0x8A00 +#define GL_VERTEX_ATTRIB_MAP2_APPLE 0x8A01 +#define GL_VERTEX_ATTRIB_MAP1_SIZE_APPLE 0x8A02 +#define GL_VERTEX_ATTRIB_MAP1_COEFF_APPLE 0x8A03 +#define GL_VERTEX_ATTRIB_MAP1_ORDER_APPLE 0x8A04 +#define GL_VERTEX_ATTRIB_MAP1_DOMAIN_APPLE 0x8A05 +#define GL_VERTEX_ATTRIB_MAP2_SIZE_APPLE 0x8A06 +#define GL_VERTEX_ATTRIB_MAP2_COEFF_APPLE 0x8A07 +#define GL_VERTEX_ATTRIB_MAP2_ORDER_APPLE 0x8A08 +#define GL_VERTEX_ATTRIB_MAP2_DOMAIN_APPLE 0x8A09 +typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBAPPLEPROC) (GLuint index, GLenum pname); +typedef GLboolean (APIENTRYP PFNGLISVERTEXATTRIBENABLEDAPPLEPROC) (GLuint index, GLenum pname); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB1FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2DAPPLEPROC) (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +typedef void (APIENTRYP PFNGLMAPVERTEXATTRIB2FAPPLEPROC) (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEnableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glDisableVertexAttribAPPLE (GLuint index, GLenum pname); +GLAPI GLboolean APIENTRY glIsVertexAttribEnabledAPPLE (GLuint index, GLenum pname); +GLAPI void APIENTRY glMapVertexAttrib1dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib1fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points); +GLAPI void APIENTRY glMapVertexAttrib2dAPPLE (GLuint index, GLuint size, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points); +GLAPI void APIENTRY glMapVertexAttrib2fAPPLE (GLuint index, GLuint size, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points); +#endif +#endif /* GL_APPLE_vertex_program_evaluators */ + +#ifndef GL_APPLE_ycbcr_422 +#define GL_APPLE_ycbcr_422 1 +#define GL_YCBCR_422_APPLE 0x85B9 +#endif /* GL_APPLE_ycbcr_422 */ + +#ifndef GL_ATI_draw_buffers +#define GL_ATI_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_ATI 0x8824 +#define GL_DRAW_BUFFER0_ATI 0x8825 +#define GL_DRAW_BUFFER1_ATI 0x8826 +#define GL_DRAW_BUFFER2_ATI 0x8827 +#define GL_DRAW_BUFFER3_ATI 0x8828 +#define GL_DRAW_BUFFER4_ATI 0x8829 +#define GL_DRAW_BUFFER5_ATI 0x882A +#define GL_DRAW_BUFFER6_ATI 0x882B +#define GL_DRAW_BUFFER7_ATI 0x882C +#define GL_DRAW_BUFFER8_ATI 0x882D +#define GL_DRAW_BUFFER9_ATI 0x882E +#define GL_DRAW_BUFFER10_ATI 0x882F +#define GL_DRAW_BUFFER11_ATI 0x8830 +#define GL_DRAW_BUFFER12_ATI 0x8831 +#define GL_DRAW_BUFFER13_ATI 0x8832 +#define GL_DRAW_BUFFER14_ATI 0x8833 +#define GL_DRAW_BUFFER15_ATI 0x8834 +typedef void (APIENTRYP PFNGLDRAWBUFFERSATIPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawBuffersATI (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_ATI_draw_buffers */ + +#ifndef GL_ATI_element_array +#define GL_ATI_element_array 1 +#define GL_ELEMENT_ARRAY_ATI 0x8768 +#define GL_ELEMENT_ARRAY_TYPE_ATI 0x8769 +#define GL_ELEMENT_ARRAY_POINTER_ATI 0x876A +typedef void (APIENTRYP PFNGLELEMENTPOINTERATIPROC) (GLenum type, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWELEMENTARRAYATIPROC) (GLenum mode, GLsizei count); +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTARRAYATIPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glElementPointerATI (GLenum type, const void *pointer); +GLAPI void APIENTRY glDrawElementArrayATI (GLenum mode, GLsizei count); +GLAPI void APIENTRY glDrawRangeElementArrayATI (GLenum mode, GLuint start, GLuint end, GLsizei count); +#endif +#endif /* GL_ATI_element_array */ + +#ifndef GL_ATI_envmap_bumpmap +#define GL_ATI_envmap_bumpmap 1 +#define GL_BUMP_ROT_MATRIX_ATI 0x8775 +#define GL_BUMP_ROT_MATRIX_SIZE_ATI 0x8776 +#define GL_BUMP_NUM_TEX_UNITS_ATI 0x8777 +#define GL_BUMP_TEX_UNITS_ATI 0x8778 +#define GL_DUDV_ATI 0x8779 +#define GL_DU8DV8_ATI 0x877A +#define GL_BUMP_ENVMAP_ATI 0x877B +#define GL_BUMP_TARGET_ATI 0x877C +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERIVATIPROC) (GLenum pname, const GLint *param); +typedef void (APIENTRYP PFNGLTEXBUMPPARAMETERFVATIPROC) (GLenum pname, const GLfloat *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERIVATIPROC) (GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETTEXBUMPPARAMETERFVATIPROC) (GLenum pname, GLfloat *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBumpParameterivATI (GLenum pname, const GLint *param); +GLAPI void APIENTRY glTexBumpParameterfvATI (GLenum pname, const GLfloat *param); +GLAPI void APIENTRY glGetTexBumpParameterivATI (GLenum pname, GLint *param); +GLAPI void APIENTRY glGetTexBumpParameterfvATI (GLenum pname, GLfloat *param); +#endif +#endif /* GL_ATI_envmap_bumpmap */ + +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader 1 +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_REG_6_ATI 0x8927 +#define GL_REG_7_ATI 0x8928 +#define GL_REG_8_ATI 0x8929 +#define GL_REG_9_ATI 0x892A +#define GL_REG_10_ATI 0x892B +#define GL_REG_11_ATI 0x892C +#define GL_REG_12_ATI 0x892D +#define GL_REG_13_ATI 0x892E +#define GL_REG_14_ATI 0x892F +#define GL_REG_15_ATI 0x8930 +#define GL_REG_16_ATI 0x8931 +#define GL_REG_17_ATI 0x8932 +#define GL_REG_18_ATI 0x8933 +#define GL_REG_19_ATI 0x8934 +#define GL_REG_20_ATI 0x8935 +#define GL_REG_21_ATI 0x8936 +#define GL_REG_22_ATI 0x8937 +#define GL_REG_23_ATI 0x8938 +#define GL_REG_24_ATI 0x8939 +#define GL_REG_25_ATI 0x893A +#define GL_REG_26_ATI 0x893B +#define GL_REG_27_ATI 0x893C +#define GL_REG_28_ATI 0x893D +#define GL_REG_29_ATI 0x893E +#define GL_REG_30_ATI 0x893F +#define GL_REG_31_ATI 0x8940 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_CON_8_ATI 0x8949 +#define GL_CON_9_ATI 0x894A +#define GL_CON_10_ATI 0x894B +#define GL_CON_11_ATI 0x894C +#define GL_CON_12_ATI 0x894D +#define GL_CON_13_ATI 0x894E +#define GL_CON_14_ATI 0x894F +#define GL_CON_15_ATI 0x8950 +#define GL_CON_16_ATI 0x8951 +#define GL_CON_17_ATI 0x8952 +#define GL_CON_18_ATI 0x8953 +#define GL_CON_19_ATI 0x8954 +#define GL_CON_20_ATI 0x8955 +#define GL_CON_21_ATI 0x8956 +#define GL_CON_22_ATI 0x8957 +#define GL_CON_23_ATI 0x8958 +#define GL_CON_24_ATI 0x8959 +#define GL_CON_25_ATI 0x895A +#define GL_CON_26_ATI 0x895B +#define GL_CON_27_ATI 0x895C +#define GL_CON_28_ATI 0x895D +#define GL_CON_29_ATI 0x895E +#define GL_CON_30_ATI 0x895F +#define GL_CON_31_ATI 0x8960 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_NUM_FRAGMENT_REGISTERS_ATI 0x896E +#define GL_NUM_FRAGMENT_CONSTANTS_ATI 0x896F +#define GL_NUM_PASSES_ATI 0x8970 +#define GL_NUM_INSTRUCTIONS_PER_PASS_ATI 0x8971 +#define GL_NUM_INSTRUCTIONS_TOTAL_ATI 0x8972 +#define GL_NUM_INPUT_INTERPOLATOR_COMPONENTS_ATI 0x8973 +#define GL_NUM_LOOPBACK_COMPONENTS_ATI 0x8974 +#define GL_COLOR_ALPHA_PAIRING_ATI 0x8975 +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_SWIZZLE_STRQ_ATI 0x897A +#define GL_SWIZZLE_STRQ_DQ_ATI 0x897B +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +typedef GLuint (APIENTRYP PFNGLGENFRAGMENTSHADERSATIPROC) (GLuint range); +typedef void (APIENTRYP PFNGLBINDFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDELETEFRAGMENTSHADERATIPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLENDFRAGMENTSHADERATIPROC) (void); +typedef void (APIENTRYP PFNGLPASSTEXCOORDATIPROC) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (APIENTRYP PFNGLSAMPLEMAPATIPROC) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLCOLORFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP1ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP2ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (APIENTRYP PFNGLALPHAFRAGMENTOP3ATIPROC) (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (APIENTRYP PFNGLSETFRAGMENTSHADERCONSTANTATIPROC) (GLuint dst, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenFragmentShadersATI (GLuint range); +GLAPI void APIENTRY glBindFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glDeleteFragmentShaderATI (GLuint id); +GLAPI void APIENTRY glBeginFragmentShaderATI (void); +GLAPI void APIENTRY glEndFragmentShaderATI (void); +GLAPI void APIENTRY glPassTexCoordATI (GLuint dst, GLuint coord, GLenum swizzle); +GLAPI void APIENTRY glSampleMapATI (GLuint dst, GLuint interp, GLenum swizzle); +GLAPI void APIENTRY glColorFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glColorFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glColorFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMask, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glAlphaFragmentOp1ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +GLAPI void APIENTRY glAlphaFragmentOp2ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +GLAPI void APIENTRY glAlphaFragmentOp3ATI (GLenum op, GLuint dst, GLuint dstMod, GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +GLAPI void APIENTRY glSetFragmentShaderConstantATI (GLuint dst, const GLfloat *value); +#endif +#endif /* GL_ATI_fragment_shader */ + +#ifndef GL_ATI_map_object_buffer +#define GL_ATI_map_object_buffer 1 +typedef void *(APIENTRYP PFNGLMAPOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUNMAPOBJECTBUFFERATIPROC) (GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void *APIENTRY glMapObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUnmapObjectBufferATI (GLuint buffer); +#endif +#endif /* GL_ATI_map_object_buffer */ + +#ifndef GL_ATI_meminfo +#define GL_ATI_meminfo 1 +#define GL_VBO_FREE_MEMORY_ATI 0x87FB +#define GL_TEXTURE_FREE_MEMORY_ATI 0x87FC +#define GL_RENDERBUFFER_FREE_MEMORY_ATI 0x87FD +#endif /* GL_ATI_meminfo */ + +#ifndef GL_ATI_pixel_format_float +#define GL_ATI_pixel_format_float 1 +#define GL_RGBA_FLOAT_MODE_ATI 0x8820 +#define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 +#endif /* GL_ATI_pixel_format_float */ + +#ifndef GL_ATI_pn_triangles +#define GL_ATI_pn_triangles 1 +#define GL_PN_TRIANGLES_ATI 0x87F0 +#define GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F1 +#define GL_PN_TRIANGLES_POINT_MODE_ATI 0x87F2 +#define GL_PN_TRIANGLES_NORMAL_MODE_ATI 0x87F3 +#define GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI 0x87F4 +#define GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI 0x87F5 +#define GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI 0x87F6 +#define GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI 0x87F7 +#define GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI 0x87F8 +typedef void (APIENTRYP PFNGLPNTRIANGLESIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPNTRIANGLESFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPNTrianglesiATI (GLenum pname, GLint param); +GLAPI void APIENTRY glPNTrianglesfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_pn_triangles */ + +#ifndef GL_ATI_separate_stencil +#define GL_ATI_separate_stencil 1 +#define GL_STENCIL_BACK_FUNC_ATI 0x8800 +#define GL_STENCIL_BACK_FAIL_ATI 0x8801 +#define GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI 0x8802 +#define GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI 0x8803 +typedef void (APIENTRYP PFNGLSTENCILOPSEPARATEATIPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (APIENTRYP PFNGLSTENCILFUNCSEPARATEATIPROC) (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilOpSeparateATI (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GLAPI void APIENTRY glStencilFuncSeparateATI (GLenum frontfunc, GLenum backfunc, GLint ref, GLuint mask); +#endif +#endif /* GL_ATI_separate_stencil */ + +#ifndef GL_ATI_text_fragment_shader +#define GL_ATI_text_fragment_shader 1 +#define GL_TEXT_FRAGMENT_SHADER_ATI 0x8200 +#endif /* GL_ATI_text_fragment_shader */ + +#ifndef GL_ATI_texture_env_combine3 +#define GL_ATI_texture_env_combine3 1 +#define GL_MODULATE_ADD_ATI 0x8744 +#define GL_MODULATE_SIGNED_ADD_ATI 0x8745 +#define GL_MODULATE_SUBTRACT_ATI 0x8746 +#endif /* GL_ATI_texture_env_combine3 */ + +#ifndef GL_ATI_texture_float +#define GL_ATI_texture_float 1 +#define GL_RGBA_FLOAT32_ATI 0x8814 +#define GL_RGB_FLOAT32_ATI 0x8815 +#define GL_ALPHA_FLOAT32_ATI 0x8816 +#define GL_INTENSITY_FLOAT32_ATI 0x8817 +#define GL_LUMINANCE_FLOAT32_ATI 0x8818 +#define GL_LUMINANCE_ALPHA_FLOAT32_ATI 0x8819 +#define GL_RGBA_FLOAT16_ATI 0x881A +#define GL_RGB_FLOAT16_ATI 0x881B +#define GL_ALPHA_FLOAT16_ATI 0x881C +#define GL_INTENSITY_FLOAT16_ATI 0x881D +#define GL_LUMINANCE_FLOAT16_ATI 0x881E +#define GL_LUMINANCE_ALPHA_FLOAT16_ATI 0x881F +#endif /* GL_ATI_texture_float */ + +#ifndef GL_ATI_texture_mirror_once +#define GL_ATI_texture_mirror_once 1 +#define GL_MIRROR_CLAMP_ATI 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_ATI 0x8743 +#endif /* GL_ATI_texture_mirror_once */ + +#ifndef GL_ATI_vertex_array_object +#define GL_ATI_vertex_array_object 1 +#define GL_STATIC_ATI 0x8760 +#define GL_DYNAMIC_ATI 0x8761 +#define GL_PRESERVE_ATI 0x8762 +#define GL_DISCARD_ATI 0x8763 +#define GL_OBJECT_BUFFER_SIZE_ATI 0x8764 +#define GL_OBJECT_BUFFER_USAGE_ATI 0x8765 +#define GL_ARRAY_OBJECT_BUFFER_ATI 0x8766 +#define GL_ARRAY_OBJECT_OFFSET_ATI 0x8767 +typedef GLuint (APIENTRYP PFNGLNEWOBJECTBUFFERATIPROC) (GLsizei size, const void *pointer, GLenum usage); +typedef GLboolean (APIENTRYP PFNGLISOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLUPDATEOBJECTBUFFERATIPROC) (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERFVATIPROC) (GLuint buffer, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETOBJECTBUFFERIVATIPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFREEOBJECTBUFFERATIPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLARRAYOBJECTATIPROC) (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTFVATIPROC) (GLenum array, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETARRAYOBJECTIVATIPROC) (GLenum array, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLVARIANTARRAYOBJECTATIPROC) (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTFVATIPROC) (GLuint id, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVARIANTARRAYOBJECTIVATIPROC) (GLuint id, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glNewObjectBufferATI (GLsizei size, const void *pointer, GLenum usage); +GLAPI GLboolean APIENTRY glIsObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glUpdateObjectBufferATI (GLuint buffer, GLuint offset, GLsizei size, const void *pointer, GLenum preserve); +GLAPI void APIENTRY glGetObjectBufferfvATI (GLuint buffer, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetObjectBufferivATI (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glFreeObjectBufferATI (GLuint buffer); +GLAPI void APIENTRY glArrayObjectATI (GLenum array, GLint size, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetArrayObjectfvATI (GLenum array, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetArrayObjectivATI (GLenum array, GLenum pname, GLint *params); +GLAPI void APIENTRY glVariantArrayObjectATI (GLuint id, GLenum type, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVariantArrayObjectfvATI (GLuint id, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVariantArrayObjectivATI (GLuint id, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_array_object */ + +#ifndef GL_ATI_vertex_attrib_array_object +#define GL_ATI_vertex_attrib_array_object 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBARRAYOBJECTATIPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTFVATIPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBARRAYOBJECTIVATIPROC) (GLuint index, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribArrayObjectATI (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLuint buffer, GLuint offset); +GLAPI void APIENTRY glGetVertexAttribArrayObjectfvATI (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribArrayObjectivATI (GLuint index, GLenum pname, GLint *params); +#endif +#endif /* GL_ATI_vertex_attrib_array_object */ + +#ifndef GL_ATI_vertex_streams +#define GL_ATI_vertex_streams 1 +#define GL_MAX_VERTEX_STREAMS_ATI 0x876B +#define GL_VERTEX_STREAM0_ATI 0x876C +#define GL_VERTEX_STREAM1_ATI 0x876D +#define GL_VERTEX_STREAM2_ATI 0x876E +#define GL_VERTEX_STREAM3_ATI 0x876F +#define GL_VERTEX_STREAM4_ATI 0x8770 +#define GL_VERTEX_STREAM5_ATI 0x8771 +#define GL_VERTEX_STREAM6_ATI 0x8772 +#define GL_VERTEX_STREAM7_ATI 0x8773 +#define GL_VERTEX_SOURCE_ATI 0x8774 +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SATIPROC) (GLenum stream, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IATIPROC) (GLenum stream, GLint x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FATIPROC) (GLenum stream, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DATIPROC) (GLenum stream, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXSTREAM1DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SATIPROC) (GLenum stream, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IATIPROC) (GLenum stream, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FATIPROC) (GLenum stream, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DATIPROC) (GLenum stream, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXSTREAM2DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IATIPROC) (GLenum stream, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SATIPROC) (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IATIPROC) (GLenum stream, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FATIPROC) (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DATIPROC) (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXSTREAM4DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BATIPROC) (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3BVATIPROC) (GLenum stream, const GLbyte *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SATIPROC) (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3SVATIPROC) (GLenum stream, const GLshort *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IATIPROC) (GLenum stream, GLint nx, GLint ny, GLint nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3IVATIPROC) (GLenum stream, const GLint *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FATIPROC) (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3FVATIPROC) (GLenum stream, const GLfloat *coords); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DATIPROC) (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +typedef void (APIENTRYP PFNGLNORMALSTREAM3DVATIPROC) (GLenum stream, const GLdouble *coords); +typedef void (APIENTRYP PFNGLCLIENTACTIVEVERTEXSTREAMATIPROC) (GLenum stream); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVIATIPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLVERTEXBLENDENVFATIPROC) (GLenum pname, GLfloat param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexStream1sATI (GLenum stream, GLshort x); +GLAPI void APIENTRY glVertexStream1svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream1iATI (GLenum stream, GLint x); +GLAPI void APIENTRY glVertexStream1ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream1fATI (GLenum stream, GLfloat x); +GLAPI void APIENTRY glVertexStream1fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream1dATI (GLenum stream, GLdouble x); +GLAPI void APIENTRY glVertexStream1dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream2sATI (GLenum stream, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexStream2svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream2iATI (GLenum stream, GLint x, GLint y); +GLAPI void APIENTRY glVertexStream2ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream2fATI (GLenum stream, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexStream2fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream2dATI (GLenum stream, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexStream2dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream3sATI (GLenum stream, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream3iATI (GLenum stream, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream3fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream3dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glVertexStream4sATI (GLenum stream, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexStream4svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glVertexStream4iATI (GLenum stream, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexStream4ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glVertexStream4fATI (GLenum stream, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexStream4fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glVertexStream4dATI (GLenum stream, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexStream4dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glNormalStream3bATI (GLenum stream, GLbyte nx, GLbyte ny, GLbyte nz); +GLAPI void APIENTRY glNormalStream3bvATI (GLenum stream, const GLbyte *coords); +GLAPI void APIENTRY glNormalStream3sATI (GLenum stream, GLshort nx, GLshort ny, GLshort nz); +GLAPI void APIENTRY glNormalStream3svATI (GLenum stream, const GLshort *coords); +GLAPI void APIENTRY glNormalStream3iATI (GLenum stream, GLint nx, GLint ny, GLint nz); +GLAPI void APIENTRY glNormalStream3ivATI (GLenum stream, const GLint *coords); +GLAPI void APIENTRY glNormalStream3fATI (GLenum stream, GLfloat nx, GLfloat ny, GLfloat nz); +GLAPI void APIENTRY glNormalStream3fvATI (GLenum stream, const GLfloat *coords); +GLAPI void APIENTRY glNormalStream3dATI (GLenum stream, GLdouble nx, GLdouble ny, GLdouble nz); +GLAPI void APIENTRY glNormalStream3dvATI (GLenum stream, const GLdouble *coords); +GLAPI void APIENTRY glClientActiveVertexStreamATI (GLenum stream); +GLAPI void APIENTRY glVertexBlendEnviATI (GLenum pname, GLint param); +GLAPI void APIENTRY glVertexBlendEnvfATI (GLenum pname, GLfloat param); +#endif +#endif /* GL_ATI_vertex_streams */ + +#ifndef GL_EXT_422_pixels +#define GL_EXT_422_pixels 1 +#define GL_422_EXT 0x80CC +#define GL_422_REV_EXT 0x80CD +#define GL_422_AVERAGE_EXT 0x80CE +#define GL_422_REV_AVERAGE_EXT 0x80CF +#endif /* GL_EXT_422_pixels */ + +#ifndef GL_EXT_EGL_image_storage +#define GL_EXT_EGL_image_storage 1 +typedef void *GLeglImageOES; +typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); +typedef void (APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); +GLAPI void APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#endif +#endif /* GL_EXT_EGL_image_storage */ + +#ifndef GL_EXT_EGL_sync +#define GL_EXT_EGL_sync 1 +#endif /* GL_EXT_EGL_sync */ + +#ifndef GL_EXT_abgr +#define GL_EXT_abgr 1 +#define GL_ABGR_EXT 0x8000 +#endif /* GL_EXT_abgr */ + +#ifndef GL_EXT_bgra +#define GL_EXT_bgra 1 +#define GL_BGR_EXT 0x80E0 +#define GL_BGRA_EXT 0x80E1 +#endif /* GL_EXT_bgra */ + +#ifndef GL_EXT_bindable_uniform +#define GL_EXT_bindable_uniform 1 +#define GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT 0x8DE2 +#define GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT 0x8DE3 +#define GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT 0x8DE4 +#define GL_MAX_BINDABLE_UNIFORM_SIZE_EXT 0x8DED +#define GL_UNIFORM_BUFFER_EXT 0x8DEE +#define GL_UNIFORM_BUFFER_BINDING_EXT 0x8DEF +typedef void (APIENTRYP PFNGLUNIFORMBUFFEREXTPROC) (GLuint program, GLint location, GLuint buffer); +typedef GLint (APIENTRYP PFNGLGETUNIFORMBUFFERSIZEEXTPROC) (GLuint program, GLint location); +typedef GLintptr (APIENTRYP PFNGLGETUNIFORMOFFSETEXTPROC) (GLuint program, GLint location); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUniformBufferEXT (GLuint program, GLint location, GLuint buffer); +GLAPI GLint APIENTRY glGetUniformBufferSizeEXT (GLuint program, GLint location); +GLAPI GLintptr APIENTRY glGetUniformOffsetEXT (GLuint program, GLint location); +#endif +#endif /* GL_EXT_bindable_uniform */ + +#ifndef GL_EXT_blend_color +#define GL_EXT_blend_color 1 +#define GL_CONSTANT_COLOR_EXT 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR_EXT 0x8002 +#define GL_CONSTANT_ALPHA_EXT 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA_EXT 0x8004 +#define GL_BLEND_COLOR_EXT 0x8005 +typedef void (APIENTRYP PFNGLBLENDCOLOREXTPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendColorEXT (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +#endif +#endif /* GL_EXT_blend_color */ + +#ifndef GL_EXT_blend_equation_separate +#define GL_EXT_blend_equation_separate 1 +#define GL_BLEND_EQUATION_RGB_EXT 0x8009 +#define GL_BLEND_EQUATION_ALPHA_EXT 0x883D +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEEXTPROC) (GLenum modeRGB, GLenum modeAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationSeparateEXT (GLenum modeRGB, GLenum modeAlpha); +#endif +#endif /* GL_EXT_blend_equation_separate */ + +#ifndef GL_EXT_blend_func_separate +#define GL_EXT_blend_func_separate 1 +#define GL_BLEND_DST_RGB_EXT 0x80C8 +#define GL_BLEND_SRC_RGB_EXT 0x80C9 +#define GL_BLEND_DST_ALPHA_EXT 0x80CA +#define GL_BLEND_SRC_ALPHA_EXT 0x80CB +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEEXTPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateEXT (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_EXT_blend_func_separate */ + +#ifndef GL_EXT_blend_logic_op +#define GL_EXT_blend_logic_op 1 +#endif /* GL_EXT_blend_logic_op */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#define GL_FUNC_ADD_EXT 0x8006 +#define GL_BLEND_EQUATION_EXT 0x8009 +typedef void (APIENTRYP PFNGLBLENDEQUATIONEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendEquationEXT (GLenum mode); +#endif +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_blend_subtract +#define GL_EXT_blend_subtract 1 +#define GL_FUNC_SUBTRACT_EXT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT_EXT 0x800B +#endif /* GL_EXT_blend_subtract */ + +#ifndef GL_EXT_clip_volume_hint +#define GL_EXT_clip_volume_hint 1 +#define GL_CLIP_VOLUME_CLIPPING_HINT_EXT 0x80F0 +#endif /* GL_EXT_clip_volume_hint */ + +#ifndef GL_EXT_cmyka +#define GL_EXT_cmyka 1 +#define GL_CMYK_EXT 0x800C +#define GL_CMYKA_EXT 0x800D +#define GL_PACK_CMYK_HINT_EXT 0x800E +#define GL_UNPACK_CMYK_HINT_EXT 0x800F +#endif /* GL_EXT_cmyka */ + +#ifndef GL_EXT_color_subtable +#define GL_EXT_color_subtable 1 +typedef void (APIENTRYP PFNGLCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCOPYCOLORSUBTABLEEXTPROC) (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorSubTableEXT (GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glCopyColorSubTableEXT (GLenum target, GLsizei start, GLint x, GLint y, GLsizei width); +#endif +#endif /* GL_EXT_color_subtable */ + +#ifndef GL_EXT_compiled_vertex_array +#define GL_EXT_compiled_vertex_array 1 +#define GL_ARRAY_ELEMENT_LOCK_FIRST_EXT 0x81A8 +#define GL_ARRAY_ELEMENT_LOCK_COUNT_EXT 0x81A9 +typedef void (APIENTRYP PFNGLLOCKARRAYSEXTPROC) (GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLUNLOCKARRAYSEXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLockArraysEXT (GLint first, GLsizei count); +GLAPI void APIENTRY glUnlockArraysEXT (void); +#endif +#endif /* GL_EXT_compiled_vertex_array */ + +#ifndef GL_EXT_convolution +#define GL_EXT_convolution 1 +#define GL_CONVOLUTION_1D_EXT 0x8010 +#define GL_CONVOLUTION_2D_EXT 0x8011 +#define GL_SEPARABLE_2D_EXT 0x8012 +#define GL_CONVOLUTION_BORDER_MODE_EXT 0x8013 +#define GL_CONVOLUTION_FILTER_SCALE_EXT 0x8014 +#define GL_CONVOLUTION_FILTER_BIAS_EXT 0x8015 +#define GL_REDUCE_EXT 0x8016 +#define GL_CONVOLUTION_FORMAT_EXT 0x8017 +#define GL_CONVOLUTION_WIDTH_EXT 0x8018 +#define GL_CONVOLUTION_HEIGHT_EXT 0x8019 +#define GL_MAX_CONVOLUTION_WIDTH_EXT 0x801A +#define GL_MAX_CONVOLUTION_HEIGHT_EXT 0x801B +#define GL_POST_CONVOLUTION_RED_SCALE_EXT 0x801C +#define GL_POST_CONVOLUTION_GREEN_SCALE_EXT 0x801D +#define GL_POST_CONVOLUTION_BLUE_SCALE_EXT 0x801E +#define GL_POST_CONVOLUTION_ALPHA_SCALE_EXT 0x801F +#define GL_POST_CONVOLUTION_RED_BIAS_EXT 0x8020 +#define GL_POST_CONVOLUTION_GREEN_BIAS_EXT 0x8021 +#define GL_POST_CONVOLUTION_BLUE_BIAS_EXT 0x8022 +#define GL_POST_CONVOLUTION_ALPHA_BIAS_EXT 0x8023 +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint params); +typedef void (APIENTRYP PFNGLCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER1DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYCONVOLUTIONFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *image); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCONVOLUTIONPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETSEPARABLEFILTEREXTPROC) (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +typedef void (APIENTRYP PFNGLSEPARABLEFILTER2DEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *image); +GLAPI void APIENTRY glConvolutionParameterfEXT (GLenum target, GLenum pname, GLfloat params); +GLAPI void APIENTRY glConvolutionParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glConvolutionParameteriEXT (GLenum target, GLenum pname, GLint params); +GLAPI void APIENTRY glConvolutionParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyConvolutionFilter1DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyConvolutionFilter2DEXT (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetConvolutionFilterEXT (GLenum target, GLenum format, GLenum type, void *image); +GLAPI void APIENTRY glGetConvolutionParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetConvolutionParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetSeparableFilterEXT (GLenum target, GLenum format, GLenum type, void *row, void *column, void *span); +GLAPI void APIENTRY glSeparableFilter2DEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *row, const void *column); +#endif +#endif /* GL_EXT_convolution */ + +#ifndef GL_EXT_coordinate_frame +#define GL_EXT_coordinate_frame 1 +#define GL_TANGENT_ARRAY_EXT 0x8439 +#define GL_BINORMAL_ARRAY_EXT 0x843A +#define GL_CURRENT_TANGENT_EXT 0x843B +#define GL_CURRENT_BINORMAL_EXT 0x843C +#define GL_TANGENT_ARRAY_TYPE_EXT 0x843E +#define GL_TANGENT_ARRAY_STRIDE_EXT 0x843F +#define GL_BINORMAL_ARRAY_TYPE_EXT 0x8440 +#define GL_BINORMAL_ARRAY_STRIDE_EXT 0x8441 +#define GL_TANGENT_ARRAY_POINTER_EXT 0x8442 +#define GL_BINORMAL_ARRAY_POINTER_EXT 0x8443 +#define GL_MAP1_TANGENT_EXT 0x8444 +#define GL_MAP2_TANGENT_EXT 0x8445 +#define GL_MAP1_BINORMAL_EXT 0x8446 +#define GL_MAP2_BINORMAL_EXT 0x8447 +typedef void (APIENTRYP PFNGLTANGENT3BEXTPROC) (GLbyte tx, GLbyte ty, GLbyte tz); +typedef void (APIENTRYP PFNGLTANGENT3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLTANGENT3DEXTPROC) (GLdouble tx, GLdouble ty, GLdouble tz); +typedef void (APIENTRYP PFNGLTANGENT3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLTANGENT3FEXTPROC) (GLfloat tx, GLfloat ty, GLfloat tz); +typedef void (APIENTRYP PFNGLTANGENT3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLTANGENT3IEXTPROC) (GLint tx, GLint ty, GLint tz); +typedef void (APIENTRYP PFNGLTANGENT3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLTANGENT3SEXTPROC) (GLshort tx, GLshort ty, GLshort tz); +typedef void (APIENTRYP PFNGLTANGENT3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLBINORMAL3BEXTPROC) (GLbyte bx, GLbyte by, GLbyte bz); +typedef void (APIENTRYP PFNGLBINORMAL3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLBINORMAL3DEXTPROC) (GLdouble bx, GLdouble by, GLdouble bz); +typedef void (APIENTRYP PFNGLBINORMAL3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLBINORMAL3FEXTPROC) (GLfloat bx, GLfloat by, GLfloat bz); +typedef void (APIENTRYP PFNGLBINORMAL3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLBINORMAL3IEXTPROC) (GLint bx, GLint by, GLint bz); +typedef void (APIENTRYP PFNGLBINORMAL3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLBINORMAL3SEXTPROC) (GLshort bx, GLshort by, GLshort bz); +typedef void (APIENTRYP PFNGLBINORMAL3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLTANGENTPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLBINORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTangent3bEXT (GLbyte tx, GLbyte ty, GLbyte tz); +GLAPI void APIENTRY glTangent3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glTangent3dEXT (GLdouble tx, GLdouble ty, GLdouble tz); +GLAPI void APIENTRY glTangent3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glTangent3fEXT (GLfloat tx, GLfloat ty, GLfloat tz); +GLAPI void APIENTRY glTangent3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glTangent3iEXT (GLint tx, GLint ty, GLint tz); +GLAPI void APIENTRY glTangent3ivEXT (const GLint *v); +GLAPI void APIENTRY glTangent3sEXT (GLshort tx, GLshort ty, GLshort tz); +GLAPI void APIENTRY glTangent3svEXT (const GLshort *v); +GLAPI void APIENTRY glBinormal3bEXT (GLbyte bx, GLbyte by, GLbyte bz); +GLAPI void APIENTRY glBinormal3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glBinormal3dEXT (GLdouble bx, GLdouble by, GLdouble bz); +GLAPI void APIENTRY glBinormal3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glBinormal3fEXT (GLfloat bx, GLfloat by, GLfloat bz); +GLAPI void APIENTRY glBinormal3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glBinormal3iEXT (GLint bx, GLint by, GLint bz); +GLAPI void APIENTRY glBinormal3ivEXT (const GLint *v); +GLAPI void APIENTRY glBinormal3sEXT (GLshort bx, GLshort by, GLshort bz); +GLAPI void APIENTRY glBinormal3svEXT (const GLshort *v); +GLAPI void APIENTRY glTangentPointerEXT (GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glBinormalPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_coordinate_frame */ + +#ifndef GL_EXT_copy_texture +#define GL_EXT_copy_texture 1 +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE1DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLCOPYTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyTexImage1DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTexImage2DEXT (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glCopyTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_copy_texture */ + +#ifndef GL_EXT_cull_vertex +#define GL_EXT_cull_vertex 1 +#define GL_CULL_VERTEX_EXT 0x81AA +#define GL_CULL_VERTEX_EYE_POSITION_EXT 0x81AB +#define GL_CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC +typedef void (APIENTRYP PFNGLCULLPARAMETERDVEXTPROC) (GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLCULLPARAMETERFVEXTPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCullParameterdvEXT (GLenum pname, GLdouble *params); +GLAPI void APIENTRY glCullParameterfvEXT (GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_cull_vertex */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +typedef void (APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GLAPI void APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GLAPI void APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_bounds_test +#define GL_EXT_depth_bounds_test 1 +#define GL_DEPTH_BOUNDS_TEST_EXT 0x8890 +#define GL_DEPTH_BOUNDS_EXT 0x8891 +typedef void (APIENTRYP PFNGLDEPTHBOUNDSEXTPROC) (GLclampd zmin, GLclampd zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthBoundsEXT (GLclampd zmin, GLclampd zmax); +#endif +#endif /* GL_EXT_depth_bounds_test */ + +#ifndef GL_EXT_direct_state_access +#define GL_EXT_direct_state_access 1 +#define GL_PROGRAM_MATRIX_EXT 0x8E2D +#define GL_TRANSPOSE_PROGRAM_MATRIX_EXT 0x8E2E +#define GL_PROGRAM_MATRIX_STACK_DEPTH_EXT 0x8E2F +typedef void (APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLPUSHCLIENTATTRIBDEFAULTEXTPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERFVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETTEXTURELEVELPARAMETERIVEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLBINDMULTITEXTUREEXTPROC) (GLenum texunit, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLMULTITEXCOORDPOINTEREXTPROC) (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLMULTITEXENVFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXENVIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXGENDEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +typedef void (APIENTRYP PFNGLMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +typedef void (APIENTRYP PFNGLMULTITEXGENFEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXGENIEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXENVIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENDVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENFVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXGENIVEXTPROC) (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERFVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMULTITEXLEVELPARAMETERIVEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLCOPYMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEINDEXEDEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATINDEXEDVEXTPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (APIENTRYP PFNGLGETDOUBLEINDEXEDVEXTPROC) (GLenum target, GLuint index, GLdouble *data); +typedef void (APIENTRYP PFNGLGETPOINTERINDEXEDVEXTPROC) (GLenum target, GLuint index, void **data); +typedef void (APIENTRYP PFNGLENABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef GLboolean (APIENTRYP PFNGLISENABLEDINDEXEDEXTPROC) (GLenum target, GLuint index); +typedef void (APIENTRYP PFNGLGETINTEGERINDEXEDVEXTPROC) (GLenum target, GLuint index, GLint *data); +typedef void (APIENTRYP PFNGLGETBOOLEANINDEXEDVEXTPROC) (GLenum target, GLuint index, GLboolean *data); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTUREIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE3DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE2DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDTEXTURESUBIMAGE1DEXTPROC) (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDTEXTUREIMAGEEXTPROC) (GLuint texture, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE3DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE2DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLCOMPRESSEDMULTITEXSUBIMAGE1DEXTPROC) (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +typedef void (APIENTRYP PFNGLGETCOMPRESSEDMULTITEXIMAGEEXTPROC) (GLenum texunit, GLenum target, GLint lod, void *img); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (APIENTRYP PFNGLNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFEREXTPROC) (GLuint buffer, GLenum access); +typedef GLboolean (APIENTRYP PFNGLUNMAPNAMEDBUFFEREXTPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERIVEXTPROC) (GLuint buffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPOINTERVEXTPROC) (GLuint buffer, GLenum pname, void **params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFEREXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLMULTITEXBUFFEREXTPROC) (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXTUREPARAMETERIUIVEXTPROC) (GLuint texture, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMULTITEXPARAMETERIUIVEXTPROC) (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IEXTPROC) (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4IVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETERSI4UIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERIUIVEXTPROC) (GLuint program, GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLENABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLDISABLECLIENTSTATEIEXTPROC) (GLenum array, GLuint index); +typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4DVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLdouble *params); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLNAMEDPROGRAMLOCALPARAMETER4FVEXTPROC) (GLuint program, GLenum target, GLuint index, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERDVEXTPROC) (GLuint program, GLenum target, GLuint index, GLdouble *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMLOCALPARAMETERFVEXTPROC) (GLuint program, GLenum target, GLuint index, GLfloat *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMIVEXTPROC) (GLuint program, GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETNAMEDPROGRAMSTRINGEXTPROC) (GLuint program, GLenum target, GLenum pname, void *string); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEEXTPROC) (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETNAMEDRENDERBUFFERPARAMETERIVEXTPROC) (GLuint renderbuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLECOVERAGEEXTPROC) (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef GLenum (APIENTRYP PFNGLCHECKNAMEDFRAMEBUFFERSTATUSEXTPROC) (GLuint framebuffer, GLenum target); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC) (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATETEXTUREMIPMAPEXTPROC) (GLuint texture, GLenum target); +typedef void (APIENTRYP PFNGLGENERATEMULTITEXMIPMAPEXTPROC) (GLenum texunit, GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLFRAMEBUFFERDRAWBUFFERSEXTPROC) (GLuint framebuffer, GLsizei n, const GLenum *bufs); +typedef void (APIENTRYP PFNGLFRAMEBUFFERREADBUFFEREXTPROC) (GLuint framebuffer, GLenum mode); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC) (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERTEXTUREFACEEXTPROC) (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +typedef void (APIENTRYP PFNGLTEXTURERENDERBUFFEREXTPROC) (GLuint texture, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLMULTITEXRENDERBUFFEREXTPROC) (GLenum texunit, GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYEDGEFLAGOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYINDEXOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYNORMALOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYTEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYMULTITEXCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYFOGCOORDOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYSECONDARYCOLOROFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYEXTPROC) (GLuint vaobj, GLenum array); +typedef void (APIENTRYP PFNGLENABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLDISABLEVERTEXARRAYATTRIBEXTPROC) (GLuint vaobj, GLuint index); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERVEXTPROC) (GLuint vaobj, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERVEXTPROC) (GLuint vaobj, GLenum pname, void **param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param); +typedef void *(APIENTRYP PFNGLMAPNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (APIENTRYP PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr length); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTPROC) (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLCLEARNAMEDBUFFERSUBDATAEXTPROC) (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC) (GLuint framebuffer, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVEXTPROC) (GLuint framebuffer, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DEXTPROC) (GLuint program, GLint location, GLdouble x); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DEXTPROC) (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +typedef void (APIENTRYP PFNGLTEXTUREBUFFERRANGEEXTPROC) (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC) (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +typedef void (APIENTRYP PFNGLVERTEXARRAYBINDVERTEXBUFFEREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBIFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLFORMATEXTPROC) (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBBINDINGEXTPROC) (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXBINDINGDIVISOREXTPROC) (GLuint vaobj, GLuint bindingindex, GLuint divisor); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBLOFFSETEXTPROC) (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +typedef void (APIENTRYP PFNGLVERTEXARRAYVERTEXATTRIBDIVISOREXTPROC) (GLuint vaobj, GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GLAPI void APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glMatrixPopEXT (GLenum mode); +GLAPI void APIENTRY glMatrixPushEXT (GLenum mode); +GLAPI void APIENTRY glClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glPushClientAttribDefaultEXT (GLbitfield mask); +GLAPI void APIENTRY glTextureParameterfEXT (GLuint texture, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glTextureParameteriEXT (GLuint texture, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetTextureImageEXT (GLuint texture, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetTextureParameterfvEXT (GLuint texture, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureParameterivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureLevelParameterfvEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetTextureLevelParameterivEXT (GLuint texture, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glBindMultiTextureEXT (GLenum texunit, GLenum target, GLuint texture); +GLAPI void APIENTRY glMultiTexCoordPointerEXT (GLenum texunit, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glMultiTexEnvfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexEnviEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexGendEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble param); +GLAPI void APIENTRY glMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLdouble *params); +GLAPI void APIENTRY glMultiTexGenfEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexGeniEXT (GLenum texunit, GLenum coord, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMultiTexEnvfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexEnvivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexGendvEXT (GLenum texunit, GLenum coord, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetMultiTexGenfvEXT (GLenum texunit, GLenum coord, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexGenivEXT (GLenum texunit, GLenum coord, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexParameteriEXT (GLenum texunit, GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterfEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLint border); +GLAPI void APIENTRY glCopyMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GLAPI void APIENTRY glCopyMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glCopyMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetMultiTexImageEXT (GLenum texunit, GLenum target, GLint level, GLenum format, GLenum type, void *pixels); +GLAPI void APIENTRY glGetMultiTexParameterfvEXT (GLenum texunit, GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexParameterivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterfvEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMultiTexLevelParameterivEXT (GLenum texunit, GLenum target, GLint level, GLenum pname, GLint *params); +GLAPI void APIENTRY glMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glCopyMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glEnableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateIndexedEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloatIndexedvEXT (GLenum target, GLuint index, GLfloat *data); +GLAPI void APIENTRY glGetDoubleIndexedvEXT (GLenum target, GLuint index, GLdouble *data); +GLAPI void APIENTRY glGetPointerIndexedvEXT (GLenum target, GLuint index, void **data); +GLAPI void APIENTRY glEnableIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glDisableIndexedEXT (GLenum target, GLuint index); +GLAPI GLboolean APIENTRY glIsEnabledIndexedEXT (GLenum target, GLuint index); +GLAPI void APIENTRY glGetIntegerIndexedvEXT (GLenum target, GLuint index, GLint *data); +GLAPI void APIENTRY glGetBooleanIndexedvEXT (GLenum target, GLuint index, GLboolean *data); +GLAPI void APIENTRY glCompressedTextureImage3DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage2DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureImage1DEXT (GLuint texture, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage3DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage2DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedTextureSubImage1DEXT (GLuint texture, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedTextureImageEXT (GLuint texture, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glCompressedMultiTexImage3DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage2DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexImage1DEXT (GLenum texunit, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLint border, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage3DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage2DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glCompressedMultiTexSubImage1DEXT (GLenum texunit, GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void *bits); +GLAPI void APIENTRY glGetCompressedMultiTexImageEXT (GLenum texunit, GLenum target, GLint lod, void *img); +GLAPI void APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GLAPI void APIENTRY glNamedBufferDataEXT (GLuint buffer, GLsizeiptr size, const void *data, GLenum usage); +GLAPI void APIENTRY glNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void *APIENTRY glMapNamedBufferEXT (GLuint buffer, GLenum access); +GLAPI GLboolean APIENTRY glUnmapNamedBufferEXT (GLuint buffer); +GLAPI void APIENTRY glGetNamedBufferParameterivEXT (GLuint buffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedBufferPointervEXT (GLuint buffer, GLenum pname, void **params); +GLAPI void APIENTRY glGetNamedBufferSubDataEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, void *data); +GLAPI void APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GLAPI void APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI void APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI void APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI void APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GLAPI void APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GLAPI void APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI void APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI void APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI void APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI void APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI void APIENTRY glTextureBufferEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glMultiTexBufferEXT (GLenum texunit, GLenum target, GLenum internalformat, GLuint buffer); +GLAPI void APIENTRY glTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTextureParameterIivEXT (GLuint texture, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTextureParameterIuivEXT (GLuint texture, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetMultiTexParameterIivEXT (GLenum texunit, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMultiTexParameterIuivEXT (GLenum texunit, GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GLAPI void APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glNamedProgramLocalParameters4fvEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4iEXT (GLuint program, GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4ivEXT (GLuint program, GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4ivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uiEXT (GLuint program, GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glNamedProgramLocalParameterI4uivEXT (GLuint program, GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glNamedProgramLocalParametersI4uivEXT (GLuint program, GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIivEXT (GLuint program, GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterIuivEXT (GLuint program, GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glEnableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glDisableClientStateiEXT (GLenum array, GLuint index); +GLAPI void APIENTRY glGetFloati_vEXT (GLenum pname, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetDoublei_vEXT (GLenum pname, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetPointeri_vEXT (GLenum pname, GLuint index, void **params); +GLAPI void APIENTRY glNamedProgramStringEXT (GLuint program, GLenum target, GLenum format, GLsizei len, const void *string); +GLAPI void APIENTRY glNamedProgramLocalParameter4dEXT (GLuint program, GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glNamedProgramLocalParameter4dvEXT (GLuint program, GLenum target, GLuint index, const GLdouble *params); +GLAPI void APIENTRY glNamedProgramLocalParameter4fEXT (GLuint program, GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glNamedProgramLocalParameter4fvEXT (GLuint program, GLenum target, GLuint index, const GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterdvEXT (GLuint program, GLenum target, GLuint index, GLdouble *params); +GLAPI void APIENTRY glGetNamedProgramLocalParameterfvEXT (GLuint program, GLenum target, GLuint index, GLfloat *params); +GLAPI void APIENTRY glGetNamedProgramivEXT (GLuint program, GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetNamedProgramStringEXT (GLuint program, GLenum target, GLenum pname, void *string); +GLAPI void APIENTRY glNamedRenderbufferStorageEXT (GLuint renderbuffer, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetNamedRenderbufferParameterivEXT (GLuint renderbuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleEXT (GLuint renderbuffer, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glNamedRenderbufferStorageMultisampleCoverageEXT (GLuint renderbuffer, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI GLenum APIENTRY glCheckNamedFramebufferStatusEXT (GLuint framebuffer, GLenum target); +GLAPI void APIENTRY glNamedFramebufferTexture1DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture2DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTexture3DEXT (GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glNamedFramebufferRenderbufferEXT (GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetNamedFramebufferAttachmentParameterivEXT (GLuint framebuffer, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateTextureMipmapEXT (GLuint texture, GLenum target); +GLAPI void APIENTRY glGenerateMultiTexMipmapEXT (GLenum texunit, GLenum target); +GLAPI void APIENTRY glFramebufferDrawBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glFramebufferDrawBuffersEXT (GLuint framebuffer, GLsizei n, const GLenum *bufs); +GLAPI void APIENTRY glFramebufferReadBufferEXT (GLuint framebuffer, GLenum mode); +GLAPI void APIENTRY glGetFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glNamedCopyBufferSubDataEXT (GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glNamedFramebufferTextureEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glNamedFramebufferTextureLayerEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer); +GLAPI void APIENTRY glNamedFramebufferTextureFaceEXT (GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLenum face); +GLAPI void APIENTRY glTextureRenderbufferEXT (GLuint texture, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glMultiTexRenderbufferEXT (GLenum texunit, GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glVertexArrayVertexOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayEdgeFlagOffsetEXT (GLuint vaobj, GLuint buffer, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayIndexOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayNormalOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayMultiTexCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum texunit, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayFogCoordOffsetEXT (GLuint vaobj, GLuint buffer, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArraySecondaryColorOffsetEXT (GLuint vaobj, GLuint buffer, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glVertexArrayVertexAttribIOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glEnableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glDisableVertexArrayEXT (GLuint vaobj, GLenum array); +GLAPI void APIENTRY glEnableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glDisableVertexArrayAttribEXT (GLuint vaobj, GLuint index); +GLAPI void APIENTRY glGetVertexArrayIntegervEXT (GLuint vaobj, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointervEXT (GLuint vaobj, GLenum pname, void **param); +GLAPI void APIENTRY glGetVertexArrayIntegeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, GLint *param); +GLAPI void APIENTRY glGetVertexArrayPointeri_vEXT (GLuint vaobj, GLuint index, GLenum pname, void **param); +GLAPI void *APIENTRY glMapNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length, GLbitfield access); +GLAPI void APIENTRY glFlushMappedNamedBufferRangeEXT (GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI void APIENTRY glNamedBufferStorageEXT (GLuint buffer, GLsizeiptr size, const void *data, GLbitfield flags); +GLAPI void APIENTRY glClearNamedBufferDataEXT (GLuint buffer, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glClearNamedBufferSubDataEXT (GLuint buffer, GLenum internalformat, GLsizeiptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI void APIENTRY glNamedFramebufferParameteriEXT (GLuint framebuffer, GLenum pname, GLint param); +GLAPI void APIENTRY glGetNamedFramebufferParameterivEXT (GLuint framebuffer, GLenum pname, GLint *params); +GLAPI void APIENTRY glProgramUniform1dEXT (GLuint program, GLint location, GLdouble x); +GLAPI void APIENTRY glProgramUniform2dEXT (GLuint program, GLint location, GLdouble x, GLdouble y); +GLAPI void APIENTRY glProgramUniform3dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glProgramUniform4dEXT (GLuint program, GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramUniform1dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform2dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform3dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniform4dvEXT (GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix2x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix3x4dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x2dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glProgramUniformMatrix4x3dvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI void APIENTRY glTextureBufferRangeEXT (GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glTextureStorage2DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glTextureStorage3DMultisampleEXT (GLuint texture, GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI void APIENTRY glVertexArrayBindVertexBufferEXT (GLuint vaobj, GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI void APIENTRY glVertexArrayVertexAttribFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribIFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribLFormatEXT (GLuint vaobj, GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI void APIENTRY glVertexArrayVertexAttribBindingEXT (GLuint vaobj, GLuint attribindex, GLuint bindingindex); +GLAPI void APIENTRY glVertexArrayVertexBindingDivisorEXT (GLuint vaobj, GLuint bindingindex, GLuint divisor); +GLAPI void APIENTRY glVertexArrayVertexAttribLOffsetEXT (GLuint vaobj, GLuint buffer, GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); +GLAPI void APIENTRY glTexturePageCommitmentEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +GLAPI void APIENTRY glVertexArrayVertexAttribDivisorEXT (GLuint vaobj, GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_direct_state_access */ + +#ifndef GL_EXT_draw_buffers2 +#define GL_EXT_draw_buffers2 1 +typedef void (APIENTRYP PFNGLCOLORMASKINDEXEDEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorMaskIndexedEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +#endif +#endif /* GL_EXT_draw_buffers2 */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GLAPI void APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_range_elements +#define GL_EXT_draw_range_elements 1 +#define GL_MAX_ELEMENTS_VERTICES_EXT 0x80E8 +#define GL_MAX_ELEMENTS_INDICES_EXT 0x80E9 +typedef void (APIENTRYP PFNGLDRAWRANGEELEMENTSEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawRangeElementsEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices); +#endif +#endif /* GL_EXT_draw_range_elements */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 +typedef void *GLeglClientBufferEXT; +typedef void (APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +GLAPI void APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#endif +#endif /* GL_EXT_external_buffer */ + +#ifndef GL_EXT_fog_coord +#define GL_EXT_fog_coord 1 +#define GL_FOG_COORDINATE_SOURCE_EXT 0x8450 +#define GL_FOG_COORDINATE_EXT 0x8451 +#define GL_FRAGMENT_DEPTH_EXT 0x8452 +#define GL_CURRENT_FOG_COORDINATE_EXT 0x8453 +#define GL_FOG_COORDINATE_ARRAY_TYPE_EXT 0x8454 +#define GL_FOG_COORDINATE_ARRAY_STRIDE_EXT 0x8455 +#define GL_FOG_COORDINATE_ARRAY_POINTER_EXT 0x8456 +#define GL_FOG_COORDINATE_ARRAY_EXT 0x8457 +typedef void (APIENTRYP PFNGLFOGCOORDFEXTPROC) (GLfloat coord); +typedef void (APIENTRYP PFNGLFOGCOORDFVEXTPROC) (const GLfloat *coord); +typedef void (APIENTRYP PFNGLFOGCOORDDEXTPROC) (GLdouble coord); +typedef void (APIENTRYP PFNGLFOGCOORDDVEXTPROC) (const GLdouble *coord); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTEREXTPROC) (GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogCoordfEXT (GLfloat coord); +GLAPI void APIENTRY glFogCoordfvEXT (const GLfloat *coord); +GLAPI void APIENTRY glFogCoorddEXT (GLdouble coord); +GLAPI void APIENTRY glFogCoorddvEXT (const GLdouble *coord); +GLAPI void APIENTRY glFogCoordPointerEXT (GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_fog_coord */ + +#ifndef GL_EXT_framebuffer_blit +#define GL_EXT_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_EXT 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_EXT 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_EXT 0x8CAA +typedef void (APIENTRYP PFNGLBLITFRAMEBUFFEREXTPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlitFramebufferEXT (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_EXT_framebuffer_blit */ + +#ifndef GL_EXT_framebuffer_multisample +#define GL_EXT_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_EXT_framebuffer_multisample */ + +#ifndef GL_EXT_framebuffer_multisample_blit_scaled +#define GL_EXT_framebuffer_multisample_blit_scaled 1 +#define GL_SCALED_RESOLVE_FASTEST_EXT 0x90BA +#define GL_SCALED_RESOLVE_NICEST_EXT 0x90BB +#endif /* GL_EXT_framebuffer_multisample_blit_scaled */ + +#ifndef GL_EXT_framebuffer_object +#define GL_EXT_framebuffer_object 1 +#define GL_INVALID_FRAMEBUFFER_OPERATION_EXT 0x0506 +#define GL_MAX_RENDERBUFFER_SIZE_EXT 0x84E8 +#define GL_FRAMEBUFFER_BINDING_EXT 0x8CA6 +#define GL_RENDERBUFFER_BINDING_EXT 0x8CA7 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT 0x8CD0 +#define GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT 0x8CD1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT 0x8CD2 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT 0x8CD3 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT 0x8CD4 +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT 0x8CD9 +#define GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT 0x8CDA +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 +#define GL_STENCIL_INDEX1_EXT 0x8D46 +#define GL_STENCIL_INDEX4_EXT 0x8D47 +#define GL_STENCIL_INDEX8_EXT 0x8D48 +#define GL_STENCIL_INDEX16_EXT 0x8D49 +#define GL_RENDERBUFFER_RED_SIZE_EXT 0x8D50 +#define GL_RENDERBUFFER_GREEN_SIZE_EXT 0x8D51 +#define GL_RENDERBUFFER_BLUE_SIZE_EXT 0x8D52 +#define GL_RENDERBUFFER_ALPHA_SIZE_EXT 0x8D53 +#define GL_RENDERBUFFER_DEPTH_SIZE_EXT 0x8D54 +#define GL_RENDERBUFFER_STENCIL_SIZE_EXT 0x8D55 +typedef GLboolean (APIENTRYP PFNGLISRENDERBUFFEREXTPROC) (GLuint renderbuffer); +typedef void (APIENTRYP PFNGLBINDRENDERBUFFEREXTPROC) (GLenum target, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLDELETERENDERBUFFERSEXTPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLGENRENDERBUFFERSEXTPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEEXTPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLboolean (APIENTRYP PFNGLISFRAMEBUFFEREXTPROC) (GLuint framebuffer); +typedef void (APIENTRYP PFNGLBINDFRAMEBUFFEREXTPROC) (GLenum target, GLuint framebuffer); +typedef void (APIENTRYP PFNGLDELETEFRAMEBUFFERSEXTPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (APIENTRYP PFNGLGENFRAMEBUFFERSEXTPROC) (GLsizei n, GLuint *framebuffers); +typedef GLenum (APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE1DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +typedef void (APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFEREXTPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVEXTPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGENERATEMIPMAPEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glIsRenderbufferEXT (GLuint renderbuffer); +GLAPI void APIENTRY glBindRenderbufferEXT (GLenum target, GLuint renderbuffer); +GLAPI void APIENTRY glDeleteRenderbuffersEXT (GLsizei n, const GLuint *renderbuffers); +GLAPI void APIENTRY glGenRenderbuffersEXT (GLsizei n, GLuint *renderbuffers); +GLAPI void APIENTRY glRenderbufferStorageEXT (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glGetRenderbufferParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI GLboolean APIENTRY glIsFramebufferEXT (GLuint framebuffer); +GLAPI void APIENTRY glBindFramebufferEXT (GLenum target, GLuint framebuffer); +GLAPI void APIENTRY glDeleteFramebuffersEXT (GLsizei n, const GLuint *framebuffers); +GLAPI void APIENTRY glGenFramebuffersEXT (GLsizei n, GLuint *framebuffers); +GLAPI GLenum APIENTRY glCheckFramebufferStatusEXT (GLenum target); +GLAPI void APIENTRY glFramebufferTexture1DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture2DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTexture3DEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +GLAPI void APIENTRY glFramebufferRenderbufferEXT (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GLAPI void APIENTRY glGetFramebufferAttachmentParameterivEXT (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GLAPI void APIENTRY glGenerateMipmapEXT (GLenum target); +#endif +#endif /* GL_EXT_framebuffer_object */ + +#ifndef GL_EXT_framebuffer_sRGB +#define GL_EXT_framebuffer_sRGB 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#define GL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x8DBA +#endif /* GL_EXT_framebuffer_sRGB */ + +#ifndef GL_EXT_geometry_shader4 +#define GL_EXT_geometry_shader4 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_VERTICES_OUT_EXT 0x8DDA +#define GL_GEOMETRY_INPUT_TYPE_EXT 0x8DDB +#define GL_GEOMETRY_OUTPUT_TYPE_EXT 0x8DDC +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT 0x8DDD +#define GL_MAX_VERTEX_VARYING_COMPONENTS_EXT 0x8DDE +#define GL_MAX_VARYING_COMPONENTS_EXT 0x8B4B +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT 0x8DA9 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT 0x8CD4 +#define GL_PROGRAM_POINT_SIZE_EXT 0x8642 +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +#endif +#endif /* GL_EXT_geometry_shader4 */ + +#ifndef GL_EXT_gpu_program_parameters +#define GL_EXT_gpu_program_parameters 1 +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramEnvParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramLocalParameters4fvEXT (GLenum target, GLuint index, GLsizei count, const GLfloat *params); +#endif +#endif /* GL_EXT_gpu_program_parameters */ + +#ifndef GL_EXT_gpu_shader4 +#define GL_EXT_gpu_shader4 1 +#define GL_SAMPLER_1D_ARRAY_EXT 0x8DC0 +#define GL_SAMPLER_2D_ARRAY_EXT 0x8DC1 +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_SAMPLER_1D_ARRAY_SHADOW_EXT 0x8DC3 +#define GL_SAMPLER_2D_ARRAY_SHADOW_EXT 0x8DC4 +#define GL_SAMPLER_CUBE_SHADOW_EXT 0x8DC5 +#define GL_UNSIGNED_INT_VEC2_EXT 0x8DC6 +#define GL_UNSIGNED_INT_VEC3_EXT 0x8DC7 +#define GL_UNSIGNED_INT_VEC4_EXT 0x8DC8 +#define GL_INT_SAMPLER_1D_EXT 0x8DC9 +#define GL_INT_SAMPLER_2D_EXT 0x8DCA +#define GL_INT_SAMPLER_3D_EXT 0x8DCB +#define GL_INT_SAMPLER_CUBE_EXT 0x8DCC +#define GL_INT_SAMPLER_2D_RECT_EXT 0x8DCD +#define GL_INT_SAMPLER_1D_ARRAY_EXT 0x8DCE +#define GL_INT_SAMPLER_2D_ARRAY_EXT 0x8DCF +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_1D_EXT 0x8DD1 +#define GL_UNSIGNED_INT_SAMPLER_2D_EXT 0x8DD2 +#define GL_UNSIGNED_INT_SAMPLER_3D_EXT 0x8DD3 +#define GL_UNSIGNED_INT_SAMPLER_CUBE_EXT 0x8DD4 +#define GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT 0x8DD5 +#define GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT 0x8DD6 +#define GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT 0x8DD7 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_EXT 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_EXT 0x8905 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT 0x88FD +typedef void (APIENTRYP PFNGLGETUNIFORMUIVEXTPROC) (GLuint program, GLint location, GLuint *params); +typedef void (APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETFRAGDATALOCATIONEXTPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLUNIFORM1UIEXTPROC) (GLint location, GLuint v0); +typedef void (APIENTRYP PFNGLUNIFORM2UIEXTPROC) (GLint location, GLuint v0, GLuint v1); +typedef void (APIENTRYP PFNGLUNIFORM3UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (APIENTRYP PFNGLUNIFORM4UIEXTPROC) (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (APIENTRYP PFNGLUNIFORM1UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM2UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM3UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLUNIFORM4UIVEXTPROC) (GLint location, GLsizei count, const GLuint *value); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IEXTPROC) (GLuint index, GLint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IEXTPROC) (GLuint index, GLint x, GLint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IEXTPROC) (GLuint index, GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IEXTPROC) (GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIEXTPROC) (GLuint index, GLuint x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIEXTPROC) (GLuint index, GLuint x, GLuint y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIEXTPROC) (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4IVEXTPROC) (GLuint index, const GLint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI1UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI2UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI3UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UIVEXTPROC) (GLuint index, const GLuint *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4BVEXTPROC) (GLuint index, const GLbyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4SVEXTPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4UBVEXTPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBI4USVEXTPROC) (GLuint index, const GLushort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIIVEXTPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIUIVEXTPROC) (GLuint index, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUniformuivEXT (GLuint program, GLint location, GLuint *params); +GLAPI void APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GLAPI GLint APIENTRY glGetFragDataLocationEXT (GLuint program, const GLchar *name); +GLAPI void APIENTRY glUniform1uiEXT (GLint location, GLuint v0); +GLAPI void APIENTRY glUniform2uiEXT (GLint location, GLuint v0, GLuint v1); +GLAPI void APIENTRY glUniform3uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI void APIENTRY glUniform4uiEXT (GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI void APIENTRY glUniform1uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform2uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform3uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glUniform4uivEXT (GLint location, GLsizei count, const GLuint *value); +GLAPI void APIENTRY glVertexAttribI1iEXT (GLuint index, GLint x); +GLAPI void APIENTRY glVertexAttribI2iEXT (GLuint index, GLint x, GLint y); +GLAPI void APIENTRY glVertexAttribI3iEXT (GLuint index, GLint x, GLint y, GLint z); +GLAPI void APIENTRY glVertexAttribI4iEXT (GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glVertexAttribI1uiEXT (GLuint index, GLuint x); +GLAPI void APIENTRY glVertexAttribI2uiEXT (GLuint index, GLuint x, GLuint y); +GLAPI void APIENTRY glVertexAttribI3uiEXT (GLuint index, GLuint x, GLuint y, GLuint z); +GLAPI void APIENTRY glVertexAttribI4uiEXT (GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glVertexAttribI1ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI2ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI3ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI4ivEXT (GLuint index, const GLint *v); +GLAPI void APIENTRY glVertexAttribI1uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI2uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI3uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4uivEXT (GLuint index, const GLuint *v); +GLAPI void APIENTRY glVertexAttribI4bvEXT (GLuint index, const GLbyte *v); +GLAPI void APIENTRY glVertexAttribI4svEXT (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttribI4ubvEXT (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribI4usvEXT (GLuint index, const GLushort *v); +GLAPI void APIENTRY glVertexAttribIPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribIivEXT (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribIuivEXT (GLuint index, GLenum pname, GLuint *params); +#endif +#endif /* GL_EXT_gpu_shader4 */ + +#ifndef GL_EXT_histogram +#define GL_EXT_histogram 1 +#define GL_HISTOGRAM_EXT 0x8024 +#define GL_PROXY_HISTOGRAM_EXT 0x8025 +#define GL_HISTOGRAM_WIDTH_EXT 0x8026 +#define GL_HISTOGRAM_FORMAT_EXT 0x8027 +#define GL_HISTOGRAM_RED_SIZE_EXT 0x8028 +#define GL_HISTOGRAM_GREEN_SIZE_EXT 0x8029 +#define GL_HISTOGRAM_BLUE_SIZE_EXT 0x802A +#define GL_HISTOGRAM_ALPHA_SIZE_EXT 0x802B +#define GL_HISTOGRAM_LUMINANCE_SIZE_EXT 0x802C +#define GL_HISTOGRAM_SINK_EXT 0x802D +#define GL_MINMAX_EXT 0x802E +#define GL_MINMAX_FORMAT_EXT 0x802F +#define GL_MINMAX_SINK_EXT 0x8030 +#define GL_TABLE_TOO_LARGE_EXT 0x8031 +typedef void (APIENTRYP PFNGLGETHISTOGRAMEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETHISTOGRAMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMINMAXEXTPROC) (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMINMAXPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLHISTOGRAMEXTPROC) (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLMINMAXEXTPROC) (GLenum target, GLenum internalformat, GLboolean sink); +typedef void (APIENTRYP PFNGLRESETHISTOGRAMEXTPROC) (GLenum target); +typedef void (APIENTRYP PFNGLRESETMINMAXEXTPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetHistogramEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetHistogramParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetHistogramParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMinmaxEXT (GLenum target, GLboolean reset, GLenum format, GLenum type, void *values); +GLAPI void APIENTRY glGetMinmaxParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMinmaxParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glHistogramEXT (GLenum target, GLsizei width, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glMinmaxEXT (GLenum target, GLenum internalformat, GLboolean sink); +GLAPI void APIENTRY glResetHistogramEXT (GLenum target); +GLAPI void APIENTRY glResetMinmaxEXT (GLenum target); +#endif +#endif /* GL_EXT_histogram */ + +#ifndef GL_EXT_index_array_formats +#define GL_EXT_index_array_formats 1 +#define GL_IUI_V2F_EXT 0x81AD +#define GL_IUI_V3F_EXT 0x81AE +#define GL_IUI_N3F_V2F_EXT 0x81AF +#define GL_IUI_N3F_V3F_EXT 0x81B0 +#define GL_T2F_IUI_V2F_EXT 0x81B1 +#define GL_T2F_IUI_V3F_EXT 0x81B2 +#define GL_T2F_IUI_N3F_V2F_EXT 0x81B3 +#define GL_T2F_IUI_N3F_V3F_EXT 0x81B4 +#endif /* GL_EXT_index_array_formats */ + +#ifndef GL_EXT_index_func +#define GL_EXT_index_func 1 +#define GL_INDEX_TEST_EXT 0x81B5 +#define GL_INDEX_TEST_FUNC_EXT 0x81B6 +#define GL_INDEX_TEST_REF_EXT 0x81B7 +typedef void (APIENTRYP PFNGLINDEXFUNCEXTPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexFuncEXT (GLenum func, GLclampf ref); +#endif +#endif /* GL_EXT_index_func */ + +#ifndef GL_EXT_index_material +#define GL_EXT_index_material 1 +#define GL_INDEX_MATERIAL_EXT 0x81B8 +#define GL_INDEX_MATERIAL_PARAMETER_EXT 0x81B9 +#define GL_INDEX_MATERIAL_FACE_EXT 0x81BA +typedef void (APIENTRYP PFNGLINDEXMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIndexMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_index_material */ + +#ifndef GL_EXT_index_texture +#define GL_EXT_index_texture 1 +#endif /* GL_EXT_index_texture */ + +#ifndef GL_EXT_light_texture +#define GL_EXT_light_texture 1 +#define GL_FRAGMENT_MATERIAL_EXT 0x8349 +#define GL_FRAGMENT_NORMAL_EXT 0x834A +#define GL_FRAGMENT_COLOR_EXT 0x834C +#define GL_ATTENUATION_EXT 0x834D +#define GL_SHADOW_ATTENUATION_EXT 0x834E +#define GL_TEXTURE_APPLICATION_MODE_EXT 0x834F +#define GL_TEXTURE_LIGHT_EXT 0x8350 +#define GL_TEXTURE_MATERIAL_FACE_EXT 0x8351 +#define GL_TEXTURE_MATERIAL_PARAMETER_EXT 0x8352 +typedef void (APIENTRYP PFNGLAPPLYTEXTUREEXTPROC) (GLenum mode); +typedef void (APIENTRYP PFNGLTEXTURELIGHTEXTPROC) (GLenum pname); +typedef void (APIENTRYP PFNGLTEXTUREMATERIALEXTPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyTextureEXT (GLenum mode); +GLAPI void APIENTRY glTextureLightEXT (GLenum pname); +GLAPI void APIENTRY glTextureMaterialEXT (GLenum face, GLenum mode); +#endif +#endif /* GL_EXT_light_texture */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_UUID_SIZE_EXT 16 +typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); +typedef void (APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); +typedef void (APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); +typedef GLboolean (APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); +typedef void (APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXSTORAGEMEM1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTURESTORAGEMEM1DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); +GLAPI void APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); +GLAPI void APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); +GLAPI GLboolean APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); +GLAPI void APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); +GLAPI void APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); +GLAPI void APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTexStorageMem1DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureStorageMem1DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_EXT_memory_object */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +typedef void (APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_memory_object_fd */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +GLAPI void APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_memory_object_win32 */ + +#ifndef GL_EXT_misc_attribute +#define GL_EXT_misc_attribute 1 +#endif /* GL_EXT_misc_attribute */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GLAPI void APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multisample +#define GL_EXT_multisample 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_EXT 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#define GL_SAMPLE_MASK_EXT 0x80A0 +#define GL_1PASS_EXT 0x80A1 +#define GL_2PASS_0_EXT 0x80A2 +#define GL_2PASS_1_EXT 0x80A3 +#define GL_4PASS_0_EXT 0x80A4 +#define GL_4PASS_1_EXT 0x80A5 +#define GL_4PASS_2_EXT 0x80A6 +#define GL_4PASS_3_EXT 0x80A7 +#define GL_SAMPLE_BUFFERS_EXT 0x80A8 +#define GL_SAMPLES_EXT 0x80A9 +#define GL_SAMPLE_MASK_VALUE_EXT 0x80AA +#define GL_SAMPLE_MASK_INVERT_EXT 0x80AB +#define GL_SAMPLE_PATTERN_EXT 0x80AC +#define GL_MULTISAMPLE_BIT_EXT 0x20000000 +typedef void (APIENTRYP PFNGLSAMPLEMASKEXTPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNEXTPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskEXT (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternEXT (GLenum pattern); +#endif +#endif /* GL_EXT_multisample */ + +#ifndef GL_EXT_multiview_tessellation_geometry_shader +#define GL_EXT_multiview_tessellation_geometry_shader 1 +#endif /* GL_EXT_multiview_tessellation_geometry_shader */ + +#ifndef GL_EXT_multiview_texture_multisample +#define GL_EXT_multiview_texture_multisample 1 +#endif /* GL_EXT_multiview_texture_multisample */ + +#ifndef GL_EXT_multiview_timer_query +#define GL_EXT_multiview_timer_query 1 +#endif /* GL_EXT_multiview_timer_query */ + +#ifndef GL_EXT_packed_depth_stencil +#define GL_EXT_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_EXT 0x84F9 +#define GL_UNSIGNED_INT_24_8_EXT 0x84FA +#define GL_DEPTH24_STENCIL8_EXT 0x88F0 +#define GL_TEXTURE_STENCIL_SIZE_EXT 0x88F1 +#endif /* GL_EXT_packed_depth_stencil */ + +#ifndef GL_EXT_packed_float +#define GL_EXT_packed_float 1 +#define GL_R11F_G11F_B10F_EXT 0x8C3A +#define GL_UNSIGNED_INT_10F_11F_11F_REV_EXT 0x8C3B +#define GL_RGBA_SIGNED_COMPONENTS_EXT 0x8C3C +#endif /* GL_EXT_packed_float */ + +#ifndef GL_EXT_packed_pixels +#define GL_EXT_packed_pixels 1 +#define GL_UNSIGNED_BYTE_3_3_2_EXT 0x8032 +#define GL_UNSIGNED_SHORT_4_4_4_4_EXT 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1_EXT 0x8034 +#define GL_UNSIGNED_INT_8_8_8_8_EXT 0x8035 +#define GL_UNSIGNED_INT_10_10_10_2_EXT 0x8036 +#endif /* GL_EXT_packed_pixels */ + +#ifndef GL_EXT_paletted_texture +#define GL_EXT_paletted_texture 1 +#define GL_COLOR_INDEX1_EXT 0x80E2 +#define GL_COLOR_INDEX2_EXT 0x80E3 +#define GL_COLOR_INDEX4_EXT 0x80E4 +#define GL_COLOR_INDEX8_EXT 0x80E5 +#define GL_COLOR_INDEX12_EXT 0x80E6 +#define GL_COLOR_INDEX16_EXT 0x80E7 +#define GL_TEXTURE_INDEX_SIZE_EXT 0x80ED +typedef void (APIENTRYP PFNGLCOLORTABLEEXTPROC) (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEEXTPROC) (GLenum target, GLenum format, GLenum type, void *data); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableEXT (GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glGetColorTableEXT (GLenum target, GLenum format, GLenum type, void *data); +GLAPI void APIENTRY glGetColorTableParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetColorTableParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_paletted_texture */ + +#ifndef GL_EXT_pixel_buffer_object +#define GL_EXT_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_EXT 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_EXT 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_EXT 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_EXT 0x88EF +#endif /* GL_EXT_pixel_buffer_object */ + +#ifndef GL_EXT_pixel_transform +#define GL_EXT_pixel_transform 1 +#define GL_PIXEL_TRANSFORM_2D_EXT 0x8330 +#define GL_PIXEL_MAG_FILTER_EXT 0x8331 +#define GL_PIXEL_MIN_FILTER_EXT 0x8332 +#define GL_PIXEL_CUBIC_WEIGHT_EXT 0x8333 +#define GL_CUBIC_EXT 0x8334 +#define GL_AVERAGE_EXT 0x8335 +#define GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8336 +#define GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT 0x8337 +#define GL_PIXEL_TRANSFORM_2D_MATRIX_EXT 0x8338 +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIEXTPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFEXTPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTRANSFORMPARAMETERFVEXTPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTransformParameteriEXT (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTransformParameterfEXT (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTransformParameterivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTransformParameterfvEXT (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTransformParameterivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTransformParameterfvEXT (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_EXT_pixel_transform */ + +#ifndef GL_EXT_pixel_transform_color_table +#define GL_EXT_pixel_transform_color_table 1 +#endif /* GL_EXT_pixel_transform_color_table */ + +#ifndef GL_EXT_point_parameters +#define GL_EXT_point_parameters 1 +#define GL_POINT_SIZE_MIN_EXT 0x8126 +#define GL_POINT_SIZE_MAX_EXT 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_EXT 0x8128 +#define GL_DISTANCE_ATTENUATION_EXT 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFEXTPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVEXTPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfEXT (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvEXT (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_EXT_point_parameters */ + +#ifndef GL_EXT_polygon_offset +#define GL_EXT_polygon_offset 1 +#define GL_POLYGON_OFFSET_EXT 0x8037 +#define GL_POLYGON_OFFSET_FACTOR_EXT 0x8038 +#define GL_POLYGON_OFFSET_BIAS_EXT 0x8039 +typedef void (APIENTRYP PFNGLPOLYGONOFFSETEXTPROC) (GLfloat factor, GLfloat bias); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetEXT (GLfloat factor, GLfloat bias); +#endif +#endif /* GL_EXT_polygon_offset */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ + +#ifndef GL_EXT_provoking_vertex +#define GL_EXT_provoking_vertex 1 +#define GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT 0x8E4C +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_PROVOKING_VERTEX_EXT 0x8E4F +typedef void (APIENTRYP PFNGLPROVOKINGVERTEXEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProvokingVertexEXT (GLenum mode); +#endif +#endif /* GL_EXT_provoking_vertex */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); +#endif +#endif /* GL_EXT_raster_multisample */ + +#ifndef GL_EXT_rescale_normal +#define GL_EXT_rescale_normal 1 +#define GL_RESCALE_NORMAL_EXT 0x803A +#endif /* GL_EXT_rescale_normal */ + +#ifndef GL_EXT_secondary_color +#define GL_EXT_secondary_color 1 +#define GL_COLOR_SUM_EXT 0x8458 +#define GL_CURRENT_SECONDARY_COLOR_EXT 0x8459 +#define GL_SECONDARY_COLOR_ARRAY_SIZE_EXT 0x845A +#define GL_SECONDARY_COLOR_ARRAY_TYPE_EXT 0x845B +#define GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT 0x845C +#define GL_SECONDARY_COLOR_ARRAY_POINTER_EXT 0x845D +#define GL_SECONDARY_COLOR_ARRAY_EXT 0x845E +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BEXTPROC) (GLbyte red, GLbyte green, GLbyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3BVEXTPROC) (const GLbyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DEXTPROC) (GLdouble red, GLdouble green, GLdouble blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3DVEXTPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FEXTPROC) (GLfloat red, GLfloat green, GLfloat blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3FVEXTPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IEXTPROC) (GLint red, GLint green, GLint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3IVEXTPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SEXTPROC) (GLshort red, GLshort green, GLshort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3SVEXTPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBEXTPROC) (GLubyte red, GLubyte green, GLubyte blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UBVEXTPROC) (const GLubyte *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIEXTPROC) (GLuint red, GLuint green, GLuint blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3UIVEXTPROC) (const GLuint *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USEXTPROC) (GLushort red, GLushort green, GLushort blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3USVEXTPROC) (const GLushort *v); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSecondaryColor3bEXT (GLbyte red, GLbyte green, GLbyte blue); +GLAPI void APIENTRY glSecondaryColor3bvEXT (const GLbyte *v); +GLAPI void APIENTRY glSecondaryColor3dEXT (GLdouble red, GLdouble green, GLdouble blue); +GLAPI void APIENTRY glSecondaryColor3dvEXT (const GLdouble *v); +GLAPI void APIENTRY glSecondaryColor3fEXT (GLfloat red, GLfloat green, GLfloat blue); +GLAPI void APIENTRY glSecondaryColor3fvEXT (const GLfloat *v); +GLAPI void APIENTRY glSecondaryColor3iEXT (GLint red, GLint green, GLint blue); +GLAPI void APIENTRY glSecondaryColor3ivEXT (const GLint *v); +GLAPI void APIENTRY glSecondaryColor3sEXT (GLshort red, GLshort green, GLshort blue); +GLAPI void APIENTRY glSecondaryColor3svEXT (const GLshort *v); +GLAPI void APIENTRY glSecondaryColor3ubEXT (GLubyte red, GLubyte green, GLubyte blue); +GLAPI void APIENTRY glSecondaryColor3ubvEXT (const GLubyte *v); +GLAPI void APIENTRY glSecondaryColor3uiEXT (GLuint red, GLuint green, GLuint blue); +GLAPI void APIENTRY glSecondaryColor3uivEXT (const GLuint *v); +GLAPI void APIENTRY glSecondaryColor3usEXT (GLushort red, GLushort green, GLushort blue); +GLAPI void APIENTRY glSecondaryColor3usvEXT (const GLushort *v); +GLAPI void APIENTRY glSecondaryColorPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_secondary_color */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +typedef void (APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); +typedef void (APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); +typedef GLboolean (APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); +typedef void (APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); +typedef void (APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +typedef void (APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); +GLAPI void APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); +GLAPI GLboolean APIENTRY glIsSemaphoreEXT (GLuint semaphore); +GLAPI void APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); +GLAPI void APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); +GLAPI void APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +GLAPI void APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#endif +#endif /* GL_EXT_semaphore */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_semaphore_fd */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); +GLAPI void APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_semaphore_win32 */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8B8D +typedef void (APIENTRYP PFNGLUSESHADERPROGRAMEXTPROC) (GLenum type, GLuint program); +typedef void (APIENTRYP PFNGLACTIVEPROGRAMEXTPROC) (GLuint program); +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMEXTPROC) (GLenum type, const GLchar *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUseShaderProgramEXT (GLenum type, GLuint program); +GLAPI void APIENTRY glActiveProgramEXT (GLuint program); +GLAPI GLuint APIENTRY glCreateShaderProgramEXT (GLenum type, const GLchar *string); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_separate_specular_color +#define GL_EXT_separate_specular_color 1 +#define GL_LIGHT_MODEL_COLOR_CONTROL_EXT 0x81F8 +#define GL_SINGLE_COLOR_EXT 0x81F9 +#define GL_SEPARATE_SPECULAR_COLOR_EXT 0x81FA +#endif /* GL_EXT_separate_specular_color */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif /* GL_EXT_shader_framebuffer_fetch */ + +#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +typedef void (APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferFetchBarrierEXT (void); +#endif +#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ + +#ifndef GL_EXT_shader_image_load_formatted +#define GL_EXT_shader_image_load_formatted 1 +#endif /* GL_EXT_shader_image_load_formatted */ + +#ifndef GL_EXT_shader_image_load_store +#define GL_EXT_shader_image_load_store 1 +#define GL_MAX_IMAGE_UNITS_EXT 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS_EXT 0x8F39 +#define GL_IMAGE_BINDING_NAME_EXT 0x8F3A +#define GL_IMAGE_BINDING_LEVEL_EXT 0x8F3B +#define GL_IMAGE_BINDING_LAYERED_EXT 0x8F3C +#define GL_IMAGE_BINDING_LAYER_EXT 0x8F3D +#define GL_IMAGE_BINDING_ACCESS_EXT 0x8F3E +#define GL_IMAGE_1D_EXT 0x904C +#define GL_IMAGE_2D_EXT 0x904D +#define GL_IMAGE_3D_EXT 0x904E +#define GL_IMAGE_2D_RECT_EXT 0x904F +#define GL_IMAGE_CUBE_EXT 0x9050 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_IMAGE_1D_ARRAY_EXT 0x9052 +#define GL_IMAGE_2D_ARRAY_EXT 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE_EXT 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9056 +#define GL_INT_IMAGE_1D_EXT 0x9057 +#define GL_INT_IMAGE_2D_EXT 0x9058 +#define GL_INT_IMAGE_3D_EXT 0x9059 +#define GL_INT_IMAGE_2D_RECT_EXT 0x905A +#define GL_INT_IMAGE_CUBE_EXT 0x905B +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_INT_IMAGE_1D_ARRAY_EXT 0x905D +#define GL_INT_IMAGE_2D_ARRAY_EXT 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE_EXT 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D_EXT 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D_EXT 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D_EXT 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT_EXT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE_EXT 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY_EXT 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY_EXT 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_EXT 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY_EXT 0x906C +#define GL_MAX_IMAGE_SAMPLES_EXT 0x906D +#define GL_IMAGE_BINDING_FORMAT_EXT 0x906E +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT_EXT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT_EXT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT_EXT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT_EXT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT_EXT 0x00000020 +#define GL_COMMAND_BARRIER_BIT_EXT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT_EXT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT_EXT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT_EXT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT_EXT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT_EXT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT_EXT 0x00001000 +#define GL_ALL_BARRIER_BITS_EXT 0xFFFFFFFF +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREEXTPROC) (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +typedef void (APIENTRYP PFNGLMEMORYBARRIEREXTPROC) (GLbitfield barriers); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindImageTextureEXT (GLuint index, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLint format); +GLAPI void APIENTRY glMemoryBarrierEXT (GLbitfield barriers); +#endif +#endif /* GL_EXT_shader_image_load_store */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shader_samples_identical +#define GL_EXT_shader_samples_identical 1 +#endif /* GL_EXT_shader_samples_identical */ + +#ifndef GL_EXT_shadow_funcs +#define GL_EXT_shadow_funcs 1 +#endif /* GL_EXT_shadow_funcs */ + +#ifndef GL_EXT_shared_texture_palette +#define GL_EXT_shared_texture_palette 1 +#define GL_SHARED_TEXTURE_PALETTE_EXT 0x81FB +#endif /* GL_EXT_shared_texture_palette */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_stencil_clear_tag +#define GL_EXT_stencil_clear_tag 1 +#define GL_STENCIL_TAG_BITS_EXT 0x88F2 +#define GL_STENCIL_CLEAR_TAG_VALUE_EXT 0x88F3 +typedef void (APIENTRYP PFNGLSTENCILCLEARTAGEXTPROC) (GLsizei stencilTagBits, GLuint stencilClearTag); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStencilClearTagEXT (GLsizei stencilTagBits, GLuint stencilClearTag); +#endif +#endif /* GL_EXT_stencil_clear_tag */ + +#ifndef GL_EXT_stencil_two_side +#define GL_EXT_stencil_two_side 1 +#define GL_STENCIL_TEST_TWO_SIDE_EXT 0x8910 +#define GL_ACTIVE_STENCIL_FACE_EXT 0x8911 +typedef void (APIENTRYP PFNGLACTIVESTENCILFACEEXTPROC) (GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glActiveStencilFaceEXT (GLenum face); +#endif +#endif /* GL_EXT_stencil_two_side */ + +#ifndef GL_EXT_stencil_wrap +#define GL_EXT_stencil_wrap 1 +#define GL_INCR_WRAP_EXT 0x8507 +#define GL_DECR_WRAP_EXT 0x8508 +#endif /* GL_EXT_stencil_wrap */ + +#ifndef GL_EXT_subtexture +#define GL_EXT_subtexture 1 +typedef void (APIENTRYP PFNGLTEXSUBIMAGE1DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexSubImage1DEXT (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage2DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_subtexture */ + +#ifndef GL_EXT_texture +#define GL_EXT_texture 1 +#define GL_ALPHA4_EXT 0x803B +#define GL_ALPHA8_EXT 0x803C +#define GL_ALPHA12_EXT 0x803D +#define GL_ALPHA16_EXT 0x803E +#define GL_LUMINANCE4_EXT 0x803F +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE12_EXT 0x8041 +#define GL_LUMINANCE16_EXT 0x8042 +#define GL_LUMINANCE4_ALPHA4_EXT 0x8043 +#define GL_LUMINANCE6_ALPHA2_EXT 0x8044 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_LUMINANCE12_ALPHA4_EXT 0x8046 +#define GL_LUMINANCE12_ALPHA12_EXT 0x8047 +#define GL_LUMINANCE16_ALPHA16_EXT 0x8048 +#define GL_INTENSITY_EXT 0x8049 +#define GL_INTENSITY4_EXT 0x804A +#define GL_INTENSITY8_EXT 0x804B +#define GL_INTENSITY12_EXT 0x804C +#define GL_INTENSITY16_EXT 0x804D +#define GL_RGB2_EXT 0x804E +#define GL_RGB4_EXT 0x804F +#define GL_RGB5_EXT 0x8050 +#define GL_RGB8_EXT 0x8051 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB12_EXT 0x8053 +#define GL_RGB16_EXT 0x8054 +#define GL_RGBA2_EXT 0x8055 +#define GL_RGBA4_EXT 0x8056 +#define GL_RGB5_A1_EXT 0x8057 +#define GL_RGBA8_EXT 0x8058 +#define GL_RGB10_A2_EXT 0x8059 +#define GL_RGBA12_EXT 0x805A +#define GL_RGBA16_EXT 0x805B +#define GL_TEXTURE_RED_SIZE_EXT 0x805C +#define GL_TEXTURE_GREEN_SIZE_EXT 0x805D +#define GL_TEXTURE_BLUE_SIZE_EXT 0x805E +#define GL_TEXTURE_ALPHA_SIZE_EXT 0x805F +#define GL_TEXTURE_LUMINANCE_SIZE_EXT 0x8060 +#define GL_TEXTURE_INTENSITY_SIZE_EXT 0x8061 +#define GL_REPLACE_EXT 0x8062 +#define GL_PROXY_TEXTURE_1D_EXT 0x8063 +#define GL_PROXY_TEXTURE_2D_EXT 0x8064 +#define GL_TEXTURE_TOO_LARGE_EXT 0x8065 +#endif /* GL_EXT_texture */ + +#ifndef GL_EXT_texture3D +#define GL_EXT_texture3D 1 +#define GL_PACK_SKIP_IMAGES_EXT 0x806B +#define GL_PACK_IMAGE_HEIGHT_EXT 0x806C +#define GL_UNPACK_SKIP_IMAGES_EXT 0x806D +#define GL_UNPACK_IMAGE_HEIGHT_EXT 0x806E +#define GL_TEXTURE_3D_EXT 0x806F +#define GL_PROXY_TEXTURE_3D_EXT 0x8070 +#define GL_TEXTURE_DEPTH_EXT 0x8071 +#define GL_TEXTURE_WRAP_R_EXT 0x8072 +#define GL_MAX_3D_TEXTURE_SIZE_EXT 0x8073 +typedef void (APIENTRYP PFNGLTEXIMAGE3DEXTPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE3DEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage3DEXT (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage3DEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_EXT_texture3D */ + +#ifndef GL_EXT_texture_array +#define GL_EXT_texture_array 1 +#define GL_TEXTURE_1D_ARRAY_EXT 0x8C18 +#define GL_PROXY_TEXTURE_1D_ARRAY_EXT 0x8C19 +#define GL_TEXTURE_2D_ARRAY_EXT 0x8C1A +#define GL_PROXY_TEXTURE_2D_ARRAY_EXT 0x8C1B +#define GL_TEXTURE_BINDING_1D_ARRAY_EXT 0x8C1C +#define GL_TEXTURE_BINDING_2D_ARRAY_EXT 0x8C1D +#define GL_MAX_ARRAY_TEXTURE_LAYERS_EXT 0x88FF +#define GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT 0x884E +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYEREXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureLayerEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer); +#endif +#endif /* GL_EXT_texture_array */ + +#ifndef GL_EXT_texture_buffer_object +#define GL_EXT_texture_buffer_object 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_FORMAT_EXT 0x8C2E +typedef void (APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +#endif +#endif /* GL_EXT_texture_buffer_object */ + +#ifndef GL_EXT_texture_compression_latc +#define GL_EXT_texture_compression_latc 1 +#define GL_COMPRESSED_LUMINANCE_LATC1_EXT 0x8C70 +#define GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT 0x8C71 +#define GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT 0x8C72 +#define GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT 0x8C73 +#endif /* GL_EXT_texture_compression_latc */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_cube_map +#define GL_EXT_texture_cube_map 1 +#define GL_NORMAL_MAP_EXT 0x8511 +#define GL_REFLECTION_MAP_EXT 0x8512 +#define GL_TEXTURE_CUBE_MAP_EXT 0x8513 +#define GL_TEXTURE_BINDING_CUBE_MAP_EXT 0x8514 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_X_EXT 0x8515 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_X_EXT 0x8516 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Y_EXT 0x8517 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_EXT 0x8518 +#define GL_TEXTURE_CUBE_MAP_POSITIVE_Z_EXT 0x8519 +#define GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_EXT 0x851A +#define GL_PROXY_TEXTURE_CUBE_MAP_EXT 0x851B +#define GL_MAX_CUBE_MAP_TEXTURE_SIZE_EXT 0x851C +#endif /* GL_EXT_texture_cube_map */ + +#ifndef GL_EXT_texture_env_add +#define GL_EXT_texture_env_add 1 +#endif /* GL_EXT_texture_env_add */ + +#ifndef GL_EXT_texture_env_combine +#define GL_EXT_texture_env_combine 1 +#define GL_COMBINE_EXT 0x8570 +#define GL_COMBINE_RGB_EXT 0x8571 +#define GL_COMBINE_ALPHA_EXT 0x8572 +#define GL_RGB_SCALE_EXT 0x8573 +#define GL_ADD_SIGNED_EXT 0x8574 +#define GL_INTERPOLATE_EXT 0x8575 +#define GL_CONSTANT_EXT 0x8576 +#define GL_PRIMARY_COLOR_EXT 0x8577 +#define GL_PREVIOUS_EXT 0x8578 +#define GL_SOURCE0_RGB_EXT 0x8580 +#define GL_SOURCE1_RGB_EXT 0x8581 +#define GL_SOURCE2_RGB_EXT 0x8582 +#define GL_SOURCE0_ALPHA_EXT 0x8588 +#define GL_SOURCE1_ALPHA_EXT 0x8589 +#define GL_SOURCE2_ALPHA_EXT 0x858A +#define GL_OPERAND0_RGB_EXT 0x8590 +#define GL_OPERAND1_RGB_EXT 0x8591 +#define GL_OPERAND2_RGB_EXT 0x8592 +#define GL_OPERAND0_ALPHA_EXT 0x8598 +#define GL_OPERAND1_ALPHA_EXT 0x8599 +#define GL_OPERAND2_ALPHA_EXT 0x859A +#endif /* GL_EXT_texture_env_combine */ + +#ifndef GL_EXT_texture_env_dot3 +#define GL_EXT_texture_env_dot3 1 +#define GL_DOT3_RGB_EXT 0x8740 +#define GL_DOT3_RGBA_EXT 0x8741 +#endif /* GL_EXT_texture_env_dot3 */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_integer +#define GL_EXT_texture_integer 1 +#define GL_RGBA32UI_EXT 0x8D70 +#define GL_RGB32UI_EXT 0x8D71 +#define GL_ALPHA32UI_EXT 0x8D72 +#define GL_INTENSITY32UI_EXT 0x8D73 +#define GL_LUMINANCE32UI_EXT 0x8D74 +#define GL_LUMINANCE_ALPHA32UI_EXT 0x8D75 +#define GL_RGBA16UI_EXT 0x8D76 +#define GL_RGB16UI_EXT 0x8D77 +#define GL_ALPHA16UI_EXT 0x8D78 +#define GL_INTENSITY16UI_EXT 0x8D79 +#define GL_LUMINANCE16UI_EXT 0x8D7A +#define GL_LUMINANCE_ALPHA16UI_EXT 0x8D7B +#define GL_RGBA8UI_EXT 0x8D7C +#define GL_RGB8UI_EXT 0x8D7D +#define GL_ALPHA8UI_EXT 0x8D7E +#define GL_INTENSITY8UI_EXT 0x8D7F +#define GL_LUMINANCE8UI_EXT 0x8D80 +#define GL_LUMINANCE_ALPHA8UI_EXT 0x8D81 +#define GL_RGBA32I_EXT 0x8D82 +#define GL_RGB32I_EXT 0x8D83 +#define GL_ALPHA32I_EXT 0x8D84 +#define GL_INTENSITY32I_EXT 0x8D85 +#define GL_LUMINANCE32I_EXT 0x8D86 +#define GL_LUMINANCE_ALPHA32I_EXT 0x8D87 +#define GL_RGBA16I_EXT 0x8D88 +#define GL_RGB16I_EXT 0x8D89 +#define GL_ALPHA16I_EXT 0x8D8A +#define GL_INTENSITY16I_EXT 0x8D8B +#define GL_LUMINANCE16I_EXT 0x8D8C +#define GL_LUMINANCE_ALPHA16I_EXT 0x8D8D +#define GL_RGBA8I_EXT 0x8D8E +#define GL_RGB8I_EXT 0x8D8F +#define GL_ALPHA8I_EXT 0x8D90 +#define GL_INTENSITY8I_EXT 0x8D91 +#define GL_LUMINANCE8I_EXT 0x8D92 +#define GL_LUMINANCE_ALPHA8I_EXT 0x8D93 +#define GL_RED_INTEGER_EXT 0x8D94 +#define GL_GREEN_INTEGER_EXT 0x8D95 +#define GL_BLUE_INTEGER_EXT 0x8D96 +#define GL_ALPHA_INTEGER_EXT 0x8D97 +#define GL_RGB_INTEGER_EXT 0x8D98 +#define GL_RGBA_INTEGER_EXT 0x8D99 +#define GL_BGR_INTEGER_EXT 0x8D9A +#define GL_BGRA_INTEGER_EXT 0x8D9B +#define GL_LUMINANCE_INTEGER_EXT 0x8D9C +#define GL_LUMINANCE_ALPHA_INTEGER_EXT 0x8D9D +#define GL_RGBA_INTEGER_MODE_EXT 0x8D9E +typedef void (APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLCLEARCOLORIIEXTPROC) (GLint red, GLint green, GLint blue, GLint alpha); +typedef void (APIENTRYP PFNGLCLEARCOLORIUIEXTPROC) (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GLAPI void APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GLAPI void APIENTRY glClearColorIiEXT (GLint red, GLint green, GLint blue, GLint alpha); +GLAPI void APIENTRY glClearColorIuiEXT (GLuint red, GLuint green, GLuint blue, GLuint alpha); +#endif +#endif /* GL_EXT_texture_integer */ + +#ifndef GL_EXT_texture_lod_bias +#define GL_EXT_texture_lod_bias 1 +#define GL_MAX_TEXTURE_LOD_BIAS_EXT 0x84FD +#define GL_TEXTURE_FILTER_CONTROL_EXT 0x8500 +#define GL_TEXTURE_LOD_BIAS_EXT 0x8501 +#endif /* GL_EXT_texture_lod_bias */ + +#ifndef GL_EXT_texture_mirror_clamp +#define GL_EXT_texture_mirror_clamp 1 +#define GL_MIRROR_CLAMP_EXT 0x8742 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#define GL_MIRROR_CLAMP_TO_BORDER_EXT 0x8912 +#endif /* GL_EXT_texture_mirror_clamp */ + +#ifndef GL_EXT_texture_object +#define GL_EXT_texture_object 1 +#define GL_TEXTURE_PRIORITY_EXT 0x8066 +#define GL_TEXTURE_RESIDENT_EXT 0x8067 +#define GL_TEXTURE_1D_BINDING_EXT 0x8068 +#define GL_TEXTURE_2D_BINDING_EXT 0x8069 +#define GL_TEXTURE_3D_BINDING_EXT 0x806A +typedef GLboolean (APIENTRYP PFNGLARETEXTURESRESIDENTEXTPROC) (GLsizei n, const GLuint *textures, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDTEXTUREEXTPROC) (GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLDELETETEXTURESEXTPROC) (GLsizei n, const GLuint *textures); +typedef void (APIENTRYP PFNGLGENTEXTURESEXTPROC) (GLsizei n, GLuint *textures); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREEXTPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLPRIORITIZETEXTURESEXTPROC) (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreTexturesResidentEXT (GLsizei n, const GLuint *textures, GLboolean *residences); +GLAPI void APIENTRY glBindTextureEXT (GLenum target, GLuint texture); +GLAPI void APIENTRY glDeleteTexturesEXT (GLsizei n, const GLuint *textures); +GLAPI void APIENTRY glGenTexturesEXT (GLsizei n, GLuint *textures); +GLAPI GLboolean APIENTRY glIsTextureEXT (GLuint texture); +GLAPI void APIENTRY glPrioritizeTexturesEXT (GLsizei n, const GLuint *textures, const GLclampf *priorities); +#endif +#endif /* GL_EXT_texture_object */ + +#ifndef GL_EXT_texture_perturb_normal +#define GL_EXT_texture_perturb_normal 1 +#define GL_PERTURB_EXT 0x85AE +#define GL_TEXTURE_NORMAL_EXT 0x85AF +typedef void (APIENTRYP PFNGLTEXTURENORMALEXTPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureNormalEXT (GLenum mode); +#endif +#endif /* GL_EXT_texture_perturb_normal */ + +#ifndef GL_EXT_texture_sRGB +#define GL_EXT_texture_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB8_EXT 0x8C41 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_SLUMINANCE_ALPHA_EXT 0x8C44 +#define GL_SLUMINANCE8_ALPHA8_EXT 0x8C45 +#define GL_SLUMINANCE_EXT 0x8C46 +#define GL_SLUMINANCE8_EXT 0x8C47 +#define GL_COMPRESSED_SRGB_EXT 0x8C48 +#define GL_COMPRESSED_SRGB_ALPHA_EXT 0x8C49 +#define GL_COMPRESSED_SLUMINANCE_EXT 0x8C4A +#define GL_COMPRESSED_SLUMINANCE_ALPHA_EXT 0x8C4B +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_sRGB */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 +#define GL_SR8_EXT 0x8FBD +#endif /* GL_EXT_texture_sRGB_R8 */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 +#define GL_SRG8_EXT 0x8FBE +#endif /* GL_EXT_texture_sRGB_RG8 */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shadow_lod +#define GL_EXT_texture_shadow_lod 1 +#endif /* GL_EXT_texture_shadow_lod */ + +#ifndef GL_EXT_texture_shared_exponent +#define GL_EXT_texture_shared_exponent 1 +#define GL_RGB9_E5_EXT 0x8C3D +#define GL_UNSIGNED_INT_5_9_9_9_REV_EXT 0x8C3E +#define GL_TEXTURE_SHARED_SIZE_EXT 0x8C3F +#endif /* GL_EXT_texture_shared_exponent */ + +#ifndef GL_EXT_texture_snorm +#define GL_EXT_texture_snorm 1 +#define GL_ALPHA_SNORM 0x9010 +#define GL_LUMINANCE_SNORM 0x9011 +#define GL_LUMINANCE_ALPHA_SNORM 0x9012 +#define GL_INTENSITY_SNORM 0x9013 +#define GL_ALPHA8_SNORM 0x9014 +#define GL_LUMINANCE8_SNORM 0x9015 +#define GL_LUMINANCE8_ALPHA8_SNORM 0x9016 +#define GL_INTENSITY8_SNORM 0x9017 +#define GL_ALPHA16_SNORM 0x9018 +#define GL_LUMINANCE16_SNORM 0x9019 +#define GL_LUMINANCE16_ALPHA16_SNORM 0x901A +#define GL_INTENSITY16_SNORM 0x901B +#define GL_RED_SNORM 0x8F90 +#define GL_RG_SNORM 0x8F91 +#define GL_RGB_SNORM 0x8F92 +#define GL_RGBA_SNORM 0x8F93 +#endif /* GL_EXT_texture_snorm */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_BGRA8_EXT 0x93A1 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +#define GL_R16F_EXT 0x822D +#define GL_RG16F_EXT 0x822F +typedef void (APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI void APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI void APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_EXT_texture_storage */ + +#ifndef GL_EXT_texture_swizzle +#define GL_EXT_texture_swizzle 1 +#define GL_TEXTURE_SWIZZLE_R_EXT 0x8E42 +#define GL_TEXTURE_SWIZZLE_G_EXT 0x8E43 +#define GL_TEXTURE_SWIZZLE_B_EXT 0x8E44 +#define GL_TEXTURE_SWIZZLE_A_EXT 0x8E45 +#define GL_TEXTURE_SWIZZLE_RGBA_EXT 0x8E46 +#endif /* GL_EXT_texture_swizzle */ + +#ifndef GL_EXT_timer_query +#define GL_EXT_timer_query 1 +#define GL_TIME_ELAPSED_EXT 0x88BF +typedef void (APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_EXT_timer_query */ + +#ifndef GL_EXT_transform_feedback +#define GL_EXT_transform_feedback 1 +#define GL_TRANSFORM_FEEDBACK_BUFFER_EXT 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT 0x8C85 +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT 0x8C8F +#define GL_INTERLEAVED_ATTRIBS_EXT 0x8C8C +#define GL_SEPARATE_ATTRIBS_EXT 0x8C8D +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT 0x8C88 +#define GL_RASTERIZER_DISCARD_EXT 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT 0x8C8B +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT 0x8C80 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_EXT 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT 0x8C7F +#define GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT 0x8C76 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKEXTPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKEXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGEEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETEXTPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASEEXTPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSEXTPROC) (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGEXTPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackEXT (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackEXT (void); +GLAPI void APIENTRY glBindBufferRangeEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetEXT (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseEXT (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsEXT (GLuint program, GLsizei count, const GLchar *const*varyings, GLenum bufferMode); +GLAPI void APIENTRY glGetTransformFeedbackVaryingEXT (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +#endif +#endif /* GL_EXT_transform_feedback */ + +#ifndef GL_EXT_vertex_array +#define GL_EXT_vertex_array 1 +#define GL_VERTEX_ARRAY_EXT 0x8074 +#define GL_NORMAL_ARRAY_EXT 0x8075 +#define GL_COLOR_ARRAY_EXT 0x8076 +#define GL_INDEX_ARRAY_EXT 0x8077 +#define GL_TEXTURE_COORD_ARRAY_EXT 0x8078 +#define GL_EDGE_FLAG_ARRAY_EXT 0x8079 +#define GL_VERTEX_ARRAY_SIZE_EXT 0x807A +#define GL_VERTEX_ARRAY_TYPE_EXT 0x807B +#define GL_VERTEX_ARRAY_STRIDE_EXT 0x807C +#define GL_VERTEX_ARRAY_COUNT_EXT 0x807D +#define GL_NORMAL_ARRAY_TYPE_EXT 0x807E +#define GL_NORMAL_ARRAY_STRIDE_EXT 0x807F +#define GL_NORMAL_ARRAY_COUNT_EXT 0x8080 +#define GL_COLOR_ARRAY_SIZE_EXT 0x8081 +#define GL_COLOR_ARRAY_TYPE_EXT 0x8082 +#define GL_COLOR_ARRAY_STRIDE_EXT 0x8083 +#define GL_COLOR_ARRAY_COUNT_EXT 0x8084 +#define GL_INDEX_ARRAY_TYPE_EXT 0x8085 +#define GL_INDEX_ARRAY_STRIDE_EXT 0x8086 +#define GL_INDEX_ARRAY_COUNT_EXT 0x8087 +#define GL_TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 +#define GL_TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 +#define GL_TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A +#define GL_TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B +#define GL_EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C +#define GL_EDGE_FLAG_ARRAY_COUNT_EXT 0x808D +#define GL_VERTEX_ARRAY_POINTER_EXT 0x808E +#define GL_NORMAL_ARRAY_POINTER_EXT 0x808F +#define GL_COLOR_ARRAY_POINTER_EXT 0x8090 +#define GL_INDEX_ARRAY_POINTER_EXT 0x8091 +#define GL_TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 +#define GL_EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 +typedef void (APIENTRYP PFNGLARRAYELEMENTEXTPROC) (GLint i); +typedef void (APIENTRYP PFNGLCOLORPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLDRAWARRAYSEXTPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTEREXTPROC) (GLsizei stride, GLsizei count, const GLboolean *pointer); +typedef void (APIENTRYP PFNGLGETPOINTERVEXTPROC) (GLenum pname, void **params); +typedef void (APIENTRYP PFNGLINDEXPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTEREXTPROC) (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glArrayElementEXT (GLint i); +GLAPI void APIENTRY glColorPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glDrawArraysEXT (GLenum mode, GLint first, GLsizei count); +GLAPI void APIENTRY glEdgeFlagPointerEXT (GLsizei stride, GLsizei count, const GLboolean *pointer); +GLAPI void APIENTRY glGetPointervEXT (GLenum pname, void **params); +GLAPI void APIENTRY glIndexPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glNormalPointerEXT (GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glTexCoordPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +GLAPI void APIENTRY glVertexPointerEXT (GLint size, GLenum type, GLsizei stride, GLsizei count, const void *pointer); +#endif +#endif /* GL_EXT_vertex_array */ + +#ifndef GL_EXT_vertex_array_bgra +#define GL_EXT_vertex_array_bgra 1 +#endif /* GL_EXT_vertex_array_bgra */ + +#ifndef GL_EXT_vertex_attrib_64bit +#define GL_EXT_vertex_attrib_64bit 1 +#define GL_DOUBLE_VEC2_EXT 0x8FFC +#define GL_DOUBLE_VEC3_EXT 0x8FFD +#define GL_DOUBLE_VEC4_EXT 0x8FFE +#define GL_DOUBLE_MAT2_EXT 0x8F46 +#define GL_DOUBLE_MAT3_EXT 0x8F47 +#define GL_DOUBLE_MAT4_EXT 0x8F48 +#define GL_DOUBLE_MAT2x3_EXT 0x8F49 +#define GL_DOUBLE_MAT2x4_EXT 0x8F4A +#define GL_DOUBLE_MAT3x2_EXT 0x8F4B +#define GL_DOUBLE_MAT3x4_EXT 0x8F4C +#define GL_DOUBLE_MAT4x2_EXT 0x8F4D +#define GL_DOUBLE_MAT4x3_EXT 0x8F4E +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DEXTPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DEXTPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DEXTPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVEXTPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTEREXTPROC) (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVEXTPROC) (GLuint index, GLenum pname, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1dEXT (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttribL2dEXT (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttribL3dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttribL4dEXT (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttribL1dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL2dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL3dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribL4dvEXT (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribLPointerEXT (GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glGetVertexAttribLdvEXT (GLuint index, GLenum pname, GLdouble *params); +#endif +#endif /* GL_EXT_vertex_attrib_64bit */ + +#ifndef GL_EXT_vertex_shader +#define GL_EXT_vertex_shader 1 +#define GL_VERTEX_SHADER_EXT 0x8780 +#define GL_VERTEX_SHADER_BINDING_EXT 0x8781 +#define GL_OP_INDEX_EXT 0x8782 +#define GL_OP_NEGATE_EXT 0x8783 +#define GL_OP_DOT3_EXT 0x8784 +#define GL_OP_DOT4_EXT 0x8785 +#define GL_OP_MUL_EXT 0x8786 +#define GL_OP_ADD_EXT 0x8787 +#define GL_OP_MADD_EXT 0x8788 +#define GL_OP_FRAC_EXT 0x8789 +#define GL_OP_MAX_EXT 0x878A +#define GL_OP_MIN_EXT 0x878B +#define GL_OP_SET_GE_EXT 0x878C +#define GL_OP_SET_LT_EXT 0x878D +#define GL_OP_CLAMP_EXT 0x878E +#define GL_OP_FLOOR_EXT 0x878F +#define GL_OP_ROUND_EXT 0x8790 +#define GL_OP_EXP_BASE_2_EXT 0x8791 +#define GL_OP_LOG_BASE_2_EXT 0x8792 +#define GL_OP_POWER_EXT 0x8793 +#define GL_OP_RECIP_EXT 0x8794 +#define GL_OP_RECIP_SQRT_EXT 0x8795 +#define GL_OP_SUB_EXT 0x8796 +#define GL_OP_CROSS_PRODUCT_EXT 0x8797 +#define GL_OP_MULTIPLY_MATRIX_EXT 0x8798 +#define GL_OP_MOV_EXT 0x8799 +#define GL_OUTPUT_VERTEX_EXT 0x879A +#define GL_OUTPUT_COLOR0_EXT 0x879B +#define GL_OUTPUT_COLOR1_EXT 0x879C +#define GL_OUTPUT_TEXTURE_COORD0_EXT 0x879D +#define GL_OUTPUT_TEXTURE_COORD1_EXT 0x879E +#define GL_OUTPUT_TEXTURE_COORD2_EXT 0x879F +#define GL_OUTPUT_TEXTURE_COORD3_EXT 0x87A0 +#define GL_OUTPUT_TEXTURE_COORD4_EXT 0x87A1 +#define GL_OUTPUT_TEXTURE_COORD5_EXT 0x87A2 +#define GL_OUTPUT_TEXTURE_COORD6_EXT 0x87A3 +#define GL_OUTPUT_TEXTURE_COORD7_EXT 0x87A4 +#define GL_OUTPUT_TEXTURE_COORD8_EXT 0x87A5 +#define GL_OUTPUT_TEXTURE_COORD9_EXT 0x87A6 +#define GL_OUTPUT_TEXTURE_COORD10_EXT 0x87A7 +#define GL_OUTPUT_TEXTURE_COORD11_EXT 0x87A8 +#define GL_OUTPUT_TEXTURE_COORD12_EXT 0x87A9 +#define GL_OUTPUT_TEXTURE_COORD13_EXT 0x87AA +#define GL_OUTPUT_TEXTURE_COORD14_EXT 0x87AB +#define GL_OUTPUT_TEXTURE_COORD15_EXT 0x87AC +#define GL_OUTPUT_TEXTURE_COORD16_EXT 0x87AD +#define GL_OUTPUT_TEXTURE_COORD17_EXT 0x87AE +#define GL_OUTPUT_TEXTURE_COORD18_EXT 0x87AF +#define GL_OUTPUT_TEXTURE_COORD19_EXT 0x87B0 +#define GL_OUTPUT_TEXTURE_COORD20_EXT 0x87B1 +#define GL_OUTPUT_TEXTURE_COORD21_EXT 0x87B2 +#define GL_OUTPUT_TEXTURE_COORD22_EXT 0x87B3 +#define GL_OUTPUT_TEXTURE_COORD23_EXT 0x87B4 +#define GL_OUTPUT_TEXTURE_COORD24_EXT 0x87B5 +#define GL_OUTPUT_TEXTURE_COORD25_EXT 0x87B6 +#define GL_OUTPUT_TEXTURE_COORD26_EXT 0x87B7 +#define GL_OUTPUT_TEXTURE_COORD27_EXT 0x87B8 +#define GL_OUTPUT_TEXTURE_COORD28_EXT 0x87B9 +#define GL_OUTPUT_TEXTURE_COORD29_EXT 0x87BA +#define GL_OUTPUT_TEXTURE_COORD30_EXT 0x87BB +#define GL_OUTPUT_TEXTURE_COORD31_EXT 0x87BC +#define GL_OUTPUT_FOG_EXT 0x87BD +#define GL_SCALAR_EXT 0x87BE +#define GL_VECTOR_EXT 0x87BF +#define GL_MATRIX_EXT 0x87C0 +#define GL_VARIANT_EXT 0x87C1 +#define GL_INVARIANT_EXT 0x87C2 +#define GL_LOCAL_CONSTANT_EXT 0x87C3 +#define GL_LOCAL_EXT 0x87C4 +#define GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87C5 +#define GL_MAX_VERTEX_SHADER_VARIANTS_EXT 0x87C6 +#define GL_MAX_VERTEX_SHADER_INVARIANTS_EXT 0x87C7 +#define GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87C8 +#define GL_MAX_VERTEX_SHADER_LOCALS_EXT 0x87C9 +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CA +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT 0x87CB +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87CC +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT 0x87CD +#define GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT 0x87CE +#define GL_VERTEX_SHADER_INSTRUCTIONS_EXT 0x87CF +#define GL_VERTEX_SHADER_VARIANTS_EXT 0x87D0 +#define GL_VERTEX_SHADER_INVARIANTS_EXT 0x87D1 +#define GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT 0x87D2 +#define GL_VERTEX_SHADER_LOCALS_EXT 0x87D3 +#define GL_VERTEX_SHADER_OPTIMIZED_EXT 0x87D4 +#define GL_X_EXT 0x87D5 +#define GL_Y_EXT 0x87D6 +#define GL_Z_EXT 0x87D7 +#define GL_W_EXT 0x87D8 +#define GL_NEGATIVE_X_EXT 0x87D9 +#define GL_NEGATIVE_Y_EXT 0x87DA +#define GL_NEGATIVE_Z_EXT 0x87DB +#define GL_NEGATIVE_W_EXT 0x87DC +#define GL_ZERO_EXT 0x87DD +#define GL_ONE_EXT 0x87DE +#define GL_NEGATIVE_ONE_EXT 0x87DF +#define GL_NORMALIZED_RANGE_EXT 0x87E0 +#define GL_FULL_RANGE_EXT 0x87E1 +#define GL_CURRENT_VERTEX_EXT 0x87E2 +#define GL_MVP_MATRIX_EXT 0x87E3 +#define GL_VARIANT_VALUE_EXT 0x87E4 +#define GL_VARIANT_DATATYPE_EXT 0x87E5 +#define GL_VARIANT_ARRAY_STRIDE_EXT 0x87E6 +#define GL_VARIANT_ARRAY_TYPE_EXT 0x87E7 +#define GL_VARIANT_ARRAY_EXT 0x87E8 +#define GL_VARIANT_ARRAY_POINTER_EXT 0x87E9 +#define GL_INVARIANT_VALUE_EXT 0x87EA +#define GL_INVARIANT_DATATYPE_EXT 0x87EB +#define GL_LOCAL_CONSTANT_VALUE_EXT 0x87EC +#define GL_LOCAL_CONSTANT_DATATYPE_EXT 0x87ED +typedef void (APIENTRYP PFNGLBEGINVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLENDVERTEXSHADEREXTPROC) (void); +typedef void (APIENTRYP PFNGLBINDVERTEXSHADEREXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLGENVERTEXSHADERSEXTPROC) (GLuint range); +typedef void (APIENTRYP PFNGLDELETEVERTEXSHADEREXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLSHADEROP1EXTPROC) (GLenum op, GLuint res, GLuint arg1); +typedef void (APIENTRYP PFNGLSHADEROP2EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +typedef void (APIENTRYP PFNGLSHADEROP3EXTPROC) (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +typedef void (APIENTRYP PFNGLSWIZZLEEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLWRITEMASKEXTPROC) (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +typedef void (APIENTRYP PFNGLINSERTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef void (APIENTRYP PFNGLEXTRACTCOMPONENTEXTPROC) (GLuint res, GLuint src, GLuint num); +typedef GLuint (APIENTRYP PFNGLGENSYMBOLSEXTPROC) (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +typedef void (APIENTRYP PFNGLSETINVARIANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLSETLOCALCONSTANTEXTPROC) (GLuint id, GLenum type, const void *addr); +typedef void (APIENTRYP PFNGLVARIANTBVEXTPROC) (GLuint id, const GLbyte *addr); +typedef void (APIENTRYP PFNGLVARIANTSVEXTPROC) (GLuint id, const GLshort *addr); +typedef void (APIENTRYP PFNGLVARIANTIVEXTPROC) (GLuint id, const GLint *addr); +typedef void (APIENTRYP PFNGLVARIANTFVEXTPROC) (GLuint id, const GLfloat *addr); +typedef void (APIENTRYP PFNGLVARIANTDVEXTPROC) (GLuint id, const GLdouble *addr); +typedef void (APIENTRYP PFNGLVARIANTUBVEXTPROC) (GLuint id, const GLubyte *addr); +typedef void (APIENTRYP PFNGLVARIANTUSVEXTPROC) (GLuint id, const GLushort *addr); +typedef void (APIENTRYP PFNGLVARIANTUIVEXTPROC) (GLuint id, const GLuint *addr); +typedef void (APIENTRYP PFNGLVARIANTPOINTEREXTPROC) (GLuint id, GLenum type, GLuint stride, const void *addr); +typedef void (APIENTRYP PFNGLENABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef void (APIENTRYP PFNGLDISABLEVARIANTCLIENTSTATEEXTPROC) (GLuint id); +typedef GLuint (APIENTRYP PFNGLBINDLIGHTPARAMETEREXTPROC) (GLenum light, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDMATERIALPARAMETEREXTPROC) (GLenum face, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXGENPARAMETEREXTPROC) (GLenum unit, GLenum coord, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDTEXTUREUNITPARAMETEREXTPROC) (GLenum unit, GLenum value); +typedef GLuint (APIENTRYP PFNGLBINDPARAMETEREXTPROC) (GLenum value); +typedef GLboolean (APIENTRYP PFNGLISVARIANTENABLEDEXTPROC) (GLuint id, GLenum cap); +typedef void (APIENTRYP PFNGLGETVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETVARIANTPOINTERVEXTPROC) (GLuint id, GLenum value, void **data); +typedef void (APIENTRYP PFNGLGETINVARIANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETINVARIANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETINVARIANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTBOOLEANVEXTPROC) (GLuint id, GLenum value, GLboolean *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTINTEGERVEXTPROC) (GLuint id, GLenum value, GLint *data); +typedef void (APIENTRYP PFNGLGETLOCALCONSTANTFLOATVEXTPROC) (GLuint id, GLenum value, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVertexShaderEXT (void); +GLAPI void APIENTRY glEndVertexShaderEXT (void); +GLAPI void APIENTRY glBindVertexShaderEXT (GLuint id); +GLAPI GLuint APIENTRY glGenVertexShadersEXT (GLuint range); +GLAPI void APIENTRY glDeleteVertexShaderEXT (GLuint id); +GLAPI void APIENTRY glShaderOp1EXT (GLenum op, GLuint res, GLuint arg1); +GLAPI void APIENTRY glShaderOp2EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2); +GLAPI void APIENTRY glShaderOp3EXT (GLenum op, GLuint res, GLuint arg1, GLuint arg2, GLuint arg3); +GLAPI void APIENTRY glSwizzleEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glWriteMaskEXT (GLuint res, GLuint in, GLenum outX, GLenum outY, GLenum outZ, GLenum outW); +GLAPI void APIENTRY glInsertComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI void APIENTRY glExtractComponentEXT (GLuint res, GLuint src, GLuint num); +GLAPI GLuint APIENTRY glGenSymbolsEXT (GLenum datatype, GLenum storagetype, GLenum range, GLuint components); +GLAPI void APIENTRY glSetInvariantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glSetLocalConstantEXT (GLuint id, GLenum type, const void *addr); +GLAPI void APIENTRY glVariantbvEXT (GLuint id, const GLbyte *addr); +GLAPI void APIENTRY glVariantsvEXT (GLuint id, const GLshort *addr); +GLAPI void APIENTRY glVariantivEXT (GLuint id, const GLint *addr); +GLAPI void APIENTRY glVariantfvEXT (GLuint id, const GLfloat *addr); +GLAPI void APIENTRY glVariantdvEXT (GLuint id, const GLdouble *addr); +GLAPI void APIENTRY glVariantubvEXT (GLuint id, const GLubyte *addr); +GLAPI void APIENTRY glVariantusvEXT (GLuint id, const GLushort *addr); +GLAPI void APIENTRY glVariantuivEXT (GLuint id, const GLuint *addr); +GLAPI void APIENTRY glVariantPointerEXT (GLuint id, GLenum type, GLuint stride, const void *addr); +GLAPI void APIENTRY glEnableVariantClientStateEXT (GLuint id); +GLAPI void APIENTRY glDisableVariantClientStateEXT (GLuint id); +GLAPI GLuint APIENTRY glBindLightParameterEXT (GLenum light, GLenum value); +GLAPI GLuint APIENTRY glBindMaterialParameterEXT (GLenum face, GLenum value); +GLAPI GLuint APIENTRY glBindTexGenParameterEXT (GLenum unit, GLenum coord, GLenum value); +GLAPI GLuint APIENTRY glBindTextureUnitParameterEXT (GLenum unit, GLenum value); +GLAPI GLuint APIENTRY glBindParameterEXT (GLenum value); +GLAPI GLboolean APIENTRY glIsVariantEnabledEXT (GLuint id, GLenum cap); +GLAPI void APIENTRY glGetVariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetVariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetVariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetVariantPointervEXT (GLuint id, GLenum value, void **data); +GLAPI void APIENTRY glGetInvariantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetInvariantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetInvariantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +GLAPI void APIENTRY glGetLocalConstantBooleanvEXT (GLuint id, GLenum value, GLboolean *data); +GLAPI void APIENTRY glGetLocalConstantIntegervEXT (GLuint id, GLenum value, GLint *data); +GLAPI void APIENTRY glGetLocalConstantFloatvEXT (GLuint id, GLenum value, GLfloat *data); +#endif +#endif /* GL_EXT_vertex_shader */ + +#ifndef GL_EXT_vertex_weighting +#define GL_EXT_vertex_weighting 1 +#define GL_MODELVIEW0_STACK_DEPTH_EXT 0x0BA3 +#define GL_MODELVIEW1_STACK_DEPTH_EXT 0x8502 +#define GL_MODELVIEW0_MATRIX_EXT 0x0BA6 +#define GL_MODELVIEW1_MATRIX_EXT 0x8506 +#define GL_VERTEX_WEIGHTING_EXT 0x8509 +#define GL_MODELVIEW0_EXT 0x1700 +#define GL_MODELVIEW1_EXT 0x850A +#define GL_CURRENT_VERTEX_WEIGHT_EXT 0x850B +#define GL_VERTEX_WEIGHT_ARRAY_EXT 0x850C +#define GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT 0x850D +#define GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT 0x850E +#define GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT 0x850F +#define GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT 0x8510 +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFEXTPROC) (GLfloat weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTFVEXTPROC) (const GLfloat *weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTPOINTEREXTPROC) (GLint size, GLenum type, GLsizei stride, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexWeightfEXT (GLfloat weight); +GLAPI void APIENTRY glVertexWeightfvEXT (const GLfloat *weight); +GLAPI void APIENTRY glVertexWeightPointerEXT (GLint size, GLenum type, GLsizei stride, const void *pointer); +#endif +#endif /* GL_EXT_vertex_weighting */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 +typedef GLboolean (APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); +GLAPI GLboolean APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); +#endif +#endif /* GL_EXT_win32_keyed_mutex */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 +typedef void (APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); +#endif +#endif /* GL_EXT_window_rectangles */ + +#ifndef GL_EXT_x11_sync_object +#define GL_EXT_x11_sync_object 1 +#define GL_SYNC_X11_FENCE_EXT 0x90E1 +typedef GLsync (APIENTRYP PFNGLIMPORTSYNCEXTPROC) (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLsync APIENTRY glImportSyncEXT (GLenum external_sync_type, GLintptr external_sync, GLbitfield flags); +#endif +#endif /* GL_EXT_x11_sync_object */ + +#ifndef GL_GREMEDY_frame_terminator +#define GL_GREMEDY_frame_terminator 1 +typedef void (APIENTRYP PFNGLFRAMETERMINATORGREMEDYPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameTerminatorGREMEDY (void); +#endif +#endif /* GL_GREMEDY_frame_terminator */ + +#ifndef GL_GREMEDY_string_marker +#define GL_GREMEDY_string_marker 1 +typedef void (APIENTRYP PFNGLSTRINGMARKERGREMEDYPROC) (GLsizei len, const void *string); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glStringMarkerGREMEDY (GLsizei len, const void *string); +#endif +#endif /* GL_GREMEDY_string_marker */ + +#ifndef GL_HP_convolution_border_modes +#define GL_HP_convolution_border_modes 1 +#define GL_IGNORE_BORDER_HP 0x8150 +#define GL_CONSTANT_BORDER_HP 0x8151 +#define GL_REPLICATE_BORDER_HP 0x8153 +#define GL_CONVOLUTION_BORDER_COLOR_HP 0x8154 +#endif /* GL_HP_convolution_border_modes */ + +#ifndef GL_HP_image_transform +#define GL_HP_image_transform 1 +#define GL_IMAGE_SCALE_X_HP 0x8155 +#define GL_IMAGE_SCALE_Y_HP 0x8156 +#define GL_IMAGE_TRANSLATE_X_HP 0x8157 +#define GL_IMAGE_TRANSLATE_Y_HP 0x8158 +#define GL_IMAGE_ROTATE_ANGLE_HP 0x8159 +#define GL_IMAGE_ROTATE_ORIGIN_X_HP 0x815A +#define GL_IMAGE_ROTATE_ORIGIN_Y_HP 0x815B +#define GL_IMAGE_MAG_FILTER_HP 0x815C +#define GL_IMAGE_MIN_FILTER_HP 0x815D +#define GL_IMAGE_CUBIC_WEIGHT_HP 0x815E +#define GL_CUBIC_HP 0x815F +#define GL_AVERAGE_HP 0x8160 +#define GL_IMAGE_TRANSFORM_2D_HP 0x8161 +#define GL_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8162 +#define GL_PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP 0x8163 +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIHPPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFHPPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERIVHPPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETIMAGETRANSFORMPARAMETERFVHPPROC) (GLenum target, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glImageTransformParameteriHP (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glImageTransformParameterfHP (GLenum target, GLenum pname, GLfloat param); +GLAPI void APIENTRY glImageTransformParameterivHP (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glImageTransformParameterfvHP (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetImageTransformParameterivHP (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetImageTransformParameterfvHP (GLenum target, GLenum pname, GLfloat *params); +#endif +#endif /* GL_HP_image_transform */ + +#ifndef GL_HP_occlusion_test +#define GL_HP_occlusion_test 1 +#define GL_OCCLUSION_TEST_HP 0x8165 +#define GL_OCCLUSION_TEST_RESULT_HP 0x8166 +#endif /* GL_HP_occlusion_test */ + +#ifndef GL_HP_texture_lighting +#define GL_HP_texture_lighting 1 +#define GL_TEXTURE_LIGHTING_MODE_HP 0x8167 +#define GL_TEXTURE_POST_SPECULAR_HP 0x8168 +#define GL_TEXTURE_PRE_SPECULAR_HP 0x8169 +#endif /* GL_HP_texture_lighting */ + +#ifndef GL_IBM_cull_vertex +#define GL_IBM_cull_vertex 1 +#define GL_CULL_VERTEX_IBM 103050 +#endif /* GL_IBM_cull_vertex */ + +#ifndef GL_IBM_multimode_draw_arrays +#define GL_IBM_multimode_draw_arrays 1 +typedef void (APIENTRYP PFNGLMULTIMODEDRAWARRAYSIBMPROC) (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +typedef void (APIENTRYP PFNGLMULTIMODEDRAWELEMENTSIBMPROC) (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiModeDrawArraysIBM (const GLenum *mode, const GLint *first, const GLsizei *count, GLsizei primcount, GLint modestride); +GLAPI void APIENTRY glMultiModeDrawElementsIBM (const GLenum *mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount, GLint modestride); +#endif +#endif /* GL_IBM_multimode_draw_arrays */ + +#ifndef GL_IBM_rasterpos_clip +#define GL_IBM_rasterpos_clip 1 +#define GL_RASTER_POSITION_UNCLIPPED_IBM 0x19262 +#endif /* GL_IBM_rasterpos_clip */ + +#ifndef GL_IBM_static_data +#define GL_IBM_static_data 1 +#define GL_ALL_STATIC_DATA_IBM 103060 +#define GL_STATIC_VERTEX_ARRAY_IBM 103061 +typedef void (APIENTRYP PFNGLFLUSHSTATICDATAIBMPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushStaticDataIBM (GLenum target); +#endif +#endif /* GL_IBM_static_data */ + +#ifndef GL_IBM_texture_mirrored_repeat +#define GL_IBM_texture_mirrored_repeat 1 +#define GL_MIRRORED_REPEAT_IBM 0x8370 +#endif /* GL_IBM_texture_mirrored_repeat */ + +#ifndef GL_IBM_vertex_array_lists +#define GL_IBM_vertex_array_lists 1 +#define GL_VERTEX_ARRAY_LIST_IBM 103070 +#define GL_NORMAL_ARRAY_LIST_IBM 103071 +#define GL_COLOR_ARRAY_LIST_IBM 103072 +#define GL_INDEX_ARRAY_LIST_IBM 103073 +#define GL_TEXTURE_COORD_ARRAY_LIST_IBM 103074 +#define GL_EDGE_FLAG_ARRAY_LIST_IBM 103075 +#define GL_FOG_COORDINATE_ARRAY_LIST_IBM 103076 +#define GL_SECONDARY_COLOR_ARRAY_LIST_IBM 103077 +#define GL_VERTEX_ARRAY_LIST_STRIDE_IBM 103080 +#define GL_NORMAL_ARRAY_LIST_STRIDE_IBM 103081 +#define GL_COLOR_ARRAY_LIST_STRIDE_IBM 103082 +#define GL_INDEX_ARRAY_LIST_STRIDE_IBM 103083 +#define GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM 103084 +#define GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM 103085 +#define GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM 103086 +#define GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM 103087 +typedef void (APIENTRYP PFNGLCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLEDGEFLAGPOINTERLISTIBMPROC) (GLint stride, const GLboolean **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLFOGCOORDPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLINDEXPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLNORMALPOINTERLISTIBMPROC) (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +typedef void (APIENTRYP PFNGLVERTEXPOINTERLISTIBMPROC) (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glSecondaryColorPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glEdgeFlagPointerListIBM (GLint stride, const GLboolean **pointer, GLint ptrstride); +GLAPI void APIENTRY glFogCoordPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glIndexPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glNormalPointerListIBM (GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glTexCoordPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +GLAPI void APIENTRY glVertexPointerListIBM (GLint size, GLenum type, GLint stride, const void **pointer, GLint ptrstride); +#endif +#endif /* GL_IBM_vertex_array_lists */ + +#ifndef GL_INGR_blend_func_separate +#define GL_INGR_blend_func_separate 1 +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEINGRPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendFuncSeparateINGR (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +#endif +#endif /* GL_INGR_blend_func_separate */ + +#ifndef GL_INGR_color_clamp +#define GL_INGR_color_clamp 1 +#define GL_RED_MIN_CLAMP_INGR 0x8560 +#define GL_GREEN_MIN_CLAMP_INGR 0x8561 +#define GL_BLUE_MIN_CLAMP_INGR 0x8562 +#define GL_ALPHA_MIN_CLAMP_INGR 0x8563 +#define GL_RED_MAX_CLAMP_INGR 0x8564 +#define GL_GREEN_MAX_CLAMP_INGR 0x8565 +#define GL_BLUE_MAX_CLAMP_INGR 0x8566 +#define GL_ALPHA_MAX_CLAMP_INGR 0x8567 +#endif /* GL_INGR_color_clamp */ + +#ifndef GL_INGR_interlace_read +#define GL_INGR_interlace_read 1 +#define GL_INTERLACE_READ_INGR 0x8568 +#endif /* GL_INGR_interlace_read */ + +#ifndef GL_INTEL_blackhole_render +#define GL_INTEL_blackhole_render 1 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#endif /* GL_INTEL_blackhole_render */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE +#endif /* GL_INTEL_conservative_rasterization */ + +#ifndef GL_INTEL_fragment_shader_ordering +#define GL_INTEL_fragment_shader_ordering 1 +#endif /* GL_INTEL_fragment_shader_ordering */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 +typedef void (APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); +#endif +#endif /* GL_INTEL_framebuffer_CMAA */ + +#ifndef GL_INTEL_map_texture +#define GL_INTEL_map_texture 1 +#define GL_TEXTURE_MEMORY_LAYOUT_INTEL 0x83FF +#define GL_LAYOUT_DEFAULT_INTEL 0 +#define GL_LAYOUT_LINEAR_INTEL 1 +#define GL_LAYOUT_LINEAR_CPU_CACHED_INTEL 2 +typedef void (APIENTRYP PFNGLSYNCTEXTUREINTELPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLUNMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level); +typedef void *(APIENTRYP PFNGLMAPTEXTURE2DINTELPROC) (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSyncTextureINTEL (GLuint texture); +GLAPI void APIENTRY glUnmapTexture2DINTEL (GLuint texture, GLint level); +GLAPI void *APIENTRY glMapTexture2DINTEL (GLuint texture, GLint level, GLbitfield access, GLint *stride, GLenum *layout); +#endif +#endif /* GL_INTEL_map_texture */ + +#ifndef GL_INTEL_parallel_arrays +#define GL_INTEL_parallel_arrays 1 +#define GL_PARALLEL_ARRAYS_INTEL 0x83F4 +#define GL_VERTEX_ARRAY_PARALLEL_POINTERS_INTEL 0x83F5 +#define GL_NORMAL_ARRAY_PARALLEL_POINTERS_INTEL 0x83F6 +#define GL_COLOR_ARRAY_PARALLEL_POINTERS_INTEL 0x83F7 +#define GL_TEXTURE_COORD_ARRAY_PARALLEL_POINTERS_INTEL 0x83F8 +typedef void (APIENTRYP PFNGLVERTEXPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLNORMALPOINTERVINTELPROC) (GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLCOLORPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +typedef void (APIENTRYP PFNGLTEXCOORDPOINTERVINTELPROC) (GLint size, GLenum type, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glNormalPointervINTEL (GLenum type, const void **pointer); +GLAPI void APIENTRY glColorPointervINTEL (GLint size, GLenum type, const void **pointer); +GLAPI void APIENTRY glTexCoordPointervINTEL (GLint size, GLenum type, const void **pointer); +#endif +#endif /* GL_INTEL_parallel_arrays */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GLAPI void APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GLAPI void APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GLAPI void APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GLAPI void APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GLAPI void APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +GLAPI void APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GLAPI void APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESAX_texture_stack +#define GL_MESAX_texture_stack 1 +#define GL_TEXTURE_1D_STACK_MESAX 0x8759 +#define GL_TEXTURE_2D_STACK_MESAX 0x875A +#define GL_PROXY_TEXTURE_1D_STACK_MESAX 0x875B +#define GL_PROXY_TEXTURE_2D_STACK_MESAX 0x875C +#define GL_TEXTURE_1D_STACK_BINDING_MESAX 0x875D +#define GL_TEXTURE_2D_STACK_BINDING_MESAX 0x875E +#endif /* GL_MESAX_texture_stack */ + +#ifndef GL_MESA_framebuffer_flip_x +#define GL_MESA_framebuffer_flip_x 1 +#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC +#endif /* GL_MESA_framebuffer_flip_x */ + +#ifndef GL_MESA_framebuffer_flip_y +#define GL_MESA_framebuffer_flip_y 1 +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferParameteriMESA (GLenum target, GLenum pname, GLint param); +GLAPI void APIENTRY glGetFramebufferParameterivMESA (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_MESA_framebuffer_flip_y */ + +#ifndef GL_MESA_framebuffer_swap_xy +#define GL_MESA_framebuffer_swap_xy 1 +#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD +#endif /* GL_MESA_framebuffer_swap_xy */ + +#ifndef GL_MESA_pack_invert +#define GL_MESA_pack_invert 1 +#define GL_PACK_INVERT_MESA 0x8758 +#endif /* GL_MESA_pack_invert */ + +#ifndef GL_MESA_program_binary_formats +#define GL_MESA_program_binary_formats 1 +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#endif /* GL_MESA_program_binary_formats */ + +#ifndef GL_MESA_resize_buffers +#define GL_MESA_resize_buffers 1 +typedef void (APIENTRYP PFNGLRESIZEBUFFERSMESAPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glResizeBuffersMESA (void); +#endif +#endif /* GL_MESA_resize_buffers */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 +#endif /* GL_MESA_shader_integer_functions */ + +#ifndef GL_MESA_tile_raster_order +#define GL_MESA_tile_raster_order 1 +#define GL_TILE_RASTER_ORDER_FIXED_MESA 0x8BB8 +#define GL_TILE_RASTER_ORDER_INCREASING_X_MESA 0x8BB9 +#define GL_TILE_RASTER_ORDER_INCREASING_Y_MESA 0x8BBA +#endif /* GL_MESA_tile_raster_order */ + +#ifndef GL_MESA_window_pos +#define GL_MESA_window_pos 1 +typedef void (APIENTRYP PFNGLWINDOWPOS2DMESAPROC) (GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLWINDOWPOS2DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2FMESAPROC) (GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLWINDOWPOS2FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2IMESAPROC) (GLint x, GLint y); +typedef void (APIENTRYP PFNGLWINDOWPOS2IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS2SMESAPROC) (GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLWINDOWPOS2SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3DMESAPROC) (GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLWINDOWPOS3DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3FMESAPROC) (GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLWINDOWPOS3FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3IMESAPROC) (GLint x, GLint y, GLint z); +typedef void (APIENTRYP PFNGLWINDOWPOS3IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS3SMESAPROC) (GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLWINDOWPOS3SVMESAPROC) (const GLshort *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4DMESAPROC) (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLWINDOWPOS4DVMESAPROC) (const GLdouble *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4FMESAPROC) (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLWINDOWPOS4FVMESAPROC) (const GLfloat *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4IMESAPROC) (GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLWINDOWPOS4IVMESAPROC) (const GLint *v); +typedef void (APIENTRYP PFNGLWINDOWPOS4SMESAPROC) (GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLWINDOWPOS4SVMESAPROC) (const GLshort *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glWindowPos2dMESA (GLdouble x, GLdouble y); +GLAPI void APIENTRY glWindowPos2dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos2fMESA (GLfloat x, GLfloat y); +GLAPI void APIENTRY glWindowPos2fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos2iMESA (GLint x, GLint y); +GLAPI void APIENTRY glWindowPos2ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos2sMESA (GLshort x, GLshort y); +GLAPI void APIENTRY glWindowPos2svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos3dMESA (GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glWindowPos3dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos3fMESA (GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glWindowPos3fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos3iMESA (GLint x, GLint y, GLint z); +GLAPI void APIENTRY glWindowPos3ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos3sMESA (GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glWindowPos3svMESA (const GLshort *v); +GLAPI void APIENTRY glWindowPos4dMESA (GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glWindowPos4dvMESA (const GLdouble *v); +GLAPI void APIENTRY glWindowPos4fMESA (GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glWindowPos4fvMESA (const GLfloat *v); +GLAPI void APIENTRY glWindowPos4iMESA (GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glWindowPos4ivMESA (const GLint *v); +GLAPI void APIENTRY glWindowPos4sMESA (GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glWindowPos4svMESA (const GLshort *v); +#endif +#endif /* GL_MESA_window_pos */ + +#ifndef GL_MESA_ycbcr_texture +#define GL_MESA_ycbcr_texture 1 +#define GL_UNSIGNED_SHORT_8_8_MESA 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_MESA 0x85BB +#define GL_YCBCR_MESA 0x8757 +#endif /* GL_MESA_ycbcr_texture */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +#ifndef GL_NVX_conditional_render +#define GL_NVX_conditional_render 1 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVXPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNVX (GLuint id); +GLAPI void APIENTRY glEndConditionalRenderNVX (void); +#endif +#endif /* GL_NVX_conditional_render */ + +#ifndef GL_NVX_gpu_memory_info +#define GL_NVX_gpu_memory_info 1 +#define GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX 0x9047 +#define GL_GPU_MEMORY_INFO_TOTAL_AVAILABLE_MEMORY_NVX 0x9048 +#define GL_GPU_MEMORY_INFO_CURRENT_AVAILABLE_VIDMEM_NVX 0x9049 +#define GL_GPU_MEMORY_INFO_EVICTION_COUNT_NVX 0x904A +#define GL_GPU_MEMORY_INFO_EVICTED_MEMORY_NVX 0x904B +#endif /* GL_NVX_gpu_memory_info */ + +#ifndef GL_NVX_gpu_multicast2 +#define GL_NVX_gpu_multicast2 1 +#define GL_UPLOAD_GPU_MASK_NVX 0x954A +typedef void (APIENTRYP PFNGLUPLOADGPUMASKNVXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLMULTICASTVIEWPORTARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTICASTVIEWPORTPOSITIONWSCALENVXPROC) (GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); +typedef void (APIENTRYP PFNGLMULTICASTSCISSORARRAYVNVXPROC) (GLuint gpu, GLuint first, GLsizei count, const GLint *v); +typedef GLuint (APIENTRYP PFNGLASYNCCOPYBUFFERSUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +typedef GLuint (APIENTRYP PFNGLASYNCCOPYIMAGESUBDATANVXPROC) (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glUploadGpuMaskNVX (GLbitfield mask); +GLAPI void APIENTRY glMulticastViewportArrayvNVX (GLuint gpu, GLuint first, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glMulticastViewportPositionWScaleNVX (GLuint gpu, GLuint index, GLfloat xcoeff, GLfloat ycoeff); +GLAPI void APIENTRY glMulticastScissorArrayvNVX (GLuint gpu, GLuint first, GLsizei count, const GLint *v); +GLAPI GLuint APIENTRY glAsyncCopyBufferSubDataNVX (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *fenceValueArray, GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +GLAPI GLuint APIENTRY glAsyncCopyImageSubDataNVX (GLsizei waitSemaphoreCount, const GLuint *waitSemaphoreArray, const GLuint64 *waitValueArray, GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth, GLsizei signalSemaphoreCount, const GLuint *signalSemaphoreArray, const GLuint64 *signalValueArray); +#endif +#endif /* GL_NVX_gpu_multicast2 */ + +#ifndef GL_NVX_linked_gpu_multicast +#define GL_NVX_linked_gpu_multicast 1 +#define GL_LGPU_SEPARATE_STORAGE_BIT_NVX 0x0800 +#define GL_MAX_LGPU_GPUS_NVX 0x92BA +typedef void (APIENTRYP PFNGLLGPUNAMEDBUFFERSUBDATANVXPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLLGPUCOPYIMAGESUBDATANVXPROC) (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +typedef void (APIENTRYP PFNGLLGPUINTERLOCKNVXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glLGPUNamedBufferSubDataNVX (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glLGPUCopyImageSubDataNVX (GLuint sourceGpu, GLbitfield destinationGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srxY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +GLAPI void APIENTRY glLGPUInterlockNVX (void); +#endif +#endif /* GL_NVX_linked_gpu_multicast */ + +#ifndef GL_NVX_progress_fence +#define GL_NVX_progress_fence 1 +typedef GLuint (APIENTRYP PFNGLCREATEPROGRESSFENCENVXPROC) (void); +typedef void (APIENTRYP PFNGLSIGNALSEMAPHOREUI64NVXPROC) (GLuint signalGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +typedef void (APIENTRYP PFNGLWAITSEMAPHOREUI64NVXPROC) (GLuint waitGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +typedef void (APIENTRYP PFNGLCLIENTWAITSEMAPHOREUI64NVXPROC) (GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glCreateProgressFenceNVX (void); +GLAPI void APIENTRY glSignalSemaphoreui64NVX (GLuint signalGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +GLAPI void APIENTRY glWaitSemaphoreui64NVX (GLuint waitGpu, GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +GLAPI void APIENTRY glClientWaitSemaphoreui64NVX (GLsizei fenceObjectCount, const GLuint *semaphoreArray, const GLuint64 *fenceValueArray); +#endif +#endif /* GL_NVX_progress_fence */ + +#ifndef GL_NV_alpha_to_coverage_dither_control +#define GL_NV_alpha_to_coverage_dither_control 1 +#define GL_ALPHA_TO_COVERAGE_DITHER_DEFAULT_NV 0x934D +#define GL_ALPHA_TO_COVERAGE_DITHER_ENABLE_NV 0x934E +#define GL_ALPHA_TO_COVERAGE_DITHER_DISABLE_NV 0x934F +#define GL_ALPHA_TO_COVERAGE_DITHER_MODE_NV 0x92BF +typedef void (APIENTRYP PFNGLALPHATOCOVERAGEDITHERCONTROLNVPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAlphaToCoverageDitherControlNV (GLenum mode); +#endif +#endif /* GL_NV_alpha_to_coverage_dither_control */ + +#ifndef GL_NV_bindless_multi_draw_indirect +#define GL_NV_bindless_multi_draw_indirect 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect */ + +#ifndef GL_NV_bindless_multi_draw_indirect_count +#define GL_NV_bindless_multi_draw_indirect_count 1 +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTBINDLESSCOUNTNVPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMultiDrawArraysIndirectBindlessCountNV (GLenum mode, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +GLAPI void APIENTRY glMultiDrawElementsIndirectBindlessCountNV (GLenum mode, GLenum type, const void *indirect, GLsizei drawCount, GLsizei maxDrawCount, GLsizei stride, GLint vertexBufferCount); +#endif +#endif /* GL_NV_bindless_multi_draw_indirect_count */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint64 APIENTRY glGetTextureHandleNV (GLuint texture); +GLAPI GLuint64 APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GLAPI void APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GLAPI void APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GLAPI GLuint64 APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GLAPI void APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GLAPI void APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GLAPI void APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GLAPI void APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GLAPI void APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GLAPI void APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GLAPI GLboolean APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GLAPI GLboolean APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GLAPI void APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 +#endif /* GL_NV_blend_minmax_factor */ + +#ifndef GL_NV_blend_square +#define GL_NV_blend_square 1 +#endif /* GL_NV_blend_square */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +typedef void (APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#endif +#endif /* GL_NV_clip_space_w_scaling */ + +#ifndef GL_NV_command_list +#define GL_NV_command_list 1 +#define GL_TERMINATE_SEQUENCE_COMMAND_NV 0x0000 +#define GL_NOP_COMMAND_NV 0x0001 +#define GL_DRAW_ELEMENTS_COMMAND_NV 0x0002 +#define GL_DRAW_ARRAYS_COMMAND_NV 0x0003 +#define GL_DRAW_ELEMENTS_STRIP_COMMAND_NV 0x0004 +#define GL_DRAW_ARRAYS_STRIP_COMMAND_NV 0x0005 +#define GL_DRAW_ELEMENTS_INSTANCED_COMMAND_NV 0x0006 +#define GL_DRAW_ARRAYS_INSTANCED_COMMAND_NV 0x0007 +#define GL_ELEMENT_ADDRESS_COMMAND_NV 0x0008 +#define GL_ATTRIBUTE_ADDRESS_COMMAND_NV 0x0009 +#define GL_UNIFORM_ADDRESS_COMMAND_NV 0x000A +#define GL_BLEND_COLOR_COMMAND_NV 0x000B +#define GL_STENCIL_REF_COMMAND_NV 0x000C +#define GL_LINE_WIDTH_COMMAND_NV 0x000D +#define GL_POLYGON_OFFSET_COMMAND_NV 0x000E +#define GL_ALPHA_REF_COMMAND_NV 0x000F +#define GL_VIEWPORT_COMMAND_NV 0x0010 +#define GL_SCISSOR_COMMAND_NV 0x0011 +#define GL_FRONT_FACE_COMMAND_NV 0x0012 +typedef void (APIENTRYP PFNGLCREATESTATESNVPROC) (GLsizei n, GLuint *states); +typedef void (APIENTRYP PFNGLDELETESTATESNVPROC) (GLsizei n, const GLuint *states); +typedef GLboolean (APIENTRYP PFNGLISSTATENVPROC) (GLuint state); +typedef void (APIENTRYP PFNGLSTATECAPTURENVPROC) (GLuint state, GLenum mode); +typedef GLuint (APIENTRYP PFNGLGETCOMMANDHEADERNVPROC) (GLenum tokenID, GLuint size); +typedef GLushort (APIENTRYP PFNGLGETSTAGEINDEXNVPROC) (GLenum shadertype); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSNVPROC) (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSADDRESSNVPROC) (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESNVPROC) (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLDRAWCOMMANDSSTATESADDRESSNVPROC) (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLCREATECOMMANDLISTSNVPROC) (GLsizei n, GLuint *lists); +typedef void (APIENTRYP PFNGLDELETECOMMANDLISTSNVPROC) (GLsizei n, const GLuint *lists); +typedef GLboolean (APIENTRYP PFNGLISCOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP PFNGLLISTDRAWCOMMANDSSTATESCLIENTNVPROC) (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +typedef void (APIENTRYP PFNGLCOMMANDLISTSEGMENTSNVPROC) (GLuint list, GLuint segments); +typedef void (APIENTRYP PFNGLCOMPILECOMMANDLISTNVPROC) (GLuint list); +typedef void (APIENTRYP PFNGLCALLCOMMANDLISTNVPROC) (GLuint list); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCreateStatesNV (GLsizei n, GLuint *states); +GLAPI void APIENTRY glDeleteStatesNV (GLsizei n, const GLuint *states); +GLAPI GLboolean APIENTRY glIsStateNV (GLuint state); +GLAPI void APIENTRY glStateCaptureNV (GLuint state, GLenum mode); +GLAPI GLuint APIENTRY glGetCommandHeaderNV (GLenum tokenID, GLuint size); +GLAPI GLushort APIENTRY glGetStageIndexNV (GLenum shadertype); +GLAPI void APIENTRY glDrawCommandsNV (GLenum primitiveMode, GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, GLuint count); +GLAPI void APIENTRY glDrawCommandsAddressNV (GLenum primitiveMode, const GLuint64 *indirects, const GLsizei *sizes, GLuint count); +GLAPI void APIENTRY glDrawCommandsStatesNV (GLuint buffer, const GLintptr *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glDrawCommandsStatesAddressNV (const GLuint64 *indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glCreateCommandListsNV (GLsizei n, GLuint *lists); +GLAPI void APIENTRY glDeleteCommandListsNV (GLsizei n, const GLuint *lists); +GLAPI GLboolean APIENTRY glIsCommandListNV (GLuint list); +GLAPI void APIENTRY glListDrawCommandsStatesClientNV (GLuint list, GLuint segment, const void **indirects, const GLsizei *sizes, const GLuint *states, const GLuint *fbos, GLuint count); +GLAPI void APIENTRY glCommandListSegmentsNV (GLuint list, GLuint segments); +GLAPI void APIENTRY glCompileCommandListNV (GLuint list); +GLAPI void APIENTRY glCallCommandListNV (GLuint list); +#endif +#endif /* GL_NV_command_list */ + +#ifndef GL_NV_compute_program5 +#define GL_NV_compute_program5 1 +#define GL_COMPUTE_PROGRAM_NV 0x90FB +#define GL_COMPUTE_PROGRAM_PARAMETER_BUFFER_NV 0x90FC +#endif /* GL_NV_compute_program5 */ + +#ifndef GL_NV_compute_shader_derivatives +#define GL_NV_compute_shader_derivatives 1 +#endif /* GL_NV_compute_shader_derivatives */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GLAPI void APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); +#endif +#endif /* GL_NV_conservative_raster */ + +#ifndef GL_NV_conservative_raster_dilate +#define GL_NV_conservative_raster_dilate 1 +#define GL_CONSERVATIVE_RASTER_DILATE_NV 0x9379 +#define GL_CONSERVATIVE_RASTER_DILATE_RANGE_NV 0x937A +#define GL_CONSERVATIVE_RASTER_DILATE_GRANULARITY_NV 0x937B +typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERFNVPROC) (GLenum pname, GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConservativeRasterParameterfNV (GLenum pname, GLfloat value); +#endif +#endif /* GL_NV_conservative_raster_dilate */ + +#ifndef GL_NV_conservative_raster_pre_snap +#define GL_NV_conservative_raster_pre_snap 1 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#endif /* GL_NV_conservative_raster_pre_snap */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F +typedef void (APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); +#endif +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +#ifndef GL_NV_conservative_raster_underestimation +#define GL_NV_conservative_raster_underestimation 1 +#endif /* GL_NV_conservative_raster_underestimation */ + +#ifndef GL_NV_copy_depth_to_color +#define GL_NV_copy_depth_to_color 1 +#define GL_DEPTH_STENCIL_TO_RGBA_NV 0x886E +#define GL_DEPTH_STENCIL_TO_BGRA_NV 0x886F +#endif /* GL_NV_copy_depth_to_color */ + +#ifndef GL_NV_copy_image +#define GL_NV_copy_image 1 +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATANVPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCopyImageSubDataNV (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_NV_copy_image */ + +#ifndef GL_NV_deep_texture3D +#define GL_NV_deep_texture3D 1 +#define GL_MAX_DEEP_3D_TEXTURE_WIDTH_HEIGHT_NV 0x90D0 +#define GL_MAX_DEEP_3D_TEXTURE_DEPTH_NV 0x90D1 +#endif /* GL_NV_deep_texture3D */ + +#ifndef GL_NV_depth_buffer_float +#define GL_NV_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F_NV 0x8DAB +#define GL_DEPTH32F_STENCIL8_NV 0x8DAC +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV_NV 0x8DAD +#define GL_DEPTH_BUFFER_FLOAT_MODE_NV 0x8DAF +typedef void (APIENTRYP PFNGLDEPTHRANGEDNVPROC) (GLdouble zNear, GLdouble zFar); +typedef void (APIENTRYP PFNGLCLEARDEPTHDNVPROC) (GLdouble depth); +typedef void (APIENTRYP PFNGLDEPTHBOUNDSDNVPROC) (GLdouble zmin, GLdouble zmax); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDepthRangedNV (GLdouble zNear, GLdouble zFar); +GLAPI void APIENTRY glClearDepthdNV (GLdouble depth); +GLAPI void APIENTRY glDepthBoundsdNV (GLdouble zmin, GLdouble zmax); +#endif +#endif /* GL_NV_depth_buffer_float */ + +#ifndef GL_NV_depth_clamp +#define GL_NV_depth_clamp 1 +#define GL_DEPTH_CLAMP_NV 0x864F +#endif /* GL_NV_depth_clamp */ + +#ifndef GL_NV_draw_texture +#define GL_NV_draw_texture 1 +typedef void (APIENTRYP PFNGLDRAWTEXTURENVPROC) (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawTextureNV (GLuint texture, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +#endif +#endif /* GL_NV_draw_texture */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 +typedef void (APIENTRY *GLVULKANPROCNV)(void); +typedef void (APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); +typedef void (APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +GLAPI GLVULKANPROCNV APIENTRY glGetVkProcAddrNV (const GLchar *name); +GLAPI void APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); +GLAPI void APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); +GLAPI void APIENTRY glSignalVkFenceNV (GLuint64 vkFence); +#endif +#endif /* GL_NV_draw_vulkan_image */ + +#ifndef GL_NV_evaluators +#define GL_NV_evaluators 1 +#define GL_EVAL_2D_NV 0x86C0 +#define GL_EVAL_TRIANGULAR_2D_NV 0x86C1 +#define GL_MAP_TESSELLATION_NV 0x86C2 +#define GL_MAP_ATTRIB_U_ORDER_NV 0x86C3 +#define GL_MAP_ATTRIB_V_ORDER_NV 0x86C4 +#define GL_EVAL_FRACTIONAL_TESSELLATION_NV 0x86C5 +#define GL_EVAL_VERTEX_ATTRIB0_NV 0x86C6 +#define GL_EVAL_VERTEX_ATTRIB1_NV 0x86C7 +#define GL_EVAL_VERTEX_ATTRIB2_NV 0x86C8 +#define GL_EVAL_VERTEX_ATTRIB3_NV 0x86C9 +#define GL_EVAL_VERTEX_ATTRIB4_NV 0x86CA +#define GL_EVAL_VERTEX_ATTRIB5_NV 0x86CB +#define GL_EVAL_VERTEX_ATTRIB6_NV 0x86CC +#define GL_EVAL_VERTEX_ATTRIB7_NV 0x86CD +#define GL_EVAL_VERTEX_ATTRIB8_NV 0x86CE +#define GL_EVAL_VERTEX_ATTRIB9_NV 0x86CF +#define GL_EVAL_VERTEX_ATTRIB10_NV 0x86D0 +#define GL_EVAL_VERTEX_ATTRIB11_NV 0x86D1 +#define GL_EVAL_VERTEX_ATTRIB12_NV 0x86D2 +#define GL_EVAL_VERTEX_ATTRIB13_NV 0x86D3 +#define GL_EVAL_VERTEX_ATTRIB14_NV 0x86D4 +#define GL_EVAL_VERTEX_ATTRIB15_NV 0x86D5 +#define GL_MAX_MAP_TESSELLATION_NV 0x86D6 +#define GL_MAX_RATIONAL_EVAL_ORDER_NV 0x86D7 +typedef void (APIENTRYP PFNGLMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +typedef void (APIENTRYP PFNGLMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPCONTROLPOINTSNVPROC) (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERIVNVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPPARAMETERFVNVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERIVNVPROC) (GLenum target, GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETMAPATTRIBPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLEVALMAPSNVPROC) (GLenum target, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLint uorder, GLint vorder, GLboolean packed, const void *points); +GLAPI void APIENTRY glMapParameterivNV (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glMapParameterfvNV (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetMapControlPointsNV (GLenum target, GLuint index, GLenum type, GLsizei ustride, GLsizei vstride, GLboolean packed, void *points); +GLAPI void APIENTRY glGetMapParameterivNV (GLenum target, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapParameterfvNV (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetMapAttribParameterivNV (GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetMapAttribParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glEvalMapsNV (GLenum target, GLenum mode); +#endif +#endif /* GL_NV_evaluators */ + +#ifndef GL_NV_explicit_multisample +#define GL_NV_explicit_multisample 1 +#define GL_SAMPLE_POSITION_NV 0x8E50 +#define GL_SAMPLE_MASK_NV 0x8E51 +#define GL_SAMPLE_MASK_VALUE_NV 0x8E52 +#define GL_TEXTURE_BINDING_RENDERBUFFER_NV 0x8E53 +#define GL_TEXTURE_RENDERBUFFER_DATA_STORE_BINDING_NV 0x8E54 +#define GL_TEXTURE_RENDERBUFFER_NV 0x8E55 +#define GL_SAMPLER_RENDERBUFFER_NV 0x8E56 +#define GL_INT_SAMPLER_RENDERBUFFER_NV 0x8E57 +#define GL_UNSIGNED_INT_SAMPLER_RENDERBUFFER_NV 0x8E58 +#define GL_MAX_SAMPLE_MASK_WORDS_NV 0x8E59 +typedef void (APIENTRYP PFNGLGETMULTISAMPLEFVNVPROC) (GLenum pname, GLuint index, GLfloat *val); +typedef void (APIENTRYP PFNGLSAMPLEMASKINDEXEDNVPROC) (GLuint index, GLbitfield mask); +typedef void (APIENTRYP PFNGLTEXRENDERBUFFERNVPROC) (GLenum target, GLuint renderbuffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMultisamplefvNV (GLenum pname, GLuint index, GLfloat *val); +GLAPI void APIENTRY glSampleMaskIndexedNV (GLuint index, GLbitfield mask); +GLAPI void APIENTRY glTexRenderbufferNV (GLenum target, GLuint renderbuffer); +#endif +#endif /* GL_NV_explicit_multisample */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GLAPI void APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GLAPI GLboolean APIENTRY glIsFenceNV (GLuint fence); +GLAPI GLboolean APIENTRY glTestFenceNV (GLuint fence); +GLAPI void APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GLAPI void APIENTRY glFinishFenceNV (GLuint fence); +GLAPI void APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_float_buffer +#define GL_NV_float_buffer 1 +#define GL_FLOAT_R_NV 0x8880 +#define GL_FLOAT_RG_NV 0x8881 +#define GL_FLOAT_RGB_NV 0x8882 +#define GL_FLOAT_RGBA_NV 0x8883 +#define GL_FLOAT_R16_NV 0x8884 +#define GL_FLOAT_R32_NV 0x8885 +#define GL_FLOAT_RG16_NV 0x8886 +#define GL_FLOAT_RG32_NV 0x8887 +#define GL_FLOAT_RGB16_NV 0x8888 +#define GL_FLOAT_RGB32_NV 0x8889 +#define GL_FLOAT_RGBA16_NV 0x888A +#define GL_FLOAT_RGBA32_NV 0x888B +#define GL_TEXTURE_FLOAT_COMPONENTS_NV 0x888C +#define GL_FLOAT_CLEAR_COLOR_VALUE_NV 0x888D +#define GL_FLOAT_RGBA_MODE_NV 0x888E +#endif /* GL_NV_float_buffer */ + +#ifndef GL_NV_fog_distance +#define GL_NV_fog_distance 1 +#define GL_FOG_DISTANCE_MODE_NV 0x855A +#define GL_EYE_RADIAL_NV 0x855B +#define GL_EYE_PLANE_ABSOLUTE_NV 0x855C +#endif /* GL_NV_fog_distance */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_program +#define GL_NV_fragment_program 1 +#define GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV 0x8868 +#define GL_FRAGMENT_PROGRAM_NV 0x8870 +#define GL_MAX_TEXTURE_COORDS_NV 0x8871 +#define GL_MAX_TEXTURE_IMAGE_UNITS_NV 0x8872 +#define GL_FRAGMENT_PROGRAM_BINDING_NV 0x8873 +#define GL_PROGRAM_ERROR_STRING_NV 0x8874 +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4FVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMNAMEDPARAMETER4DVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERFVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMNAMEDPARAMETERDVNVPROC) (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramNamedParameter4fNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramNamedParameter4fvNV (GLuint id, GLsizei len, const GLubyte *name, const GLfloat *v); +GLAPI void APIENTRY glProgramNamedParameter4dNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramNamedParameter4dvNV (GLuint id, GLsizei len, const GLubyte *name, const GLdouble *v); +GLAPI void APIENTRY glGetProgramNamedParameterfvNV (GLuint id, GLsizei len, const GLubyte *name, GLfloat *params); +GLAPI void APIENTRY glGetProgramNamedParameterdvNV (GLuint id, GLsizei len, const GLubyte *name, GLdouble *params); +#endif +#endif /* GL_NV_fragment_program */ + +#ifndef GL_NV_fragment_program2 +#define GL_NV_fragment_program2 1 +#define GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV 0x88F4 +#define GL_MAX_PROGRAM_CALL_DEPTH_NV 0x88F5 +#define GL_MAX_PROGRAM_IF_DEPTH_NV 0x88F6 +#define GL_MAX_PROGRAM_LOOP_DEPTH_NV 0x88F7 +#define GL_MAX_PROGRAM_LOOP_COUNT_NV 0x88F8 +#endif /* GL_NV_fragment_program2 */ + +#ifndef GL_NV_fragment_program4 +#define GL_NV_fragment_program4 1 +#endif /* GL_NV_fragment_program4 */ + +#ifndef GL_NV_fragment_program_option +#define GL_NV_fragment_program_option 1 +#endif /* GL_NV_fragment_program_option */ + +#ifndef GL_NV_fragment_shader_barycentric +#define GL_NV_fragment_shader_barycentric 1 +#endif /* GL_NV_fragment_shader_barycentric */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufSize, GLfloat *v); +typedef void (APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GLAPI void APIENTRY glGetCoverageModulationTableNV (GLsizei bufSize, GLfloat *v); +GLAPI void APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample_coverage +#define GL_NV_framebuffer_multisample_coverage 1 +#define GL_RENDERBUFFER_COVERAGE_SAMPLES_NV 0x8CAB +#define GL_RENDERBUFFER_COLOR_SAMPLES_NV 0x8E10 +#define GL_MAX_MULTISAMPLE_COVERAGE_MODES_NV 0x8E11 +#define GL_MULTISAMPLE_COVERAGE_MODES_NV 0x8E12 +typedef void (APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderbufferStorageMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample_coverage */ + +#ifndef GL_NV_geometry_program4 +#define GL_NV_geometry_program4 1 +#define GL_GEOMETRY_PROGRAM_NV 0x8C26 +#define GL_MAX_PROGRAM_OUTPUT_VERTICES_NV 0x8C27 +#define GL_MAX_PROGRAM_TOTAL_OUTPUT_COMPONENTS_NV 0x8C28 +typedef void (APIENTRYP PFNGLPROGRAMVERTEXLIMITNVPROC) (GLenum target, GLint limit); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREFACEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramVertexLimitNV (GLenum target, GLint limit); +GLAPI void APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +GLAPI void APIENTRY glFramebufferTextureFaceEXT (GLenum target, GLenum attachment, GLuint texture, GLint level, GLenum face); +#endif +#endif /* GL_NV_geometry_program4 */ + +#ifndef GL_NV_geometry_shader4 +#define GL_NV_geometry_shader4 1 +#endif /* GL_NV_geometry_shader4 */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_multicast +#define GL_NV_gpu_multicast 1 +#define GL_PER_GPU_STORAGE_BIT_NV 0x0800 +#define GL_MULTICAST_GPUS_NV 0x92BA +#define GL_RENDER_GPU_MASK_NV 0x9558 +#define GL_PER_GPU_STORAGE_NV 0x9548 +#define GL_MULTICAST_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9549 +typedef void (APIENTRYP PFNGLRENDERGPUMASKNVPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLMULTICASTBUFFERSUBDATANVPROC) (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +typedef void (APIENTRYP PFNGLMULTICASTCOPYBUFFERSUBDATANVPROC) (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLMULTICASTCOPYIMAGESUBDATANVPROC) (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +typedef void (APIENTRYP PFNGLMULTICASTBLITFRAMEBUFFERNVPROC) (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +typedef void (APIENTRYP PFNGLMULTICASTFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLMULTICASTBARRIERNVPROC) (void); +typedef void (APIENTRYP PFNGLMULTICASTWAITSYNCNVPROC) (GLuint signalGpu, GLbitfield waitGpuMask); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUIVNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); +typedef void (APIENTRYP PFNGLMULTICASTGETQUERYOBJECTUI64VNVPROC) (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glRenderGpuMaskNV (GLbitfield mask); +GLAPI void APIENTRY glMulticastBufferSubDataNV (GLbitfield gpuMask, GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data); +GLAPI void APIENTRY glMulticastCopyBufferSubDataNV (GLuint readGpu, GLbitfield writeGpuMask, GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +GLAPI void APIENTRY glMulticastCopyImageSubDataNV (GLuint srcGpu, GLbitfield dstGpuMask, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI void APIENTRY glMulticastBlitFramebufferNV (GLuint srcGpu, GLuint dstGpu, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +GLAPI void APIENTRY glMulticastFramebufferSampleLocationsfvNV (GLuint gpu, GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glMulticastBarrierNV (void); +GLAPI void APIENTRY glMulticastWaitSyncNV (GLuint signalGpu, GLbitfield waitGpuMask); +GLAPI void APIENTRY glMulticastGetQueryObjectivNV (GLuint gpu, GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glMulticastGetQueryObjectuivNV (GLuint gpu, GLuint id, GLenum pname, GLuint *params); +GLAPI void APIENTRY glMulticastGetQueryObjecti64vNV (GLuint gpu, GLuint id, GLenum pname, GLint64 *params); +GLAPI void APIENTRY glMulticastGetQueryObjectui64vNV (GLuint gpu, GLuint id, GLenum pname, GLuint64 *params); +#endif +#endif /* GL_NV_gpu_multicast */ + +#ifndef GL_NV_gpu_program4 +#define GL_NV_gpu_program4 1 +#define GL_MIN_PROGRAM_TEXEL_OFFSET_NV 0x8904 +#define GL_MAX_PROGRAM_TEXEL_OFFSET_NV 0x8905 +#define GL_PROGRAM_ATTRIB_COMPONENTS_NV 0x8906 +#define GL_PROGRAM_RESULT_COMPONENTS_NV 0x8907 +#define GL_MAX_PROGRAM_ATTRIB_COMPONENTS_NV 0x8908 +#define GL_MAX_PROGRAM_RESULT_COMPONENTS_NV 0x8909 +#define GL_MAX_PROGRAM_GENERIC_ATTRIBS_NV 0x8DA5 +#define GL_MAX_PROGRAM_GENERIC_RESULTS_NV 0x8DA6 +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMLOCALPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4INVPROC) (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4IVNVPROC) (GLenum target, GLuint index, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4IVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UINVPROC) (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERI4UIVNVPROC) (GLenum target, GLuint index, const GLuint *params); +typedef void (APIENTRYP PFNGLPROGRAMENVPARAMETERSI4UIVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMLOCALPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIIVNVPROC) (GLenum target, GLuint index, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMENVPARAMETERIUIVNVPROC) (GLenum target, GLuint index, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramLocalParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramLocalParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramLocalParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramLocalParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramLocalParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramLocalParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParameterI4iNV (GLenum target, GLuint index, GLint x, GLint y, GLint z, GLint w); +GLAPI void APIENTRY glProgramEnvParameterI4ivNV (GLenum target, GLuint index, const GLint *params); +GLAPI void APIENTRY glProgramEnvParametersI4ivNV (GLenum target, GLuint index, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramEnvParameterI4uiNV (GLenum target, GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); +GLAPI void APIENTRY glProgramEnvParameterI4uivNV (GLenum target, GLuint index, const GLuint *params); +GLAPI void APIENTRY glProgramEnvParametersI4uivNV (GLenum target, GLuint index, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramLocalParameterIuivNV (GLenum target, GLuint index, GLuint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIivNV (GLenum target, GLuint index, GLint *params); +GLAPI void APIENTRY glGetProgramEnvParameterIuivNV (GLenum target, GLuint index, GLuint *params); +#endif +#endif /* GL_NV_gpu_program4 */ + +#ifndef GL_NV_gpu_program5 +#define GL_NV_gpu_program5 1 +#define GL_MAX_GEOMETRY_PROGRAM_INVOCATIONS_NV 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_NV 0x8E5C +#define GL_FRAGMENT_PROGRAM_INTERPOLATION_OFFSET_BITS_NV 0x8E5D +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_NV 0x8E5F +#define GL_MAX_PROGRAM_SUBROUTINE_PARAMETERS_NV 0x8F44 +#define GL_MAX_PROGRAM_SUBROUTINE_NUM_NV 0x8F45 +typedef void (APIENTRYP PFNGLPROGRAMSUBROUTINEPARAMETERSUIVNVPROC) (GLenum target, GLsizei count, const GLuint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSUBROUTINEPARAMETERUIVNVPROC) (GLenum target, GLuint index, GLuint *param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramSubroutineParametersuivNV (GLenum target, GLsizei count, const GLuint *params); +GLAPI void APIENTRY glGetProgramSubroutineParameteruivNV (GLenum target, GLuint index, GLuint *param); +#endif +#endif /* GL_NV_gpu_program5 */ + +#ifndef GL_NV_gpu_program5_mem_extended +#define GL_NV_gpu_program5_mem_extended 1 +#endif /* GL_NV_gpu_program5_mem_extended */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_half_float +#define GL_NV_half_float 1 +typedef unsigned short GLhalfNV; +#define GL_HALF_FLOAT_NV 0x140B +typedef void (APIENTRYP PFNGLVERTEX2HNVPROC) (GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEX2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX3HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEX3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEX4HNVPROC) (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEX4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLNORMAL3HNVPROC) (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +typedef void (APIENTRYP PFNGLNORMAL3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLCOLOR4HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +typedef void (APIENTRYP PFNGLCOLOR4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD1HNVPROC) (GLhalfNV s); +typedef void (APIENTRYP PFNGLTEXCOORD1HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD2HNVPROC) (GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLTEXCOORD2HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD3HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLTEXCOORD3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLTEXCOORD4HNVPROC) (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLTEXCOORD4HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HNVPROC) (GLenum target, GLhalfNV s); +typedef void (APIENTRYP PFNGLMULTITEXCOORD1HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t); +typedef void (APIENTRYP PFNGLMULTITEXCOORD2HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +typedef void (APIENTRYP PFNGLMULTITEXCOORD3HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HNVPROC) (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +typedef void (APIENTRYP PFNGLMULTITEXCOORD4HVNVPROC) (GLenum target, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLFOGCOORDHNVPROC) (GLhalfNV fog); +typedef void (APIENTRYP PFNGLFOGCOORDHVNVPROC) (const GLhalfNV *fog); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HNVPROC) (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +typedef void (APIENTRYP PFNGLSECONDARYCOLOR3HVNVPROC) (const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHNVPROC) (GLhalfNV weight); +typedef void (APIENTRYP PFNGLVERTEXWEIGHTHVNVPROC) (const GLhalfNV *weight); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HNVPROC) (GLuint index, GLhalfNV x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HNVPROC) (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4HVNVPROC) (GLuint index, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4HVNVPROC) (GLuint index, GLsizei n, const GLhalfNV *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertex2hNV (GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertex2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex3hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertex3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertex4hNV (GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertex4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glNormal3hNV (GLhalfNV nx, GLhalfNV ny, GLhalfNV nz); +GLAPI void APIENTRY glNormal3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glColor4hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue, GLhalfNV alpha); +GLAPI void APIENTRY glColor4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord1hNV (GLhalfNV s); +GLAPI void APIENTRY glTexCoord1hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord2hNV (GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glTexCoord2hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord3hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glTexCoord3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glTexCoord4hNV (GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glTexCoord4hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord1hNV (GLenum target, GLhalfNV s); +GLAPI void APIENTRY glMultiTexCoord1hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord2hNV (GLenum target, GLhalfNV s, GLhalfNV t); +GLAPI void APIENTRY glMultiTexCoord2hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord3hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r); +GLAPI void APIENTRY glMultiTexCoord3hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glMultiTexCoord4hNV (GLenum target, GLhalfNV s, GLhalfNV t, GLhalfNV r, GLhalfNV q); +GLAPI void APIENTRY glMultiTexCoord4hvNV (GLenum target, const GLhalfNV *v); +GLAPI void APIENTRY glFogCoordhNV (GLhalfNV fog); +GLAPI void APIENTRY glFogCoordhvNV (const GLhalfNV *fog); +GLAPI void APIENTRY glSecondaryColor3hNV (GLhalfNV red, GLhalfNV green, GLhalfNV blue); +GLAPI void APIENTRY glSecondaryColor3hvNV (const GLhalfNV *v); +GLAPI void APIENTRY glVertexWeighthNV (GLhalfNV weight); +GLAPI void APIENTRY glVertexWeighthvNV (const GLhalfNV *weight); +GLAPI void APIENTRY glVertexAttrib1hNV (GLuint index, GLhalfNV x); +GLAPI void APIENTRY glVertexAttrib1hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib2hNV (GLuint index, GLhalfNV x, GLhalfNV y); +GLAPI void APIENTRY glVertexAttrib2hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib3hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z); +GLAPI void APIENTRY glVertexAttrib3hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttrib4hNV (GLuint index, GLhalfNV x, GLhalfNV y, GLhalfNV z, GLhalfNV w); +GLAPI void APIENTRY glVertexAttrib4hvNV (GLuint index, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs1hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs2hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs3hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +GLAPI void APIENTRY glVertexAttribs4hvNV (GLuint index, GLsizei n, const GLhalfNV *v); +#endif +#endif /* GL_NV_half_float */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#endif +#endif /* GL_NV_internalformat_sample_query */ + +#ifndef GL_NV_light_max_exponent +#define GL_NV_light_max_exponent 1 +#define GL_MAX_SHININESS_NV 0x8504 +#define GL_MAX_SPOT_EXPONENT_NV 0x8505 +#endif /* GL_NV_light_max_exponent */ + +#ifndef GL_NV_memory_attachment +#define GL_NV_memory_attachment 1 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +typedef void (APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +typedef void (APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); +typedef void (APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); +typedef void (APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +GLAPI void APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); +GLAPI void APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); +GLAPI void APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_NV_memory_attachment */ + +#ifndef GL_NV_memory_object_sparse +#define GL_NV_memory_object_sparse 1 +typedef void (APIENTRYP PFNGLBUFFERPAGECOMMITMENTMEMNVPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (APIENTRYP PFNGLTEXPAGECOMMITMENTMEMNVPROC) (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (APIENTRYP PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC) (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferPageCommitmentMemNV (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GLAPI void APIENTRY glTexPageCommitmentMemNV (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +GLAPI void APIENTRY glNamedBufferPageCommitmentMemNV (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GLAPI void APIENTRY glTexturePageCommitmentMemNV (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#endif +#endif /* GL_NV_memory_object_sparse */ + +#ifndef GL_NV_mesh_shader +#define GL_NV_mesh_shader 1 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_TASK_SHADER_NV 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +typedef void (APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); +typedef void (APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); +GLAPI void APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); +GLAPI void APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_NV_mesh_shader */ + +#ifndef GL_NV_multisample_coverage +#define GL_NV_multisample_coverage 1 +#endif /* GL_NV_multisample_coverage */ + +#ifndef GL_NV_multisample_filter_hint +#define GL_NV_multisample_filter_hint 1 +#define GL_MULTISAMPLE_FILTER_HINT_NV 0x8534 +#endif /* GL_NV_multisample_filter_hint */ + +#ifndef GL_NV_occlusion_query +#define GL_NV_occlusion_query 1 +#define GL_PIXEL_COUNTER_BITS_NV 0x8864 +#define GL_CURRENT_OCCLUSION_QUERY_ID_NV 0x8865 +#define GL_PIXEL_COUNT_NV 0x8866 +#define GL_PIXEL_COUNT_AVAILABLE_NV 0x8867 +typedef void (APIENTRYP PFNGLGENOCCLUSIONQUERIESNVPROC) (GLsizei n, GLuint *ids); +typedef void (APIENTRYP PFNGLDELETEOCCLUSIONQUERIESNVPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLBEGINOCCLUSIONQUERYNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLENDOCCLUSIONQUERYNVPROC) (void); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETOCCLUSIONQUERYUIVNVPROC) (GLuint id, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenOcclusionQueriesNV (GLsizei n, GLuint *ids); +GLAPI void APIENTRY glDeleteOcclusionQueriesNV (GLsizei n, const GLuint *ids); +GLAPI GLboolean APIENTRY glIsOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glBeginOcclusionQueryNV (GLuint id); +GLAPI void APIENTRY glEndOcclusionQueryNV (void); +GLAPI void APIENTRY glGetOcclusionQueryivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetOcclusionQueryuivNV (GLuint id, GLenum pname, GLuint *params); +#endif +#endif /* GL_NV_occlusion_query */ + +#ifndef GL_NV_packed_depth_stencil +#define GL_NV_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_NV 0x84F9 +#define GL_UNSIGNED_INT_24_8_NV 0x84FA +#endif /* GL_NV_packed_depth_stencil */ + +#ifndef GL_NV_parameter_buffer_object +#define GL_NV_parameter_buffer_object 1 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_BINDINGS_NV 0x8DA0 +#define GL_MAX_PROGRAM_PARAMETER_BUFFER_SIZE_NV 0x8DA1 +#define GL_VERTEX_PROGRAM_PARAMETER_BUFFER_NV 0x8DA2 +#define GL_GEOMETRY_PROGRAM_PARAMETER_BUFFER_NV 0x8DA3 +#define GL_FRAGMENT_PROGRAM_PARAMETER_BUFFER_NV 0x8DA4 +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSFVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +typedef void (APIENTRYP PFNGLPROGRAMBUFFERPARAMETERSIUIVNVPROC) (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glProgramBufferParametersfvNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLfloat *params); +GLAPI void APIENTRY glProgramBufferParametersIivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLint *params); +GLAPI void APIENTRY glProgramBufferParametersIuivNV (GLenum target, GLuint bindingIndex, GLuint wordIndex, GLsizei count, const GLuint *params); +#endif +#endif /* GL_NV_parameter_buffer_object */ + +#ifndef GL_NV_parameter_buffer_object2 +#define GL_NV_parameter_buffer_object2 1 +#endif /* GL_NV_parameter_buffer_object2 */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_2_BYTES_NV 0x1407 +#define GL_3_BYTES_NV 0x1408 +#define GL_4_BYTES_NV 0x1409 +#define GL_EYE_LINEAR_NV 0x2400 +#define GL_OBJECT_LINEAR_NV 0x2401 +#define GL_CONSTANT_NV 0x8576 +#define GL_PATH_FOG_GEN_MODE_NV 0x90AC +#define GL_PRIMARY_COLOR_NV 0x852C +#define GL_SECONDARY_COLOR_NV 0x852D +#define GL_PATH_GEN_COLOR_FORMAT_NV 0x90B2 +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +typedef GLenum (APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +typedef void (APIENTRYP PFNGLPATHCOLORGENNVPROC) (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHTEXGENNVPROC) (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (APIENTRYP PFNGLPATHFOGGENNVPROC) (GLenum genMode); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENIVNVPROC) (GLenum color, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHCOLORGENFVNVPROC) (GLenum color, GLenum pname, GLfloat *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENIVNVPROC) (GLenum texCoordSet, GLenum pname, GLint *value); +typedef void (APIENTRYP PFNGLGETPATHTEXGENFVNVPROC) (GLenum texCoordSet, GLenum pname, GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLuint APIENTRY glGenPathsNV (GLsizei range); +GLAPI void APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GLAPI GLboolean APIENTRY glIsPathNV (GLuint path); +GLAPI void APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GLAPI void APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GLAPI void APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GLAPI void APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GLAPI void APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GLAPI void APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GLAPI void APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GLAPI void APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GLAPI void APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GLAPI void APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GLAPI void APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GLAPI void APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GLAPI void APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GLAPI void APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GLAPI void APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glPathCoverDepthFuncNV (GLenum func); +GLAPI void APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GLAPI void APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GLAPI void APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GLAPI void APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GLAPI void APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GLAPI void APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GLAPI GLboolean APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GLAPI GLboolean APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GLAPI GLfloat APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GLAPI GLboolean APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GLAPI void APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GLAPI void APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GLAPI void APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI void APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GLAPI GLenum APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +GLAPI GLenum APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI GLenum APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GLAPI void APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +GLAPI void APIENTRY glPathColorGenNV (GLenum color, GLenum genMode, GLenum colorFormat, const GLfloat *coeffs); +GLAPI void APIENTRY glPathTexGenNV (GLenum texCoordSet, GLenum genMode, GLint components, const GLfloat *coeffs); +GLAPI void APIENTRY glPathFogGenNV (GLenum genMode); +GLAPI void APIENTRY glGetPathColorGenivNV (GLenum color, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathColorGenfvNV (GLenum color, GLenum pname, GLfloat *value); +GLAPI void APIENTRY glGetPathTexGenivNV (GLenum texCoordSet, GLenum pname, GLint *value); +GLAPI void APIENTRY glGetPathTexGenfvNV (GLenum texCoordSet, GLenum pname, GLfloat *value); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_data_range +#define GL_NV_pixel_data_range 1 +#define GL_WRITE_PIXEL_DATA_RANGE_NV 0x8878 +#define GL_READ_PIXEL_DATA_RANGE_NV 0x8879 +#define GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV 0x887A +#define GL_READ_PIXEL_DATA_RANGE_LENGTH_NV 0x887B +#define GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV 0x887C +#define GL_READ_PIXEL_DATA_RANGE_POINTER_NV 0x887D +typedef void (APIENTRYP PFNGLPIXELDATARANGENVPROC) (GLenum target, GLsizei length, const void *pointer); +typedef void (APIENTRYP PFNGLFLUSHPIXELDATARANGENVPROC) (GLenum target); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelDataRangeNV (GLenum target, GLsizei length, const void *pointer); +GLAPI void APIENTRY glFlushPixelDataRangeNV (GLenum target); +#endif +#endif /* GL_NV_pixel_data_range */ + +#ifndef GL_NV_point_sprite +#define GL_NV_point_sprite 1 +#define GL_POINT_SPRITE_NV 0x8861 +#define GL_COORD_REPLACE_NV 0x8862 +#define GL_POINT_SPRITE_R_MODE_NV 0x8863 +typedef void (APIENTRYP PFNGLPOINTPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glPointParameterivNV (GLenum pname, const GLint *params); +#endif +#endif /* GL_NV_point_sprite */ + +#ifndef GL_NV_present_video +#define GL_NV_present_video 1 +#define GL_FRAME_NV 0x8E26 +#define GL_FIELDS_NV 0x8E27 +#define GL_CURRENT_TIME_NV 0x8E28 +#define GL_NUM_FILL_STREAMS_NV 0x8E29 +#define GL_PRESENT_TIME_NV 0x8E2A +#define GL_PRESENT_DURATION_NV 0x8E2B +typedef void (APIENTRYP PFNGLPRESENTFRAMEKEYEDNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +typedef void (APIENTRYP PFNGLPRESENTFRAMEDUALFILLNVPROC) (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +typedef void (APIENTRYP PFNGLGETVIDEOIVNVPROC) (GLuint video_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOUIVNVPROC) (GLuint video_slot, GLenum pname, GLuint *params); +typedef void (APIENTRYP PFNGLGETVIDEOI64VNVPROC) (GLuint video_slot, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVIDEOUI64VNVPROC) (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPresentFrameKeyedNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLuint key0, GLenum target1, GLuint fill1, GLuint key1); +GLAPI void APIENTRY glPresentFrameDualFillNV (GLuint video_slot, GLuint64EXT minPresentTime, GLuint beginPresentTimeId, GLuint presentDurationId, GLenum type, GLenum target0, GLuint fill0, GLenum target1, GLuint fill1, GLenum target2, GLuint fill2, GLenum target3, GLuint fill3); +GLAPI void APIENTRY glGetVideoivNV (GLuint video_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideouivNV (GLuint video_slot, GLenum pname, GLuint *params); +GLAPI void APIENTRY glGetVideoi64vNV (GLuint video_slot, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVideoui64vNV (GLuint video_slot, GLenum pname, GLuint64EXT *params); +#endif +#endif /* GL_NV_present_video */ + +#ifndef GL_NV_primitive_restart +#define GL_NV_primitive_restart 1 +#define GL_PRIMITIVE_RESTART_NV 0x8558 +#define GL_PRIMITIVE_RESTART_INDEX_NV 0x8559 +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTNVPROC) (void); +typedef void (APIENTRYP PFNGLPRIMITIVERESTARTINDEXNVPROC) (GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPrimitiveRestartNV (void); +GLAPI void APIENTRY glPrimitiveRestartIndexNV (GLuint index); +#endif +#endif /* GL_NV_primitive_restart */ + +#ifndef GL_NV_primitive_shading_rate +#define GL_NV_primitive_shading_rate 1 +#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1 +#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2 +#endif /* GL_NV_primitive_shading_rate */ + +#ifndef GL_NV_query_resource +#define GL_NV_query_resource 1 +#define GL_QUERY_RESOURCE_TYPE_VIDMEM_ALLOC_NV 0x9540 +#define GL_QUERY_RESOURCE_MEMTYPE_VIDMEM_NV 0x9542 +#define GL_QUERY_RESOURCE_SYS_RESERVED_NV 0x9544 +#define GL_QUERY_RESOURCE_TEXTURE_NV 0x9545 +#define GL_QUERY_RESOURCE_RENDERBUFFER_NV 0x9546 +#define GL_QUERY_RESOURCE_BUFFEROBJECT_NV 0x9547 +typedef GLint (APIENTRYP PFNGLQUERYRESOURCENVPROC) (GLenum queryType, GLint tagId, GLuint count, GLint *buffer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glQueryResourceNV (GLenum queryType, GLint tagId, GLuint count, GLint *buffer); +#endif +#endif /* GL_NV_query_resource */ + +#ifndef GL_NV_query_resource_tag +#define GL_NV_query_resource_tag 1 +typedef void (APIENTRYP PFNGLGENQUERYRESOURCETAGNVPROC) (GLsizei n, GLint *tagIds); +typedef void (APIENTRYP PFNGLDELETEQUERYRESOURCETAGNVPROC) (GLsizei n, const GLint *tagIds); +typedef void (APIENTRYP PFNGLQUERYRESOURCETAGNVPROC) (GLint tagId, const GLchar *tagString); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGenQueryResourceTagNV (GLsizei n, GLint *tagIds); +GLAPI void APIENTRY glDeleteQueryResourceTagNV (GLsizei n, const GLint *tagIds); +GLAPI void APIENTRY glQueryResourceTagNV (GLint tagId, const GLchar *tagString); +#endif +#endif /* GL_NV_query_resource_tag */ + +#ifndef GL_NV_register_combiners +#define GL_NV_register_combiners 1 +#define GL_REGISTER_COMBINERS_NV 0x8522 +#define GL_VARIABLE_A_NV 0x8523 +#define GL_VARIABLE_B_NV 0x8524 +#define GL_VARIABLE_C_NV 0x8525 +#define GL_VARIABLE_D_NV 0x8526 +#define GL_VARIABLE_E_NV 0x8527 +#define GL_VARIABLE_F_NV 0x8528 +#define GL_VARIABLE_G_NV 0x8529 +#define GL_CONSTANT_COLOR0_NV 0x852A +#define GL_CONSTANT_COLOR1_NV 0x852B +#define GL_SPARE0_NV 0x852E +#define GL_SPARE1_NV 0x852F +#define GL_DISCARD_NV 0x8530 +#define GL_E_TIMES_F_NV 0x8531 +#define GL_SPARE0_PLUS_SECONDARY_COLOR_NV 0x8532 +#define GL_UNSIGNED_IDENTITY_NV 0x8536 +#define GL_UNSIGNED_INVERT_NV 0x8537 +#define GL_EXPAND_NORMAL_NV 0x8538 +#define GL_EXPAND_NEGATE_NV 0x8539 +#define GL_HALF_BIAS_NORMAL_NV 0x853A +#define GL_HALF_BIAS_NEGATE_NV 0x853B +#define GL_SIGNED_IDENTITY_NV 0x853C +#define GL_SIGNED_NEGATE_NV 0x853D +#define GL_SCALE_BY_TWO_NV 0x853E +#define GL_SCALE_BY_FOUR_NV 0x853F +#define GL_SCALE_BY_ONE_HALF_NV 0x8540 +#define GL_BIAS_BY_NEGATIVE_ONE_HALF_NV 0x8541 +#define GL_COMBINER_INPUT_NV 0x8542 +#define GL_COMBINER_MAPPING_NV 0x8543 +#define GL_COMBINER_COMPONENT_USAGE_NV 0x8544 +#define GL_COMBINER_AB_DOT_PRODUCT_NV 0x8545 +#define GL_COMBINER_CD_DOT_PRODUCT_NV 0x8546 +#define GL_COMBINER_MUX_SUM_NV 0x8547 +#define GL_COMBINER_SCALE_NV 0x8548 +#define GL_COMBINER_BIAS_NV 0x8549 +#define GL_COMBINER_AB_OUTPUT_NV 0x854A +#define GL_COMBINER_CD_OUTPUT_NV 0x854B +#define GL_COMBINER_SUM_OUTPUT_NV 0x854C +#define GL_MAX_GENERAL_COMBINERS_NV 0x854D +#define GL_NUM_GENERAL_COMBINERS_NV 0x854E +#define GL_COLOR_SUM_CLAMP_NV 0x854F +#define GL_COMBINER0_NV 0x8550 +#define GL_COMBINER1_NV 0x8551 +#define GL_COMBINER2_NV 0x8552 +#define GL_COMBINER3_NV 0x8553 +#define GL_COMBINER4_NV 0x8554 +#define GL_COMBINER5_NV 0x8555 +#define GL_COMBINER6_NV 0x8556 +#define GL_COMBINER7_NV 0x8557 +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFVNVPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERFNVPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERIVNVPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOMBINERPARAMETERINVPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLCOMBINERINPUTNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLCOMBINEROUTPUTNVPROC) (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +typedef void (APIENTRYP PFNGLFINALCOMBINERINPUTNVPROC) (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERINPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERFVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINEROUTPUTPARAMETERIVNVPROC) (GLenum stage, GLenum portion, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERFVNVPROC) (GLenum variable, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFINALCOMBINERINPUTPARAMETERIVNVPROC) (GLenum variable, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerParameterfvNV (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glCombinerParameterfNV (GLenum pname, GLfloat param); +GLAPI void APIENTRY glCombinerParameterivNV (GLenum pname, const GLint *params); +GLAPI void APIENTRY glCombinerParameteriNV (GLenum pname, GLint param); +GLAPI void APIENTRY glCombinerInputNV (GLenum stage, GLenum portion, GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glCombinerOutputNV (GLenum stage, GLenum portion, GLenum abOutput, GLenum cdOutput, GLenum sumOutput, GLenum scale, GLenum bias, GLboolean abDotProduct, GLboolean cdDotProduct, GLboolean muxSum); +GLAPI void APIENTRY glFinalCombinerInputNV (GLenum variable, GLenum input, GLenum mapping, GLenum componentUsage); +GLAPI void APIENTRY glGetCombinerInputParameterfvNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerInputParameterivNV (GLenum stage, GLenum portion, GLenum variable, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetCombinerOutputParameterfvNV (GLenum stage, GLenum portion, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetCombinerOutputParameterivNV (GLenum stage, GLenum portion, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterfvNV (GLenum variable, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFinalCombinerInputParameterivNV (GLenum variable, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_register_combiners */ + +#ifndef GL_NV_register_combiners2 +#define GL_NV_register_combiners2 1 +#define GL_PER_STAGE_CONSTANTS_NV 0x8535 +typedef void (APIENTRYP PFNGLCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOMBINERSTAGEPARAMETERFVNVPROC) (GLenum stage, GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCombinerStageParameterfvNV (GLenum stage, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetCombinerStageParameterfvNV (GLenum stage, GLenum pname, GLfloat *params); +#endif +#endif /* GL_NV_register_combiners2 */ + +#ifndef GL_NV_representative_fragment_test +#define GL_NV_representative_fragment_test 1 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#endif /* GL_NV_representative_fragment_test */ + +#ifndef GL_NV_robustness_video_memory_purge +#define GL_NV_robustness_video_memory_purge 1 +#define GL_PURGED_CONTEXT_RESET_NV 0x92BB +#endif /* GL_NV_robustness_video_memory_purge */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_scissor_exclusive +#define GL_NV_scissor_exclusive 1 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI void APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); +#endif +#endif /* GL_NV_scissor_exclusive */ + +#ifndef GL_NV_shader_atomic_counters +#define GL_NV_shader_atomic_counters 1 +#endif /* GL_NV_shader_atomic_counters */ + +#ifndef GL_NV_shader_atomic_float +#define GL_NV_shader_atomic_float 1 +#endif /* GL_NV_shader_atomic_float */ + +#ifndef GL_NV_shader_atomic_float64 +#define GL_NV_shader_atomic_float64 1 +#endif /* GL_NV_shader_atomic_float64 */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_atomic_int64 +#define GL_NV_shader_atomic_int64 1 +#endif /* GL_NV_shader_atomic_int64 */ + +#ifndef GL_NV_shader_buffer_load +#define GL_NV_shader_buffer_load 1 +#define GL_BUFFER_GPU_ADDRESS_NV 0x8F1D +#define GL_GPU_ADDRESS_NV 0x8F34 +#define GL_MAX_SHADER_BUFFER_ADDRESS_NV 0x8F35 +typedef void (APIENTRYP PFNGLMAKEBUFFERRESIDENTNVPROC) (GLenum target, GLenum access); +typedef void (APIENTRYP PFNGLMAKEBUFFERNONRESIDENTNVPROC) (GLenum target); +typedef GLboolean (APIENTRYP PFNGLISBUFFERRESIDENTNVPROC) (GLenum target); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERRESIDENTNVPROC) (GLuint buffer, GLenum access); +typedef void (APIENTRYP PFNGLMAKENAMEDBUFFERNONRESIDENTNVPROC) (GLuint buffer); +typedef GLboolean (APIENTRYP PFNGLISNAMEDBUFFERRESIDENTNVPROC) (GLuint buffer); +typedef void (APIENTRYP PFNGLGETBUFFERPARAMETERUI64VNVPROC) (GLenum target, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETNAMEDBUFFERPARAMETERUI64VNVPROC) (GLuint buffer, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLGETINTEGERUI64VNVPROC) (GLenum value, GLuint64EXT *result); +typedef void (APIENTRYP PFNGLUNIFORMUI64NVPROC) (GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLUNIFORMUI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64NVPROC) (GLuint program, GLint location, GLuint64EXT value); +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glMakeBufferResidentNV (GLenum target, GLenum access); +GLAPI void APIENTRY glMakeBufferNonResidentNV (GLenum target); +GLAPI GLboolean APIENTRY glIsBufferResidentNV (GLenum target); +GLAPI void APIENTRY glMakeNamedBufferResidentNV (GLuint buffer, GLenum access); +GLAPI void APIENTRY glMakeNamedBufferNonResidentNV (GLuint buffer); +GLAPI GLboolean APIENTRY glIsNamedBufferResidentNV (GLuint buffer); +GLAPI void APIENTRY glGetBufferParameterui64vNV (GLenum target, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetNamedBufferParameterui64vNV (GLuint buffer, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glGetIntegerui64vNV (GLenum value, GLuint64EXT *result); +GLAPI void APIENTRY glUniformui64NV (GLint location, GLuint64EXT value); +GLAPI void APIENTRY glUniformui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GLAPI void APIENTRY glProgramUniformui64NV (GLuint program, GLint location, GLuint64EXT value); +GLAPI void APIENTRY glProgramUniformui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_shader_buffer_load */ + +#ifndef GL_NV_shader_buffer_store +#define GL_NV_shader_buffer_store 1 +#define GL_SHADER_GLOBAL_ACCESS_BARRIER_BIT_NV 0x00000010 +#endif /* GL_NV_shader_buffer_store */ + +#ifndef GL_NV_shader_storage_buffer_object +#define GL_NV_shader_storage_buffer_object 1 +#endif /* GL_NV_shader_storage_buffer_object */ + +#ifndef GL_NV_shader_subgroup_partitioned +#define GL_NV_shader_subgroup_partitioned 1 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#endif /* GL_NV_shader_subgroup_partitioned */ + +#ifndef GL_NV_shader_texture_footprint +#define GL_NV_shader_texture_footprint 1 +#endif /* GL_NV_shader_texture_footprint */ + +#ifndef GL_NV_shader_thread_group +#define GL_NV_shader_thread_group 1 +#define GL_WARP_SIZE_NV 0x9339 +#define GL_WARPS_PER_SM_NV 0x933A +#define GL_SM_COUNT_NV 0x933B +#endif /* GL_NV_shader_thread_group */ + +#ifndef GL_NV_shader_thread_shuffle +#define GL_NV_shader_thread_shuffle 1 +#endif /* GL_NV_shader_thread_shuffle */ + +#ifndef GL_NV_shading_rate_image +#define GL_NV_shading_rate_image 1 +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +typedef void (APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); +typedef void (APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); +typedef void (APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); +typedef void (APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); +typedef void (APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindShadingRateImageNV (GLuint texture); +GLAPI void APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); +GLAPI void APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); +GLAPI void APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); +GLAPI void APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +GLAPI void APIENTRY glShadingRateSampleOrderNV (GLenum order); +GLAPI void APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); +#endif +#endif /* GL_NV_shading_rate_image */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 +#endif /* GL_NV_stereo_view_rendering */ + +#ifndef GL_NV_tessellation_program5 +#define GL_NV_tessellation_program5 1 +#define GL_MAX_PROGRAM_PATCH_ATTRIBS_NV 0x86D8 +#define GL_TESS_CONTROL_PROGRAM_NV 0x891E +#define GL_TESS_EVALUATION_PROGRAM_NV 0x891F +#define GL_TESS_CONTROL_PROGRAM_PARAMETER_BUFFER_NV 0x8C74 +#define GL_TESS_EVALUATION_PROGRAM_PARAMETER_BUFFER_NV 0x8C75 +#endif /* GL_NV_tessellation_program5 */ + +#ifndef GL_NV_texgen_emboss +#define GL_NV_texgen_emboss 1 +#define GL_EMBOSS_LIGHT_NV 0x855D +#define GL_EMBOSS_CONSTANT_NV 0x855E +#define GL_EMBOSS_MAP_NV 0x855F +#endif /* GL_NV_texgen_emboss */ + +#ifndef GL_NV_texgen_reflection +#define GL_NV_texgen_reflection 1 +#define GL_NORMAL_MAP_NV 0x8511 +#define GL_REFLECTION_MAP_NV 0x8512 +#endif /* GL_NV_texgen_reflection */ + +#ifndef GL_NV_texture_barrier +#define GL_NV_texture_barrier 1 +typedef void (APIENTRYP PFNGLTEXTUREBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureBarrierNV (void); +#endif +#endif /* GL_NV_texture_barrier */ + +#ifndef GL_NV_texture_compression_vtc +#define GL_NV_texture_compression_vtc 1 +#endif /* GL_NV_texture_compression_vtc */ + +#ifndef GL_NV_texture_env_combine4 +#define GL_NV_texture_env_combine4 1 +#define GL_COMBINE4_NV 0x8503 +#define GL_SOURCE3_RGB_NV 0x8583 +#define GL_SOURCE3_ALPHA_NV 0x858B +#define GL_OPERAND3_RGB_NV 0x8593 +#define GL_OPERAND3_ALPHA_NV 0x859B +#endif /* GL_NV_texture_env_combine4 */ + +#ifndef GL_NV_texture_expand_normal +#define GL_NV_texture_expand_normal 1 +#define GL_TEXTURE_UNSIGNED_REMAP_MODE_NV 0x888F +#endif /* GL_NV_texture_expand_normal */ + +#ifndef GL_NV_texture_multisample +#define GL_NV_texture_multisample 1 +#define GL_TEXTURE_COVERAGE_SAMPLES_NV 0x9045 +#define GL_TEXTURE_COLOR_SAMPLES_NV 0x9046 +typedef void (APIENTRYP PFNGLTEXIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLENVPROC) (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE2DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +typedef void (APIENTRYP PFNGLTEXTUREIMAGE3DMULTISAMPLECOVERAGENVPROC) (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage2DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTexImage3DMultisampleCoverageNV (GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleNV (GLuint texture, GLenum target, GLsizei samples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage2DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations); +GLAPI void APIENTRY glTextureImage3DMultisampleCoverageNV (GLuint texture, GLenum target, GLsizei coverageSamples, GLsizei colorSamples, GLint internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations); +#endif +#endif /* GL_NV_texture_multisample */ + +#ifndef GL_NV_texture_rectangle +#define GL_NV_texture_rectangle 1 +#define GL_TEXTURE_RECTANGLE_NV 0x84F5 +#define GL_TEXTURE_BINDING_RECTANGLE_NV 0x84F6 +#define GL_PROXY_TEXTURE_RECTANGLE_NV 0x84F7 +#define GL_MAX_RECTANGLE_TEXTURE_SIZE_NV 0x84F8 +#endif /* GL_NV_texture_rectangle */ + +#ifndef GL_NV_texture_rectangle_compressed +#define GL_NV_texture_rectangle_compressed 1 +#endif /* GL_NV_texture_rectangle_compressed */ + +#ifndef GL_NV_texture_shader +#define GL_NV_texture_shader 1 +#define GL_OFFSET_TEXTURE_RECTANGLE_NV 0x864C +#define GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV 0x864D +#define GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV 0x864E +#define GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV 0x86D9 +#define GL_UNSIGNED_INT_S8_S8_8_8_NV 0x86DA +#define GL_UNSIGNED_INT_8_8_S8_S8_REV_NV 0x86DB +#define GL_DSDT_MAG_INTENSITY_NV 0x86DC +#define GL_SHADER_CONSISTENT_NV 0x86DD +#define GL_TEXTURE_SHADER_NV 0x86DE +#define GL_SHADER_OPERATION_NV 0x86DF +#define GL_CULL_MODES_NV 0x86E0 +#define GL_OFFSET_TEXTURE_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_BIAS_NV 0x86E3 +#define GL_OFFSET_TEXTURE_2D_MATRIX_NV 0x86E1 +#define GL_OFFSET_TEXTURE_2D_SCALE_NV 0x86E2 +#define GL_OFFSET_TEXTURE_2D_BIAS_NV 0x86E3 +#define GL_PREVIOUS_TEXTURE_INPUT_NV 0x86E4 +#define GL_CONST_EYE_NV 0x86E5 +#define GL_PASS_THROUGH_NV 0x86E6 +#define GL_CULL_FRAGMENT_NV 0x86E7 +#define GL_OFFSET_TEXTURE_2D_NV 0x86E8 +#define GL_DEPENDENT_AR_TEXTURE_2D_NV 0x86E9 +#define GL_DEPENDENT_GB_TEXTURE_2D_NV 0x86EA +#define GL_DOT_PRODUCT_NV 0x86EC +#define GL_DOT_PRODUCT_DEPTH_REPLACE_NV 0x86ED +#define GL_DOT_PRODUCT_TEXTURE_2D_NV 0x86EE +#define GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV 0x86F0 +#define GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV 0x86F1 +#define GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV 0x86F2 +#define GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV 0x86F3 +#define GL_HILO_NV 0x86F4 +#define GL_DSDT_NV 0x86F5 +#define GL_DSDT_MAG_NV 0x86F6 +#define GL_DSDT_MAG_VIB_NV 0x86F7 +#define GL_HILO16_NV 0x86F8 +#define GL_SIGNED_HILO_NV 0x86F9 +#define GL_SIGNED_HILO16_NV 0x86FA +#define GL_SIGNED_RGBA_NV 0x86FB +#define GL_SIGNED_RGBA8_NV 0x86FC +#define GL_SIGNED_RGB_NV 0x86FE +#define GL_SIGNED_RGB8_NV 0x86FF +#define GL_SIGNED_LUMINANCE_NV 0x8701 +#define GL_SIGNED_LUMINANCE8_NV 0x8702 +#define GL_SIGNED_LUMINANCE_ALPHA_NV 0x8703 +#define GL_SIGNED_LUMINANCE8_ALPHA8_NV 0x8704 +#define GL_SIGNED_ALPHA_NV 0x8705 +#define GL_SIGNED_ALPHA8_NV 0x8706 +#define GL_SIGNED_INTENSITY_NV 0x8707 +#define GL_SIGNED_INTENSITY8_NV 0x8708 +#define GL_DSDT8_NV 0x8709 +#define GL_DSDT8_MAG8_NV 0x870A +#define GL_DSDT8_MAG8_INTENSITY8_NV 0x870B +#define GL_SIGNED_RGB_UNSIGNED_ALPHA_NV 0x870C +#define GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV 0x870D +#define GL_HI_SCALE_NV 0x870E +#define GL_LO_SCALE_NV 0x870F +#define GL_DS_SCALE_NV 0x8710 +#define GL_DT_SCALE_NV 0x8711 +#define GL_MAGNITUDE_SCALE_NV 0x8712 +#define GL_VIBRANCE_SCALE_NV 0x8713 +#define GL_HI_BIAS_NV 0x8714 +#define GL_LO_BIAS_NV 0x8715 +#define GL_DS_BIAS_NV 0x8716 +#define GL_DT_BIAS_NV 0x8717 +#define GL_MAGNITUDE_BIAS_NV 0x8718 +#define GL_VIBRANCE_BIAS_NV 0x8719 +#define GL_TEXTURE_BORDER_VALUES_NV 0x871A +#define GL_TEXTURE_HI_SIZE_NV 0x871B +#define GL_TEXTURE_LO_SIZE_NV 0x871C +#define GL_TEXTURE_DS_SIZE_NV 0x871D +#define GL_TEXTURE_DT_SIZE_NV 0x871E +#define GL_TEXTURE_MAG_SIZE_NV 0x871F +#endif /* GL_NV_texture_shader */ + +#ifndef GL_NV_texture_shader2 +#define GL_NV_texture_shader2 1 +#define GL_DOT_PRODUCT_TEXTURE_3D_NV 0x86EF +#endif /* GL_NV_texture_shader2 */ + +#ifndef GL_NV_texture_shader3 +#define GL_NV_texture_shader3 1 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV 0x8850 +#define GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV 0x8851 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8852 +#define GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV 0x8853 +#define GL_OFFSET_HILO_TEXTURE_2D_NV 0x8854 +#define GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV 0x8855 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV 0x8856 +#define GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV 0x8857 +#define GL_DEPENDENT_HILO_TEXTURE_2D_NV 0x8858 +#define GL_DEPENDENT_RGB_TEXTURE_3D_NV 0x8859 +#define GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV 0x885A +#define GL_DOT_PRODUCT_PASS_THROUGH_NV 0x885B +#define GL_DOT_PRODUCT_TEXTURE_1D_NV 0x885C +#define GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV 0x885D +#define GL_HILO8_NV 0x885E +#define GL_SIGNED_HILO8_NV 0x885F +#define GL_FORCE_BLUE_TO_ONE_NV 0x8860 +#endif /* GL_NV_texture_shader3 */ + +#ifndef GL_NV_timeline_semaphore +#define GL_NV_timeline_semaphore 1 +#define GL_TIMELINE_SEMAPHORE_VALUE_NV 0x9595 +#define GL_SEMAPHORE_TYPE_NV 0x95B3 +#define GL_SEMAPHORE_TYPE_BINARY_NV 0x95B4 +#define GL_SEMAPHORE_TYPE_TIMELINE_NV 0x95B5 +#define GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV 0x95B6 +typedef void (APIENTRYP PFNGLCREATESEMAPHORESNVPROC) (GLsizei n, GLuint *semaphores); +typedef void (APIENTRYP PFNGLSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glCreateSemaphoresNV (GLsizei n, GLuint *semaphores); +GLAPI void APIENTRY glSemaphoreParameterivNV (GLuint semaphore, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetSemaphoreParameterivNV (GLuint semaphore, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_timeline_semaphore */ + +#ifndef GL_NV_transform_feedback +#define GL_NV_transform_feedback 1 +#define GL_BACK_PRIMARY_COLOR_NV 0x8C77 +#define GL_BACK_SECONDARY_COLOR_NV 0x8C78 +#define GL_TEXTURE_COORD_NV 0x8C79 +#define GL_CLIP_DISTANCE_NV 0x8C7A +#define GL_VERTEX_ID_NV 0x8C7B +#define GL_PRIMITIVE_ID_NV 0x8C7C +#define GL_GENERIC_ATTRIB_NV 0x8C7D +#define GL_TRANSFORM_FEEDBACK_ATTRIBS_NV 0x8C7E +#define GL_TRANSFORM_FEEDBACK_BUFFER_MODE_NV 0x8C7F +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_NV 0x8C80 +#define GL_ACTIVE_VARYINGS_NV 0x8C81 +#define GL_ACTIVE_VARYING_MAX_LENGTH_NV 0x8C82 +#define GL_TRANSFORM_FEEDBACK_VARYINGS_NV 0x8C83 +#define GL_TRANSFORM_FEEDBACK_BUFFER_START_NV 0x8C84 +#define GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_NV 0x8C85 +#define GL_TRANSFORM_FEEDBACK_RECORD_NV 0x8C86 +#define GL_PRIMITIVES_GENERATED_NV 0x8C87 +#define GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_NV 0x8C88 +#define GL_RASTERIZER_DISCARD_NV 0x8C89 +#define GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_NV 0x8C8A +#define GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_NV 0x8C8B +#define GL_INTERLEAVED_ATTRIBS_NV 0x8C8C +#define GL_SEPARATE_ATTRIBS_NV 0x8C8D +#define GL_TRANSFORM_FEEDBACK_BUFFER_NV 0x8C8E +#define GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_NV 0x8C8F +#define GL_LAYER_NV 0x8DAA +#define GL_NEXT_BUFFER_NV -2 +#define GL_SKIP_COMPONENTS4_NV -3 +#define GL_SKIP_COMPONENTS3_NV -4 +#define GL_SKIP_COMPONENTS2_NV -5 +#define GL_SKIP_COMPONENTS1_NV -6 +typedef void (APIENTRYP PFNGLBEGINTRANSFORMFEEDBACKNVPROC) (GLenum primitiveMode); +typedef void (APIENTRYP PFNGLENDTRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLenum bufferMode); +typedef void (APIENTRYP PFNGLBINDBUFFERRANGENVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +typedef void (APIENTRYP PFNGLBINDBUFFEROFFSETNVPROC) (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +typedef void (APIENTRYP PFNGLBINDBUFFERBASENVPROC) (GLenum target, GLuint index, GLuint buffer); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKVARYINGSNVPROC) (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +typedef void (APIENTRYP PFNGLACTIVEVARYINGNVPROC) (GLuint program, const GLchar *name); +typedef GLint (APIENTRYP PFNGLGETVARYINGLOCATIONNVPROC) (GLuint program, const GLchar *name); +typedef void (APIENTRYP PFNGLGETACTIVEVARYINGNVPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKVARYINGNVPROC) (GLuint program, GLuint index, GLint *location); +typedef void (APIENTRYP PFNGLTRANSFORMFEEDBACKSTREAMATTRIBSNVPROC) (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginTransformFeedbackNV (GLenum primitiveMode); +GLAPI void APIENTRY glEndTransformFeedbackNV (void); +GLAPI void APIENTRY glTransformFeedbackAttribsNV (GLsizei count, const GLint *attribs, GLenum bufferMode); +GLAPI void APIENTRY glBindBufferRangeNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI void APIENTRY glBindBufferOffsetNV (GLenum target, GLuint index, GLuint buffer, GLintptr offset); +GLAPI void APIENTRY glBindBufferBaseNV (GLenum target, GLuint index, GLuint buffer); +GLAPI void APIENTRY glTransformFeedbackVaryingsNV (GLuint program, GLsizei count, const GLint *locations, GLenum bufferMode); +GLAPI void APIENTRY glActiveVaryingNV (GLuint program, const GLchar *name); +GLAPI GLint APIENTRY glGetVaryingLocationNV (GLuint program, const GLchar *name); +GLAPI void APIENTRY glGetActiveVaryingNV (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name); +GLAPI void APIENTRY glGetTransformFeedbackVaryingNV (GLuint program, GLuint index, GLint *location); +GLAPI void APIENTRY glTransformFeedbackStreamAttribsNV (GLsizei count, const GLint *attribs, GLsizei nbuffers, const GLint *bufstreams, GLenum bufferMode); +#endif +#endif /* GL_NV_transform_feedback */ + +#ifndef GL_NV_transform_feedback2 +#define GL_NV_transform_feedback2 1 +#define GL_TRANSFORM_FEEDBACK_NV 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED_NV 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE_NV 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING_NV 0x8E25 +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSNVPROC) (GLsizei n, const GLuint *ids); +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSNVPROC) (GLsizei n, GLuint *ids); +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKNVPROC) (void); +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKNVPROC) (GLenum mode, GLuint id); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBindTransformFeedbackNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteTransformFeedbacksNV (GLsizei n, const GLuint *ids); +GLAPI void APIENTRY glGenTransformFeedbacksNV (GLsizei n, GLuint *ids); +GLAPI GLboolean APIENTRY glIsTransformFeedbackNV (GLuint id); +GLAPI void APIENTRY glPauseTransformFeedbackNV (void); +GLAPI void APIENTRY glResumeTransformFeedbackNV (void); +GLAPI void APIENTRY glDrawTransformFeedbackNV (GLenum mode, GLuint id); +#endif +#endif /* GL_NV_transform_feedback2 */ + +#ifndef GL_NV_uniform_buffer_unified_memory +#define GL_NV_uniform_buffer_unified_memory 1 +#define GL_UNIFORM_BUFFER_UNIFIED_NV 0x936E +#define GL_UNIFORM_BUFFER_ADDRESS_NV 0x936F +#define GL_UNIFORM_BUFFER_LENGTH_NV 0x9370 +#endif /* GL_NV_uniform_buffer_unified_memory */ + +#ifndef GL_NV_vdpau_interop +#define GL_NV_vdpau_interop 1 +typedef GLintptr GLvdpauSurfaceNV; +#define GL_SURFACE_STATE_NV 0x86EB +#define GL_SURFACE_REGISTERED_NV 0x86FD +#define GL_SURFACE_MAPPED_NV 0x8700 +#define GL_WRITE_DISCARD_NV 0x88BE +typedef void (APIENTRYP PFNGLVDPAUINITNVPROC) (const void *vdpDevice, const void *getProcAddress); +typedef void (APIENTRYP PFNGLVDPAUFININVPROC) (void); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTEROUTPUTSURFACENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +typedef GLboolean (APIENTRYP PFNGLVDPAUISSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUUNREGISTERSURFACENVPROC) (GLvdpauSurfaceNV surface); +typedef void (APIENTRYP PFNGLVDPAUGETSURFACEIVNVPROC) (GLvdpauSurfaceNV surface, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +typedef void (APIENTRYP PFNGLVDPAUSURFACEACCESSNVPROC) (GLvdpauSurfaceNV surface, GLenum access); +typedef void (APIENTRYP PFNGLVDPAUMAPSURFACESNVPROC) (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +typedef void (APIENTRYP PFNGLVDPAUUNMAPSURFACESNVPROC) (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVDPAUInitNV (const void *vdpDevice, const void *getProcAddress); +GLAPI void APIENTRY glVDPAUFiniNV (void); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterOutputSurfaceNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames); +GLAPI GLboolean APIENTRY glVDPAUIsSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUUnregisterSurfaceNV (GLvdpauSurfaceNV surface); +GLAPI void APIENTRY glVDPAUGetSurfaceivNV (GLvdpauSurfaceNV surface, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +GLAPI void APIENTRY glVDPAUSurfaceAccessNV (GLvdpauSurfaceNV surface, GLenum access); +GLAPI void APIENTRY glVDPAUMapSurfacesNV (GLsizei numSurfaces, const GLvdpauSurfaceNV *surfaces); +GLAPI void APIENTRY glVDPAUUnmapSurfacesNV (GLsizei numSurface, const GLvdpauSurfaceNV *surfaces); +#endif +#endif /* GL_NV_vdpau_interop */ + +#ifndef GL_NV_vdpau_interop2 +#define GL_NV_vdpau_interop2 1 +typedef GLvdpauSurfaceNV (APIENTRYP PFNGLVDPAUREGISTERVIDEOSURFACEWITHPICTURESTRUCTURENVPROC) (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLvdpauSurfaceNV APIENTRY glVDPAURegisterVideoSurfaceWithPictureStructureNV (const void *vdpSurface, GLenum target, GLsizei numTextureNames, const GLuint *textureNames, GLboolean isFrameStructure); +#endif +#endif /* GL_NV_vdpau_interop2 */ + +#ifndef GL_NV_vertex_array_range +#define GL_NV_vertex_array_range 1 +#define GL_VERTEX_ARRAY_RANGE_NV 0x851D +#define GL_VERTEX_ARRAY_RANGE_LENGTH_NV 0x851E +#define GL_VERTEX_ARRAY_RANGE_VALID_NV 0x851F +#define GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV 0x8520 +#define GL_VERTEX_ARRAY_RANGE_POINTER_NV 0x8521 +typedef void (APIENTRYP PFNGLFLUSHVERTEXARRAYRANGENVPROC) (void); +typedef void (APIENTRYP PFNGLVERTEXARRAYRANGENVPROC) (GLsizei length, const void *pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushVertexArrayRangeNV (void); +GLAPI void APIENTRY glVertexArrayRangeNV (GLsizei length, const void *pointer); +#endif +#endif /* GL_NV_vertex_array_range */ + +#ifndef GL_NV_vertex_array_range2 +#define GL_NV_vertex_array_range2 1 +#define GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV 0x8533 +#endif /* GL_NV_vertex_array_range2 */ + +#ifndef GL_NV_vertex_attrib_integer_64bit +#define GL_NV_vertex_attrib_integer_64bit 1 +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64NVPROC) (GLuint index, GLint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64NVPROC) (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4I64VNVPROC) (GLuint index, const GLint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64NVPROC) (GLuint index, GLuint64EXT x); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64NVPROC) (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4UI64VNVPROC) (GLuint index, const GLuint64EXT *v); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLI64VNVPROC) (GLuint index, GLenum pname, GLint64EXT *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLUI64VNVPROC) (GLuint index, GLenum pname, GLuint64EXT *params); +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glVertexAttribL1i64NV (GLuint index, GLint64EXT x); +GLAPI void APIENTRY glVertexAttribL2i64NV (GLuint index, GLint64EXT x, GLint64EXT y); +GLAPI void APIENTRY glVertexAttribL3i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GLAPI void APIENTRY glVertexAttribL4i64NV (GLuint index, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GLAPI void APIENTRY glVertexAttribL1i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4i64vNV (GLuint index, const GLint64EXT *v); +GLAPI void APIENTRY glVertexAttribL1ui64NV (GLuint index, GLuint64EXT x); +GLAPI void APIENTRY glVertexAttribL2ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y); +GLAPI void APIENTRY glVertexAttribL3ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GLAPI void APIENTRY glVertexAttribL4ui64NV (GLuint index, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GLAPI void APIENTRY glVertexAttribL1ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL2ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL3ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glVertexAttribL4ui64vNV (GLuint index, const GLuint64EXT *v); +GLAPI void APIENTRY glGetVertexAttribLi64vNV (GLuint index, GLenum pname, GLint64EXT *params); +GLAPI void APIENTRY glGetVertexAttribLui64vNV (GLuint index, GLenum pname, GLuint64EXT *params); +GLAPI void APIENTRY glVertexAttribLFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +#endif +#endif /* GL_NV_vertex_attrib_integer_64bit */ + +#ifndef GL_NV_vertex_buffer_unified_memory +#define GL_NV_vertex_buffer_unified_memory 1 +#define GL_VERTEX_ATTRIB_ARRAY_UNIFIED_NV 0x8F1E +#define GL_ELEMENT_ARRAY_UNIFIED_NV 0x8F1F +#define GL_VERTEX_ATTRIB_ARRAY_ADDRESS_NV 0x8F20 +#define GL_VERTEX_ARRAY_ADDRESS_NV 0x8F21 +#define GL_NORMAL_ARRAY_ADDRESS_NV 0x8F22 +#define GL_COLOR_ARRAY_ADDRESS_NV 0x8F23 +#define GL_INDEX_ARRAY_ADDRESS_NV 0x8F24 +#define GL_TEXTURE_COORD_ARRAY_ADDRESS_NV 0x8F25 +#define GL_EDGE_FLAG_ARRAY_ADDRESS_NV 0x8F26 +#define GL_SECONDARY_COLOR_ARRAY_ADDRESS_NV 0x8F27 +#define GL_FOG_COORD_ARRAY_ADDRESS_NV 0x8F28 +#define GL_ELEMENT_ARRAY_ADDRESS_NV 0x8F29 +#define GL_VERTEX_ATTRIB_ARRAY_LENGTH_NV 0x8F2A +#define GL_VERTEX_ARRAY_LENGTH_NV 0x8F2B +#define GL_NORMAL_ARRAY_LENGTH_NV 0x8F2C +#define GL_COLOR_ARRAY_LENGTH_NV 0x8F2D +#define GL_INDEX_ARRAY_LENGTH_NV 0x8F2E +#define GL_TEXTURE_COORD_ARRAY_LENGTH_NV 0x8F2F +#define GL_EDGE_FLAG_ARRAY_LENGTH_NV 0x8F30 +#define GL_SECONDARY_COLOR_ARRAY_LENGTH_NV 0x8F31 +#define GL_FOG_COORD_ARRAY_LENGTH_NV 0x8F32 +#define GL_ELEMENT_ARRAY_LENGTH_NV 0x8F33 +#define GL_DRAW_INDIRECT_UNIFIED_NV 0x8F40 +#define GL_DRAW_INDIRECT_ADDRESS_NV 0x8F41 +#define GL_DRAW_INDIRECT_LENGTH_NV 0x8F42 +typedef void (APIENTRYP PFNGLBUFFERADDRESSRANGENVPROC) (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +typedef void (APIENTRYP PFNGLVERTEXFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLNORMALFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLINDEXFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLTEXCOORDFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLEDGEFLAGFORMATNVPROC) (GLsizei stride); +typedef void (APIENTRYP PFNGLSECONDARYCOLORFORMATNVPROC) (GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLFOGCOORDFORMATNVPROC) (GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATNVPROC) (GLuint index, GLint size, GLenum type, GLsizei stride); +typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBufferAddressRangeNV (GLenum pname, GLuint index, GLuint64EXT address, GLsizeiptr length); +GLAPI void APIENTRY glVertexFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glNormalFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glIndexFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glTexCoordFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glEdgeFlagFormatNV (GLsizei stride); +GLAPI void APIENTRY glSecondaryColorFormatNV (GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glFogCoordFormatNV (GLenum type, GLsizei stride); +GLAPI void APIENTRY glVertexAttribFormatNV (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride); +GLAPI void APIENTRY glVertexAttribIFormatNV (GLuint index, GLint size, GLenum type, GLsizei stride); +GLAPI void APIENTRY glGetIntegerui64i_vNV (GLenum value, GLuint index, GLuint64EXT *result); +#endif +#endif /* GL_NV_vertex_buffer_unified_memory */ + +#ifndef GL_NV_vertex_program +#define GL_NV_vertex_program 1 +#define GL_VERTEX_PROGRAM_NV 0x8620 +#define GL_VERTEX_STATE_PROGRAM_NV 0x8621 +#define GL_ATTRIB_ARRAY_SIZE_NV 0x8623 +#define GL_ATTRIB_ARRAY_STRIDE_NV 0x8624 +#define GL_ATTRIB_ARRAY_TYPE_NV 0x8625 +#define GL_CURRENT_ATTRIB_NV 0x8626 +#define GL_PROGRAM_LENGTH_NV 0x8627 +#define GL_PROGRAM_STRING_NV 0x8628 +#define GL_MODELVIEW_PROJECTION_NV 0x8629 +#define GL_IDENTITY_NV 0x862A +#define GL_INVERSE_NV 0x862B +#define GL_TRANSPOSE_NV 0x862C +#define GL_INVERSE_TRANSPOSE_NV 0x862D +#define GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV 0x862E +#define GL_MAX_TRACK_MATRICES_NV 0x862F +#define GL_MATRIX0_NV 0x8630 +#define GL_MATRIX1_NV 0x8631 +#define GL_MATRIX2_NV 0x8632 +#define GL_MATRIX3_NV 0x8633 +#define GL_MATRIX4_NV 0x8634 +#define GL_MATRIX5_NV 0x8635 +#define GL_MATRIX6_NV 0x8636 +#define GL_MATRIX7_NV 0x8637 +#define GL_CURRENT_MATRIX_STACK_DEPTH_NV 0x8640 +#define GL_CURRENT_MATRIX_NV 0x8641 +#define GL_VERTEX_PROGRAM_POINT_SIZE_NV 0x8642 +#define GL_VERTEX_PROGRAM_TWO_SIDE_NV 0x8643 +#define GL_PROGRAM_PARAMETER_NV 0x8644 +#define GL_ATTRIB_ARRAY_POINTER_NV 0x8645 +#define GL_PROGRAM_TARGET_NV 0x8646 +#define GL_PROGRAM_RESIDENT_NV 0x8647 +#define GL_TRACK_MATRIX_NV 0x8648 +#define GL_TRACK_MATRIX_TRANSFORM_NV 0x8649 +#define GL_VERTEX_PROGRAM_BINDING_NV 0x864A +#define GL_PROGRAM_ERROR_POSITION_NV 0x864B +#define GL_VERTEX_ATTRIB_ARRAY0_NV 0x8650 +#define GL_VERTEX_ATTRIB_ARRAY1_NV 0x8651 +#define GL_VERTEX_ATTRIB_ARRAY2_NV 0x8652 +#define GL_VERTEX_ATTRIB_ARRAY3_NV 0x8653 +#define GL_VERTEX_ATTRIB_ARRAY4_NV 0x8654 +#define GL_VERTEX_ATTRIB_ARRAY5_NV 0x8655 +#define GL_VERTEX_ATTRIB_ARRAY6_NV 0x8656 +#define GL_VERTEX_ATTRIB_ARRAY7_NV 0x8657 +#define GL_VERTEX_ATTRIB_ARRAY8_NV 0x8658 +#define GL_VERTEX_ATTRIB_ARRAY9_NV 0x8659 +#define GL_VERTEX_ATTRIB_ARRAY10_NV 0x865A +#define GL_VERTEX_ATTRIB_ARRAY11_NV 0x865B +#define GL_VERTEX_ATTRIB_ARRAY12_NV 0x865C +#define GL_VERTEX_ATTRIB_ARRAY13_NV 0x865D +#define GL_VERTEX_ATTRIB_ARRAY14_NV 0x865E +#define GL_VERTEX_ATTRIB_ARRAY15_NV 0x865F +#define GL_MAP1_VERTEX_ATTRIB0_4_NV 0x8660 +#define GL_MAP1_VERTEX_ATTRIB1_4_NV 0x8661 +#define GL_MAP1_VERTEX_ATTRIB2_4_NV 0x8662 +#define GL_MAP1_VERTEX_ATTRIB3_4_NV 0x8663 +#define GL_MAP1_VERTEX_ATTRIB4_4_NV 0x8664 +#define GL_MAP1_VERTEX_ATTRIB5_4_NV 0x8665 +#define GL_MAP1_VERTEX_ATTRIB6_4_NV 0x8666 +#define GL_MAP1_VERTEX_ATTRIB7_4_NV 0x8667 +#define GL_MAP1_VERTEX_ATTRIB8_4_NV 0x8668 +#define GL_MAP1_VERTEX_ATTRIB9_4_NV 0x8669 +#define GL_MAP1_VERTEX_ATTRIB10_4_NV 0x866A +#define GL_MAP1_VERTEX_ATTRIB11_4_NV 0x866B +#define GL_MAP1_VERTEX_ATTRIB12_4_NV 0x866C +#define GL_MAP1_VERTEX_ATTRIB13_4_NV 0x866D +#define GL_MAP1_VERTEX_ATTRIB14_4_NV 0x866E +#define GL_MAP1_VERTEX_ATTRIB15_4_NV 0x866F +#define GL_MAP2_VERTEX_ATTRIB0_4_NV 0x8670 +#define GL_MAP2_VERTEX_ATTRIB1_4_NV 0x8671 +#define GL_MAP2_VERTEX_ATTRIB2_4_NV 0x8672 +#define GL_MAP2_VERTEX_ATTRIB3_4_NV 0x8673 +#define GL_MAP2_VERTEX_ATTRIB4_4_NV 0x8674 +#define GL_MAP2_VERTEX_ATTRIB5_4_NV 0x8675 +#define GL_MAP2_VERTEX_ATTRIB6_4_NV 0x8676 +#define GL_MAP2_VERTEX_ATTRIB7_4_NV 0x8677 +#define GL_MAP2_VERTEX_ATTRIB8_4_NV 0x8678 +#define GL_MAP2_VERTEX_ATTRIB9_4_NV 0x8679 +#define GL_MAP2_VERTEX_ATTRIB10_4_NV 0x867A +#define GL_MAP2_VERTEX_ATTRIB11_4_NV 0x867B +#define GL_MAP2_VERTEX_ATTRIB12_4_NV 0x867C +#define GL_MAP2_VERTEX_ATTRIB13_4_NV 0x867D +#define GL_MAP2_VERTEX_ATTRIB14_4_NV 0x867E +#define GL_MAP2_VERTEX_ATTRIB15_4_NV 0x867F +typedef GLboolean (APIENTRYP PFNGLAREPROGRAMSRESIDENTNVPROC) (GLsizei n, const GLuint *programs, GLboolean *residences); +typedef void (APIENTRYP PFNGLBINDPROGRAMNVPROC) (GLenum target, GLuint id); +typedef void (APIENTRYP PFNGLDELETEPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLEXECUTEPROGRAMNVPROC) (GLenum target, GLuint id, const GLfloat *params); +typedef void (APIENTRYP PFNGLGENPROGRAMSNVPROC) (GLsizei n, GLuint *programs); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERDVNVPROC) (GLenum target, GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETPROGRAMPARAMETERFVNVPROC) (GLenum target, GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETPROGRAMIVNVPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPROGRAMSTRINGNVPROC) (GLuint id, GLenum pname, GLubyte *program); +typedef void (APIENTRYP PFNGLGETTRACKMATRIXIVNVPROC) (GLenum target, GLuint address, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBDVNVPROC) (GLuint index, GLenum pname, GLdouble *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBFVNVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVNVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVNVPROC) (GLuint index, GLenum pname, void **pointer); +typedef GLboolean (APIENTRYP PFNGLISPROGRAMNVPROC) (GLuint id); +typedef void (APIENTRYP PFNGLLOADPROGRAMNVPROC) (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DNVPROC) (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4DVNVPROC) (GLenum target, GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FNVPROC) (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETER4FVNVPROC) (GLenum target, GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4DVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERS4FVNVPROC) (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLREQUESTRESIDENTPROGRAMSNVPROC) (GLsizei n, const GLuint *programs); +typedef void (APIENTRYP PFNGLTRACKMATRIXNVPROC) (GLenum target, GLuint address, GLenum matrix, GLenum transform); +typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERNVPROC) (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DNVPROC) (GLuint index, GLdouble x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FNVPROC) (GLuint index, GLfloat x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SNVPROC) (GLuint index, GLshort x); +typedef void (APIENTRYP PFNGLVERTEXATTRIB1SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DNVPROC) (GLuint index, GLdouble x, GLdouble y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FNVPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SNVPROC) (GLuint index, GLshort x, GLshort y); +typedef void (APIENTRYP PFNGLVERTEXATTRIB2SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z); +typedef void (APIENTRYP PFNGLVERTEXATTRIB3SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DNVPROC) (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4DVNVPROC) (GLuint index, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4FVNVPROC) (GLuint index, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SNVPROC) (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4SVNVPROC) (GLuint index, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBNVPROC) (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +typedef void (APIENTRYP PFNGLVERTEXATTRIB4UBVNVPROC) (GLuint index, const GLubyte *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS1SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS2SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS3SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4DVNVPROC) (GLuint index, GLsizei count, const GLdouble *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4FVNVPROC) (GLuint index, GLsizei count, const GLfloat *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4SVNVPROC) (GLuint index, GLsizei count, const GLshort *v); +typedef void (APIENTRYP PFNGLVERTEXATTRIBS4UBVNVPROC) (GLuint index, GLsizei count, const GLubyte *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLboolean APIENTRY glAreProgramsResidentNV (GLsizei n, const GLuint *programs, GLboolean *residences); +GLAPI void APIENTRY glBindProgramNV (GLenum target, GLuint id); +GLAPI void APIENTRY glDeleteProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glExecuteProgramNV (GLenum target, GLuint id, const GLfloat *params); +GLAPI void APIENTRY glGenProgramsNV (GLsizei n, GLuint *programs); +GLAPI void APIENTRY glGetProgramParameterdvNV (GLenum target, GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetProgramParameterfvNV (GLenum target, GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetProgramivNV (GLuint id, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetProgramStringNV (GLuint id, GLenum pname, GLubyte *program); +GLAPI void APIENTRY glGetTrackMatrixivNV (GLenum target, GLuint address, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribdvNV (GLuint index, GLenum pname, GLdouble *params); +GLAPI void APIENTRY glGetVertexAttribfvNV (GLuint index, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVertexAttribivNV (GLuint index, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVertexAttribPointervNV (GLuint index, GLenum pname, void **pointer); +GLAPI GLboolean APIENTRY glIsProgramNV (GLuint id); +GLAPI void APIENTRY glLoadProgramNV (GLenum target, GLuint id, GLsizei len, const GLubyte *program); +GLAPI void APIENTRY glProgramParameter4dNV (GLenum target, GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glProgramParameter4dvNV (GLenum target, GLuint index, const GLdouble *v); +GLAPI void APIENTRY glProgramParameter4fNV (GLenum target, GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glProgramParameter4fvNV (GLenum target, GLuint index, const GLfloat *v); +GLAPI void APIENTRY glProgramParameters4dvNV (GLenum target, GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glProgramParameters4fvNV (GLenum target, GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glRequestResidentProgramsNV (GLsizei n, const GLuint *programs); +GLAPI void APIENTRY glTrackMatrixNV (GLenum target, GLuint address, GLenum matrix, GLenum transform); +GLAPI void APIENTRY glVertexAttribPointerNV (GLuint index, GLint fsize, GLenum type, GLsizei stride, const void *pointer); +GLAPI void APIENTRY glVertexAttrib1dNV (GLuint index, GLdouble x); +GLAPI void APIENTRY glVertexAttrib1dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib1fNV (GLuint index, GLfloat x); +GLAPI void APIENTRY glVertexAttrib1fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib1sNV (GLuint index, GLshort x); +GLAPI void APIENTRY glVertexAttrib1svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib2dNV (GLuint index, GLdouble x, GLdouble y); +GLAPI void APIENTRY glVertexAttrib2dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib2fNV (GLuint index, GLfloat x, GLfloat y); +GLAPI void APIENTRY glVertexAttrib2fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib2sNV (GLuint index, GLshort x, GLshort y); +GLAPI void APIENTRY glVertexAttrib2svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib3dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI void APIENTRY glVertexAttrib3dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib3fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glVertexAttrib3fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib3sNV (GLuint index, GLshort x, GLshort y, GLshort z); +GLAPI void APIENTRY glVertexAttrib3svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4dNV (GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI void APIENTRY glVertexAttrib4dvNV (GLuint index, const GLdouble *v); +GLAPI void APIENTRY glVertexAttrib4fNV (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glVertexAttrib4fvNV (GLuint index, const GLfloat *v); +GLAPI void APIENTRY glVertexAttrib4sNV (GLuint index, GLshort x, GLshort y, GLshort z, GLshort w); +GLAPI void APIENTRY glVertexAttrib4svNV (GLuint index, const GLshort *v); +GLAPI void APIENTRY glVertexAttrib4ubNV (GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w); +GLAPI void APIENTRY glVertexAttrib4ubvNV (GLuint index, const GLubyte *v); +GLAPI void APIENTRY glVertexAttribs1dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs1fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs1svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs2dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs2fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs2svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs3dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs3fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs3svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4dvNV (GLuint index, GLsizei count, const GLdouble *v); +GLAPI void APIENTRY glVertexAttribs4fvNV (GLuint index, GLsizei count, const GLfloat *v); +GLAPI void APIENTRY glVertexAttribs4svNV (GLuint index, GLsizei count, const GLshort *v); +GLAPI void APIENTRY glVertexAttribs4ubvNV (GLuint index, GLsizei count, const GLubyte *v); +#endif +#endif /* GL_NV_vertex_program */ + +#ifndef GL_NV_vertex_program1_1 +#define GL_NV_vertex_program1_1 1 +#endif /* GL_NV_vertex_program1_1 */ + +#ifndef GL_NV_vertex_program2 +#define GL_NV_vertex_program2 1 +#endif /* GL_NV_vertex_program2 */ + +#ifndef GL_NV_vertex_program2_option +#define GL_NV_vertex_program2_option 1 +#endif /* GL_NV_vertex_program2_option */ + +#ifndef GL_NV_vertex_program3 +#define GL_NV_vertex_program3 1 +#endif /* GL_NV_vertex_program3 */ + +#ifndef GL_NV_vertex_program4 +#define GL_NV_vertex_program4 1 +#define GL_VERTEX_ATTRIB_ARRAY_INTEGER_NV 0x88FD +#endif /* GL_NV_vertex_program4 */ + +#ifndef GL_NV_video_capture +#define GL_NV_video_capture 1 +#define GL_VIDEO_BUFFER_NV 0x9020 +#define GL_VIDEO_BUFFER_BINDING_NV 0x9021 +#define GL_FIELD_UPPER_NV 0x9022 +#define GL_FIELD_LOWER_NV 0x9023 +#define GL_NUM_VIDEO_CAPTURE_STREAMS_NV 0x9024 +#define GL_NEXT_VIDEO_CAPTURE_BUFFER_STATUS_NV 0x9025 +#define GL_VIDEO_CAPTURE_TO_422_SUPPORTED_NV 0x9026 +#define GL_LAST_VIDEO_CAPTURE_STATUS_NV 0x9027 +#define GL_VIDEO_BUFFER_PITCH_NV 0x9028 +#define GL_VIDEO_COLOR_CONVERSION_MATRIX_NV 0x9029 +#define GL_VIDEO_COLOR_CONVERSION_MAX_NV 0x902A +#define GL_VIDEO_COLOR_CONVERSION_MIN_NV 0x902B +#define GL_VIDEO_COLOR_CONVERSION_OFFSET_NV 0x902C +#define GL_VIDEO_BUFFER_INTERNAL_FORMAT_NV 0x902D +#define GL_PARTIAL_SUCCESS_NV 0x902E +#define GL_SUCCESS_NV 0x902F +#define GL_FAILURE_NV 0x9030 +#define GL_YCBYCR8_422_NV 0x9031 +#define GL_YCBAYCR8A_4224_NV 0x9032 +#define GL_Z6Y10Z6CB10Z6Y10Z6CR10_422_NV 0x9033 +#define GL_Z6Y10Z6CB10Z6A10Z6Y10Z6CR10Z6A10_4224_NV 0x9034 +#define GL_Z4Y12Z4CB12Z4Y12Z4CR12_422_NV 0x9035 +#define GL_Z4Y12Z4CB12Z4A12Z4Y12Z4CR12Z4A12_4224_NV 0x9036 +#define GL_Z4Y12Z4CB12Z4CR12_444_NV 0x9037 +#define GL_VIDEO_CAPTURE_FRAME_WIDTH_NV 0x9038 +#define GL_VIDEO_CAPTURE_FRAME_HEIGHT_NV 0x9039 +#define GL_VIDEO_CAPTURE_FIELD_UPPER_HEIGHT_NV 0x903A +#define GL_VIDEO_CAPTURE_FIELD_LOWER_HEIGHT_NV 0x903B +#define GL_VIDEO_CAPTURE_SURFACE_ORIGIN_NV 0x903C +typedef void (APIENTRYP PFNGLBEGINVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMBUFFERNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +typedef void (APIENTRYP PFNGLBINDVIDEOCAPTURESTREAMTEXTURENVPROC) (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +typedef void (APIENTRYP PFNGLENDVIDEOCAPTURENVPROC) (GLuint video_capture_slot); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTUREIVNVPROC) (GLuint video_capture_slot, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETVIDEOCAPTURESTREAMDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +typedef GLenum (APIENTRYP PFNGLVIDEOCAPTURENVPROC) (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERIVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERFVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLVIDEOCAPTURESTREAMPARAMETERDVNVPROC) (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glBeginVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glBindVideoCaptureStreamBufferNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLintptrARB offset); +GLAPI void APIENTRY glBindVideoCaptureStreamTextureNV (GLuint video_capture_slot, GLuint stream, GLenum frame_region, GLenum target, GLuint texture); +GLAPI void APIENTRY glEndVideoCaptureNV (GLuint video_capture_slot); +GLAPI void APIENTRY glGetVideoCaptureivNV (GLuint video_capture_slot, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetVideoCaptureStreamfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetVideoCaptureStreamdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, GLdouble *params); +GLAPI GLenum APIENTRY glVideoCaptureNV (GLuint video_capture_slot, GLuint *sequence_num, GLuint64EXT *capture_time); +GLAPI void APIENTRY glVideoCaptureStreamParameterivNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLint *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterfvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glVideoCaptureStreamParameterdvNV (GLuint video_capture_slot, GLuint stream, GLenum pname, const GLdouble *params); +#endif +#endif /* GL_NV_video_capture */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 +#endif /* GL_NV_viewport_array2 */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B +typedef void (APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#endif +#endif /* GL_NV_viewport_swizzle */ + +#ifndef GL_OML_interlace +#define GL_OML_interlace 1 +#define GL_INTERLACE_OML 0x8980 +#define GL_INTERLACE_READ_OML 0x8981 +#endif /* GL_OML_interlace */ + +#ifndef GL_OML_resample +#define GL_OML_resample 1 +#define GL_PACK_RESAMPLE_OML 0x8984 +#define GL_UNPACK_RESAMPLE_OML 0x8985 +#define GL_RESAMPLE_REPLICATE_OML 0x8986 +#define GL_RESAMPLE_ZERO_FILL_OML 0x8987 +#define GL_RESAMPLE_AVERAGE_OML 0x8988 +#define GL_RESAMPLE_DECIMATE_OML 0x8989 +#endif /* GL_OML_resample */ + +#ifndef GL_OML_subsample +#define GL_OML_subsample 1 +#define GL_FORMAT_SUBSAMPLE_24_24_OML 0x8982 +#define GL_FORMAT_SUBSAMPLE_244_244_OML 0x8983 +#endif /* GL_OML_subsample */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 +typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 +#endif /* GL_OVR_multiview2 */ + +#ifndef GL_PGI_misc_hints +#define GL_PGI_misc_hints 1 +#define GL_PREFER_DOUBLEBUFFER_HINT_PGI 0x1A1F8 +#define GL_CONSERVE_MEMORY_HINT_PGI 0x1A1FD +#define GL_RECLAIM_MEMORY_HINT_PGI 0x1A1FE +#define GL_NATIVE_GRAPHICS_HANDLE_PGI 0x1A202 +#define GL_NATIVE_GRAPHICS_BEGIN_HINT_PGI 0x1A203 +#define GL_NATIVE_GRAPHICS_END_HINT_PGI 0x1A204 +#define GL_ALWAYS_FAST_HINT_PGI 0x1A20C +#define GL_ALWAYS_SOFT_HINT_PGI 0x1A20D +#define GL_ALLOW_DRAW_OBJ_HINT_PGI 0x1A20E +#define GL_ALLOW_DRAW_WIN_HINT_PGI 0x1A20F +#define GL_ALLOW_DRAW_FRG_HINT_PGI 0x1A210 +#define GL_ALLOW_DRAW_MEM_HINT_PGI 0x1A211 +#define GL_STRICT_DEPTHFUNC_HINT_PGI 0x1A216 +#define GL_STRICT_LIGHTING_HINT_PGI 0x1A217 +#define GL_STRICT_SCISSOR_HINT_PGI 0x1A218 +#define GL_FULL_STIPPLE_HINT_PGI 0x1A219 +#define GL_CLIP_NEAR_HINT_PGI 0x1A220 +#define GL_CLIP_FAR_HINT_PGI 0x1A221 +#define GL_WIDE_LINE_HINT_PGI 0x1A222 +#define GL_BACK_NORMALS_HINT_PGI 0x1A223 +typedef void (APIENTRYP PFNGLHINTPGIPROC) (GLenum target, GLint mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glHintPGI (GLenum target, GLint mode); +#endif +#endif /* GL_PGI_misc_hints */ + +#ifndef GL_PGI_vertex_hints +#define GL_PGI_vertex_hints 1 +#define GL_VERTEX_DATA_HINT_PGI 0x1A22A +#define GL_VERTEX_CONSISTENT_HINT_PGI 0x1A22B +#define GL_MATERIAL_SIDE_HINT_PGI 0x1A22C +#define GL_MAX_VERTEX_HINT_PGI 0x1A22D +#define GL_COLOR3_BIT_PGI 0x00010000 +#define GL_COLOR4_BIT_PGI 0x00020000 +#define GL_EDGEFLAG_BIT_PGI 0x00040000 +#define GL_INDEX_BIT_PGI 0x00080000 +#define GL_MAT_AMBIENT_BIT_PGI 0x00100000 +#define GL_MAT_AMBIENT_AND_DIFFUSE_BIT_PGI 0x00200000 +#define GL_MAT_DIFFUSE_BIT_PGI 0x00400000 +#define GL_MAT_EMISSION_BIT_PGI 0x00800000 +#define GL_MAT_COLOR_INDEXES_BIT_PGI 0x01000000 +#define GL_MAT_SHININESS_BIT_PGI 0x02000000 +#define GL_MAT_SPECULAR_BIT_PGI 0x04000000 +#define GL_NORMAL_BIT_PGI 0x08000000 +#define GL_TEXCOORD1_BIT_PGI 0x10000000 +#define GL_TEXCOORD2_BIT_PGI 0x20000000 +#define GL_TEXCOORD3_BIT_PGI 0x40000000 +#define GL_TEXCOORD4_BIT_PGI 0x80000000 +#define GL_VERTEX23_BIT_PGI 0x00000004 +#define GL_VERTEX4_BIT_PGI 0x00000008 +#endif /* GL_PGI_vertex_hints */ + +#ifndef GL_REND_screen_coordinates +#define GL_REND_screen_coordinates 1 +#define GL_SCREEN_COORDINATES_REND 0x8490 +#define GL_INVERTED_SCREEN_W_REND 0x8491 +#endif /* GL_REND_screen_coordinates */ + +#ifndef GL_S3_s3tc +#define GL_S3_s3tc 1 +#define GL_RGB_S3TC 0x83A0 +#define GL_RGB4_S3TC 0x83A1 +#define GL_RGBA_S3TC 0x83A2 +#define GL_RGBA4_S3TC 0x83A3 +#define GL_RGBA_DXT5_S3TC 0x83A4 +#define GL_RGBA4_DXT5_S3TC 0x83A5 +#endif /* GL_S3_s3tc */ + +#ifndef GL_SGIS_detail_texture +#define GL_SGIS_detail_texture 1 +#define GL_DETAIL_TEXTURE_2D_SGIS 0x8095 +#define GL_DETAIL_TEXTURE_2D_BINDING_SGIS 0x8096 +#define GL_LINEAR_DETAIL_SGIS 0x8097 +#define GL_LINEAR_DETAIL_ALPHA_SGIS 0x8098 +#define GL_LINEAR_DETAIL_COLOR_SGIS 0x8099 +#define GL_DETAIL_TEXTURE_LEVEL_SGIS 0x809A +#define GL_DETAIL_TEXTURE_MODE_SGIS 0x809B +#define GL_DETAIL_TEXTURE_FUNC_POINTS_SGIS 0x809C +typedef void (APIENTRYP PFNGLDETAILTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETDETAILTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDetailTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetDetailTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_detail_texture */ + +#ifndef GL_SGIS_fog_function +#define GL_SGIS_fog_function 1 +#define GL_FOG_FUNC_SGIS 0x812A +#define GL_FOG_FUNC_POINTS_SGIS 0x812B +#define GL_MAX_FOG_FUNC_POINTS_SGIS 0x812C +typedef void (APIENTRYP PFNGLFOGFUNCSGISPROC) (GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETFOGFUNCSGISPROC) (GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFogFuncSGIS (GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetFogFuncSGIS (GLfloat *points); +#endif +#endif /* GL_SGIS_fog_function */ + +#ifndef GL_SGIS_generate_mipmap +#define GL_SGIS_generate_mipmap 1 +#define GL_GENERATE_MIPMAP_SGIS 0x8191 +#define GL_GENERATE_MIPMAP_HINT_SGIS 0x8192 +#endif /* GL_SGIS_generate_mipmap */ + +#ifndef GL_SGIS_multisample +#define GL_SGIS_multisample 1 +#define GL_MULTISAMPLE_SGIS 0x809D +#define GL_SAMPLE_ALPHA_TO_MASK_SGIS 0x809E +#define GL_SAMPLE_ALPHA_TO_ONE_SGIS 0x809F +#define GL_SAMPLE_MASK_SGIS 0x80A0 +#define GL_1PASS_SGIS 0x80A1 +#define GL_2PASS_0_SGIS 0x80A2 +#define GL_2PASS_1_SGIS 0x80A3 +#define GL_4PASS_0_SGIS 0x80A4 +#define GL_4PASS_1_SGIS 0x80A5 +#define GL_4PASS_2_SGIS 0x80A6 +#define GL_4PASS_3_SGIS 0x80A7 +#define GL_SAMPLE_BUFFERS_SGIS 0x80A8 +#define GL_SAMPLES_SGIS 0x80A9 +#define GL_SAMPLE_MASK_VALUE_SGIS 0x80AA +#define GL_SAMPLE_MASK_INVERT_SGIS 0x80AB +#define GL_SAMPLE_PATTERN_SGIS 0x80AC +typedef void (APIENTRYP PFNGLSAMPLEMASKSGISPROC) (GLclampf value, GLboolean invert); +typedef void (APIENTRYP PFNGLSAMPLEPATTERNSGISPROC) (GLenum pattern); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSampleMaskSGIS (GLclampf value, GLboolean invert); +GLAPI void APIENTRY glSamplePatternSGIS (GLenum pattern); +#endif +#endif /* GL_SGIS_multisample */ + +#ifndef GL_SGIS_pixel_texture +#define GL_SGIS_pixel_texture 1 +#define GL_PIXEL_TEXTURE_SGIS 0x8353 +#define GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS 0x8354 +#define GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS 0x8355 +#define GL_PIXEL_GROUP_COLOR_SGIS 0x8356 +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERISGISPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERIVSGISPROC) (GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETPIXELTEXGENPARAMETERFVSGISPROC) (GLenum pname, GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenParameteriSGIS (GLenum pname, GLint param); +GLAPI void APIENTRY glPixelTexGenParameterivSGIS (GLenum pname, const GLint *params); +GLAPI void APIENTRY glPixelTexGenParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPixelTexGenParameterfvSGIS (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glGetPixelTexGenParameterivSGIS (GLenum pname, GLint *params); +GLAPI void APIENTRY glGetPixelTexGenParameterfvSGIS (GLenum pname, GLfloat *params); +#endif +#endif /* GL_SGIS_pixel_texture */ + +#ifndef GL_SGIS_point_line_texgen +#define GL_SGIS_point_line_texgen 1 +#define GL_EYE_DISTANCE_TO_POINT_SGIS 0x81F0 +#define GL_OBJECT_DISTANCE_TO_POINT_SGIS 0x81F1 +#define GL_EYE_DISTANCE_TO_LINE_SGIS 0x81F2 +#define GL_OBJECT_DISTANCE_TO_LINE_SGIS 0x81F3 +#define GL_EYE_POINT_SGIS 0x81F4 +#define GL_OBJECT_POINT_SGIS 0x81F5 +#define GL_EYE_LINE_SGIS 0x81F6 +#define GL_OBJECT_LINE_SGIS 0x81F7 +#endif /* GL_SGIS_point_line_texgen */ + +#ifndef GL_SGIS_point_parameters +#define GL_SGIS_point_parameters 1 +#define GL_POINT_SIZE_MIN_SGIS 0x8126 +#define GL_POINT_SIZE_MAX_SGIS 0x8127 +#define GL_POINT_FADE_THRESHOLD_SIZE_SGIS 0x8128 +#define GL_DISTANCE_ATTENUATION_SGIS 0x8129 +typedef void (APIENTRYP PFNGLPOINTPARAMETERFSGISPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLPOINTPARAMETERFVSGISPROC) (GLenum pname, const GLfloat *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPointParameterfSGIS (GLenum pname, GLfloat param); +GLAPI void APIENTRY glPointParameterfvSGIS (GLenum pname, const GLfloat *params); +#endif +#endif /* GL_SGIS_point_parameters */ + +#ifndef GL_SGIS_sharpen_texture +#define GL_SGIS_sharpen_texture 1 +#define GL_LINEAR_SHARPEN_SGIS 0x80AD +#define GL_LINEAR_SHARPEN_ALPHA_SGIS 0x80AE +#define GL_LINEAR_SHARPEN_COLOR_SGIS 0x80AF +#define GL_SHARPEN_TEXTURE_FUNC_POINTS_SGIS 0x80B0 +typedef void (APIENTRYP PFNGLSHARPENTEXFUNCSGISPROC) (GLenum target, GLsizei n, const GLfloat *points); +typedef void (APIENTRYP PFNGLGETSHARPENTEXFUNCSGISPROC) (GLenum target, GLfloat *points); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSharpenTexFuncSGIS (GLenum target, GLsizei n, const GLfloat *points); +GLAPI void APIENTRY glGetSharpenTexFuncSGIS (GLenum target, GLfloat *points); +#endif +#endif /* GL_SGIS_sharpen_texture */ + +#ifndef GL_SGIS_texture4D +#define GL_SGIS_texture4D 1 +#define GL_PACK_SKIP_VOLUMES_SGIS 0x8130 +#define GL_PACK_IMAGE_DEPTH_SGIS 0x8131 +#define GL_UNPACK_SKIP_VOLUMES_SGIS 0x8132 +#define GL_UNPACK_IMAGE_DEPTH_SGIS 0x8133 +#define GL_TEXTURE_4D_SGIS 0x8134 +#define GL_PROXY_TEXTURE_4D_SGIS 0x8135 +#define GL_TEXTURE_4DSIZE_SGIS 0x8136 +#define GL_TEXTURE_WRAP_Q_SGIS 0x8137 +#define GL_MAX_4D_TEXTURE_SIZE_SGIS 0x8138 +#define GL_TEXTURE_4D_BINDING_SGIS 0x814F +typedef void (APIENTRYP PFNGLTEXIMAGE4DSGISPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (APIENTRYP PFNGLTEXSUBIMAGE4DSGISPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTexImage4DSGIS (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLint border, GLenum format, GLenum type, const void *pixels); +GLAPI void APIENTRY glTexSubImage4DSGIS (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint woffset, GLsizei width, GLsizei height, GLsizei depth, GLsizei size4d, GLenum format, GLenum type, const void *pixels); +#endif +#endif /* GL_SGIS_texture4D */ + +#ifndef GL_SGIS_texture_border_clamp +#define GL_SGIS_texture_border_clamp 1 +#define GL_CLAMP_TO_BORDER_SGIS 0x812D +#endif /* GL_SGIS_texture_border_clamp */ + +#ifndef GL_SGIS_texture_color_mask +#define GL_SGIS_texture_color_mask 1 +#define GL_TEXTURE_COLOR_WRITEMASK_SGIS 0x81EF +typedef void (APIENTRYP PFNGLTEXTURECOLORMASKSGISPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTextureColorMaskSGIS (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +#endif +#endif /* GL_SGIS_texture_color_mask */ + +#ifndef GL_SGIS_texture_edge_clamp +#define GL_SGIS_texture_edge_clamp 1 +#define GL_CLAMP_TO_EDGE_SGIS 0x812F +#endif /* GL_SGIS_texture_edge_clamp */ + +#ifndef GL_SGIS_texture_filter4 +#define GL_SGIS_texture_filter4 1 +#define GL_FILTER4_SGIS 0x8146 +#define GL_TEXTURE_FILTER4_SIZE_SGIS 0x8147 +typedef void (APIENTRYP PFNGLGETTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLfloat *weights); +typedef void (APIENTRYP PFNGLTEXFILTERFUNCSGISPROC) (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetTexFilterFuncSGIS (GLenum target, GLenum filter, GLfloat *weights); +GLAPI void APIENTRY glTexFilterFuncSGIS (GLenum target, GLenum filter, GLsizei n, const GLfloat *weights); +#endif +#endif /* GL_SGIS_texture_filter4 */ + +#ifndef GL_SGIS_texture_lod +#define GL_SGIS_texture_lod 1 +#define GL_TEXTURE_MIN_LOD_SGIS 0x813A +#define GL_TEXTURE_MAX_LOD_SGIS 0x813B +#define GL_TEXTURE_BASE_LEVEL_SGIS 0x813C +#define GL_TEXTURE_MAX_LEVEL_SGIS 0x813D +#endif /* GL_SGIS_texture_lod */ + +#ifndef GL_SGIS_texture_select +#define GL_SGIS_texture_select 1 +#define GL_DUAL_ALPHA4_SGIS 0x8110 +#define GL_DUAL_ALPHA8_SGIS 0x8111 +#define GL_DUAL_ALPHA12_SGIS 0x8112 +#define GL_DUAL_ALPHA16_SGIS 0x8113 +#define GL_DUAL_LUMINANCE4_SGIS 0x8114 +#define GL_DUAL_LUMINANCE8_SGIS 0x8115 +#define GL_DUAL_LUMINANCE12_SGIS 0x8116 +#define GL_DUAL_LUMINANCE16_SGIS 0x8117 +#define GL_DUAL_INTENSITY4_SGIS 0x8118 +#define GL_DUAL_INTENSITY8_SGIS 0x8119 +#define GL_DUAL_INTENSITY12_SGIS 0x811A +#define GL_DUAL_INTENSITY16_SGIS 0x811B +#define GL_DUAL_LUMINANCE_ALPHA4_SGIS 0x811C +#define GL_DUAL_LUMINANCE_ALPHA8_SGIS 0x811D +#define GL_QUAD_ALPHA4_SGIS 0x811E +#define GL_QUAD_ALPHA8_SGIS 0x811F +#define GL_QUAD_LUMINANCE4_SGIS 0x8120 +#define GL_QUAD_LUMINANCE8_SGIS 0x8121 +#define GL_QUAD_INTENSITY4_SGIS 0x8122 +#define GL_QUAD_INTENSITY8_SGIS 0x8123 +#define GL_DUAL_TEXTURE_SELECT_SGIS 0x8124 +#define GL_QUAD_TEXTURE_SELECT_SGIS 0x8125 +#endif /* GL_SGIS_texture_select */ + +#ifndef GL_SGIX_async +#define GL_SGIX_async 1 +#define GL_ASYNC_MARKER_SGIX 0x8329 +typedef void (APIENTRYP PFNGLASYNCMARKERSGIXPROC) (GLuint marker); +typedef GLint (APIENTRYP PFNGLFINISHASYNCSGIXPROC) (GLuint *markerp); +typedef GLint (APIENTRYP PFNGLPOLLASYNCSGIXPROC) (GLuint *markerp); +typedef GLuint (APIENTRYP PFNGLGENASYNCMARKERSSGIXPROC) (GLsizei range); +typedef void (APIENTRYP PFNGLDELETEASYNCMARKERSSGIXPROC) (GLuint marker, GLsizei range); +typedef GLboolean (APIENTRYP PFNGLISASYNCMARKERSGIXPROC) (GLuint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glAsyncMarkerSGIX (GLuint marker); +GLAPI GLint APIENTRY glFinishAsyncSGIX (GLuint *markerp); +GLAPI GLint APIENTRY glPollAsyncSGIX (GLuint *markerp); +GLAPI GLuint APIENTRY glGenAsyncMarkersSGIX (GLsizei range); +GLAPI void APIENTRY glDeleteAsyncMarkersSGIX (GLuint marker, GLsizei range); +GLAPI GLboolean APIENTRY glIsAsyncMarkerSGIX (GLuint marker); +#endif +#endif /* GL_SGIX_async */ + +#ifndef GL_SGIX_async_histogram +#define GL_SGIX_async_histogram 1 +#define GL_ASYNC_HISTOGRAM_SGIX 0x832C +#define GL_MAX_ASYNC_HISTOGRAM_SGIX 0x832D +#endif /* GL_SGIX_async_histogram */ + +#ifndef GL_SGIX_async_pixel +#define GL_SGIX_async_pixel 1 +#define GL_ASYNC_TEX_IMAGE_SGIX 0x835C +#define GL_ASYNC_DRAW_PIXELS_SGIX 0x835D +#define GL_ASYNC_READ_PIXELS_SGIX 0x835E +#define GL_MAX_ASYNC_TEX_IMAGE_SGIX 0x835F +#define GL_MAX_ASYNC_DRAW_PIXELS_SGIX 0x8360 +#define GL_MAX_ASYNC_READ_PIXELS_SGIX 0x8361 +#endif /* GL_SGIX_async_pixel */ + +#ifndef GL_SGIX_blend_alpha_minmax +#define GL_SGIX_blend_alpha_minmax 1 +#define GL_ALPHA_MIN_SGIX 0x8320 +#define GL_ALPHA_MAX_SGIX 0x8321 +#endif /* GL_SGIX_blend_alpha_minmax */ + +#ifndef GL_SGIX_calligraphic_fragment +#define GL_SGIX_calligraphic_fragment 1 +#define GL_CALLIGRAPHIC_FRAGMENT_SGIX 0x8183 +#endif /* GL_SGIX_calligraphic_fragment */ + +#ifndef GL_SGIX_clipmap +#define GL_SGIX_clipmap 1 +#define GL_LINEAR_CLIPMAP_LINEAR_SGIX 0x8170 +#define GL_TEXTURE_CLIPMAP_CENTER_SGIX 0x8171 +#define GL_TEXTURE_CLIPMAP_FRAME_SGIX 0x8172 +#define GL_TEXTURE_CLIPMAP_OFFSET_SGIX 0x8173 +#define GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8174 +#define GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX 0x8175 +#define GL_TEXTURE_CLIPMAP_DEPTH_SGIX 0x8176 +#define GL_MAX_CLIPMAP_DEPTH_SGIX 0x8177 +#define GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX 0x8178 +#define GL_NEAREST_CLIPMAP_NEAREST_SGIX 0x844D +#define GL_NEAREST_CLIPMAP_LINEAR_SGIX 0x844E +#define GL_LINEAR_CLIPMAP_NEAREST_SGIX 0x844F +#endif /* GL_SGIX_clipmap */ + +#ifndef GL_SGIX_convolution_accuracy +#define GL_SGIX_convolution_accuracy 1 +#define GL_CONVOLUTION_HINT_SGIX 0x8316 +#endif /* GL_SGIX_convolution_accuracy */ + +#ifndef GL_SGIX_depth_pass_instrument +#define GL_SGIX_depth_pass_instrument 1 +#endif /* GL_SGIX_depth_pass_instrument */ + +#ifndef GL_SGIX_depth_texture +#define GL_SGIX_depth_texture 1 +#define GL_DEPTH_COMPONENT16_SGIX 0x81A5 +#define GL_DEPTH_COMPONENT24_SGIX 0x81A6 +#define GL_DEPTH_COMPONENT32_SGIX 0x81A7 +#endif /* GL_SGIX_depth_texture */ + +#ifndef GL_SGIX_flush_raster +#define GL_SGIX_flush_raster 1 +typedef void (APIENTRYP PFNGLFLUSHRASTERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFlushRasterSGIX (void); +#endif +#endif /* GL_SGIX_flush_raster */ + +#ifndef GL_SGIX_fog_offset +#define GL_SGIX_fog_offset 1 +#define GL_FOG_OFFSET_SGIX 0x8198 +#define GL_FOG_OFFSET_VALUE_SGIX 0x8199 +#endif /* GL_SGIX_fog_offset */ + +#ifndef GL_SGIX_fragment_lighting +#define GL_SGIX_fragment_lighting 1 +#define GL_FRAGMENT_LIGHTING_SGIX 0x8400 +#define GL_FRAGMENT_COLOR_MATERIAL_SGIX 0x8401 +#define GL_FRAGMENT_COLOR_MATERIAL_FACE_SGIX 0x8402 +#define GL_FRAGMENT_COLOR_MATERIAL_PARAMETER_SGIX 0x8403 +#define GL_MAX_FRAGMENT_LIGHTS_SGIX 0x8404 +#define GL_MAX_ACTIVE_LIGHTS_SGIX 0x8405 +#define GL_CURRENT_RASTER_NORMAL_SGIX 0x8406 +#define GL_LIGHT_ENV_MODE_SGIX 0x8407 +#define GL_FRAGMENT_LIGHT_MODEL_LOCAL_VIEWER_SGIX 0x8408 +#define GL_FRAGMENT_LIGHT_MODEL_TWO_SIDE_SGIX 0x8409 +#define GL_FRAGMENT_LIGHT_MODEL_AMBIENT_SGIX 0x840A +#define GL_FRAGMENT_LIGHT_MODEL_NORMAL_INTERPOLATION_SGIX 0x840B +#define GL_FRAGMENT_LIGHT0_SGIX 0x840C +#define GL_FRAGMENT_LIGHT1_SGIX 0x840D +#define GL_FRAGMENT_LIGHT2_SGIX 0x840E +#define GL_FRAGMENT_LIGHT3_SGIX 0x840F +#define GL_FRAGMENT_LIGHT4_SGIX 0x8410 +#define GL_FRAGMENT_LIGHT5_SGIX 0x8411 +#define GL_FRAGMENT_LIGHT6_SGIX 0x8412 +#define GL_FRAGMENT_LIGHT7_SGIX 0x8413 +typedef void (APIENTRYP PFNGLFRAGMENTCOLORMATERIALSGIXPROC) (GLenum face, GLenum mode); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFSGIXPROC) (GLenum light, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTISGIXPROC) (GLenum light, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTLIGHTMODELIVSGIXPROC) (GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFSGIXPROC) (GLenum face, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALISGIXPROC) (GLenum face, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTFVSGIXPROC) (GLenum light, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTLIGHTIVSGIXPROC) (GLenum light, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALFVSGIXPROC) (GLenum face, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETFRAGMENTMATERIALIVSGIXPROC) (GLenum face, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLIGHTENVISGIXPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFragmentColorMaterialSGIX (GLenum face, GLenum mode); +GLAPI void APIENTRY glFragmentLightfSGIX (GLenum light, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightfvSGIX (GLenum light, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightiSGIX (GLenum light, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightivSGIX (GLenum light, GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentLightModelfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentLightModelfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentLightModeliSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentLightModelivSGIX (GLenum pname, const GLint *params); +GLAPI void APIENTRY glFragmentMaterialfSGIX (GLenum face, GLenum pname, GLfloat param); +GLAPI void APIENTRY glFragmentMaterialfvSGIX (GLenum face, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glFragmentMaterialiSGIX (GLenum face, GLenum pname, GLint param); +GLAPI void APIENTRY glFragmentMaterialivSGIX (GLenum face, GLenum pname, const GLint *params); +GLAPI void APIENTRY glGetFragmentLightfvSGIX (GLenum light, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentLightivSGIX (GLenum light, GLenum pname, GLint *params); +GLAPI void APIENTRY glGetFragmentMaterialfvSGIX (GLenum face, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetFragmentMaterialivSGIX (GLenum face, GLenum pname, GLint *params); +GLAPI void APIENTRY glLightEnviSGIX (GLenum pname, GLint param); +#endif +#endif /* GL_SGIX_fragment_lighting */ + +#ifndef GL_SGIX_framezoom +#define GL_SGIX_framezoom 1 +#define GL_FRAMEZOOM_SGIX 0x818B +#define GL_FRAMEZOOM_FACTOR_SGIX 0x818C +#define GL_MAX_FRAMEZOOM_FACTOR_SGIX 0x818D +typedef void (APIENTRYP PFNGLFRAMEZOOMSGIXPROC) (GLint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFrameZoomSGIX (GLint factor); +#endif +#endif /* GL_SGIX_framezoom */ + +#ifndef GL_SGIX_igloo_interface +#define GL_SGIX_igloo_interface 1 +typedef void (APIENTRYP PFNGLIGLOOINTERFACESGIXPROC) (GLenum pname, const void *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glIglooInterfaceSGIX (GLenum pname, const void *params); +#endif +#endif /* GL_SGIX_igloo_interface */ + +#ifndef GL_SGIX_instruments +#define GL_SGIX_instruments 1 +#define GL_INSTRUMENT_BUFFER_POINTER_SGIX 0x8180 +#define GL_INSTRUMENT_MEASUREMENTS_SGIX 0x8181 +typedef GLint (APIENTRYP PFNGLGETINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLINSTRUMENTSBUFFERSGIXPROC) (GLsizei size, GLint *buffer); +typedef GLint (APIENTRYP PFNGLPOLLINSTRUMENTSSGIXPROC) (GLint *marker_p); +typedef void (APIENTRYP PFNGLREADINSTRUMENTSSGIXPROC) (GLint marker); +typedef void (APIENTRYP PFNGLSTARTINSTRUMENTSSGIXPROC) (void); +typedef void (APIENTRYP PFNGLSTOPINSTRUMENTSSGIXPROC) (GLint marker); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI GLint APIENTRY glGetInstrumentsSGIX (void); +GLAPI void APIENTRY glInstrumentsBufferSGIX (GLsizei size, GLint *buffer); +GLAPI GLint APIENTRY glPollInstrumentsSGIX (GLint *marker_p); +GLAPI void APIENTRY glReadInstrumentsSGIX (GLint marker); +GLAPI void APIENTRY glStartInstrumentsSGIX (void); +GLAPI void APIENTRY glStopInstrumentsSGIX (GLint marker); +#endif +#endif /* GL_SGIX_instruments */ + +#ifndef GL_SGIX_interlace +#define GL_SGIX_interlace 1 +#define GL_INTERLACE_SGIX 0x8094 +#endif /* GL_SGIX_interlace */ + +#ifndef GL_SGIX_ir_instrument1 +#define GL_SGIX_ir_instrument1 1 +#define GL_IR_INSTRUMENT1_SGIX 0x817F +#endif /* GL_SGIX_ir_instrument1 */ + +#ifndef GL_SGIX_list_priority +#define GL_SGIX_list_priority 1 +#define GL_LIST_PRIORITY_SGIX 0x8182 +typedef void (APIENTRYP PFNGLGETLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, GLint *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERFSGIXPROC) (GLuint list, GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLLISTPARAMETERFVSGIXPROC) (GLuint list, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLLISTPARAMETERISGIXPROC) (GLuint list, GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLLISTPARAMETERIVSGIXPROC) (GLuint list, GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGetListParameterfvSGIX (GLuint list, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetListParameterivSGIX (GLuint list, GLenum pname, GLint *params); +GLAPI void APIENTRY glListParameterfSGIX (GLuint list, GLenum pname, GLfloat param); +GLAPI void APIENTRY glListParameterfvSGIX (GLuint list, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glListParameteriSGIX (GLuint list, GLenum pname, GLint param); +GLAPI void APIENTRY glListParameterivSGIX (GLuint list, GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_list_priority */ + +#ifndef GL_SGIX_pixel_texture +#define GL_SGIX_pixel_texture 1 +#define GL_PIXEL_TEX_GEN_SGIX 0x8139 +#define GL_PIXEL_TEX_GEN_MODE_SGIX 0x832B +typedef void (APIENTRYP PFNGLPIXELTEXGENSGIXPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glPixelTexGenSGIX (GLenum mode); +#endif +#endif /* GL_SGIX_pixel_texture */ + +#ifndef GL_SGIX_pixel_tiles +#define GL_SGIX_pixel_tiles 1 +#define GL_PIXEL_TILE_BEST_ALIGNMENT_SGIX 0x813E +#define GL_PIXEL_TILE_CACHE_INCREMENT_SGIX 0x813F +#define GL_PIXEL_TILE_WIDTH_SGIX 0x8140 +#define GL_PIXEL_TILE_HEIGHT_SGIX 0x8141 +#define GL_PIXEL_TILE_GRID_WIDTH_SGIX 0x8142 +#define GL_PIXEL_TILE_GRID_HEIGHT_SGIX 0x8143 +#define GL_PIXEL_TILE_GRID_DEPTH_SGIX 0x8144 +#define GL_PIXEL_TILE_CACHE_SIZE_SGIX 0x8145 +#endif /* GL_SGIX_pixel_tiles */ + +#ifndef GL_SGIX_polynomial_ffd +#define GL_SGIX_polynomial_ffd 1 +#define GL_TEXTURE_DEFORMATION_BIT_SGIX 0x00000001 +#define GL_GEOMETRY_DEFORMATION_BIT_SGIX 0x00000002 +#define GL_GEOMETRY_DEFORMATION_SGIX 0x8194 +#define GL_TEXTURE_DEFORMATION_SGIX 0x8195 +#define GL_DEFORMATIONS_MASK_SGIX 0x8196 +#define GL_MAX_DEFORMATION_ORDER_SGIX 0x8197 +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3DSGIXPROC) (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +typedef void (APIENTRYP PFNGLDEFORMATIONMAP3FSGIXPROC) (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +typedef void (APIENTRYP PFNGLDEFORMSGIXPROC) (GLbitfield mask); +typedef void (APIENTRYP PFNGLLOADIDENTITYDEFORMATIONMAPSGIXPROC) (GLbitfield mask); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDeformationMap3dSGIX (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, GLdouble w1, GLdouble w2, GLint wstride, GLint worder, const GLdouble *points); +GLAPI void APIENTRY glDeformationMap3fSGIX (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, GLfloat w1, GLfloat w2, GLint wstride, GLint worder, const GLfloat *points); +GLAPI void APIENTRY glDeformSGIX (GLbitfield mask); +GLAPI void APIENTRY glLoadIdentityDeformationMapSGIX (GLbitfield mask); +#endif +#endif /* GL_SGIX_polynomial_ffd */ + +#ifndef GL_SGIX_reference_plane +#define GL_SGIX_reference_plane 1 +#define GL_REFERENCE_PLANE_SGIX 0x817D +#define GL_REFERENCE_PLANE_EQUATION_SGIX 0x817E +typedef void (APIENTRYP PFNGLREFERENCEPLANESGIXPROC) (const GLdouble *equation); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReferencePlaneSGIX (const GLdouble *equation); +#endif +#endif /* GL_SGIX_reference_plane */ + +#ifndef GL_SGIX_resample +#define GL_SGIX_resample 1 +#define GL_PACK_RESAMPLE_SGIX 0x842E +#define GL_UNPACK_RESAMPLE_SGIX 0x842F +#define GL_RESAMPLE_REPLICATE_SGIX 0x8433 +#define GL_RESAMPLE_ZERO_FILL_SGIX 0x8434 +#define GL_RESAMPLE_DECIMATE_SGIX 0x8430 +#endif /* GL_SGIX_resample */ + +#ifndef GL_SGIX_scalebias_hint +#define GL_SGIX_scalebias_hint 1 +#define GL_SCALEBIAS_HINT_SGIX 0x8322 +#endif /* GL_SGIX_scalebias_hint */ + +#ifndef GL_SGIX_shadow +#define GL_SGIX_shadow 1 +#define GL_TEXTURE_COMPARE_SGIX 0x819A +#define GL_TEXTURE_COMPARE_OPERATOR_SGIX 0x819B +#define GL_TEXTURE_LEQUAL_R_SGIX 0x819C +#define GL_TEXTURE_GEQUAL_R_SGIX 0x819D +#endif /* GL_SGIX_shadow */ + +#ifndef GL_SGIX_shadow_ambient +#define GL_SGIX_shadow_ambient 1 +#define GL_SHADOW_AMBIENT_SGIX 0x80BF +#endif /* GL_SGIX_shadow_ambient */ + +#ifndef GL_SGIX_sprite +#define GL_SGIX_sprite 1 +#define GL_SPRITE_SGIX 0x8148 +#define GL_SPRITE_MODE_SGIX 0x8149 +#define GL_SPRITE_AXIS_SGIX 0x814A +#define GL_SPRITE_TRANSLATION_SGIX 0x814B +#define GL_SPRITE_AXIAL_SGIX 0x814C +#define GL_SPRITE_OBJECT_ALIGNED_SGIX 0x814D +#define GL_SPRITE_EYE_ALIGNED_SGIX 0x814E +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFSGIXPROC) (GLenum pname, GLfloat param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERFVSGIXPROC) (GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERISGIXPROC) (GLenum pname, GLint param); +typedef void (APIENTRYP PFNGLSPRITEPARAMETERIVSGIXPROC) (GLenum pname, const GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glSpriteParameterfSGIX (GLenum pname, GLfloat param); +GLAPI void APIENTRY glSpriteParameterfvSGIX (GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glSpriteParameteriSGIX (GLenum pname, GLint param); +GLAPI void APIENTRY glSpriteParameterivSGIX (GLenum pname, const GLint *params); +#endif +#endif /* GL_SGIX_sprite */ + +#ifndef GL_SGIX_subsample +#define GL_SGIX_subsample 1 +#define GL_PACK_SUBSAMPLE_RATE_SGIX 0x85A0 +#define GL_UNPACK_SUBSAMPLE_RATE_SGIX 0x85A1 +#define GL_PIXEL_SUBSAMPLE_4444_SGIX 0x85A2 +#define GL_PIXEL_SUBSAMPLE_2424_SGIX 0x85A3 +#define GL_PIXEL_SUBSAMPLE_4242_SGIX 0x85A4 +#endif /* GL_SGIX_subsample */ + +#ifndef GL_SGIX_tag_sample_buffer +#define GL_SGIX_tag_sample_buffer 1 +typedef void (APIENTRYP PFNGLTAGSAMPLEBUFFERSGIXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glTagSampleBufferSGIX (void); +#endif +#endif /* GL_SGIX_tag_sample_buffer */ + +#ifndef GL_SGIX_texture_add_env +#define GL_SGIX_texture_add_env 1 +#define GL_TEXTURE_ENV_BIAS_SGIX 0x80BE +#endif /* GL_SGIX_texture_add_env */ + +#ifndef GL_SGIX_texture_coordinate_clamp +#define GL_SGIX_texture_coordinate_clamp 1 +#define GL_TEXTURE_MAX_CLAMP_S_SGIX 0x8369 +#define GL_TEXTURE_MAX_CLAMP_T_SGIX 0x836A +#define GL_TEXTURE_MAX_CLAMP_R_SGIX 0x836B +#endif /* GL_SGIX_texture_coordinate_clamp */ + +#ifndef GL_SGIX_texture_lod_bias +#define GL_SGIX_texture_lod_bias 1 +#define GL_TEXTURE_LOD_BIAS_S_SGIX 0x818E +#define GL_TEXTURE_LOD_BIAS_T_SGIX 0x818F +#define GL_TEXTURE_LOD_BIAS_R_SGIX 0x8190 +#endif /* GL_SGIX_texture_lod_bias */ + +#ifndef GL_SGIX_texture_multi_buffer +#define GL_SGIX_texture_multi_buffer 1 +#define GL_TEXTURE_MULTI_BUFFER_HINT_SGIX 0x812E +#endif /* GL_SGIX_texture_multi_buffer */ + +#ifndef GL_SGIX_texture_scale_bias +#define GL_SGIX_texture_scale_bias 1 +#define GL_POST_TEXTURE_FILTER_BIAS_SGIX 0x8179 +#define GL_POST_TEXTURE_FILTER_SCALE_SGIX 0x817A +#define GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX 0x817B +#define GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX 0x817C +#endif /* GL_SGIX_texture_scale_bias */ + +#ifndef GL_SGIX_vertex_preclip +#define GL_SGIX_vertex_preclip 1 +#define GL_VERTEX_PRECLIP_SGIX 0x83EE +#define GL_VERTEX_PRECLIP_HINT_SGIX 0x83EF +#endif /* GL_SGIX_vertex_preclip */ + +#ifndef GL_SGIX_ycrcb +#define GL_SGIX_ycrcb 1 +#define GL_YCRCB_422_SGIX 0x81BB +#define GL_YCRCB_444_SGIX 0x81BC +#endif /* GL_SGIX_ycrcb */ + +#ifndef GL_SGIX_ycrcb_subsample +#define GL_SGIX_ycrcb_subsample 1 +#endif /* GL_SGIX_ycrcb_subsample */ + +#ifndef GL_SGIX_ycrcba +#define GL_SGIX_ycrcba 1 +#define GL_YCRCB_SGIX 0x8318 +#define GL_YCRCBA_SGIX 0x8319 +#endif /* GL_SGIX_ycrcba */ + +#ifndef GL_SGI_color_matrix +#define GL_SGI_color_matrix 1 +#define GL_COLOR_MATRIX_SGI 0x80B1 +#define GL_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B2 +#define GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI 0x80B3 +#define GL_POST_COLOR_MATRIX_RED_SCALE_SGI 0x80B4 +#define GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI 0x80B5 +#define GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI 0x80B6 +#define GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI 0x80B7 +#define GL_POST_COLOR_MATRIX_RED_BIAS_SGI 0x80B8 +#define GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI 0x80B9 +#define GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI 0x80BA +#define GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI 0x80BB +#endif /* GL_SGI_color_matrix */ + +#ifndef GL_SGI_color_table +#define GL_SGI_color_table 1 +#define GL_COLOR_TABLE_SGI 0x80D0 +#define GL_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D1 +#define GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D2 +#define GL_PROXY_COLOR_TABLE_SGI 0x80D3 +#define GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI 0x80D4 +#define GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI 0x80D5 +#define GL_COLOR_TABLE_SCALE_SGI 0x80D6 +#define GL_COLOR_TABLE_BIAS_SGI 0x80D7 +#define GL_COLOR_TABLE_FORMAT_SGI 0x80D8 +#define GL_COLOR_TABLE_WIDTH_SGI 0x80D9 +#define GL_COLOR_TABLE_RED_SIZE_SGI 0x80DA +#define GL_COLOR_TABLE_GREEN_SIZE_SGI 0x80DB +#define GL_COLOR_TABLE_BLUE_SIZE_SGI 0x80DC +#define GL_COLOR_TABLE_ALPHA_SIZE_SGI 0x80DD +#define GL_COLOR_TABLE_LUMINANCE_SIZE_SGI 0x80DE +#define GL_COLOR_TABLE_INTENSITY_SIZE_SGI 0x80DF +typedef void (APIENTRYP PFNGLCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (APIENTRYP PFNGLCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (APIENTRYP PFNGLCOPYCOLORTABLESGIPROC) (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +typedef void (APIENTRYP PFNGLGETCOLORTABLESGIPROC) (GLenum target, GLenum format, GLenum type, void *table); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERFVSGIPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (APIENTRYP PFNGLGETCOLORTABLEPARAMETERIVSGIPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColorTableSGI (GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, const void *table); +GLAPI void APIENTRY glColorTableParameterfvSGI (GLenum target, GLenum pname, const GLfloat *params); +GLAPI void APIENTRY glColorTableParameterivSGI (GLenum target, GLenum pname, const GLint *params); +GLAPI void APIENTRY glCopyColorTableSGI (GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width); +GLAPI void APIENTRY glGetColorTableSGI (GLenum target, GLenum format, GLenum type, void *table); +GLAPI void APIENTRY glGetColorTableParameterfvSGI (GLenum target, GLenum pname, GLfloat *params); +GLAPI void APIENTRY glGetColorTableParameterivSGI (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_SGI_color_table */ + +#ifndef GL_SGI_texture_color_table +#define GL_SGI_texture_color_table 1 +#define GL_TEXTURE_COLOR_TABLE_SGI 0x80BC +#define GL_PROXY_TEXTURE_COLOR_TABLE_SGI 0x80BD +#endif /* GL_SGI_texture_color_table */ + +#ifndef GL_SUNX_constant_data +#define GL_SUNX_constant_data 1 +#define GL_UNPACK_CONSTANT_DATA_SUNX 0x81D5 +#define GL_TEXTURE_CONSTANT_DATA_SUNX 0x81D6 +typedef void (APIENTRYP PFNGLFINISHTEXTURESUNXPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glFinishTextureSUNX (void); +#endif +#endif /* GL_SUNX_constant_data */ + +#ifndef GL_SUN_convolution_border_modes +#define GL_SUN_convolution_border_modes 1 +#define GL_WRAP_BORDER_SUN 0x81D4 +#endif /* GL_SUN_convolution_border_modes */ + +#ifndef GL_SUN_global_alpha +#define GL_SUN_global_alpha 1 +#define GL_GLOBAL_ALPHA_SUN 0x81D9 +#define GL_GLOBAL_ALPHA_FACTOR_SUN 0x81DA +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORBSUNPROC) (GLbyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORSSUNPROC) (GLshort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORISUNPROC) (GLint factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORFSUNPROC) (GLfloat factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORDSUNPROC) (GLdouble factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUBSUNPROC) (GLubyte factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUSSUNPROC) (GLushort factor); +typedef void (APIENTRYP PFNGLGLOBALALPHAFACTORUISUNPROC) (GLuint factor); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glGlobalAlphaFactorbSUN (GLbyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorsSUN (GLshort factor); +GLAPI void APIENTRY glGlobalAlphaFactoriSUN (GLint factor); +GLAPI void APIENTRY glGlobalAlphaFactorfSUN (GLfloat factor); +GLAPI void APIENTRY glGlobalAlphaFactordSUN (GLdouble factor); +GLAPI void APIENTRY glGlobalAlphaFactorubSUN (GLubyte factor); +GLAPI void APIENTRY glGlobalAlphaFactorusSUN (GLushort factor); +GLAPI void APIENTRY glGlobalAlphaFactoruiSUN (GLuint factor); +#endif +#endif /* GL_SUN_global_alpha */ + +#ifndef GL_SUN_mesh_array +#define GL_SUN_mesh_array 1 +#define GL_QUAD_MESH_SUN 0x8614 +#define GL_TRIANGLE_MESH_SUN 0x8615 +typedef void (APIENTRYP PFNGLDRAWMESHARRAYSSUNPROC) (GLenum mode, GLint first, GLsizei count, GLsizei width); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glDrawMeshArraysSUN (GLenum mode, GLint first, GLsizei count, GLsizei width); +#endif +#endif /* GL_SUN_mesh_array */ + +#ifndef GL_SUN_slice_accum +#define GL_SUN_slice_accum 1 +#define GL_SLICE_ACCUM_SUN 0x85CC +#endif /* GL_SUN_slice_accum */ + +#ifndef GL_SUN_triangle_list +#define GL_SUN_triangle_list 1 +#define GL_RESTART_SUN 0x0001 +#define GL_REPLACE_MIDDLE_SUN 0x0002 +#define GL_REPLACE_OLDEST_SUN 0x0003 +#define GL_TRIANGLE_LIST_SUN 0x81D7 +#define GL_REPLACEMENT_CODE_SUN 0x81D8 +#define GL_REPLACEMENT_CODE_ARRAY_SUN 0x85C0 +#define GL_REPLACEMENT_CODE_ARRAY_TYPE_SUN 0x85C1 +#define GL_REPLACEMENT_CODE_ARRAY_STRIDE_SUN 0x85C2 +#define GL_REPLACEMENT_CODE_ARRAY_POINTER_SUN 0x85C3 +#define GL_R1UI_V3F_SUN 0x85C4 +#define GL_R1UI_C4UB_V3F_SUN 0x85C5 +#define GL_R1UI_C3F_V3F_SUN 0x85C6 +#define GL_R1UI_N3F_V3F_SUN 0x85C7 +#define GL_R1UI_C4F_N3F_V3F_SUN 0x85C8 +#define GL_R1UI_T2F_V3F_SUN 0x85C9 +#define GL_R1UI_T2F_N3F_V3F_SUN 0x85CA +#define GL_R1UI_T2F_C4F_N3F_V3F_SUN 0x85CB +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUISUNPROC) (GLuint code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSSUNPROC) (GLushort code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBSUNPROC) (GLubyte code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVSUNPROC) (const GLuint *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUSVSUNPROC) (const GLushort *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUBVSUNPROC) (const GLubyte *code); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEPOINTERSUNPROC) (GLenum type, GLsizei stride, const void **pointer); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glReplacementCodeuiSUN (GLuint code); +GLAPI void APIENTRY glReplacementCodeusSUN (GLushort code); +GLAPI void APIENTRY glReplacementCodeubSUN (GLubyte code); +GLAPI void APIENTRY glReplacementCodeuivSUN (const GLuint *code); +GLAPI void APIENTRY glReplacementCodeusvSUN (const GLushort *code); +GLAPI void APIENTRY glReplacementCodeubvSUN (const GLubyte *code); +GLAPI void APIENTRY glReplacementCodePointerSUN (GLenum type, GLsizei stride, const void **pointer); +#endif +#endif /* GL_SUN_triangle_list */ + +#ifndef GL_SUN_vertex +#define GL_SUN_vertex 1 +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX2FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FSUNPROC) (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4UBVERTEX3FVSUNPROC) (const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FSUNPROC) (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4UBVERTEX3FVSUNPROC) (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLTEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FSUNPROC) (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (APIENTRYP PFNGLTEXCOORD4FCOLOR4FNORMAL3FVERTEX4FVSUNPROC) (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FSUNPROC) (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUIVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FSUNPROC) (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4UBVERTEX3FVSUNPROC) (const GLuint *rc, const GLubyte *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUINORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUICOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FSUNPROC) (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +typedef void (APIENTRYP PFNGLREPLACEMENTCODEUITEXCOORD2FCOLOR4FNORMAL3FVERTEX3FVSUNPROC) (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#ifdef GL_GLEXT_PROTOTYPES +GLAPI void APIENTRY glColor4ubVertex2fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y); +GLAPI void APIENTRY glColor4ubVertex2fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor4ubVertex3fSUN (GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4ubVertex3fvSUN (const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glColor3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor3fVertex3fvSUN (const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glNormal3fVertex3fSUN (GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glNormal3fVertex3fvSUN (const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glColor4fNormal3fVertex3fSUN (GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glColor4fNormal3fVertex3fvSUN (const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fVertex3fSUN (GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fVertex3fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fVertex4fvSUN (const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fSUN (GLfloat s, GLfloat t, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4ubVertex3fvSUN (const GLfloat *tc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fSUN (GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glTexCoord2fColor4fNormal3fVertex3fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fSUN (GLfloat s, GLfloat t, GLfloat p, GLfloat q, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GLAPI void APIENTRY glTexCoord4fColor4fNormal3fVertex4fvSUN (const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiVertex3fSUN (GLuint rc, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiVertex3fvSUN (const GLuint *rc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fSUN (GLuint rc, GLubyte r, GLubyte g, GLubyte b, GLubyte a, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4ubVertex3fvSUN (const GLuint *rc, const GLubyte *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fSUN (GLuint rc, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *n, const GLfloat *v); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (GLuint rc, GLfloat s, GLfloat t, GLfloat r, GLfloat g, GLfloat b, GLfloat a, GLfloat nx, GLfloat ny, GLfloat nz, GLfloat x, GLfloat y, GLfloat z); +GLAPI void APIENTRY glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (const GLuint *rc, const GLfloat *tc, const GLfloat *c, const GLfloat *n, const GLfloat *v); +#endif +#endif /* GL_SUN_vertex */ + +#ifndef GL_WIN_phong_shading +#define GL_WIN_phong_shading 1 +#define GL_PHONG_WIN 0x80EA +#define GL_PHONG_HINT_WIN 0x80EB +#endif /* GL_WIN_phong_shading */ + +#ifndef GL_WIN_specular_fog +#define GL_WIN_specular_fog 1 +#define GL_FOG_SPECULAR_TEXTURE_WIN 0x80EC +#endif /* GL_WIN_specular_fog */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/SDL/SDL_opengles.h b/include/SDL/SDL_opengles.h new file mode 100644 index 0000000..f4465ea --- /dev/null +++ b/include/SDL/SDL_opengles.h @@ -0,0 +1,39 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_opengles.h + * + * This is a simple file to encapsulate the OpenGL ES 1.X API headers. + */ +#include "SDL_config.h" + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#endif + +#ifndef APIENTRY +#define APIENTRY +#endif diff --git a/include/SDL/SDL_opengles2.h b/include/SDL/SDL_opengles2.h new file mode 100644 index 0000000..5e3b717 --- /dev/null +++ b/include/SDL/SDL_opengles2.h @@ -0,0 +1,52 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_opengles2.h + * + * This is a simple file to encapsulate the OpenGL ES 2.0 API headers. + */ +#include "SDL_config.h" + +#if !defined(_MSC_VER) && !defined(SDL_USE_BUILTIN_OPENGL_DEFINITIONS) + +#ifdef __IPHONEOS__ +#include +#include +#else +#include +#include +#include +#endif + +#else /* _MSC_VER */ + +/* OpenGL ES2 headers for Visual Studio */ +#include "SDL_opengles2_khrplatform.h" +#include "SDL_opengles2_gl2platform.h" +#include "SDL_opengles2_gl2.h" +#include "SDL_opengles2_gl2ext.h" + +#endif /* _MSC_VER */ + +#ifndef APIENTRY +#define APIENTRY GL_APIENTRY +#endif diff --git a/include/SDL/SDL_opengles2_gl2.h b/include/SDL/SDL_opengles2_gl2.h new file mode 100644 index 0000000..d13622a --- /dev/null +++ b/include/SDL/SDL_opengles2_gl2.h @@ -0,0 +1,656 @@ +#ifndef __gles2_gl2_h_ +#define __gles2_gl2_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +/*#include */ + +#ifndef GL_APIENTRYP +#define GL_APIENTRYP GL_APIENTRY* +#endif + +#ifndef GL_GLES_PROTOTYPES +#define GL_GLES_PROTOTYPES 1 +#endif + +/* Generated on date 20220530 */ + +/* Generated C header for: + * API: gles2 + * Profile: common + * Versions considered: 2\.[0-9] + * Versions emitted: .* + * Default extensions included: None + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_ES_VERSION_2_0 +#define GL_ES_VERSION_2_0 1 +/*#include */ +typedef khronos_int8_t GLbyte; +typedef khronos_float_t GLclampf; +typedef khronos_int32_t GLfixed; +typedef khronos_int16_t GLshort; +typedef khronos_uint16_t GLushort; +typedef void GLvoid; +typedef struct __GLsync *GLsync; +typedef khronos_int64_t GLint64; +typedef khronos_uint64_t GLuint64; +typedef unsigned int GLenum; +typedef unsigned int GLuint; +typedef char GLchar; +typedef khronos_float_t GLfloat; +typedef khronos_ssize_t GLsizeiptr; +typedef khronos_intptr_t GLintptr; +typedef unsigned int GLbitfield; +typedef int GLint; +typedef unsigned char GLboolean; +typedef int GLsizei; +typedef khronos_uint8_t GLubyte; +#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_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_FUNC_ADD 0x8006 +#define GL_BLEND_EQUATION 0x8009 +#define GL_BLEND_EQUATION_RGB 0x8009 +#define GL_BLEND_EQUATION_ALPHA 0x883D +#define GL_FUNC_SUBTRACT 0x800A +#define GL_FUNC_REVERSE_SUBTRACT 0x800B +#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_CONSTANT_COLOR 0x8001 +#define GL_ONE_MINUS_CONSTANT_COLOR 0x8002 +#define GL_CONSTANT_ALPHA 0x8003 +#define GL_ONE_MINUS_CONSTANT_ALPHA 0x8004 +#define GL_BLEND_COLOR 0x8005 +#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_STREAM_DRAW 0x88E0 +#define GL_STATIC_DRAW 0x88E4 +#define GL_DYNAMIC_DRAW 0x88E8 +#define GL_BUFFER_SIZE 0x8764 +#define GL_BUFFER_USAGE 0x8765 +#define GL_CURRENT_VERTEX_ATTRIB 0x8626 +#define GL_FRONT 0x0404 +#define GL_BACK 0x0405 +#define GL_FRONT_AND_BACK 0x0408 +#define GL_TEXTURE_2D 0x0DE1 +#define GL_CULL_FACE 0x0B44 +#define GL_BLEND 0x0BE2 +#define GL_DITHER 0x0BD0 +#define GL_STENCIL_TEST 0x0B90 +#define GL_DEPTH_TEST 0x0B71 +#define GL_SCISSOR_TEST 0x0C11 +#define GL_POLYGON_OFFSET_FILL 0x8037 +#define GL_SAMPLE_ALPHA_TO_COVERAGE 0x809E +#define GL_SAMPLE_COVERAGE 0x80A0 +#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_LINE_WIDTH 0x0B21 +#define GL_ALIASED_POINT_SIZE_RANGE 0x846D +#define GL_ALIASED_LINE_WIDTH_RANGE 0x846E +#define GL_CULL_FACE_MODE 0x0B45 +#define GL_FRONT_FACE 0x0B46 +#define GL_DEPTH_RANGE 0x0B70 +#define GL_DEPTH_WRITEMASK 0x0B72 +#define GL_DEPTH_CLEAR_VALUE 0x0B73 +#define GL_DEPTH_FUNC 0x0B74 +#define GL_STENCIL_CLEAR_VALUE 0x0B91 +#define GL_STENCIL_FUNC 0x0B92 +#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_VALUE_MASK 0x0B93 +#define GL_STENCIL_WRITEMASK 0x0B98 +#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_STENCIL_BACK_REF 0x8CA3 +#define GL_STENCIL_BACK_VALUE_MASK 0x8CA4 +#define GL_STENCIL_BACK_WRITEMASK 0x8CA5 +#define GL_VIEWPORT 0x0BA2 +#define GL_SCISSOR_BOX 0x0C10 +#define GL_COLOR_CLEAR_VALUE 0x0C22 +#define GL_COLOR_WRITEMASK 0x0C23 +#define GL_UNPACK_ALIGNMENT 0x0CF5 +#define GL_PACK_ALIGNMENT 0x0D05 +#define GL_MAX_TEXTURE_SIZE 0x0D33 +#define GL_MAX_VIEWPORT_DIMS 0x0D3A +#define GL_SUBPIXEL_BITS 0x0D50 +#define GL_RED_BITS 0x0D52 +#define GL_GREEN_BITS 0x0D53 +#define GL_BLUE_BITS 0x0D54 +#define GL_ALPHA_BITS 0x0D55 +#define GL_DEPTH_BITS 0x0D56 +#define GL_STENCIL_BITS 0x0D57 +#define GL_POLYGON_OFFSET_UNITS 0x2A00 +#define GL_POLYGON_OFFSET_FACTOR 0x8038 +#define GL_TEXTURE_BINDING_2D 0x8069 +#define GL_SAMPLE_BUFFERS 0x80A8 +#define GL_SAMPLES 0x80A9 +#define GL_SAMPLE_COVERAGE_VALUE 0x80AA +#define GL_SAMPLE_COVERAGE_INVERT 0x80AB +#define GL_NUM_COMPRESSED_TEXTURE_FORMATS 0x86A2 +#define GL_COMPRESSED_TEXTURE_FORMATS 0x86A3 +#define GL_DONT_CARE 0x1100 +#define GL_FASTEST 0x1101 +#define GL_NICEST 0x1102 +#define GL_GENERATE_MIPMAP_HINT 0x8192 +#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_FIXED 0x140C +#define GL_DEPTH_COMPONENT 0x1902 +#define GL_ALPHA 0x1906 +#define GL_RGB 0x1907 +#define GL_RGBA 0x1908 +#define GL_LUMINANCE 0x1909 +#define GL_LUMINANCE_ALPHA 0x190A +#define GL_UNSIGNED_SHORT_4_4_4_4 0x8033 +#define GL_UNSIGNED_SHORT_5_5_5_1 0x8034 +#define GL_UNSIGNED_SHORT_5_6_5 0x8363 +#define GL_FRAGMENT_SHADER 0x8B30 +#define GL_VERTEX_SHADER 0x8B31 +#define GL_MAX_VERTEX_ATTRIBS 0x8869 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 0x8B4D +#define GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 0x8B4C +#define GL_MAX_TEXTURE_IMAGE_UNITS 0x8872 +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_SHADER_TYPE 0x8B4F +#define GL_DELETE_STATUS 0x8B80 +#define GL_LINK_STATUS 0x8B82 +#define GL_VALIDATE_STATUS 0x8B83 +#define GL_ATTACHED_SHADERS 0x8B85 +#define GL_ACTIVE_UNIFORMS 0x8B86 +#define GL_ACTIVE_UNIFORM_MAX_LENGTH 0x8B87 +#define GL_ACTIVE_ATTRIBUTES 0x8B89 +#define GL_ACTIVE_ATTRIBUTE_MAX_LENGTH 0x8B8A +#define GL_SHADING_LANGUAGE_VERSION 0x8B8C +#define GL_CURRENT_PROGRAM 0x8B8D +#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_KEEP 0x1E00 +#define GL_REPLACE 0x1E01 +#define GL_INCR 0x1E02 +#define GL_DECR 0x1E03 +#define GL_INVERT 0x150A +#define GL_INCR_WRAP 0x8507 +#define GL_DECR_WRAP 0x8508 +#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_TEXTURE 0x1702 +#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_MAX_CUBE_MAP_TEXTURE_SIZE 0x851C +#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_REPEAT 0x2901 +#define GL_CLAMP_TO_EDGE 0x812F +#define GL_MIRRORED_REPEAT 0x8370 +#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_2D 0x8B5E +#define GL_SAMPLER_CUBE 0x8B60 +#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_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A +#define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645 +#define GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING 0x889F +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_COMPILE_STATUS 0x8B81 +#define GL_INFO_LOG_LENGTH 0x8B84 +#define GL_SHADER_SOURCE_LENGTH 0x8B88 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_FRAMEBUFFER 0x8D40 +#define GL_RENDERBUFFER 0x8D41 +#define GL_RGBA4 0x8056 +#define GL_RGB5_A1 0x8057 +#define GL_RGB565 0x8D62 +#define GL_DEPTH_COMPONENT16 0x81A5 +#define GL_STENCIL_INDEX8 0x8D48 +#define GL_RENDERBUFFER_WIDTH 0x8D42 +#define GL_RENDERBUFFER_HEIGHT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 +#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_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_COLOR_ATTACHMENT0 0x8CE0 +#define GL_DEPTH_ATTACHMENT 0x8D00 +#define GL_STENCIL_ATTACHMENT 0x8D20 +#define GL_NONE 0 +#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS 0x8CD9 +#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD +#define GL_FRAMEBUFFER_BINDING 0x8CA6 +#define GL_RENDERBUFFER_BINDING 0x8CA7 +#define GL_MAX_RENDERBUFFER_SIZE 0x84E8 +#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 +typedef void (GL_APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (GL_APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP PFNGLBINDATTRIBLOCATIONPROC) (GLuint program, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLBINDFRAMEBUFFERPROC) (GLenum target, GLuint framebuffer); +typedef void (GL_APIENTRYP PFNGLBINDRENDERBUFFERPROC) (GLenum target, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture); +typedef void (GL_APIENTRYP PFNGLBLENDCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +typedef void (GL_APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +typedef void (GL_APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +typedef GLenum (GL_APIENTRYP PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLCLEARPROC) (GLbitfield mask); +typedef void (GL_APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +typedef void (GL_APIENTRYP PFNGLCLEARDEPTHFPROC) (GLfloat d); +typedef void (GL_APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s); +typedef void (GL_APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +typedef void (GL_APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef GLuint (GL_APIENTRYP PFNGLCREATEPROGRAMPROC) (void); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROC) (GLenum type); +typedef void (GL_APIENTRYP PFNGLCULLFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers); +typedef void (GL_APIENTRYP PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint *framebuffers); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint *renderbuffers); +typedef void (GL_APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader); +typedef void (GL_APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures); +typedef void (GL_APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func); +typedef void (GL_APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEFPROC) (GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader); +typedef void (GL_APIENTRYP PFNGLDISABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices); +typedef void (GL_APIENTRYP PFNGLENABLEPROC) (GLenum cap); +typedef void (GL_APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index); +typedef void (GL_APIENTRYP PFNGLFINISHPROC) (void); +typedef void (GL_APIENTRYP PFNGLFLUSHPROC) (void); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +typedef void (GL_APIENTRYP PFNGLFRONTFACEPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers); +typedef void (GL_APIENTRYP PFNGLGENERATEMIPMAPPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGENFRAMEBUFFERSPROC) (GLsizei n, GLuint *framebuffers); +typedef void (GL_APIENTRYP PFNGLGENRENDERBUFFERSPROC) (GLsizei n, GLuint *renderbuffers); +typedef void (GL_APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures); +typedef void (GL_APIENTRYP PFNGLGETACTIVEATTRIBPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETACTIVEUNIFORMPROC) (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETATTACHEDSHADERSPROC) (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +typedef GLint (GL_APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETBOOLEANVPROC) (GLenum pname, GLboolean *data); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef GLenum (GL_APIENTRYP PFNGLGETERRORPROC) (void); +typedef void (GL_APIENTRYP PFNGLGETFLOATVPROC) (GLenum pname, GLfloat *data); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC) (GLenum target, GLenum attachment, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETRENDERBUFFERPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC) (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +typedef void (GL_APIENTRYP PFNGLGETSHADERSOURCEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +typedef const GLubyte *(GL_APIENTRYP PFNGLGETSTRINGPROC) (GLenum name); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERFVPROC) (GLenum target, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIVPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMFVPROC) (GLuint program, GLint location, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMIVPROC) (GLuint program, GLint location, GLint *params); +typedef GLint (GL_APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBFVPROC) (GLuint index, GLenum pname, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer); +typedef void (GL_APIENTRYP PFNGLHINTPROC) (GLenum target, GLenum mode); +typedef GLboolean (GL_APIENTRYP PFNGLISBUFFERPROC) (GLuint buffer); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDPROC) (GLenum cap); +typedef GLboolean (GL_APIENTRYP PFNGLISFRAMEBUFFERPROC) (GLuint framebuffer); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPROC) (GLuint program); +typedef GLboolean (GL_APIENTRYP PFNGLISRENDERBUFFERPROC) (GLuint renderbuffer); +typedef GLboolean (GL_APIENTRYP PFNGLISSHADERPROC) (GLuint shader); +typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREPROC) (GLuint texture); +typedef void (GL_APIENTRYP PFNGLLINEWIDTHPROC) (GLfloat width); +typedef void (GL_APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETPROC) (GLfloat factor, GLfloat units); +typedef void (GL_APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +typedef void (GL_APIENTRYP PFNGLRELEASESHADERCOMPILERPROC) (void); +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEPROC) (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSAMPLECOVERAGEPROC) (GLfloat value, GLboolean invert); +typedef void (GL_APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSHADERBINARYPROC) (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +typedef void (GL_APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +typedef void (GL_APIENTRYP PFNGLSTENCILFUNCPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILFUNCSEPARATEPROC) (GLenum face, GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILMASKPROC) (GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILMASKSEPARATEPROC) (GLenum face, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILOPPROC) (GLenum fail, GLenum zfail, GLenum zpass); +typedef void (GL_APIENTRYP PFNGLSTENCILOPSEPARATEPROC) (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +typedef void (GL_APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFPROC) (GLenum target, GLenum pname, GLfloat param); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERFVPROC) (GLenum target, GLenum pname, const GLfloat *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIVPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLUNIFORM1FPROC) (GLint location, GLfloat v0); +typedef void (GL_APIENTRYP PFNGLUNIFORM1FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0); +typedef void (GL_APIENTRYP PFNGLUNIFORM1IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2FPROC) (GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP PFNGLUNIFORM2FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2IPROC) (GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP PFNGLUNIFORM2IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP PFNGLUNIFORM3FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3IPROC) (GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP PFNGLUNIFORM3IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4FPROC) (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP PFNGLUNIFORM4FVPROC) (GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4IPROC) (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP PFNGLUNIFORM4IVPROC) (GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FPROC) (GLuint index, GLfloat x); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB1FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FPROC) (GLuint index, GLfloat x, GLfloat y); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB2FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB3FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIB4FVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +typedef void (GL_APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +#if GL_GLES_PROTOTYPES +GL_APICALL void GL_APIENTRY glActiveTexture (GLenum texture); +GL_APICALL void GL_APIENTRY glAttachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glBindAttribLocation (GLuint program, GLuint index, const GLchar *name); +GL_APICALL void GL_APIENTRY glBindBuffer (GLenum target, GLuint buffer); +GL_APICALL void GL_APIENTRY glBindFramebuffer (GLenum target, GLuint framebuffer); +GL_APICALL void GL_APIENTRY glBindRenderbuffer (GLenum target, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glBindTexture (GLenum target, GLuint texture); +GL_APICALL void GL_APIENTRY glBlendColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GL_APICALL void GL_APIENTRY glBlendEquation (GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunc (GLenum sfactor, GLenum dfactor); +GL_APICALL void GL_APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha); +GL_APICALL void GL_APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage); +GL_APICALL void GL_APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data); +GL_APICALL GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target); +GL_APICALL void GL_APIENTRY glClear (GLbitfield mask); +GL_APICALL void GL_APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); +GL_APICALL void GL_APIENTRY glClearDepthf (GLfloat d); +GL_APICALL void GL_APIENTRY glClearStencil (GLint s); +GL_APICALL void GL_APIENTRY glColorMask (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha); +GL_APICALL void GL_APIENTRY glCompileShader (GLuint shader); +GL_APICALL void GL_APIENTRY glCompressedTexImage2D (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCopyTexImage2D (GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border); +GL_APICALL void GL_APIENTRY glCopyTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL GLuint GL_APIENTRY glCreateProgram (void); +GL_APICALL GLuint GL_APIENTRY glCreateShader (GLenum type); +GL_APICALL void GL_APIENTRY glCullFace (GLenum mode); +GL_APICALL void GL_APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers); +GL_APICALL void GL_APIENTRY glDeleteFramebuffers (GLsizei n, const GLuint *framebuffers); +GL_APICALL void GL_APIENTRY glDeleteProgram (GLuint program); +GL_APICALL void GL_APIENTRY glDeleteRenderbuffers (GLsizei n, const GLuint *renderbuffers); +GL_APICALL void GL_APIENTRY glDeleteShader (GLuint shader); +GL_APICALL void GL_APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures); +GL_APICALL void GL_APIENTRY glDepthFunc (GLenum func); +GL_APICALL void GL_APIENTRY glDepthMask (GLboolean flag); +GL_APICALL void GL_APIENTRY glDepthRangef (GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glDetachShader (GLuint program, GLuint shader); +GL_APICALL void GL_APIENTRY glDisable (GLenum cap); +GL_APICALL void GL_APIENTRY glDisableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count); +GL_APICALL void GL_APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices); +GL_APICALL void GL_APIENTRY glEnable (GLenum cap); +GL_APICALL void GL_APIENTRY glEnableVertexAttribArray (GLuint index); +GL_APICALL void GL_APIENTRY glFinish (void); +GL_APICALL void GL_APIENTRY glFlush (void); +GL_APICALL void GL_APIENTRY glFramebufferRenderbuffer (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer); +GL_APICALL void GL_APIENTRY glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); +GL_APICALL void GL_APIENTRY glFrontFace (GLenum mode); +GL_APICALL void GL_APIENTRY glGenBuffers (GLsizei n, GLuint *buffers); +GL_APICALL void GL_APIENTRY glGenerateMipmap (GLenum target); +GL_APICALL void GL_APIENTRY glGenFramebuffers (GLsizei n, GLuint *framebuffers); +GL_APICALL void GL_APIENTRY glGenRenderbuffers (GLsizei n, GLuint *renderbuffers); +GL_APICALL void GL_APIENTRY glGenTextures (GLsizei n, GLuint *textures); +GL_APICALL void GL_APIENTRY glGetActiveAttrib (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GL_APICALL void GL_APIENTRY glGetActiveUniform (GLuint program, GLuint index, GLsizei bufSize, GLsizei *length, GLint *size, GLenum *type, GLchar *name); +GL_APICALL void GL_APIENTRY glGetAttachedShaders (GLuint program, GLsizei maxCount, GLsizei *count, GLuint *shaders); +GL_APICALL GLint GL_APIENTRY glGetAttribLocation (GLuint program, const GLchar *name); +GL_APICALL void GL_APIENTRY glGetBooleanv (GLenum pname, GLboolean *data); +GL_APICALL void GL_APIENTRY glGetBufferParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL GLenum GL_APIENTRY glGetError (void); +GL_APICALL void GL_APIENTRY glGetFloatv (GLenum pname, GLfloat *data); +GL_APICALL void GL_APIENTRY glGetFramebufferAttachmentParameteriv (GLenum target, GLenum attachment, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetIntegerv (GLenum pname, GLint *data); +GL_APICALL void GL_APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetRenderbufferParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetShaderPrecisionFormat (GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GL_APICALL void GL_APIENTRY glGetShaderSource (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +GL_APICALL const GLubyte *GL_APIENTRY glGetString (GLenum name); +GL_APICALL void GL_APIENTRY glGetTexParameterfv (GLenum target, GLenum pname, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetTexParameteriv (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetUniformfv (GLuint program, GLint location, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetUniformiv (GLuint program, GLint location, GLint *params); +GL_APICALL GLint GL_APIENTRY glGetUniformLocation (GLuint program, const GLchar *name); +GL_APICALL void GL_APIENTRY glGetVertexAttribfv (GLuint index, GLenum pname, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer); +GL_APICALL void GL_APIENTRY glHint (GLenum target, GLenum mode); +GL_APICALL GLboolean GL_APIENTRY glIsBuffer (GLuint buffer); +GL_APICALL GLboolean GL_APIENTRY glIsEnabled (GLenum cap); +GL_APICALL GLboolean GL_APIENTRY glIsFramebuffer (GLuint framebuffer); +GL_APICALL GLboolean GL_APIENTRY glIsProgram (GLuint program); +GL_APICALL GLboolean GL_APIENTRY glIsRenderbuffer (GLuint renderbuffer); +GL_APICALL GLboolean GL_APIENTRY glIsShader (GLuint shader); +GL_APICALL GLboolean GL_APIENTRY glIsTexture (GLuint texture); +GL_APICALL void GL_APIENTRY glLineWidth (GLfloat width); +GL_APICALL void GL_APIENTRY glLinkProgram (GLuint program); +GL_APICALL void GL_APIENTRY glPixelStorei (GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glPolygonOffset (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels); +GL_APICALL void GL_APIENTRY glReleaseShaderCompiler (void); +GL_APICALL void GL_APIENTRY glRenderbufferStorage (GLenum target, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glSampleCoverage (GLfloat value, GLboolean invert); +GL_APICALL void GL_APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glShaderBinary (GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +GL_APICALL void GL_APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length); +GL_APICALL void GL_APIENTRY glStencilFunc (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFuncSeparate (GLenum face, GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMask (GLuint mask); +GL_APICALL void GL_APIENTRY glStencilMaskSeparate (GLenum face, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilOp (GLenum fail, GLenum zfail, GLenum zpass); +GL_APICALL void GL_APIENTRY glStencilOpSeparate (GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass); +GL_APICALL void GL_APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glTexParameterf (GLenum target, GLenum pname, GLfloat param); +GL_APICALL void GL_APIENTRY glTexParameterfv (GLenum target, GLenum pname, const GLfloat *params); +GL_APICALL void GL_APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glTexParameteriv (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glUniform1f (GLint location, GLfloat v0); +GL_APICALL void GL_APIENTRY glUniform1fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform1i (GLint location, GLint v0); +GL_APICALL void GL_APIENTRY glUniform1iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform2f (GLint location, GLfloat v0, GLfloat v1); +GL_APICALL void GL_APIENTRY glUniform2fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform2i (GLint location, GLint v0, GLint v1); +GL_APICALL void GL_APIENTRY glUniform2iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform3f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GL_APICALL void GL_APIENTRY glUniform3fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform3i (GLint location, GLint v0, GLint v1, GLint v2); +GL_APICALL void GL_APIENTRY glUniform3iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniform4f (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GL_APICALL void GL_APIENTRY glUniform4fv (GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniform4i (GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GL_APICALL void GL_APIENTRY glUniform4iv (GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glUniformMatrix2fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUseProgram (GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgram (GLuint program); +GL_APICALL void GL_APIENTRY glVertexAttrib1f (GLuint index, GLfloat x); +GL_APICALL void GL_APIENTRY glVertexAttrib1fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib2f (GLuint index, GLfloat x, GLfloat y); +GL_APICALL void GL_APIENTRY glVertexAttrib2fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib3f (GLuint index, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glVertexAttrib3fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttrib4f (GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w); +GL_APICALL void GL_APIENTRY glVertexAttrib4fv (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer); +GL_APICALL void GL_APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height); +#endif +#endif /* GL_ES_VERSION_2_0 */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/SDL/SDL_opengles2_gl2ext.h b/include/SDL/SDL_opengles2_gl2ext.h new file mode 100644 index 0000000..9448ce0 --- /dev/null +++ b/include/SDL/SDL_opengles2_gl2ext.h @@ -0,0 +1,4033 @@ +#ifndef __gles2_gl2ext_h_ +#define __gles2_gl2ext_h_ 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* +** Copyright 2013-2020 The Khronos Group Inc. +** SPDX-License-Identifier: MIT +** +** This header is generated from the Khronos OpenGL / OpenGL ES XML +** API Registry. The current version of the Registry, generator scripts +** used to make the header, and the header can be found at +** https://github.com/KhronosGroup/OpenGL-Registry +*/ + +#ifndef GL_APIENTRYP +#define GL_APIENTRYP GL_APIENTRY* +#endif + +/* Generated on date 20220530 */ + +/* Generated C header for: + * API: gles2 + * Profile: common + * Versions considered: 2\.[0-9] + * Versions emitted: _nomatch_^ + * Default extensions included: gles2 + * Additional extensions included: _nomatch_^ + * Extensions removed: _nomatch_^ + */ + +#ifndef GL_KHR_blend_equation_advanced +#define GL_KHR_blend_equation_advanced 1 +#define GL_MULTIPLY_KHR 0x9294 +#define GL_SCREEN_KHR 0x9295 +#define GL_OVERLAY_KHR 0x9296 +#define GL_DARKEN_KHR 0x9297 +#define GL_LIGHTEN_KHR 0x9298 +#define GL_COLORDODGE_KHR 0x9299 +#define GL_COLORBURN_KHR 0x929A +#define GL_HARDLIGHT_KHR 0x929B +#define GL_SOFTLIGHT_KHR 0x929C +#define GL_DIFFERENCE_KHR 0x929E +#define GL_EXCLUSION_KHR 0x92A0 +#define GL_HSL_HUE_KHR 0x92AD +#define GL_HSL_SATURATION_KHR 0x92AE +#define GL_HSL_COLOR_KHR 0x92AF +#define GL_HSL_LUMINOSITY_KHR 0x92B0 +typedef void (GL_APIENTRYP PFNGLBLENDBARRIERKHRPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlendBarrierKHR (void); +#endif +#endif /* GL_KHR_blend_equation_advanced */ + +#ifndef GL_KHR_blend_equation_advanced_coherent +#define GL_KHR_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_KHR 0x9285 +#endif /* GL_KHR_blend_equation_advanced_coherent */ + +#ifndef GL_KHR_context_flush_control +#define GL_KHR_context_flush_control 1 +#define GL_CONTEXT_RELEASE_BEHAVIOR_KHR 0x82FB +#define GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH_KHR 0x82FC +#endif /* GL_KHR_context_flush_control */ + +#ifndef GL_KHR_debug +#define GL_KHR_debug 1 +typedef void (GL_APIENTRY *GLDEBUGPROCKHR)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam); +#define GL_SAMPLER 0x82E6 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_KHR 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION_KHR 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM_KHR 0x8245 +#define GL_DEBUG_SOURCE_API_KHR 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM_KHR 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER_KHR 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY_KHR 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION_KHR 0x824A +#define GL_DEBUG_SOURCE_OTHER_KHR 0x824B +#define GL_DEBUG_TYPE_ERROR_KHR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY_KHR 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE_KHR 0x8250 +#define GL_DEBUG_TYPE_OTHER_KHR 0x8251 +#define GL_DEBUG_TYPE_MARKER_KHR 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP_KHR 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP_KHR 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION_KHR 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH_KHR 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH_KHR 0x826D +#define GL_BUFFER_KHR 0x82E0 +#define GL_SHADER_KHR 0x82E1 +#define GL_PROGRAM_KHR 0x82E2 +#define GL_VERTEX_ARRAY_KHR 0x8074 +#define GL_QUERY_KHR 0x82E3 +#define GL_PROGRAM_PIPELINE_KHR 0x82E4 +#define GL_SAMPLER_KHR 0x82E6 +#define GL_MAX_LABEL_LENGTH_KHR 0x82E8 +#define GL_MAX_DEBUG_MESSAGE_LENGTH_KHR 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES_KHR 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES_KHR 0x9145 +#define GL_DEBUG_SEVERITY_HIGH_KHR 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM_KHR 0x9147 +#define GL_DEBUG_SEVERITY_LOW_KHR 0x9148 +#define GL_DEBUG_OUTPUT_KHR 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT_KHR 0x00000002 +#define GL_STACK_OVERFLOW_KHR 0x0503 +#define GL_STACK_UNDERFLOW_KHR 0x0504 +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECONTROLKHRPROC) (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGEINSERTKHRPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +typedef void (GL_APIENTRYP PFNGLDEBUGMESSAGECALLBACKKHRPROC) (GLDEBUGPROCKHR callback, const void *userParam); +typedef GLuint (GL_APIENTRYP PFNGLGETDEBUGMESSAGELOGKHRPROC) (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +typedef void (GL_APIENTRYP PFNGLPUSHDEBUGGROUPKHRPROC) (GLenum source, GLuint id, GLsizei length, const GLchar *message); +typedef void (GL_APIENTRYP PFNGLPOPDEBUGGROUPKHRPROC) (void); +typedef void (GL_APIENTRYP PFNGLOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELKHRPROC) (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTPTRLABELKHRPROC) (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETPOINTERVKHRPROC) (GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDebugMessageControlKHR (GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GL_APICALL void GL_APIENTRY glDebugMessageInsertKHR (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GL_APICALL void GL_APIENTRY glDebugMessageCallbackKHR (GLDEBUGPROCKHR callback, const void *userParam); +GL_APICALL GLuint GL_APIENTRY glGetDebugMessageLogKHR (GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GL_APICALL void GL_APIENTRY glPushDebugGroupKHR (GLenum source, GLuint id, GLsizei length, const GLchar *message); +GL_APICALL void GL_APIENTRY glPopDebugGroupKHR (void); +GL_APICALL void GL_APIENTRY glObjectLabelKHR (GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelKHR (GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glObjectPtrLabelKHR (const void *ptr, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectPtrLabelKHR (const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +GL_APICALL void GL_APIENTRY glGetPointervKHR (GLenum pname, void **params); +#endif +#endif /* GL_KHR_debug */ + +#ifndef GL_KHR_no_error +#define GL_KHR_no_error 1 +#define GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR 0x00000008 +#endif /* GL_KHR_no_error */ + +#ifndef GL_KHR_parallel_shader_compile +#define GL_KHR_parallel_shader_compile 1 +#define GL_MAX_SHADER_COMPILER_THREADS_KHR 0x91B0 +#define GL_COMPLETION_STATUS_KHR 0x91B1 +typedef void (GL_APIENTRYP PFNGLMAXSHADERCOMPILERTHREADSKHRPROC) (GLuint count); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMaxShaderCompilerThreadsKHR (GLuint count); +#endif +#endif /* GL_KHR_parallel_shader_compile */ + +#ifndef GL_KHR_robust_buffer_access_behavior +#define GL_KHR_robust_buffer_access_behavior 1 +#endif /* GL_KHR_robust_buffer_access_behavior */ + +#ifndef GL_KHR_robustness +#define GL_KHR_robustness 1 +#define GL_CONTEXT_ROBUST_ACCESS_KHR 0x90F3 +#define GL_LOSE_CONTEXT_ON_RESET_KHR 0x8252 +#define GL_GUILTY_CONTEXT_RESET_KHR 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_KHR 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_KHR 0x8255 +#define GL_RESET_NOTIFICATION_STRATEGY_KHR 0x8256 +#define GL_NO_RESET_NOTIFICATION_KHR 0x8261 +#define GL_CONTEXT_LOST_KHR 0x0507 +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSKHRPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSKHRPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMUIVKHRPROC) (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusKHR (void); +GL_APICALL void GL_APIENTRY glReadnPixelsKHR (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvKHR (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetnUniformivKHR (GLuint program, GLint location, GLsizei bufSize, GLint *params); +GL_APICALL void GL_APIENTRY glGetnUniformuivKHR (GLuint program, GLint location, GLsizei bufSize, GLuint *params); +#endif +#endif /* GL_KHR_robustness */ + +#ifndef GL_KHR_shader_subgroup +#define GL_KHR_shader_subgroup 1 +#define GL_SUBGROUP_SIZE_KHR 0x9532 +#define GL_SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 +#define GL_SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 +#define GL_SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 +#define GL_SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 +#define GL_SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 +#define GL_SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 +#define GL_SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 +#define GL_SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 +#define GL_SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 +#define GL_SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 +#define GL_SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 +#endif /* GL_KHR_shader_subgroup */ + +#ifndef GL_KHR_texture_compression_astc_hdr +#define GL_KHR_texture_compression_astc_hdr 1 +#define GL_COMPRESSED_RGBA_ASTC_4x4_KHR 0x93B0 +#define GL_COMPRESSED_RGBA_ASTC_5x4_KHR 0x93B1 +#define GL_COMPRESSED_RGBA_ASTC_5x5_KHR 0x93B2 +#define GL_COMPRESSED_RGBA_ASTC_6x5_KHR 0x93B3 +#define GL_COMPRESSED_RGBA_ASTC_6x6_KHR 0x93B4 +#define GL_COMPRESSED_RGBA_ASTC_8x5_KHR 0x93B5 +#define GL_COMPRESSED_RGBA_ASTC_8x6_KHR 0x93B6 +#define GL_COMPRESSED_RGBA_ASTC_8x8_KHR 0x93B7 +#define GL_COMPRESSED_RGBA_ASTC_10x5_KHR 0x93B8 +#define GL_COMPRESSED_RGBA_ASTC_10x6_KHR 0x93B9 +#define GL_COMPRESSED_RGBA_ASTC_10x8_KHR 0x93BA +#define GL_COMPRESSED_RGBA_ASTC_10x10_KHR 0x93BB +#define GL_COMPRESSED_RGBA_ASTC_12x10_KHR 0x93BC +#define GL_COMPRESSED_RGBA_ASTC_12x12_KHR 0x93BD +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR 0x93D0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR 0x93D1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR 0x93D2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR 0x93D3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR 0x93D4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR 0x93D5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR 0x93D6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR 0x93D7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR 0x93D8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR 0x93D9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR 0x93DA +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR 0x93DB +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR 0x93DC +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR 0x93DD +#endif /* GL_KHR_texture_compression_astc_hdr */ + +#ifndef GL_KHR_texture_compression_astc_ldr +#define GL_KHR_texture_compression_astc_ldr 1 +#endif /* GL_KHR_texture_compression_astc_ldr */ + +#ifndef GL_KHR_texture_compression_astc_sliced_3d +#define GL_KHR_texture_compression_astc_sliced_3d 1 +#endif /* GL_KHR_texture_compression_astc_sliced_3d */ + +#ifndef GL_OES_EGL_image +#define GL_OES_EGL_image 1 +typedef void *GLeglImageOES; +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURE2DOESPROC) (GLenum target, GLeglImageOES image); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC) (GLenum target, GLeglImageOES image); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image); +GL_APICALL void GL_APIENTRY glEGLImageTargetRenderbufferStorageOES (GLenum target, GLeglImageOES image); +#endif +#endif /* GL_OES_EGL_image */ + +#ifndef GL_OES_EGL_image_external +#define GL_OES_EGL_image_external 1 +#define GL_TEXTURE_EXTERNAL_OES 0x8D65 +#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67 +#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68 +#define GL_SAMPLER_EXTERNAL_OES 0x8D66 +#endif /* GL_OES_EGL_image_external */ + +#ifndef GL_OES_EGL_image_external_essl3 +#define GL_OES_EGL_image_external_essl3 1 +#endif /* GL_OES_EGL_image_external_essl3 */ + +#ifndef GL_OES_compressed_ETC1_RGB8_sub_texture +#define GL_OES_compressed_ETC1_RGB8_sub_texture 1 +#endif /* GL_OES_compressed_ETC1_RGB8_sub_texture */ + +#ifndef GL_OES_compressed_ETC1_RGB8_texture +#define GL_OES_compressed_ETC1_RGB8_texture 1 +#define GL_ETC1_RGB8_OES 0x8D64 +#endif /* GL_OES_compressed_ETC1_RGB8_texture */ + +#ifndef GL_OES_compressed_paletted_texture +#define GL_OES_compressed_paletted_texture 1 +#define GL_PALETTE4_RGB8_OES 0x8B90 +#define GL_PALETTE4_RGBA8_OES 0x8B91 +#define GL_PALETTE4_R5_G6_B5_OES 0x8B92 +#define GL_PALETTE4_RGBA4_OES 0x8B93 +#define GL_PALETTE4_RGB5_A1_OES 0x8B94 +#define GL_PALETTE8_RGB8_OES 0x8B95 +#define GL_PALETTE8_RGBA8_OES 0x8B96 +#define GL_PALETTE8_R5_G6_B5_OES 0x8B97 +#define GL_PALETTE8_RGBA4_OES 0x8B98 +#define GL_PALETTE8_RGB5_A1_OES 0x8B99 +#endif /* GL_OES_compressed_paletted_texture */ + +#ifndef GL_OES_copy_image +#define GL_OES_copy_image 1 +typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAOESPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyImageSubDataOES (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#endif +#endif /* GL_OES_copy_image */ + +#ifndef GL_OES_depth24 +#define GL_OES_depth24 1 +#define GL_DEPTH_COMPONENT24_OES 0x81A6 +#endif /* GL_OES_depth24 */ + +#ifndef GL_OES_depth32 +#define GL_OES_depth32 1 +#define GL_DEPTH_COMPONENT32_OES 0x81A7 +#endif /* GL_OES_depth32 */ + +#ifndef GL_OES_depth_texture +#define GL_OES_depth_texture 1 +#endif /* GL_OES_depth_texture */ + +#ifndef GL_OES_draw_buffers_indexed +#define GL_OES_draw_buffers_indexed 1 +#define GL_MIN 0x8007 +#define GL_MAX 0x8008 +typedef void (GL_APIENTRYP PFNGLENABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEIOESPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIOESPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIOESPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCIOESPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIOESPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP PFNGLCOLORMASKIOESPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIOESPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEnableiOES (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiOES (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glBlendEquationiOES (GLuint buf, GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparateiOES (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunciOES (GLuint buf, GLenum src, GLenum dst); +GL_APICALL void GL_APIENTRY glBlendFuncSeparateiOES (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glColorMaskiOES (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediOES (GLenum target, GLuint index); +#endif +#endif /* GL_OES_draw_buffers_indexed */ + +#ifndef GL_OES_draw_elements_base_vertex +#define GL_OES_draw_elements_base_vertex 1 +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXOESPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXOESPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexOES (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexOES (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +GL_APICALL void GL_APIENTRY glMultiDrawElementsBaseVertexEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex); +#endif +#endif /* GL_OES_draw_elements_base_vertex */ + +#ifndef GL_OES_element_index_uint +#define GL_OES_element_index_uint 1 +#endif /* GL_OES_element_index_uint */ + +#ifndef GL_OES_fbo_render_mipmap +#define GL_OES_fbo_render_mipmap 1 +#endif /* GL_OES_fbo_render_mipmap */ + +#ifndef GL_OES_fragment_precision_high +#define GL_OES_fragment_precision_high 1 +#endif /* GL_OES_fragment_precision_high */ + +#ifndef GL_OES_geometry_point_size +#define GL_OES_geometry_point_size 1 +#endif /* GL_OES_geometry_point_size */ + +#ifndef GL_OES_geometry_shader +#define GL_OES_geometry_shader 1 +#define GL_GEOMETRY_SHADER_OES 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_OES 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_OES 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_OES 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_OES 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_OES 0x887F +#define GL_LAYER_PROVOKING_VERTEX_OES 0x825E +#define GL_LINES_ADJACENCY_OES 0x000A +#define GL_LINE_STRIP_ADJACENCY_OES 0x000B +#define GL_TRIANGLES_ADJACENCY_OES 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_OES 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_OES 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_OES 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_OES 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_OES 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_OES 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_OES 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_OES 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_OES 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_OES 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_OES 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_OES 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_OES 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_OES 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_OES 0x8E4E +#define GL_UNDEFINED_VERTEX_OES 0x8260 +#define GL_PRIMITIVES_GENERATED_OES 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_OES 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_OES 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_OES 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_OES 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_OES 0x9309 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREOESPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureOES (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif +#endif /* GL_OES_geometry_shader */ + +#ifndef GL_OES_get_program_binary +#define GL_OES_get_program_binary 1 +#define GL_PROGRAM_BINARY_LENGTH_OES 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS_OES 0x87FE +#define GL_PROGRAM_BINARY_FORMATS_OES 0x87FF +typedef void (GL_APIENTRYP PFNGLGETPROGRAMBINARYOESPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +typedef void (GL_APIENTRYP PFNGLPROGRAMBINARYOESPROC) (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetProgramBinaryOES (GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GL_APICALL void GL_APIENTRY glProgramBinaryOES (GLuint program, GLenum binaryFormat, const void *binary, GLint length); +#endif +#endif /* GL_OES_get_program_binary */ + +#ifndef GL_OES_gpu_shader5 +#define GL_OES_gpu_shader5 1 +#endif /* GL_OES_gpu_shader5 */ + +#ifndef GL_OES_mapbuffer +#define GL_OES_mapbuffer 1 +#define GL_WRITE_ONLY_OES 0x88B9 +#define GL_BUFFER_ACCESS_OES 0x88BB +#define GL_BUFFER_MAPPED_OES 0x88BC +#define GL_BUFFER_MAP_POINTER_OES 0x88BD +typedef void *(GL_APIENTRYP PFNGLMAPBUFFEROESPROC) (GLenum target, GLenum access); +typedef GLboolean (GL_APIENTRYP PFNGLUNMAPBUFFEROESPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLGETBUFFERPOINTERVOESPROC) (GLenum target, GLenum pname, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void *GL_APIENTRY glMapBufferOES (GLenum target, GLenum access); +GL_APICALL GLboolean GL_APIENTRY glUnmapBufferOES (GLenum target); +GL_APICALL void GL_APIENTRY glGetBufferPointervOES (GLenum target, GLenum pname, void **params); +#endif +#endif /* GL_OES_mapbuffer */ + +#ifndef GL_OES_packed_depth_stencil +#define GL_OES_packed_depth_stencil 1 +#define GL_DEPTH_STENCIL_OES 0x84F9 +#define GL_UNSIGNED_INT_24_8_OES 0x84FA +#define GL_DEPTH24_STENCIL8_OES 0x88F0 +#endif /* GL_OES_packed_depth_stencil */ + +#ifndef GL_OES_primitive_bounding_box +#define GL_OES_primitive_bounding_box 1 +#define GL_PRIMITIVE_BOUNDING_BOX_OES 0x92BE +typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXOESPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxOES (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_OES_primitive_bounding_box */ + +#ifndef GL_OES_required_internalformat +#define GL_OES_required_internalformat 1 +#define GL_ALPHA8_OES 0x803C +#define GL_DEPTH_COMPONENT16_OES 0x81A5 +#define GL_LUMINANCE4_ALPHA4_OES 0x8043 +#define GL_LUMINANCE8_ALPHA8_OES 0x8045 +#define GL_LUMINANCE8_OES 0x8040 +#define GL_RGBA4_OES 0x8056 +#define GL_RGB5_A1_OES 0x8057 +#define GL_RGB565_OES 0x8D62 +#define GL_RGB8_OES 0x8051 +#define GL_RGBA8_OES 0x8058 +#define GL_RGB10_EXT 0x8052 +#define GL_RGB10_A2_EXT 0x8059 +#endif /* GL_OES_required_internalformat */ + +#ifndef GL_OES_rgb8_rgba8 +#define GL_OES_rgb8_rgba8 1 +#endif /* GL_OES_rgb8_rgba8 */ + +#ifndef GL_OES_sample_shading +#define GL_OES_sample_shading 1 +#define GL_SAMPLE_SHADING_OES 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE_OES 0x8C37 +typedef void (GL_APIENTRYP PFNGLMINSAMPLESHADINGOESPROC) (GLfloat value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMinSampleShadingOES (GLfloat value); +#endif +#endif /* GL_OES_sample_shading */ + +#ifndef GL_OES_sample_variables +#define GL_OES_sample_variables 1 +#endif /* GL_OES_sample_variables */ + +#ifndef GL_OES_shader_image_atomic +#define GL_OES_shader_image_atomic 1 +#endif /* GL_OES_shader_image_atomic */ + +#ifndef GL_OES_shader_io_blocks +#define GL_OES_shader_io_blocks 1 +#endif /* GL_OES_shader_io_blocks */ + +#ifndef GL_OES_shader_multisample_interpolation +#define GL_OES_shader_multisample_interpolation 1 +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET_OES 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS_OES 0x8E5D +#endif /* GL_OES_shader_multisample_interpolation */ + +#ifndef GL_OES_standard_derivatives +#define GL_OES_standard_derivatives 1 +#define GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES 0x8B8B +#endif /* GL_OES_standard_derivatives */ + +#ifndef GL_OES_stencil1 +#define GL_OES_stencil1 1 +#define GL_STENCIL_INDEX1_OES 0x8D46 +#endif /* GL_OES_stencil1 */ + +#ifndef GL_OES_stencil4 +#define GL_OES_stencil4 1 +#define GL_STENCIL_INDEX4_OES 0x8D47 +#endif /* GL_OES_stencil4 */ + +#ifndef GL_OES_surfaceless_context +#define GL_OES_surfaceless_context 1 +#define GL_FRAMEBUFFER_UNDEFINED_OES 0x8219 +#endif /* GL_OES_surfaceless_context */ + +#ifndef GL_OES_tessellation_point_size +#define GL_OES_tessellation_point_size 1 +#endif /* GL_OES_tessellation_point_size */ + +#ifndef GL_OES_tessellation_shader +#define GL_OES_tessellation_shader 1 +#define GL_PATCHES_OES 0x000E +#define GL_PATCH_VERTICES_OES 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_OES 0x8E75 +#define GL_TESS_GEN_MODE_OES 0x8E76 +#define GL_TESS_GEN_SPACING_OES 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_OES 0x8E78 +#define GL_TESS_GEN_POINT_MODE_OES 0x8E79 +#define GL_ISOLINES_OES 0x8E7A +#define GL_QUADS_OES 0x0007 +#define GL_FRACTIONAL_ODD_OES 0x8E7B +#define GL_FRACTIONAL_EVEN_OES 0x8E7C +#define GL_MAX_PATCH_VERTICES_OES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_OES 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_OES 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_OES 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_OES 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_OES 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_OES 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_OES 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_OES 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_OES 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_OES 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_OES 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_OES 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_OES 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_OES 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_OES 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_OES 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_OES 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_OES 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_OES 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_OES 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_OES 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED_OES 0x8221 +#define GL_IS_PER_PATCH_OES 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_OES 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_OES 0x9308 +#define GL_TESS_CONTROL_SHADER_OES 0x8E88 +#define GL_TESS_EVALUATION_SHADER_OES 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_OES 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_OES 0x00000010 +typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIOESPROC) (GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPatchParameteriOES (GLenum pname, GLint value); +#endif +#endif /* GL_OES_tessellation_shader */ + +#ifndef GL_OES_texture_3D +#define GL_OES_texture_3D 1 +#define GL_TEXTURE_WRAP_R_OES 0x8072 +#define GL_TEXTURE_3D_OES 0x806F +#define GL_TEXTURE_BINDING_3D_OES 0x806A +#define GL_MAX_3D_TEXTURE_SIZE_OES 0x8073 +#define GL_SAMPLER_3D_OES 0x8B5F +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES 0x8CD4 +typedef void (GL_APIENTRYP PFNGLTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +typedef void (GL_APIENTRYP PFNGLCOPYTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXIMAGE3DOESPROC) (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLCOMPRESSEDTEXSUBIMAGE3DOESPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE3DOESPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels); +GL_APICALL void GL_APIENTRY glCopyTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glCompressedTexImage3DOES (GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glCompressedTexSubImage3DOES (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void *data); +GL_APICALL void GL_APIENTRY glFramebufferTexture3DOES (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); +#endif +#endif /* GL_OES_texture_3D */ + +#ifndef GL_OES_texture_border_clamp +#define GL_OES_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_OES 0x1004 +#define GL_CLAMP_TO_BORDER_OES 0x812D +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVOESPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVOESPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVOESPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVOESPROC) (GLuint sampler, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexParameterIivOES (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexParameterIuivOES (GLenum target, GLenum pname, const GLuint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIivOES (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIuivOES (GLenum target, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glSamplerParameterIivOES (GLuint sampler, GLenum pname, const GLint *param); +GL_APICALL void GL_APIENTRY glSamplerParameterIuivOES (GLuint sampler, GLenum pname, const GLuint *param); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIivOES (GLuint sampler, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivOES (GLuint sampler, GLenum pname, GLuint *params); +#endif +#endif /* GL_OES_texture_border_clamp */ + +#ifndef GL_OES_texture_buffer +#define GL_OES_texture_buffer 1 +#define GL_TEXTURE_BUFFER_OES 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_OES 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_OES 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_OES 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_OES 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_OES 0x919F +#define GL_SAMPLER_BUFFER_OES 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_OES 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_OES 0x8DD8 +#define GL_IMAGE_BUFFER_OES 0x9051 +#define GL_INT_IMAGE_BUFFER_OES 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_OES 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_OES 0x919D +#define GL_TEXTURE_BUFFER_SIZE_OES 0x919E +typedef void (GL_APIENTRYP PFNGLTEXBUFFEROESPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEOESPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexBufferOES (GLenum target, GLenum internalformat, GLuint buffer); +GL_APICALL void GL_APIENTRY glTexBufferRangeOES (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_OES_texture_buffer */ + +#ifndef GL_OES_texture_compression_astc +#define GL_OES_texture_compression_astc 1 +#define GL_COMPRESSED_RGBA_ASTC_3x3x3_OES 0x93C0 +#define GL_COMPRESSED_RGBA_ASTC_4x3x3_OES 0x93C1 +#define GL_COMPRESSED_RGBA_ASTC_4x4x3_OES 0x93C2 +#define GL_COMPRESSED_RGBA_ASTC_4x4x4_OES 0x93C3 +#define GL_COMPRESSED_RGBA_ASTC_5x4x4_OES 0x93C4 +#define GL_COMPRESSED_RGBA_ASTC_5x5x4_OES 0x93C5 +#define GL_COMPRESSED_RGBA_ASTC_5x5x5_OES 0x93C6 +#define GL_COMPRESSED_RGBA_ASTC_6x5x5_OES 0x93C7 +#define GL_COMPRESSED_RGBA_ASTC_6x6x5_OES 0x93C8 +#define GL_COMPRESSED_RGBA_ASTC_6x6x6_OES 0x93C9 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_3x3x3_OES 0x93E0 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x3x3_OES 0x93E1 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x3_OES 0x93E2 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4x4_OES 0x93E3 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4x4_OES 0x93E4 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x4_OES 0x93E5 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5x5_OES 0x93E6 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5x5_OES 0x93E7 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x5_OES 0x93E8 +#define GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6x6_OES 0x93E9 +#endif /* GL_OES_texture_compression_astc */ + +#ifndef GL_OES_texture_cube_map_array +#define GL_OES_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_OES 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_OES 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_OES 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_OES 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_OES 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_OES 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_OES 0x906A +#endif /* GL_OES_texture_cube_map_array */ + +#ifndef GL_OES_texture_float +#define GL_OES_texture_float 1 +#endif /* GL_OES_texture_float */ + +#ifndef GL_OES_texture_float_linear +#define GL_OES_texture_float_linear 1 +#endif /* GL_OES_texture_float_linear */ + +#ifndef GL_OES_texture_half_float +#define GL_OES_texture_half_float 1 +#define GL_HALF_FLOAT_OES 0x8D61 +#endif /* GL_OES_texture_half_float */ + +#ifndef GL_OES_texture_half_float_linear +#define GL_OES_texture_half_float_linear 1 +#endif /* GL_OES_texture_half_float_linear */ + +#ifndef GL_OES_texture_npot +#define GL_OES_texture_npot 1 +#endif /* GL_OES_texture_npot */ + +#ifndef GL_OES_texture_stencil8 +#define GL_OES_texture_stencil8 1 +#define GL_STENCIL_INDEX_OES 0x1901 +#define GL_STENCIL_INDEX8_OES 0x8D48 +#endif /* GL_OES_texture_stencil8 */ + +#ifndef GL_OES_texture_storage_multisample_2d_array +#define GL_OES_texture_storage_multisample_2d_array 1 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY_OES 0x9102 +#define GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY_OES 0x9105 +#define GL_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910B +#define GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910C +#define GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY_OES 0x910D +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEOESPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage3DMultisampleOES (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +#endif +#endif /* GL_OES_texture_storage_multisample_2d_array */ + +#ifndef GL_OES_texture_view +#define GL_OES_texture_view 1 +#define GL_TEXTURE_VIEW_MIN_LEVEL_OES 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_OES 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_OES 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_OES 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWOESPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureViewOES (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#endif +#endif /* GL_OES_texture_view */ + +#ifndef GL_OES_vertex_array_object +#define GL_OES_vertex_array_object 1 +#define GL_VERTEX_ARRAY_BINDING_OES 0x85B5 +typedef void (GL_APIENTRYP PFNGLBINDVERTEXARRAYOESPROC) (GLuint array); +typedef void (GL_APIENTRYP PFNGLDELETEVERTEXARRAYSOESPROC) (GLsizei n, const GLuint *arrays); +typedef void (GL_APIENTRYP PFNGLGENVERTEXARRAYSOESPROC) (GLsizei n, GLuint *arrays); +typedef GLboolean (GL_APIENTRYP PFNGLISVERTEXARRAYOESPROC) (GLuint array); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindVertexArrayOES (GLuint array); +GL_APICALL void GL_APIENTRY glDeleteVertexArraysOES (GLsizei n, const GLuint *arrays); +GL_APICALL void GL_APIENTRY glGenVertexArraysOES (GLsizei n, GLuint *arrays); +GL_APICALL GLboolean GL_APIENTRY glIsVertexArrayOES (GLuint array); +#endif +#endif /* GL_OES_vertex_array_object */ + +#ifndef GL_OES_vertex_half_float +#define GL_OES_vertex_half_float 1 +#endif /* GL_OES_vertex_half_float */ + +#ifndef GL_OES_vertex_type_10_10_10_2 +#define GL_OES_vertex_type_10_10_10_2 1 +#define GL_UNSIGNED_INT_10_10_10_2_OES 0x8DF6 +#define GL_INT_10_10_10_2_OES 0x8DF7 +#endif /* GL_OES_vertex_type_10_10_10_2 */ + +#ifndef GL_OES_viewport_array +#define GL_OES_viewport_array 1 +#define GL_MAX_VIEWPORTS_OES 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_OES 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_OES 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_OES 0x825F +typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFOESPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVOESPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVOESPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDOESPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVOESPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVOESPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFOESPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLGETFLOATI_VOESPROC) (GLenum target, GLuint index, GLfloat *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportArrayvOES (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glViewportIndexedfOES (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GL_APICALL void GL_APIENTRY glViewportIndexedfvOES (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glScissorArrayvOES (GLuint first, GLsizei count, const GLint *v); +GL_APICALL void GL_APIENTRY glScissorIndexedOES (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorIndexedvOES (GLuint index, const GLint *v); +GL_APICALL void GL_APIENTRY glDepthRangeArrayfvOES (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glDepthRangeIndexedfOES (GLuint index, GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glGetFloati_vOES (GLenum target, GLuint index, GLfloat *data); +#endif +#endif /* GL_OES_viewport_array */ + +#ifndef GL_AMD_compressed_3DC_texture +#define GL_AMD_compressed_3DC_texture 1 +#define GL_3DC_X_AMD 0x87F9 +#define GL_3DC_XY_AMD 0x87FA +#endif /* GL_AMD_compressed_3DC_texture */ + +#ifndef GL_AMD_compressed_ATC_texture +#define GL_AMD_compressed_ATC_texture 1 +#define GL_ATC_RGB_AMD 0x8C92 +#define GL_ATC_RGBA_EXPLICIT_ALPHA_AMD 0x8C93 +#define GL_ATC_RGBA_INTERPOLATED_ALPHA_AMD 0x87EE +#endif /* GL_AMD_compressed_ATC_texture */ + +#ifndef GL_AMD_framebuffer_multisample_advanced +#define GL_AMD_framebuffer_multisample_advanced 1 +#define GL_RENDERBUFFER_STORAGE_SAMPLES_AMD 0x91B2 +#define GL_MAX_COLOR_FRAMEBUFFER_SAMPLES_AMD 0x91B3 +#define GL_MAX_COLOR_FRAMEBUFFER_STORAGE_SAMPLES_AMD 0x91B4 +#define GL_MAX_DEPTH_STENCIL_FRAMEBUFFER_SAMPLES_AMD 0x91B5 +#define GL_NUM_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B6 +#define GL_SUPPORTED_MULTISAMPLE_MODES_AMD 0x91B7 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEADVANCEDAMDPROC) (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAdvancedAMD (GLenum target, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glNamedRenderbufferStorageMultisampleAdvancedAMD (GLuint renderbuffer, GLsizei samples, GLsizei storageSamples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_AMD_framebuffer_multisample_advanced */ + +#ifndef GL_AMD_performance_monitor +#define GL_AMD_performance_monitor 1 +#define GL_COUNTER_TYPE_AMD 0x8BC0 +#define GL_COUNTER_RANGE_AMD 0x8BC1 +#define GL_UNSIGNED_INT64_AMD 0x8BC2 +#define GL_PERCENTAGE_AMD 0x8BC3 +#define GL_PERFMON_RESULT_AVAILABLE_AMD 0x8BC4 +#define GL_PERFMON_RESULT_SIZE_AMD 0x8BC5 +#define GL_PERFMON_RESULT_AMD 0x8BC6 +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSAMDPROC) (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSAMDPROC) (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORGROUPSTRINGAMDPROC) (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERSTRINGAMDPROC) (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERINFOAMDPROC) (GLuint group, GLuint counter, GLenum pname, void *data); +typedef void (GL_APIENTRYP PFNGLGENPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLDELETEPERFMONITORSAMDPROC) (GLsizei n, GLuint *monitors); +typedef void (GL_APIENTRYP PFNGLSELECTPERFMONITORCOUNTERSAMDPROC) (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +typedef void (GL_APIENTRYP PFNGLBEGINPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLENDPERFMONITORAMDPROC) (GLuint monitor); +typedef void (GL_APIENTRYP PFNGLGETPERFMONITORCOUNTERDATAAMDPROC) (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupsAMD (GLint *numGroups, GLsizei groupsSize, GLuint *groups); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCountersAMD (GLuint group, GLint *numCounters, GLint *maxActiveCounters, GLsizei counterSize, GLuint *counters); +GL_APICALL void GL_APIENTRY glGetPerfMonitorGroupStringAMD (GLuint group, GLsizei bufSize, GLsizei *length, GLchar *groupString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterStringAMD (GLuint group, GLuint counter, GLsizei bufSize, GLsizei *length, GLchar *counterString); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterInfoAMD (GLuint group, GLuint counter, GLenum pname, void *data); +GL_APICALL void GL_APIENTRY glGenPerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glDeletePerfMonitorsAMD (GLsizei n, GLuint *monitors); +GL_APICALL void GL_APIENTRY glSelectPerfMonitorCountersAMD (GLuint monitor, GLboolean enable, GLuint group, GLint numCounters, GLuint *counterList); +GL_APICALL void GL_APIENTRY glBeginPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glEndPerfMonitorAMD (GLuint monitor); +GL_APICALL void GL_APIENTRY glGetPerfMonitorCounterDataAMD (GLuint monitor, GLenum pname, GLsizei dataSize, GLuint *data, GLint *bytesWritten); +#endif +#endif /* GL_AMD_performance_monitor */ + +#ifndef GL_AMD_program_binary_Z400 +#define GL_AMD_program_binary_Z400 1 +#define GL_Z400_BINARY_AMD 0x8740 +#endif /* GL_AMD_program_binary_Z400 */ + +#ifndef GL_ANDROID_extension_pack_es31a +#define GL_ANDROID_extension_pack_es31a 1 +#endif /* GL_ANDROID_extension_pack_es31a */ + +#ifndef GL_ANGLE_depth_texture +#define GL_ANGLE_depth_texture 1 +#endif /* GL_ANGLE_depth_texture */ + +#ifndef GL_ANGLE_framebuffer_blit +#define GL_ANGLE_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_ANGLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_ANGLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_ANGLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_ANGLE 0x8CAA +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERANGLEPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferANGLE (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_ANGLE_framebuffer_blit */ + +#ifndef GL_ANGLE_framebuffer_multisample +#define GL_ANGLE_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_ANGLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_ANGLE 0x8D56 +#define GL_MAX_SAMPLES_ANGLE 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEANGLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleANGLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_ANGLE_framebuffer_multisample */ + +#ifndef GL_ANGLE_instanced_arrays +#define GL_ANGLE_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDANGLEPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDANGLEPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORANGLEPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedANGLE (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedANGLE (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +GL_APICALL void GL_APIENTRY glVertexAttribDivisorANGLE (GLuint index, GLuint divisor); +#endif +#endif /* GL_ANGLE_instanced_arrays */ + +#ifndef GL_ANGLE_pack_reverse_row_order +#define GL_ANGLE_pack_reverse_row_order 1 +#define GL_PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 +#endif /* GL_ANGLE_pack_reverse_row_order */ + +#ifndef GL_ANGLE_program_binary +#define GL_ANGLE_program_binary 1 +#define GL_PROGRAM_BINARY_ANGLE 0x93A6 +#endif /* GL_ANGLE_program_binary */ + +#ifndef GL_ANGLE_texture_compression_dxt3 +#define GL_ANGLE_texture_compression_dxt3 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE 0x83F2 +#endif /* GL_ANGLE_texture_compression_dxt3 */ + +#ifndef GL_ANGLE_texture_compression_dxt5 +#define GL_ANGLE_texture_compression_dxt5 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE 0x83F3 +#endif /* GL_ANGLE_texture_compression_dxt5 */ + +#ifndef GL_ANGLE_texture_usage +#define GL_ANGLE_texture_usage 1 +#define GL_TEXTURE_USAGE_ANGLE 0x93A2 +#define GL_FRAMEBUFFER_ATTACHMENT_ANGLE 0x93A3 +#endif /* GL_ANGLE_texture_usage */ + +#ifndef GL_ANGLE_translated_shader_source +#define GL_ANGLE_translated_shader_source 1 +#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0 +typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source); +#endif +#endif /* GL_ANGLE_translated_shader_source */ + +#ifndef GL_APPLE_clip_distance +#define GL_APPLE_clip_distance 1 +#define GL_MAX_CLIP_DISTANCES_APPLE 0x0D32 +#define GL_CLIP_DISTANCE0_APPLE 0x3000 +#define GL_CLIP_DISTANCE1_APPLE 0x3001 +#define GL_CLIP_DISTANCE2_APPLE 0x3002 +#define GL_CLIP_DISTANCE3_APPLE 0x3003 +#define GL_CLIP_DISTANCE4_APPLE 0x3004 +#define GL_CLIP_DISTANCE5_APPLE 0x3005 +#define GL_CLIP_DISTANCE6_APPLE 0x3006 +#define GL_CLIP_DISTANCE7_APPLE 0x3007 +#endif /* GL_APPLE_clip_distance */ + +#ifndef GL_APPLE_color_buffer_packed_float +#define GL_APPLE_color_buffer_packed_float 1 +#endif /* GL_APPLE_color_buffer_packed_float */ + +#ifndef GL_APPLE_copy_texture_levels +#define GL_APPLE_copy_texture_levels 1 +typedef void (GL_APIENTRYP PFNGLCOPYTEXTURELEVELSAPPLEPROC) (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyTextureLevelsAPPLE (GLuint destinationTexture, GLuint sourceTexture, GLint sourceBaseLevel, GLsizei sourceLevelCount); +#endif +#endif /* GL_APPLE_copy_texture_levels */ + +#ifndef GL_APPLE_framebuffer_multisample +#define GL_APPLE_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_APPLE 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_APPLE 0x8D56 +#define GL_MAX_SAMPLES_APPLE 0x8D57 +#define GL_READ_FRAMEBUFFER_APPLE 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_APPLE 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_APPLE 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_APPLE 0x8CAA +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEAPPLEPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLRESOLVEMULTISAMPLEFRAMEBUFFERAPPLEPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleAPPLE (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glResolveMultisampleFramebufferAPPLE (void); +#endif +#endif /* GL_APPLE_framebuffer_multisample */ + +#ifndef GL_APPLE_rgb_422 +#define GL_APPLE_rgb_422 1 +#define GL_RGB_422_APPLE 0x8A1F +#define GL_UNSIGNED_SHORT_8_8_APPLE 0x85BA +#define GL_UNSIGNED_SHORT_8_8_REV_APPLE 0x85BB +#define GL_RGB_RAW_422_APPLE 0x8A51 +#endif /* GL_APPLE_rgb_422 */ + +#ifndef GL_APPLE_sync +#define GL_APPLE_sync 1 +#define GL_SYNC_OBJECT_APPLE 0x8A53 +#define GL_MAX_SERVER_WAIT_TIMEOUT_APPLE 0x9111 +#define GL_OBJECT_TYPE_APPLE 0x9112 +#define GL_SYNC_CONDITION_APPLE 0x9113 +#define GL_SYNC_STATUS_APPLE 0x9114 +#define GL_SYNC_FLAGS_APPLE 0x9115 +#define GL_SYNC_FENCE_APPLE 0x9116 +#define GL_SYNC_GPU_COMMANDS_COMPLETE_APPLE 0x9117 +#define GL_UNSIGNALED_APPLE 0x9118 +#define GL_SIGNALED_APPLE 0x9119 +#define GL_ALREADY_SIGNALED_APPLE 0x911A +#define GL_TIMEOUT_EXPIRED_APPLE 0x911B +#define GL_CONDITION_SATISFIED_APPLE 0x911C +#define GL_WAIT_FAILED_APPLE 0x911D +#define GL_SYNC_FLUSH_COMMANDS_BIT_APPLE 0x00000001 +#define GL_TIMEOUT_IGNORED_APPLE 0xFFFFFFFFFFFFFFFFull +typedef GLsync (GL_APIENTRYP PFNGLFENCESYNCAPPLEPROC) (GLenum condition, GLbitfield flags); +typedef GLboolean (GL_APIENTRYP PFNGLISSYNCAPPLEPROC) (GLsync sync); +typedef void (GL_APIENTRYP PFNGLDELETESYNCAPPLEPROC) (GLsync sync); +typedef GLenum (GL_APIENTRYP PFNGLCLIENTWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLWAITSYNCAPPLEPROC) (GLsync sync, GLbitfield flags, GLuint64 timeout); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VAPPLEPROC) (GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSYNCIVAPPLEPROC) (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLsync GL_APIENTRY glFenceSyncAPPLE (GLenum condition, GLbitfield flags); +GL_APICALL GLboolean GL_APIENTRY glIsSyncAPPLE (GLsync sync); +GL_APICALL void GL_APIENTRY glDeleteSyncAPPLE (GLsync sync); +GL_APICALL GLenum GL_APIENTRY glClientWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glWaitSyncAPPLE (GLsync sync, GLbitfield flags, GLuint64 timeout); +GL_APICALL void GL_APIENTRY glGetInteger64vAPPLE (GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetSyncivAPPLE (GLsync sync, GLenum pname, GLsizei count, GLsizei *length, GLint *values); +#endif +#endif /* GL_APPLE_sync */ + +#ifndef GL_APPLE_texture_format_BGRA8888 +#define GL_APPLE_texture_format_BGRA8888 1 +#define GL_BGRA_EXT 0x80E1 +#define GL_BGRA8_EXT 0x93A1 +#endif /* GL_APPLE_texture_format_BGRA8888 */ + +#ifndef GL_APPLE_texture_max_level +#define GL_APPLE_texture_max_level 1 +#define GL_TEXTURE_MAX_LEVEL_APPLE 0x813D +#endif /* GL_APPLE_texture_max_level */ + +#ifndef GL_APPLE_texture_packed_float +#define GL_APPLE_texture_packed_float 1 +#define GL_UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B +#define GL_UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E +#define GL_R11F_G11F_B10F_APPLE 0x8C3A +#define GL_RGB9_E5_APPLE 0x8C3D +#endif /* GL_APPLE_texture_packed_float */ + +#ifndef GL_ARM_mali_program_binary +#define GL_ARM_mali_program_binary 1 +#define GL_MALI_PROGRAM_BINARY_ARM 0x8F61 +#endif /* GL_ARM_mali_program_binary */ + +#ifndef GL_ARM_mali_shader_binary +#define GL_ARM_mali_shader_binary 1 +#define GL_MALI_SHADER_BINARY_ARM 0x8F60 +#endif /* GL_ARM_mali_shader_binary */ + +#ifndef GL_ARM_rgba8 +#define GL_ARM_rgba8 1 +#endif /* GL_ARM_rgba8 */ + +#ifndef GL_ARM_shader_framebuffer_fetch +#define GL_ARM_shader_framebuffer_fetch 1 +#define GL_FETCH_PER_SAMPLE_ARM 0x8F65 +#define GL_FRAGMENT_SHADER_FRAMEBUFFER_FETCH_MRT_ARM 0x8F66 +#endif /* GL_ARM_shader_framebuffer_fetch */ + +#ifndef GL_ARM_shader_framebuffer_fetch_depth_stencil +#define GL_ARM_shader_framebuffer_fetch_depth_stencil 1 +#endif /* GL_ARM_shader_framebuffer_fetch_depth_stencil */ + +#ifndef GL_ARM_texture_unnormalized_coordinates +#define GL_ARM_texture_unnormalized_coordinates 1 +#define GL_TEXTURE_UNNORMALIZED_COORDINATES_ARM 0x8F6A +#endif /* GL_ARM_texture_unnormalized_coordinates */ + +#ifndef GL_DMP_program_binary +#define GL_DMP_program_binary 1 +#define GL_SMAPHS30_PROGRAM_BINARY_DMP 0x9251 +#define GL_SMAPHS_PROGRAM_BINARY_DMP 0x9252 +#define GL_DMP_PROGRAM_BINARY_DMP 0x9253 +#endif /* GL_DMP_program_binary */ + +#ifndef GL_DMP_shader_binary +#define GL_DMP_shader_binary 1 +#define GL_SHADER_BINARY_DMP 0x9250 +#endif /* GL_DMP_shader_binary */ + +#ifndef GL_EXT_EGL_image_array +#define GL_EXT_EGL_image_array 1 +#endif /* GL_EXT_EGL_image_array */ + +#ifndef GL_EXT_EGL_image_storage +#define GL_EXT_EGL_image_storage 1 +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXSTORAGEEXTPROC) (GLenum target, GLeglImageOES image, const GLint* attrib_list); +typedef void (GL_APIENTRYP PFNGLEGLIMAGETARGETTEXTURESTORAGEEXTPROC) (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEGLImageTargetTexStorageEXT (GLenum target, GLeglImageOES image, const GLint* attrib_list); +GL_APICALL void GL_APIENTRY glEGLImageTargetTextureStorageEXT (GLuint texture, GLeglImageOES image, const GLint* attrib_list); +#endif +#endif /* GL_EXT_EGL_image_storage */ + +#ifndef GL_EXT_EGL_image_storage_compression +#define GL_EXT_EGL_image_storage_compression 1 +#define GL_SURFACE_COMPRESSION_EXT 0x96C0 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_NONE_EXT 0x96C1 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_DEFAULT_EXT 0x96C2 +#endif /* GL_EXT_EGL_image_storage_compression */ + +#ifndef GL_EXT_YUV_target +#define GL_EXT_YUV_target 1 +#define GL_SAMPLER_EXTERNAL_2D_Y2Y_EXT 0x8BE7 +#endif /* GL_EXT_YUV_target */ + +#ifndef GL_EXT_base_instance +#define GL_EXT_base_instance 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedBaseInstanceEXT (GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexBaseInstanceEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +#endif +#endif /* GL_EXT_base_instance */ + +#ifndef GL_EXT_blend_func_extended +#define GL_EXT_blend_func_extended 1 +#define GL_SRC1_COLOR_EXT 0x88F9 +#define GL_SRC1_ALPHA_EXT 0x8589 +#define GL_ONE_MINUS_SRC1_COLOR_EXT 0x88FA +#define GL_ONE_MINUS_SRC1_ALPHA_EXT 0x88FB +#define GL_SRC_ALPHA_SATURATE_EXT 0x0308 +#define GL_LOCATION_INDEX_EXT 0x930F +#define GL_MAX_DUAL_SOURCE_DRAW_BUFFERS_EXT 0x88FC +typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONINDEXEDEXTPROC) (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +typedef void (GL_APIENTRYP PFNGLBINDFRAGDATALOCATIONEXTPROC) (GLuint program, GLuint color, const GLchar *name); +typedef GLint (GL_APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXEXTPROC) (GLuint program, GLenum programInterface, const GLchar *name); +typedef GLint (GL_APIENTRYP PFNGLGETFRAGDATAINDEXEXTPROC) (GLuint program, const GLchar *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindFragDataLocationIndexedEXT (GLuint program, GLuint colorNumber, GLuint index, const GLchar *name); +GL_APICALL void GL_APIENTRY glBindFragDataLocationEXT (GLuint program, GLuint color, const GLchar *name); +GL_APICALL GLint GL_APIENTRY glGetProgramResourceLocationIndexEXT (GLuint program, GLenum programInterface, const GLchar *name); +GL_APICALL GLint GL_APIENTRY glGetFragDataIndexEXT (GLuint program, const GLchar *name); +#endif +#endif /* GL_EXT_blend_func_extended */ + +#ifndef GL_EXT_blend_minmax +#define GL_EXT_blend_minmax 1 +#define GL_MIN_EXT 0x8007 +#define GL_MAX_EXT 0x8008 +#endif /* GL_EXT_blend_minmax */ + +#ifndef GL_EXT_buffer_storage +#define GL_EXT_buffer_storage 1 +#define GL_MAP_READ_BIT 0x0001 +#define GL_MAP_WRITE_BIT 0x0002 +#define GL_MAP_PERSISTENT_BIT_EXT 0x0040 +#define GL_MAP_COHERENT_BIT_EXT 0x0080 +#define GL_DYNAMIC_STORAGE_BIT_EXT 0x0100 +#define GL_CLIENT_STORAGE_BIT_EXT 0x0200 +#define GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT_EXT 0x00004000 +#define GL_BUFFER_IMMUTABLE_STORAGE_EXT 0x821F +#define GL_BUFFER_STORAGE_FLAGS_EXT 0x8220 +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTPROC) (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferStorageEXT (GLenum target, GLsizeiptr size, const void *data, GLbitfield flags); +#endif +#endif /* GL_EXT_buffer_storage */ + +#ifndef GL_EXT_clear_texture +#define GL_EXT_clear_texture 1 +typedef void (GL_APIENTRYP PFNGLCLEARTEXIMAGEEXTPROC) (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +typedef void (GL_APIENTRYP PFNGLCLEARTEXSUBIMAGEEXTPROC) (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glClearTexImageEXT (GLuint texture, GLint level, GLenum format, GLenum type, const void *data); +GL_APICALL void GL_APIENTRY glClearTexSubImageEXT (GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *data); +#endif +#endif /* GL_EXT_clear_texture */ + +#ifndef GL_EXT_clip_control +#define GL_EXT_clip_control 1 +#define GL_LOWER_LEFT_EXT 0x8CA1 +#define GL_UPPER_LEFT_EXT 0x8CA2 +#define GL_NEGATIVE_ONE_TO_ONE_EXT 0x935E +#define GL_ZERO_TO_ONE_EXT 0x935F +#define GL_CLIP_ORIGIN_EXT 0x935C +#define GL_CLIP_DEPTH_MODE_EXT 0x935D +typedef void (GL_APIENTRYP PFNGLCLIPCONTROLEXTPROC) (GLenum origin, GLenum depth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glClipControlEXT (GLenum origin, GLenum depth); +#endif +#endif /* GL_EXT_clip_control */ + +#ifndef GL_EXT_clip_cull_distance +#define GL_EXT_clip_cull_distance 1 +#define GL_MAX_CLIP_DISTANCES_EXT 0x0D32 +#define GL_MAX_CULL_DISTANCES_EXT 0x82F9 +#define GL_MAX_COMBINED_CLIP_AND_CULL_DISTANCES_EXT 0x82FA +#define GL_CLIP_DISTANCE0_EXT 0x3000 +#define GL_CLIP_DISTANCE1_EXT 0x3001 +#define GL_CLIP_DISTANCE2_EXT 0x3002 +#define GL_CLIP_DISTANCE3_EXT 0x3003 +#define GL_CLIP_DISTANCE4_EXT 0x3004 +#define GL_CLIP_DISTANCE5_EXT 0x3005 +#define GL_CLIP_DISTANCE6_EXT 0x3006 +#define GL_CLIP_DISTANCE7_EXT 0x3007 +#endif /* GL_EXT_clip_cull_distance */ + +#ifndef GL_EXT_color_buffer_float +#define GL_EXT_color_buffer_float 1 +#endif /* GL_EXT_color_buffer_float */ + +#ifndef GL_EXT_color_buffer_half_float +#define GL_EXT_color_buffer_half_float 1 +#define GL_RGBA16F_EXT 0x881A +#define GL_RGB16F_EXT 0x881B +#define GL_RG16F_EXT 0x822F +#define GL_R16F_EXT 0x822D +#define GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE_EXT 0x8211 +#define GL_UNSIGNED_NORMALIZED_EXT 0x8C17 +#endif /* GL_EXT_color_buffer_half_float */ + +#ifndef GL_EXT_conservative_depth +#define GL_EXT_conservative_depth 1 +#endif /* GL_EXT_conservative_depth */ + +#ifndef GL_EXT_copy_image +#define GL_EXT_copy_image 1 +typedef void (GL_APIENTRYP PFNGLCOPYIMAGESUBDATAEXTPROC) (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyImageSubDataEXT (GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +#endif +#endif /* GL_EXT_copy_image */ + +#ifndef GL_EXT_debug_label +#define GL_EXT_debug_label 1 +#define GL_PROGRAM_PIPELINE_OBJECT_EXT 0x8A4F +#define GL_PROGRAM_OBJECT_EXT 0x8B40 +#define GL_SHADER_OBJECT_EXT 0x8B48 +#define GL_BUFFER_OBJECT_EXT 0x9151 +#define GL_QUERY_OBJECT_EXT 0x9153 +#define GL_VERTEX_ARRAY_OBJECT_EXT 0x9154 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +typedef void (GL_APIENTRYP PFNGLLABELOBJECTEXTPROC) (GLenum type, GLuint object, GLsizei length, const GLchar *label); +typedef void (GL_APIENTRYP PFNGLGETOBJECTLABELEXTPROC) (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glLabelObjectEXT (GLenum type, GLuint object, GLsizei length, const GLchar *label); +GL_APICALL void GL_APIENTRY glGetObjectLabelEXT (GLenum type, GLuint object, GLsizei bufSize, GLsizei *length, GLchar *label); +#endif +#endif /* GL_EXT_debug_label */ + +#ifndef GL_EXT_debug_marker +#define GL_EXT_debug_marker 1 +typedef void (GL_APIENTRYP PFNGLINSERTEVENTMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPUSHGROUPMARKEREXTPROC) (GLsizei length, const GLchar *marker); +typedef void (GL_APIENTRYP PFNGLPOPGROUPMARKEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glInsertEventMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPushGroupMarkerEXT (GLsizei length, const GLchar *marker); +GL_APICALL void GL_APIENTRY glPopGroupMarkerEXT (void); +#endif +#endif /* GL_EXT_debug_marker */ + +#ifndef GL_EXT_depth_clamp +#define GL_EXT_depth_clamp 1 +#define GL_DEPTH_CLAMP_EXT 0x864F +#endif /* GL_EXT_depth_clamp */ + +#ifndef GL_EXT_discard_framebuffer +#define GL_EXT_discard_framebuffer 1 +#define GL_COLOR_EXT 0x1800 +#define GL_DEPTH_EXT 0x1801 +#define GL_STENCIL_EXT 0x1802 +typedef void (GL_APIENTRYP PFNGLDISCARDFRAMEBUFFEREXTPROC) (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDiscardFramebufferEXT (GLenum target, GLsizei numAttachments, const GLenum *attachments); +#endif +#endif /* GL_EXT_discard_framebuffer */ + +#ifndef GL_EXT_disjoint_timer_query +#define GL_EXT_disjoint_timer_query 1 +#define GL_QUERY_COUNTER_BITS_EXT 0x8864 +#define GL_CURRENT_QUERY_EXT 0x8865 +#define GL_QUERY_RESULT_EXT 0x8866 +#define GL_QUERY_RESULT_AVAILABLE_EXT 0x8867 +#define GL_TIME_ELAPSED_EXT 0x88BF +#define GL_TIMESTAMP_EXT 0x8E28 +#define GL_GPU_DISJOINT_EXT 0x8FBB +typedef void (GL_APIENTRYP PFNGLGENQUERIESEXTPROC) (GLsizei n, GLuint *ids); +typedef void (GL_APIENTRYP PFNGLDELETEQUERIESEXTPROC) (GLsizei n, const GLuint *ids); +typedef GLboolean (GL_APIENTRYP PFNGLISQUERYEXTPROC) (GLuint id); +typedef void (GL_APIENTRYP PFNGLBEGINQUERYEXTPROC) (GLenum target, GLuint id); +typedef void (GL_APIENTRYP PFNGLENDQUERYEXTPROC) (GLenum target); +typedef void (GL_APIENTRYP PFNGLQUERYCOUNTEREXTPROC) (GLuint id, GLenum target); +typedef void (GL_APIENTRYP PFNGLGETQUERYIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTIVEXTPROC) (GLuint id, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUIVEXTPROC) (GLuint id, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTI64VEXTPROC) (GLuint id, GLenum pname, GLint64 *params); +typedef void (GL_APIENTRYP PFNGLGETQUERYOBJECTUI64VEXTPROC) (GLuint id, GLenum pname, GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLGETINTEGER64VEXTPROC) (GLenum pname, GLint64 *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenQueriesEXT (GLsizei n, GLuint *ids); +GL_APICALL void GL_APIENTRY glDeleteQueriesEXT (GLsizei n, const GLuint *ids); +GL_APICALL GLboolean GL_APIENTRY glIsQueryEXT (GLuint id); +GL_APICALL void GL_APIENTRY glBeginQueryEXT (GLenum target, GLuint id); +GL_APICALL void GL_APIENTRY glEndQueryEXT (GLenum target); +GL_APICALL void GL_APIENTRY glQueryCounterEXT (GLuint id, GLenum target); +GL_APICALL void GL_APIENTRY glGetQueryivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectivEXT (GLuint id, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectuivEXT (GLuint id, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glGetQueryObjecti64vEXT (GLuint id, GLenum pname, GLint64 *params); +GL_APICALL void GL_APIENTRY glGetQueryObjectui64vEXT (GLuint id, GLenum pname, GLuint64 *params); +GL_APICALL void GL_APIENTRY glGetInteger64vEXT (GLenum pname, GLint64 *data); +#endif +#endif /* GL_EXT_disjoint_timer_query */ + +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSEXTPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersEXT (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_EXT_draw_buffers */ + +#ifndef GL_EXT_draw_buffers_indexed +#define GL_EXT_draw_buffers_indexed 1 +typedef void (GL_APIENTRYP PFNGLENABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEIEXTPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONIEXTPROC) (GLuint buf, GLenum mode); +typedef void (GL_APIENTRYP PFNGLBLENDEQUATIONSEPARATEIEXTPROC) (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCIEXTPROC) (GLuint buf, GLenum src, GLenum dst); +typedef void (GL_APIENTRYP PFNGLBLENDFUNCSEPARATEIEXTPROC) (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +typedef void (GL_APIENTRYP PFNGLCOLORMASKIEXTPROC) (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDIEXTPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glEnableiEXT (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiEXT (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glBlendEquationiEXT (GLuint buf, GLenum mode); +GL_APICALL void GL_APIENTRY glBlendEquationSeparateiEXT (GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GL_APICALL void GL_APIENTRY glBlendFunciEXT (GLuint buf, GLenum src, GLenum dst); +GL_APICALL void GL_APIENTRY glBlendFuncSeparateiEXT (GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GL_APICALL void GL_APIENTRY glColorMaskiEXT (GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediEXT (GLenum target, GLuint index); +#endif +#endif /* GL_EXT_draw_buffers_indexed */ + +#ifndef GL_EXT_draw_elements_base_vertex +#define GL_EXT_draw_elements_base_vertex 1 +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWRANGEELEMENTSBASEVERTEXEXTPROC) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawElementsBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawRangeElementsBaseVertexEXT (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const void *indices, GLint basevertex); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedBaseVertexEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex); +#endif +#endif /* GL_EXT_draw_elements_base_vertex */ + +#ifndef GL_EXT_draw_instanced +#define GL_EXT_draw_instanced 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDEXTPROC) (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDEXTPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedEXT (GLenum mode, GLint start, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedEXT (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_EXT_draw_instanced */ + +#ifndef GL_EXT_draw_transform_feedback +#define GL_EXT_draw_transform_feedback 1 +typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKEXTPROC) (GLenum mode, GLuint id); +typedef void (GL_APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC) (GLenum mode, GLuint id, GLsizei instancecount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawTransformFeedbackEXT (GLenum mode, GLuint id); +GL_APICALL void GL_APIENTRY glDrawTransformFeedbackInstancedEXT (GLenum mode, GLuint id, GLsizei instancecount); +#endif +#endif /* GL_EXT_draw_transform_feedback */ + +#ifndef GL_EXT_external_buffer +#define GL_EXT_external_buffer 1 +typedef void *GLeglClientBufferEXT; +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEEXTERNALEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEEXTERNALEXTPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferStorageExternalEXT (GLenum target, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +GL_APICALL void GL_APIENTRY glNamedBufferStorageExternalEXT (GLuint buffer, GLintptr offset, GLsizeiptr size, GLeglClientBufferEXT clientBuffer, GLbitfield flags); +#endif +#endif /* GL_EXT_external_buffer */ + +#ifndef GL_EXT_float_blend +#define GL_EXT_float_blend 1 +#endif /* GL_EXT_float_blend */ + +#ifndef GL_EXT_fragment_shading_rate +#define GL_EXT_fragment_shading_rate 1 +#define GL_SHADING_RATE_1X1_PIXELS_EXT 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_EXT 0x96A7 +#define GL_SHADING_RATE_2X1_PIXELS_EXT 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_EXT 0x96A9 +#define GL_SHADING_RATE_1X4_PIXELS_EXT 0x96AA +#define GL_SHADING_RATE_4X1_PIXELS_EXT 0x96AB +#define GL_SHADING_RATE_4X2_PIXELS_EXT 0x96AC +#define GL_SHADING_RATE_2X4_PIXELS_EXT 0x96AD +#define GL_SHADING_RATE_4X4_PIXELS_EXT 0x96AE +#define GL_SHADING_RATE_EXT 0x96D0 +#define GL_SHADING_RATE_ATTACHMENT_EXT 0x96D1 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_EXT 0x96D2 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_EXT 0x96D3 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MIN_EXT 0x96D4 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MAX_EXT 0x96D5 +#define GL_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_EXT 0x96D6 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D7 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_WIDTH_EXT 0x96D8 +#define GL_MIN_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96D9 +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_HEIGHT_EXT 0x96DA +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_TEXEL_ASPECT_RATIO_EXT 0x96DB +#define GL_MAX_FRAGMENT_SHADING_RATE_ATTACHMENT_LAYERS_EXT 0x96DC +#define GL_FRAGMENT_SHADING_RATE_WITH_SHADER_DEPTH_STENCIL_WRITES_SUPPORTED_EXT 0x96DD +#define GL_FRAGMENT_SHADING_RATE_WITH_SAMPLE_MASK_SUPPORTED_EXT 0x96DE +#define GL_FRAGMENT_SHADING_RATE_ATTACHMENT_WITH_DEFAULT_FRAMEBUFFER_SUPPORTED_EXT 0x96DF +#define GL_FRAGMENT_SHADING_RATE_NON_TRIVIAL_COMBINERS_SUPPORTED_EXT 0x8F6F +typedef void (GL_APIENTRYP PFNGLGETFRAGMENTSHADINGRATESEXTPROC) (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEEXTPROC) (GLenum rate); +typedef void (GL_APIENTRYP PFNGLSHADINGRATECOMBINEROPSEXTPROC) (GLenum combinerOp0, GLenum combinerOp1); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSHADINGRATEEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetFragmentShadingRatesEXT (GLsizei samples, GLsizei maxCount, GLsizei *count, GLenum *shadingRates); +GL_APICALL void GL_APIENTRY glShadingRateEXT (GLenum rate); +GL_APICALL void GL_APIENTRY glShadingRateCombinerOpsEXT (GLenum combinerOp0, GLenum combinerOp1); +GL_APICALL void GL_APIENTRY glFramebufferShadingRateEXT (GLenum target, GLenum attachment, GLuint texture, GLint baseLayer, GLsizei numLayers, GLsizei texelWidth, GLsizei texelHeight); +#endif +#endif /* GL_EXT_fragment_shading_rate */ + +#ifndef GL_EXT_geometry_point_size +#define GL_EXT_geometry_point_size 1 +#endif /* GL_EXT_geometry_point_size */ + +#ifndef GL_EXT_geometry_shader +#define GL_EXT_geometry_shader 1 +#define GL_GEOMETRY_SHADER_EXT 0x8DD9 +#define GL_GEOMETRY_SHADER_BIT_EXT 0x00000004 +#define GL_GEOMETRY_LINKED_VERTICES_OUT_EXT 0x8916 +#define GL_GEOMETRY_LINKED_INPUT_TYPE_EXT 0x8917 +#define GL_GEOMETRY_LINKED_OUTPUT_TYPE_EXT 0x8918 +#define GL_GEOMETRY_SHADER_INVOCATIONS_EXT 0x887F +#define GL_LAYER_PROVOKING_VERTEX_EXT 0x825E +#define GL_LINES_ADJACENCY_EXT 0x000A +#define GL_LINE_STRIP_ADJACENCY_EXT 0x000B +#define GL_TRIANGLES_ADJACENCY_EXT 0x000C +#define GL_TRIANGLE_STRIP_ADJACENCY_EXT 0x000D +#define GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8DDF +#define GL_MAX_GEOMETRY_UNIFORM_BLOCKS_EXT 0x8A2C +#define GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS_EXT 0x8A32 +#define GL_MAX_GEOMETRY_INPUT_COMPONENTS_EXT 0x9123 +#define GL_MAX_GEOMETRY_OUTPUT_COMPONENTS_EXT 0x9124 +#define GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT 0x8DE0 +#define GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT 0x8DE1 +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS_EXT 0x8E5A +#define GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT 0x8C29 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS_EXT 0x92CF +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS_EXT 0x92D5 +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS_EXT 0x90CD +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS_EXT 0x90D7 +#define GL_FIRST_VERTEX_CONVENTION_EXT 0x8E4D +#define GL_LAST_VERTEX_CONVENTION_EXT 0x8E4E +#define GL_UNDEFINED_VERTEX_EXT 0x8260 +#define GL_PRIMITIVES_GENERATED_EXT 0x8C87 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS_EXT 0x9312 +#define GL_MAX_FRAMEBUFFER_LAYERS_EXT 0x9317 +#define GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT 0x8DA8 +#define GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT 0x8DA7 +#define GL_REFERENCED_BY_GEOMETRY_SHADER_EXT 0x9309 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREEXTPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureEXT (GLenum target, GLenum attachment, GLuint texture, GLint level); +#endif +#endif /* GL_EXT_geometry_shader */ + +#ifndef GL_EXT_gpu_shader5 +#define GL_EXT_gpu_shader5 1 +#endif /* GL_EXT_gpu_shader5 */ + +#ifndef GL_EXT_instanced_arrays +#define GL_EXT_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISOREXTPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glVertexAttribDivisorEXT (GLuint index, GLuint divisor); +#endif +#endif /* GL_EXT_instanced_arrays */ + +#ifndef GL_EXT_map_buffer_range +#define GL_EXT_map_buffer_range 1 +#define GL_MAP_READ_BIT_EXT 0x0001 +#define GL_MAP_WRITE_BIT_EXT 0x0002 +#define GL_MAP_INVALIDATE_RANGE_BIT_EXT 0x0004 +#define GL_MAP_INVALIDATE_BUFFER_BIT_EXT 0x0008 +#define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 +#define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +typedef void *(GL_APIENTRYP PFNGLMAPBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +typedef void (GL_APIENTRYP PFNGLFLUSHMAPPEDBUFFERRANGEEXTPROC) (GLenum target, GLintptr offset, GLsizeiptr length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void *GL_APIENTRY glMapBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access); +GL_APICALL void GL_APIENTRY glFlushMappedBufferRangeEXT (GLenum target, GLintptr offset, GLsizeiptr length); +#endif +#endif /* GL_EXT_map_buffer_range */ + +#ifndef GL_EXT_memory_object +#define GL_EXT_memory_object 1 +#define GL_TEXTURE_TILING_EXT 0x9580 +#define GL_DEDICATED_MEMORY_OBJECT_EXT 0x9581 +#define GL_PROTECTED_MEMORY_OBJECT_EXT 0x959B +#define GL_NUM_TILING_TYPES_EXT 0x9582 +#define GL_TILING_TYPES_EXT 0x9583 +#define GL_OPTIMAL_TILING_EXT 0x9584 +#define GL_LINEAR_TILING_EXT 0x9585 +#define GL_NUM_DEVICE_UUIDS_EXT 0x9596 +#define GL_DEVICE_UUID_EXT 0x9597 +#define GL_DRIVER_UUID_EXT 0x9598 +#define GL_UUID_SIZE_EXT 16 +typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEVEXTPROC) (GLenum pname, GLubyte *data); +typedef void (GL_APIENTRYP PFNGLGETUNSIGNEDBYTEI_VEXTPROC) (GLenum target, GLuint index, GLubyte *data); +typedef void (GL_APIENTRYP PFNGLDELETEMEMORYOBJECTSEXTPROC) (GLsizei n, const GLuint *memoryObjects); +typedef GLboolean (GL_APIENTRYP PFNGLISMEMORYOBJECTEXTPROC) (GLuint memoryObject); +typedef void (GL_APIENTRYP PFNGLCREATEMEMORYOBJECTSEXTPROC) (GLsizei n, GLuint *memoryObjects); +typedef void (GL_APIENTRYP PFNGLMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTPARAMETERIVEXTPROC) (GLuint memoryObject, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM2DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEMEM3DMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLBUFFERSTORAGEMEMEXTPROC) (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM2DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DEXTPROC) (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGEMEM3DMULTISAMPLEEXTPROC) (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERSTORAGEMEMEXTPROC) (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetUnsignedBytevEXT (GLenum pname, GLubyte *data); +GL_APICALL void GL_APIENTRY glGetUnsignedBytei_vEXT (GLenum target, GLuint index, GLubyte *data); +GL_APICALL void GL_APIENTRY glDeleteMemoryObjectsEXT (GLsizei n, const GLuint *memoryObjects); +GL_APICALL GLboolean GL_APIENTRY glIsMemoryObjectEXT (GLuint memoryObject); +GL_APICALL void GL_APIENTRY glCreateMemoryObjectsEXT (GLsizei n, GLuint *memoryObjects); +GL_APICALL void GL_APIENTRY glMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glGetMemoryObjectParameterivEXT (GLuint memoryObject, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glTexStorageMem2DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem2DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem3DEXT (GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTexStorageMem3DMultisampleEXT (GLenum target, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferStorageMemEXT (GLenum target, GLsizeiptr size, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem2DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem2DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem3DEXT (GLuint texture, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureStorageMem3DMultisampleEXT (GLuint texture, GLsizei samples, GLenum internalFormat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedSampleLocations, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferStorageMemEXT (GLuint buffer, GLsizeiptr size, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_EXT_memory_object */ + +#ifndef GL_EXT_memory_object_fd +#define GL_EXT_memory_object_fd 1 +#define GL_HANDLE_TYPE_OPAQUE_FD_EXT 0x9586 +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYFDEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryFdEXT (GLuint memory, GLuint64 size, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_memory_object_fd */ + +#ifndef GL_EXT_memory_object_win32 +#define GL_EXT_memory_object_win32 1 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_EXT 0x9587 +#define GL_HANDLE_TYPE_OPAQUE_WIN32_KMT_EXT 0x9588 +#define GL_DEVICE_LUID_EXT 0x9599 +#define GL_DEVICE_NODE_MASK_EXT 0x959A +#define GL_LUID_SIZE_EXT 8 +#define GL_HANDLE_TYPE_D3D12_TILEPOOL_EXT 0x9589 +#define GL_HANDLE_TYPE_D3D12_RESOURCE_EXT 0x958A +#define GL_HANDLE_TYPE_D3D11_IMAGE_EXT 0x958B +#define GL_HANDLE_TYPE_D3D11_IMAGE_KMT_EXT 0x958C +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32HANDLEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +typedef void (GL_APIENTRYP PFNGLIMPORTMEMORYWIN32NAMEEXTPROC) (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportMemoryWin32HandleEXT (GLuint memory, GLuint64 size, GLenum handleType, void *handle); +GL_APICALL void GL_APIENTRY glImportMemoryWin32NameEXT (GLuint memory, GLuint64 size, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_memory_object_win32 */ + +#ifndef GL_EXT_multi_draw_arrays +#define GL_EXT_multi_draw_arrays 1 +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSEXTPROC) (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSEXTPROC) (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysEXT (GLenum mode, const GLint *first, const GLsizei *count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glMultiDrawElementsEXT (GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei primcount); +#endif +#endif /* GL_EXT_multi_draw_arrays */ + +#ifndef GL_EXT_multi_draw_indirect +#define GL_EXT_multi_draw_indirect 1 +typedef void (GL_APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTEXTPROC) (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTEXTPROC) (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glMultiDrawArraysIndirectEXT (GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GL_APICALL void GL_APIENTRY glMultiDrawElementsIndirectEXT (GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +#endif +#endif /* GL_EXT_multi_draw_indirect */ + +#ifndef GL_EXT_multisampled_compatibility +#define GL_EXT_multisampled_compatibility 1 +#define GL_MULTISAMPLE_EXT 0x809D +#define GL_SAMPLE_ALPHA_TO_ONE_EXT 0x809F +#endif /* GL_EXT_multisampled_compatibility */ + +#ifndef GL_EXT_multisampled_render_to_texture +#define GL_EXT_multisampled_render_to_texture 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SAMPLES_EXT 0x8D6C +#define GL_RENDERBUFFER_SAMPLES_EXT 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT 0x8D56 +#define GL_MAX_SAMPLES_EXT 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEEXTPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleEXT (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleEXT (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +#endif /* GL_EXT_multisampled_render_to_texture */ + +#ifndef GL_EXT_multisampled_render_to_texture2 +#define GL_EXT_multisampled_render_to_texture2 1 +#endif /* GL_EXT_multisampled_render_to_texture2 */ + +#ifndef GL_EXT_multiview_draw_buffers +#define GL_EXT_multiview_draw_buffers 1 +#define GL_COLOR_ATTACHMENT_EXT 0x90F0 +#define GL_MULTIVIEW_EXT 0x90F1 +#define GL_DRAW_BUFFER_EXT 0x0C01 +#define GL_READ_BUFFER_EXT 0x0C02 +#define GL_MAX_MULTIVIEW_BUFFERS_EXT 0x90F2 +typedef void (GL_APIENTRYP PFNGLREADBUFFERINDEXEDEXTPROC) (GLenum src, GLint index); +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSINDEXEDEXTPROC) (GLint n, const GLenum *location, const GLint *indices); +typedef void (GL_APIENTRYP PFNGLGETINTEGERI_VEXTPROC) (GLenum target, GLuint index, GLint *data); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferIndexedEXT (GLenum src, GLint index); +GL_APICALL void GL_APIENTRY glDrawBuffersIndexedEXT (GLint n, const GLenum *location, const GLint *indices); +GL_APICALL void GL_APIENTRY glGetIntegeri_vEXT (GLenum target, GLuint index, GLint *data); +#endif +#endif /* GL_EXT_multiview_draw_buffers */ + +#ifndef GL_EXT_multiview_tessellation_geometry_shader +#define GL_EXT_multiview_tessellation_geometry_shader 1 +#endif /* GL_EXT_multiview_tessellation_geometry_shader */ + +#ifndef GL_EXT_multiview_texture_multisample +#define GL_EXT_multiview_texture_multisample 1 +#endif /* GL_EXT_multiview_texture_multisample */ + +#ifndef GL_EXT_multiview_timer_query +#define GL_EXT_multiview_timer_query 1 +#endif /* GL_EXT_multiview_timer_query */ + +#ifndef GL_EXT_occlusion_query_boolean +#define GL_EXT_occlusion_query_boolean 1 +#define GL_ANY_SAMPLES_PASSED_EXT 0x8C2F +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE_EXT 0x8D6A +#endif /* GL_EXT_occlusion_query_boolean */ + +#ifndef GL_EXT_polygon_offset_clamp +#define GL_EXT_polygon_offset_clamp 1 +#define GL_POLYGON_OFFSET_CLAMP_EXT 0x8E1B +typedef void (GL_APIENTRYP PFNGLPOLYGONOFFSETCLAMPEXTPROC) (GLfloat factor, GLfloat units, GLfloat clamp); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPolygonOffsetClampEXT (GLfloat factor, GLfloat units, GLfloat clamp); +#endif +#endif /* GL_EXT_polygon_offset_clamp */ + +#ifndef GL_EXT_post_depth_coverage +#define GL_EXT_post_depth_coverage 1 +#endif /* GL_EXT_post_depth_coverage */ + +#ifndef GL_EXT_primitive_bounding_box +#define GL_EXT_primitive_bounding_box 1 +#define GL_PRIMITIVE_BOUNDING_BOX_EXT 0x92BE +typedef void (GL_APIENTRYP PFNGLPRIMITIVEBOUNDINGBOXEXTPROC) (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPrimitiveBoundingBoxEXT (GLfloat minX, GLfloat minY, GLfloat minZ, GLfloat minW, GLfloat maxX, GLfloat maxY, GLfloat maxZ, GLfloat maxW); +#endif +#endif /* GL_EXT_primitive_bounding_box */ + +#ifndef GL_EXT_protected_textures +#define GL_EXT_protected_textures 1 +#define GL_CONTEXT_FLAG_PROTECTED_CONTENT_BIT_EXT 0x00000010 +#define GL_TEXTURE_PROTECTED_EXT 0x8BFA +#endif /* GL_EXT_protected_textures */ + +#ifndef GL_EXT_pvrtc_sRGB +#define GL_EXT_pvrtc_sRGB 1 +#define GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT 0x8A54 +#define GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT 0x8A55 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT 0x8A56 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT 0x8A57 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV2_IMG 0x93F0 +#define GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV2_IMG 0x93F1 +#endif /* GL_EXT_pvrtc_sRGB */ + +#ifndef GL_EXT_raster_multisample +#define GL_EXT_raster_multisample 1 +#define GL_RASTER_MULTISAMPLE_EXT 0x9327 +#define GL_RASTER_SAMPLES_EXT 0x9328 +#define GL_MAX_RASTER_SAMPLES_EXT 0x9329 +#define GL_RASTER_FIXED_SAMPLE_LOCATIONS_EXT 0x932A +#define GL_MULTISAMPLE_RASTERIZATION_ALLOWED_EXT 0x932B +#define GL_EFFECTIVE_RASTER_SAMPLES_EXT 0x932C +typedef void (GL_APIENTRYP PFNGLRASTERSAMPLESEXTPROC) (GLuint samples, GLboolean fixedsamplelocations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRasterSamplesEXT (GLuint samples, GLboolean fixedsamplelocations); +#endif +#endif /* GL_EXT_raster_multisample */ + +#ifndef GL_EXT_read_format_bgra +#define GL_EXT_read_format_bgra 1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT 0x8365 +#define GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT 0x8366 +#endif /* GL_EXT_read_format_bgra */ + +#ifndef GL_EXT_render_snorm +#define GL_EXT_render_snorm 1 +#define GL_R8_SNORM 0x8F94 +#define GL_RG8_SNORM 0x8F95 +#define GL_RGBA8_SNORM 0x8F97 +#define GL_R16_SNORM_EXT 0x8F98 +#define GL_RG16_SNORM_EXT 0x8F99 +#define GL_RGBA16_SNORM_EXT 0x8F9B +#endif /* GL_EXT_render_snorm */ + +#ifndef GL_EXT_robustness +#define GL_EXT_robustness 1 +#define GL_GUILTY_CONTEXT_RESET_EXT 0x8253 +#define GL_INNOCENT_CONTEXT_RESET_EXT 0x8254 +#define GL_UNKNOWN_CONTEXT_RESET_EXT 0x8255 +#define GL_CONTEXT_ROBUST_ACCESS_EXT 0x90F3 +#define GL_RESET_NOTIFICATION_STRATEGY_EXT 0x8256 +#define GL_LOSE_CONTEXT_ON_RESET_EXT 0x8252 +#define GL_NO_RESET_NOTIFICATION_EXT 0x8261 +typedef GLenum (GL_APIENTRYP PFNGLGETGRAPHICSRESETSTATUSEXTPROC) (void); +typedef void (GL_APIENTRYP PFNGLREADNPIXELSEXTPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMFVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLGETNUNIFORMIVEXTPROC) (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLenum GL_APIENTRY glGetGraphicsResetStatusEXT (void); +GL_APICALL void GL_APIENTRY glReadnPixelsEXT (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLsizei bufSize, void *data); +GL_APICALL void GL_APIENTRY glGetnUniformfvEXT (GLuint program, GLint location, GLsizei bufSize, GLfloat *params); +GL_APICALL void GL_APIENTRY glGetnUniformivEXT (GLuint program, GLint location, GLsizei bufSize, GLint *params); +#endif +#endif /* GL_EXT_robustness */ + +#ifndef GL_EXT_sRGB +#define GL_EXT_sRGB 1 +#define GL_SRGB_EXT 0x8C40 +#define GL_SRGB_ALPHA_EXT 0x8C42 +#define GL_SRGB8_ALPHA8_EXT 0x8C43 +#define GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING_EXT 0x8210 +#endif /* GL_EXT_sRGB */ + +#ifndef GL_EXT_sRGB_write_control +#define GL_EXT_sRGB_write_control 1 +#define GL_FRAMEBUFFER_SRGB_EXT 0x8DB9 +#endif /* GL_EXT_sRGB_write_control */ + +#ifndef GL_EXT_semaphore +#define GL_EXT_semaphore 1 +#define GL_LAYOUT_GENERAL_EXT 0x958D +#define GL_LAYOUT_COLOR_ATTACHMENT_EXT 0x958E +#define GL_LAYOUT_DEPTH_STENCIL_ATTACHMENT_EXT 0x958F +#define GL_LAYOUT_DEPTH_STENCIL_READ_ONLY_EXT 0x9590 +#define GL_LAYOUT_SHADER_READ_ONLY_EXT 0x9591 +#define GL_LAYOUT_TRANSFER_SRC_EXT 0x9592 +#define GL_LAYOUT_TRANSFER_DST_EXT 0x9593 +#define GL_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_EXT 0x9530 +#define GL_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_EXT 0x9531 +typedef void (GL_APIENTRYP PFNGLGENSEMAPHORESEXTPROC) (GLsizei n, GLuint *semaphores); +typedef void (GL_APIENTRYP PFNGLDELETESEMAPHORESEXTPROC) (GLsizei n, const GLuint *semaphores); +typedef GLboolean (GL_APIENTRYP PFNGLISSEMAPHOREEXTPROC) (GLuint semaphore); +typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, const GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERUI64VEXTPROC) (GLuint semaphore, GLenum pname, GLuint64 *params); +typedef void (GL_APIENTRYP PFNGLWAITSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +typedef void (GL_APIENTRYP PFNGLSIGNALSEMAPHOREEXTPROC) (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGenSemaphoresEXT (GLsizei n, GLuint *semaphores); +GL_APICALL void GL_APIENTRY glDeleteSemaphoresEXT (GLsizei n, const GLuint *semaphores); +GL_APICALL GLboolean GL_APIENTRY glIsSemaphoreEXT (GLuint semaphore); +GL_APICALL void GL_APIENTRY glSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, const GLuint64 *params); +GL_APICALL void GL_APIENTRY glGetSemaphoreParameterui64vEXT (GLuint semaphore, GLenum pname, GLuint64 *params); +GL_APICALL void GL_APIENTRY glWaitSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *srcLayouts); +GL_APICALL void GL_APIENTRY glSignalSemaphoreEXT (GLuint semaphore, GLuint numBufferBarriers, const GLuint *buffers, GLuint numTextureBarriers, const GLuint *textures, const GLenum *dstLayouts); +#endif +#endif /* GL_EXT_semaphore */ + +#ifndef GL_EXT_semaphore_fd +#define GL_EXT_semaphore_fd 1 +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREFDEXTPROC) (GLuint semaphore, GLenum handleType, GLint fd); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreFdEXT (GLuint semaphore, GLenum handleType, GLint fd); +#endif +#endif /* GL_EXT_semaphore_fd */ + +#ifndef GL_EXT_semaphore_win32 +#define GL_EXT_semaphore_win32 1 +#define GL_HANDLE_TYPE_D3D12_FENCE_EXT 0x9594 +#define GL_D3D12_FENCE_VALUE_EXT 0x9595 +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32HANDLEEXTPROC) (GLuint semaphore, GLenum handleType, void *handle); +typedef void (GL_APIENTRYP PFNGLIMPORTSEMAPHOREWIN32NAMEEXTPROC) (GLuint semaphore, GLenum handleType, const void *name); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32HandleEXT (GLuint semaphore, GLenum handleType, void *handle); +GL_APICALL void GL_APIENTRY glImportSemaphoreWin32NameEXT (GLuint semaphore, GLenum handleType, const void *name); +#endif +#endif /* GL_EXT_semaphore_win32 */ + +#ifndef GL_EXT_separate_depth_stencil +#define GL_EXT_separate_depth_stencil 1 +#endif /* GL_EXT_separate_depth_stencil */ + +#ifndef GL_EXT_separate_shader_objects +#define GL_EXT_separate_shader_objects 1 +#define GL_ACTIVE_PROGRAM_EXT 0x8259 +#define GL_VERTEX_SHADER_BIT_EXT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT_EXT 0x00000002 +#define GL_ALL_SHADER_BITS_EXT 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE_EXT 0x8258 +#define GL_PROGRAM_PIPELINE_BINDING_EXT 0x825A +typedef void (GL_APIENTRYP PFNGLACTIVESHADERPROGRAMEXTPROC) (GLuint pipeline, GLuint program); +typedef void (GL_APIENTRYP PFNGLBINDPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef GLuint (GL_APIENTRYP PFNGLCREATESHADERPROGRAMVEXTPROC) (GLenum type, GLsizei count, const GLchar **strings); +typedef void (GL_APIENTRYP PFNGLDELETEPROGRAMPIPELINESEXTPROC) (GLsizei n, const GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGENPROGRAMPIPELINESEXTPROC) (GLsizei n, GLuint *pipelines); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGEXTPROC) (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMPIPELINEIVEXTPROC) (GLuint pipeline, GLenum pname, GLint *params); +typedef GLboolean (GL_APIENTRYP PFNGLISPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMPARAMETERIEXTPROC) (GLuint program, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FEXTPROC) (GLuint program, GLint location, GLfloat v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IEXTPROC) (GLuint program, GLint location, GLint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FEXTPROC) (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4FVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IEXTPROC) (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4IVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUSEPROGRAMSTAGESEXTPROC) (GLuint pipeline, GLbitfield stages, GLuint program); +typedef void (GL_APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEEXTPROC) (GLuint pipeline); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIEXTPROC) (GLuint program, GLint location, GLuint v0); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIEXTPROC) (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UIVEXTPROC) (GLuint program, GLint location, GLsizei count, const GLuint *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVEXTPROC) (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glActiveShaderProgramEXT (GLuint pipeline, GLuint program); +GL_APICALL void GL_APIENTRY glBindProgramPipelineEXT (GLuint pipeline); +GL_APICALL GLuint GL_APIENTRY glCreateShaderProgramvEXT (GLenum type, GLsizei count, const GLchar **strings); +GL_APICALL void GL_APIENTRY glDeleteProgramPipelinesEXT (GLsizei n, const GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGenProgramPipelinesEXT (GLsizei n, GLuint *pipelines); +GL_APICALL void GL_APIENTRY glGetProgramPipelineInfoLogEXT (GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GL_APICALL void GL_APIENTRY glGetProgramPipelineivEXT (GLuint pipeline, GLenum pname, GLint *params); +GL_APICALL GLboolean GL_APIENTRY glIsProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramParameteriEXT (GLuint program, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glProgramUniform1fEXT (GLuint program, GLint location, GLfloat v0); +GL_APICALL void GL_APIENTRY glProgramUniform1fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform1iEXT (GLuint program, GLint location, GLint v0); +GL_APICALL void GL_APIENTRY glProgramUniform1ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1); +GL_APICALL void GL_APIENTRY glProgramUniform2fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform2iEXT (GLuint program, GLint location, GLint v0, GLint v1); +GL_APICALL void GL_APIENTRY glProgramUniform2ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GL_APICALL void GL_APIENTRY glProgramUniform3fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform3iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GL_APICALL void GL_APIENTRY glProgramUniform3ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4fEXT (GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GL_APICALL void GL_APIENTRY glProgramUniform4fvEXT (GLuint program, GLint location, GLsizei count, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniform4iEXT (GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GL_APICALL void GL_APIENTRY glProgramUniform4ivEXT (GLuint program, GLint location, GLsizei count, const GLint *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUseProgramStagesEXT (GLuint pipeline, GLbitfield stages, GLuint program); +GL_APICALL void GL_APIENTRY glValidateProgramPipelineEXT (GLuint pipeline); +GL_APICALL void GL_APIENTRY glProgramUniform1uiEXT (GLuint program, GLint location, GLuint v0); +GL_APICALL void GL_APIENTRY glProgramUniform2uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1); +GL_APICALL void GL_APIENTRY glProgramUniform3uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GL_APICALL void GL_APIENTRY glProgramUniform4uiEXT (GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GL_APICALL void GL_APIENTRY glProgramUniform1uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform2uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform3uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniform4uivEXT (GLuint program, GLint location, GLsizei count, const GLuint *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix2x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x2fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix3x4fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glProgramUniformMatrix4x3fvEXT (GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_EXT_separate_shader_objects */ + +#ifndef GL_EXT_shader_framebuffer_fetch +#define GL_EXT_shader_framebuffer_fetch 1 +#define GL_FRAGMENT_SHADER_DISCARDS_SAMPLES_EXT 0x8A52 +#endif /* GL_EXT_shader_framebuffer_fetch */ + +#ifndef GL_EXT_shader_framebuffer_fetch_non_coherent +#define GL_EXT_shader_framebuffer_fetch_non_coherent 1 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIEREXTPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierEXT (void); +#endif +#endif /* GL_EXT_shader_framebuffer_fetch_non_coherent */ + +#ifndef GL_EXT_shader_group_vote +#define GL_EXT_shader_group_vote 1 +#endif /* GL_EXT_shader_group_vote */ + +#ifndef GL_EXT_shader_implicit_conversions +#define GL_EXT_shader_implicit_conversions 1 +#endif /* GL_EXT_shader_implicit_conversions */ + +#ifndef GL_EXT_shader_integer_mix +#define GL_EXT_shader_integer_mix 1 +#endif /* GL_EXT_shader_integer_mix */ + +#ifndef GL_EXT_shader_io_blocks +#define GL_EXT_shader_io_blocks 1 +#endif /* GL_EXT_shader_io_blocks */ + +#ifndef GL_EXT_shader_non_constant_global_initializers +#define GL_EXT_shader_non_constant_global_initializers 1 +#endif /* GL_EXT_shader_non_constant_global_initializers */ + +#ifndef GL_EXT_shader_pixel_local_storage +#define GL_EXT_shader_pixel_local_storage 1 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_FAST_SIZE_EXT 0x8F63 +#define GL_MAX_SHADER_PIXEL_LOCAL_STORAGE_SIZE_EXT 0x8F67 +#define GL_SHADER_PIXEL_LOCAL_STORAGE_EXT 0x8F64 +#endif /* GL_EXT_shader_pixel_local_storage */ + +#ifndef GL_EXT_shader_pixel_local_storage2 +#define GL_EXT_shader_pixel_local_storage2 1 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_FAST_SIZE_EXT 0x9650 +#define GL_MAX_SHADER_COMBINED_LOCAL_STORAGE_SIZE_EXT 0x9651 +#define GL_FRAMEBUFFER_INCOMPLETE_INSUFFICIENT_SHADER_COMBINED_LOCAL_STORAGE_EXT 0x9652 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target, GLsizei size); +typedef GLsizei (GL_APIENTRYP PFNGLGETFRAMEBUFFERPIXELLOCALSTORAGESIZEEXTPROC) (GLuint target); +typedef void (GL_APIENTRYP PFNGLCLEARPIXELLOCALSTORAGEUIEXTPROC) (GLsizei offset, GLsizei n, const GLuint *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferPixelLocalStorageSizeEXT (GLuint target, GLsizei size); +GL_APICALL GLsizei GL_APIENTRY glGetFramebufferPixelLocalStorageSizeEXT (GLuint target); +GL_APICALL void GL_APIENTRY glClearPixelLocalStorageuiEXT (GLsizei offset, GLsizei n, const GLuint *values); +#endif +#endif /* GL_EXT_shader_pixel_local_storage2 */ + +#ifndef GL_EXT_shader_samples_identical +#define GL_EXT_shader_samples_identical 1 +#endif /* GL_EXT_shader_samples_identical */ + +#ifndef GL_EXT_shader_texture_lod +#define GL_EXT_shader_texture_lod 1 +#endif /* GL_EXT_shader_texture_lod */ + +#ifndef GL_EXT_shadow_samplers +#define GL_EXT_shadow_samplers 1 +#define GL_TEXTURE_COMPARE_MODE_EXT 0x884C +#define GL_TEXTURE_COMPARE_FUNC_EXT 0x884D +#define GL_COMPARE_REF_TO_TEXTURE_EXT 0x884E +#define GL_SAMPLER_2D_SHADOW_EXT 0x8B62 +#endif /* GL_EXT_shadow_samplers */ + +#ifndef GL_EXT_sparse_texture +#define GL_EXT_sparse_texture 1 +#define GL_TEXTURE_SPARSE_EXT 0x91A6 +#define GL_VIRTUAL_PAGE_SIZE_INDEX_EXT 0x91A7 +#define GL_NUM_SPARSE_LEVELS_EXT 0x91AA +#define GL_NUM_VIRTUAL_PAGE_SIZES_EXT 0x91A8 +#define GL_VIRTUAL_PAGE_SIZE_X_EXT 0x9195 +#define GL_VIRTUAL_PAGE_SIZE_Y_EXT 0x9196 +#define GL_VIRTUAL_PAGE_SIZE_Z_EXT 0x9197 +#define GL_TEXTURE_2D_ARRAY 0x8C1A +#define GL_TEXTURE_3D 0x806F +#define GL_MAX_SPARSE_TEXTURE_SIZE_EXT 0x9198 +#define GL_MAX_SPARSE_3D_TEXTURE_SIZE_EXT 0x9199 +#define GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_EXT 0x919A +#define GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_EXT 0x91A9 +typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTEXTPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexPageCommitmentEXT (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLboolean commit); +#endif +#endif /* GL_EXT_sparse_texture */ + +#ifndef GL_EXT_sparse_texture2 +#define GL_EXT_sparse_texture2 1 +#endif /* GL_EXT_sparse_texture2 */ + +#ifndef GL_EXT_tessellation_point_size +#define GL_EXT_tessellation_point_size 1 +#endif /* GL_EXT_tessellation_point_size */ + +#ifndef GL_EXT_tessellation_shader +#define GL_EXT_tessellation_shader 1 +#define GL_PATCHES_EXT 0x000E +#define GL_PATCH_VERTICES_EXT 0x8E72 +#define GL_TESS_CONTROL_OUTPUT_VERTICES_EXT 0x8E75 +#define GL_TESS_GEN_MODE_EXT 0x8E76 +#define GL_TESS_GEN_SPACING_EXT 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER_EXT 0x8E78 +#define GL_TESS_GEN_POINT_MODE_EXT 0x8E79 +#define GL_ISOLINES_EXT 0x8E7A +#define GL_QUADS_EXT 0x0007 +#define GL_FRACTIONAL_ODD_EXT 0x8E7B +#define GL_FRACTIONAL_EVEN_EXT 0x8E7C +#define GL_MAX_PATCH_VERTICES_EXT 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL_EXT 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS_EXT 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS_EXT 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS_EXT 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS_EXT 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS_EXT 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS_EXT 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS_EXT 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS_EXT 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS_EXT 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS_EXT 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS_EXT 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS_EXT 0x8E1F +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS_EXT 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS_EXT 0x92CE +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS_EXT 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS_EXT 0x92D4 +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS_EXT 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS_EXT 0x90CC +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS_EXT 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS_EXT 0x90D9 +#define GL_PRIMITIVE_RESTART_FOR_PATCHES_SUPPORTED 0x8221 +#define GL_IS_PER_PATCH_EXT 0x92E7 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER_EXT 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER_EXT 0x9308 +#define GL_TESS_CONTROL_SHADER_EXT 0x8E88 +#define GL_TESS_EVALUATION_SHADER_EXT 0x8E87 +#define GL_TESS_CONTROL_SHADER_BIT_EXT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT_EXT 0x00000010 +typedef void (GL_APIENTRYP PFNGLPATCHPARAMETERIEXTPROC) (GLenum pname, GLint value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPatchParameteriEXT (GLenum pname, GLint value); +#endif +#endif /* GL_EXT_tessellation_shader */ + +#ifndef GL_EXT_texture_border_clamp +#define GL_EXT_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_EXT 0x1004 +#define GL_CLAMP_TO_BORDER_EXT 0x812D +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, const GLuint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIIVEXTPROC) (GLenum target, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETTEXPARAMETERIUIVEXTPROC) (GLenum target, GLenum pname, GLuint *params); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, const GLint *param); +typedef void (GL_APIENTRYP PFNGLSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, const GLuint *param); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIIVEXTPROC) (GLuint sampler, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSAMPLERPARAMETERIUIVEXTPROC) (GLuint sampler, GLenum pname, GLuint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexParameterIivEXT (GLenum target, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glTexParameterIuivEXT (GLenum target, GLenum pname, const GLuint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIivEXT (GLenum target, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetTexParameterIuivEXT (GLenum target, GLenum pname, GLuint *params); +GL_APICALL void GL_APIENTRY glSamplerParameterIivEXT (GLuint sampler, GLenum pname, const GLint *param); +GL_APICALL void GL_APIENTRY glSamplerParameterIuivEXT (GLuint sampler, GLenum pname, const GLuint *param); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIivEXT (GLuint sampler, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glGetSamplerParameterIuivEXT (GLuint sampler, GLenum pname, GLuint *params); +#endif +#endif /* GL_EXT_texture_border_clamp */ + +#ifndef GL_EXT_texture_buffer +#define GL_EXT_texture_buffer 1 +#define GL_TEXTURE_BUFFER_EXT 0x8C2A +#define GL_TEXTURE_BUFFER_BINDING_EXT 0x8C2A +#define GL_MAX_TEXTURE_BUFFER_SIZE_EXT 0x8C2B +#define GL_TEXTURE_BINDING_BUFFER_EXT 0x8C2C +#define GL_TEXTURE_BUFFER_DATA_STORE_BINDING_EXT 0x8C2D +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT_EXT 0x919F +#define GL_SAMPLER_BUFFER_EXT 0x8DC2 +#define GL_INT_SAMPLER_BUFFER_EXT 0x8DD0 +#define GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT 0x8DD8 +#define GL_IMAGE_BUFFER_EXT 0x9051 +#define GL_INT_IMAGE_BUFFER_EXT 0x905C +#define GL_UNSIGNED_INT_IMAGE_BUFFER_EXT 0x9067 +#define GL_TEXTURE_BUFFER_OFFSET_EXT 0x919D +#define GL_TEXTURE_BUFFER_SIZE_EXT 0x919E +typedef void (GL_APIENTRYP PFNGLTEXBUFFEREXTPROC) (GLenum target, GLenum internalformat, GLuint buffer); +typedef void (GL_APIENTRYP PFNGLTEXBUFFERRANGEEXTPROC) (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexBufferEXT (GLenum target, GLenum internalformat, GLuint buffer); +GL_APICALL void GL_APIENTRY glTexBufferRangeEXT (GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +#endif +#endif /* GL_EXT_texture_buffer */ + +#ifndef GL_EXT_texture_compression_astc_decode_mode +#define GL_EXT_texture_compression_astc_decode_mode 1 +#define GL_TEXTURE_ASTC_DECODE_PRECISION_EXT 0x8F69 +#endif /* GL_EXT_texture_compression_astc_decode_mode */ + +#ifndef GL_EXT_texture_compression_bptc +#define GL_EXT_texture_compression_bptc 1 +#define GL_COMPRESSED_RGBA_BPTC_UNORM_EXT 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT 0x8E8F +#endif /* GL_EXT_texture_compression_bptc */ + +#ifndef GL_EXT_texture_compression_dxt1 +#define GL_EXT_texture_compression_dxt1 1 +#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 +#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1 +#endif /* GL_EXT_texture_compression_dxt1 */ + +#ifndef GL_EXT_texture_compression_rgtc +#define GL_EXT_texture_compression_rgtc 1 +#define GL_COMPRESSED_RED_RGTC1_EXT 0x8DBB +#define GL_COMPRESSED_SIGNED_RED_RGTC1_EXT 0x8DBC +#define GL_COMPRESSED_RED_GREEN_RGTC2_EXT 0x8DBD +#define GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT 0x8DBE +#endif /* GL_EXT_texture_compression_rgtc */ + +#ifndef GL_EXT_texture_compression_s3tc +#define GL_EXT_texture_compression_s3tc 1 +#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2 +#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3 +#endif /* GL_EXT_texture_compression_s3tc */ + +#ifndef GL_EXT_texture_compression_s3tc_srgb +#define GL_EXT_texture_compression_s3tc_srgb 1 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_EXT 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT 0x8C4F +#endif /* GL_EXT_texture_compression_s3tc_srgb */ + +#ifndef GL_EXT_texture_cube_map_array +#define GL_EXT_texture_cube_map_array 1 +#define GL_TEXTURE_CUBE_MAP_ARRAY_EXT 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_EXT 0x900A +#define GL_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_EXT 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_EXT 0x900F +#define GL_IMAGE_CUBE_MAP_ARRAY_EXT 0x9054 +#define GL_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x905F +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY_EXT 0x906A +#endif /* GL_EXT_texture_cube_map_array */ + +#ifndef GL_EXT_texture_filter_anisotropic +#define GL_EXT_texture_filter_anisotropic 1 +#define GL_TEXTURE_MAX_ANISOTROPY_EXT 0x84FE +#define GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT 0x84FF +#endif /* GL_EXT_texture_filter_anisotropic */ + +#ifndef GL_EXT_texture_filter_minmax +#define GL_EXT_texture_filter_minmax 1 +#define GL_TEXTURE_REDUCTION_MODE_EXT 0x9366 +#define GL_WEIGHTED_AVERAGE_EXT 0x9367 +#endif /* GL_EXT_texture_filter_minmax */ + +#ifndef GL_EXT_texture_format_BGRA8888 +#define GL_EXT_texture_format_BGRA8888 1 +#endif /* GL_EXT_texture_format_BGRA8888 */ + +#ifndef GL_EXT_texture_format_sRGB_override +#define GL_EXT_texture_format_sRGB_override 1 +#define GL_TEXTURE_FORMAT_SRGB_OVERRIDE_EXT 0x8FBF +#endif /* GL_EXT_texture_format_sRGB_override */ + +#ifndef GL_EXT_texture_mirror_clamp_to_edge +#define GL_EXT_texture_mirror_clamp_to_edge 1 +#define GL_MIRROR_CLAMP_TO_EDGE_EXT 0x8743 +#endif /* GL_EXT_texture_mirror_clamp_to_edge */ + +#ifndef GL_EXT_texture_norm16 +#define GL_EXT_texture_norm16 1 +#define GL_R16_EXT 0x822A +#define GL_RG16_EXT 0x822C +#define GL_RGBA16_EXT 0x805B +#define GL_RGB16_EXT 0x8054 +#define GL_RGB16_SNORM_EXT 0x8F9A +#endif /* GL_EXT_texture_norm16 */ + +#ifndef GL_EXT_texture_query_lod +#define GL_EXT_texture_query_lod 1 +#endif /* GL_EXT_texture_query_lod */ + +#ifndef GL_EXT_texture_rg +#define GL_EXT_texture_rg 1 +#define GL_RED_EXT 0x1903 +#define GL_RG_EXT 0x8227 +#define GL_R8_EXT 0x8229 +#define GL_RG8_EXT 0x822B +#endif /* GL_EXT_texture_rg */ + +#ifndef GL_EXT_texture_sRGB_R8 +#define GL_EXT_texture_sRGB_R8 1 +#define GL_SR8_EXT 0x8FBD +#endif /* GL_EXT_texture_sRGB_R8 */ + +#ifndef GL_EXT_texture_sRGB_RG8 +#define GL_EXT_texture_sRGB_RG8 1 +#define GL_SRG8_EXT 0x8FBE +#endif /* GL_EXT_texture_sRGB_RG8 */ + +#ifndef GL_EXT_texture_sRGB_decode +#define GL_EXT_texture_sRGB_decode 1 +#define GL_TEXTURE_SRGB_DECODE_EXT 0x8A48 +#define GL_DECODE_EXT 0x8A49 +#define GL_SKIP_DECODE_EXT 0x8A4A +#endif /* GL_EXT_texture_sRGB_decode */ + +#ifndef GL_EXT_texture_shadow_lod +#define GL_EXT_texture_shadow_lod 1 +#endif /* GL_EXT_texture_shadow_lod */ + +#ifndef GL_EXT_texture_storage +#define GL_EXT_texture_storage 1 +#define GL_TEXTURE_IMMUTABLE_FORMAT_EXT 0x912F +#define GL_ALPHA8_EXT 0x803C +#define GL_LUMINANCE8_EXT 0x8040 +#define GL_LUMINANCE8_ALPHA8_EXT 0x8045 +#define GL_RGBA32F_EXT 0x8814 +#define GL_RGB32F_EXT 0x8815 +#define GL_ALPHA32F_EXT 0x8816 +#define GL_LUMINANCE32F_EXT 0x8818 +#define GL_LUMINANCE_ALPHA32F_EXT 0x8819 +#define GL_ALPHA16F_EXT 0x881C +#define GL_LUMINANCE16F_EXT 0x881E +#define GL_LUMINANCE_ALPHA16F_EXT 0x881F +#define GL_R32F_EXT 0x822E +#define GL_RG32F_EXT 0x8230 +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE1DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGE3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE1DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE2DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLTEXTURESTORAGE3DEXTPROC) (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorage1DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTexStorage2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTexStorage3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GL_APICALL void GL_APIENTRY glTextureStorage1DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GL_APICALL void GL_APIENTRY glTextureStorage2DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glTextureStorage3DEXT (GLuint texture, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +#endif +#endif /* GL_EXT_texture_storage */ + +#ifndef GL_EXT_texture_storage_compression +#define GL_EXT_texture_storage_compression 1 +#define GL_NUM_SURFACE_COMPRESSION_FIXED_RATES_EXT 0x8F6E +#define GL_SURFACE_COMPRESSION_FIXED_RATE_1BPC_EXT 0x96C4 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_2BPC_EXT 0x96C5 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_3BPC_EXT 0x96C6 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_4BPC_EXT 0x96C7 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_5BPC_EXT 0x96C8 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_6BPC_EXT 0x96C9 +#define GL_SURFACE_COMPRESSION_FIXED_RATE_7BPC_EXT 0x96CA +#define GL_SURFACE_COMPRESSION_FIXED_RATE_8BPC_EXT 0x96CB +#define GL_SURFACE_COMPRESSION_FIXED_RATE_9BPC_EXT 0x96CC +#define GL_SURFACE_COMPRESSION_FIXED_RATE_10BPC_EXT 0x96CD +#define GL_SURFACE_COMPRESSION_FIXED_RATE_11BPC_EXT 0x96CE +#define GL_SURFACE_COMPRESSION_FIXED_RATE_12BPC_EXT 0x96CF +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEATTRIBS2DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, const GLint* attrib_list); +typedef void (GL_APIENTRYP PFNGLTEXSTORAGEATTRIBS3DEXTPROC) (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const GLint* attrib_list); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexStorageAttribs2DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, const GLint* attrib_list); +GL_APICALL void GL_APIENTRY glTexStorageAttribs3DEXT (GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, const GLint* attrib_list); +#endif +#endif /* GL_EXT_texture_storage_compression */ + +#ifndef GL_EXT_texture_type_2_10_10_10_REV +#define GL_EXT_texture_type_2_10_10_10_REV 1 +#define GL_UNSIGNED_INT_2_10_10_10_REV_EXT 0x8368 +#endif /* GL_EXT_texture_type_2_10_10_10_REV */ + +#ifndef GL_EXT_texture_view +#define GL_EXT_texture_view 1 +#define GL_TEXTURE_VIEW_MIN_LEVEL_EXT 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS_EXT 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER_EXT 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS_EXT 0x82DE +typedef void (GL_APIENTRYP PFNGLTEXTUREVIEWEXTPROC) (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureViewEXT (GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +#endif +#endif /* GL_EXT_texture_view */ + +#ifndef GL_EXT_unpack_subimage +#define GL_EXT_unpack_subimage 1 +#define GL_UNPACK_ROW_LENGTH_EXT 0x0CF2 +#define GL_UNPACK_SKIP_ROWS_EXT 0x0CF3 +#define GL_UNPACK_SKIP_PIXELS_EXT 0x0CF4 +#endif /* GL_EXT_unpack_subimage */ + +#ifndef GL_EXT_win32_keyed_mutex +#define GL_EXT_win32_keyed_mutex 1 +typedef GLboolean (GL_APIENTRYP PFNGLACQUIREKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key, GLuint timeout); +typedef GLboolean (GL_APIENTRYP PFNGLRELEASEKEYEDMUTEXWIN32EXTPROC) (GLuint memory, GLuint64 key); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLboolean GL_APIENTRY glAcquireKeyedMutexWin32EXT (GLuint memory, GLuint64 key, GLuint timeout); +GL_APICALL GLboolean GL_APIENTRY glReleaseKeyedMutexWin32EXT (GLuint memory, GLuint64 key); +#endif +#endif /* GL_EXT_win32_keyed_mutex */ + +#ifndef GL_EXT_window_rectangles +#define GL_EXT_window_rectangles 1 +#define GL_INCLUSIVE_EXT 0x8F10 +#define GL_EXCLUSIVE_EXT 0x8F11 +#define GL_WINDOW_RECTANGLE_EXT 0x8F12 +#define GL_WINDOW_RECTANGLE_MODE_EXT 0x8F13 +#define GL_MAX_WINDOW_RECTANGLES_EXT 0x8F14 +#define GL_NUM_WINDOW_RECTANGLES_EXT 0x8F15 +typedef void (GL_APIENTRYP PFNGLWINDOWRECTANGLESEXTPROC) (GLenum mode, GLsizei count, const GLint *box); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glWindowRectanglesEXT (GLenum mode, GLsizei count, const GLint *box); +#endif +#endif /* GL_EXT_window_rectangles */ + +#ifndef GL_FJ_shader_binary_GCCSO +#define GL_FJ_shader_binary_GCCSO 1 +#define GL_GCCSO_SHADER_BINARY_FJ 0x9260 +#endif /* GL_FJ_shader_binary_GCCSO */ + +#ifndef GL_IMG_bindless_texture +#define GL_IMG_bindless_texture 1 +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLEIMGPROC) (GLuint texture); +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLEIMGPROC) (GLuint texture, GLuint sampler); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64IMGPROC) (GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VIMGPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64IMGPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VIMGPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleIMG (GLuint texture); +GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleIMG (GLuint texture, GLuint sampler); +GL_APICALL void GL_APIENTRY glUniformHandleui64IMG (GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glUniformHandleui64vIMG (GLint location, GLsizei count, const GLuint64 *value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64IMG (GLuint program, GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vIMG (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +#endif +#endif /* GL_IMG_bindless_texture */ + +#ifndef GL_IMG_framebuffer_downsample +#define GL_IMG_framebuffer_downsample 1 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_AND_DOWNSAMPLE_IMG 0x913C +#define GL_NUM_DOWNSAMPLE_SCALES_IMG 0x913D +#define GL_DOWNSAMPLE_SCALES_IMG 0x913E +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_SCALE_IMG 0x913F +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURELAYERDOWNSAMPLEIMGPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTexture2DDownsampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint xscale, GLint yscale); +GL_APICALL void GL_APIENTRY glFramebufferTextureLayerDownsampleIMG (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer, GLint xscale, GLint yscale); +#endif +#endif /* GL_IMG_framebuffer_downsample */ + +#ifndef GL_IMG_multisampled_render_to_texture +#define GL_IMG_multisampled_render_to_texture 1 +#define GL_RENDERBUFFER_SAMPLES_IMG 0x9133 +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_IMG 0x9134 +#define GL_MAX_SAMPLES_IMG 0x9135 +#define GL_TEXTURE_SAMPLES_IMG 0x9136 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLEIMGPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEIMGPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleIMG (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glFramebufferTexture2DMultisampleIMG (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLsizei samples); +#endif +#endif /* GL_IMG_multisampled_render_to_texture */ + +#ifndef GL_IMG_program_binary +#define GL_IMG_program_binary 1 +#define GL_SGX_PROGRAM_BINARY_IMG 0x9130 +#endif /* GL_IMG_program_binary */ + +#ifndef GL_IMG_read_format +#define GL_IMG_read_format 1 +#define GL_BGRA_IMG 0x80E1 +#define GL_UNSIGNED_SHORT_4_4_4_4_REV_IMG 0x8365 +#endif /* GL_IMG_read_format */ + +#ifndef GL_IMG_shader_binary +#define GL_IMG_shader_binary 1 +#define GL_SGX_BINARY_IMG 0x8C0A +#endif /* GL_IMG_shader_binary */ + +#ifndef GL_IMG_texture_compression_pvrtc +#define GL_IMG_texture_compression_pvrtc 1 +#define GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG 0x8C00 +#define GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG 0x8C01 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG 0x8C02 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG 0x8C03 +#endif /* GL_IMG_texture_compression_pvrtc */ + +#ifndef GL_IMG_texture_compression_pvrtc2 +#define GL_IMG_texture_compression_pvrtc2 1 +#define GL_COMPRESSED_RGBA_PVRTC_2BPPV2_IMG 0x9137 +#define GL_COMPRESSED_RGBA_PVRTC_4BPPV2_IMG 0x9138 +#endif /* GL_IMG_texture_compression_pvrtc2 */ + +#ifndef GL_IMG_texture_filter_cubic +#define GL_IMG_texture_filter_cubic 1 +#define GL_CUBIC_IMG 0x9139 +#define GL_CUBIC_MIPMAP_NEAREST_IMG 0x913A +#define GL_CUBIC_MIPMAP_LINEAR_IMG 0x913B +#endif /* GL_IMG_texture_filter_cubic */ + +#ifndef GL_INTEL_blackhole_render +#define GL_INTEL_blackhole_render 1 +#define GL_BLACKHOLE_RENDER_INTEL 0x83FC +#endif /* GL_INTEL_blackhole_render */ + +#ifndef GL_INTEL_conservative_rasterization +#define GL_INTEL_conservative_rasterization 1 +#define GL_CONSERVATIVE_RASTERIZATION_INTEL 0x83FE +#endif /* GL_INTEL_conservative_rasterization */ + +#ifndef GL_INTEL_framebuffer_CMAA +#define GL_INTEL_framebuffer_CMAA 1 +typedef void (GL_APIENTRYP PFNGLAPPLYFRAMEBUFFERATTACHMENTCMAAINTELPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glApplyFramebufferAttachmentCMAAINTEL (void); +#endif +#endif /* GL_INTEL_framebuffer_CMAA */ + +#ifndef GL_INTEL_performance_query +#define GL_INTEL_performance_query 1 +#define GL_PERFQUERY_SINGLE_CONTEXT_INTEL 0x00000000 +#define GL_PERFQUERY_GLOBAL_CONTEXT_INTEL 0x00000001 +#define GL_PERFQUERY_WAIT_INTEL 0x83FB +#define GL_PERFQUERY_FLUSH_INTEL 0x83FA +#define GL_PERFQUERY_DONOT_FLUSH_INTEL 0x83F9 +#define GL_PERFQUERY_COUNTER_EVENT_INTEL 0x94F0 +#define GL_PERFQUERY_COUNTER_DURATION_NORM_INTEL 0x94F1 +#define GL_PERFQUERY_COUNTER_DURATION_RAW_INTEL 0x94F2 +#define GL_PERFQUERY_COUNTER_THROUGHPUT_INTEL 0x94F3 +#define GL_PERFQUERY_COUNTER_RAW_INTEL 0x94F4 +#define GL_PERFQUERY_COUNTER_TIMESTAMP_INTEL 0x94F5 +#define GL_PERFQUERY_COUNTER_DATA_UINT32_INTEL 0x94F8 +#define GL_PERFQUERY_COUNTER_DATA_UINT64_INTEL 0x94F9 +#define GL_PERFQUERY_COUNTER_DATA_FLOAT_INTEL 0x94FA +#define GL_PERFQUERY_COUNTER_DATA_DOUBLE_INTEL 0x94FB +#define GL_PERFQUERY_COUNTER_DATA_BOOL32_INTEL 0x94FC +#define GL_PERFQUERY_QUERY_NAME_LENGTH_MAX_INTEL 0x94FD +#define GL_PERFQUERY_COUNTER_NAME_LENGTH_MAX_INTEL 0x94FE +#define GL_PERFQUERY_COUNTER_DESC_LENGTH_MAX_INTEL 0x94FF +#define GL_PERFQUERY_GPA_EXTENDED_COUNTERS_INTEL 0x9500 +typedef void (GL_APIENTRYP PFNGLBEGINPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLCREATEPERFQUERYINTELPROC) (GLuint queryId, GLuint *queryHandle); +typedef void (GL_APIENTRYP PFNGLDELETEPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLENDPERFQUERYINTELPROC) (GLuint queryHandle); +typedef void (GL_APIENTRYP PFNGLGETFIRSTPERFQUERYIDINTELPROC) (GLuint *queryId); +typedef void (GL_APIENTRYP PFNGLGETNEXTPERFQUERYIDINTELPROC) (GLuint queryId, GLuint *nextQueryId); +typedef void (GL_APIENTRYP PFNGLGETPERFCOUNTERINFOINTELPROC) (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYDATAINTELPROC) (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYIDBYNAMEINTELPROC) (GLchar *queryName, GLuint *queryId); +typedef void (GL_APIENTRYP PFNGLGETPERFQUERYINFOINTELPROC) (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBeginPerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glCreatePerfQueryINTEL (GLuint queryId, GLuint *queryHandle); +GL_APICALL void GL_APIENTRY glDeletePerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glEndPerfQueryINTEL (GLuint queryHandle); +GL_APICALL void GL_APIENTRY glGetFirstPerfQueryIdINTEL (GLuint *queryId); +GL_APICALL void GL_APIENTRY glGetNextPerfQueryIdINTEL (GLuint queryId, GLuint *nextQueryId); +GL_APICALL void GL_APIENTRY glGetPerfCounterInfoINTEL (GLuint queryId, GLuint counterId, GLuint counterNameLength, GLchar *counterName, GLuint counterDescLength, GLchar *counterDesc, GLuint *counterOffset, GLuint *counterDataSize, GLuint *counterTypeEnum, GLuint *counterDataTypeEnum, GLuint64 *rawCounterMaxValue); +GL_APICALL void GL_APIENTRY glGetPerfQueryDataINTEL (GLuint queryHandle, GLuint flags, GLsizei dataSize, void *data, GLuint *bytesWritten); +GL_APICALL void GL_APIENTRY glGetPerfQueryIdByNameINTEL (GLchar *queryName, GLuint *queryId); +GL_APICALL void GL_APIENTRY glGetPerfQueryInfoINTEL (GLuint queryId, GLuint queryNameLength, GLchar *queryName, GLuint *dataSize, GLuint *noCounters, GLuint *noInstances, GLuint *capsMask); +#endif +#endif /* GL_INTEL_performance_query */ + +#ifndef GL_MESA_bgra +#define GL_MESA_bgra 1 +#define GL_BGR_EXT 0x80E0 +#endif /* GL_MESA_bgra */ + +#ifndef GL_MESA_framebuffer_flip_x +#define GL_MESA_framebuffer_flip_x 1 +#define GL_FRAMEBUFFER_FLIP_X_MESA 0x8BBC +#endif /* GL_MESA_framebuffer_flip_x */ + +#ifndef GL_MESA_framebuffer_flip_y +#define GL_MESA_framebuffer_flip_y 1 +#define GL_FRAMEBUFFER_FLIP_Y_MESA 0x8BBB +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERPARAMETERIMESAPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVMESAPROC) (GLenum target, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferParameteriMESA (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glGetFramebufferParameterivMESA (GLenum target, GLenum pname, GLint *params); +#endif +#endif /* GL_MESA_framebuffer_flip_y */ + +#ifndef GL_MESA_framebuffer_swap_xy +#define GL_MESA_framebuffer_swap_xy 1 +#define GL_FRAMEBUFFER_SWAP_XY_MESA 0x8BBD +#endif /* GL_MESA_framebuffer_swap_xy */ + +#ifndef GL_MESA_program_binary_formats +#define GL_MESA_program_binary_formats 1 +#define GL_PROGRAM_BINARY_FORMAT_MESA 0x875F +#endif /* GL_MESA_program_binary_formats */ + +#ifndef GL_MESA_shader_integer_functions +#define GL_MESA_shader_integer_functions 1 +#endif /* GL_MESA_shader_integer_functions */ + +#ifndef GL_NVX_blend_equation_advanced_multi_draw_buffers +#define GL_NVX_blend_equation_advanced_multi_draw_buffers 1 +#endif /* GL_NVX_blend_equation_advanced_multi_draw_buffers */ + +#ifndef GL_NV_bindless_texture +#define GL_NV_bindless_texture 1 +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTUREHANDLENVPROC) (GLuint texture); +typedef GLuint64 (GL_APIENTRYP PFNGLGETTEXTURESAMPLERHANDLENVPROC) (GLuint texture, GLuint sampler); +typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef void (GL_APIENTRYP PFNGLMAKETEXTUREHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef GLuint64 (GL_APIENTRYP PFNGLGETIMAGEHANDLENVPROC) (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle, GLenum access); +typedef void (GL_APIENTRYP PFNGLMAKEIMAGEHANDLENONRESIDENTNVPROC) (GLuint64 handle); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64NVPROC) (GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLUNIFORMHANDLEUI64VNVPROC) (GLint location, GLsizei count, const GLuint64 *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64NVPROC) (GLuint program, GLint location, GLuint64 value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORMHANDLEUI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +typedef GLboolean (GL_APIENTRYP PFNGLISTEXTUREHANDLERESIDENTNVPROC) (GLuint64 handle); +typedef GLboolean (GL_APIENTRYP PFNGLISIMAGEHANDLERESIDENTNVPROC) (GLuint64 handle); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint64 GL_APIENTRY glGetTextureHandleNV (GLuint texture); +GL_APICALL GLuint64 GL_APIENTRY glGetTextureSamplerHandleNV (GLuint texture, GLuint sampler); +GL_APICALL void GL_APIENTRY glMakeTextureHandleResidentNV (GLuint64 handle); +GL_APICALL void GL_APIENTRY glMakeTextureHandleNonResidentNV (GLuint64 handle); +GL_APICALL GLuint64 GL_APIENTRY glGetImageHandleNV (GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum format); +GL_APICALL void GL_APIENTRY glMakeImageHandleResidentNV (GLuint64 handle, GLenum access); +GL_APICALL void GL_APIENTRY glMakeImageHandleNonResidentNV (GLuint64 handle); +GL_APICALL void GL_APIENTRY glUniformHandleui64NV (GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glUniformHandleui64vNV (GLint location, GLsizei count, const GLuint64 *value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64NV (GLuint program, GLint location, GLuint64 value); +GL_APICALL void GL_APIENTRY glProgramUniformHandleui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64 *values); +GL_APICALL GLboolean GL_APIENTRY glIsTextureHandleResidentNV (GLuint64 handle); +GL_APICALL GLboolean GL_APIENTRY glIsImageHandleResidentNV (GLuint64 handle); +#endif +#endif /* GL_NV_bindless_texture */ + +#ifndef GL_NV_blend_equation_advanced +#define GL_NV_blend_equation_advanced 1 +#define GL_BLEND_OVERLAP_NV 0x9281 +#define GL_BLEND_PREMULTIPLIED_SRC_NV 0x9280 +#define GL_BLUE_NV 0x1905 +#define GL_COLORBURN_NV 0x929A +#define GL_COLORDODGE_NV 0x9299 +#define GL_CONJOINT_NV 0x9284 +#define GL_CONTRAST_NV 0x92A1 +#define GL_DARKEN_NV 0x9297 +#define GL_DIFFERENCE_NV 0x929E +#define GL_DISJOINT_NV 0x9283 +#define GL_DST_ATOP_NV 0x928F +#define GL_DST_IN_NV 0x928B +#define GL_DST_NV 0x9287 +#define GL_DST_OUT_NV 0x928D +#define GL_DST_OVER_NV 0x9289 +#define GL_EXCLUSION_NV 0x92A0 +#define GL_GREEN_NV 0x1904 +#define GL_HARDLIGHT_NV 0x929B +#define GL_HARDMIX_NV 0x92A9 +#define GL_HSL_COLOR_NV 0x92AF +#define GL_HSL_HUE_NV 0x92AD +#define GL_HSL_LUMINOSITY_NV 0x92B0 +#define GL_HSL_SATURATION_NV 0x92AE +#define GL_INVERT_OVG_NV 0x92B4 +#define GL_INVERT_RGB_NV 0x92A3 +#define GL_LIGHTEN_NV 0x9298 +#define GL_LINEARBURN_NV 0x92A5 +#define GL_LINEARDODGE_NV 0x92A4 +#define GL_LINEARLIGHT_NV 0x92A7 +#define GL_MINUS_CLAMPED_NV 0x92B3 +#define GL_MINUS_NV 0x929F +#define GL_MULTIPLY_NV 0x9294 +#define GL_OVERLAY_NV 0x9296 +#define GL_PINLIGHT_NV 0x92A8 +#define GL_PLUS_CLAMPED_ALPHA_NV 0x92B2 +#define GL_PLUS_CLAMPED_NV 0x92B1 +#define GL_PLUS_DARKER_NV 0x9292 +#define GL_PLUS_NV 0x9291 +#define GL_RED_NV 0x1903 +#define GL_SCREEN_NV 0x9295 +#define GL_SOFTLIGHT_NV 0x929C +#define GL_SRC_ATOP_NV 0x928E +#define GL_SRC_IN_NV 0x928A +#define GL_SRC_NV 0x9286 +#define GL_SRC_OUT_NV 0x928C +#define GL_SRC_OVER_NV 0x9288 +#define GL_UNCORRELATED_NV 0x9282 +#define GL_VIVIDLIGHT_NV 0x92A6 +#define GL_XOR_NV 0x1506 +typedef void (GL_APIENTRYP PFNGLBLENDPARAMETERINVPROC) (GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLBLENDBARRIERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlendParameteriNV (GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glBlendBarrierNV (void); +#endif +#endif /* GL_NV_blend_equation_advanced */ + +#ifndef GL_NV_blend_equation_advanced_coherent +#define GL_NV_blend_equation_advanced_coherent 1 +#define GL_BLEND_ADVANCED_COHERENT_NV 0x9285 +#endif /* GL_NV_blend_equation_advanced_coherent */ + +#ifndef GL_NV_blend_minmax_factor +#define GL_NV_blend_minmax_factor 1 +#define GL_FACTOR_MIN_AMD 0x901C +#define GL_FACTOR_MAX_AMD 0x901D +#endif /* GL_NV_blend_minmax_factor */ + +#ifndef GL_NV_clip_space_w_scaling +#define GL_NV_clip_space_w_scaling 1 +#define GL_VIEWPORT_POSITION_W_SCALE_NV 0x937C +#define GL_VIEWPORT_POSITION_W_SCALE_X_COEFF_NV 0x937D +#define GL_VIEWPORT_POSITION_W_SCALE_Y_COEFF_NV 0x937E +typedef void (GL_APIENTRYP PFNGLVIEWPORTPOSITIONWSCALENVPROC) (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportPositionWScaleNV (GLuint index, GLfloat xcoeff, GLfloat ycoeff); +#endif +#endif /* GL_NV_clip_space_w_scaling */ + +#ifndef GL_NV_compute_shader_derivatives +#define GL_NV_compute_shader_derivatives 1 +#endif /* GL_NV_compute_shader_derivatives */ + +#ifndef GL_NV_conditional_render +#define GL_NV_conditional_render 1 +#define GL_QUERY_WAIT_NV 0x8E13 +#define GL_QUERY_NO_WAIT_NV 0x8E14 +#define GL_QUERY_BY_REGION_WAIT_NV 0x8E15 +#define GL_QUERY_BY_REGION_NO_WAIT_NV 0x8E16 +typedef void (GL_APIENTRYP PFNGLBEGINCONDITIONALRENDERNVPROC) (GLuint id, GLenum mode); +typedef void (GL_APIENTRYP PFNGLENDCONDITIONALRENDERNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBeginConditionalRenderNV (GLuint id, GLenum mode); +GL_APICALL void GL_APIENTRY glEndConditionalRenderNV (void); +#endif +#endif /* GL_NV_conditional_render */ + +#ifndef GL_NV_conservative_raster +#define GL_NV_conservative_raster 1 +#define GL_CONSERVATIVE_RASTERIZATION_NV 0x9346 +#define GL_SUBPIXEL_PRECISION_BIAS_X_BITS_NV 0x9347 +#define GL_SUBPIXEL_PRECISION_BIAS_Y_BITS_NV 0x9348 +#define GL_MAX_SUBPIXEL_PRECISION_BIAS_BITS_NV 0x9349 +typedef void (GL_APIENTRYP PFNGLSUBPIXELPRECISIONBIASNVPROC) (GLuint xbits, GLuint ybits); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glSubpixelPrecisionBiasNV (GLuint xbits, GLuint ybits); +#endif +#endif /* GL_NV_conservative_raster */ + +#ifndef GL_NV_conservative_raster_pre_snap +#define GL_NV_conservative_raster_pre_snap 1 +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_NV 0x9550 +#endif /* GL_NV_conservative_raster_pre_snap */ + +#ifndef GL_NV_conservative_raster_pre_snap_triangles +#define GL_NV_conservative_raster_pre_snap_triangles 1 +#define GL_CONSERVATIVE_RASTER_MODE_NV 0x954D +#define GL_CONSERVATIVE_RASTER_MODE_POST_SNAP_NV 0x954E +#define GL_CONSERVATIVE_RASTER_MODE_PRE_SNAP_TRIANGLES_NV 0x954F +typedef void (GL_APIENTRYP PFNGLCONSERVATIVERASTERPARAMETERINVPROC) (GLenum pname, GLint param); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glConservativeRasterParameteriNV (GLenum pname, GLint param); +#endif +#endif /* GL_NV_conservative_raster_pre_snap_triangles */ + +#ifndef GL_NV_copy_buffer +#define GL_NV_copy_buffer 1 +#define GL_COPY_READ_BUFFER_NV 0x8F36 +#define GL_COPY_WRITE_BUFFER_NV 0x8F37 +typedef void (GL_APIENTRYP PFNGLCOPYBUFFERSUBDATANVPROC) (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCopyBufferSubDataNV (GLenum readTarget, GLenum writeTarget, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size); +#endif +#endif /* GL_NV_copy_buffer */ + +#ifndef GL_NV_coverage_sample +#define GL_NV_coverage_sample 1 +#define GL_COVERAGE_COMPONENT_NV 0x8ED0 +#define GL_COVERAGE_COMPONENT4_NV 0x8ED1 +#define GL_COVERAGE_ATTACHMENT_NV 0x8ED2 +#define GL_COVERAGE_BUFFERS_NV 0x8ED3 +#define GL_COVERAGE_SAMPLES_NV 0x8ED4 +#define GL_COVERAGE_ALL_FRAGMENTS_NV 0x8ED5 +#define GL_COVERAGE_EDGE_FRAGMENTS_NV 0x8ED6 +#define GL_COVERAGE_AUTOMATIC_NV 0x8ED7 +#define GL_COVERAGE_BUFFER_BIT_NV 0x00008000 +typedef void (GL_APIENTRYP PFNGLCOVERAGEMASKNVPROC) (GLboolean mask); +typedef void (GL_APIENTRYP PFNGLCOVERAGEOPERATIONNVPROC) (GLenum operation); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageMaskNV (GLboolean mask); +GL_APICALL void GL_APIENTRY glCoverageOperationNV (GLenum operation); +#endif +#endif /* GL_NV_coverage_sample */ + +#ifndef GL_NV_depth_nonlinear +#define GL_NV_depth_nonlinear 1 +#define GL_DEPTH_COMPONENT16_NONLINEAR_NV 0x8E2C +#endif /* GL_NV_depth_nonlinear */ + +#ifndef GL_NV_draw_buffers +#define GL_NV_draw_buffers 1 +#define GL_MAX_DRAW_BUFFERS_NV 0x8824 +#define GL_DRAW_BUFFER0_NV 0x8825 +#define GL_DRAW_BUFFER1_NV 0x8826 +#define GL_DRAW_BUFFER2_NV 0x8827 +#define GL_DRAW_BUFFER3_NV 0x8828 +#define GL_DRAW_BUFFER4_NV 0x8829 +#define GL_DRAW_BUFFER5_NV 0x882A +#define GL_DRAW_BUFFER6_NV 0x882B +#define GL_DRAW_BUFFER7_NV 0x882C +#define GL_DRAW_BUFFER8_NV 0x882D +#define GL_DRAW_BUFFER9_NV 0x882E +#define GL_DRAW_BUFFER10_NV 0x882F +#define GL_DRAW_BUFFER11_NV 0x8830 +#define GL_DRAW_BUFFER12_NV 0x8831 +#define GL_DRAW_BUFFER13_NV 0x8832 +#define GL_DRAW_BUFFER14_NV 0x8833 +#define GL_DRAW_BUFFER15_NV 0x8834 +#define GL_COLOR_ATTACHMENT0_NV 0x8CE0 +#define GL_COLOR_ATTACHMENT1_NV 0x8CE1 +#define GL_COLOR_ATTACHMENT2_NV 0x8CE2 +#define GL_COLOR_ATTACHMENT3_NV 0x8CE3 +#define GL_COLOR_ATTACHMENT4_NV 0x8CE4 +#define GL_COLOR_ATTACHMENT5_NV 0x8CE5 +#define GL_COLOR_ATTACHMENT6_NV 0x8CE6 +#define GL_COLOR_ATTACHMENT7_NV 0x8CE7 +#define GL_COLOR_ATTACHMENT8_NV 0x8CE8 +#define GL_COLOR_ATTACHMENT9_NV 0x8CE9 +#define GL_COLOR_ATTACHMENT10_NV 0x8CEA +#define GL_COLOR_ATTACHMENT11_NV 0x8CEB +#define GL_COLOR_ATTACHMENT12_NV 0x8CEC +#define GL_COLOR_ATTACHMENT13_NV 0x8CED +#define GL_COLOR_ATTACHMENT14_NV 0x8CEE +#define GL_COLOR_ATTACHMENT15_NV 0x8CEF +typedef void (GL_APIENTRYP PFNGLDRAWBUFFERSNVPROC) (GLsizei n, const GLenum *bufs); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawBuffersNV (GLsizei n, const GLenum *bufs); +#endif +#endif /* GL_NV_draw_buffers */ + +#ifndef GL_NV_draw_instanced +#define GL_NV_draw_instanced 1 +typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDNVPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDNVPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawArraysInstancedNV (GLenum mode, GLint first, GLsizei count, GLsizei primcount); +GL_APICALL void GL_APIENTRY glDrawElementsInstancedNV (GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei primcount); +#endif +#endif /* GL_NV_draw_instanced */ + +#ifndef GL_NV_draw_vulkan_image +#define GL_NV_draw_vulkan_image 1 +typedef void (GL_APIENTRY *GLVULKANPROCNV)(void); +typedef void (GL_APIENTRYP PFNGLDRAWVKIMAGENVPROC) (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +typedef GLVULKANPROCNV (GL_APIENTRYP PFNGLGETVKPROCADDRNVPROC) (const GLchar *name); +typedef void (GL_APIENTRYP PFNGLWAITVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GL_APIENTRYP PFNGLSIGNALVKSEMAPHORENVPROC) (GLuint64 vkSemaphore); +typedef void (GL_APIENTRYP PFNGLSIGNALVKFENCENVPROC) (GLuint64 vkFence); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawVkImageNV (GLuint64 vkImage, GLuint sampler, GLfloat x0, GLfloat y0, GLfloat x1, GLfloat y1, GLfloat z, GLfloat s0, GLfloat t0, GLfloat s1, GLfloat t1); +GL_APICALL GLVULKANPROCNV GL_APIENTRY glGetVkProcAddrNV (const GLchar *name); +GL_APICALL void GL_APIENTRY glWaitVkSemaphoreNV (GLuint64 vkSemaphore); +GL_APICALL void GL_APIENTRY glSignalVkSemaphoreNV (GLuint64 vkSemaphore); +GL_APICALL void GL_APIENTRY glSignalVkFenceNV (GLuint64 vkFence); +#endif +#endif /* GL_NV_draw_vulkan_image */ + +#ifndef GL_NV_explicit_attrib_location +#define GL_NV_explicit_attrib_location 1 +#endif /* GL_NV_explicit_attrib_location */ + +#ifndef GL_NV_fbo_color_attachments +#define GL_NV_fbo_color_attachments 1 +#define GL_MAX_COLOR_ATTACHMENTS_NV 0x8CDF +#endif /* GL_NV_fbo_color_attachments */ + +#ifndef GL_NV_fence +#define GL_NV_fence 1 +#define GL_ALL_COMPLETED_NV 0x84F2 +#define GL_FENCE_STATUS_NV 0x84F3 +#define GL_FENCE_CONDITION_NV 0x84F4 +typedef void (GL_APIENTRYP PFNGLDELETEFENCESNVPROC) (GLsizei n, const GLuint *fences); +typedef void (GL_APIENTRYP PFNGLGENFENCESNVPROC) (GLsizei n, GLuint *fences); +typedef GLboolean (GL_APIENTRYP PFNGLISFENCENVPROC) (GLuint fence); +typedef GLboolean (GL_APIENTRYP PFNGLTESTFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLGETFENCEIVNVPROC) (GLuint fence, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLFINISHFENCENVPROC) (GLuint fence); +typedef void (GL_APIENTRYP PFNGLSETFENCENVPROC) (GLuint fence, GLenum condition); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDeleteFencesNV (GLsizei n, const GLuint *fences); +GL_APICALL void GL_APIENTRY glGenFencesNV (GLsizei n, GLuint *fences); +GL_APICALL GLboolean GL_APIENTRY glIsFenceNV (GLuint fence); +GL_APICALL GLboolean GL_APIENTRY glTestFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glGetFenceivNV (GLuint fence, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glFinishFenceNV (GLuint fence); +GL_APICALL void GL_APIENTRY glSetFenceNV (GLuint fence, GLenum condition); +#endif +#endif /* GL_NV_fence */ + +#ifndef GL_NV_fill_rectangle +#define GL_NV_fill_rectangle 1 +#define GL_FILL_RECTANGLE_NV 0x933C +#endif /* GL_NV_fill_rectangle */ + +#ifndef GL_NV_fragment_coverage_to_color +#define GL_NV_fragment_coverage_to_color 1 +#define GL_FRAGMENT_COVERAGE_TO_COLOR_NV 0x92DD +#define GL_FRAGMENT_COVERAGE_COLOR_NV 0x92DE +typedef void (GL_APIENTRYP PFNGLFRAGMENTCOVERAGECOLORNVPROC) (GLuint color); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFragmentCoverageColorNV (GLuint color); +#endif +#endif /* GL_NV_fragment_coverage_to_color */ + +#ifndef GL_NV_fragment_shader_barycentric +#define GL_NV_fragment_shader_barycentric 1 +#endif /* GL_NV_fragment_shader_barycentric */ + +#ifndef GL_NV_fragment_shader_interlock +#define GL_NV_fragment_shader_interlock 1 +#endif /* GL_NV_fragment_shader_interlock */ + +#ifndef GL_NV_framebuffer_blit +#define GL_NV_framebuffer_blit 1 +#define GL_READ_FRAMEBUFFER_NV 0x8CA8 +#define GL_DRAW_FRAMEBUFFER_NV 0x8CA9 +#define GL_DRAW_FRAMEBUFFER_BINDING_NV 0x8CA6 +#define GL_READ_FRAMEBUFFER_BINDING_NV 0x8CAA +typedef void (GL_APIENTRYP PFNGLBLITFRAMEBUFFERNVPROC) (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBlitFramebufferNV (GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); +#endif +#endif /* GL_NV_framebuffer_blit */ + +#ifndef GL_NV_framebuffer_mixed_samples +#define GL_NV_framebuffer_mixed_samples 1 +#define GL_COVERAGE_MODULATION_TABLE_NV 0x9331 +#define GL_COLOR_SAMPLES_NV 0x8E20 +#define GL_DEPTH_SAMPLES_NV 0x932D +#define GL_STENCIL_SAMPLES_NV 0x932E +#define GL_MIXED_DEPTH_SAMPLES_SUPPORTED_NV 0x932F +#define GL_MIXED_STENCIL_SAMPLES_SUPPORTED_NV 0x9330 +#define GL_COVERAGE_MODULATION_NV 0x9332 +#define GL_COVERAGE_MODULATION_TABLE_SIZE_NV 0x9333 +typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONTABLENVPROC) (GLsizei n, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLGETCOVERAGEMODULATIONTABLENVPROC) (GLsizei bufSize, GLfloat *v); +typedef void (GL_APIENTRYP PFNGLCOVERAGEMODULATIONNVPROC) (GLenum components); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCoverageModulationTableNV (GLsizei n, const GLfloat *v); +GL_APICALL void GL_APIENTRY glGetCoverageModulationTableNV (GLsizei bufSize, GLfloat *v); +GL_APICALL void GL_APIENTRY glCoverageModulationNV (GLenum components); +#endif +#endif /* GL_NV_framebuffer_mixed_samples */ + +#ifndef GL_NV_framebuffer_multisample +#define GL_NV_framebuffer_multisample 1 +#define GL_RENDERBUFFER_SAMPLES_NV 0x8CAB +#define GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_NV 0x8D56 +#define GL_MAX_SAMPLES_NV 0x8D57 +typedef void (GL_APIENTRYP PFNGLRENDERBUFFERSTORAGEMULTISAMPLENVPROC) (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glRenderbufferStorageMultisampleNV (GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height); +#endif +#endif /* GL_NV_framebuffer_multisample */ + +#ifndef GL_NV_generate_mipmap_sRGB +#define GL_NV_generate_mipmap_sRGB 1 +#endif /* GL_NV_generate_mipmap_sRGB */ + +#ifndef GL_NV_geometry_shader_passthrough +#define GL_NV_geometry_shader_passthrough 1 +#endif /* GL_NV_geometry_shader_passthrough */ + +#ifndef GL_NV_gpu_shader5 +#define GL_NV_gpu_shader5 1 +typedef khronos_int64_t GLint64EXT; +typedef khronos_uint64_t GLuint64EXT; +#define GL_INT64_NV 0x140E +#define GL_UNSIGNED_INT64_NV 0x140F +#define GL_INT8_NV 0x8FE0 +#define GL_INT8_VEC2_NV 0x8FE1 +#define GL_INT8_VEC3_NV 0x8FE2 +#define GL_INT8_VEC4_NV 0x8FE3 +#define GL_INT16_NV 0x8FE4 +#define GL_INT16_VEC2_NV 0x8FE5 +#define GL_INT16_VEC3_NV 0x8FE6 +#define GL_INT16_VEC4_NV 0x8FE7 +#define GL_INT64_VEC2_NV 0x8FE9 +#define GL_INT64_VEC3_NV 0x8FEA +#define GL_INT64_VEC4_NV 0x8FEB +#define GL_UNSIGNED_INT8_NV 0x8FEC +#define GL_UNSIGNED_INT8_VEC2_NV 0x8FED +#define GL_UNSIGNED_INT8_VEC3_NV 0x8FEE +#define GL_UNSIGNED_INT8_VEC4_NV 0x8FEF +#define GL_UNSIGNED_INT16_NV 0x8FF0 +#define GL_UNSIGNED_INT16_VEC2_NV 0x8FF1 +#define GL_UNSIGNED_INT16_VEC3_NV 0x8FF2 +#define GL_UNSIGNED_INT16_VEC4_NV 0x8FF3 +#define GL_UNSIGNED_INT64_VEC2_NV 0x8FF5 +#define GL_UNSIGNED_INT64_VEC3_NV 0x8FF6 +#define GL_UNSIGNED_INT64_VEC4_NV 0x8FF7 +#define GL_FLOAT16_NV 0x8FF8 +#define GL_FLOAT16_VEC2_NV 0x8FF9 +#define GL_FLOAT16_VEC3_NV 0x8FFA +#define GL_FLOAT16_VEC4_NV 0x8FFB +#define GL_PATCHES 0x000E +typedef void (GL_APIENTRYP PFNGLUNIFORM1I64NVPROC) (GLint location, GLint64EXT x); +typedef void (GL_APIENTRYP PFNGLUNIFORM2I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GL_APIENTRYP PFNGLUNIFORM3I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GL_APIENTRYP PFNGLUNIFORM4I64NVPROC) (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GL_APIENTRYP PFNGLUNIFORM1I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4I64VNVPROC) (GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64NVPROC) (GLint location, GLuint64EXT x); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64NVPROC) (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GL_APIENTRYP PFNGLUNIFORM1UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM2UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM3UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLUNIFORM4UI64VNVPROC) (GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLGETUNIFORMI64VNVPROC) (GLuint program, GLint location, GLint64EXT *params); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64NVPROC) (GLuint program, GLint location, GLint64EXT x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64NVPROC) (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4I64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64NVPROC) (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM1UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM2UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM3UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +typedef void (GL_APIENTRYP PFNGLPROGRAMUNIFORM4UI64VNVPROC) (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUniform1i64NV (GLint location, GLint64EXT x); +GL_APICALL void GL_APIENTRY glUniform2i64NV (GLint location, GLint64EXT x, GLint64EXT y); +GL_APICALL void GL_APIENTRY glUniform3i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GL_APICALL void GL_APIENTRY glUniform4i64NV (GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GL_APICALL void GL_APIENTRY glUniform1i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform2i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform3i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform4i64vNV (GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform1ui64NV (GLint location, GLuint64EXT x); +GL_APICALL void GL_APIENTRY glUniform2ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y); +GL_APICALL void GL_APIENTRY glUniform3ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GL_APICALL void GL_APIENTRY glUniform4ui64NV (GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GL_APICALL void GL_APIENTRY glUniform1ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform2ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform3ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glUniform4ui64vNV (GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glGetUniformi64vNV (GLuint program, GLint location, GLint64EXT *params); +GL_APICALL void GL_APIENTRY glProgramUniform1i64NV (GLuint program, GLint location, GLint64EXT x); +GL_APICALL void GL_APIENTRY glProgramUniform2i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y); +GL_APICALL void GL_APIENTRY glProgramUniform3i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z); +GL_APICALL void GL_APIENTRY glProgramUniform4i64NV (GLuint program, GLint location, GLint64EXT x, GLint64EXT y, GLint64EXT z, GLint64EXT w); +GL_APICALL void GL_APIENTRY glProgramUniform1i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform2i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform3i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform4i64vNV (GLuint program, GLint location, GLsizei count, const GLint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform1ui64NV (GLuint program, GLint location, GLuint64EXT x); +GL_APICALL void GL_APIENTRY glProgramUniform2ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y); +GL_APICALL void GL_APIENTRY glProgramUniform3ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z); +GL_APICALL void GL_APIENTRY glProgramUniform4ui64NV (GLuint program, GLint location, GLuint64EXT x, GLuint64EXT y, GLuint64EXT z, GLuint64EXT w); +GL_APICALL void GL_APIENTRY glProgramUniform1ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform2ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform3ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +GL_APICALL void GL_APIENTRY glProgramUniform4ui64vNV (GLuint program, GLint location, GLsizei count, const GLuint64EXT *value); +#endif +#endif /* GL_NV_gpu_shader5 */ + +#ifndef GL_NV_image_formats +#define GL_NV_image_formats 1 +#endif /* GL_NV_image_formats */ + +#ifndef GL_NV_instanced_arrays +#define GL_NV_instanced_arrays 1 +#define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE +typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORNVPROC) (GLuint index, GLuint divisor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glVertexAttribDivisorNV (GLuint index, GLuint divisor); +#endif +#endif /* GL_NV_instanced_arrays */ + +#ifndef GL_NV_internalformat_sample_query +#define GL_NV_internalformat_sample_query 1 +#define GL_TEXTURE_2D_MULTISAMPLE 0x9100 +#define GL_TEXTURE_2D_MULTISAMPLE_ARRAY 0x9102 +#define GL_MULTISAMPLES_NV 0x9371 +#define GL_SUPERSAMPLE_SCALE_X_NV 0x9372 +#define GL_SUPERSAMPLE_SCALE_Y_NV 0x9373 +#define GL_CONFORMANT_NV 0x9374 +typedef void (GL_APIENTRYP PFNGLGETINTERNALFORMATSAMPLEIVNVPROC) (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetInternalformatSampleivNV (GLenum target, GLenum internalformat, GLsizei samples, GLenum pname, GLsizei count, GLint *params); +#endif +#endif /* GL_NV_internalformat_sample_query */ + +#ifndef GL_NV_memory_attachment +#define GL_NV_memory_attachment 1 +#define GL_ATTACHED_MEMORY_OBJECT_NV 0x95A4 +#define GL_ATTACHED_MEMORY_OFFSET_NV 0x95A5 +#define GL_MEMORY_ATTACHABLE_ALIGNMENT_NV 0x95A6 +#define GL_MEMORY_ATTACHABLE_SIZE_NV 0x95A7 +#define GL_MEMORY_ATTACHABLE_NV 0x95A8 +#define GL_DETACHED_MEMORY_INCARNATION_NV 0x95A9 +#define GL_DETACHED_TEXTURES_NV 0x95AA +#define GL_DETACHED_BUFFERS_NV 0x95AB +#define GL_MAX_DETACHED_TEXTURES_NV 0x95AC +#define GL_MAX_DETACHED_BUFFERS_NV 0x95AD +typedef void (GL_APIENTRYP PFNGLGETMEMORYOBJECTDETACHEDRESOURCESUIVNVPROC) (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +typedef void (GL_APIENTRYP PFNGLRESETMEMORYOBJECTPARAMETERNVPROC) (GLuint memory, GLenum pname); +typedef void (GL_APIENTRYP PFNGLTEXATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLBUFFERATTACHMEMORYNVPROC) (GLenum target, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLTEXTUREATTACHMEMORYNVPROC) (GLuint texture, GLuint memory, GLuint64 offset); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERATTACHMEMORYNVPROC) (GLuint buffer, GLuint memory, GLuint64 offset); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetMemoryObjectDetachedResourcesuivNV (GLuint memory, GLenum pname, GLint first, GLsizei count, GLuint *params); +GL_APICALL void GL_APIENTRY glResetMemoryObjectParameterNV (GLuint memory, GLenum pname); +GL_APICALL void GL_APIENTRY glTexAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glBufferAttachMemoryNV (GLenum target, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glTextureAttachMemoryNV (GLuint texture, GLuint memory, GLuint64 offset); +GL_APICALL void GL_APIENTRY glNamedBufferAttachMemoryNV (GLuint buffer, GLuint memory, GLuint64 offset); +#endif +#endif /* GL_NV_memory_attachment */ + +#ifndef GL_NV_memory_object_sparse +#define GL_NV_memory_object_sparse 1 +typedef void (GL_APIENTRYP PFNGLBUFFERPAGECOMMITMENTMEMNVPROC) (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLTEXPAGECOMMITMENTMEMNVPROC) (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLNAMEDBUFFERPAGECOMMITMENTMEMNVPROC) (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +typedef void (GL_APIENTRYP PFNGLTEXTUREPAGECOMMITMENTMEMNVPROC) (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBufferPageCommitmentMemNV (GLenum target, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GL_APICALL void GL_APIENTRY glTexPageCommitmentMemNV (GLenum target, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +GL_APICALL void GL_APIENTRY glNamedBufferPageCommitmentMemNV (GLuint buffer, GLintptr offset, GLsizeiptr size, GLuint memory, GLuint64 memOffset, GLboolean commit); +GL_APICALL void GL_APIENTRY glTexturePageCommitmentMemNV (GLuint texture, GLint layer, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLuint memory, GLuint64 offset, GLboolean commit); +#endif +#endif /* GL_NV_memory_object_sparse */ + +#ifndef GL_NV_mesh_shader +#define GL_NV_mesh_shader 1 +#define GL_MESH_SHADER_NV 0x9559 +#define GL_TASK_SHADER_NV 0x955A +#define GL_MAX_MESH_UNIFORM_BLOCKS_NV 0x8E60 +#define GL_MAX_MESH_TEXTURE_IMAGE_UNITS_NV 0x8E61 +#define GL_MAX_MESH_IMAGE_UNIFORMS_NV 0x8E62 +#define GL_MAX_MESH_UNIFORM_COMPONENTS_NV 0x8E63 +#define GL_MAX_MESH_ATOMIC_COUNTER_BUFFERS_NV 0x8E64 +#define GL_MAX_MESH_ATOMIC_COUNTERS_NV 0x8E65 +#define GL_MAX_MESH_SHADER_STORAGE_BLOCKS_NV 0x8E66 +#define GL_MAX_COMBINED_MESH_UNIFORM_COMPONENTS_NV 0x8E67 +#define GL_MAX_TASK_UNIFORM_BLOCKS_NV 0x8E68 +#define GL_MAX_TASK_TEXTURE_IMAGE_UNITS_NV 0x8E69 +#define GL_MAX_TASK_IMAGE_UNIFORMS_NV 0x8E6A +#define GL_MAX_TASK_UNIFORM_COMPONENTS_NV 0x8E6B +#define GL_MAX_TASK_ATOMIC_COUNTER_BUFFERS_NV 0x8E6C +#define GL_MAX_TASK_ATOMIC_COUNTERS_NV 0x8E6D +#define GL_MAX_TASK_SHADER_STORAGE_BLOCKS_NV 0x8E6E +#define GL_MAX_COMBINED_TASK_UNIFORM_COMPONENTS_NV 0x8E6F +#define GL_MAX_MESH_WORK_GROUP_INVOCATIONS_NV 0x95A2 +#define GL_MAX_TASK_WORK_GROUP_INVOCATIONS_NV 0x95A3 +#define GL_MAX_MESH_TOTAL_MEMORY_SIZE_NV 0x9536 +#define GL_MAX_TASK_TOTAL_MEMORY_SIZE_NV 0x9537 +#define GL_MAX_MESH_OUTPUT_VERTICES_NV 0x9538 +#define GL_MAX_MESH_OUTPUT_PRIMITIVES_NV 0x9539 +#define GL_MAX_TASK_OUTPUT_COUNT_NV 0x953A +#define GL_MAX_DRAW_MESH_TASKS_COUNT_NV 0x953D +#define GL_MAX_MESH_VIEWS_NV 0x9557 +#define GL_MESH_OUTPUT_PER_VERTEX_GRANULARITY_NV 0x92DF +#define GL_MESH_OUTPUT_PER_PRIMITIVE_GRANULARITY_NV 0x9543 +#define GL_MAX_MESH_WORK_GROUP_SIZE_NV 0x953B +#define GL_MAX_TASK_WORK_GROUP_SIZE_NV 0x953C +#define GL_MESH_WORK_GROUP_SIZE_NV 0x953E +#define GL_TASK_WORK_GROUP_SIZE_NV 0x953F +#define GL_MESH_VERTICES_OUT_NV 0x9579 +#define GL_MESH_PRIMITIVES_OUT_NV 0x957A +#define GL_MESH_OUTPUT_TYPE_NV 0x957B +#define GL_UNIFORM_BLOCK_REFERENCED_BY_MESH_SHADER_NV 0x959C +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TASK_SHADER_NV 0x959D +#define GL_REFERENCED_BY_MESH_SHADER_NV 0x95A0 +#define GL_REFERENCED_BY_TASK_SHADER_NV 0x95A1 +#define GL_MESH_SHADER_BIT_NV 0x00000040 +#define GL_TASK_SHADER_BIT_NV 0x00000080 +#define GL_MESH_SUBROUTINE_NV 0x957C +#define GL_TASK_SUBROUTINE_NV 0x957D +#define GL_MESH_SUBROUTINE_UNIFORM_NV 0x957E +#define GL_TASK_SUBROUTINE_UNIFORM_NV 0x957F +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_MESH_SHADER_NV 0x959E +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TASK_SHADER_NV 0x959F +typedef void (GL_APIENTRYP PFNGLDRAWMESHTASKSNVPROC) (GLuint first, GLuint count); +typedef void (GL_APIENTRYP PFNGLDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTNVPROC) (GLintptr indirect, GLsizei drawcount, GLsizei stride); +typedef void (GL_APIENTRYP PFNGLMULTIDRAWMESHTASKSINDIRECTCOUNTNVPROC) (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glDrawMeshTasksNV (GLuint first, GLuint count); +GL_APICALL void GL_APIENTRY glDrawMeshTasksIndirectNV (GLintptr indirect); +GL_APICALL void GL_APIENTRY glMultiDrawMeshTasksIndirectNV (GLintptr indirect, GLsizei drawcount, GLsizei stride); +GL_APICALL void GL_APIENTRY glMultiDrawMeshTasksIndirectCountNV (GLintptr indirect, GLintptr drawcount, GLsizei maxdrawcount, GLsizei stride); +#endif +#endif /* GL_NV_mesh_shader */ + +#ifndef GL_NV_non_square_matrices +#define GL_NV_non_square_matrices 1 +#define GL_FLOAT_MAT2x3_NV 0x8B65 +#define GL_FLOAT_MAT2x4_NV 0x8B66 +#define GL_FLOAT_MAT3x2_NV 0x8B67 +#define GL_FLOAT_MAT3x4_NV 0x8B68 +#define GL_FLOAT_MAT4x2_NV 0x8B69 +#define GL_FLOAT_MAT4x3_NV 0x8B6A +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX2X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X2FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX3X4FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLUNIFORMMATRIX4X3FVNVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glUniformMatrix2x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix2x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4x2fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix3x4fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GL_APICALL void GL_APIENTRY glUniformMatrix4x3fvNV (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif +#endif /* GL_NV_non_square_matrices */ + +#ifndef GL_NV_path_rendering +#define GL_NV_path_rendering 1 +typedef double GLdouble; +#define GL_PATH_FORMAT_SVG_NV 0x9070 +#define GL_PATH_FORMAT_PS_NV 0x9071 +#define GL_STANDARD_FONT_NAME_NV 0x9072 +#define GL_SYSTEM_FONT_NAME_NV 0x9073 +#define GL_FILE_NAME_NV 0x9074 +#define GL_PATH_STROKE_WIDTH_NV 0x9075 +#define GL_PATH_END_CAPS_NV 0x9076 +#define GL_PATH_INITIAL_END_CAP_NV 0x9077 +#define GL_PATH_TERMINAL_END_CAP_NV 0x9078 +#define GL_PATH_JOIN_STYLE_NV 0x9079 +#define GL_PATH_MITER_LIMIT_NV 0x907A +#define GL_PATH_DASH_CAPS_NV 0x907B +#define GL_PATH_INITIAL_DASH_CAP_NV 0x907C +#define GL_PATH_TERMINAL_DASH_CAP_NV 0x907D +#define GL_PATH_DASH_OFFSET_NV 0x907E +#define GL_PATH_CLIENT_LENGTH_NV 0x907F +#define GL_PATH_FILL_MODE_NV 0x9080 +#define GL_PATH_FILL_MASK_NV 0x9081 +#define GL_PATH_FILL_COVER_MODE_NV 0x9082 +#define GL_PATH_STROKE_COVER_MODE_NV 0x9083 +#define GL_PATH_STROKE_MASK_NV 0x9084 +#define GL_COUNT_UP_NV 0x9088 +#define GL_COUNT_DOWN_NV 0x9089 +#define GL_PATH_OBJECT_BOUNDING_BOX_NV 0x908A +#define GL_CONVEX_HULL_NV 0x908B +#define GL_BOUNDING_BOX_NV 0x908D +#define GL_TRANSLATE_X_NV 0x908E +#define GL_TRANSLATE_Y_NV 0x908F +#define GL_TRANSLATE_2D_NV 0x9090 +#define GL_TRANSLATE_3D_NV 0x9091 +#define GL_AFFINE_2D_NV 0x9092 +#define GL_AFFINE_3D_NV 0x9094 +#define GL_TRANSPOSE_AFFINE_2D_NV 0x9096 +#define GL_TRANSPOSE_AFFINE_3D_NV 0x9098 +#define GL_UTF8_NV 0x909A +#define GL_UTF16_NV 0x909B +#define GL_BOUNDING_BOX_OF_BOUNDING_BOXES_NV 0x909C +#define GL_PATH_COMMAND_COUNT_NV 0x909D +#define GL_PATH_COORD_COUNT_NV 0x909E +#define GL_PATH_DASH_ARRAY_COUNT_NV 0x909F +#define GL_PATH_COMPUTED_LENGTH_NV 0x90A0 +#define GL_PATH_FILL_BOUNDING_BOX_NV 0x90A1 +#define GL_PATH_STROKE_BOUNDING_BOX_NV 0x90A2 +#define GL_SQUARE_NV 0x90A3 +#define GL_ROUND_NV 0x90A4 +#define GL_TRIANGULAR_NV 0x90A5 +#define GL_BEVEL_NV 0x90A6 +#define GL_MITER_REVERT_NV 0x90A7 +#define GL_MITER_TRUNCATE_NV 0x90A8 +#define GL_SKIP_MISSING_GLYPH_NV 0x90A9 +#define GL_USE_MISSING_GLYPH_NV 0x90AA +#define GL_PATH_ERROR_POSITION_NV 0x90AB +#define GL_ACCUM_ADJACENT_PAIRS_NV 0x90AD +#define GL_ADJACENT_PAIRS_NV 0x90AE +#define GL_FIRST_TO_REST_NV 0x90AF +#define GL_PATH_GEN_MODE_NV 0x90B0 +#define GL_PATH_GEN_COEFF_NV 0x90B1 +#define GL_PATH_GEN_COMPONENTS_NV 0x90B3 +#define GL_PATH_STENCIL_FUNC_NV 0x90B7 +#define GL_PATH_STENCIL_REF_NV 0x90B8 +#define GL_PATH_STENCIL_VALUE_MASK_NV 0x90B9 +#define GL_PATH_STENCIL_DEPTH_OFFSET_FACTOR_NV 0x90BD +#define GL_PATH_STENCIL_DEPTH_OFFSET_UNITS_NV 0x90BE +#define GL_PATH_COVER_DEPTH_FUNC_NV 0x90BF +#define GL_PATH_DASH_OFFSET_RESET_NV 0x90B4 +#define GL_MOVE_TO_RESETS_NV 0x90B5 +#define GL_MOVE_TO_CONTINUES_NV 0x90B6 +#define GL_CLOSE_PATH_NV 0x00 +#define GL_MOVE_TO_NV 0x02 +#define GL_RELATIVE_MOVE_TO_NV 0x03 +#define GL_LINE_TO_NV 0x04 +#define GL_RELATIVE_LINE_TO_NV 0x05 +#define GL_HORIZONTAL_LINE_TO_NV 0x06 +#define GL_RELATIVE_HORIZONTAL_LINE_TO_NV 0x07 +#define GL_VERTICAL_LINE_TO_NV 0x08 +#define GL_RELATIVE_VERTICAL_LINE_TO_NV 0x09 +#define GL_QUADRATIC_CURVE_TO_NV 0x0A +#define GL_RELATIVE_QUADRATIC_CURVE_TO_NV 0x0B +#define GL_CUBIC_CURVE_TO_NV 0x0C +#define GL_RELATIVE_CUBIC_CURVE_TO_NV 0x0D +#define GL_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0E +#define GL_RELATIVE_SMOOTH_QUADRATIC_CURVE_TO_NV 0x0F +#define GL_SMOOTH_CUBIC_CURVE_TO_NV 0x10 +#define GL_RELATIVE_SMOOTH_CUBIC_CURVE_TO_NV 0x11 +#define GL_SMALL_CCW_ARC_TO_NV 0x12 +#define GL_RELATIVE_SMALL_CCW_ARC_TO_NV 0x13 +#define GL_SMALL_CW_ARC_TO_NV 0x14 +#define GL_RELATIVE_SMALL_CW_ARC_TO_NV 0x15 +#define GL_LARGE_CCW_ARC_TO_NV 0x16 +#define GL_RELATIVE_LARGE_CCW_ARC_TO_NV 0x17 +#define GL_LARGE_CW_ARC_TO_NV 0x18 +#define GL_RELATIVE_LARGE_CW_ARC_TO_NV 0x19 +#define GL_RESTART_PATH_NV 0xF0 +#define GL_DUP_FIRST_CUBIC_CURVE_TO_NV 0xF2 +#define GL_DUP_LAST_CUBIC_CURVE_TO_NV 0xF4 +#define GL_RECT_NV 0xF6 +#define GL_CIRCULAR_CCW_ARC_TO_NV 0xF8 +#define GL_CIRCULAR_CW_ARC_TO_NV 0xFA +#define GL_CIRCULAR_TANGENT_ARC_TO_NV 0xFC +#define GL_ARC_TO_NV 0xFE +#define GL_RELATIVE_ARC_TO_NV 0xFF +#define GL_BOLD_BIT_NV 0x01 +#define GL_ITALIC_BIT_NV 0x02 +#define GL_GLYPH_WIDTH_BIT_NV 0x01 +#define GL_GLYPH_HEIGHT_BIT_NV 0x02 +#define GL_GLYPH_HORIZONTAL_BEARING_X_BIT_NV 0x04 +#define GL_GLYPH_HORIZONTAL_BEARING_Y_BIT_NV 0x08 +#define GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV 0x10 +#define GL_GLYPH_VERTICAL_BEARING_X_BIT_NV 0x20 +#define GL_GLYPH_VERTICAL_BEARING_Y_BIT_NV 0x40 +#define GL_GLYPH_VERTICAL_BEARING_ADVANCE_BIT_NV 0x80 +#define GL_GLYPH_HAS_KERNING_BIT_NV 0x100 +#define GL_FONT_X_MIN_BOUNDS_BIT_NV 0x00010000 +#define GL_FONT_Y_MIN_BOUNDS_BIT_NV 0x00020000 +#define GL_FONT_X_MAX_BOUNDS_BIT_NV 0x00040000 +#define GL_FONT_Y_MAX_BOUNDS_BIT_NV 0x00080000 +#define GL_FONT_UNITS_PER_EM_BIT_NV 0x00100000 +#define GL_FONT_ASCENDER_BIT_NV 0x00200000 +#define GL_FONT_DESCENDER_BIT_NV 0x00400000 +#define GL_FONT_HEIGHT_BIT_NV 0x00800000 +#define GL_FONT_MAX_ADVANCE_WIDTH_BIT_NV 0x01000000 +#define GL_FONT_MAX_ADVANCE_HEIGHT_BIT_NV 0x02000000 +#define GL_FONT_UNDERLINE_POSITION_BIT_NV 0x04000000 +#define GL_FONT_UNDERLINE_THICKNESS_BIT_NV 0x08000000 +#define GL_FONT_HAS_KERNING_BIT_NV 0x10000000 +#define GL_ROUNDED_RECT_NV 0xE8 +#define GL_RELATIVE_ROUNDED_RECT_NV 0xE9 +#define GL_ROUNDED_RECT2_NV 0xEA +#define GL_RELATIVE_ROUNDED_RECT2_NV 0xEB +#define GL_ROUNDED_RECT4_NV 0xEC +#define GL_RELATIVE_ROUNDED_RECT4_NV 0xED +#define GL_ROUNDED_RECT8_NV 0xEE +#define GL_RELATIVE_ROUNDED_RECT8_NV 0xEF +#define GL_RELATIVE_RECT_NV 0xF7 +#define GL_FONT_GLYPHS_AVAILABLE_NV 0x9368 +#define GL_FONT_TARGET_UNAVAILABLE_NV 0x9369 +#define GL_FONT_UNAVAILABLE_NV 0x936A +#define GL_FONT_UNINTELLIGIBLE_NV 0x936B +#define GL_CONIC_CURVE_TO_NV 0x1A +#define GL_RELATIVE_CONIC_CURVE_TO_NV 0x1B +#define GL_FONT_NUM_GLYPH_INDICES_BIT_NV 0x20000000 +#define GL_STANDARD_FONT_FORMAT_NV 0x936C +#define GL_PATH_PROJECTION_NV 0x1701 +#define GL_PATH_MODELVIEW_NV 0x1700 +#define GL_PATH_MODELVIEW_STACK_DEPTH_NV 0x0BA3 +#define GL_PATH_MODELVIEW_MATRIX_NV 0x0BA6 +#define GL_PATH_MAX_MODELVIEW_STACK_DEPTH_NV 0x0D36 +#define GL_PATH_TRANSPOSE_MODELVIEW_MATRIX_NV 0x84E3 +#define GL_PATH_PROJECTION_STACK_DEPTH_NV 0x0BA4 +#define GL_PATH_PROJECTION_MATRIX_NV 0x0BA7 +#define GL_PATH_MAX_PROJECTION_STACK_DEPTH_NV 0x0D38 +#define GL_PATH_TRANSPOSE_PROJECTION_MATRIX_NV 0x84E4 +#define GL_FRAGMENT_INPUT_NV 0x936D +typedef GLuint (GL_APIENTRYP PFNGLGENPATHSNVPROC) (GLsizei range); +typedef void (GL_APIENTRYP PFNGLDELETEPATHSNVPROC) (GLuint path, GLsizei range); +typedef GLboolean (GL_APIENTRYP PFNGLISPATHNVPROC) (GLuint path); +typedef void (GL_APIENTRYP PFNGLPATHCOMMANDSNVPROC) (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHCOORDSNVPROC) (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSUBCOMMANDSNVPROC) (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSUBCOORDSNVPROC) (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +typedef void (GL_APIENTRYP PFNGLPATHSTRINGNVPROC) (GLuint path, GLenum format, GLsizei length, const void *pathString); +typedef void (GL_APIENTRYP PFNGLPATHGLYPHSNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLPATHGLYPHRANGENVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLWEIGHTPATHSNVPROC) (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +typedef void (GL_APIENTRYP PFNGLCOPYPATHNVPROC) (GLuint resultPath, GLuint srcPath); +typedef void (GL_APIENTRYP PFNGLINTERPOLATEPATHSNVPROC) (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +typedef void (GL_APIENTRYP PFNGLTRANSFORMPATHNVPROC) (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, const GLint *value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERINVPROC) (GLuint path, GLenum pname, GLint value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, const GLfloat *value); +typedef void (GL_APIENTRYP PFNGLPATHPARAMETERFNVPROC) (GLuint path, GLenum pname, GLfloat value); +typedef void (GL_APIENTRYP PFNGLPATHDASHARRAYNVPROC) (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +typedef void (GL_APIENTRYP PFNGLPATHSTENCILFUNCNVPROC) (GLenum func, GLint ref, GLuint mask); +typedef void (GL_APIENTRYP PFNGLPATHSTENCILDEPTHOFFSETNVPROC) (GLfloat factor, GLfloat units); +typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask); +typedef void (GL_APIENTRYP PFNGLSTENCILFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLPATHCOVERDEPTHFUNCNVPROC) (GLenum func); +typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHNVPROC) (GLuint path, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERIVNVPROC) (GLuint path, GLenum pname, GLint *value); +typedef void (GL_APIENTRYP PFNGLGETPATHPARAMETERFVNVPROC) (GLuint path, GLenum pname, GLfloat *value); +typedef void (GL_APIENTRYP PFNGLGETPATHCOMMANDSNVPROC) (GLuint path, GLubyte *commands); +typedef void (GL_APIENTRYP PFNGLGETPATHCOORDSNVPROC) (GLuint path, GLfloat *coords); +typedef void (GL_APIENTRYP PFNGLGETPATHDASHARRAYNVPROC) (GLuint path, GLfloat *dashArray); +typedef void (GL_APIENTRYP PFNGLGETPATHMETRICSNVPROC) (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +typedef void (GL_APIENTRYP PFNGLGETPATHMETRICRANGENVPROC) (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +typedef void (GL_APIENTRYP PFNGLGETPATHSPACINGNVPROC) (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINFILLPATHNVPROC) (GLuint path, GLuint mask, GLfloat x, GLfloat y); +typedef GLboolean (GL_APIENTRYP PFNGLISPOINTINSTROKEPATHNVPROC) (GLuint path, GLfloat x, GLfloat y); +typedef GLfloat (GL_APIENTRYP PFNGLGETPATHLENGTHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments); +typedef GLboolean (GL_APIENTRYP PFNGLPOINTALONGPATHNVPROC) (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOAD3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X2FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULT3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSE3X3FNVPROC) (GLenum matrixMode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHNVPROC) (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC) (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef void (GL_APIENTRYP PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC) (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXRANGENVPROC) (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +typedef GLenum (GL_APIENTRYP PFNGLPATHGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef GLenum (GL_APIENTRYP PFNGLPATHMEMORYGLYPHINDEXARRAYNVPROC) (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +typedef void (GL_APIENTRYP PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC) (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +typedef void (GL_APIENTRYP PFNGLGETPROGRAMRESOURCEFVNVPROC) (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +typedef void (GL_APIENTRYP PFNGLMATRIXFRUSTUMEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADIDENTITYEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXLOADDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTTRANSPOSEDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTFEXTPROC) (GLenum mode, const GLfloat *m); +typedef void (GL_APIENTRYP PFNGLMATRIXMULTDEXTPROC) (GLenum mode, const GLdouble *m); +typedef void (GL_APIENTRYP PFNGLMATRIXORTHOEXTPROC) (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +typedef void (GL_APIENTRYP PFNGLMATRIXPOPEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXPUSHEXTPROC) (GLenum mode); +typedef void (GL_APIENTRYP PFNGLMATRIXROTATEFEXTPROC) (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXROTATEDEXTPROC) (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +typedef void (GL_APIENTRYP PFNGLMATRIXSCALEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXSCALEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEFEXTPROC) (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +typedef void (GL_APIENTRYP PFNGLMATRIXTRANSLATEDEXTPROC) (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL GLuint GL_APIENTRY glGenPathsNV (GLsizei range); +GL_APICALL void GL_APIENTRY glDeletePathsNV (GLuint path, GLsizei range); +GL_APICALL GLboolean GL_APIENTRY glIsPathNV (GLuint path); +GL_APICALL void GL_APIENTRY glPathCommandsNV (GLuint path, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathCoordsNV (GLuint path, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathSubCommandsNV (GLuint path, GLsizei commandStart, GLsizei commandsToDelete, GLsizei numCommands, const GLubyte *commands, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathSubCoordsNV (GLuint path, GLsizei coordStart, GLsizei numCoords, GLenum coordType, const void *coords); +GL_APICALL void GL_APIENTRY glPathStringNV (GLuint path, GLenum format, GLsizei length, const void *pathString); +GL_APICALL void GL_APIENTRY glPathGlyphsNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLsizei numGlyphs, GLenum type, const void *charcodes, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glPathGlyphRangeNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyph, GLsizei numGlyphs, GLenum handleMissingGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glWeightPathsNV (GLuint resultPath, GLsizei numPaths, const GLuint *paths, const GLfloat *weights); +GL_APICALL void GL_APIENTRY glCopyPathNV (GLuint resultPath, GLuint srcPath); +GL_APICALL void GL_APIENTRY glInterpolatePathsNV (GLuint resultPath, GLuint pathA, GLuint pathB, GLfloat weight); +GL_APICALL void GL_APIENTRY glTransformPathNV (GLuint resultPath, GLuint srcPath, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glPathParameterivNV (GLuint path, GLenum pname, const GLint *value); +GL_APICALL void GL_APIENTRY glPathParameteriNV (GLuint path, GLenum pname, GLint value); +GL_APICALL void GL_APIENTRY glPathParameterfvNV (GLuint path, GLenum pname, const GLfloat *value); +GL_APICALL void GL_APIENTRY glPathParameterfNV (GLuint path, GLenum pname, GLfloat value); +GL_APICALL void GL_APIENTRY glPathDashArrayNV (GLuint path, GLsizei dashCount, const GLfloat *dashArray); +GL_APICALL void GL_APIENTRY glPathStencilFuncNV (GLenum func, GLint ref, GLuint mask); +GL_APICALL void GL_APIENTRY glPathStencilDepthOffsetNV (GLfloat factor, GLfloat units); +GL_APICALL void GL_APIENTRY glStencilFillPathNV (GLuint path, GLenum fillMode, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilStrokePathNV (GLuint path, GLint reference, GLuint mask); +GL_APICALL void GL_APIENTRY glStencilFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glStencilStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glPathCoverDepthFuncNV (GLenum func); +GL_APICALL void GL_APIENTRY glCoverFillPathNV (GLuint path, GLenum coverMode); +GL_APICALL void GL_APIENTRY glCoverStrokePathNV (GLuint path, GLenum coverMode); +GL_APICALL void GL_APIENTRY glCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glGetPathParameterivNV (GLuint path, GLenum pname, GLint *value); +GL_APICALL void GL_APIENTRY glGetPathParameterfvNV (GLuint path, GLenum pname, GLfloat *value); +GL_APICALL void GL_APIENTRY glGetPathCommandsNV (GLuint path, GLubyte *commands); +GL_APICALL void GL_APIENTRY glGetPathCoordsNV (GLuint path, GLfloat *coords); +GL_APICALL void GL_APIENTRY glGetPathDashArrayNV (GLuint path, GLfloat *dashArray); +GL_APICALL void GL_APIENTRY glGetPathMetricsNV (GLbitfield metricQueryMask, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLsizei stride, GLfloat *metrics); +GL_APICALL void GL_APIENTRY glGetPathMetricRangeNV (GLbitfield metricQueryMask, GLuint firstPathName, GLsizei numPaths, GLsizei stride, GLfloat *metrics); +GL_APICALL void GL_APIENTRY glGetPathSpacingNV (GLenum pathListMode, GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLfloat advanceScale, GLfloat kerningScale, GLenum transformType, GLfloat *returnedSpacing); +GL_APICALL GLboolean GL_APIENTRY glIsPointInFillPathNV (GLuint path, GLuint mask, GLfloat x, GLfloat y); +GL_APICALL GLboolean GL_APIENTRY glIsPointInStrokePathNV (GLuint path, GLfloat x, GLfloat y); +GL_APICALL GLfloat GL_APIENTRY glGetPathLengthNV (GLuint path, GLsizei startSegment, GLsizei numSegments); +GL_APICALL GLboolean GL_APIENTRY glPointAlongPathNV (GLuint path, GLsizei startSegment, GLsizei numSegments, GLfloat distance, GLfloat *x, GLfloat *y, GLfloat *tangentX, GLfloat *tangentY); +GL_APICALL void GL_APIENTRY glMatrixLoad3x2fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoad3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoadTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMult3x2fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMult3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultTranspose3x3fNV (GLenum matrixMode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathNV (GLuint path, GLenum fillMode, GLuint mask, GLenum coverMode); +GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathNV (GLuint path, GLint reference, GLuint mask, GLenum coverMode); +GL_APICALL void GL_APIENTRY glStencilThenCoverFillPathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLenum fillMode, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL void GL_APIENTRY glStencilThenCoverStrokePathInstancedNV (GLsizei numPaths, GLenum pathNameType, const void *paths, GLuint pathBase, GLint reference, GLuint mask, GLenum coverMode, GLenum transformType, const GLfloat *transformValues); +GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexRangeNV (GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint pathParameterTemplate, GLfloat emScale, GLuint *baseAndCount); +GL_APICALL GLenum GL_APIENTRY glPathGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, const void *fontName, GLbitfield fontStyle, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL GLenum GL_APIENTRY glPathMemoryGlyphIndexArrayNV (GLuint firstPathName, GLenum fontTarget, GLsizeiptr fontSize, const void *fontData, GLsizei faceIndex, GLuint firstGlyphIndex, GLsizei numGlyphs, GLuint pathParameterTemplate, GLfloat emScale); +GL_APICALL void GL_APIENTRY glProgramPathFragmentInputGenNV (GLuint program, GLint location, GLenum genMode, GLint components, const GLfloat *coeffs); +GL_APICALL void GL_APIENTRY glGetProgramResourcefvNV (GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLfloat *params); +GL_APICALL void GL_APIENTRY glMatrixFrustumEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixLoadIdentityEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposefEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoadTransposedEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixLoadfEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixLoaddEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposefEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultTransposedEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixMultfEXT (GLenum mode, const GLfloat *m); +GL_APICALL void GL_APIENTRY glMatrixMultdEXT (GLenum mode, const GLdouble *m); +GL_APICALL void GL_APIENTRY glMatrixOrthoEXT (GLenum mode, GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar); +GL_APICALL void GL_APIENTRY glMatrixPopEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixPushEXT (GLenum mode); +GL_APICALL void GL_APIENTRY glMatrixRotatefEXT (GLenum mode, GLfloat angle, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixRotatedEXT (GLenum mode, GLdouble angle, GLdouble x, GLdouble y, GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixScalefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixScaledEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +GL_APICALL void GL_APIENTRY glMatrixTranslatefEXT (GLenum mode, GLfloat x, GLfloat y, GLfloat z); +GL_APICALL void GL_APIENTRY glMatrixTranslatedEXT (GLenum mode, GLdouble x, GLdouble y, GLdouble z); +#endif +#endif /* GL_NV_path_rendering */ + +#ifndef GL_NV_path_rendering_shared_edge +#define GL_NV_path_rendering_shared_edge 1 +#define GL_SHARED_EDGE_NV 0xC0 +#endif /* GL_NV_path_rendering_shared_edge */ + +#ifndef GL_NV_pixel_buffer_object +#define GL_NV_pixel_buffer_object 1 +#define GL_PIXEL_PACK_BUFFER_NV 0x88EB +#define GL_PIXEL_UNPACK_BUFFER_NV 0x88EC +#define GL_PIXEL_PACK_BUFFER_BINDING_NV 0x88ED +#define GL_PIXEL_UNPACK_BUFFER_BINDING_NV 0x88EF +#endif /* GL_NV_pixel_buffer_object */ + +#ifndef GL_NV_polygon_mode +#define GL_NV_polygon_mode 1 +#define GL_POLYGON_MODE_NV 0x0B40 +#define GL_POLYGON_OFFSET_POINT_NV 0x2A01 +#define GL_POLYGON_OFFSET_LINE_NV 0x2A02 +#define GL_POINT_NV 0x1B00 +#define GL_LINE_NV 0x1B01 +#define GL_FILL_NV 0x1B02 +typedef void (GL_APIENTRYP PFNGLPOLYGONMODENVPROC) (GLenum face, GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glPolygonModeNV (GLenum face, GLenum mode); +#endif +#endif /* GL_NV_polygon_mode */ + +#ifndef GL_NV_primitive_shading_rate +#define GL_NV_primitive_shading_rate 1 +#define GL_SHADING_RATE_IMAGE_PER_PRIMITIVE_NV 0x95B1 +#define GL_SHADING_RATE_IMAGE_PALETTE_COUNT_NV 0x95B2 +#endif /* GL_NV_primitive_shading_rate */ + +#ifndef GL_NV_read_buffer +#define GL_NV_read_buffer 1 +#define GL_READ_BUFFER_NV 0x0C02 +typedef void (GL_APIENTRYP PFNGLREADBUFFERNVPROC) (GLenum mode); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glReadBufferNV (GLenum mode); +#endif +#endif /* GL_NV_read_buffer */ + +#ifndef GL_NV_read_buffer_front +#define GL_NV_read_buffer_front 1 +#endif /* GL_NV_read_buffer_front */ + +#ifndef GL_NV_read_depth +#define GL_NV_read_depth 1 +#endif /* GL_NV_read_depth */ + +#ifndef GL_NV_read_depth_stencil +#define GL_NV_read_depth_stencil 1 +#endif /* GL_NV_read_depth_stencil */ + +#ifndef GL_NV_read_stencil +#define GL_NV_read_stencil 1 +#endif /* GL_NV_read_stencil */ + +#ifndef GL_NV_representative_fragment_test +#define GL_NV_representative_fragment_test 1 +#define GL_REPRESENTATIVE_FRAGMENT_TEST_NV 0x937F +#endif /* GL_NV_representative_fragment_test */ + +#ifndef GL_NV_sRGB_formats +#define GL_NV_sRGB_formats 1 +#define GL_SLUMINANCE_NV 0x8C46 +#define GL_SLUMINANCE_ALPHA_NV 0x8C44 +#define GL_SRGB8_NV 0x8C41 +#define GL_SLUMINANCE8_NV 0x8C47 +#define GL_SLUMINANCE8_ALPHA8_NV 0x8C45 +#define GL_COMPRESSED_SRGB_S3TC_DXT1_NV 0x8C4C +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV 0x8C4D +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_NV 0x8C4E +#define GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_NV 0x8C4F +#define GL_ETC1_SRGB8_NV 0x88EE +#endif /* GL_NV_sRGB_formats */ + +#ifndef GL_NV_sample_locations +#define GL_NV_sample_locations 1 +#define GL_SAMPLE_LOCATION_SUBPIXEL_BITS_NV 0x933D +#define GL_SAMPLE_LOCATION_PIXEL_GRID_WIDTH_NV 0x933E +#define GL_SAMPLE_LOCATION_PIXEL_GRID_HEIGHT_NV 0x933F +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_TABLE_SIZE_NV 0x9340 +#define GL_SAMPLE_LOCATION_NV 0x8E50 +#define GL_PROGRAMMABLE_SAMPLE_LOCATION_NV 0x9341 +#define GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE_LOCATIONS_NV 0x9342 +#define GL_FRAMEBUFFER_SAMPLE_LOCATION_PIXEL_GRID_NV 0x9343 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLNAMEDFRAMEBUFFERSAMPLELOCATIONSFVNVPROC) (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLRESOLVEDEPTHVALUESNVPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferSampleLocationsfvNV (GLenum target, GLuint start, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glNamedFramebufferSampleLocationsfvNV (GLuint framebuffer, GLuint start, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glResolveDepthValuesNV (void); +#endif +#endif /* GL_NV_sample_locations */ + +#ifndef GL_NV_sample_mask_override_coverage +#define GL_NV_sample_mask_override_coverage 1 +#endif /* GL_NV_sample_mask_override_coverage */ + +#ifndef GL_NV_scissor_exclusive +#define GL_NV_scissor_exclusive 1 +#define GL_SCISSOR_TEST_EXCLUSIVE_NV 0x9555 +#define GL_SCISSOR_BOX_EXCLUSIVE_NV 0x9556 +typedef void (GL_APIENTRYP PFNGLSCISSOREXCLUSIVENVPROC) (GLint x, GLint y, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSOREXCLUSIVEARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glScissorExclusiveNV (GLint x, GLint y, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorExclusiveArrayvNV (GLuint first, GLsizei count, const GLint *v); +#endif +#endif /* GL_NV_scissor_exclusive */ + +#ifndef GL_NV_shader_atomic_fp16_vector +#define GL_NV_shader_atomic_fp16_vector 1 +#endif /* GL_NV_shader_atomic_fp16_vector */ + +#ifndef GL_NV_shader_noperspective_interpolation +#define GL_NV_shader_noperspective_interpolation 1 +#endif /* GL_NV_shader_noperspective_interpolation */ + +#ifndef GL_NV_shader_subgroup_partitioned +#define GL_NV_shader_subgroup_partitioned 1 +#define GL_SUBGROUP_FEATURE_PARTITIONED_BIT_NV 0x00000100 +#endif /* GL_NV_shader_subgroup_partitioned */ + +#ifndef GL_NV_shader_texture_footprint +#define GL_NV_shader_texture_footprint 1 +#endif /* GL_NV_shader_texture_footprint */ + +#ifndef GL_NV_shading_rate_image +#define GL_NV_shading_rate_image 1 +#define GL_SHADING_RATE_IMAGE_NV 0x9563 +#define GL_SHADING_RATE_NO_INVOCATIONS_NV 0x9564 +#define GL_SHADING_RATE_1_INVOCATION_PER_PIXEL_NV 0x9565 +#define GL_SHADING_RATE_1_INVOCATION_PER_1X2_PIXELS_NV 0x9566 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X1_PIXELS_NV 0x9567 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X2_PIXELS_NV 0x9568 +#define GL_SHADING_RATE_1_INVOCATION_PER_2X4_PIXELS_NV 0x9569 +#define GL_SHADING_RATE_1_INVOCATION_PER_4X2_PIXELS_NV 0x956A +#define GL_SHADING_RATE_1_INVOCATION_PER_4X4_PIXELS_NV 0x956B +#define GL_SHADING_RATE_2_INVOCATIONS_PER_PIXEL_NV 0x956C +#define GL_SHADING_RATE_4_INVOCATIONS_PER_PIXEL_NV 0x956D +#define GL_SHADING_RATE_8_INVOCATIONS_PER_PIXEL_NV 0x956E +#define GL_SHADING_RATE_16_INVOCATIONS_PER_PIXEL_NV 0x956F +#define GL_SHADING_RATE_IMAGE_BINDING_NV 0x955B +#define GL_SHADING_RATE_IMAGE_TEXEL_WIDTH_NV 0x955C +#define GL_SHADING_RATE_IMAGE_TEXEL_HEIGHT_NV 0x955D +#define GL_SHADING_RATE_IMAGE_PALETTE_SIZE_NV 0x955E +#define GL_MAX_COARSE_FRAGMENT_SAMPLES_NV 0x955F +#define GL_SHADING_RATE_SAMPLE_ORDER_DEFAULT_NV 0x95AE +#define GL_SHADING_RATE_SAMPLE_ORDER_PIXEL_MAJOR_NV 0x95AF +#define GL_SHADING_RATE_SAMPLE_ORDER_SAMPLE_MAJOR_NV 0x95B0 +typedef void (GL_APIENTRYP PFNGLBINDSHADINGRATEIMAGENVPROC) (GLuint texture); +typedef void (GL_APIENTRYP PFNGLGETSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint entry, GLenum *rate); +typedef void (GL_APIENTRYP PFNGLGETSHADINGRATESAMPLELOCATIONIVNVPROC) (GLenum rate, GLuint samples, GLuint index, GLint *location); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEBARRIERNVPROC) (GLboolean synchronize); +typedef void (GL_APIENTRYP PFNGLSHADINGRATEIMAGEPALETTENVPROC) (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERNVPROC) (GLenum order); +typedef void (GL_APIENTRYP PFNGLSHADINGRATESAMPLEORDERCUSTOMNVPROC) (GLenum rate, GLuint samples, const GLint *locations); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glBindShadingRateImageNV (GLuint texture); +GL_APICALL void GL_APIENTRY glGetShadingRateImagePaletteNV (GLuint viewport, GLuint entry, GLenum *rate); +GL_APICALL void GL_APIENTRY glGetShadingRateSampleLocationivNV (GLenum rate, GLuint samples, GLuint index, GLint *location); +GL_APICALL void GL_APIENTRY glShadingRateImageBarrierNV (GLboolean synchronize); +GL_APICALL void GL_APIENTRY glShadingRateImagePaletteNV (GLuint viewport, GLuint first, GLsizei count, const GLenum *rates); +GL_APICALL void GL_APIENTRY glShadingRateSampleOrderNV (GLenum order); +GL_APICALL void GL_APIENTRY glShadingRateSampleOrderCustomNV (GLenum rate, GLuint samples, const GLint *locations); +#endif +#endif /* GL_NV_shading_rate_image */ + +#ifndef GL_NV_shadow_samplers_array +#define GL_NV_shadow_samplers_array 1 +#define GL_SAMPLER_2D_ARRAY_SHADOW_NV 0x8DC4 +#endif /* GL_NV_shadow_samplers_array */ + +#ifndef GL_NV_shadow_samplers_cube +#define GL_NV_shadow_samplers_cube 1 +#define GL_SAMPLER_CUBE_SHADOW_NV 0x8DC5 +#endif /* GL_NV_shadow_samplers_cube */ + +#ifndef GL_NV_stereo_view_rendering +#define GL_NV_stereo_view_rendering 1 +#endif /* GL_NV_stereo_view_rendering */ + +#ifndef GL_NV_texture_border_clamp +#define GL_NV_texture_border_clamp 1 +#define GL_TEXTURE_BORDER_COLOR_NV 0x1004 +#define GL_CLAMP_TO_BORDER_NV 0x812D +#endif /* GL_NV_texture_border_clamp */ + +#ifndef GL_NV_texture_compression_s3tc_update +#define GL_NV_texture_compression_s3tc_update 1 +#endif /* GL_NV_texture_compression_s3tc_update */ + +#ifndef GL_NV_texture_npot_2D_mipmap +#define GL_NV_texture_npot_2D_mipmap 1 +#endif /* GL_NV_texture_npot_2D_mipmap */ + +#ifndef GL_NV_timeline_semaphore +#define GL_NV_timeline_semaphore 1 +#define GL_TIMELINE_SEMAPHORE_VALUE_NV 0x9595 +#define GL_SEMAPHORE_TYPE_NV 0x95B3 +#define GL_SEMAPHORE_TYPE_BINARY_NV 0x95B4 +#define GL_SEMAPHORE_TYPE_TIMELINE_NV 0x95B5 +#define GL_MAX_TIMELINE_SEMAPHORE_VALUE_DIFFERENCE_NV 0x95B6 +typedef void (GL_APIENTRYP PFNGLCREATESEMAPHORESNVPROC) (GLsizei n, GLuint *semaphores); +typedef void (GL_APIENTRYP PFNGLSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, const GLint *params); +typedef void (GL_APIENTRYP PFNGLGETSEMAPHOREPARAMETERIVNVPROC) (GLuint semaphore, GLenum pname, GLint *params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glCreateSemaphoresNV (GLsizei n, GLuint *semaphores); +GL_APICALL void GL_APIENTRY glSemaphoreParameterivNV (GLuint semaphore, GLenum pname, const GLint *params); +GL_APICALL void GL_APIENTRY glGetSemaphoreParameterivNV (GLuint semaphore, GLenum pname, GLint *params); +#endif +#endif /* GL_NV_timeline_semaphore */ + +#ifndef GL_NV_viewport_array +#define GL_NV_viewport_array 1 +#define GL_MAX_VIEWPORTS_NV 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS_NV 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE_NV 0x825D +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX_NV 0x825F +typedef void (GL_APIENTRYP PFNGLVIEWPORTARRAYVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFNVPROC) (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +typedef void (GL_APIENTRYP PFNGLVIEWPORTINDEXEDFVNVPROC) (GLuint index, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLSCISSORARRAYVNVPROC) (GLuint first, GLsizei count, const GLint *v); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDNVPROC) (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +typedef void (GL_APIENTRYP PFNGLSCISSORINDEXEDVNVPROC) (GLuint index, const GLint *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEARRAYFVNVPROC) (GLuint first, GLsizei count, const GLfloat *v); +typedef void (GL_APIENTRYP PFNGLDEPTHRANGEINDEXEDFNVPROC) (GLuint index, GLfloat n, GLfloat f); +typedef void (GL_APIENTRYP PFNGLGETFLOATI_VNVPROC) (GLenum target, GLuint index, GLfloat *data); +typedef void (GL_APIENTRYP PFNGLENABLEINVPROC) (GLenum target, GLuint index); +typedef void (GL_APIENTRYP PFNGLDISABLEINVPROC) (GLenum target, GLuint index); +typedef GLboolean (GL_APIENTRYP PFNGLISENABLEDINVPROC) (GLenum target, GLuint index); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportArrayvNV (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glViewportIndexedfNV (GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GL_APICALL void GL_APIENTRY glViewportIndexedfvNV (GLuint index, const GLfloat *v); +GL_APICALL void GL_APIENTRY glScissorArrayvNV (GLuint first, GLsizei count, const GLint *v); +GL_APICALL void GL_APIENTRY glScissorIndexedNV (GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GL_APICALL void GL_APIENTRY glScissorIndexedvNV (GLuint index, const GLint *v); +GL_APICALL void GL_APIENTRY glDepthRangeArrayfvNV (GLuint first, GLsizei count, const GLfloat *v); +GL_APICALL void GL_APIENTRY glDepthRangeIndexedfNV (GLuint index, GLfloat n, GLfloat f); +GL_APICALL void GL_APIENTRY glGetFloati_vNV (GLenum target, GLuint index, GLfloat *data); +GL_APICALL void GL_APIENTRY glEnableiNV (GLenum target, GLuint index); +GL_APICALL void GL_APIENTRY glDisableiNV (GLenum target, GLuint index); +GL_APICALL GLboolean GL_APIENTRY glIsEnablediNV (GLenum target, GLuint index); +#endif +#endif /* GL_NV_viewport_array */ + +#ifndef GL_NV_viewport_array2 +#define GL_NV_viewport_array2 1 +#endif /* GL_NV_viewport_array2 */ + +#ifndef GL_NV_viewport_swizzle +#define GL_NV_viewport_swizzle 1 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_X_NV 0x9350 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_X_NV 0x9351 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Y_NV 0x9352 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Y_NV 0x9353 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_Z_NV 0x9354 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_Z_NV 0x9355 +#define GL_VIEWPORT_SWIZZLE_POSITIVE_W_NV 0x9356 +#define GL_VIEWPORT_SWIZZLE_NEGATIVE_W_NV 0x9357 +#define GL_VIEWPORT_SWIZZLE_X_NV 0x9358 +#define GL_VIEWPORT_SWIZZLE_Y_NV 0x9359 +#define GL_VIEWPORT_SWIZZLE_Z_NV 0x935A +#define GL_VIEWPORT_SWIZZLE_W_NV 0x935B +typedef void (GL_APIENTRYP PFNGLVIEWPORTSWIZZLENVPROC) (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glViewportSwizzleNV (GLuint index, GLenum swizzlex, GLenum swizzley, GLenum swizzlez, GLenum swizzlew); +#endif +#endif /* GL_NV_viewport_swizzle */ + +#ifndef GL_OVR_multiview +#define GL_OVR_multiview 1 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_NUM_VIEWS_OVR 0x9630 +#define GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_BASE_VIEW_INDEX_OVR 0x9632 +#define GL_MAX_VIEWS_OVR 0x9631 +#define GL_FRAMEBUFFER_INCOMPLETE_VIEW_TARGETS_OVR 0x9633 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview */ + +#ifndef GL_OVR_multiview2 +#define GL_OVR_multiview2 1 +#endif /* GL_OVR_multiview2 */ + +#ifndef GL_OVR_multiview_multisampled_render_to_texture +#define GL_OVR_multiview_multisampled_render_to_texture 1 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC) (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferTextureMultisampleMultiviewOVR (GLenum target, GLenum attachment, GLuint texture, GLint level, GLsizei samples, GLint baseViewIndex, GLsizei numViews); +#endif +#endif /* GL_OVR_multiview_multisampled_render_to_texture */ + +#ifndef GL_QCOM_YUV_texture_gather +#define GL_QCOM_YUV_texture_gather 1 +#endif /* GL_QCOM_YUV_texture_gather */ + +#ifndef GL_QCOM_alpha_test +#define GL_QCOM_alpha_test 1 +#define GL_ALPHA_TEST_QCOM 0x0BC0 +#define GL_ALPHA_TEST_FUNC_QCOM 0x0BC1 +#define GL_ALPHA_TEST_REF_QCOM 0x0BC2 +typedef void (GL_APIENTRYP PFNGLALPHAFUNCQCOMPROC) (GLenum func, GLclampf ref); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glAlphaFuncQCOM (GLenum func, GLclampf ref); +#endif +#endif /* GL_QCOM_alpha_test */ + +#ifndef GL_QCOM_binning_control +#define GL_QCOM_binning_control 1 +#define GL_BINNING_CONTROL_HINT_QCOM 0x8FB0 +#define GL_CPU_OPTIMIZED_QCOM 0x8FB1 +#define GL_GPU_OPTIMIZED_QCOM 0x8FB2 +#define GL_RENDER_DIRECT_TO_FRAMEBUFFER_QCOM 0x8FB3 +#endif /* GL_QCOM_binning_control */ + +#ifndef GL_QCOM_driver_control +#define GL_QCOM_driver_control 1 +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSQCOMPROC) (GLint *num, GLsizei size, GLuint *driverControls); +typedef void (GL_APIENTRYP PFNGLGETDRIVERCONTROLSTRINGQCOMPROC) (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +typedef void (GL_APIENTRYP PFNGLENABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +typedef void (GL_APIENTRYP PFNGLDISABLEDRIVERCONTROLQCOMPROC) (GLuint driverControl); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glGetDriverControlsQCOM (GLint *num, GLsizei size, GLuint *driverControls); +GL_APICALL void GL_APIENTRY glGetDriverControlStringQCOM (GLuint driverControl, GLsizei bufSize, GLsizei *length, GLchar *driverControlString); +GL_APICALL void GL_APIENTRY glEnableDriverControlQCOM (GLuint driverControl); +GL_APICALL void GL_APIENTRY glDisableDriverControlQCOM (GLuint driverControl); +#endif +#endif /* GL_QCOM_driver_control */ + +#ifndef GL_QCOM_extended_get +#define GL_QCOM_extended_get 1 +#define GL_TEXTURE_WIDTH_QCOM 0x8BD2 +#define GL_TEXTURE_HEIGHT_QCOM 0x8BD3 +#define GL_TEXTURE_DEPTH_QCOM 0x8BD4 +#define GL_TEXTURE_INTERNAL_FORMAT_QCOM 0x8BD5 +#define GL_TEXTURE_FORMAT_QCOM 0x8BD6 +#define GL_TEXTURE_TYPE_QCOM 0x8BD7 +#define GL_TEXTURE_IMAGE_VALID_QCOM 0x8BD8 +#define GL_TEXTURE_NUM_LEVELS_QCOM 0x8BD9 +#define GL_TEXTURE_TARGET_QCOM 0x8BDA +#define GL_TEXTURE_OBJECT_VALID_QCOM 0x8BDB +#define GL_STATE_RESTORE 0x8BDC +typedef void (GL_APIENTRYP PFNGLEXTGETTEXTURESQCOMPROC) (GLuint *textures, GLint maxTextures, GLint *numTextures); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERSQCOMPROC) (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETRENDERBUFFERSQCOMPROC) (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETFRAMEBUFFERSQCOMPROC) (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXLEVELPARAMETERIVQCOMPROC) (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +typedef void (GL_APIENTRYP PFNGLEXTTEXOBJECTSTATEOVERRIDEIQCOMPROC) (GLenum target, GLenum pname, GLint param); +typedef void (GL_APIENTRYP PFNGLEXTGETTEXSUBIMAGEQCOMPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +typedef void (GL_APIENTRYP PFNGLEXTGETBUFFERPOINTERVQCOMPROC) (GLenum target, void **params); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetTexturesQCOM (GLuint *textures, GLint maxTextures, GLint *numTextures); +GL_APICALL void GL_APIENTRY glExtGetBuffersQCOM (GLuint *buffers, GLint maxBuffers, GLint *numBuffers); +GL_APICALL void GL_APIENTRY glExtGetRenderbuffersQCOM (GLuint *renderbuffers, GLint maxRenderbuffers, GLint *numRenderbuffers); +GL_APICALL void GL_APIENTRY glExtGetFramebuffersQCOM (GLuint *framebuffers, GLint maxFramebuffers, GLint *numFramebuffers); +GL_APICALL void GL_APIENTRY glExtGetTexLevelParameterivQCOM (GLuint texture, GLenum face, GLint level, GLenum pname, GLint *params); +GL_APICALL void GL_APIENTRY glExtTexObjectStateOverrideiQCOM (GLenum target, GLenum pname, GLint param); +GL_APICALL void GL_APIENTRY glExtGetTexSubImageQCOM (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, void *texels); +GL_APICALL void GL_APIENTRY glExtGetBufferPointervQCOM (GLenum target, void **params); +#endif +#endif /* GL_QCOM_extended_get */ + +#ifndef GL_QCOM_extended_get2 +#define GL_QCOM_extended_get2 1 +typedef void (GL_APIENTRYP PFNGLEXTGETSHADERSQCOMPROC) (GLuint *shaders, GLint maxShaders, GLint *numShaders); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMSQCOMPROC) (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +typedef GLboolean (GL_APIENTRYP PFNGLEXTISPROGRAMBINARYQCOMPROC) (GLuint program); +typedef void (GL_APIENTRYP PFNGLEXTGETPROGRAMBINARYSOURCEQCOMPROC) (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtGetShadersQCOM (GLuint *shaders, GLint maxShaders, GLint *numShaders); +GL_APICALL void GL_APIENTRY glExtGetProgramsQCOM (GLuint *programs, GLint maxPrograms, GLint *numPrograms); +GL_APICALL GLboolean GL_APIENTRY glExtIsProgramBinaryQCOM (GLuint program); +GL_APICALL void GL_APIENTRY glExtGetProgramBinarySourceQCOM (GLuint program, GLenum shadertype, GLchar *source, GLint *length); +#endif +#endif /* GL_QCOM_extended_get2 */ + +#ifndef GL_QCOM_frame_extrapolation +#define GL_QCOM_frame_extrapolation 1 +typedef void (GL_APIENTRYP PFNGLEXTRAPOLATETEX2DQCOMPROC) (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glExtrapolateTex2DQCOM (GLuint src1, GLuint src2, GLuint output, GLfloat scaleFactor); +#endif +#endif /* GL_QCOM_frame_extrapolation */ + +#ifndef GL_QCOM_framebuffer_foveated +#define GL_QCOM_framebuffer_foveated 1 +#define GL_FOVEATION_ENABLE_BIT_QCOM 0x00000001 +#define GL_FOVEATION_SCALED_BIN_METHOD_BIT_QCOM 0x00000002 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONCONFIGQCOMPROC) (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFOVEATIONPARAMETERSQCOMPROC) (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFoveationConfigQCOM (GLuint framebuffer, GLuint numLayers, GLuint focalPointsPerLayer, GLuint requestedFeatures, GLuint *providedFeatures); +GL_APICALL void GL_APIENTRY glFramebufferFoveationParametersQCOM (GLuint framebuffer, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#endif +#endif /* GL_QCOM_framebuffer_foveated */ + +#ifndef GL_QCOM_motion_estimation +#define GL_QCOM_motion_estimation 1 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_X_QCOM 0x8C90 +#define GL_MOTION_ESTIMATION_SEARCH_BLOCK_Y_QCOM 0x8C91 +typedef void (GL_APIENTRYP PFNGLTEXESTIMATEMOTIONQCOMPROC) (GLuint ref, GLuint target, GLuint output); +typedef void (GL_APIENTRYP PFNGLTEXESTIMATEMOTIONREGIONSQCOMPROC) (GLuint ref, GLuint target, GLuint output, GLuint mask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTexEstimateMotionQCOM (GLuint ref, GLuint target, GLuint output); +GL_APICALL void GL_APIENTRY glTexEstimateMotionRegionsQCOM (GLuint ref, GLuint target, GLuint output, GLuint mask); +#endif +#endif /* GL_QCOM_motion_estimation */ + +#ifndef GL_QCOM_perfmon_global_mode +#define GL_QCOM_perfmon_global_mode 1 +#define GL_PERFMON_GLOBAL_MODE_QCOM 0x8FA0 +#endif /* GL_QCOM_perfmon_global_mode */ + +#ifndef GL_QCOM_render_shared_exponent +#define GL_QCOM_render_shared_exponent 1 +#endif /* GL_QCOM_render_shared_exponent */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_noncoherent +#define GL_QCOM_shader_framebuffer_fetch_noncoherent 1 +#define GL_FRAMEBUFFER_FETCH_NONCOHERENT_QCOM 0x96A2 +typedef void (GL_APIENTRYP PFNGLFRAMEBUFFERFETCHBARRIERQCOMPROC) (void); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glFramebufferFetchBarrierQCOM (void); +#endif +#endif /* GL_QCOM_shader_framebuffer_fetch_noncoherent */ + +#ifndef GL_QCOM_shader_framebuffer_fetch_rate +#define GL_QCOM_shader_framebuffer_fetch_rate 1 +#endif /* GL_QCOM_shader_framebuffer_fetch_rate */ + +#ifndef GL_QCOM_shading_rate +#define GL_QCOM_shading_rate 1 +#define GL_SHADING_RATE_QCOM 0x96A4 +#define GL_SHADING_RATE_PRESERVE_ASPECT_RATIO_QCOM 0x96A5 +#define GL_SHADING_RATE_1X1_PIXELS_QCOM 0x96A6 +#define GL_SHADING_RATE_1X2_PIXELS_QCOM 0x96A7 +#define GL_SHADING_RATE_2X1_PIXELS_QCOM 0x96A8 +#define GL_SHADING_RATE_2X2_PIXELS_QCOM 0x96A9 +#define GL_SHADING_RATE_4X2_PIXELS_QCOM 0x96AC +#define GL_SHADING_RATE_4X4_PIXELS_QCOM 0x96AE +typedef void (GL_APIENTRYP PFNGLSHADINGRATEQCOMPROC) (GLenum rate); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glShadingRateQCOM (GLenum rate); +#endif +#endif /* GL_QCOM_shading_rate */ + +#ifndef GL_QCOM_texture_foveated +#define GL_QCOM_texture_foveated 1 +#define GL_TEXTURE_FOVEATED_FEATURE_BITS_QCOM 0x8BFB +#define GL_TEXTURE_FOVEATED_MIN_PIXEL_DENSITY_QCOM 0x8BFC +#define GL_TEXTURE_FOVEATED_FEATURE_QUERY_QCOM 0x8BFD +#define GL_TEXTURE_FOVEATED_NUM_FOCAL_POINTS_QUERY_QCOM 0x8BFE +#define GL_FRAMEBUFFER_INCOMPLETE_FOVEATION_QCOM 0x8BFF +typedef void (GL_APIENTRYP PFNGLTEXTUREFOVEATIONPARAMETERSQCOMPROC) (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glTextureFoveationParametersQCOM (GLuint texture, GLuint layer, GLuint focalPoint, GLfloat focalX, GLfloat focalY, GLfloat gainX, GLfloat gainY, GLfloat foveaArea); +#endif +#endif /* GL_QCOM_texture_foveated */ + +#ifndef GL_QCOM_texture_foveated2 +#define GL_QCOM_texture_foveated2 1 +#define GL_TEXTURE_FOVEATED_CUTOFF_DENSITY_QCOM 0x96A0 +#endif /* GL_QCOM_texture_foveated2 */ + +#ifndef GL_QCOM_texture_foveated_subsampled_layout +#define GL_QCOM_texture_foveated_subsampled_layout 1 +#define GL_FOVEATION_SUBSAMPLED_LAYOUT_METHOD_BIT_QCOM 0x00000004 +#define GL_MAX_SHADER_SUBSAMPLED_IMAGE_UNITS_QCOM 0x8FA1 +#endif /* GL_QCOM_texture_foveated_subsampled_layout */ + +#ifndef GL_QCOM_tiled_rendering +#define GL_QCOM_tiled_rendering 1 +#define GL_COLOR_BUFFER_BIT0_QCOM 0x00000001 +#define GL_COLOR_BUFFER_BIT1_QCOM 0x00000002 +#define GL_COLOR_BUFFER_BIT2_QCOM 0x00000004 +#define GL_COLOR_BUFFER_BIT3_QCOM 0x00000008 +#define GL_COLOR_BUFFER_BIT4_QCOM 0x00000010 +#define GL_COLOR_BUFFER_BIT5_QCOM 0x00000020 +#define GL_COLOR_BUFFER_BIT6_QCOM 0x00000040 +#define GL_COLOR_BUFFER_BIT7_QCOM 0x00000080 +#define GL_DEPTH_BUFFER_BIT0_QCOM 0x00000100 +#define GL_DEPTH_BUFFER_BIT1_QCOM 0x00000200 +#define GL_DEPTH_BUFFER_BIT2_QCOM 0x00000400 +#define GL_DEPTH_BUFFER_BIT3_QCOM 0x00000800 +#define GL_DEPTH_BUFFER_BIT4_QCOM 0x00001000 +#define GL_DEPTH_BUFFER_BIT5_QCOM 0x00002000 +#define GL_DEPTH_BUFFER_BIT6_QCOM 0x00004000 +#define GL_DEPTH_BUFFER_BIT7_QCOM 0x00008000 +#define GL_STENCIL_BUFFER_BIT0_QCOM 0x00010000 +#define GL_STENCIL_BUFFER_BIT1_QCOM 0x00020000 +#define GL_STENCIL_BUFFER_BIT2_QCOM 0x00040000 +#define GL_STENCIL_BUFFER_BIT3_QCOM 0x00080000 +#define GL_STENCIL_BUFFER_BIT4_QCOM 0x00100000 +#define GL_STENCIL_BUFFER_BIT5_QCOM 0x00200000 +#define GL_STENCIL_BUFFER_BIT6_QCOM 0x00400000 +#define GL_STENCIL_BUFFER_BIT7_QCOM 0x00800000 +#define GL_MULTISAMPLE_BUFFER_BIT0_QCOM 0x01000000 +#define GL_MULTISAMPLE_BUFFER_BIT1_QCOM 0x02000000 +#define GL_MULTISAMPLE_BUFFER_BIT2_QCOM 0x04000000 +#define GL_MULTISAMPLE_BUFFER_BIT3_QCOM 0x08000000 +#define GL_MULTISAMPLE_BUFFER_BIT4_QCOM 0x10000000 +#define GL_MULTISAMPLE_BUFFER_BIT5_QCOM 0x20000000 +#define GL_MULTISAMPLE_BUFFER_BIT6_QCOM 0x40000000 +#define GL_MULTISAMPLE_BUFFER_BIT7_QCOM 0x80000000 +typedef void (GL_APIENTRYP PFNGLSTARTTILINGQCOMPROC) (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +typedef void (GL_APIENTRYP PFNGLENDTILINGQCOMPROC) (GLbitfield preserveMask); +#ifdef GL_GLEXT_PROTOTYPES +GL_APICALL void GL_APIENTRY glStartTilingQCOM (GLuint x, GLuint y, GLuint width, GLuint height, GLbitfield preserveMask); +GL_APICALL void GL_APIENTRY glEndTilingQCOM (GLbitfield preserveMask); +#endif +#endif /* GL_QCOM_tiled_rendering */ + +#ifndef GL_QCOM_writeonly_rendering +#define GL_QCOM_writeonly_rendering 1 +#define GL_WRITEONLY_RENDERING_QCOM 0x8823 +#endif /* GL_QCOM_writeonly_rendering */ + +#ifndef GL_VIV_shader_binary +#define GL_VIV_shader_binary 1 +#define GL_SHADER_BINARY_VIV 0x8FC4 +#endif /* GL_VIV_shader_binary */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/SDL/SDL_opengles2_gl2platform.h b/include/SDL/SDL_opengles2_gl2platform.h new file mode 100644 index 0000000..426796e --- /dev/null +++ b/include/SDL/SDL_opengles2_gl2platform.h @@ -0,0 +1,27 @@ +#ifndef __gl2platform_h_ +#define __gl2platform_h_ + +/* +** Copyright 2017-2020 The Khronos Group Inc. +** SPDX-License-Identifier: Apache-2.0 +*/ + +/* Platform-specific types and definitions for OpenGL ES 2.X gl2.h + * + * Adopters may modify khrplatform.h and this file to suit their platform. + * Please contribute modifications back to Khronos as pull requests on the + * public github repository: + * https://github.com/KhronosGroup/OpenGL-Registry + */ + +/*#include */ + +#ifndef GL_APICALL +#define GL_APICALL KHRONOS_APICALL +#endif + +#ifndef GL_APIENTRY +#define GL_APIENTRY KHRONOS_APIENTRY +#endif + +#endif /* __gl2platform_h_ */ diff --git a/include/SDL/SDL_opengles2_khrplatform.h b/include/SDL/SDL_opengles2_khrplatform.h new file mode 100644 index 0000000..0164644 --- /dev/null +++ b/include/SDL/SDL_opengles2_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/SDL/SDL_pixels.h b/include/SDL/SDL_pixels.h new file mode 100644 index 0000000..9abd57b --- /dev/null +++ b/include/SDL/SDL_pixels.h @@ -0,0 +1,644 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_pixels.h + * + * Header for the enumerated pixel format definitions. + */ + +#ifndef SDL_pixels_h_ +#define SDL_pixels_h_ + +#include "SDL_stdinc.h" +#include "SDL_endian.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Transparency definitions + * + * These define alpha as the opacity of a surface. + */ +/* @{ */ +#define SDL_ALPHA_OPAQUE 255 +#define SDL_ALPHA_TRANSPARENT 0 +/* @} */ + +/** Pixel type. */ +typedef enum +{ + SDL_PIXELTYPE_UNKNOWN, + SDL_PIXELTYPE_INDEX1, + SDL_PIXELTYPE_INDEX4, + SDL_PIXELTYPE_INDEX8, + SDL_PIXELTYPE_PACKED8, + SDL_PIXELTYPE_PACKED16, + SDL_PIXELTYPE_PACKED32, + SDL_PIXELTYPE_ARRAYU8, + SDL_PIXELTYPE_ARRAYU16, + SDL_PIXELTYPE_ARRAYU32, + SDL_PIXELTYPE_ARRAYF16, + SDL_PIXELTYPE_ARRAYF32 +} SDL_PixelType; + +/** Bitmap pixel order, high bit -> low bit. */ +typedef enum +{ + SDL_BITMAPORDER_NONE, + SDL_BITMAPORDER_4321, + SDL_BITMAPORDER_1234 +} SDL_BitmapOrder; + +/** Packed component order, high bit -> low bit. */ +typedef enum +{ + SDL_PACKEDORDER_NONE, + SDL_PACKEDORDER_XRGB, + SDL_PACKEDORDER_RGBX, + SDL_PACKEDORDER_ARGB, + SDL_PACKEDORDER_RGBA, + SDL_PACKEDORDER_XBGR, + SDL_PACKEDORDER_BGRX, + SDL_PACKEDORDER_ABGR, + SDL_PACKEDORDER_BGRA +} SDL_PackedOrder; + +/** Array component order, low byte -> high byte. */ +/* !!! FIXME: in 2.1, make these not overlap differently with + !!! FIXME: SDL_PACKEDORDER_*, so we can simplify SDL_ISPIXELFORMAT_ALPHA */ +typedef enum +{ + SDL_ARRAYORDER_NONE, + SDL_ARRAYORDER_RGB, + SDL_ARRAYORDER_RGBA, + SDL_ARRAYORDER_ARGB, + SDL_ARRAYORDER_BGR, + SDL_ARRAYORDER_BGRA, + SDL_ARRAYORDER_ABGR +} SDL_ArrayOrder; + +/** Packed component layout. */ +typedef enum +{ + SDL_PACKEDLAYOUT_NONE, + SDL_PACKEDLAYOUT_332, + SDL_PACKEDLAYOUT_4444, + SDL_PACKEDLAYOUT_1555, + SDL_PACKEDLAYOUT_5551, + SDL_PACKEDLAYOUT_565, + SDL_PACKEDLAYOUT_8888, + SDL_PACKEDLAYOUT_2101010, + SDL_PACKEDLAYOUT_1010102 +} SDL_PackedLayout; + +#define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) + +#define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ + ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ + ((bits) << 8) | ((bytes) << 0)) + +#define SDL_PIXELFLAG(X) (((X) >> 28) & 0x0F) +#define SDL_PIXELTYPE(X) (((X) >> 24) & 0x0F) +#define SDL_PIXELORDER(X) (((X) >> 20) & 0x0F) +#define SDL_PIXELLAYOUT(X) (((X) >> 16) & 0x0F) +#define SDL_BITSPERPIXEL(X) (((X) >> 8) & 0xFF) +#define SDL_BYTESPERPIXEL(X) \ + (SDL_ISPIXELFORMAT_FOURCC(X) ? \ + ((((X) == SDL_PIXELFORMAT_YUY2) || \ + ((X) == SDL_PIXELFORMAT_UYVY) || \ + ((X) == SDL_PIXELFORMAT_YVYU)) ? 2 : 1) : (((X) >> 0) & 0xFF)) + +#define SDL_ISPIXELFORMAT_INDEXED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) + +#define SDL_ISPIXELFORMAT_PACKED(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32))) + +#define SDL_ISPIXELFORMAT_ARRAY(format) \ + (!SDL_ISPIXELFORMAT_FOURCC(format) && \ + ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ + (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) + +#define SDL_ISPIXELFORMAT_ALPHA(format) \ + ((SDL_ISPIXELFORMAT_PACKED(format) && \ + ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \ + (SDL_ISPIXELFORMAT_ARRAY(format) && \ + ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \ + (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA)))) + +/* The flag is set to 1 because 0x1? is not in the printable ASCII range */ +#define SDL_ISPIXELFORMAT_FOURCC(format) \ + ((format) && (SDL_PIXELFLAG(format) != 1)) + +/* Note: If you modify this list, update SDL_GetPixelFormatName() */ +typedef enum +{ + SDL_PIXELFORMAT_UNKNOWN, + SDL_PIXELFORMAT_INDEX1LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX1MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, + 1, 0), + SDL_PIXELFORMAT_INDEX4LSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX4MSB = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, + 4, 0), + SDL_PIXELFORMAT_INDEX8 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), + SDL_PIXELFORMAT_RGB332 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_332, 8, 1), + SDL_PIXELFORMAT_XRGB4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_4444, 12, 2), + SDL_PIXELFORMAT_RGB444 = SDL_PIXELFORMAT_XRGB4444, + SDL_PIXELFORMAT_XBGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_4444, 12, 2), + SDL_PIXELFORMAT_BGR444 = SDL_PIXELFORMAT_XBGR4444, + SDL_PIXELFORMAT_XRGB1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_RGB555 = SDL_PIXELFORMAT_XRGB1555, + SDL_PIXELFORMAT_XBGR1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_1555, 15, 2), + SDL_PIXELFORMAT_BGR555 = SDL_PIXELFORMAT_XBGR1555, + SDL_PIXELFORMAT_ARGB4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_RGBA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ABGR4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_BGRA4444 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_4444, 16, 2), + SDL_PIXELFORMAT_ARGB1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_RGBA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_ABGR1555 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_1555, 16, 2), + SDL_PIXELFORMAT_BGRA5551 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_5551, 16, 2), + SDL_PIXELFORMAT_RGB565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_BGR565 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_565, 16, 2), + SDL_PIXELFORMAT_RGB24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, + 24, 3), + SDL_PIXELFORMAT_BGR24 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0, + 24, 3), + SDL_PIXELFORMAT_XRGB8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_RGB888 = SDL_PIXELFORMAT_XRGB8888, + SDL_PIXELFORMAT_RGBX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_XBGR8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_BGR888 = SDL_PIXELFORMAT_XBGR8888, + SDL_PIXELFORMAT_BGRX8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, + SDL_PACKEDLAYOUT_8888, 24, 4), + SDL_PIXELFORMAT_ARGB8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_RGBA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ABGR8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_BGRA8888 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA, + SDL_PACKEDLAYOUT_8888, 32, 4), + SDL_PIXELFORMAT_ARGB2101010 = + SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, + SDL_PACKEDLAYOUT_2101010, 32, 4), + + /* Aliases for RGBA byte arrays of color data, for the current platform */ +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888, + SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888, + SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888, + SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888, +#else + SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888, + SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888, + SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888, + SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888, +#endif + + SDL_PIXELFORMAT_YV12 = /**< Planar mode: Y + V + U (3 planes) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), + SDL_PIXELFORMAT_IYUV = /**< Planar mode: Y + U + V (3 planes) */ + SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), + SDL_PIXELFORMAT_YUY2 = /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), + SDL_PIXELFORMAT_UYVY = /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), + SDL_PIXELFORMAT_YVYU = /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ + SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'), + SDL_PIXELFORMAT_NV12 = /**< Planar mode: Y + U/V interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'), + SDL_PIXELFORMAT_NV21 = /**< Planar mode: Y + V/U interleaved (2 planes) */ + SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'), + SDL_PIXELFORMAT_EXTERNAL_OES = /**< Android video texture format */ + SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' ') +} SDL_PixelFormatEnum; + +/** + * The bits of this structure can be directly reinterpreted as an integer-packed + * color which uses the SDL_PIXELFORMAT_RGBA32 format (SDL_PIXELFORMAT_ABGR8888 + * on little-endian systems and SDL_PIXELFORMAT_RGBA8888 on big-endian systems). + */ +typedef struct SDL_Color +{ + Uint8 r; + Uint8 g; + Uint8 b; + Uint8 a; +} SDL_Color; +#define SDL_Colour SDL_Color + +typedef struct SDL_Palette +{ + int ncolors; + SDL_Color *colors; + Uint32 version; + int refcount; +} SDL_Palette; + +/** + * \note Everything in the pixel format structure is read-only. + */ +typedef struct SDL_PixelFormat +{ + Uint32 format; + SDL_Palette *palette; + Uint8 BitsPerPixel; + Uint8 BytesPerPixel; + Uint8 padding[2]; + Uint32 Rmask; + Uint32 Gmask; + Uint32 Bmask; + Uint32 Amask; + Uint8 Rloss; + Uint8 Gloss; + Uint8 Bloss; + Uint8 Aloss; + Uint8 Rshift; + Uint8 Gshift; + Uint8 Bshift; + Uint8 Ashift; + int refcount; + struct SDL_PixelFormat *next; +} SDL_PixelFormat; + +/** + * Get the human readable name of a pixel format. + * + * \param format the pixel format to query + * \returns the human readable name of the specified pixel format or + * `SDL_PIXELFORMAT_UNKNOWN` if the format isn't recognized. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC const char* SDLCALL SDL_GetPixelFormatName(Uint32 format); + +/** + * Convert one of the enumerated pixel formats to a bpp value and RGBA masks. + * + * \param format one of the SDL_PixelFormatEnum values + * \param bpp a bits per pixel value; usually 15, 16, or 32 + * \param Rmask a pointer filled in with the red mask for the format + * \param Gmask a pointer filled in with the green mask for the format + * \param Bmask a pointer filled in with the blue mask for the format + * \param Amask a pointer filled in with the alpha mask for the format + * \returns SDL_TRUE on success or SDL_FALSE if the conversion wasn't + * possible; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MasksToPixelFormatEnum + */ +extern DECLSPEC SDL_bool SDLCALL SDL_PixelFormatEnumToMasks(Uint32 format, + int *bpp, + Uint32 * Rmask, + Uint32 * Gmask, + Uint32 * Bmask, + Uint32 * Amask); + +/** + * Convert a bpp value and RGBA masks to an enumerated pixel format. + * + * This will return `SDL_PIXELFORMAT_UNKNOWN` if the conversion wasn't + * possible. + * + * \param bpp a bits per pixel value; usually 15, 16, or 32 + * \param Rmask the red mask for the format + * \param Gmask the green mask for the format + * \param Bmask the blue mask for the format + * \param Amask the alpha mask for the format + * \returns one of the SDL_PixelFormatEnum values + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_PixelFormatEnumToMasks + */ +extern DECLSPEC Uint32 SDLCALL SDL_MasksToPixelFormatEnum(int bpp, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); + +/** + * Create an SDL_PixelFormat structure corresponding to a pixel format. + * + * Returned structure may come from a shared global cache (i.e. not newly + * allocated), and hence should not be modified, especially the palette. Weird + * errors such as `Blit combination not supported` may occur. + * + * \param pixel_format one of the SDL_PixelFormatEnum values + * \returns the new SDL_PixelFormat structure or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeFormat + */ +extern DECLSPEC SDL_PixelFormat * SDLCALL SDL_AllocFormat(Uint32 pixel_format); + +/** + * Free an SDL_PixelFormat structure allocated by SDL_AllocFormat(). + * + * \param format the SDL_PixelFormat structure to free + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + */ +extern DECLSPEC void SDLCALL SDL_FreeFormat(SDL_PixelFormat *format); + +/** + * Create a palette structure with the specified number of color entries. + * + * The palette entries are initialized to white. + * + * \param ncolors represents the number of color entries in the color palette + * \returns a new SDL_Palette structure on success or NULL on failure (e.g. if + * there wasn't enough memory); call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreePalette + */ +extern DECLSPEC SDL_Palette *SDLCALL SDL_AllocPalette(int ncolors); + +/** + * Set the palette for a pixel format structure. + * + * \param format the SDL_PixelFormat structure that will use the palette + * \param palette the SDL_Palette structure that will be used + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + * \sa SDL_FreePalette + */ +extern DECLSPEC int SDLCALL SDL_SetPixelFormatPalette(SDL_PixelFormat * format, + SDL_Palette *palette); + +/** + * Set a range of colors in a palette. + * + * \param palette the SDL_Palette structure to modify + * \param colors an array of SDL_Color structures to copy into the palette + * \param firstcolor the index of the first palette entry to modify + * \param ncolors the number of entries to modify + * \returns 0 on success or a negative error code if not all of the colors + * could be set; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC int SDLCALL SDL_SetPaletteColors(SDL_Palette * palette, + const SDL_Color * colors, + int firstcolor, int ncolors); + +/** + * Free a palette created with SDL_AllocPalette(). + * + * \param palette the SDL_Palette structure to be freed + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocPalette + */ +extern DECLSPEC void SDLCALL SDL_FreePalette(SDL_Palette * palette); + +/** + * Map an RGB triple to an opaque pixel value for a given pixel format. + * + * This function maps the RGB color value to the specified pixel format and + * returns the pixel value best approximating the given RGB color value for + * the given pixel format. + * + * If the format has a palette (8-bit) the index of the closest matching color + * in the palette will be returned. + * + * If the specified pixel format has an alpha component it will be returned as + * all 1 bits (fully opaque). + * + * If the pixel format bpp (color depth) is less than 32-bpp then the unused + * upper bits of the return value can safely be ignored (e.g., with a 16-bpp + * format the return value can be assigned to a Uint16, and similarly a Uint8 + * for an 8-bpp format). + * + * \param format an SDL_PixelFormat structure describing the pixel format + * \param r the red component of the pixel in the range 0-255 + * \param g the green component of the pixel in the range 0-255 + * \param b the blue component of the pixel in the range 0-255 + * \returns a pixel value + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_GetRGBA + * \sa SDL_MapRGBA + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b); + +/** + * Map an RGBA quadruple to a pixel value for a given pixel format. + * + * This function maps the RGBA color value to the specified pixel format and + * returns the pixel value best approximating the given RGBA color value for + * the given pixel format. + * + * If the specified pixel format has no alpha component the alpha value will + * be ignored (as it will be in formats with a palette). + * + * If the format has a palette (8-bit) the index of the closest matching color + * in the palette will be returned. + * + * If the pixel format bpp (color depth) is less than 32-bpp then the unused + * upper bits of the return value can safely be ignored (e.g., with a 16-bpp + * format the return value can be assigned to a Uint16, and similarly a Uint8 + * for an 8-bpp format). + * + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r the red component of the pixel in the range 0-255 + * \param g the green component of the pixel in the range 0-255 + * \param b the blue component of the pixel in the range 0-255 + * \param a the alpha component of the pixel in the range 0-255 + * \returns a pixel value + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_GetRGBA + * \sa SDL_MapRGB + */ +extern DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormat * format, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * Get RGB values from a pixel in the specified format. + * + * This function uses the entire 8-bit [0..255] range when converting color + * components from pixel formats with less than 8-bits per RGB component + * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, + * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). + * + * \param pixel a pixel value + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r a pointer filled in with the red component + * \param g a pointer filled in with the green component + * \param b a pointer filled in with the blue component + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGBA + * \sa SDL_MapRGB + * \sa SDL_MapRGBA + */ +extern DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b); + +/** + * Get RGBA values from a pixel in the specified format. + * + * This function uses the entire 8-bit [0..255] range when converting color + * components from pixel formats with less than 8-bits per RGB component + * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, + * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). + * + * If the surface has no alpha component, the alpha will be returned as 0xff + * (100% opaque). + * + * \param pixel a pixel value + * \param format an SDL_PixelFormat structure describing the format of the + * pixel + * \param r a pointer filled in with the red component + * \param g a pointer filled in with the green component + * \param b a pointer filled in with the blue component + * \param a a pointer filled in with the alpha component + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRGB + * \sa SDL_MapRGB + * \sa SDL_MapRGBA + */ +extern DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, + const SDL_PixelFormat * format, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * Calculate a 256 entry gamma ramp for a gamma value. + * + * \param gamma a gamma value where 0.0 is black and 1.0 is identity + * \param ramp an array of 256 values filled in with the gamma ramp + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC void SDLCALL SDL_CalculateGammaRamp(float gamma, Uint16 * ramp); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_pixels_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_platform.h b/include/SDL/SDL_platform.h new file mode 100644 index 0000000..d2a7e05 --- /dev/null +++ b/include/SDL/SDL_platform.h @@ -0,0 +1,261 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_platform.h + * + * Try to get a standard set of platform defines. + */ + +#ifndef SDL_platform_h_ +#define SDL_platform_h_ + +#if defined(_AIX) +#undef __AIX__ +#define __AIX__ 1 +#endif +#if defined(__HAIKU__) +#undef __HAIKU__ +#define __HAIKU__ 1 +#endif +#if defined(bsdi) || defined(__bsdi) || defined(__bsdi__) +#undef __BSDI__ +#define __BSDI__ 1 +#endif +#if defined(_arch_dreamcast) +#undef __DREAMCAST__ +#define __DREAMCAST__ 1 +#endif +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) +#undef __FREEBSD__ +#define __FREEBSD__ 1 +#endif +#if defined(hpux) || defined(__hpux) || defined(__hpux__) +#undef __HPUX__ +#define __HPUX__ 1 +#endif +#if defined(sgi) || defined(__sgi) || defined(__sgi__) || defined(_SGI_SOURCE) +#undef __IRIX__ +#define __IRIX__ 1 +#endif +#if (defined(linux) || defined(__linux) || defined(__linux__)) +#undef __LINUX__ +#define __LINUX__ 1 +#endif +#if defined(ANDROID) || defined(__ANDROID__) +#undef __ANDROID__ +#undef __LINUX__ /* do we need to do this? */ +#define __ANDROID__ 1 +#endif +#if defined(__NGAGE__) +#undef __NGAGE__ +#define __NGAGE__ 1 +#endif + +#if defined(__APPLE__) +/* lets us know what version of Mac OS X we're compiling on */ +#include +#include + +/* Fix building with older SDKs that don't define these + See this for more information: + https://stackoverflow.com/questions/12132933/preprocessor-macro-for-os-x-targets +*/ +#ifndef TARGET_OS_MACCATALYST +#define TARGET_OS_MACCATALYST 0 +#endif +#ifndef TARGET_OS_IOS +#define TARGET_OS_IOS 0 +#endif +#ifndef TARGET_OS_IPHONE +#define TARGET_OS_IPHONE 0 +#endif +#ifndef TARGET_OS_TV +#define TARGET_OS_TV 0 +#endif +#ifndef TARGET_OS_SIMULATOR +#define TARGET_OS_SIMULATOR 0 +#endif + +#if TARGET_OS_TV +#undef __TVOS__ +#define __TVOS__ 1 +#endif +#if TARGET_OS_IPHONE +/* if compiling for iOS */ +#undef __IPHONEOS__ +#define __IPHONEOS__ 1 +#undef __MACOSX__ +#else +/* if not compiling for iOS */ +#undef __MACOSX__ +#define __MACOSX__ 1 +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070 +# error SDL for Mac OS X only supports deploying on 10.7 and above. +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1070 */ +#endif /* TARGET_OS_IPHONE */ +#endif /* defined(__APPLE__) */ + +#if defined(__NetBSD__) +#undef __NETBSD__ +#define __NETBSD__ 1 +#endif +#if defined(__OpenBSD__) +#undef __OPENBSD__ +#define __OPENBSD__ 1 +#endif +#if defined(__OS2__) || defined(__EMX__) +#undef __OS2__ +#define __OS2__ 1 +#endif +#if defined(osf) || defined(__osf) || defined(__osf__) || defined(_OSF_SOURCE) +#undef __OSF__ +#define __OSF__ 1 +#endif +#if defined(__QNXNTO__) +#undef __QNXNTO__ +#define __QNXNTO__ 1 +#endif +#if defined(riscos) || defined(__riscos) || defined(__riscos__) +#undef __RISCOS__ +#define __RISCOS__ 1 +#endif +#if defined(__sun) && defined(__SVR4) +#undef __SOLARIS__ +#define __SOLARIS__ 1 +#endif + +#if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(__MINGW32__) +/* Try to find out if we're compiling for WinRT, GDK or non-WinRT/GDK */ +#if defined(_MSC_VER) && defined(__has_include) +#if __has_include() +#define HAVE_WINAPIFAMILY_H 1 +#else +#define HAVE_WINAPIFAMILY_H 0 +#endif + +/* If _USING_V110_SDK71_ is defined it means we are using the Windows XP toolset. */ +#elif defined(_MSC_VER) && (_MSC_VER >= 1700 && !_USING_V110_SDK71_) /* _MSC_VER == 1700 for Visual Studio 2012 */ +#define HAVE_WINAPIFAMILY_H 1 +#else +#define HAVE_WINAPIFAMILY_H 0 +#endif + +#if HAVE_WINAPIFAMILY_H +#include +#define WINAPI_FAMILY_WINRT (!WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)) +#else +#define WINAPI_FAMILY_WINRT 0 +#endif /* HAVE_WINAPIFAMILY_H */ + +#if WINAPI_FAMILY_WINRT +#undef __WINRT__ +#define __WINRT__ 1 +#elif defined(_GAMING_DESKTOP) /* GDK project configuration always defines _GAMING_XXX */ +#undef __WINGDK__ +#define __WINGDK__ 1 +#elif defined(_GAMING_XBOX_XBOXONE) +#undef __XBOXONE__ +#define __XBOXONE__ 1 +#elif defined(_GAMING_XBOX_SCARLETT) +#undef __XBOXSERIES__ +#define __XBOXSERIES__ 1 +#else +#undef __WINDOWS__ +#define __WINDOWS__ 1 +#endif +#endif /* defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) */ + +#if defined(__WINDOWS__) +#undef __WIN32__ +#define __WIN32__ 1 +#endif +/* This is to support generic "any GDK" separate from a platform-specific GDK */ +#if defined(__WINGDK__) || defined(__XBOXONE__) || defined(__XBOXSERIES__) +#undef __GDK__ +#define __GDK__ 1 +#endif +#if defined(__PSP__) +#undef __PSP__ +#define __PSP__ 1 +#endif +#if defined(PS2) +#define __PS2__ 1 +#endif + +/* The NACL compiler defines __native_client__ and __pnacl__ + * Ref: http://www.chromium.org/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi + */ +#if defined(__native_client__) +#undef __LINUX__ +#undef __NACL__ +#define __NACL__ 1 +#endif +#if defined(__pnacl__) +#undef __LINUX__ +#undef __PNACL__ +#define __PNACL__ 1 +/* PNACL with newlib supports static linking only */ +#define __SDL_NOGETPROCADDR__ +#endif + +#if defined(__vita__) +#define __VITA__ 1 +#endif + +#if defined(__3DS__) +#undef __3DS__ +#define __3DS__ 1 +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the name of the platform. + * + * Here are the names returned for some (but not all) supported platforms: + * + * - "Windows" + * - "Mac OS X" + * - "Linux" + * - "iOS" + * - "Android" + * + * \returns the name of the platform. If the correct platform name is not + * available, returns a string beginning with the text "Unknown". + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC const char * SDLCALL SDL_GetPlatform (void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_platform_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_power.h b/include/SDL/SDL_power.h new file mode 100644 index 0000000..be06c8b --- /dev/null +++ b/include/SDL/SDL_power.h @@ -0,0 +1,88 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_power_h_ +#define SDL_power_h_ + +/** + * \file SDL_power.h + * + * Header for the SDL power management routines. + */ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The basic state for the system's power supply. + */ +typedef enum +{ + SDL_POWERSTATE_UNKNOWN, /**< cannot determine power status */ + SDL_POWERSTATE_ON_BATTERY, /**< Not plugged in, running on the battery */ + SDL_POWERSTATE_NO_BATTERY, /**< Plugged in, no battery available */ + SDL_POWERSTATE_CHARGING, /**< Plugged in, charging battery */ + SDL_POWERSTATE_CHARGED /**< Plugged in, battery charged */ +} SDL_PowerState; + + +/** + * Get the current power supply details. + * + * You should never take a battery status as absolute truth. Batteries + * (especially failing batteries) are delicate hardware, and the values + * reported here are best estimates based on what that hardware reports. It's + * not uncommon for older batteries to lose stored power much faster than it + * reports, or completely drain when reporting it has 20 percent left, etc. + * + * Battery status can change at any time; if you are concerned with power + * state, you should call this function frequently, and perhaps ignore changes + * until they seem to be stable for a few seconds. + * + * It's possible a platform can only report battery percentage or time left + * but not both. + * + * \param secs seconds of battery life left, you can pass a NULL here if you + * don't care, will return -1 if we can't determine a value, or + * we're not running on a battery + * \param pct percentage of battery life left, between 0 and 100, you can pass + * a NULL here if you don't care, will return -1 if we can't + * determine a value, or we're not running on a battery + * \returns an SDL_PowerState enum representing the current battery state. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_PowerState SDLCALL SDL_GetPowerInfo(int *secs, int *pct); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_power_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_quit.h b/include/SDL/SDL_quit.h new file mode 100644 index 0000000..d8ceb89 --- /dev/null +++ b/include/SDL/SDL_quit.h @@ -0,0 +1,58 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_quit.h + * + * Include file for SDL quit event handling. + */ + +#ifndef SDL_quit_h_ +#define SDL_quit_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/** + * \file SDL_quit.h + * + * An ::SDL_QUIT event is generated when the user tries to close the application + * window. If it is ignored or filtered out, the window will remain open. + * If it is not ignored or filtered, it is queued normally and the window + * is allowed to close. When the window is closed, screen updates will + * complete, but have no effect. + * + * SDL_Init() installs signal handlers for SIGINT (keyboard interrupt) + * and SIGTERM (system termination request), if handlers do not already + * exist, that generate ::SDL_QUIT events as well. There is no way + * to determine the cause of an ::SDL_QUIT event, but setting a signal + * handler in your application will override the default generation of + * quit events for that signal. + * + * \sa SDL_Quit() + */ + +/* There are no functions directly affecting the quit event */ + +#define SDL_QuitRequested() \ + (SDL_PumpEvents(), (SDL_PeepEvents(NULL,0,SDL_PEEKEVENT,SDL_QUIT,SDL_QUIT) > 0)) + +#endif /* SDL_quit_h_ */ diff --git a/include/SDL/SDL_rect.h b/include/SDL/SDL_rect.h new file mode 100644 index 0000000..9611a31 --- /dev/null +++ b/include/SDL/SDL_rect.h @@ -0,0 +1,376 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_rect.h + * + * Header file for SDL_rect definition and management functions. + */ + +#ifndef SDL_rect_h_ +#define SDL_rect_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_pixels.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * The structure that defines a point (integer) + * + * \sa SDL_EnclosePoints + * \sa SDL_PointInRect + */ +typedef struct SDL_Point +{ + int x; + int y; +} SDL_Point; + +/** + * The structure that defines a point (floating point) + * + * \sa SDL_EncloseFPoints + * \sa SDL_PointInFRect + */ +typedef struct SDL_FPoint +{ + float x; + float y; +} SDL_FPoint; + + +/** + * A rectangle, with the origin at the upper left (integer). + * + * \sa SDL_RectEmpty + * \sa SDL_RectEquals + * \sa SDL_HasIntersection + * \sa SDL_IntersectRect + * \sa SDL_IntersectRectAndLine + * \sa SDL_UnionRect + * \sa SDL_EnclosePoints + */ +typedef struct SDL_Rect +{ + int x, y; + int w, h; +} SDL_Rect; + + +/** + * A rectangle, with the origin at the upper left (floating point). + * + * \sa SDL_FRectEmpty + * \sa SDL_FRectEquals + * \sa SDL_FRectEqualsEpsilon + * \sa SDL_HasIntersectionF + * \sa SDL_IntersectFRect + * \sa SDL_IntersectFRectAndLine + * \sa SDL_UnionFRect + * \sa SDL_EncloseFPoints + * \sa SDL_PointInFRect + */ +typedef struct SDL_FRect +{ + float x; + float y; + float w; + float h; +} SDL_FRect; + + +/** + * Returns true if point resides inside a rectangle. + */ +SDL_FORCE_INLINE SDL_bool SDL_PointInRect(const SDL_Point *p, const SDL_Rect *r) +{ + return ( (p->x >= r->x) && (p->x < (r->x + r->w)) && + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEmpty(const SDL_Rect *r) +{ + return ((!r) || (r->w <= 0) || (r->h <= 0)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal. + */ +SDL_FORCE_INLINE SDL_bool SDL_RectEquals(const SDL_Rect *a, const SDL_Rect *b) +{ + return (a && b && (a->x == b->x) && (a->y == b->y) && + (a->w == b->w) && (a->h == b->h)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Determine whether two rectangles intersect. + * + * If either pointer is NULL the function will return SDL_FALSE. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_IntersectRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersection(const SDL_Rect * A, + const SDL_Rect * B); + +/** + * Calculate the intersection of two rectangles. + * + * If `result` is NULL then this function will return SDL_FALSE. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \param result an SDL_Rect structure filled in with the intersection of + * rectangles `A` and `B` + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HasIntersection + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * Calculate the union of two rectangles. + * + * \param A an SDL_Rect structure representing the first rectangle + * \param B an SDL_Rect structure representing the second rectangle + * \param result an SDL_Rect structure filled in with the union of rectangles + * `A` and `B` + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_UnionRect(const SDL_Rect * A, + const SDL_Rect * B, + SDL_Rect * result); + +/** + * Calculate a minimal rectangle enclosing a set of points. + * + * If `clip` is not NULL then only points inside of the clipping rectangle are + * considered. + * + * \param points an array of SDL_Point structures representing points to be + * enclosed + * \param count the number of structures in the `points` array + * \param clip an SDL_Rect used for clipping or NULL to enclose all points + * \param result an SDL_Rect structure filled in with the minimal enclosing + * rectangle + * \returns SDL_TRUE if any points were enclosed or SDL_FALSE if all the + * points were outside of the clipping rectangle. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EnclosePoints(const SDL_Point * points, + int count, + const SDL_Rect * clip, + SDL_Rect * result); + +/** + * Calculate the intersection of a rectangle and line segment. + * + * This function is used to clip a line segment to a rectangle. A line segment + * contained entirely within the rectangle or that does not intersect will + * remain unchanged. A line segment that crosses the rectangle at either or + * both ends will be clipped to the boundary of the rectangle and the new + * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary. + * + * \param rect an SDL_Rect structure representing the rectangle to intersect + * \param X1 a pointer to the starting X-coordinate of the line + * \param Y1 a pointer to the starting Y-coordinate of the line + * \param X2 a pointer to the ending X-coordinate of the line + * \param Y2 a pointer to the ending Y-coordinate of the line + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectRectAndLine(const SDL_Rect * + rect, int *X1, + int *Y1, int *X2, + int *Y2); + + +/* SDL_FRect versions... */ + +/** + * Returns true if point resides inside a rectangle. + */ +SDL_FORCE_INLINE SDL_bool SDL_PointInFRect(const SDL_FPoint *p, const SDL_FRect *r) +{ + return ( (p->x >= r->x) && (p->x < (r->x + r->w)) && + (p->y >= r->y) && (p->y < (r->y + r->h)) ) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the rectangle has no area. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEmpty(const SDL_FRect *r) +{ + return ((!r) || (r->w <= 0.0f) || (r->h <= 0.0f)) ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal, within some given epsilon. + * + * \since This function is available since SDL 2.0.22. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEqualsEpsilon(const SDL_FRect *a, const SDL_FRect *b, const float epsilon) +{ + return (a && b && ((a == b) || + ((SDL_fabsf(a->x - b->x) <= epsilon) && + (SDL_fabsf(a->y - b->y) <= epsilon) && + (SDL_fabsf(a->w - b->w) <= epsilon) && + (SDL_fabsf(a->h - b->h) <= epsilon)))) + ? SDL_TRUE : SDL_FALSE; +} + +/** + * Returns true if the two rectangles are equal, using a default epsilon. + * + * \since This function is available since SDL 2.0.22. + */ +SDL_FORCE_INLINE SDL_bool SDL_FRectEquals(const SDL_FRect *a, const SDL_FRect *b) +{ + return SDL_FRectEqualsEpsilon(a, b, SDL_FLT_EPSILON); +} + +/** + * Determine whether two rectangles intersect with float precision. + * + * If either pointer is NULL the function will return SDL_FALSE. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_IntersectRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasIntersectionF(const SDL_FRect * A, + const SDL_FRect * B); + +/** + * Calculate the intersection of two rectangles with float precision. + * + * If `result` is NULL then this function will return SDL_FALSE. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \param result an SDL_FRect structure filled in with the intersection of + * rectangles `A` and `B` + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + * + * \sa SDL_HasIntersectionF + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectFRect(const SDL_FRect * A, + const SDL_FRect * B, + SDL_FRect * result); + +/** + * Calculate the union of two rectangles with float precision. + * + * \param A an SDL_FRect structure representing the first rectangle + * \param B an SDL_FRect structure representing the second rectangle + * \param result an SDL_FRect structure filled in with the union of rectangles + * `A` and `B` + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC void SDLCALL SDL_UnionFRect(const SDL_FRect * A, + const SDL_FRect * B, + SDL_FRect * result); + +/** + * Calculate a minimal rectangle enclosing a set of points with float + * precision. + * + * If `clip` is not NULL then only points inside of the clipping rectangle are + * considered. + * + * \param points an array of SDL_FPoint structures representing points to be + * enclosed + * \param count the number of structures in the `points` array + * \param clip an SDL_FRect used for clipping or NULL to enclose all points + * \param result an SDL_FRect structure filled in with the minimal enclosing + * rectangle + * \returns SDL_TRUE if any points were enclosed or SDL_FALSE if all the + * points were outside of the clipping rectangle. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_EncloseFPoints(const SDL_FPoint * points, + int count, + const SDL_FRect * clip, + SDL_FRect * result); + +/** + * Calculate the intersection of a rectangle and line segment with float + * precision. + * + * This function is used to clip a line segment to a rectangle. A line segment + * contained entirely within the rectangle or that does not intersect will + * remain unchanged. A line segment that crosses the rectangle at either or + * both ends will be clipped to the boundary of the rectangle and the new + * coordinates saved in `X1`, `Y1`, `X2`, and/or `Y2` as necessary. + * + * \param rect an SDL_FRect structure representing the rectangle to intersect + * \param X1 a pointer to the starting X-coordinate of the line + * \param Y1 a pointer to the starting Y-coordinate of the line + * \param X2 a pointer to the ending X-coordinate of the line + * \param Y2 a pointer to the ending Y-coordinate of the line + * \returns SDL_TRUE if there is an intersection, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IntersectFRectAndLine(const SDL_FRect * + rect, float *X1, + float *Y1, float *X2, + float *Y2); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_rect_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_render.h b/include/SDL/SDL_render.h new file mode 100644 index 0000000..c729501 --- /dev/null +++ b/include/SDL/SDL_render.h @@ -0,0 +1,1919 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_render.h + * + * Header file for SDL 2D rendering functions. + * + * This API supports the following features: + * * single pixel points + * * single pixel lines + * * filled rectangles + * * texture images + * + * The primitives may be drawn in opaque, blended, or additive modes. + * + * The texture images may be drawn in opaque, blended, or additive modes. + * They can have an additional color tint or alpha modulation applied to + * them, and may also be stretched with linear interpolation. + * + * This API is designed to accelerate simple 2D operations. You may + * want more functionality such as polygons and particle effects and + * in that case you should use SDL's OpenGL/Direct3D support or one + * of the many good 3D engines. + * + * These functions must be called from the main thread. + * See this bug for details: http://bugzilla.libsdl.org/show_bug.cgi?id=1995 + */ + +#ifndef SDL_render_h_ +#define SDL_render_h_ + +#include "SDL_stdinc.h" +#include "SDL_rect.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Flags used when creating a rendering context + */ +typedef enum +{ + SDL_RENDERER_SOFTWARE = 0x00000001, /**< The renderer is a software fallback */ + SDL_RENDERER_ACCELERATED = 0x00000002, /**< The renderer uses hardware + acceleration */ + SDL_RENDERER_PRESENTVSYNC = 0x00000004, /**< Present is synchronized + with the refresh rate */ + SDL_RENDERER_TARGETTEXTURE = 0x00000008 /**< The renderer supports + rendering to texture */ +} SDL_RendererFlags; + +/** + * Information on the capabilities of a render driver or context. + */ +typedef struct SDL_RendererInfo +{ + const char *name; /**< The name of the renderer */ + Uint32 flags; /**< Supported ::SDL_RendererFlags */ + Uint32 num_texture_formats; /**< The number of available texture formats */ + Uint32 texture_formats[16]; /**< The available texture formats */ + int max_texture_width; /**< The maximum texture width */ + int max_texture_height; /**< The maximum texture height */ +} SDL_RendererInfo; + +/** + * Vertex structure + */ +typedef struct SDL_Vertex +{ + SDL_FPoint position; /**< Vertex position, in SDL_Renderer coordinates */ + SDL_Color color; /**< Vertex color */ + SDL_FPoint tex_coord; /**< Normalized texture coordinates, if needed */ +} SDL_Vertex; + +/** + * The scaling mode for a texture. + */ +typedef enum +{ + SDL_ScaleModeNearest, /**< nearest pixel sampling */ + SDL_ScaleModeLinear, /**< linear filtering */ + SDL_ScaleModeBest /**< anisotropic filtering */ +} SDL_ScaleMode; + +/** + * The access pattern allowed for a texture. + */ +typedef enum +{ + SDL_TEXTUREACCESS_STATIC, /**< Changes rarely, not lockable */ + SDL_TEXTUREACCESS_STREAMING, /**< Changes frequently, lockable */ + SDL_TEXTUREACCESS_TARGET /**< Texture can be used as a render target */ +} SDL_TextureAccess; + +/** + * The texture channel modulation used in SDL_RenderCopy(). + */ +typedef enum +{ + SDL_TEXTUREMODULATE_NONE = 0x00000000, /**< No modulation */ + SDL_TEXTUREMODULATE_COLOR = 0x00000001, /**< srcC = srcC * color */ + SDL_TEXTUREMODULATE_ALPHA = 0x00000002 /**< srcA = srcA * alpha */ +} SDL_TextureModulate; + +/** + * Flip constants for SDL_RenderCopyEx + */ +typedef enum +{ + SDL_FLIP_NONE = 0x00000000, /**< Do not flip */ + SDL_FLIP_HORIZONTAL = 0x00000001, /**< flip horizontally */ + SDL_FLIP_VERTICAL = 0x00000002 /**< flip vertically */ +} SDL_RendererFlip; + +/** + * A structure representing rendering state + */ +struct SDL_Renderer; +typedef struct SDL_Renderer SDL_Renderer; + +/** + * An efficient driver-specific representation of pixel data + */ +struct SDL_Texture; +typedef struct SDL_Texture SDL_Texture; + +/* Function prototypes */ + +/** + * Get the number of 2D rendering drivers available for the current display. + * + * A render driver is a set of code that handles rendering and texture + * management on a particular display. Normally there is only one, but some + * drivers may have several available with different capabilities. + * + * There may be none if SDL was compiled without render support. + * + * \returns a number >= 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_GetRenderDriverInfo + */ +extern DECLSPEC int SDLCALL SDL_GetNumRenderDrivers(void); + +/** + * Get info about a specific 2D rendering driver for the current display. + * + * \param index the index of the driver to query information about + * \param info an SDL_RendererInfo structure to be filled with information on + * the rendering driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_GetNumRenderDrivers + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDriverInfo(int index, + SDL_RendererInfo * info); + +/** + * Create a window and default renderer. + * + * \param width the width of the window + * \param height the height of the window + * \param window_flags the flags used to create the window (see + * SDL_CreateWindow()) + * \param window a pointer filled with the window, or NULL on error + * \param renderer a pointer filled with the renderer, or NULL on error + * \returns 0 on success, or -1 on error; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_CreateWindow + */ +extern DECLSPEC int SDLCALL SDL_CreateWindowAndRenderer( + int width, int height, Uint32 window_flags, + SDL_Window **window, SDL_Renderer **renderer); + + +/** + * Create a 2D rendering context for a window. + * + * \param window the window where rendering is displayed + * \param index the index of the rendering driver to initialize, or -1 to + * initialize the first one supporting the requested flags + * \param flags 0, or one or more SDL_RendererFlags OR'd together + * \returns a valid rendering context or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateSoftwareRenderer + * \sa SDL_DestroyRenderer + * \sa SDL_GetNumRenderDrivers + * \sa SDL_GetRendererInfo + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * window, + int index, Uint32 flags); + +/** + * Create a 2D software rendering context for a surface. + * + * Two other API which can be used to create SDL_Renderer: + * SDL_CreateRenderer() and SDL_CreateWindowAndRenderer(). These can _also_ + * create a software renderer, but they are intended to be used with an + * SDL_Window as the final destination and not an SDL_Surface. + * + * \param surface the SDL_Surface structure representing the surface where + * rendering is done + * \returns a valid rendering context or NULL if there was an error; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + * \sa SDL_CreateWindowRenderer + * \sa SDL_DestroyRenderer + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateSoftwareRenderer(SDL_Surface * surface); + +/** + * Get the renderer associated with a window. + * + * \param window the window to query + * \returns the rendering context on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC SDL_Renderer * SDLCALL SDL_GetRenderer(SDL_Window * window); + +/** + * Get the window associated with a renderer. + * + * \param renderer the renderer to query + * \returns the window on success or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_RenderGetWindow(SDL_Renderer *renderer); + +/** + * Get information about a rendering context. + * + * \param renderer the rendering context + * \param info an SDL_RendererInfo structure filled with information about the + * current renderer + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC int SDLCALL SDL_GetRendererInfo(SDL_Renderer * renderer, + SDL_RendererInfo * info); + +/** + * Get the output size in pixels of a rendering context. + * + * Due to high-dpi displays, you might end up with a rendering context that + * has more pixels than the window that contains it, so use this instead of + * SDL_GetWindowSize() to decide how much drawing area you have. + * + * \param renderer the rendering context + * \param w an int filled with the width + * \param h an int filled with the height + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderer + */ +extern DECLSPEC int SDLCALL SDL_GetRendererOutputSize(SDL_Renderer * renderer, + int *w, int *h); + +/** + * Create a texture for a rendering context. + * + * You can set the texture scaling method by setting + * `SDL_HINT_RENDER_SCALE_QUALITY` before creating the texture. + * + * \param renderer the rendering context + * \param format one of the enumerated values in SDL_PixelFormatEnum + * \param access one of the enumerated values in SDL_TextureAccess + * \param w the width of the texture in pixels + * \param h the height of the texture in pixels + * \returns a pointer to the created texture or NULL if no rendering context + * was active, the format was unsupported, or the width or height + * were out of range; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTextureFromSurface + * \sa SDL_DestroyTexture + * \sa SDL_QueryTexture + * \sa SDL_UpdateTexture + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer, + Uint32 format, + int access, int w, + int h); + +/** + * Create a texture from an existing surface. + * + * The surface is not modified or freed by this function. + * + * The SDL_TextureAccess hint for the created texture is + * `SDL_TEXTUREACCESS_STATIC`. + * + * The pixel format of the created texture may be different from the pixel + * format of the surface. Use SDL_QueryTexture() to query the pixel format of + * the texture. + * + * \param renderer the rendering context + * \param surface the SDL_Surface structure containing pixel data used to fill + * the texture + * \returns the created texture or NULL on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_DestroyTexture + * \sa SDL_QueryTexture + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface); + +/** + * Query the attributes of a texture. + * + * \param texture the texture to query + * \param format a pointer filled in with the raw format of the texture; the + * actual format may differ, but pixel transfers will use this + * format (one of the SDL_PixelFormatEnum values). This argument + * can be NULL if you don't need this information. + * \param access a pointer filled in with the actual access to the texture + * (one of the SDL_TextureAccess values). This argument can be + * NULL if you don't need this information. + * \param w a pointer filled in with the width of the texture in pixels. This + * argument can be NULL if you don't need this information. + * \param h a pointer filled in with the height of the texture in pixels. This + * argument can be NULL if you don't need this information. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + */ +extern DECLSPEC int SDLCALL SDL_QueryTexture(SDL_Texture * texture, + Uint32 * format, int *access, + int *w, int *h); + +/** + * Set an additional color value multiplied into render copy operations. + * + * When this texture is rendered, during the copy operation each source color + * channel is modulated by the appropriate color value according to the + * following formula: + * + * `srcC = srcC * (color / 255)` + * + * Color modulation is not always supported by the renderer; it will return -1 + * if color modulation is not supported. + * + * \param texture the texture to update + * \param r the red color value multiplied into copy operations + * \param g the green color value multiplied into copy operations + * \param b the blue color value multiplied into copy operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureColorMod + * \sa SDL_SetTextureAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_SetTextureColorMod(SDL_Texture * texture, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * Get the additional color value multiplied into render copy operations. + * + * \param texture the texture to query + * \param r a pointer filled in with the current red color value + * \param g a pointer filled in with the current green color value + * \param b a pointer filled in with the current blue color value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureAlphaMod + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_GetTextureColorMod(SDL_Texture * texture, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * Set an additional alpha value multiplied into render copy operations. + * + * When this texture is rendered, during the copy operation the source alpha + * value is modulated by this alpha value according to the following formula: + * + * `srcA = srcA * (alpha / 255)` + * + * Alpha modulation is not always supported by the renderer; it will return -1 + * if alpha modulation is not supported. + * + * \param texture the texture to update + * \param alpha the source alpha value multiplied into copy operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureAlphaMod + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture, + Uint8 alpha); + +/** + * Get the additional alpha value multiplied into render copy operations. + * + * \param texture the texture to query + * \param alpha a pointer filled in with the current alpha value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureColorMod + * \sa SDL_SetTextureAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_GetTextureAlphaMod(SDL_Texture * texture, + Uint8 * alpha); + +/** + * Set the blend mode for a texture, used by SDL_RenderCopy(). + * + * If the blend mode is not supported, the closest supported mode is chosen + * and this function returns -1. + * + * \param texture the texture to update + * \param blendMode the SDL_BlendMode to use for texture blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTextureBlendMode + * \sa SDL_RenderCopy + */ +extern DECLSPEC int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for texture copy operations. + * + * \param texture the texture to query + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetTextureBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetTextureBlendMode(SDL_Texture * texture, + SDL_BlendMode *blendMode); + +/** + * Set the scale mode used for texture scale operations. + * + * If the scale mode is not supported, the closest supported mode is chosen. + * + * \param texture The texture to update. + * \param scaleMode the SDL_ScaleMode to use for texture scaling. + * \returns 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_GetTextureScaleMode + */ +extern DECLSPEC int SDLCALL SDL_SetTextureScaleMode(SDL_Texture * texture, + SDL_ScaleMode scaleMode); + +/** + * Get the scale mode used for texture scale operations. + * + * \param texture the texture to query. + * \param scaleMode a pointer filled in with the current scale mode. + * \return 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_SetTextureScaleMode + */ +extern DECLSPEC int SDLCALL SDL_GetTextureScaleMode(SDL_Texture * texture, + SDL_ScaleMode *scaleMode); + +/** + * Associate a user-specified pointer with a texture. + * + * \param texture the texture to update. + * \param userdata the pointer to associate with the texture. + * \returns 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GetTextureUserData + */ +extern DECLSPEC int SDLCALL SDL_SetTextureUserData(SDL_Texture * texture, + void *userdata); + +/** + * Get the user-specified pointer associated with a texture + * + * \param texture the texture to query. + * \return the pointer associated with the texture, or NULL if the texture is + * not valid. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_SetTextureUserData + */ +extern DECLSPEC void * SDLCALL SDL_GetTextureUserData(SDL_Texture * texture); + +/** + * Update the given texture rectangle with new pixel data. + * + * The pixel data must be in the pixel format of the texture. Use + * SDL_QueryTexture() to query the pixel format of the texture. + * + * This is a fairly slow function, intended for use with static textures that + * do not change often. + * + * If the texture is intended to be updated often, it is preferred to create + * the texture as streaming and use the locking functions referenced below. + * While this function will work with streaming textures, for optimization + * reasons you may not get the pixels back if you lock the texture afterward. + * + * \param texture the texture to update + * \param rect an SDL_Rect structure representing the area to update, or NULL + * to update the entire texture + * \param pixels the raw pixel data in the format of the texture + * \param pitch the number of bytes in a row of pixel data, including padding + * between lines + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_LockTexture + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_UpdateTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const void *pixels, int pitch); + +/** + * Update a rectangle within a planar YV12 or IYUV texture with new pixel + * data. + * + * You can use SDL_UpdateTexture() as long as your pixel data is a contiguous + * block of Y and U/V planes in the proper order, but this function is + * available if your pixel data is not contiguous. + * + * \param texture the texture to update + * \param rect a pointer to the rectangle of pixels to update, or NULL to + * update the entire texture + * \param Yplane the raw pixel data for the Y plane + * \param Ypitch the number of bytes between rows of pixel data for the Y + * plane + * \param Uplane the raw pixel data for the U plane + * \param Upitch the number of bytes between rows of pixel data for the U + * plane + * \param Vplane the raw pixel data for the V plane + * \param Vpitch the number of bytes between rows of pixel data for the V + * plane + * \returns 0 on success or -1 if the texture is not valid; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_UpdateTexture + */ +extern DECLSPEC int SDLCALL SDL_UpdateYUVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *Uplane, int Upitch, + const Uint8 *Vplane, int Vpitch); + +/** + * Update a rectangle within a planar NV12 or NV21 texture with new pixels. + * + * You can use SDL_UpdateTexture() as long as your pixel data is a contiguous + * block of NV12/21 planes in the proper order, but this function is available + * if your pixel data is not contiguous. + * + * \param texture the texture to update + * \param rect a pointer to the rectangle of pixels to update, or NULL to + * update the entire texture. + * \param Yplane the raw pixel data for the Y plane. + * \param Ypitch the number of bytes between rows of pixel data for the Y + * plane. + * \param UVplane the raw pixel data for the UV plane. + * \param UVpitch the number of bytes between rows of pixel data for the UV + * plane. + * \return 0 on success, or -1 if the texture is not valid. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_UpdateNVTexture(SDL_Texture * texture, + const SDL_Rect * rect, + const Uint8 *Yplane, int Ypitch, + const Uint8 *UVplane, int UVpitch); + +/** + * Lock a portion of the texture for **write-only** pixel access. + * + * As an optimization, the pixels made available for editing don't necessarily + * contain the old texture data. This is a write-only operation, and if you + * need to keep a copy of the texture data you should do that at the + * application level. + * + * You must use SDL_UnlockTexture() to unlock the pixels and apply any + * changes. + * + * \param texture the texture to lock for access, which was created with + * `SDL_TEXTUREACCESS_STREAMING` + * \param rect an SDL_Rect structure representing the area to lock for access; + * NULL to lock the entire texture + * \param pixels this is filled in with a pointer to the locked pixels, + * appropriately offset by the locked area + * \param pitch this is filled in with the pitch of the locked pixels; the + * pitch is the length of one row in bytes + * \returns 0 on success or a negative error code if the texture is not valid + * or was not created with `SDL_TEXTUREACCESS_STREAMING`; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture, + const SDL_Rect * rect, + void **pixels, int *pitch); + +/** + * Lock a portion of the texture for **write-only** pixel access, and expose + * it as a SDL surface. + * + * Besides providing an SDL_Surface instead of raw pixel data, this function + * operates like SDL_LockTexture. + * + * As an optimization, the pixels made available for editing don't necessarily + * contain the old texture data. This is a write-only operation, and if you + * need to keep a copy of the texture data you should do that at the + * application level. + * + * You must use SDL_UnlockTexture() to unlock the pixels and apply any + * changes. + * + * The returned surface is freed internally after calling SDL_UnlockTexture() + * or SDL_DestroyTexture(). The caller should not free it. + * + * \param texture the texture to lock for access, which was created with + * `SDL_TEXTUREACCESS_STREAMING` + * \param rect a pointer to the rectangle to lock for access. If the rect is + * NULL, the entire texture will be locked + * \param surface this is filled in with an SDL surface representing the + * locked area + * \returns 0 on success, or -1 if the texture is not valid or was not created + * with `SDL_TEXTUREACCESS_STREAMING` + * + * \since This function is available since SDL 2.0.12. + * + * \sa SDL_LockTexture + * \sa SDL_UnlockTexture + */ +extern DECLSPEC int SDLCALL SDL_LockTextureToSurface(SDL_Texture *texture, + const SDL_Rect *rect, + SDL_Surface **surface); + +/** + * Unlock a texture, uploading the changes to video memory, if needed. + * + * **Warning**: Please note that SDL_LockTexture() is intended to be + * write-only; it will not guarantee the previous contents of the texture will + * be provided. You must fully initialize any area of a texture that you lock + * before unlocking it, as the pixels might otherwise be uninitialized memory. + * + * Which is to say: locking and immediately unlocking a texture can result in + * corrupted textures, depending on the renderer in use. + * + * \param texture a texture locked by SDL_LockTexture() + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockTexture + */ +extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture); + +/** + * Determine whether a renderer supports the use of render targets. + * + * \param renderer the renderer that will be checked + * \returns SDL_TRUE if supported or SDL_FALSE if not. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderTarget + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderTargetSupported(SDL_Renderer *renderer); + +/** + * Set a texture as the current rendering target. + * + * Before using this function, you should check the + * `SDL_RENDERER_TARGETTEXTURE` bit in the flags of SDL_RendererInfo to see if + * render targets are supported. + * + * The default render target is the window for which the renderer was created. + * To stop rendering to a texture and render to the window again, call this + * function with a NULL `texture`. + * + * \param renderer the rendering context + * \param texture the targeted texture, which must be created with the + * `SDL_TEXTUREACCESS_TARGET` flag, or NULL to render to the + * window instead of a texture. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderTarget + */ +extern DECLSPEC int SDLCALL SDL_SetRenderTarget(SDL_Renderer *renderer, + SDL_Texture *texture); + +/** + * Get the current render target. + * + * The default render target is the window for which the renderer was created, + * and is reported a NULL here. + * + * \param renderer the rendering context + * \returns the current render target or NULL for the default render target. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderTarget + */ +extern DECLSPEC SDL_Texture * SDLCALL SDL_GetRenderTarget(SDL_Renderer *renderer); + +/** + * Set a device independent resolution for rendering. + * + * This function uses the viewport and scaling functionality to allow a fixed + * logical resolution for rendering, regardless of the actual output + * resolution. If the actual output resolution doesn't have the same aspect + * ratio the output rendering will be centered within the output display. + * + * If the output display is a window, mouse and touch events in the window + * will be filtered and scaled so they seem to arrive within the logical + * resolution. The SDL_HINT_MOUSE_RELATIVE_SCALING hint controls whether + * relative motion events are also scaled. + * + * If this function results in scaling or subpixel drawing by the rendering + * backend, it will be handled using the appropriate quality hints. + * + * \param renderer the renderer for which resolution should be set + * \param w the width of the logical resolution + * \param h the height of the logical resolution + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetLogicalSize(SDL_Renderer * renderer, int w, int h); + +/** + * Get device independent resolution for rendering. + * + * When using the main rendering target (eg no target texture is set): this + * may return 0 for `w` and `h` if the SDL_Renderer has never had its logical + * size set by SDL_RenderSetLogicalSize(). Otherwise it returns the logical + * width and height. + * + * When using a target texture: Never return 0 for `w` and `h` at first. Then + * it returns the logical width and height that are set. + * + * \param renderer a rendering context + * \param w an int to be filled with the width + * \param h an int to be filled with the height + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h); + +/** + * Set whether to force integer scales for resolution-independent rendering. + * + * This function restricts the logical viewport to integer values - that is, + * when a resolution is between two multiples of a logical size, the viewport + * size is rounded down to the lower multiple. + * + * \param renderer the renderer for which integer scaling should be set + * \param enable enable or disable the integer scaling for rendering + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RenderGetIntegerScale + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetIntegerScale(SDL_Renderer * renderer, + SDL_bool enable); + +/** + * Get whether integer scales are forced for resolution-independent rendering. + * + * \param renderer the renderer from which integer scaling should be queried + * \returns SDL_TRUE if integer scales are forced or SDL_FALSE if not and on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RenderSetIntegerScale + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderGetIntegerScale(SDL_Renderer * renderer); + +/** + * Set the drawing area for rendering on the current target. + * + * When the window is resized, the viewport is reset to fill the entire new + * window size. + * + * \param renderer the rendering context + * \param rect the SDL_Rect structure representing the drawing area, or NULL + * to set the viewport to the entire target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetViewport + */ +extern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Get the drawing area for the current target. + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure filled in with the current drawing area + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetViewport + */ +extern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * Set the clip rectangle for rendering on the specified target. + * + * \param renderer the rendering context for which clip rectangle should be + * set + * \param rect an SDL_Rect structure representing the clip area, relative to + * the viewport, or NULL to disable clipping + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetClipRect + * \sa SDL_RenderIsClipEnabled + */ +extern DECLSPEC int SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Get the clip rectangle for the current target. + * + * \param renderer the rendering context from which clip rectangle should be + * queried + * \param rect an SDL_Rect structure filled in with the current clipping area + * or an empty rectangle if clipping is disabled + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderIsClipEnabled + * \sa SDL_RenderSetClipRect + */ +extern DECLSPEC void SDLCALL SDL_RenderGetClipRect(SDL_Renderer * renderer, + SDL_Rect * rect); + +/** + * Get whether clipping is enabled on the given renderer. + * + * \param renderer the renderer from which clip state should be queried + * \returns SDL_TRUE if clipping is enabled or SDL_FALSE if not; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_RenderGetClipRect + * \sa SDL_RenderSetClipRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RenderIsClipEnabled(SDL_Renderer * renderer); + + +/** + * Set the drawing scale for rendering on the current target. + * + * The drawing coordinates are scaled by the x/y scaling factors before they + * are used by the renderer. This allows resolution independent drawing with a + * single coordinate system. + * + * If this results in scaling or subpixel drawing by the rendering backend, it + * will be handled using the appropriate quality hints. For best results use + * integer scaling factors. + * + * \param renderer a rendering context + * \param scaleX the horizontal scaling factor + * \param scaleY the vertical scaling factor + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC int SDLCALL SDL_RenderSetScale(SDL_Renderer * renderer, + float scaleX, float scaleY); + +/** + * Get the drawing scale for the current target. + * + * \param renderer the renderer from which drawing scale should be queried + * \param scaleX a pointer filled in with the horizontal scaling factor + * \param scaleY a pointer filled in with the vertical scaling factor + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderSetScale + */ +extern DECLSPEC void SDLCALL SDL_RenderGetScale(SDL_Renderer * renderer, + float *scaleX, float *scaleY); + +/** + * Get logical coordinates of point in renderer when given real coordinates of + * point in window. + * + * Logical coordinates will differ from real coordinates when render is scaled + * and logical renderer size set + * + * \param renderer the renderer from which the logical coordinates should be + * calculated + * \param windowX the real X coordinate in the window + * \param windowY the real Y coordinate in the window + * \param logicalX the pointer filled with the logical x coordinate + * \param logicalY the pointer filled with the logical y coordinate + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetScale + * \sa SDL_RenderGetLogicalSize + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderWindowToLogical(SDL_Renderer * renderer, + int windowX, int windowY, + float *logicalX, float *logicalY); + + +/** + * Get real coordinates of point in window when given logical coordinates of + * point in renderer. + * + * Logical coordinates will differ from real coordinates when render is scaled + * and logical renderer size set + * + * \param renderer the renderer from which the window coordinates should be + * calculated + * \param logicalX the logical x coordinate + * \param logicalY the logical y coordinate + * \param windowX the pointer filled with the real X coordinate in the window + * \param windowY the pointer filled with the real Y coordinate in the window + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGetScale + * \sa SDL_RenderSetScale + * \sa SDL_RenderGetLogicalSize + * \sa SDL_RenderSetLogicalSize + */ +extern DECLSPEC void SDLCALL SDL_RenderLogicalToWindow(SDL_Renderer * renderer, + float logicalX, float logicalY, + int *windowX, int *windowY); + +/** + * Set the color used for drawing operations (Rect, Line and Clear). + * + * Set the color for drawing or filling rectangles, lines, and points, and for + * SDL_RenderClear(). + * + * \param renderer the rendering context + * \param r the red value used to draw on the rendering target + * \param g the green value used to draw on the rendering target + * \param b the blue value used to draw on the rendering target + * \param a the alpha value used to draw on the rendering target; usually + * `SDL_ALPHA_OPAQUE` (255). Use SDL_SetRenderDrawBlendMode to + * specify how the alpha channel is used + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderDrawColor + * \sa SDL_RenderClear + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawColor(SDL_Renderer * renderer, + Uint8 r, Uint8 g, Uint8 b, + Uint8 a); + +/** + * Get the color used for drawing operations (Rect, Line and Clear). + * + * \param renderer the rendering context + * \param r a pointer filled in with the red value used to draw on the + * rendering target + * \param g a pointer filled in with the green value used to draw on the + * rendering target + * \param b a pointer filled in with the blue value used to draw on the + * rendering target + * \param a a pointer filled in with the alpha value used to draw on the + * rendering target; usually `SDL_ALPHA_OPAQUE` (255) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawColor(SDL_Renderer * renderer, + Uint8 * r, Uint8 * g, Uint8 * b, + Uint8 * a); + +/** + * Set the blend mode used for drawing operations (Fill and Line). + * + * If the blend mode is not supported, the closest supported mode is chosen. + * + * \param renderer the rendering context + * \param blendMode the SDL_BlendMode to use for blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRenderDrawBlendMode + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + */ +extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for drawing operations. + * + * \param renderer the rendering context + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, + SDL_BlendMode *blendMode); + +/** + * Clear the current rendering target with the drawing color. + * + * This function clears the entire rendering target, ignoring the viewport and + * the clip rectangle. + * + * \param renderer the rendering context + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer); + +/** + * Draw a point on the current rendering target. + * + * SDL_RenderDrawPoint() draws a single point. If you want to draw multiple, + * use SDL_RenderDrawPoints() instead. + * + * \param renderer the rendering context + * \param x the x coordinate of the point + * \param y the y coordinate of the point + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoint(SDL_Renderer * renderer, + int x, int y); + +/** + * Draw multiple points on the current rendering target. + * + * \param renderer the rendering context + * \param points an array of SDL_Point structures that represent the points to + * draw + * \param count the number of points to draw + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * Draw a line on the current rendering target. + * + * SDL_RenderDrawLine() draws the line to include both end points. If you want + * to draw multiple, connecting lines use SDL_RenderDrawLines() instead. + * + * \param renderer the rendering context + * \param x1 the x coordinate of the start point + * \param y1 the y coordinate of the start point + * \param x2 the x coordinate of the end point + * \param y2 the y coordinate of the end point + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLine(SDL_Renderer * renderer, + int x1, int y1, int x2, int y2); + +/** + * Draw a series of connected lines on the current rendering target. + * + * \param renderer the rendering context + * \param points an array of SDL_Point structures representing points along + * the lines + * \param count the number of points, drawing count-1 lines + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, + int count); + +/** + * Draw a rectangle on the current rendering target. + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure representing the rectangle to draw, or + * NULL to outline the entire rendering target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Draw some number of rectangles on the current rendering target. + * + * \param renderer the rendering context + * \param rects an array of SDL_Rect structures representing the rectangles to + * be drawn + * \param count the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * Fill a rectangle on the current rendering target with the drawing color. + * + * The current drawing color is set by SDL_SetRenderDrawColor(), and the + * color's alpha value is ignored unless blending is enabled with the + * appropriate call to SDL_SetRenderDrawBlendMode(). + * + * \param renderer the rendering context + * \param rect the SDL_Rect structure representing the rectangle to fill, or + * NULL for the entire rendering target + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRects + * \sa SDL_RenderPresent + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer, + const SDL_Rect * rect); + +/** + * Fill some number of rectangles on the current rendering target with the + * drawing color. + * + * \param renderer the rendering context + * \param rects an array of SDL_Rect structures representing the rectangles to + * be filled + * \param count the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderPresent + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer, + const SDL_Rect * rects, + int count); + +/** + * Copy a portion of the texture to the current rendering target. + * + * The texture is blended with the destination based on its blend mode set + * with SDL_SetTextureBlendMode(). + * + * The texture color is affected based on its color modulation set by + * SDL_SetTextureColorMod(). + * + * The texture alpha is affected based on its alpha modulation set by + * SDL_SetTextureAlphaMod(). + * + * \param renderer the rendering context + * \param texture the source texture + * \param srcrect the source SDL_Rect structure or NULL for the entire texture + * \param dstrect the destination SDL_Rect structure or NULL for the entire + * rendering target; the texture will be stretched to fill the + * given rectangle + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderCopyEx + * \sa SDL_SetTextureAlphaMod + * \sa SDL_SetTextureBlendMode + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect); + +/** + * Copy a portion of the texture to the current rendering, with optional + * rotation and flipping. + * + * Copy a portion of the texture to the current rendering target, optionally + * rotating it by angle around the given center and also flipping it + * top-bottom and/or left-right. + * + * The texture is blended with the destination based on its blend mode set + * with SDL_SetTextureBlendMode(). + * + * The texture color is affected based on its color modulation set by + * SDL_SetTextureColorMod(). + * + * The texture alpha is affected based on its alpha modulation set by + * SDL_SetTextureAlphaMod(). + * + * \param renderer the rendering context + * \param texture the source texture + * \param srcrect the source SDL_Rect structure or NULL for the entire texture + * \param dstrect the destination SDL_Rect structure or NULL for the entire + * rendering target + * \param angle an angle in degrees that indicates the rotation that will be + * applied to dstrect, rotating it in a clockwise direction + * \param center a pointer to a point indicating the point around which + * dstrect will be rotated (if NULL, rotation will be done + * around `dstrect.w / 2`, `dstrect.h / 2`) + * \param flip a SDL_RendererFlip value stating which flipping actions should + * be performed on the texture + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderCopy + * \sa SDL_SetTextureAlphaMod + * \sa SDL_SetTextureBlendMode + * \sa SDL_SetTextureColorMod + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyEx(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_Rect * dstrect, + const double angle, + const SDL_Point *center, + const SDL_RendererFlip flip); + + +/** + * Draw a point on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a point. + * \param x The x coordinate of the point. + * \param y The y coordinate of the point. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPointF(SDL_Renderer * renderer, + float x, float y); + +/** + * Draw multiple points on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw multiple points. + * \param points The points to draw + * \param count The number of points to draw + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawPointsF(SDL_Renderer * renderer, + const SDL_FPoint * points, + int count); + +/** + * Draw a line on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a line. + * \param x1 The x coordinate of the start point. + * \param y1 The y coordinate of the start point. + * \param x2 The x coordinate of the end point. + * \param y2 The y coordinate of the end point. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLineF(SDL_Renderer * renderer, + float x1, float y1, float x2, float y2); + +/** + * Draw a series of connected lines on the current rendering target at + * subpixel precision. + * + * \param renderer The renderer which should draw multiple lines. + * \param points The points along the lines + * \param count The number of points, drawing count-1 lines + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawLinesF(SDL_Renderer * renderer, + const SDL_FPoint * points, + int count); + +/** + * Draw a rectangle on the current rendering target at subpixel precision. + * + * \param renderer The renderer which should draw a rectangle. + * \param rect A pointer to the destination rectangle, or NULL to outline the + * entire rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRectF(SDL_Renderer * renderer, + const SDL_FRect * rect); + +/** + * Draw some number of rectangles on the current rendering target at subpixel + * precision. + * + * \param renderer The renderer which should draw multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRectsF(SDL_Renderer * renderer, + const SDL_FRect * rects, + int count); + +/** + * Fill a rectangle on the current rendering target with the drawing color at + * subpixel precision. + * + * \param renderer The renderer which should fill a rectangle. + * \param rect A pointer to the destination rectangle, or NULL for the entire + * rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRectF(SDL_Renderer * renderer, + const SDL_FRect * rect); + +/** + * Fill some number of rectangles on the current rendering target with the + * drawing color at subpixel precision. + * + * \param renderer The renderer which should fill multiple rectangles. + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillRectsF(SDL_Renderer * renderer, + const SDL_FRect * rects, + int count); + +/** + * Copy a portion of the texture to the current rendering target at subpixel + * precision. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyF(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_FRect * dstrect); + +/** + * Copy a portion of the source texture to the current rendering target, with + * rotation and flipping, at subpixel precision. + * + * \param renderer The renderer which should copy parts of a texture. + * \param texture The source texture. + * \param srcrect A pointer to the source rectangle, or NULL for the entire + * texture. + * \param dstrect A pointer to the destination rectangle, or NULL for the + * entire rendering target. + * \param angle An angle in degrees that indicates the rotation that will be + * applied to dstrect, rotating it in a clockwise direction + * \param center A pointer to a point indicating the point around which + * dstrect will be rotated (if NULL, rotation will be done + * around dstrect.w/2, dstrect.h/2). + * \param flip An SDL_RendererFlip value stating which flipping actions should + * be performed on the texture + * \return 0 on success, or -1 on error + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderCopyExF(SDL_Renderer * renderer, + SDL_Texture * texture, + const SDL_Rect * srcrect, + const SDL_FRect * dstrect, + const double angle, + const SDL_FPoint *center, + const SDL_RendererFlip flip); + +/** + * Render a list of triangles, optionally using a texture and indices into the + * vertex array Color and alpha modulation is done per vertex + * (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored). + * + * \param renderer The rendering context. + * \param texture (optional) The SDL texture to use. + * \param vertices Vertices. + * \param num_vertices Number of vertices. + * \param indices (optional) An array of integer indices into the 'vertices' + * array, if NULL all vertices will be rendered in sequential + * order. + * \param num_indices Number of indices. + * \return 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGeometryRaw + * \sa SDL_Vertex + */ +extern DECLSPEC int SDLCALL SDL_RenderGeometry(SDL_Renderer *renderer, + SDL_Texture *texture, + const SDL_Vertex *vertices, int num_vertices, + const int *indices, int num_indices); + +/** + * Render a list of triangles, optionally using a texture and indices into the + * vertex arrays Color and alpha modulation is done per vertex + * (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored). + * + * \param renderer The rendering context. + * \param texture (optional) The SDL texture to use. + * \param xy Vertex positions + * \param xy_stride Byte size to move from one element to the next element + * \param color Vertex colors (as SDL_Color) + * \param color_stride Byte size to move from one element to the next element + * \param uv Vertex normalized texture coordinates + * \param uv_stride Byte size to move from one element to the next element + * \param num_vertices Number of vertices. + * \param indices (optional) An array of indices into the 'vertices' arrays, + * if NULL all vertices will be rendered in sequential order. + * \param num_indices Number of indices. + * \param size_indices Index size: 1 (byte), 2 (short), 4 (int) + * \return 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_RenderGeometry + * \sa SDL_Vertex + */ +extern DECLSPEC int SDLCALL SDL_RenderGeometryRaw(SDL_Renderer *renderer, + SDL_Texture *texture, + const float *xy, int xy_stride, + const SDL_Color *color, int color_stride, + const float *uv, int uv_stride, + int num_vertices, + const void *indices, int num_indices, int size_indices); + +/** + * Read pixels from the current rendering target to an array of pixels. + * + * **WARNING**: This is a very slow operation, and should not be used + * frequently. If you're using this on the main rendering target, it should be + * called after rendering and before SDL_RenderPresent(). + * + * `pitch` specifies the number of bytes between rows in the destination + * `pixels` data. This allows you to write to a subrectangle or have padded + * rows in the destination. Generally, `pitch` should equal the number of + * pixels per row in the `pixels` data times the number of bytes per pixel, + * but it might contain additional padding (for example, 24bit RGB Windows + * Bitmap data pads all rows to multiples of 4 bytes). + * + * \param renderer the rendering context + * \param rect an SDL_Rect structure representing the area to read, or NULL + * for the entire render target + * \param format an SDL_PixelFormatEnum value of the desired format of the + * pixel data, or 0 to use the format of the rendering target + * \param pixels a pointer to the pixel data to copy into + * \param pitch the pitch of the `pixels` parameter + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_RenderReadPixels(SDL_Renderer * renderer, + const SDL_Rect * rect, + Uint32 format, + void *pixels, int pitch); + +/** + * Update the screen with any rendering performed since the previous call. + * + * SDL's rendering functions operate on a backbuffer; that is, calling a + * rendering function such as SDL_RenderDrawLine() does not directly put a + * line on the screen, but rather updates the backbuffer. As such, you compose + * your entire scene and *present* the composed backbuffer to the screen as a + * complete picture. + * + * Therefore, when using SDL's rendering API, one does all drawing intended + * for the frame, and then calls this function once per frame to present the + * final drawing to the user. + * + * The backbuffer should be considered invalidated after each present; do not + * assume that previous contents will exist between frames. You are strongly + * encouraged to call SDL_RenderClear() to initialize the backbuffer before + * starting each new frame's drawing, even if you plan to overwrite every + * pixel. + * + * \param renderer the rendering context + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RenderClear + * \sa SDL_RenderDrawLine + * \sa SDL_RenderDrawLines + * \sa SDL_RenderDrawPoint + * \sa SDL_RenderDrawPoints + * \sa SDL_RenderDrawRect + * \sa SDL_RenderDrawRects + * \sa SDL_RenderFillRect + * \sa SDL_RenderFillRects + * \sa SDL_SetRenderDrawBlendMode + * \sa SDL_SetRenderDrawColor + */ +extern DECLSPEC void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer); + +/** + * Destroy the specified texture. + * + * Passing NULL or an otherwise invalid texture will set the SDL error message + * to "Invalid texture". + * + * \param texture the texture to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateTexture + * \sa SDL_CreateTextureFromSurface + */ +extern DECLSPEC void SDLCALL SDL_DestroyTexture(SDL_Texture * texture); + +/** + * Destroy the rendering context for a window and free associated textures. + * + * If `renderer` is NULL, this function will return immediately after setting + * the SDL error message to "Invalid renderer". See SDL_GetError(). + * + * \param renderer the rendering context + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRenderer + */ +extern DECLSPEC void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer); + +/** + * Force the rendering context to flush any pending commands to the underlying + * rendering API. + * + * You do not need to (and in fact, shouldn't) call this function unless you + * are planning to call into OpenGL/Direct3D/Metal/whatever directly in + * addition to using an SDL_Renderer. + * + * This is for a very-specific case: if you are using SDL's render API, you + * asked for a specific renderer backend (OpenGL, Direct3D, etc), you set + * SDL_HINT_RENDER_BATCHING to "1", and you plan to make OpenGL/D3D/whatever + * calls in addition to SDL render API calls. If all of this applies, you + * should call SDL_RenderFlush() between calls to SDL's render API and the + * low-level API you're using in cooperation. + * + * In all other cases, you can ignore this function. This is only here to get + * maximum performance out of a specific situation. In all other cases, SDL + * will do the right thing, perhaps at a performance loss. + * + * This function is first available in SDL 2.0.10, and is not needed in 2.0.9 + * and earlier, as earlier versions did not queue rendering commands at all, + * instead flushing them to the OS immediately. + * + * \param renderer the rendering context + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC int SDLCALL SDL_RenderFlush(SDL_Renderer * renderer); + + +/** + * Bind an OpenGL/ES/ES2 texture to the current context. + * + * This is for use with OpenGL instructions when rendering OpenGL primitives + * directly. + * + * If not NULL, `texw` and `texh` will be filled with the width and height + * values suitable for the provided texture. In most cases, both will be 1.0, + * however, on systems that support the GL_ARB_texture_rectangle extension, + * these values will actually be the pixel width and height used to create the + * texture, so this factor needs to be taken into account when providing + * texture coordinates to OpenGL. + * + * You need a renderer to create an SDL_Texture, therefore you can only use + * this function with an implicit OpenGL context from SDL_CreateRenderer(), + * not with your own OpenGL context. If you need control over your OpenGL + * context, you need to write your own texture-loading methods. + * + * Also note that SDL may upload RGB textures as BGR (or vice-versa), and + * re-order the color channels in the shaders phase, so the uploaded texture + * may have swapped color channels. + * + * \param texture the texture to bind to the current OpenGL/ES/ES2 context + * \param texw a pointer to a float value which will be filled with the + * texture width or NULL if you don't need that value + * \param texh a pointer to a float value which will be filled with the + * texture height or NULL if you don't need that value + * \returns 0 on success, or -1 if the operation is not supported; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_MakeCurrent + * \sa SDL_GL_UnbindTexture + */ +extern DECLSPEC int SDLCALL SDL_GL_BindTexture(SDL_Texture *texture, float *texw, float *texh); + +/** + * Unbind an OpenGL/ES/ES2 texture from the current context. + * + * See SDL_GL_BindTexture() for examples on how to use these functions + * + * \param texture the texture to unbind from the current OpenGL/ES/ES2 context + * \returns 0 on success, or -1 if the operation is not supported + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_BindTexture + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC int SDLCALL SDL_GL_UnbindTexture(SDL_Texture *texture); + +/** + * Get the CAMetalLayer associated with the given Metal renderer. + * + * This function returns `void *`, so SDL doesn't have to include Metal's + * headers, but it can be safely cast to a `CAMetalLayer *`. + * + * \param renderer The renderer to query + * \returns a `CAMetalLayer *` on success, or NULL if the renderer isn't a + * Metal renderer + * + * \since This function is available since SDL 2.0.8. + * + * \sa SDL_RenderGetMetalCommandEncoder + */ +extern DECLSPEC void *SDLCALL SDL_RenderGetMetalLayer(SDL_Renderer * renderer); + +/** + * Get the Metal command encoder for the current frame + * + * This function returns `void *`, so SDL doesn't have to include Metal's + * headers, but it can be safely cast to an `id`. + * + * Note that as of SDL 2.0.18, this will return NULL if Metal refuses to give + * SDL a drawable to render to, which might happen if the window is + * hidden/minimized/offscreen. This doesn't apply to command encoders for + * render targets, just the window's backbacker. Check your return values! + * + * \param renderer The renderer to query + * \returns an `id` on success, or NULL if the + * renderer isn't a Metal renderer or there was an error. + * + * \since This function is available since SDL 2.0.8. + * + * \sa SDL_RenderGetMetalLayer + */ +extern DECLSPEC void *SDLCALL SDL_RenderGetMetalCommandEncoder(SDL_Renderer * renderer); + +/** + * Toggle VSync of the given renderer. + * + * \param renderer The renderer to toggle + * \param vsync 1 for on, 0 for off. All other values are reserved + * \returns a 0 int on success, or non-zero on failure + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_RenderSetVSync(SDL_Renderer* renderer, int vsync); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_render_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_revision.h b/include/SDL/SDL_revision.h new file mode 100644 index 0000000..13c628c --- /dev/null +++ b/include/SDL/SDL_revision.h @@ -0,0 +1,7 @@ +/* Generated by updaterev.sh, do not edit */ +#ifdef SDL_VENDOR_INFO +#define SDL_REVISION "SDL-release-2.26.4-0-g07d0f51fa (" SDL_VENDOR_INFO ")" +#else +#define SDL_REVISION "SDL-release-2.26.4-0-g07d0f51fa" +#endif +#define SDL_REVISION_NUMBER 0 diff --git a/include/SDL/SDL_rwops.h b/include/SDL/SDL_rwops.h new file mode 100644 index 0000000..8615cb5 --- /dev/null +++ b/include/SDL/SDL_rwops.h @@ -0,0 +1,841 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_rwops.h + * + * This file provides a general interface for SDL to read and write + * data streams. It can easily be extended to files, memory, etc. + */ + +#ifndef SDL_rwops_h_ +#define SDL_rwops_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* RWops Types */ +#define SDL_RWOPS_UNKNOWN 0U /**< Unknown stream type */ +#define SDL_RWOPS_WINFILE 1U /**< Win32 file */ +#define SDL_RWOPS_STDFILE 2U /**< Stdio file */ +#define SDL_RWOPS_JNIFILE 3U /**< Android asset */ +#define SDL_RWOPS_MEMORY 4U /**< Memory stream */ +#define SDL_RWOPS_MEMORY_RO 5U /**< Read-Only memory stream */ + +/** + * This is the read/write operation structure -- very basic. + */ +typedef struct SDL_RWops +{ + /** + * Return the size of the file in this rwops, or -1 if unknown + */ + Sint64 (SDLCALL * size) (struct SDL_RWops * context); + + /** + * Seek to \c offset relative to \c whence, one of stdio's whence values: + * RW_SEEK_SET, RW_SEEK_CUR, RW_SEEK_END + * + * \return the final offset in the data stream, or -1 on error. + */ + Sint64 (SDLCALL * seek) (struct SDL_RWops * context, Sint64 offset, + int whence); + + /** + * Read up to \c maxnum objects each of size \c size from the data + * stream to the area pointed at by \c ptr. + * + * \return the number of objects read, or 0 at error or end of file. + */ + size_t (SDLCALL * read) (struct SDL_RWops * context, void *ptr, + size_t size, size_t maxnum); + + /** + * Write exactly \c num objects each of size \c size from the area + * pointed at by \c ptr to data stream. + * + * \return the number of objects written, or 0 at error or end of file. + */ + size_t (SDLCALL * write) (struct SDL_RWops * context, const void *ptr, + size_t size, size_t num); + + /** + * Close and free an allocated SDL_RWops structure. + * + * \return 0 if successful or -1 on write error when flushing data. + */ + int (SDLCALL * close) (struct SDL_RWops * context); + + Uint32 type; + union + { +#if defined(__ANDROID__) + struct + { + void *asset; + } androidio; +#elif defined(__WIN32__) || defined(__GDK__) + struct + { + SDL_bool append; + void *h; + struct + { + void *data; + size_t size; + size_t left; + } buffer; + } windowsio; +#endif + +#ifdef HAVE_STDIO_H + struct + { + SDL_bool autoclose; + FILE *fp; + } stdio; +#endif + struct + { + Uint8 *base; + Uint8 *here; + Uint8 *stop; + } mem; + struct + { + void *data1; + void *data2; + } unknown; + } hidden; + +} SDL_RWops; + + +/** + * \name RWFrom functions + * + * Functions to create SDL_RWops structures from various data streams. + */ +/* @{ */ + +/** + * Use this function to create a new SDL_RWops structure for reading from + * and/or writing to a named file. + * + * The `mode` string is treated roughly the same as in a call to the C + * library's fopen(), even if SDL doesn't happen to use fopen() behind the + * scenes. + * + * Available `mode` strings: + * + * - "r": Open a file for reading. The file must exist. + * - "w": Create an empty file for writing. If a file with the same name + * already exists its content is erased and the file is treated as a new + * empty file. + * - "a": Append to a file. Writing operations append data at the end of the + * file. The file is created if it does not exist. + * - "r+": Open a file for update both reading and writing. The file must + * exist. + * - "w+": Create an empty file for both reading and writing. If a file with + * the same name already exists its content is erased and the file is + * treated as a new empty file. + * - "a+": Open a file for reading and appending. All writing operations are + * performed at the end of the file, protecting the previous content to be + * overwritten. You can reposition (fseek, rewind) the internal pointer to + * anywhere in the file for reading, but writing operations will move it + * back to the end of file. The file is created if it does not exist. + * + * **NOTE**: In order to open a file as a binary file, a "b" character has to + * be included in the `mode` string. This additional "b" character can either + * be appended at the end of the string (thus making the following compound + * modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the + * letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+"). + * Additional characters may follow the sequence, although they should have no + * effect. For example, "t" is sometimes appended to make explicit the file is + * a text file. + * + * This function supports Unicode filenames, but they must be encoded in UTF-8 + * format, regardless of the underlying operating system. + * + * As a fallback, SDL_RWFromFile() will transparently open a matching filename + * in an Android app's `assets`. + * + * Closing the SDL_RWops will close the file handle SDL is holding internally. + * + * \param file a UTF-8 string representing the filename to open + * \param mode an ASCII string representing the mode to be used for opening + * the file. + * \returns a pointer to the SDL_RWops structure that is created, or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFile(const char *file, + const char *mode); + +#ifdef HAVE_STDIO_H + +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(FILE * fp, SDL_bool autoclose); + +#else + +/** + * Use this function to create an SDL_RWops structure from a standard I/O file + * pointer (stdio.h's `FILE*`). + * + * This function is not available on Windows, since files opened in an + * application on that platform cannot be used by a dynamically linked + * library. + * + * On some platforms, the first parameter is a `void*`, on others, it's a + * `FILE*`, depending on what system headers are available to SDL. It is + * always intended to be the `FILE*` type from the C runtime's stdio.h. + * + * \param fp the `FILE*` that feeds the SDL_RWops stream + * \param autoclose SDL_TRUE to close the `FILE*` when closing the SDL_RWops, + * SDL_FALSE to leave the `FILE*` open when the RWops is + * closed + * \returns a pointer to the SDL_RWops structure that is created, or NULL on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromFP(void * fp, + SDL_bool autoclose); +#endif + +/** + * Use this function to prepare a read-write memory buffer for use with + * SDL_RWops. + * + * This function sets up an SDL_RWops struct based on a memory area of a + * certain size, for both read and write access. + * + * This memory buffer is not copied by the RWops; the pointer you provide must + * remain valid until you close the stream. Closing the stream will not free + * the original buffer. + * + * If you need to make sure the RWops never writes to the memory buffer, you + * should use SDL_RWFromConstMem() with a read-only buffer of memory instead. + * + * \param mem a pointer to a buffer to feed an SDL_RWops stream + * \param size the buffer size, in bytes + * \returns a pointer to a new SDL_RWops structure, or NULL if it fails; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromMem(void *mem, int size); + +/** + * Use this function to prepare a read-only memory buffer for use with RWops. + * + * This function sets up an SDL_RWops struct based on a memory area of a + * certain size. It assumes the memory area is not writable. + * + * Attempting to write to this RWops stream will report an error without + * writing to the memory buffer. + * + * This memory buffer is not copied by the RWops; the pointer you provide must + * remain valid until you close the stream. Closing the stream will not free + * the original buffer. + * + * If you need to write to a memory buffer, you should use SDL_RWFromMem() + * with a writable buffer of memory instead. + * + * \param mem a pointer to a read-only buffer to feed an SDL_RWops stream + * \param size the buffer size, in bytes + * \returns a pointer to a new SDL_RWops structure, or NULL if it fails; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWtell + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_RWFromConstMem(const void *mem, + int size); + +/* @} *//* RWFrom functions */ + + +/** + * Use this function to allocate an empty, unpopulated SDL_RWops structure. + * + * Applications do not need to use this function unless they are providing + * their own SDL_RWops implementation. If you just need a SDL_RWops to + * read/write a common data source, you should use the built-in + * implementations in SDL, like SDL_RWFromFile() or SDL_RWFromMem(), etc. + * + * You must free the returned pointer with SDL_FreeRW(). Depending on your + * operating system and compiler, there may be a difference between the + * malloc() and free() your program uses and the versions SDL calls + * internally. Trying to mix the two can cause crashing such as segmentation + * faults. Since all SDL_RWops must free themselves when their **close** + * method is called, all SDL_RWops must be allocated through this function, so + * they can all be freed correctly with SDL_FreeRW(). + * + * \returns a pointer to the allocated memory on success, or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeRW + */ +extern DECLSPEC SDL_RWops *SDLCALL SDL_AllocRW(void); + +/** + * Use this function to free an SDL_RWops structure allocated by + * SDL_AllocRW(). + * + * Applications do not need to use this function unless they are providing + * their own SDL_RWops implementation. If you just need a SDL_RWops to + * read/write a common data source, you should use the built-in + * implementations in SDL, like SDL_RWFromFile() or SDL_RWFromMem(), etc, and + * call the **close** method on those SDL_RWops pointers when you are done + * with them. + * + * Only use SDL_FreeRW() on pointers returned by SDL_AllocRW(). The pointer is + * invalid as soon as this function returns. Any extra memory allocated during + * creation of the SDL_RWops is not freed by SDL_FreeRW(); the programmer must + * be responsible for managing that memory in their **close** method. + * + * \param area the SDL_RWops structure to be freed + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocRW + */ +extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops * area); + +#define RW_SEEK_SET 0 /**< Seek from the beginning of data */ +#define RW_SEEK_CUR 1 /**< Seek relative to current read point */ +#define RW_SEEK_END 2 /**< Seek relative to the end of data */ + +/** + * Use this function to get the size of the data stream in an SDL_RWops. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context the SDL_RWops to get the size of the data stream from + * \returns the size of the data stream in the SDL_RWops on success, -1 if + * unknown or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWsize(SDL_RWops *context); + +/** + * Seek within an SDL_RWops data stream. + * + * This function seeks to byte `offset`, relative to `whence`. + * + * `whence` may be any of the following values: + * + * - `RW_SEEK_SET`: seek from the beginning of data + * - `RW_SEEK_CUR`: seek relative to current read point + * - `RW_SEEK_END`: seek relative to the end of data + * + * If this stream can not seek, it will return -1. + * + * SDL_RWseek() is actually a wrapper function that calls the SDL_RWops's + * `seek` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param offset an offset in bytes, relative to **whence** location; can be + * negative + * \param whence any of `RW_SEEK_SET`, `RW_SEEK_CUR`, `RW_SEEK_END` + * \returns the final offset in the data stream after the seek or -1 on error. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWtell + * \sa SDL_RWwrite + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWseek(SDL_RWops *context, + Sint64 offset, int whence); + +/** + * Determine the current read/write offset in an SDL_RWops data stream. + * + * SDL_RWtell is actually a wrapper function that calls the SDL_RWops's `seek` + * method, with an offset of 0 bytes from `RW_SEEK_CUR`, to simplify + * application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a SDL_RWops data stream object from which to get the current + * offset + * \returns the current offset in the stream, or -1 if the information can not + * be determined. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC Sint64 SDLCALL SDL_RWtell(SDL_RWops *context); + +/** + * Read from a data source. + * + * This function reads up to `maxnum` objects each of size `size` from the + * data source to the area pointed at by `ptr`. This function may read less + * objects than requested. It will return zero when there has been an error or + * the data stream is completely read. + * + * SDL_RWread() is actually a function wrapper that calls the SDL_RWops's + * `read` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param ptr a pointer to a buffer to read data into + * \param size the size of each object to read, in bytes + * \param maxnum the maximum number of objects to be read + * \returns the number of objects read, or 0 at error or end of file; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC size_t SDLCALL SDL_RWread(SDL_RWops *context, + void *ptr, size_t size, + size_t maxnum); + +/** + * Write to an SDL_RWops data stream. + * + * This function writes exactly `num` objects each of size `size` from the + * area pointed at by `ptr` to the stream. If this fails for any reason, it'll + * return less than `num` to demonstrate how far the write progressed. On + * success, it returns `num`. + * + * SDL_RWwrite is actually a function wrapper that calls the SDL_RWops's + * `write` method appropriately, to simplify application development. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context a pointer to an SDL_RWops structure + * \param ptr a pointer to a buffer containing data to write + * \param size the size of an object to write, in bytes + * \param num the number of objects to write + * \returns the number of objects written, which will be less than **num** on + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWclose + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + */ +extern DECLSPEC size_t SDLCALL SDL_RWwrite(SDL_RWops *context, + const void *ptr, size_t size, + size_t num); + +/** + * Close and free an allocated SDL_RWops structure. + * + * SDL_RWclose() closes and cleans up the SDL_RWops stream. It releases any + * resources used by the stream and frees the SDL_RWops itself with + * SDL_FreeRW(). This returns 0 on success, or -1 if the stream failed to + * flush to its output (e.g. to disk). + * + * Note that if this fails to flush the stream to disk, this function reports + * an error, but the SDL_RWops is still invalid once this function returns. + * + * Prior to SDL 2.0.10, this function was a macro. + * + * \param context SDL_RWops structure to close + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.10. + * + * \sa SDL_RWFromConstMem + * \sa SDL_RWFromFile + * \sa SDL_RWFromFP + * \sa SDL_RWFromMem + * \sa SDL_RWread + * \sa SDL_RWseek + * \sa SDL_RWwrite + */ +extern DECLSPEC int SDLCALL SDL_RWclose(SDL_RWops *context); + +/** + * Load all the data from an SDL data stream. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in the value reported via + * `datasize`. + * + * The data should be freed with SDL_free(). + * + * \param src the SDL_RWops to read all available data from + * \param datasize if not NULL, will store the number of bytes read + * \param freesrc if non-zero, calls SDL_RWclose() on `src` before returning + * \returns the data, or NULL if there was an error. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void *SDLCALL SDL_LoadFile_RW(SDL_RWops *src, + size_t *datasize, + int freesrc); + +/** + * Load all the data from a file path. + * + * The data is allocated with a zero byte at the end (null terminated) for + * convenience. This extra byte is not included in the value reported via + * `datasize`. + * + * The data should be freed with SDL_free(). + * + * Prior to SDL 2.0.10, this function was a macro wrapping around + * SDL_LoadFile_RW. + * + * \param file the path to read all available data from + * \param datasize if not NULL, will store the number of bytes read + * \returns the data, or NULL if there was an error. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC void *SDLCALL SDL_LoadFile(const char *file, size_t *datasize); + +/** + * \name Read endian functions + * + * Read an item of the specified endianness and return in native format. + */ +/* @{ */ + +/** + * Use this function to read a byte from an SDL_RWops. + * + * \param src the SDL_RWops to read from + * \returns the read byte on success or 0 on failure; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteU8 + */ +extern DECLSPEC Uint8 SDLCALL SDL_ReadU8(SDL_RWops * src); + +/** + * Use this function to read 16 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 16 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE16 + */ +extern DECLSPEC Uint16 SDLCALL SDL_ReadLE16(SDL_RWops * src); + +/** + * Use this function to read 16 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 16 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE16 + */ +extern DECLSPEC Uint16 SDLCALL SDL_ReadBE16(SDL_RWops * src); + +/** + * Use this function to read 32 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 32 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE32 + */ +extern DECLSPEC Uint32 SDLCALL SDL_ReadLE32(SDL_RWops * src); + +/** + * Use this function to read 32 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 32 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE32 + */ +extern DECLSPEC Uint32 SDLCALL SDL_ReadBE32(SDL_RWops * src); + +/** + * Use this function to read 64 bits of little-endian data from an SDL_RWops + * and return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 64 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadBE64 + */ +extern DECLSPEC Uint64 SDLCALL SDL_ReadLE64(SDL_RWops * src); + +/** + * Use this function to read 64 bits of big-endian data from an SDL_RWops and + * return in native format. + * + * SDL byteswaps the data only if necessary, so the data returned will be in + * the native byte order. + * + * \param src the stream from which to read data + * \returns 64 bits of data in the native byte order of the platform. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadLE64 + */ +extern DECLSPEC Uint64 SDLCALL SDL_ReadBE64(SDL_RWops * src); +/* @} *//* Read endian functions */ + +/** + * \name Write endian functions + * + * Write an item of native format to the specified endianness. + */ +/* @{ */ + +/** + * Use this function to write a byte to an SDL_RWops. + * + * \param dst the SDL_RWops to write to + * \param value the byte value to write + * \returns 1 on success or 0 on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ReadU8 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteU8(SDL_RWops * dst, Uint8 value); + +/** + * Use this function to write 16 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE16 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE16(SDL_RWops * dst, Uint16 value); + +/** + * Use this function to write 16 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE16 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE16(SDL_RWops * dst, Uint16 value); + +/** + * Use this function to write 32 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE32 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE32(SDL_RWops * dst, Uint32 value); + +/** + * Use this function to write 32 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE32 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE32(SDL_RWops * dst, Uint32 value); + +/** + * Use this function to write 64 bits in native format to a SDL_RWops as + * little-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in little-endian + * format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteBE64 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteLE64(SDL_RWops * dst, Uint64 value); + +/** + * Use this function to write 64 bits in native format to a SDL_RWops as + * big-endian data. + * + * SDL byteswaps the data only if necessary, so the application always + * specifies native format, and the data written will be in big-endian format. + * + * \param dst the stream to which data will be written + * \param value the data to be written, in native format + * \returns 1 on successful write, 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WriteLE64 + */ +extern DECLSPEC size_t SDLCALL SDL_WriteBE64(SDL_RWops * dst, Uint64 value); +/* @} *//* Write endian functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_rwops_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_scancode.h b/include/SDL/SDL_scancode.h new file mode 100644 index 0000000..a960a79 --- /dev/null +++ b/include/SDL/SDL_scancode.h @@ -0,0 +1,438 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_scancode.h + * + * Defines keyboard scancodes. + */ + +#ifndef SDL_scancode_h_ +#define SDL_scancode_h_ + +#include "SDL_stdinc.h" + +/** + * \brief The SDL keyboard scancode representation. + * + * Values of this type are used to represent keyboard keys, among other places + * in the \link SDL_Keysym::scancode key.keysym.scancode \endlink field of the + * SDL_Event structure. + * + * The values in this enumeration are based on the USB usage page standard: + * https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf + */ +typedef enum +{ + SDL_SCANCODE_UNKNOWN = 0, + + /** + * \name Usage page 0x07 + * + * These values are from usage page 0x07 (USB keyboard page). + */ + /* @{ */ + + SDL_SCANCODE_A = 4, + SDL_SCANCODE_B = 5, + SDL_SCANCODE_C = 6, + SDL_SCANCODE_D = 7, + SDL_SCANCODE_E = 8, + SDL_SCANCODE_F = 9, + SDL_SCANCODE_G = 10, + SDL_SCANCODE_H = 11, + SDL_SCANCODE_I = 12, + SDL_SCANCODE_J = 13, + SDL_SCANCODE_K = 14, + SDL_SCANCODE_L = 15, + SDL_SCANCODE_M = 16, + SDL_SCANCODE_N = 17, + SDL_SCANCODE_O = 18, + SDL_SCANCODE_P = 19, + SDL_SCANCODE_Q = 20, + SDL_SCANCODE_R = 21, + SDL_SCANCODE_S = 22, + SDL_SCANCODE_T = 23, + SDL_SCANCODE_U = 24, + SDL_SCANCODE_V = 25, + SDL_SCANCODE_W = 26, + SDL_SCANCODE_X = 27, + SDL_SCANCODE_Y = 28, + SDL_SCANCODE_Z = 29, + + SDL_SCANCODE_1 = 30, + SDL_SCANCODE_2 = 31, + SDL_SCANCODE_3 = 32, + SDL_SCANCODE_4 = 33, + SDL_SCANCODE_5 = 34, + SDL_SCANCODE_6 = 35, + SDL_SCANCODE_7 = 36, + SDL_SCANCODE_8 = 37, + SDL_SCANCODE_9 = 38, + SDL_SCANCODE_0 = 39, + + SDL_SCANCODE_RETURN = 40, + SDL_SCANCODE_ESCAPE = 41, + SDL_SCANCODE_BACKSPACE = 42, + SDL_SCANCODE_TAB = 43, + SDL_SCANCODE_SPACE = 44, + + SDL_SCANCODE_MINUS = 45, + SDL_SCANCODE_EQUALS = 46, + SDL_SCANCODE_LEFTBRACKET = 47, + SDL_SCANCODE_RIGHTBRACKET = 48, + SDL_SCANCODE_BACKSLASH = 49, /**< Located at the lower left of the return + * key on ISO keyboards and at the right end + * of the QWERTY row on ANSI keyboards. + * Produces REVERSE SOLIDUS (backslash) and + * VERTICAL LINE in a US layout, REVERSE + * SOLIDUS and VERTICAL LINE in a UK Mac + * layout, NUMBER SIGN and TILDE in a UK + * Windows layout, DOLLAR SIGN and POUND SIGN + * in a Swiss German layout, NUMBER SIGN and + * APOSTROPHE in a German layout, GRAVE + * ACCENT and POUND SIGN in a French Mac + * layout, and ASTERISK and MICRO SIGN in a + * French Windows layout. + */ + SDL_SCANCODE_NONUSHASH = 50, /**< ISO USB keyboards actually use this code + * instead of 49 for the same key, but all + * OSes I've seen treat the two codes + * identically. So, as an implementor, unless + * your keyboard generates both of those + * codes and your OS treats them differently, + * you should generate SDL_SCANCODE_BACKSLASH + * instead of this code. As a user, you + * should not rely on this code because SDL + * will never generate it with most (all?) + * keyboards. + */ + SDL_SCANCODE_SEMICOLON = 51, + SDL_SCANCODE_APOSTROPHE = 52, + SDL_SCANCODE_GRAVE = 53, /**< Located in the top left corner (on both ANSI + * and ISO keyboards). Produces GRAVE ACCENT and + * TILDE in a US Windows layout and in US and UK + * Mac layouts on ANSI keyboards, GRAVE ACCENT + * and NOT SIGN in a UK Windows layout, SECTION + * SIGN and PLUS-MINUS SIGN in US and UK Mac + * layouts on ISO keyboards, SECTION SIGN and + * DEGREE SIGN in a Swiss German layout (Mac: + * only on ISO keyboards), CIRCUMFLEX ACCENT and + * DEGREE SIGN in a German layout (Mac: only on + * ISO keyboards), SUPERSCRIPT TWO and TILDE in a + * French Windows layout, COMMERCIAL AT and + * NUMBER SIGN in a French Mac layout on ISO + * keyboards, and LESS-THAN SIGN and GREATER-THAN + * SIGN in a Swiss German, German, or French Mac + * layout on ANSI keyboards. + */ + SDL_SCANCODE_COMMA = 54, + SDL_SCANCODE_PERIOD = 55, + SDL_SCANCODE_SLASH = 56, + + SDL_SCANCODE_CAPSLOCK = 57, + + SDL_SCANCODE_F1 = 58, + SDL_SCANCODE_F2 = 59, + SDL_SCANCODE_F3 = 60, + SDL_SCANCODE_F4 = 61, + SDL_SCANCODE_F5 = 62, + SDL_SCANCODE_F6 = 63, + SDL_SCANCODE_F7 = 64, + SDL_SCANCODE_F8 = 65, + SDL_SCANCODE_F9 = 66, + SDL_SCANCODE_F10 = 67, + SDL_SCANCODE_F11 = 68, + SDL_SCANCODE_F12 = 69, + + SDL_SCANCODE_PRINTSCREEN = 70, + SDL_SCANCODE_SCROLLLOCK = 71, + SDL_SCANCODE_PAUSE = 72, + SDL_SCANCODE_INSERT = 73, /**< insert on PC, help on some Mac keyboards (but + does send code 73, not 117) */ + SDL_SCANCODE_HOME = 74, + SDL_SCANCODE_PAGEUP = 75, + SDL_SCANCODE_DELETE = 76, + SDL_SCANCODE_END = 77, + SDL_SCANCODE_PAGEDOWN = 78, + SDL_SCANCODE_RIGHT = 79, + SDL_SCANCODE_LEFT = 80, + SDL_SCANCODE_DOWN = 81, + SDL_SCANCODE_UP = 82, + + SDL_SCANCODE_NUMLOCKCLEAR = 83, /**< num lock on PC, clear on Mac keyboards + */ + SDL_SCANCODE_KP_DIVIDE = 84, + SDL_SCANCODE_KP_MULTIPLY = 85, + SDL_SCANCODE_KP_MINUS = 86, + SDL_SCANCODE_KP_PLUS = 87, + SDL_SCANCODE_KP_ENTER = 88, + SDL_SCANCODE_KP_1 = 89, + SDL_SCANCODE_KP_2 = 90, + SDL_SCANCODE_KP_3 = 91, + SDL_SCANCODE_KP_4 = 92, + SDL_SCANCODE_KP_5 = 93, + SDL_SCANCODE_KP_6 = 94, + SDL_SCANCODE_KP_7 = 95, + SDL_SCANCODE_KP_8 = 96, + SDL_SCANCODE_KP_9 = 97, + SDL_SCANCODE_KP_0 = 98, + SDL_SCANCODE_KP_PERIOD = 99, + + SDL_SCANCODE_NONUSBACKSLASH = 100, /**< This is the additional key that ISO + * keyboards have over ANSI ones, + * located between left shift and Y. + * Produces GRAVE ACCENT and TILDE in a + * US or UK Mac layout, REVERSE SOLIDUS + * (backslash) and VERTICAL LINE in a + * US or UK Windows layout, and + * LESS-THAN SIGN and GREATER-THAN SIGN + * in a Swiss German, German, or French + * layout. */ + SDL_SCANCODE_APPLICATION = 101, /**< windows contextual menu, compose */ + SDL_SCANCODE_POWER = 102, /**< The USB document says this is a status flag, + * not a physical key - but some Mac keyboards + * do have a power key. */ + SDL_SCANCODE_KP_EQUALS = 103, + SDL_SCANCODE_F13 = 104, + SDL_SCANCODE_F14 = 105, + SDL_SCANCODE_F15 = 106, + SDL_SCANCODE_F16 = 107, + SDL_SCANCODE_F17 = 108, + SDL_SCANCODE_F18 = 109, + SDL_SCANCODE_F19 = 110, + SDL_SCANCODE_F20 = 111, + SDL_SCANCODE_F21 = 112, + SDL_SCANCODE_F22 = 113, + SDL_SCANCODE_F23 = 114, + SDL_SCANCODE_F24 = 115, + SDL_SCANCODE_EXECUTE = 116, + SDL_SCANCODE_HELP = 117, /**< AL Integrated Help Center */ + SDL_SCANCODE_MENU = 118, /**< Menu (show menu) */ + SDL_SCANCODE_SELECT = 119, + SDL_SCANCODE_STOP = 120, /**< AC Stop */ + SDL_SCANCODE_AGAIN = 121, /**< AC Redo/Repeat */ + SDL_SCANCODE_UNDO = 122, /**< AC Undo */ + SDL_SCANCODE_CUT = 123, /**< AC Cut */ + SDL_SCANCODE_COPY = 124, /**< AC Copy */ + SDL_SCANCODE_PASTE = 125, /**< AC Paste */ + SDL_SCANCODE_FIND = 126, /**< AC Find */ + SDL_SCANCODE_MUTE = 127, + SDL_SCANCODE_VOLUMEUP = 128, + SDL_SCANCODE_VOLUMEDOWN = 129, +/* not sure whether there's a reason to enable these */ +/* SDL_SCANCODE_LOCKINGCAPSLOCK = 130, */ +/* SDL_SCANCODE_LOCKINGNUMLOCK = 131, */ +/* SDL_SCANCODE_LOCKINGSCROLLLOCK = 132, */ + SDL_SCANCODE_KP_COMMA = 133, + SDL_SCANCODE_KP_EQUALSAS400 = 134, + + SDL_SCANCODE_INTERNATIONAL1 = 135, /**< used on Asian keyboards, see + footnotes in USB doc */ + SDL_SCANCODE_INTERNATIONAL2 = 136, + SDL_SCANCODE_INTERNATIONAL3 = 137, /**< Yen */ + SDL_SCANCODE_INTERNATIONAL4 = 138, + SDL_SCANCODE_INTERNATIONAL5 = 139, + SDL_SCANCODE_INTERNATIONAL6 = 140, + SDL_SCANCODE_INTERNATIONAL7 = 141, + SDL_SCANCODE_INTERNATIONAL8 = 142, + SDL_SCANCODE_INTERNATIONAL9 = 143, + SDL_SCANCODE_LANG1 = 144, /**< Hangul/English toggle */ + SDL_SCANCODE_LANG2 = 145, /**< Hanja conversion */ + SDL_SCANCODE_LANG3 = 146, /**< Katakana */ + SDL_SCANCODE_LANG4 = 147, /**< Hiragana */ + SDL_SCANCODE_LANG5 = 148, /**< Zenkaku/Hankaku */ + SDL_SCANCODE_LANG6 = 149, /**< reserved */ + SDL_SCANCODE_LANG7 = 150, /**< reserved */ + SDL_SCANCODE_LANG8 = 151, /**< reserved */ + SDL_SCANCODE_LANG9 = 152, /**< reserved */ + + SDL_SCANCODE_ALTERASE = 153, /**< Erase-Eaze */ + SDL_SCANCODE_SYSREQ = 154, + SDL_SCANCODE_CANCEL = 155, /**< AC Cancel */ + SDL_SCANCODE_CLEAR = 156, + SDL_SCANCODE_PRIOR = 157, + SDL_SCANCODE_RETURN2 = 158, + SDL_SCANCODE_SEPARATOR = 159, + SDL_SCANCODE_OUT = 160, + SDL_SCANCODE_OPER = 161, + SDL_SCANCODE_CLEARAGAIN = 162, + SDL_SCANCODE_CRSEL = 163, + SDL_SCANCODE_EXSEL = 164, + + SDL_SCANCODE_KP_00 = 176, + SDL_SCANCODE_KP_000 = 177, + SDL_SCANCODE_THOUSANDSSEPARATOR = 178, + SDL_SCANCODE_DECIMALSEPARATOR = 179, + SDL_SCANCODE_CURRENCYUNIT = 180, + SDL_SCANCODE_CURRENCYSUBUNIT = 181, + SDL_SCANCODE_KP_LEFTPAREN = 182, + SDL_SCANCODE_KP_RIGHTPAREN = 183, + SDL_SCANCODE_KP_LEFTBRACE = 184, + SDL_SCANCODE_KP_RIGHTBRACE = 185, + SDL_SCANCODE_KP_TAB = 186, + SDL_SCANCODE_KP_BACKSPACE = 187, + SDL_SCANCODE_KP_A = 188, + SDL_SCANCODE_KP_B = 189, + SDL_SCANCODE_KP_C = 190, + SDL_SCANCODE_KP_D = 191, + SDL_SCANCODE_KP_E = 192, + SDL_SCANCODE_KP_F = 193, + SDL_SCANCODE_KP_XOR = 194, + SDL_SCANCODE_KP_POWER = 195, + SDL_SCANCODE_KP_PERCENT = 196, + SDL_SCANCODE_KP_LESS = 197, + SDL_SCANCODE_KP_GREATER = 198, + SDL_SCANCODE_KP_AMPERSAND = 199, + SDL_SCANCODE_KP_DBLAMPERSAND = 200, + SDL_SCANCODE_KP_VERTICALBAR = 201, + SDL_SCANCODE_KP_DBLVERTICALBAR = 202, + SDL_SCANCODE_KP_COLON = 203, + SDL_SCANCODE_KP_HASH = 204, + SDL_SCANCODE_KP_SPACE = 205, + SDL_SCANCODE_KP_AT = 206, + SDL_SCANCODE_KP_EXCLAM = 207, + SDL_SCANCODE_KP_MEMSTORE = 208, + SDL_SCANCODE_KP_MEMRECALL = 209, + SDL_SCANCODE_KP_MEMCLEAR = 210, + SDL_SCANCODE_KP_MEMADD = 211, + SDL_SCANCODE_KP_MEMSUBTRACT = 212, + SDL_SCANCODE_KP_MEMMULTIPLY = 213, + SDL_SCANCODE_KP_MEMDIVIDE = 214, + SDL_SCANCODE_KP_PLUSMINUS = 215, + SDL_SCANCODE_KP_CLEAR = 216, + SDL_SCANCODE_KP_CLEARENTRY = 217, + SDL_SCANCODE_KP_BINARY = 218, + SDL_SCANCODE_KP_OCTAL = 219, + SDL_SCANCODE_KP_DECIMAL = 220, + SDL_SCANCODE_KP_HEXADECIMAL = 221, + + SDL_SCANCODE_LCTRL = 224, + SDL_SCANCODE_LSHIFT = 225, + SDL_SCANCODE_LALT = 226, /**< alt, option */ + SDL_SCANCODE_LGUI = 227, /**< windows, command (apple), meta */ + SDL_SCANCODE_RCTRL = 228, + SDL_SCANCODE_RSHIFT = 229, + SDL_SCANCODE_RALT = 230, /**< alt gr, option */ + SDL_SCANCODE_RGUI = 231, /**< windows, command (apple), meta */ + + SDL_SCANCODE_MODE = 257, /**< I'm not sure if this is really not covered + * by any of the above, but since there's a + * special KMOD_MODE for it I'm adding it here + */ + + /* @} *//* Usage page 0x07 */ + + /** + * \name Usage page 0x0C + * + * These values are mapped from usage page 0x0C (USB consumer page). + * See https://usb.org/sites/default/files/hut1_2.pdf + * + * There are way more keys in the spec than we can represent in the + * current scancode range, so pick the ones that commonly come up in + * real world usage. + */ + /* @{ */ + + SDL_SCANCODE_AUDIONEXT = 258, + SDL_SCANCODE_AUDIOPREV = 259, + SDL_SCANCODE_AUDIOSTOP = 260, + SDL_SCANCODE_AUDIOPLAY = 261, + SDL_SCANCODE_AUDIOMUTE = 262, + SDL_SCANCODE_MEDIASELECT = 263, + SDL_SCANCODE_WWW = 264, /**< AL Internet Browser */ + SDL_SCANCODE_MAIL = 265, + SDL_SCANCODE_CALCULATOR = 266, /**< AL Calculator */ + SDL_SCANCODE_COMPUTER = 267, + SDL_SCANCODE_AC_SEARCH = 268, /**< AC Search */ + SDL_SCANCODE_AC_HOME = 269, /**< AC Home */ + SDL_SCANCODE_AC_BACK = 270, /**< AC Back */ + SDL_SCANCODE_AC_FORWARD = 271, /**< AC Forward */ + SDL_SCANCODE_AC_STOP = 272, /**< AC Stop */ + SDL_SCANCODE_AC_REFRESH = 273, /**< AC Refresh */ + SDL_SCANCODE_AC_BOOKMARKS = 274, /**< AC Bookmarks */ + + /* @} *//* Usage page 0x0C */ + + /** + * \name Walther keys + * + * These are values that Christian Walther added (for mac keyboard?). + */ + /* @{ */ + + SDL_SCANCODE_BRIGHTNESSDOWN = 275, + SDL_SCANCODE_BRIGHTNESSUP = 276, + SDL_SCANCODE_DISPLAYSWITCH = 277, /**< display mirroring/dual display + switch, video mode switch */ + SDL_SCANCODE_KBDILLUMTOGGLE = 278, + SDL_SCANCODE_KBDILLUMDOWN = 279, + SDL_SCANCODE_KBDILLUMUP = 280, + SDL_SCANCODE_EJECT = 281, + SDL_SCANCODE_SLEEP = 282, /**< SC System Sleep */ + + SDL_SCANCODE_APP1 = 283, + SDL_SCANCODE_APP2 = 284, + + /* @} *//* Walther keys */ + + /** + * \name Usage page 0x0C (additional media keys) + * + * These values are mapped from usage page 0x0C (USB consumer page). + */ + /* @{ */ + + SDL_SCANCODE_AUDIOREWIND = 285, + SDL_SCANCODE_AUDIOFASTFORWARD = 286, + + /* @} *//* Usage page 0x0C (additional media keys) */ + + /** + * \name Mobile keys + * + * These are values that are often used on mobile phones. + */ + /* @{ */ + + SDL_SCANCODE_SOFTLEFT = 287, /**< Usually situated below the display on phones and + used as a multi-function feature key for selecting + a software defined function shown on the bottom left + of the display. */ + SDL_SCANCODE_SOFTRIGHT = 288, /**< Usually situated below the display on phones and + used as a multi-function feature key for selecting + a software defined function shown on the bottom right + of the display. */ + SDL_SCANCODE_CALL = 289, /**< Used for accepting phone calls. */ + SDL_SCANCODE_ENDCALL = 290, /**< Used for rejecting phone calls. */ + + /* @} *//* Mobile keys */ + + /* Add any other keys here. */ + + SDL_NUM_SCANCODES = 512 /**< not a key, just marks the number of scancodes + for array bounds */ +} SDL_Scancode; + +#endif /* SDL_scancode_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_sensor.h b/include/SDL/SDL_sensor.h new file mode 100644 index 0000000..3010e49 --- /dev/null +++ b/include/SDL/SDL_sensor.h @@ -0,0 +1,322 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_sensor.h + * + * Include file for SDL sensor event handling + * + */ + +#ifndef SDL_sensor_h_ +#define SDL_sensor_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +extern "C" { +/* *INDENT-ON* */ +#endif + +/** + * \brief SDL_sensor.h + * + * In order to use these functions, SDL_Init() must have been called + * with the ::SDL_INIT_SENSOR flag. This causes SDL to scan the system + * for sensors, and load appropriate drivers. + */ + +struct _SDL_Sensor; +typedef struct _SDL_Sensor SDL_Sensor; + +/** + * This is a unique ID for a sensor for the time it is connected to the system, + * and is never reused for the lifetime of the application. + * + * The ID value starts at 0 and increments from there. The value -1 is an invalid ID. + */ +typedef Sint32 SDL_SensorID; + +/* The different sensors defined by SDL + * + * Additional sensors may be available, using platform dependent semantics. + * + * Hare are the additional Android sensors: + * https://developer.android.com/reference/android/hardware/SensorEvent.html#values + */ +typedef enum +{ + SDL_SENSOR_INVALID = -1, /**< Returned for an invalid sensor */ + SDL_SENSOR_UNKNOWN, /**< Unknown sensor type */ + SDL_SENSOR_ACCEL, /**< Accelerometer */ + SDL_SENSOR_GYRO, /**< Gyroscope */ + SDL_SENSOR_ACCEL_L, /**< Accelerometer for left Joy-Con controller and Wii nunchuk */ + SDL_SENSOR_GYRO_L, /**< Gyroscope for left Joy-Con controller */ + SDL_SENSOR_ACCEL_R, /**< Accelerometer for right Joy-Con controller */ + SDL_SENSOR_GYRO_R /**< Gyroscope for right Joy-Con controller */ +} SDL_SensorType; + +/** + * Accelerometer sensor + * + * The accelerometer returns the current acceleration in SI meters per + * second squared. This measurement includes the force of gravity, so + * a device at rest will have an value of SDL_STANDARD_GRAVITY away + * from the center of the earth. + * + * values[0]: Acceleration on the x axis + * values[1]: Acceleration on the y axis + * values[2]: Acceleration on the z axis + * + * For phones held in portrait mode and game controllers held in front of you, + * the axes are defined as follows: + * -X ... +X : left ... right + * -Y ... +Y : bottom ... top + * -Z ... +Z : farther ... closer + * + * The axis data is not changed when the phone is rotated. + * + * \sa SDL_GetDisplayOrientation() + */ +#define SDL_STANDARD_GRAVITY 9.80665f + +/** + * Gyroscope sensor + * + * The gyroscope returns the current rate of rotation in radians per second. + * The rotation is positive in the counter-clockwise direction. That is, + * an observer looking from a positive location on one of the axes would + * see positive rotation on that axis when it appeared to be rotating + * counter-clockwise. + * + * values[0]: Angular speed around the x axis (pitch) + * values[1]: Angular speed around the y axis (yaw) + * values[2]: Angular speed around the z axis (roll) + * + * For phones held in portrait mode and game controllers held in front of you, + * the axes are defined as follows: + * -X ... +X : left ... right + * -Y ... +Y : bottom ... top + * -Z ... +Z : farther ... closer + * + * The axis data is not changed when the phone or controller is rotated. + * + * \sa SDL_GetDisplayOrientation() + */ + +/* Function prototypes */ + +/** + * Locking for multi-threaded access to the sensor API + * + * If you are using the sensor API or handling events from multiple threads + * you should use these locking functions to protect access to the sensors. + * + * In particular, you are guaranteed that the sensor list won't change, so the + * API functions that take a sensor index will be valid, and sensor events + * will not be delivered. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC void SDLCALL SDL_LockSensors(void); +extern DECLSPEC void SDLCALL SDL_UnlockSensors(void); + +/** + * Count the number of sensors attached to the system right now. + * + * \returns the number of sensors detected. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_NumSensors(void); + +/** + * Get the implementation dependent name of a sensor. + * + * \param device_index The sensor to obtain name from + * \returns the sensor name, or NULL if `device_index` is out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC const char *SDLCALL SDL_SensorGetDeviceName(int device_index); + +/** + * Get the type of a sensor. + * + * \param device_index The sensor to get the type from + * \returns the SDL_SensorType, or `SDL_SENSOR_INVALID` if `device_index` is + * out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorType SDLCALL SDL_SensorGetDeviceType(int device_index); + +/** + * Get the platform dependent type of a sensor. + * + * \param device_index The sensor to check + * \returns the sensor platform dependent type, or -1 if `device_index` is out + * of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetDeviceNonPortableType(int device_index); + +/** + * Get the instance ID of a sensor. + * + * \param device_index The sensor to get instance id from + * \returns the sensor instance ID, or -1 if `device_index` is out of range. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorID SDLCALL SDL_SensorGetDeviceInstanceID(int device_index); + +/** + * Open a sensor for use. + * + * \param device_index The sensor to open + * \returns an SDL_Sensor sensor object, or NULL if an error occurred. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_Sensor *SDLCALL SDL_SensorOpen(int device_index); + +/** + * Return the SDL_Sensor associated with an instance id. + * + * \param instance_id The sensor from instance id + * \returns an SDL_Sensor object. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_Sensor *SDLCALL SDL_SensorFromInstanceID(SDL_SensorID instance_id); + +/** + * Get the implementation dependent name of a sensor + * + * \param sensor The SDL_Sensor object + * \returns the sensor name, or NULL if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC const char *SDLCALL SDL_SensorGetName(SDL_Sensor *sensor); + +/** + * Get the type of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the SDL_SensorType type, or `SDL_SENSOR_INVALID` if `sensor` is + * NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorType SDLCALL SDL_SensorGetType(SDL_Sensor *sensor); + +/** + * Get the platform dependent type of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the sensor platform dependent type, or -1 if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetNonPortableType(SDL_Sensor *sensor); + +/** + * Get the instance ID of a sensor. + * + * \param sensor The SDL_Sensor object to inspect + * \returns the sensor instance ID, or -1 if `sensor` is NULL. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_SensorID SDLCALL SDL_SensorGetInstanceID(SDL_Sensor *sensor); + +/** + * Get the current state of an opened sensor. + * + * The number of values and interpretation of the data is sensor dependent. + * + * \param sensor The SDL_Sensor object to query + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetData(SDL_Sensor *sensor, float *data, int num_values); + +/** + * Get the current state of an opened sensor with the timestamp of the last + * update. + * + * The number of values and interpretation of the data is sensor dependent. + * + * \param sensor The SDL_Sensor object to query + * \param timestamp A pointer filled with the timestamp in microseconds of the + * current sensor reading if available, or 0 if not + * \param data A pointer filled with the current sensor state + * \param num_values The number of values to write to data + * \returns 0 or -1 if an error occurred. + * + * \since This function is available since SDL 2.26.0. + */ +extern DECLSPEC int SDLCALL SDL_SensorGetDataWithTimestamp(SDL_Sensor *sensor, Uint64 *timestamp, float *data, int num_values); + +/** + * Close a sensor previously opened with SDL_SensorOpen(). + * + * \param sensor The SDL_Sensor object to close + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_SensorClose(SDL_Sensor *sensor); + +/** + * Update the current state of the open sensors. + * + * This is called automatically by the event loop if sensor events are + * enabled. + * + * This needs to be called from the thread that initialized the sensor + * subsystem. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_SensorUpdate(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +/* *INDENT-OFF* */ +} +/* *INDENT-ON* */ +#endif +#include "close_code.h" + +#endif /* SDL_sensor_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_shape.h b/include/SDL/SDL_shape.h new file mode 100644 index 0000000..f66babc --- /dev/null +++ b/include/SDL/SDL_shape.h @@ -0,0 +1,155 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_shape_h_ +#define SDL_shape_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** \file SDL_shape.h + * + * Header file for the shaped window API. + */ + +#define SDL_NONSHAPEABLE_WINDOW -1 +#define SDL_INVALID_SHAPE_ARGUMENT -2 +#define SDL_WINDOW_LACKS_SHAPE -3 + +/** + * Create a window that can be shaped with the specified position, dimensions, + * and flags. + * + * \param title The title of the window, in UTF-8 encoding. + * \param x The x position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param y The y position of the window, ::SDL_WINDOWPOS_CENTERED, or + * ::SDL_WINDOWPOS_UNDEFINED. + * \param w The width of the window. + * \param h The height of the window. + * \param flags The flags for the window, a mask of SDL_WINDOW_BORDERLESS with + * any of the following: ::SDL_WINDOW_OPENGL, + * ::SDL_WINDOW_INPUT_GRABBED, ::SDL_WINDOW_HIDDEN, + * ::SDL_WINDOW_RESIZABLE, ::SDL_WINDOW_MAXIMIZED, + * ::SDL_WINDOW_MINIMIZED, ::SDL_WINDOW_BORDERLESS is always set, + * and ::SDL_WINDOW_FULLSCREEN is always unset. + * \return the window created, or NULL if window creation failed. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateShapedWindow(const char *title,unsigned int x,unsigned int y,unsigned int w,unsigned int h,Uint32 flags); + +/** + * Return whether the given window is a shaped window. + * + * \param window The window to query for being shaped. + * \return SDL_TRUE if the window is a window that can be shaped, SDL_FALSE if + * the window is unshaped or NULL. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateShapedWindow + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsShapedWindow(const SDL_Window *window); + +/** \brief An enum denoting the specific type of contents present in an SDL_WindowShapeParams union. */ +typedef enum { + /** \brief The default mode, a binarized alpha cutoff of 1. */ + ShapeModeDefault, + /** \brief A binarized alpha cutoff with a given integer value. */ + ShapeModeBinarizeAlpha, + /** \brief A binarized alpha cutoff with a given integer value, but with the opposite comparison. */ + ShapeModeReverseBinarizeAlpha, + /** \brief A color key is applied. */ + ShapeModeColorKey +} WindowShapeMode; + +#define SDL_SHAPEMODEALPHA(mode) (mode == ShapeModeDefault || mode == ShapeModeBinarizeAlpha || mode == ShapeModeReverseBinarizeAlpha) + +/** \brief A union containing parameters for shaped windows. */ +typedef union { + /** \brief A cutoff alpha value for binarization of the window shape's alpha channel. */ + Uint8 binarizationCutoff; + SDL_Color colorKey; +} SDL_WindowShapeParams; + +/** \brief A struct that tags the SDL_WindowShapeParams union with an enum describing the type of its contents. */ +typedef struct SDL_WindowShapeMode { + /** \brief The mode of these window-shape parameters. */ + WindowShapeMode mode; + /** \brief Window-shape parameters. */ + SDL_WindowShapeParams parameters; +} SDL_WindowShapeMode; + +/** + * Set the shape and parameters of a shaped window. + * + * \param window The shaped window whose parameters should be set. + * \param shape A surface encoding the desired shape for the window. + * \param shape_mode The parameters to set for the shaped window. + * \return 0 on success, SDL_INVALID_SHAPE_ARGUMENT on an invalid shape + * argument, or SDL_NONSHAPEABLE_WINDOW if the SDL_Window given does + * not reference a valid shaped window. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WindowShapeMode + * \sa SDL_GetShapedWindowMode + */ +extern DECLSPEC int SDLCALL SDL_SetWindowShape(SDL_Window *window,SDL_Surface *shape,SDL_WindowShapeMode *shape_mode); + +/** + * Get the shape parameters of a shaped window. + * + * \param window The shaped window whose parameters should be retrieved. + * \param shape_mode An empty shape-mode structure to fill, or NULL to check + * whether the window has a shape. + * \return 0 if the window has a shape and, provided shape_mode was not NULL, + * shape_mode has been filled with the mode data, + * SDL_NONSHAPEABLE_WINDOW if the SDL_Window given is not a shaped + * window, or SDL_WINDOW_LACKS_SHAPE if the SDL_Window given is a + * shapeable window currently lacking a shape. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_WindowShapeMode + * \sa SDL_SetWindowShape + */ +extern DECLSPEC int SDLCALL SDL_GetShapedWindowMode(SDL_Window *window,SDL_WindowShapeMode *shape_mode); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_shape_h_ */ diff --git a/include/SDL/SDL_stdinc.h b/include/SDL/SDL_stdinc.h new file mode 100644 index 0000000..bbce3d0 --- /dev/null +++ b/include/SDL/SDL_stdinc.h @@ -0,0 +1,830 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_stdinc.h + * + * This is a general header that includes C language support. + */ + +#ifndef SDL_stdinc_h_ +#define SDL_stdinc_h_ + +#include "SDL_config.h" + +#ifdef __APPLE__ +#ifndef _DARWIN_C_SOURCE +#define _DARWIN_C_SOURCE 1 /* for memset_pattern4() */ +#endif +#endif + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_STDIO_H +#include +#endif +#if defined(STDC_HEADERS) +# include +# include +# include +#else +# if defined(HAVE_STDLIB_H) +# include +# elif defined(HAVE_MALLOC_H) +# include +# endif +# if defined(HAVE_STDDEF_H) +# include +# endif +# if defined(HAVE_STDARG_H) +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H) +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_WCHAR_H +# include +#endif +#if defined(HAVE_INTTYPES_H) +# include +#elif defined(HAVE_STDINT_H) +# include +#endif +#ifdef HAVE_CTYPE_H +# include +#endif +#ifdef HAVE_MATH_H +# if defined(_MSC_VER) +/* Defining _USE_MATH_DEFINES is required to get M_PI to be defined on + Visual Studio. See http://msdn.microsoft.com/en-us/library/4hwaceh6.aspx + for more information. +*/ +# define _USE_MATH_DEFINES +# endif +# include +#endif +#ifdef HAVE_FLOAT_H +# include +#endif +#if defined(HAVE_ALLOCA) && !defined(alloca) +# if defined(HAVE_ALLOCA_H) +# include +# elif defined(__GNUC__) +# define alloca __builtin_alloca +# elif defined(_MSC_VER) +# include +# define alloca _alloca +# elif defined(__WATCOMC__) +# include +# elif defined(__BORLANDC__) +# include +# elif defined(__DMC__) +# include +# elif defined(__AIX__) +#pragma alloca +# elif defined(__MRC__) +void *alloca(unsigned); +# else +char *alloca(); +# endif +#endif + +#ifdef SIZE_MAX +# define SDL_SIZE_MAX SIZE_MAX +#else +# define SDL_SIZE_MAX ((size_t) -1) +#endif + +/** + * Check if the compiler supports a given builtin. + * Supported by virtually all clang versions and recent gcc. Use this + * instead of checking the clang version if possible. + */ +#ifdef __has_builtin +#define _SDL_HAS_BUILTIN(x) __has_builtin(x) +#else +#define _SDL_HAS_BUILTIN(x) 0 +#endif + +/** + * The number of elements in an array. + */ +#define SDL_arraysize(array) (sizeof(array)/sizeof(array[0])) +#define SDL_TABLESIZE(table) SDL_arraysize(table) + +/** + * Macro useful for building other macros with strings in them + * + * e.g. #define LOG_ERROR(X) OutputDebugString(SDL_STRINGIFY_ARG(__FUNCTION__) ": " X "\n") + */ +#define SDL_STRINGIFY_ARG(arg) #arg + +/** + * \name Cast operators + * + * Use proper C++ casts when compiled as C++ to be compatible with the option + * -Wold-style-cast of GCC (and -Werror=old-style-cast in GCC 4.2 and above). + */ +/* @{ */ +#ifdef __cplusplus +#define SDL_reinterpret_cast(type, expression) reinterpret_cast(expression) +#define SDL_static_cast(type, expression) static_cast(expression) +#define SDL_const_cast(type, expression) const_cast(expression) +#else +#define SDL_reinterpret_cast(type, expression) ((type)(expression)) +#define SDL_static_cast(type, expression) ((type)(expression)) +#define SDL_const_cast(type, expression) ((type)(expression)) +#endif +/* @} *//* Cast operators */ + +/* Define a four character code as a Uint32 */ +#define SDL_FOURCC(A, B, C, D) \ + ((SDL_static_cast(Uint32, SDL_static_cast(Uint8, (A))) << 0) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (B))) << 8) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (C))) << 16) | \ + (SDL_static_cast(Uint32, SDL_static_cast(Uint8, (D))) << 24)) + +/** + * \name Basic data types + */ +/* @{ */ + +#ifdef __CC_ARM +/* ARM's compiler throws warnings if we use an enum: like "SDL_bool x = a < b;" */ +#define SDL_FALSE 0 +#define SDL_TRUE 1 +typedef int SDL_bool; +#else +typedef enum +{ + SDL_FALSE = 0, + SDL_TRUE = 1 +} SDL_bool; +#endif + +/** + * \brief A signed 8-bit integer type. + */ +#define SDL_MAX_SINT8 ((Sint8)0x7F) /* 127 */ +#define SDL_MIN_SINT8 ((Sint8)(~0x7F)) /* -128 */ +typedef int8_t Sint8; +/** + * \brief An unsigned 8-bit integer type. + */ +#define SDL_MAX_UINT8 ((Uint8)0xFF) /* 255 */ +#define SDL_MIN_UINT8 ((Uint8)0x00) /* 0 */ +typedef uint8_t Uint8; +/** + * \brief A signed 16-bit integer type. + */ +#define SDL_MAX_SINT16 ((Sint16)0x7FFF) /* 32767 */ +#define SDL_MIN_SINT16 ((Sint16)(~0x7FFF)) /* -32768 */ +typedef int16_t Sint16; +/** + * \brief An unsigned 16-bit integer type. + */ +#define SDL_MAX_UINT16 ((Uint16)0xFFFF) /* 65535 */ +#define SDL_MIN_UINT16 ((Uint16)0x0000) /* 0 */ +typedef uint16_t Uint16; +/** + * \brief A signed 32-bit integer type. + */ +#define SDL_MAX_SINT32 ((Sint32)0x7FFFFFFF) /* 2147483647 */ +#define SDL_MIN_SINT32 ((Sint32)(~0x7FFFFFFF)) /* -2147483648 */ +typedef int32_t Sint32; +/** + * \brief An unsigned 32-bit integer type. + */ +#define SDL_MAX_UINT32 ((Uint32)0xFFFFFFFFu) /* 4294967295 */ +#define SDL_MIN_UINT32 ((Uint32)0x00000000) /* 0 */ +typedef uint32_t Uint32; + +/** + * \brief A signed 64-bit integer type. + */ +#define SDL_MAX_SINT64 ((Sint64)0x7FFFFFFFFFFFFFFFll) /* 9223372036854775807 */ +#define SDL_MIN_SINT64 ((Sint64)(~0x7FFFFFFFFFFFFFFFll)) /* -9223372036854775808 */ +typedef int64_t Sint64; +/** + * \brief An unsigned 64-bit integer type. + */ +#define SDL_MAX_UINT64 ((Uint64)0xFFFFFFFFFFFFFFFFull) /* 18446744073709551615 */ +#define SDL_MIN_UINT64 ((Uint64)(0x0000000000000000ull)) /* 0 */ +typedef uint64_t Uint64; + +/* @} *//* Basic data types */ + +/** + * \name Floating-point constants + */ +/* @{ */ + +#ifdef FLT_EPSILON +#define SDL_FLT_EPSILON FLT_EPSILON +#else +#define SDL_FLT_EPSILON 1.1920928955078125e-07F /* 0x0.000002p0 */ +#endif + +/* @} *//* Floating-point constants */ + +/* Make sure we have macros for printing width-based integers. + * should define these but this is not true all platforms. + * (for example win32) */ +#ifndef SDL_PRIs64 +#ifdef PRIs64 +#define SDL_PRIs64 PRIs64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIs64 "I64d" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIs64 "ld" +#else +#define SDL_PRIs64 "lld" +#endif +#endif +#ifndef SDL_PRIu64 +#ifdef PRIu64 +#define SDL_PRIu64 PRIu64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIu64 "I64u" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIu64 "lu" +#else +#define SDL_PRIu64 "llu" +#endif +#endif +#ifndef SDL_PRIx64 +#ifdef PRIx64 +#define SDL_PRIx64 PRIx64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIx64 "I64x" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIx64 "lx" +#else +#define SDL_PRIx64 "llx" +#endif +#endif +#ifndef SDL_PRIX64 +#ifdef PRIX64 +#define SDL_PRIX64 PRIX64 +#elif defined(__WIN32__) || defined(__GDK__) +#define SDL_PRIX64 "I64X" +#elif defined(__LINUX__) && defined(__LP64__) +#define SDL_PRIX64 "lX" +#else +#define SDL_PRIX64 "llX" +#endif +#endif +#ifndef SDL_PRIs32 +#ifdef PRId32 +#define SDL_PRIs32 PRId32 +#else +#define SDL_PRIs32 "d" +#endif +#endif +#ifndef SDL_PRIu32 +#ifdef PRIu32 +#define SDL_PRIu32 PRIu32 +#else +#define SDL_PRIu32 "u" +#endif +#endif +#ifndef SDL_PRIx32 +#ifdef PRIx32 +#define SDL_PRIx32 PRIx32 +#else +#define SDL_PRIx32 "x" +#endif +#endif +#ifndef SDL_PRIX32 +#ifdef PRIX32 +#define SDL_PRIX32 PRIX32 +#else +#define SDL_PRIX32 "X" +#endif +#endif + +/* Annotations to help code analysis tools */ +#ifdef SDL_DISABLE_ANALYZE_MACROS +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#else +#if defined(_MSC_VER) && (_MSC_VER >= 1600) /* VS 2010 and above */ +#include + +#define SDL_IN_BYTECAP(x) _In_bytecount_(x) +#define SDL_INOUT_Z_CAP(x) _Inout_z_cap_(x) +#define SDL_OUT_Z_CAP(x) _Out_z_cap_(x) +#define SDL_OUT_CAP(x) _Out_cap_(x) +#define SDL_OUT_BYTECAP(x) _Out_bytecap_(x) +#define SDL_OUT_Z_BYTECAP(x) _Out_z_bytecap_(x) + +#define SDL_PRINTF_FORMAT_STRING _Printf_format_string_ +#define SDL_SCANF_FORMAT_STRING _Scanf_format_string_impl_ +#else +#define SDL_IN_BYTECAP(x) +#define SDL_INOUT_Z_CAP(x) +#define SDL_OUT_Z_CAP(x) +#define SDL_OUT_CAP(x) +#define SDL_OUT_BYTECAP(x) +#define SDL_OUT_Z_BYTECAP(x) +#define SDL_PRINTF_FORMAT_STRING +#define SDL_SCANF_FORMAT_STRING +#endif +#if defined(__GNUC__) +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __printf__, fmtargnumber, fmtargnumber+1 ))) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) __attribute__ (( format( __scanf__, fmtargnumber, fmtargnumber+1 ))) +#else +#define SDL_PRINTF_VARARG_FUNC( fmtargnumber ) +#define SDL_SCANF_VARARG_FUNC( fmtargnumber ) +#endif +#endif /* SDL_DISABLE_ANALYZE_MACROS */ + +#ifndef SDL_COMPILE_TIME_ASSERT +#if defined(__cplusplus) +#if (__cplusplus >= 201103L) +#define SDL_COMPILE_TIME_ASSERT(name, x) static_assert(x, #x) +#endif +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define SDL_COMPILE_TIME_ASSERT(name, x) _Static_assert(x, #x) +#endif +#endif /* !SDL_COMPILE_TIME_ASSERT */ + +#ifndef SDL_COMPILE_TIME_ASSERT +/* universal, but may trigger -Wunused-local-typedefs */ +#define SDL_COMPILE_TIME_ASSERT(name, x) \ + typedef int SDL_compile_time_assert_ ## name[(x) * 2 - 1] +#endif + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +SDL_COMPILE_TIME_ASSERT(uint8, sizeof(Uint8) == 1); +SDL_COMPILE_TIME_ASSERT(sint8, sizeof(Sint8) == 1); +SDL_COMPILE_TIME_ASSERT(uint16, sizeof(Uint16) == 2); +SDL_COMPILE_TIME_ASSERT(sint16, sizeof(Sint16) == 2); +SDL_COMPILE_TIME_ASSERT(uint32, sizeof(Uint32) == 4); +SDL_COMPILE_TIME_ASSERT(sint32, sizeof(Sint32) == 4); +SDL_COMPILE_TIME_ASSERT(uint64, sizeof(Uint64) == 8); +SDL_COMPILE_TIME_ASSERT(sint64, sizeof(Sint64) == 8); +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +/* Check to make sure enums are the size of ints, for structure packing. + For both Watcom C/C++ and Borland C/C++ the compiler option that makes + enums having the size of an int must be enabled. + This is "-b" for Borland C/C++ and "-ei" for Watcom C/C++ (v11). +*/ + +/** \cond */ +#ifndef DOXYGEN_SHOULD_IGNORE_THIS +#if !defined(__ANDROID__) && !defined(__VITA__) && !defined(__3DS__) + /* TODO: include/SDL_stdinc.h:174: error: size of array 'SDL_dummy_enum' is negative */ +typedef enum +{ + DUMMY_ENUM_VALUE +} SDL_DUMMY_ENUM; + +SDL_COMPILE_TIME_ASSERT(enum, sizeof(SDL_DUMMY_ENUM) == sizeof(int)); +#endif +#endif /* DOXYGEN_SHOULD_IGNORE_THIS */ +/** \endcond */ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_ALLOCA +#define SDL_stack_alloc(type, count) (type*)alloca(sizeof(type)*(count)) +#define SDL_stack_free(data) +#else +#define SDL_stack_alloc(type, count) (type*)SDL_malloc(sizeof(type)*(count)) +#define SDL_stack_free(data) SDL_free(data) +#endif + +extern DECLSPEC void *SDLCALL SDL_malloc(size_t size); +extern DECLSPEC void *SDLCALL SDL_calloc(size_t nmemb, size_t size); +extern DECLSPEC void *SDLCALL SDL_realloc(void *mem, size_t size); +extern DECLSPEC void SDLCALL SDL_free(void *mem); + +typedef void *(SDLCALL *SDL_malloc_func)(size_t size); +typedef void *(SDLCALL *SDL_calloc_func)(size_t nmemb, size_t size); +typedef void *(SDLCALL *SDL_realloc_func)(void *mem, size_t size); +typedef void (SDLCALL *SDL_free_func)(void *mem); + +/** + * Get the original set of SDL memory functions + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC void SDLCALL SDL_GetOriginalMemoryFunctions(SDL_malloc_func *malloc_func, + SDL_calloc_func *calloc_func, + SDL_realloc_func *realloc_func, + SDL_free_func *free_func); + +/** + * Get the current set of SDL memory functions + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC void SDLCALL SDL_GetMemoryFunctions(SDL_malloc_func *malloc_func, + SDL_calloc_func *calloc_func, + SDL_realloc_func *realloc_func, + SDL_free_func *free_func); + +/** + * Replace SDL's memory allocation functions with a custom set + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC int SDLCALL SDL_SetMemoryFunctions(SDL_malloc_func malloc_func, + SDL_calloc_func calloc_func, + SDL_realloc_func realloc_func, + SDL_free_func free_func); + +/** + * Get the number of outstanding (unfreed) allocations + * + * \since This function is available since SDL 2.0.7. + */ +extern DECLSPEC int SDLCALL SDL_GetNumAllocations(void); + +extern DECLSPEC char *SDLCALL SDL_getenv(const char *name); +extern DECLSPEC int SDLCALL SDL_setenv(const char *name, const char *value, int overwrite); + +extern DECLSPEC void SDLCALL SDL_qsort(void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); +extern DECLSPEC void * SDLCALL SDL_bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (SDLCALL *compare) (const void *, const void *)); + +extern DECLSPEC int SDLCALL SDL_abs(int x); + +/* NOTE: these double-evaluate their arguments, so you should never have side effects in the parameters */ +#define SDL_min(x, y) (((x) < (y)) ? (x) : (y)) +#define SDL_max(x, y) (((x) > (y)) ? (x) : (y)) +#define SDL_clamp(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x))) + +extern DECLSPEC int SDLCALL SDL_isalpha(int x); +extern DECLSPEC int SDLCALL SDL_isalnum(int x); +extern DECLSPEC int SDLCALL SDL_isblank(int x); +extern DECLSPEC int SDLCALL SDL_iscntrl(int x); +extern DECLSPEC int SDLCALL SDL_isdigit(int x); +extern DECLSPEC int SDLCALL SDL_isxdigit(int x); +extern DECLSPEC int SDLCALL SDL_ispunct(int x); +extern DECLSPEC int SDLCALL SDL_isspace(int x); +extern DECLSPEC int SDLCALL SDL_isupper(int x); +extern DECLSPEC int SDLCALL SDL_islower(int x); +extern DECLSPEC int SDLCALL SDL_isprint(int x); +extern DECLSPEC int SDLCALL SDL_isgraph(int x); +extern DECLSPEC int SDLCALL SDL_toupper(int x); +extern DECLSPEC int SDLCALL SDL_tolower(int x); + +extern DECLSPEC Uint16 SDLCALL SDL_crc16(Uint16 crc, const void *data, size_t len); +extern DECLSPEC Uint32 SDLCALL SDL_crc32(Uint32 crc, const void *data, size_t len); + +extern DECLSPEC void *SDLCALL SDL_memset(SDL_OUT_BYTECAP(len) void *dst, int c, size_t len); + +#define SDL_zero(x) SDL_memset(&(x), 0, sizeof((x))) +#define SDL_zerop(x) SDL_memset((x), 0, sizeof(*(x))) +#define SDL_zeroa(x) SDL_memset((x), 0, sizeof((x))) + +#define SDL_copyp(dst, src) \ + { SDL_COMPILE_TIME_ASSERT(SDL_copyp, sizeof (*(dst)) == sizeof (*(src))); } \ + SDL_memcpy((dst), (src), sizeof (*(src))) + + +/* Note that memset() is a byte assignment and this is a 32-bit assignment, so they're not directly equivalent. */ +SDL_FORCE_INLINE void SDL_memset4(void *dst, Uint32 val, size_t dwords) +{ +#ifdef __APPLE__ + memset_pattern4(dst, &val, dwords * 4); +#elif defined(__GNUC__) && defined(__i386__) + int u0, u1, u2; + __asm__ __volatile__ ( + "cld \n\t" + "rep ; stosl \n\t" + : "=&D" (u0), "=&a" (u1), "=&c" (u2) + : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords)) + : "memory" + ); +#else + size_t _n = (dwords + 3) / 4; + Uint32 *_p = SDL_static_cast(Uint32 *, dst); + Uint32 _val = (val); + if (dwords == 0) { + return; + } + switch (dwords % 4) { + case 0: do { *_p++ = _val; SDL_FALLTHROUGH; + case 3: *_p++ = _val; SDL_FALLTHROUGH; + case 2: *_p++ = _val; SDL_FALLTHROUGH; + case 1: *_p++ = _val; + } while ( --_n ); + } +#endif +} + +extern DECLSPEC void *SDLCALL SDL_memcpy(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); + +extern DECLSPEC void *SDLCALL SDL_memmove(SDL_OUT_BYTECAP(len) void *dst, SDL_IN_BYTECAP(len) const void *src, size_t len); +extern DECLSPEC int SDLCALL SDL_memcmp(const void *s1, const void *s2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_wcslen(const wchar_t *wstr); +extern DECLSPEC size_t SDLCALL SDL_wcslcpy(SDL_OUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_wcslcat(SDL_INOUT_Z_CAP(maxlen) wchar_t *dst, const wchar_t *src, size_t maxlen); +extern DECLSPEC wchar_t *SDLCALL SDL_wcsdup(const wchar_t *wstr); +extern DECLSPEC wchar_t *SDLCALL SDL_wcsstr(const wchar_t *haystack, const wchar_t *needle); + +extern DECLSPEC int SDLCALL SDL_wcscmp(const wchar_t *str1, const wchar_t *str2); +extern DECLSPEC int SDLCALL SDL_wcsncmp(const wchar_t *str1, const wchar_t *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_wcscasecmp(const wchar_t *str1, const wchar_t *str2); +extern DECLSPEC int SDLCALL SDL_wcsncasecmp(const wchar_t *str1, const wchar_t *str2, size_t len); + +extern DECLSPEC size_t SDLCALL SDL_strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_strlcpy(SDL_OUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); +extern DECLSPEC size_t SDLCALL SDL_utf8strlcpy(SDL_OUT_Z_CAP(dst_bytes) char *dst, const char *src, size_t dst_bytes); +extern DECLSPEC size_t SDLCALL SDL_strlcat(SDL_INOUT_Z_CAP(maxlen) char *dst, const char *src, size_t maxlen); +extern DECLSPEC char *SDLCALL SDL_strdup(const char *str); +extern DECLSPEC char *SDLCALL SDL_strrev(char *str); +extern DECLSPEC char *SDLCALL SDL_strupr(char *str); +extern DECLSPEC char *SDLCALL SDL_strlwr(char *str); +extern DECLSPEC char *SDLCALL SDL_strchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strrchr(const char *str, int c); +extern DECLSPEC char *SDLCALL SDL_strstr(const char *haystack, const char *needle); +extern DECLSPEC char *SDLCALL SDL_strcasestr(const char *haystack, const char *needle); +extern DECLSPEC char *SDLCALL SDL_strtokr(char *s1, const char *s2, char **saveptr); +extern DECLSPEC size_t SDLCALL SDL_utf8strlen(const char *str); +extern DECLSPEC size_t SDLCALL SDL_utf8strnlen(const char *str, size_t bytes); + +extern DECLSPEC char *SDLCALL SDL_itoa(int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_uitoa(unsigned int value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ltoa(long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ultoa(unsigned long value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_lltoa(Sint64 value, char *str, int radix); +extern DECLSPEC char *SDLCALL SDL_ulltoa(Uint64 value, char *str, int radix); + +extern DECLSPEC int SDLCALL SDL_atoi(const char *str); +extern DECLSPEC double SDLCALL SDL_atof(const char *str); +extern DECLSPEC long SDLCALL SDL_strtol(const char *str, char **endp, int base); +extern DECLSPEC unsigned long SDLCALL SDL_strtoul(const char *str, char **endp, int base); +extern DECLSPEC Sint64 SDLCALL SDL_strtoll(const char *str, char **endp, int base); +extern DECLSPEC Uint64 SDLCALL SDL_strtoull(const char *str, char **endp, int base); +extern DECLSPEC double SDLCALL SDL_strtod(const char *str, char **endp); + +extern DECLSPEC int SDLCALL SDL_strcmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncmp(const char *str1, const char *str2, size_t maxlen); +extern DECLSPEC int SDLCALL SDL_strcasecmp(const char *str1, const char *str2); +extern DECLSPEC int SDLCALL SDL_strncasecmp(const char *str1, const char *str2, size_t len); + +extern DECLSPEC int SDLCALL SDL_sscanf(const char *text, SDL_SCANF_FORMAT_STRING const char *fmt, ...) SDL_SCANF_VARARG_FUNC(2); +extern DECLSPEC int SDLCALL SDL_vsscanf(const char *text, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_snprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, SDL_PRINTF_FORMAT_STRING const char *fmt, ... ) SDL_PRINTF_VARARG_FUNC(3); +extern DECLSPEC int SDLCALL SDL_vsnprintf(SDL_OUT_Z_CAP(maxlen) char *text, size_t maxlen, const char *fmt, va_list ap); +extern DECLSPEC int SDLCALL SDL_asprintf(char **strp, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); +extern DECLSPEC int SDLCALL SDL_vasprintf(char **strp, const char *fmt, va_list ap); + +#ifndef HAVE_M_PI +#ifndef M_PI +#define M_PI 3.14159265358979323846264338327950288 /**< pi */ +#endif +#endif + +/** + * Use this function to compute arc cosine of `x`. + * + * The definition of `y = acos(x)` is `x = cos(y)`. + * + * Domain: `-1 <= x <= 1` + * + * Range: `0 <= y <= Pi` + * + * \param x floating point value, in radians. + * \returns arc cosine of `x`. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC double SDLCALL SDL_acos(double x); +extern DECLSPEC float SDLCALL SDL_acosf(float x); +extern DECLSPEC double SDLCALL SDL_asin(double x); +extern DECLSPEC float SDLCALL SDL_asinf(float x); +extern DECLSPEC double SDLCALL SDL_atan(double x); +extern DECLSPEC float SDLCALL SDL_atanf(float x); +extern DECLSPEC double SDLCALL SDL_atan2(double y, double x); +extern DECLSPEC float SDLCALL SDL_atan2f(float y, float x); +extern DECLSPEC double SDLCALL SDL_ceil(double x); +extern DECLSPEC float SDLCALL SDL_ceilf(float x); +extern DECLSPEC double SDLCALL SDL_copysign(double x, double y); +extern DECLSPEC float SDLCALL SDL_copysignf(float x, float y); +extern DECLSPEC double SDLCALL SDL_cos(double x); +extern DECLSPEC float SDLCALL SDL_cosf(float x); +extern DECLSPEC double SDLCALL SDL_exp(double x); +extern DECLSPEC float SDLCALL SDL_expf(float x); +extern DECLSPEC double SDLCALL SDL_fabs(double x); +extern DECLSPEC float SDLCALL SDL_fabsf(float x); +extern DECLSPEC double SDLCALL SDL_floor(double x); +extern DECLSPEC float SDLCALL SDL_floorf(float x); +extern DECLSPEC double SDLCALL SDL_trunc(double x); +extern DECLSPEC float SDLCALL SDL_truncf(float x); +extern DECLSPEC double SDLCALL SDL_fmod(double x, double y); +extern DECLSPEC float SDLCALL SDL_fmodf(float x, float y); +extern DECLSPEC double SDLCALL SDL_log(double x); +extern DECLSPEC float SDLCALL SDL_logf(float x); +extern DECLSPEC double SDLCALL SDL_log10(double x); +extern DECLSPEC float SDLCALL SDL_log10f(float x); +extern DECLSPEC double SDLCALL SDL_pow(double x, double y); +extern DECLSPEC float SDLCALL SDL_powf(float x, float y); +extern DECLSPEC double SDLCALL SDL_round(double x); +extern DECLSPEC float SDLCALL SDL_roundf(float x); +extern DECLSPEC long SDLCALL SDL_lround(double x); +extern DECLSPEC long SDLCALL SDL_lroundf(float x); +extern DECLSPEC double SDLCALL SDL_scalbn(double x, int n); +extern DECLSPEC float SDLCALL SDL_scalbnf(float x, int n); +extern DECLSPEC double SDLCALL SDL_sin(double x); +extern DECLSPEC float SDLCALL SDL_sinf(float x); +extern DECLSPEC double SDLCALL SDL_sqrt(double x); +extern DECLSPEC float SDLCALL SDL_sqrtf(float x); +extern DECLSPEC double SDLCALL SDL_tan(double x); +extern DECLSPEC float SDLCALL SDL_tanf(float x); + +/* The SDL implementation of iconv() returns these error codes */ +#define SDL_ICONV_ERROR (size_t)-1 +#define SDL_ICONV_E2BIG (size_t)-2 +#define SDL_ICONV_EILSEQ (size_t)-3 +#define SDL_ICONV_EINVAL (size_t)-4 + +/* SDL_iconv_* are now always real symbols/types, not macros or inlined. */ +typedef struct _SDL_iconv_t *SDL_iconv_t; +extern DECLSPEC SDL_iconv_t SDLCALL SDL_iconv_open(const char *tocode, + const char *fromcode); +extern DECLSPEC int SDLCALL SDL_iconv_close(SDL_iconv_t cd); +extern DECLSPEC size_t SDLCALL SDL_iconv(SDL_iconv_t cd, const char **inbuf, + size_t * inbytesleft, char **outbuf, + size_t * outbytesleft); + +/** + * This function converts a string between encodings in one pass, returning a + * string that must be freed with SDL_free() or NULL on error. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC char *SDLCALL SDL_iconv_string(const char *tocode, + const char *fromcode, + const char *inbuf, + size_t inbytesleft); +#define SDL_iconv_utf8_locale(S) SDL_iconv_string("", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs2(S) (Uint16 *)SDL_iconv_string("UCS-2-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_utf8_ucs4(S) (Uint32 *)SDL_iconv_string("UCS-4-INTERNAL", "UTF-8", S, SDL_strlen(S)+1) +#define SDL_iconv_wchar_utf8(S) SDL_iconv_string("UTF-8", "WCHAR_T", (char *)S, (SDL_wcslen(S)+1)*sizeof(wchar_t)) + +/* force builds using Clang's static analysis tools to use literal C runtime + here, since there are possibly tests that are ineffective otherwise. */ +#if defined(__clang_analyzer__) && !defined(SDL_DISABLE_ANALYZE_MACROS) + +/* The analyzer knows about strlcpy even when the system doesn't provide it */ +#ifndef HAVE_STRLCPY +size_t strlcpy(char* dst, const char* src, size_t size); +#endif + +/* The analyzer knows about strlcat even when the system doesn't provide it */ +#ifndef HAVE_STRLCAT +size_t strlcat(char* dst, const char* src, size_t size); +#endif + +#define SDL_malloc malloc +#define SDL_calloc calloc +#define SDL_realloc realloc +#define SDL_free free +#define SDL_memset memset +#define SDL_memcpy memcpy +#define SDL_memmove memmove +#define SDL_memcmp memcmp +#define SDL_strlcpy strlcpy +#define SDL_strlcat strlcat +#define SDL_strlen strlen +#define SDL_wcslen wcslen +#define SDL_wcslcpy wcslcpy +#define SDL_wcslcat wcslcat +#define SDL_strdup strdup +#define SDL_wcsdup wcsdup +#define SDL_strchr strchr +#define SDL_strrchr strrchr +#define SDL_strstr strstr +#define SDL_wcsstr wcsstr +#define SDL_strtokr strtok_r +#define SDL_strcmp strcmp +#define SDL_wcscmp wcscmp +#define SDL_strncmp strncmp +#define SDL_wcsncmp wcsncmp +#define SDL_strcasecmp strcasecmp +#define SDL_strncasecmp strncasecmp +#define SDL_sscanf sscanf +#define SDL_vsscanf vsscanf +#define SDL_snprintf snprintf +#define SDL_vsnprintf vsnprintf +#endif + +SDL_FORCE_INLINE void *SDL_memcpy4(SDL_OUT_BYTECAP(dwords*4) void *dst, SDL_IN_BYTECAP(dwords*4) const void *src, size_t dwords) +{ + return SDL_memcpy(dst, src, dwords * 4); +} + +/** + * If a * b would overflow, return -1. Otherwise store a * b via ret + * and return 0. + * + * \since This function is available since SDL 2.24.0. + */ +SDL_FORCE_INLINE int SDL_size_mul_overflow (size_t a, + size_t b, + size_t *ret) +{ + if (a != 0 && b > SDL_SIZE_MAX / a) { + return -1; + } + *ret = a * b; + return 0; +} + +#if _SDL_HAS_BUILTIN(__builtin_mul_overflow) +/* This needs to be wrapped in an inline rather than being a direct #define, + * because __builtin_mul_overflow() is type-generic, but we want to be + * consistent about interpreting a and b as size_t. */ +SDL_FORCE_INLINE int _SDL_size_mul_overflow_builtin (size_t a, + size_t b, + size_t *ret) +{ + return __builtin_mul_overflow(a, b, ret) == 0 ? 0 : -1; +} +#define SDL_size_mul_overflow(a, b, ret) (_SDL_size_mul_overflow_builtin(a, b, ret)) +#endif + +/** + * If a + b would overflow, return -1. Otherwise store a + b via ret + * and return 0. + * + * \since This function is available since SDL 2.24.0. + */ +SDL_FORCE_INLINE int SDL_size_add_overflow (size_t a, + size_t b, + size_t *ret) +{ + if (b > SDL_SIZE_MAX - a) { + return -1; + } + *ret = a + b; + return 0; +} + +#if _SDL_HAS_BUILTIN(__builtin_add_overflow) +/* This needs to be wrapped in an inline rather than being a direct #define, + * the same as the call to __builtin_mul_overflow() above. */ +SDL_FORCE_INLINE int _SDL_size_add_overflow_builtin (size_t a, + size_t b, + size_t *ret) +{ + return __builtin_add_overflow(a, b, ret) == 0 ? 0 : -1; +} +#define SDL_size_add_overflow(a, b, ret) (_SDL_size_add_overflow_builtin(a, b, ret)) +#endif + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_stdinc_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_surface.h b/include/SDL/SDL_surface.h new file mode 100644 index 0000000..d6ee615 --- /dev/null +++ b/include/SDL/SDL_surface.h @@ -0,0 +1,997 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_surface.h + * + * Header file for ::SDL_Surface definition and management functions. + */ + +#ifndef SDL_surface_h_ +#define SDL_surface_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_blendmode.h" +#include "SDL_rwops.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \name Surface flags + * + * These are the currently supported flags for the ::SDL_Surface. + * + * \internal + * Used internally (read-only). + */ +/* @{ */ +#define SDL_SWSURFACE 0 /**< Just here for compatibility */ +#define SDL_PREALLOC 0x00000001 /**< Surface uses preallocated memory */ +#define SDL_RLEACCEL 0x00000002 /**< Surface is RLE encoded */ +#define SDL_DONTFREE 0x00000004 /**< Surface is referenced internally */ +#define SDL_SIMD_ALIGNED 0x00000008 /**< Surface uses aligned memory */ +/* @} *//* Surface flags */ + +/** + * Evaluates to true if the surface needs to be locked before access. + */ +#define SDL_MUSTLOCK(S) (((S)->flags & SDL_RLEACCEL) != 0) + +typedef struct SDL_BlitMap SDL_BlitMap; /* this is an opaque type. */ + +/** + * \brief A collection of pixels used in software blitting. + * + * \note This structure should be treated as read-only, except for \c pixels, + * which, if not NULL, contains the raw pixel data for the surface. + */ +typedef struct SDL_Surface +{ + Uint32 flags; /**< Read-only */ + SDL_PixelFormat *format; /**< Read-only */ + int w, h; /**< Read-only */ + int pitch; /**< Read-only */ + void *pixels; /**< Read-write */ + + /** Application data associated with the surface */ + void *userdata; /**< Read-write */ + + /** information needed for surfaces requiring locks */ + int locked; /**< Read-only */ + + /** list of BlitMap that hold a reference to this surface */ + void *list_blitmap; /**< Private */ + + /** clipping information */ + SDL_Rect clip_rect; /**< Read-only */ + + /** info for fast blit mapping to other surfaces */ + SDL_BlitMap *map; /**< Private */ + + /** Reference count -- used when freeing surface */ + int refcount; /**< Read-mostly */ +} SDL_Surface; + +/** + * \brief The type of function used for surface blitting functions. + */ +typedef int (SDLCALL *SDL_blit) (struct SDL_Surface * src, SDL_Rect * srcrect, + struct SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * \brief The formula used for converting between YUV and RGB + */ +typedef enum +{ + SDL_YUV_CONVERSION_JPEG, /**< Full range JPEG */ + SDL_YUV_CONVERSION_BT601, /**< BT.601 (the default) */ + SDL_YUV_CONVERSION_BT709, /**< BT.709 */ + SDL_YUV_CONVERSION_AUTOMATIC /**< BT.601 for SD content, BT.709 for HD content */ +} SDL_YUV_CONVERSION_MODE; + +/** + * Allocate a new RGB surface. + * + * If `depth` is 4 or 8 bits, an empty palette is allocated for the surface. + * If `depth` is greater than 8 bits, the pixel format is set using the + * [RGBA]mask parameters. + * + * The [RGBA]mask parameters are the bitmasks used to extract that color from + * a pixel. For instance, `Rmask` being 0xFF000000 means the red data is + * stored in the most significant byte. Using zeros for the RGB masks sets a + * default value, based on the depth. For example: + * + * ```c++ + * SDL_CreateRGBSurface(0,w,h,32,0,0,0,0); + * ``` + * + * However, using zero for the Amask results in an Amask of 0. + * + * By default surfaces with an alpha mask are set up for blending as with: + * + * ```c++ + * SDL_SetSurfaceBlendMode(surface, SDL_BLENDMODE_BLEND) + * ``` + * + * You can change this by calling SDL_SetSurfaceBlendMode() and selecting a + * different `blendMode`. + * + * \param flags the flags are unused and should be set to 0 + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param Rmask the red mask for the pixels + * \param Gmask the green mask for the pixels + * \param Bmask the blue mask for the pixels + * \param Amask the alpha mask for the pixels + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurface + (Uint32 flags, int width, int height, int depth, + Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); + + +/* !!! FIXME for 2.1: why does this ask for depth? Format provides that. */ + +/** + * Allocate a new RGB surface with a specific pixel format. + * + * This function operates mostly like SDL_CreateRGBSurface(), except instead + * of providing pixel color masks, you provide it with a predefined format + * from SDL_PixelFormatEnum. + * + * \param flags the flags are unused and should be set to 0 + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param format the SDL_PixelFormatEnum for the new surface's pixel format. + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormat + (Uint32 flags, int width, int height, int depth, Uint32 format); + +/** + * Allocate a new RGB surface with existing pixel data. + * + * This function operates mostly like SDL_CreateRGBSurface(), except it does + * not allocate memory for the pixel data, instead the caller provides an + * existing buffer of data for the surface to use. + * + * No copy is made of the pixel data. Pixel data is not managed automatically; + * you must free the surface before you free the pixel data. + * + * \param pixels a pointer to existing pixel data + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param pitch the pitch of the surface in bytes + * \param Rmask the red mask for the pixels + * \param Gmask the green mask for the pixels + * \param Bmask the blue mask for the pixels + * \param Amask the alpha mask for the pixels + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceFrom(void *pixels, + int width, + int height, + int depth, + int pitch, + Uint32 Rmask, + Uint32 Gmask, + Uint32 Bmask, + Uint32 Amask); + +/* !!! FIXME for 2.1: why does this ask for depth? Format provides that. */ + +/** + * Allocate a new RGB surface with with a specific pixel format and existing + * pixel data. + * + * This function operates mostly like SDL_CreateRGBSurfaceFrom(), except + * instead of providing pixel color masks, you provide it with a predefined + * format from SDL_PixelFormatEnum. + * + * No copy is made of the pixel data. Pixel data is not managed automatically; + * you must free the surface before you free the pixel data. + * + * \param pixels a pointer to existing pixel data + * \param width the width of the surface + * \param height the height of the surface + * \param depth the depth of the surface in bits + * \param pitch the pitch of the surface in bytes + * \param format the SDL_PixelFormatEnum for the new surface's pixel format. + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_CreateRGBSurfaceWithFormat + * \sa SDL_FreeSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_CreateRGBSurfaceWithFormatFrom + (void *pixels, int width, int height, int depth, int pitch, Uint32 format); + +/** + * Free an RGB surface. + * + * It is safe to pass NULL to this function. + * + * \param surface the SDL_Surface to free. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateRGBSurface + * \sa SDL_CreateRGBSurfaceFrom + * \sa SDL_LoadBMP + * \sa SDL_LoadBMP_RW + */ +extern DECLSPEC void SDLCALL SDL_FreeSurface(SDL_Surface * surface); + +/** + * Set the palette used by a surface. + * + * A single palette can be shared with many surfaces. + * + * \param surface the SDL_Surface structure to update + * \param palette the SDL_Palette structure to use + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SetSurfacePalette(SDL_Surface * surface, + SDL_Palette * palette); + +/** + * Set up a surface for directly accessing the pixels. + * + * Between calls to SDL_LockSurface() / SDL_UnlockSurface(), you can write to + * and read from `surface->pixels`, using the pixel format stored in + * `surface->format`. Once you are done accessing the surface, you should use + * SDL_UnlockSurface() to release it. + * + * Not all surfaces require locking. If `SDL_MUSTLOCK(surface)` evaluates to + * 0, then you can read and write to the surface at any time, and the pixel + * format of the surface will not change. + * + * \param surface the SDL_Surface structure to be locked + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MUSTLOCK + * \sa SDL_UnlockSurface + */ +extern DECLSPEC int SDLCALL SDL_LockSurface(SDL_Surface * surface); + +/** + * Release a surface after directly accessing the pixels. + * + * \param surface the SDL_Surface structure to be unlocked + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LockSurface + */ +extern DECLSPEC void SDLCALL SDL_UnlockSurface(SDL_Surface * surface); + +/** + * Load a BMP image from a seekable SDL data stream. + * + * The new surface should be freed with SDL_FreeSurface(). Not doing so will + * result in a memory leak. + * + * src is an open SDL_RWops buffer, typically loaded with SDL_RWFromFile. + * Alternitavely, you might also use the macro SDL_LoadBMP to load a bitmap + * from a file, convert it to an SDL_Surface and then close the file. + * + * \param src the data stream for the surface + * \param freesrc non-zero to close the stream after being read + * \returns a pointer to a new SDL_Surface structure or NULL if there was an + * error; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FreeSurface + * \sa SDL_RWFromFile + * \sa SDL_LoadBMP + * \sa SDL_SaveBMP_RW + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_LoadBMP_RW(SDL_RWops * src, + int freesrc); + +/** + * Load a surface from a file. + * + * Convenience macro. + */ +#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1) + +/** + * Save a surface to a seekable SDL data stream in BMP format. + * + * Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the + * BMP directly. Other RGB formats with 8-bit or higher get converted to a + * 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit + * surface before they are saved. YUV and paletted 1-bit and 4-bit formats are + * not supported. + * + * \param surface the SDL_Surface structure containing the image to be saved + * \param dst a data stream to save to + * \param freedst non-zero to close the stream after being written + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_LoadBMP_RW + * \sa SDL_SaveBMP + */ +extern DECLSPEC int SDLCALL SDL_SaveBMP_RW + (SDL_Surface * surface, SDL_RWops * dst, int freedst); + +/** + * Save a surface to a file. + * + * Convenience macro. + */ +#define SDL_SaveBMP(surface, file) \ + SDL_SaveBMP_RW(surface, SDL_RWFromFile(file, "wb"), 1) + +/** + * Set the RLE acceleration hint for a surface. + * + * If RLE is enabled, color key and alpha blending blits are much faster, but + * the surface must be locked before directly accessing the pixels. + * + * \param surface the SDL_Surface structure to optimize + * \param flag 0 to disable, non-zero to enable RLE acceleration + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_LockSurface + * \sa SDL_UnlockSurface + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceRLE(SDL_Surface * surface, + int flag); + +/** + * Returns whether the surface is RLE enabled + * + * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * + * \param surface the SDL_Surface structure to query + * \returns SDL_TRUE if the surface is RLE enabled, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + * + * \sa SDL_SetSurfaceRLE + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasSurfaceRLE(SDL_Surface * surface); + +/** + * Set the color key (transparent pixel) in a surface. + * + * The color key defines a pixel value that will be treated as transparent in + * a blit. For example, one can use this to specify that cyan pixels should be + * considered transparent, and therefore not rendered. + * + * It is a pixel of the format used by the surface, as generated by + * SDL_MapRGB(). + * + * RLE acceleration can substantially speed up blitting of images with large + * horizontal runs of transparent pixels. See SDL_SetSurfaceRLE() for details. + * + * \param surface the SDL_Surface structure to update + * \param flag SDL_TRUE to enable color key, SDL_FALSE to disable color key + * \param key the transparent pixel + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_GetColorKey + */ +extern DECLSPEC int SDLCALL SDL_SetColorKey(SDL_Surface * surface, + int flag, Uint32 key); + +/** + * Returns whether the surface has a color key + * + * It is safe to pass a NULL `surface` here; it will return SDL_FALSE. + * + * \param surface the SDL_Surface structure to query + * \return SDL_TRUE if the surface has a color key, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_SetColorKey + * \sa SDL_GetColorKey + */ +extern DECLSPEC SDL_bool SDLCALL SDL_HasColorKey(SDL_Surface * surface); + +/** + * Get the color key (transparent pixel) for a surface. + * + * The color key is a pixel of the format used by the surface, as generated by + * SDL_MapRGB(). + * + * If the surface doesn't have color key enabled this function returns -1. + * + * \param surface the SDL_Surface structure to query + * \param key a pointer filled in with the transparent pixel + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_SetColorKey + */ +extern DECLSPEC int SDLCALL SDL_GetColorKey(SDL_Surface * surface, + Uint32 * key); + +/** + * Set an additional color value multiplied into blit operations. + * + * When this surface is blitted, during the blit operation each source color + * channel is modulated by the appropriate color value according to the + * following formula: + * + * `srcC = srcC * (color / 255)` + * + * \param surface the SDL_Surface structure to update + * \param r the red color value multiplied into blit operations + * \param g the green color value multiplied into blit operations + * \param b the blue color value multiplied into blit operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceColorMod + * \sa SDL_SetSurfaceAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceColorMod(SDL_Surface * surface, + Uint8 r, Uint8 g, Uint8 b); + + +/** + * Get the additional color value multiplied into blit operations. + * + * \param surface the SDL_Surface structure to query + * \param r a pointer filled in with the current red color value + * \param g a pointer filled in with the current green color value + * \param b a pointer filled in with the current blue color value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceAlphaMod + * \sa SDL_SetSurfaceColorMod + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceColorMod(SDL_Surface * surface, + Uint8 * r, Uint8 * g, + Uint8 * b); + +/** + * Set an additional alpha value used in blit operations. + * + * When this surface is blitted, during the blit operation the source alpha + * value is modulated by this alpha value according to the following formula: + * + * `srcA = srcA * (alpha / 255)` + * + * \param surface the SDL_Surface structure to update + * \param alpha the alpha value multiplied into blit operations + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceAlphaMod + * \sa SDL_SetSurfaceColorMod + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 alpha); + +/** + * Get the additional alpha value used in blit operations. + * + * \param surface the SDL_Surface structure to query + * \param alpha a pointer filled in with the current alpha value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceColorMod + * \sa SDL_SetSurfaceAlphaMod + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceAlphaMod(SDL_Surface * surface, + Uint8 * alpha); + +/** + * Set the blend mode used for blit operations. + * + * To copy a surface to another surface (or texture) without blending with the + * existing data, the blendmode of the SOURCE surface should be set to + * `SDL_BLENDMODE_NONE`. + * + * \param surface the SDL_Surface structure to update + * \param blendMode the SDL_BlendMode to use for blit blending + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetSurfaceBlendMode + */ +extern DECLSPEC int SDLCALL SDL_SetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode blendMode); + +/** + * Get the blend mode used for blit operations. + * + * \param surface the SDL_Surface structure to query + * \param blendMode a pointer filled in with the current SDL_BlendMode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetSurfaceBlendMode + */ +extern DECLSPEC int SDLCALL SDL_GetSurfaceBlendMode(SDL_Surface * surface, + SDL_BlendMode *blendMode); + +/** + * Set the clipping rectangle for a surface. + * + * When `surface` is the destination of a blit, only the area within the clip + * rectangle is drawn into. + * + * Note that blits are automatically clipped to the edges of the source and + * destination surfaces. + * + * \param surface the SDL_Surface structure to be clipped + * \param rect the SDL_Rect structure representing the clipping rectangle, or + * NULL to disable clipping + * \returns SDL_TRUE if the rectangle intersects the surface, otherwise + * SDL_FALSE and blits will be completely clipped. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_GetClipRect + */ +extern DECLSPEC SDL_bool SDLCALL SDL_SetClipRect(SDL_Surface * surface, + const SDL_Rect * rect); + +/** + * Get the clipping rectangle for a surface. + * + * When `surface` is the destination of a blit, only the area within the clip + * rectangle is drawn into. + * + * \param surface the SDL_Surface structure representing the surface to be + * clipped + * \param rect an SDL_Rect structure filled in with the clipping rectangle for + * the surface + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + * \sa SDL_SetClipRect + */ +extern DECLSPEC void SDLCALL SDL_GetClipRect(SDL_Surface * surface, + SDL_Rect * rect); + +/* + * Creates a new surface identical to the existing surface. + * + * The returned surface should be freed with SDL_FreeSurface(). + * + * \param surface the surface to duplicate. + * \returns a copy of the surface, or NULL on failure; call SDL_GetError() for + * more information. + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_DuplicateSurface(SDL_Surface * surface); + +/** + * Copy an existing surface to a new surface of the specified format. + * + * This function is used to optimize images for faster *repeat* blitting. This + * is accomplished by converting the original and storing the result as a new + * surface. The new, optimized surface can then be used as the source for + * future blits, making them faster. + * + * \param src the existing SDL_Surface structure to convert + * \param fmt the SDL_PixelFormat structure that the new surface is optimized + * for + * \param flags the flags are unused and should be set to 0; this is a + * leftover from SDL 1.2's API + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + * \sa SDL_ConvertSurfaceFormat + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurface + (SDL_Surface * src, const SDL_PixelFormat * fmt, Uint32 flags); + +/** + * Copy an existing surface to a new surface of the specified format enum. + * + * This function operates just like SDL_ConvertSurface(), but accepts an + * SDL_PixelFormatEnum value instead of an SDL_PixelFormat structure. As such, + * it might be easier to call but it doesn't have access to palette + * information for the destination surface, in case that would be important. + * + * \param src the existing SDL_Surface structure to convert + * \param pixel_format the SDL_PixelFormatEnum that the new surface is + * optimized for + * \param flags the flags are unused and should be set to 0; this is a + * leftover from SDL 1.2's API + * \returns the new SDL_Surface structure that is created or NULL if it fails; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AllocFormat + * \sa SDL_ConvertSurface + * \sa SDL_CreateRGBSurface + */ +extern DECLSPEC SDL_Surface *SDLCALL SDL_ConvertSurfaceFormat + (SDL_Surface * src, Uint32 pixel_format, Uint32 flags); + +/** + * Copy a block of pixels of one format to another format. + * + * \param width the width of the block to copy, in pixels + * \param height the height of the block to copy, in pixels + * \param src_format an SDL_PixelFormatEnum value of the `src` pixels format + * \param src a pointer to the source pixels + * \param src_pitch the pitch of the source pixels, in bytes + * \param dst_format an SDL_PixelFormatEnum value of the `dst` pixels format + * \param dst a pointer to be filled in with new pixel data + * \param dst_pitch the pitch of the destination pixels, in bytes + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Premultiply the alpha on a block of pixels. + * + * This is safe to use with src == dst, but not for other overlapping areas. + * + * This function is currently only implemented for SDL_PIXELFORMAT_ARGB8888. + * + * \param width the width of the block to convert, in pixels + * \param height the height of the block to convert, in pixels + * \param src_format an SDL_PixelFormatEnum value of the `src` pixels format + * \param src a pointer to the source pixels + * \param src_pitch the pitch of the source pixels, in bytes + * \param dst_format an SDL_PixelFormatEnum value of the `dst` pixels format + * \param dst a pointer to be filled in with premultiplied pixel data + * \param dst_pitch the pitch of the destination pixels, in bytes + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_PremultiplyAlpha(int width, int height, + Uint32 src_format, + const void * src, int src_pitch, + Uint32 dst_format, + void * dst, int dst_pitch); + +/** + * Perform a fast fill of a rectangle with a specific color. + * + * `color` should be a pixel of the format used by the surface, and can be + * generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an + * alpha component then the destination is simply filled with that alpha + * information, no blending takes place. + * + * If there is a clip rectangle set on the destination (set via + * SDL_SetClipRect()), then this function will fill based on the intersection + * of the clip rectangle and `rect`. + * + * \param dst the SDL_Surface structure that is the drawing target + * \param rect the SDL_Rect structure representing the rectangle to fill, or + * NULL to fill the entire surface + * \param color the color to fill with + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FillRects + */ +extern DECLSPEC int SDLCALL SDL_FillRect + (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color); + +/** + * Perform a fast fill of a set of rectangles with a specific color. + * + * `color` should be a pixel of the format used by the surface, and can be + * generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an + * alpha component then the destination is simply filled with that alpha + * information, no blending takes place. + * + * If there is a clip rectangle set on the destination (set via + * SDL_SetClipRect()), then this function will fill based on the intersection + * of the clip rectangle and `rect`. + * + * \param dst the SDL_Surface structure that is the drawing target + * \param rects an array of SDL_Rects representing the rectangles to fill. + * \param count the number of rectangles in the array + * \param color the color to fill with + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_FillRect + */ +extern DECLSPEC int SDLCALL SDL_FillRects + (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color); + +/* !!! FIXME: merge this documentation with the wiki */ +/** + * Performs a fast blit from the source surface to the destination surface. + * + * This assumes that the source and destination rectangles are + * the same size. If either \c srcrect or \c dstrect are NULL, the entire + * surface (\c src or \c dst) is copied. The final blit rectangles are saved + * in \c srcrect and \c dstrect after all clipping is performed. + * + * \returns 0 if the blit is successful, otherwise it returns -1. + * + * The blit function should not be called on a locked surface. + * + * The blit semantics for surfaces with and without blending and colorkey + * are defined as follows: + * \verbatim + RGBA->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB, set destination alpha to source per-surface alpha value. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + + RGBA->RGBA: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source alpha-channel and per-surface alpha) + SDL_SRCCOLORKEY ignored. + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy all of RGBA to the destination. + if SDL_SRCCOLORKEY set, only copy the pixels matching the + RGB values of the source color key, ignoring alpha in the + comparison. + + RGB->RGB: + Source surface blend mode set to SDL_BLENDMODE_BLEND: + alpha-blend (using the source per-surface alpha) + Source surface blend mode set to SDL_BLENDMODE_NONE: + copy RGB. + both: + if SDL_SRCCOLORKEY set, only copy the pixels matching the + source color key. + \endverbatim + * + * You should call SDL_BlitSurface() unless you know exactly how SDL + * blitting works internally and how to use the other blit functions. + */ +#define SDL_BlitSurface SDL_UpperBlit + +/** + * Perform a fast blit from the source surface to the destination surface. + * + * SDL_UpperBlit() has been replaced by SDL_BlitSurface(), which is merely a + * macro for this function with a less confusing name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + */ +extern DECLSPEC int SDLCALL SDL_UpperBlit + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Perform low-level surface blitting only. + * + * This is a semi-private blit function and it performs low-level surface + * blitting, assuming the input rectangles have already been clipped. + * + * Unless you know what you're doing, you should be using SDL_BlitSurface() + * instead. + * + * \param src the SDL_Surface structure to be copied from + * \param srcrect the SDL_Rect structure representing the rectangle to be + * copied, or NULL to copy the entire surface + * \param dst the SDL_Surface structure that is the blit target + * \param dstrect the SDL_Rect structure representing the rectangle that is + * copied into + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitSurface + */ +extern DECLSPEC int SDLCALL SDL_LowerBlit + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + + +/** + * Perform a fast, low quality, stretch blit between two surfaces of the same + * format. + * + * Please use SDL_BlitScaled() instead. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + +/** + * Perform bilinear scaling between two surfaces of the same format, 32BPP. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_SoftStretchLinear(SDL_Surface * src, + const SDL_Rect * srcrect, + SDL_Surface * dst, + const SDL_Rect * dstrect); + + +#define SDL_BlitScaled SDL_UpperBlitScaled + +/** + * Perform a scaled surface copy to a destination surface. + * + * SDL_UpperBlitScaled() has been replaced by SDL_BlitScaled(), which is + * merely a macro for this function with a less confusing name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitScaled + */ +extern DECLSPEC int SDLCALL SDL_UpperBlitScaled + (SDL_Surface * src, const SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Perform low-level surface scaled blitting only. + * + * This is a semi-private function and it performs low-level surface blitting, + * assuming the input rectangles have already been clipped. + * + * \param src the SDL_Surface structure to be copied from + * \param srcrect the SDL_Rect structure representing the rectangle to be + * copied + * \param dst the SDL_Surface structure that is the blit target + * \param dstrect the SDL_Rect structure representing the rectangle that is + * copied into + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_BlitScaled + */ +extern DECLSPEC int SDLCALL SDL_LowerBlitScaled + (SDL_Surface * src, SDL_Rect * srcrect, + SDL_Surface * dst, SDL_Rect * dstrect); + +/** + * Set the YUV conversion mode + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC void SDLCALL SDL_SetYUVConversionMode(SDL_YUV_CONVERSION_MODE mode); + +/** + * Get the YUV conversion mode + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionMode(void); + +/** + * Get the YUV conversion mode, returning the correct mode for the resolution + * when the current conversion mode is SDL_YUV_CONVERSION_AUTOMATIC + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_YUV_CONVERSION_MODE SDLCALL SDL_GetYUVConversionModeForResolution(int width, int height); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_surface_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_system.h b/include/SDL/SDL_system.h new file mode 100644 index 0000000..4b7eadd --- /dev/null +++ b/include/SDL/SDL_system.h @@ -0,0 +1,623 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_system.h + * + * Include file for platform specific SDL API functions + */ + +#ifndef SDL_system_h_ +#define SDL_system_h_ + +#include "SDL_stdinc.h" +#include "SDL_keyboard.h" +#include "SDL_render.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* Platform specific functions for Windows */ +#if defined(__WIN32__) || defined(__GDK__) + +typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsigned int message, Uint64 wParam, Sint64 lParam); + +/** + * Set a callback for every Windows message, run before TranslateMessage(). + * + * \param callback The SDL_WindowsMessageHook function to call. + * \param userdata a pointer to pass to every iteration of `callback` + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + +/** + * Get the D3D9 adapter index that matches the specified display index. + * + * The returned adapter index can be passed to `IDirect3D9::CreateDevice` and + * controls on which monitor a full screen application will appear. + * + * \param displayIndex the display index for which to get the D3D9 adapter + * index + * \returns the D3D9 adapter index on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC int SDLCALL SDL_Direct3D9GetAdapterIndex( int displayIndex ); + +typedef struct IDirect3DDevice9 IDirect3DDevice9; + +/** + * Get the D3D9 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D device + * \returns the D3D9 device associated with given renderer or NULL if it is + * not a D3D9 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.1. + */ +extern DECLSPEC IDirect3DDevice9* SDLCALL SDL_RenderGetD3D9Device(SDL_Renderer * renderer); + +typedef struct ID3D11Device ID3D11Device; + +/** + * Get the D3D11 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D11 device + * \returns the D3D11 device associated with given renderer or NULL if it is + * not a D3D11 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC ID3D11Device* SDLCALL SDL_RenderGetD3D11Device(SDL_Renderer * renderer); + +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ + +#if defined(__WIN32__) || defined(__GDK__) + +typedef struct ID3D12Device ID3D12Device; + +/** + * Get the D3D12 device associated with a renderer. + * + * Once you are done using the device, you should release it to avoid a + * resource leak. + * + * \param renderer the renderer from which to get the associated D3D12 device + * \returns the D3D12 device associated with given renderer or NULL if it is + * not a D3D12 renderer; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC ID3D12Device* SDLCALL SDL_RenderGetD3D12Device(SDL_Renderer* renderer); + +#endif /* defined(__WIN32__) || defined(__GDK__) */ + +#if defined(__WIN32__) || defined(__WINGDK__) + +/** + * Get the DXGI Adapter and Output indices for the specified display index. + * + * The DXGI Adapter and Output indices can be passed to `EnumAdapters` and + * `EnumOutputs` respectively to get the objects required to create a DX10 or + * DX11 device and swap chain. + * + * Before SDL 2.0.4 this function did not return a value. Since SDL 2.0.4 it + * returns an SDL_bool. + * + * \param displayIndex the display index for which to get both indices + * \param adapterIndex a pointer to be filled in with the adapter index + * \param outputIndex a pointer to be filled in with the output index + * \returns SDL_TRUE on success or SDL_FALSE on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.2. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_DXGIGetOutputInfo( int displayIndex, int *adapterIndex, int *outputIndex ); + +#endif /* defined(__WIN32__) || defined(__WINGDK__) */ + +/* Platform specific functions for Linux */ +#ifdef __LINUX__ + +/** + * Sets the UNIX nice value for a thread. + * + * This uses setpriority() if possible, and RealtimeKit if available. + * + * \param threadID the Unix thread ID to change priority of. + * \param priority The new, Unix-specific, priority value. + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriority(Sint64 threadID, int priority); + +/** + * Sets the priority (not nice level) and scheduling policy for a thread. + * + * This uses setpriority() if possible, and RealtimeKit if available. + * + * \param threadID The Unix thread ID to change priority of. + * \param sdlPriority The new SDL_ThreadPriority value. + * \param schedPolicy The new scheduling policy (SCHED_FIFO, SCHED_RR, + * SCHED_OTHER, etc...) + * \returns 0 on success, or -1 on error. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC int SDLCALL SDL_LinuxSetThreadPriorityAndPolicy(Sint64 threadID, int sdlPriority, int schedPolicy); + +#endif /* __LINUX__ */ + +/* Platform specific functions for iOS */ +#ifdef __IPHONEOS__ + +#define SDL_iOSSetAnimationCallback(window, interval, callback, callbackParam) SDL_iPhoneSetAnimationCallback(window, interval, callback, callbackParam) + +/** + * Use this function to set the animation callback on Apple iOS. + * + * The function prototype for `callback` is: + * + * ```c + * void callback(void* callbackParam); + * ``` + * + * Where its parameter, `callbackParam`, is what was passed as `callbackParam` + * to SDL_iPhoneSetAnimationCallback(). + * + * This function is only available on Apple iOS. + * + * For more information see: + * https://github.com/libsdl-org/SDL/blob/main/docs/README-ios.md + * + * This functions is also accessible using the macro + * SDL_iOSSetAnimationCallback() since SDL 2.0.4. + * + * \param window the window for which the animation callback should be set + * \param interval the number of frames after which **callback** will be + * called + * \param callback the function to call for every frame. + * \param callbackParam a pointer that is passed to `callback`. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_iPhoneSetEventPump + */ +extern DECLSPEC int SDLCALL SDL_iPhoneSetAnimationCallback(SDL_Window * window, int interval, void (SDLCALL *callback)(void*), void *callbackParam); + +#define SDL_iOSSetEventPump(enabled) SDL_iPhoneSetEventPump(enabled) + +/** + * Use this function to enable or disable the SDL event pump on Apple iOS. + * + * This function is only available on Apple iOS. + * + * This functions is also accessible using the macro SDL_iOSSetEventPump() + * since SDL 2.0.4. + * + * \param enabled SDL_TRUE to enable the event pump, SDL_FALSE to disable it + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_iPhoneSetAnimationCallback + */ +extern DECLSPEC void SDLCALL SDL_iPhoneSetEventPump(SDL_bool enabled); + +#endif /* __IPHONEOS__ */ + + +/* Platform specific functions for Android */ +#ifdef __ANDROID__ + +/** + * Get the Android Java Native Interface Environment of the current thread. + * + * This is the JNIEnv one needs to access the Java virtual machine from native + * code, and is needed for many Android APIs to be usable from C. + * + * The prototype of the function in SDL's code actually declare a void* return + * type, even if the implementation returns a pointer to a JNIEnv. The + * rationale being that the SDL headers can avoid including jni.h. + * + * \returns a pointer to Java native interface object (JNIEnv) to which the + * current thread is attached, or 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetActivity + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetJNIEnv(void); + +/** + * Retrieve the Java instance of the Android activity class. + * + * The prototype of the function in SDL's code actually declares a void* + * return type, even if the implementation returns a jobject. The rationale + * being that the SDL headers can avoid including jni.h. + * + * The jobject returned by the function is a local reference and must be + * released by the caller. See the PushLocalFrame() and PopLocalFrame() or + * DeleteLocalRef() functions of the Java native interface: + * + * https://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html + * + * \returns the jobject representing the instance of the Activity class of the + * Android application, or NULL on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetJNIEnv + */ +extern DECLSPEC void * SDLCALL SDL_AndroidGetActivity(void); + +/** + * Query Android API level of the current device. + * + * - API level 31: Android 12 + * - API level 30: Android 11 + * - API level 29: Android 10 + * - API level 28: Android 9 + * - API level 27: Android 8.1 + * - API level 26: Android 8.0 + * - API level 25: Android 7.1 + * - API level 24: Android 7.0 + * - API level 23: Android 6.0 + * - API level 22: Android 5.1 + * - API level 21: Android 5.0 + * - API level 20: Android 4.4W + * - API level 19: Android 4.4 + * - API level 18: Android 4.3 + * - API level 17: Android 4.2 + * - API level 16: Android 4.1 + * - API level 15: Android 4.0.3 + * - API level 14: Android 4.0 + * - API level 13: Android 3.2 + * - API level 12: Android 3.1 + * - API level 11: Android 3.0 + * - API level 10: Android 2.3.3 + * + * \returns the Android API level. + * + * \since This function is available since SDL 2.0.12. + */ +extern DECLSPEC int SDLCALL SDL_GetAndroidSDKVersion(void); + +/** + * Query if the application is running on Android TV. + * + * \returns SDL_TRUE if this is Android TV, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsAndroidTV(void); + +/** + * Query if the application is running on a Chromebook. + * + * \returns SDL_TRUE if this is a Chromebook, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsChromebook(void); + +/** + * Query if the application is running on a Samsung DeX docking station. + * + * \returns SDL_TRUE if this is a DeX docking station, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsDeXMode(void); + +/** + * Trigger the Android system back button behavior. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC void SDLCALL SDL_AndroidBackButton(void); + +/** + See the official Android developer guide for more information: + http://developer.android.com/guide/topics/data/data-storage.html +*/ +#define SDL_ANDROID_EXTERNAL_STORAGE_READ 0x01 +#define SDL_ANDROID_EXTERNAL_STORAGE_WRITE 0x02 + +/** + * Get the path used for internal storage for this application. + * + * This path is unique to your application and cannot be written to by other + * applications. + * + * Your internal storage path is typically: + * `/data/data/your.app.package/files`. + * + * \returns the path used for internal storage or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStorageState + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetInternalStoragePath(void); + +/** + * Get the current state of external storage. + * + * The current state of external storage, a bitmask of these values: + * `SDL_ANDROID_EXTERNAL_STORAGE_READ`, `SDL_ANDROID_EXTERNAL_STORAGE_WRITE`. + * + * If external storage is currently unavailable, this will return 0. + * + * \returns the current state of external storage on success or 0 on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStoragePath + */ +extern DECLSPEC int SDLCALL SDL_AndroidGetExternalStorageState(void); + +/** + * Get the path used for external storage for this application. + * + * This path is unique to your application, but is public and can be written + * to by other applications. + * + * Your external storage path is typically: + * `/storage/sdcard0/Android/data/your.app.package/files`. + * + * \returns the path used for external storage for this application on success + * or NULL on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AndroidGetExternalStorageState + */ +extern DECLSPEC const char * SDLCALL SDL_AndroidGetExternalStoragePath(void); + +/** + * Request permissions at runtime. + * + * This blocks the calling thread until the permission is granted or denied. + * + * \param permission The permission to request. + * \returns SDL_TRUE if the permission was granted, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.14. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_AndroidRequestPermission(const char *permission); + +/** + * Shows an Android toast notification. + * + * Toasts are a sort of lightweight notification that are unique to Android. + * + * https://developer.android.com/guide/topics/ui/notifiers/toasts + * + * Shows toast in UI thread. + * + * For the `gravity` parameter, choose a value from here, or -1 if you don't + * have a preference: + * + * https://developer.android.com/reference/android/view/Gravity + * + * \param message text message to be shown + * \param duration 0=short, 1=long + * \param gravity where the notification should appear on the screen. + * \param xoffset set this parameter only when gravity >=0 + * \param yoffset set this parameter only when gravity >=0 + * \returns 0 if success, -1 if any error occurs. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_AndroidShowToast(const char* message, int duration, int gravity, int xoffset, int yoffset); + +/** + * Send a user command to SDLActivity. + * + * Override "boolean onUnhandledMessage(Message msg)" to handle the message. + * + * \param command user command that must be greater or equal to 0x8000 + * \param param user parameter + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC int SDLCALL SDL_AndroidSendMessage(Uint32 command, int param); + +#endif /* __ANDROID__ */ + +/* Platform specific functions for WinRT */ +#ifdef __WINRT__ + +/** + * \brief WinRT / Windows Phone path types + */ +typedef enum +{ + /** \brief The installed app's root directory. + Files here are likely to be read-only. */ + SDL_WINRT_PATH_INSTALLED_LOCATION, + + /** \brief The app's local data store. Files may be written here */ + SDL_WINRT_PATH_LOCAL_FOLDER, + + /** \brief The app's roaming data store. Unsupported on Windows Phone. + Files written here may be copied to other machines via a network + connection. + */ + SDL_WINRT_PATH_ROAMING_FOLDER, + + /** \brief The app's temporary data store. Unsupported on Windows Phone. + Files written here may be deleted at any time. */ + SDL_WINRT_PATH_TEMP_FOLDER +} SDL_WinRT_Path; + + +/** + * \brief WinRT Device Family + */ +typedef enum +{ + /** \brief Unknown family */ + SDL_WINRT_DEVICEFAMILY_UNKNOWN, + + /** \brief Desktop family*/ + SDL_WINRT_DEVICEFAMILY_DESKTOP, + + /** \brief Mobile family (for example smartphone) */ + SDL_WINRT_DEVICEFAMILY_MOBILE, + + /** \brief XBox family */ + SDL_WINRT_DEVICEFAMILY_XBOX, +} SDL_WinRT_DeviceFamily; + + +/** + * Retrieve a WinRT defined path on the local file system. + * + * Not all paths are available on all versions of Windows. This is especially + * true on Windows Phone. Check the documentation for the given SDL_WinRT_Path + * for more information on which path types are supported where. + * + * Documentation on most app-specific path types on WinRT can be found on + * MSDN, at the URL: + * + * https://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType the type of path to retrieve, one of SDL_WinRT_Path + * \returns a UCS-2 string (16-bit, wide-char) containing the path, or NULL if + * the path is not available for any reason; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.3. + * + * \sa SDL_WinRTGetFSPathUTF8 + */ +extern DECLSPEC const wchar_t * SDLCALL SDL_WinRTGetFSPathUNICODE(SDL_WinRT_Path pathType); + +/** + * Retrieve a WinRT defined path on the local file system. + * + * Not all paths are available on all versions of Windows. This is especially + * true on Windows Phone. Check the documentation for the given SDL_WinRT_Path + * for more information on which path types are supported where. + * + * Documentation on most app-specific path types on WinRT can be found on + * MSDN, at the URL: + * + * https://msdn.microsoft.com/en-us/library/windows/apps/hh464917.aspx + * + * \param pathType the type of path to retrieve, one of SDL_WinRT_Path + * \returns a UTF-8 string (8-bit, multi-byte) containing the path, or NULL if + * the path is not available for any reason; call SDL_GetError() for + * more information. + * + * \since This function is available since SDL 2.0.3. + * + * \sa SDL_WinRTGetFSPathUNICODE + */ +extern DECLSPEC const char * SDLCALL SDL_WinRTGetFSPathUTF8(SDL_WinRT_Path pathType); + +/** + * Detects the device family of WinRT platform at runtime. + * + * \returns a value from the SDL_WinRT_DeviceFamily enum. + * + * \since This function is available since SDL 2.0.8. + */ +extern DECLSPEC SDL_WinRT_DeviceFamily SDLCALL SDL_WinRTGetDeviceFamily(); + +#endif /* __WINRT__ */ + +/** + * Query if the current device is a tablet. + * + * If SDL can't determine this, it will return SDL_FALSE. + * + * \returns SDL_TRUE if the device is a tablet, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.9. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsTablet(void); + +/* Functions used by iOS application delegates to notify SDL about state changes */ +extern DECLSPEC void SDLCALL SDL_OnApplicationWillTerminate(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidReceiveMemoryWarning(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationWillResignActive(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidEnterBackground(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationWillEnterForeground(void); +extern DECLSPEC void SDLCALL SDL_OnApplicationDidBecomeActive(void); +#ifdef __IPHONEOS__ +extern DECLSPEC void SDLCALL SDL_OnApplicationDidChangeStatusBarOrientation(void); +#endif + +/* Functions used only by GDK */ +#if defined(__GDK__) +typedef struct XTaskQueueObject * XTaskQueueHandle; + +/** + * Gets a reference to the global async task queue handle for GDK, + * initializing if needed. + * + * Once you are done with the task queue, you should call + * XTaskQueueCloseHandle to reduce the reference count to avoid a resource + * leak. + * + * \param outTaskQueue a pointer to be filled in with task queue handle. + * \returns 0 if success, -1 if any error occurs. + * + * \since This function is available since SDL 2.24.0. + */ +extern DECLSPEC int SDLCALL SDL_GDKGetTaskQueue(XTaskQueueHandle * outTaskQueue); + +#endif + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_system_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_syswm.h b/include/SDL/SDL_syswm.h new file mode 100644 index 0000000..b35734d --- /dev/null +++ b/include/SDL/SDL_syswm.h @@ -0,0 +1,386 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_syswm.h + * + * Include file for SDL custom system window manager hooks. + */ + +#ifndef SDL_syswm_h_ +#define SDL_syswm_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" +#include "SDL_version.h" + +/** + * \brief SDL_syswm.h + * + * Your application has access to a special type of event ::SDL_SYSWMEVENT, + * which contains window-manager specific information and arrives whenever + * an unhandled window event occurs. This event is ignored by default, but + * you can enable it with SDL_EventState(). + */ +struct SDL_SysWMinfo; + +#if !defined(SDL_PROTOTYPES_ONLY) + +#if defined(SDL_VIDEO_DRIVER_WINDOWS) +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef NOMINMAX /* don't define min() and max(). */ +#define NOMINMAX +#endif +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_WINRT) +#include +#endif + +/* This is the structure for custom window manager events */ +#if defined(SDL_VIDEO_DRIVER_X11) +#if defined(__APPLE__) && defined(__MACH__) +/* conflicts with Quickdraw.h */ +#define Cursor X11Cursor +#endif + +#include +#include + +#if defined(__APPLE__) && defined(__MACH__) +/* matches the re-define above */ +#undef Cursor +#endif + +#endif /* defined(SDL_VIDEO_DRIVER_X11) */ + +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) +#include +#endif + +#if defined(SDL_VIDEO_DRIVER_COCOA) +#ifdef __OBJC__ +@class NSWindow; +#else +typedef struct _NSWindow NSWindow; +#endif +#endif + +#if defined(SDL_VIDEO_DRIVER_UIKIT) +#ifdef __OBJC__ +#include +#else +typedef struct _UIWindow UIWindow; +typedef struct _UIViewController UIViewController; +#endif +typedef Uint32 GLuint; +#endif + +#if defined(SDL_VIDEO_VULKAN) || defined(SDL_VIDEO_METAL) +#define SDL_METALVIEW_TAG 255 +#endif + +#if defined(SDL_VIDEO_DRIVER_ANDROID) +typedef struct ANativeWindow ANativeWindow; +typedef void *EGLSurface; +#endif + +#if defined(SDL_VIDEO_DRIVER_VIVANTE) +#include "SDL_egl.h" +#endif + +#if defined(SDL_VIDEO_DRIVER_OS2) +#define INCL_WIN +#include +#endif +#endif /* SDL_PROTOTYPES_ONLY */ + +#if defined(SDL_VIDEO_DRIVER_KMSDRM) +struct gbm_device; +#endif + + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +#if !defined(SDL_PROTOTYPES_ONLY) +/** + * These are the various supported windowing subsystems + */ +typedef enum +{ + SDL_SYSWM_UNKNOWN, + SDL_SYSWM_WINDOWS, + SDL_SYSWM_X11, + SDL_SYSWM_DIRECTFB, + SDL_SYSWM_COCOA, + SDL_SYSWM_UIKIT, + SDL_SYSWM_WAYLAND, + SDL_SYSWM_MIR, /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ + SDL_SYSWM_WINRT, + SDL_SYSWM_ANDROID, + SDL_SYSWM_VIVANTE, + SDL_SYSWM_OS2, + SDL_SYSWM_HAIKU, + SDL_SYSWM_KMSDRM, + SDL_SYSWM_RISCOS +} SDL_SYSWM_TYPE; + +/** + * The custom event structure. + */ +struct SDL_SysWMmsg +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct { + HWND hwnd; /**< The window for the message */ + UINT msg; /**< The type of message */ + WPARAM wParam; /**< WORD message parameter */ + LPARAM lParam; /**< LONG message parameter */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct { + XEvent event; + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct { + DFBEvent event; + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { + /* Latest version of Xcode clang complains about empty structs in C v. C++: + error: empty struct has size 0 in C, size 1 in C++ + */ + int dummy; + /* No Cocoa window events yet */ + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { + int dummy; + /* No UIKit window events yet */ + } uikit; +#endif +#if defined(SDL_VIDEO_DRIVER_VIVANTE) + struct + { + int dummy; + /* No Vivante window events yet */ + } vivante; +#endif +#if defined(SDL_VIDEO_DRIVER_OS2) + struct + { + BOOL fFrame; /**< TRUE if hwnd is a frame window */ + HWND hwnd; /**< The window receiving the message */ + ULONG msg; /**< The message identifier */ + MPARAM mp1; /**< The first first message parameter */ + MPARAM mp2; /**< The second first message parameter */ + } os2; +#endif + /* Can't have an empty union */ + int dummy; + } msg; +}; + +/** + * The custom window manager information structure. + * + * When this structure is returned, it holds information about which + * low level system it is using, and will be one of SDL_SYSWM_TYPE. + */ +struct SDL_SysWMinfo +{ + SDL_version version; + SDL_SYSWM_TYPE subsystem; + union + { +#if defined(SDL_VIDEO_DRIVER_WINDOWS) + struct + { + HWND window; /**< The window handle */ + HDC hdc; /**< The window device context */ + HINSTANCE hinstance; /**< The instance handle */ + } win; +#endif +#if defined(SDL_VIDEO_DRIVER_WINRT) + struct + { + IInspectable * window; /**< The WinRT CoreWindow */ + } winrt; +#endif +#if defined(SDL_VIDEO_DRIVER_X11) + struct + { + Display *display; /**< The X11 display */ + Window window; /**< The X11 window */ + } x11; +#endif +#if defined(SDL_VIDEO_DRIVER_DIRECTFB) + struct + { + IDirectFB *dfb; /**< The directfb main interface */ + IDirectFBWindow *window; /**< The directfb window handle */ + IDirectFBSurface *surface; /**< The directfb client surface */ + } dfb; +#endif +#if defined(SDL_VIDEO_DRIVER_COCOA) + struct + { +#if defined(__OBJC__) && defined(__has_feature) + #if __has_feature(objc_arc) + NSWindow __unsafe_unretained *window; /**< The Cocoa window */ + #else + NSWindow *window; /**< The Cocoa window */ + #endif +#else + NSWindow *window; /**< The Cocoa window */ +#endif + } cocoa; +#endif +#if defined(SDL_VIDEO_DRIVER_UIKIT) + struct + { +#if defined(__OBJC__) && defined(__has_feature) + #if __has_feature(objc_arc) + UIWindow __unsafe_unretained *window; /**< The UIKit window */ + #else + UIWindow *window; /**< The UIKit window */ + #endif +#else + UIWindow *window; /**< The UIKit window */ +#endif + GLuint framebuffer; /**< The GL view's Framebuffer Object. It must be bound when rendering to the screen using GL. */ + GLuint colorbuffer; /**< The GL view's color Renderbuffer Object. It must be bound when SDL_GL_SwapWindow is called. */ + GLuint resolveFramebuffer; /**< The Framebuffer Object which holds the resolve color Renderbuffer, when MSAA is used. */ + } uikit; +#endif +#if defined(SDL_VIDEO_DRIVER_WAYLAND) + struct + { + struct wl_display *display; /**< Wayland display */ + struct wl_surface *surface; /**< Wayland surface */ + void *shell_surface; /**< DEPRECATED Wayland shell_surface (window manager handle) */ + struct wl_egl_window *egl_window; /**< Wayland EGL window (native window) */ + struct xdg_surface *xdg_surface; /**< Wayland xdg surface (window manager handle) */ + struct xdg_toplevel *xdg_toplevel; /**< Wayland xdg toplevel role */ + struct xdg_popup *xdg_popup; /**< Wayland xdg popup role */ + struct xdg_positioner *xdg_positioner; /**< Wayland xdg positioner, for popup */ + } wl; +#endif +#if defined(SDL_VIDEO_DRIVER_MIR) /* no longer available, left for API/ABI compatibility. Remove in 2.1! */ + struct + { + void *connection; /**< Mir display server connection */ + void *surface; /**< Mir surface */ + } mir; +#endif + +#if defined(SDL_VIDEO_DRIVER_ANDROID) + struct + { + ANativeWindow *window; + EGLSurface surface; + } android; +#endif + +#if defined(SDL_VIDEO_DRIVER_OS2) + struct + { + HWND hwnd; /**< The window handle */ + HWND hwndFrame; /**< The frame window handle */ + } os2; +#endif + +#if defined(SDL_VIDEO_DRIVER_VIVANTE) + struct + { + EGLNativeDisplayType display; + EGLNativeWindowType window; + } vivante; +#endif + +#if defined(SDL_VIDEO_DRIVER_KMSDRM) + struct + { + int dev_index; /**< Device index (ex: the X in /dev/dri/cardX) */ + int drm_fd; /**< DRM FD (unavailable on Vulkan windows) */ + struct gbm_device *gbm_dev; /**< GBM device (unavailable on Vulkan windows) */ + } kmsdrm; +#endif + + /* Make sure this union is always 64 bytes (8 64-bit pointers). */ + /* Be careful not to overflow this if you add a new target! */ + Uint8 dummy[64]; + } info; +}; + +#endif /* SDL_PROTOTYPES_ONLY */ + +typedef struct SDL_SysWMinfo SDL_SysWMinfo; + + +/** + * Get driver-specific information about a window. + * + * You must include SDL_syswm.h for the declaration of SDL_SysWMinfo. + * + * The caller must initialize the `info` structure's version by using + * `SDL_VERSION(&info.version)`, and then this function will fill in the rest + * of the structure with information about the given window. + * + * \param window the window about which information is being requested + * \param info an SDL_SysWMinfo structure filled in with window information + * \returns SDL_TRUE if the function is implemented and the `version` member + * of the `info` struct is valid, or SDL_FALSE if the information + * could not be retrieved; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowWMInfo(SDL_Window * window, + SDL_SysWMinfo * info); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_syswm_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test.h b/include/SDL/SDL_test.h new file mode 100644 index 0000000..80daaaf --- /dev/null +++ b/include/SDL/SDL_test.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_h_ +#define SDL_test_h_ + +#include "SDL.h" +#include "SDL_test_assert.h" +#include "SDL_test_common.h" +#include "SDL_test_compare.h" +#include "SDL_test_crc32.h" +#include "SDL_test_font.h" +#include "SDL_test_fuzzer.h" +#include "SDL_test_harness.h" +#include "SDL_test_images.h" +#include "SDL_test_log.h" +#include "SDL_test_md5.h" +#include "SDL_test_memory.h" +#include "SDL_test_random.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Global definitions */ + +/* + * Note: Maximum size of SDLTest log message is less than SDL's limit + * to ensure we can fit additional information such as the timestamp. + */ +#define SDLTEST_MAX_LOGMESSAGE_LENGTH 3584 + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_assert.h b/include/SDL/SDL_test_assert.h new file mode 100644 index 0000000..341e490 --- /dev/null +++ b/include/SDL/SDL_test_assert.h @@ -0,0 +1,105 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_assert.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Assert API for test code and test cases + * + */ + +#ifndef SDL_test_assert_h_ +#define SDL_test_assert_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Fails the assert. + */ +#define ASSERT_FAIL 0 + +/** + * \brief Passes the assert. + */ +#define ASSERT_PASS 1 + +/** + * \brief Assert that logs and break execution flow on failures. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_Assert(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Assert for test cases that logs but does not break execution flow on failures. Updates assertion counters. + * + * \param assertCondition Evaluated condition or variable to assert; fail (==0) or pass (!=0). + * \param assertDescription Message to log with the assert describing it. + * + * \returns the assertCondition so it can be used to externally to break execution flow if desired. + */ +int SDLTest_AssertCheck(int assertCondition, SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Explicitly pass without checking an assertion condition. Updates assertion counter. + * + * \param assertDescription Message to log with the assert describing it. + */ +void SDLTest_AssertPass(SDL_PRINTF_FORMAT_STRING const char *assertDescription, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * \brief Resets the assert summary counters to zero. + */ +void SDLTest_ResetAssertSummary(void); + +/** + * \brief Logs summary of all assertions (total, pass, fail) since last reset as INFO or ERROR. + */ +void SDLTest_LogAssertSummary(void); + + +/** + * \brief Converts the current assert summary state to a test result. + * + * \returns TEST_RESULT_PASSED, TEST_RESULT_FAILED, or TEST_RESULT_NO_ASSERT + */ +int SDLTest_AssertSummaryToTestResult(void); + +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_assert_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_common.h b/include/SDL/SDL_test_common.h new file mode 100644 index 0000000..6de63ca --- /dev/null +++ b/include/SDL/SDL_test_common.h @@ -0,0 +1,236 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_common.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* Ported from original test\common.h file. */ + +#ifndef SDL_test_common_h_ +#define SDL_test_common_h_ + +#include "SDL.h" + +#if defined(__PSP__) +#define DEFAULT_WINDOW_WIDTH 480 +#define DEFAULT_WINDOW_HEIGHT 272 +#elif defined(__VITA__) +#define DEFAULT_WINDOW_WIDTH 960 +#define DEFAULT_WINDOW_HEIGHT 544 +#else +#define DEFAULT_WINDOW_WIDTH 640 +#define DEFAULT_WINDOW_HEIGHT 480 +#endif + +#define VERBOSE_VIDEO 0x00000001 +#define VERBOSE_MODES 0x00000002 +#define VERBOSE_RENDER 0x00000004 +#define VERBOSE_EVENT 0x00000008 +#define VERBOSE_AUDIO 0x00000010 +#define VERBOSE_MOTION 0x00000020 + +typedef struct +{ + /* SDL init flags */ + char **argv; + Uint32 flags; + Uint32 verbose; + + /* Video info */ + const char *videodriver; + int display; + const char *window_title; + const char *window_icon; + Uint32 window_flags; + SDL_bool flash_on_focus_loss; + int window_x; + int window_y; + int window_w; + int window_h; + int window_minW; + int window_minH; + int window_maxW; + int window_maxH; + int logical_w; + int logical_h; + float scale; + int depth; + int refresh_rate; + int num_windows; + SDL_Window **windows; + + /* Renderer info */ + const char *renderdriver; + Uint32 render_flags; + SDL_bool skip_renderer; + SDL_Renderer **renderers; + SDL_Texture **targets; + + /* Audio info */ + const char *audiodriver; + SDL_AudioSpec audiospec; + + /* GL settings */ + int gl_red_size; + int gl_green_size; + int gl_blue_size; + int gl_alpha_size; + int gl_buffer_size; + int gl_depth_size; + int gl_stencil_size; + int gl_double_buffer; + int gl_accum_red_size; + int gl_accum_green_size; + int gl_accum_blue_size; + int gl_accum_alpha_size; + int gl_stereo; + int gl_multisamplebuffers; + int gl_multisamplesamples; + int gl_retained_backing; + int gl_accelerated; + int gl_major_version; + int gl_minor_version; + int gl_debug; + int gl_profile_mask; + + /* Additional fields added in 2.0.18 */ + SDL_Rect confine; + +} SDLTest_CommonState; + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +/** + * \brief Parse command line parameters and create common state. + * + * \param argv Array of command line parameters + * \param flags Flags indicating which subsystem to initialize (i.e. SDL_INIT_VIDEO | SDL_INIT_AUDIO) + * + * \returns a newly allocated common state object. + */ +SDLTest_CommonState *SDLTest_CommonCreateState(char **argv, Uint32 flags); + +/** + * \brief Process one common argument. + * + * \param state The common state describing the test window to create. + * \param index The index of the argument to process in argv[]. + * + * \returns the number of arguments processed (i.e. 1 for --fullscreen, 2 for --video [videodriver], or -1 on error. + */ +int SDLTest_CommonArg(SDLTest_CommonState * state, int index); + + +/** + * \brief Logs command line usage info. + * + * This logs the appropriate command line options for the subsystems in use + * plus other common options, and then any application-specific options. + * This uses the SDL_Log() function and splits up output to be friendly to + * 80-character-wide terminals. + * + * \param state The common state describing the test window for the app. + * \param argv0 argv[0], as passed to main/SDL_main. + * \param options an array of strings for application specific options. The last element of the array should be NULL. + */ +void SDLTest_CommonLogUsage(SDLTest_CommonState * state, const char *argv0, const char **options); + +/** + * \brief Returns common usage information + * + * You should (probably) be using SDLTest_CommonLogUsage() instead, but this + * function remains for binary compatibility. Strings returned from this + * function are valid until SDLTest_CommonQuit() is called, in which case + * those strings' memory is freed and can no longer be used. + * + * \param state The common state describing the test window to create. + * \returns a string with usage information + */ +const char *SDLTest_CommonUsage(SDLTest_CommonState * state); + +/** + * \brief Open test window. + * + * \param state The common state describing the test window to create. + * + * \returns SDL_TRUE if initialization succeeded, false otherwise + */ +SDL_bool SDLTest_CommonInit(SDLTest_CommonState * state); + +/** + * \brief Easy argument handling when test app doesn't need any custom args. + * + * \param state The common state describing the test window to create. + * \param argc argc, as supplied to SDL_main + * \param argv argv, as supplied to SDL_main + * + * \returns SDL_FALSE if app should quit, true otherwise. + */ +SDL_bool SDLTest_CommonDefaultArgs(SDLTest_CommonState * state, const int argc, char **argv); + +/** + * \brief Common event handler for test windows. + * + * \param state The common state used to create test window. + * \param event The event to handle. + * \param done Flag indicating we are done. + * + */ +void SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *done); + +/** + * \brief Close test window. + * + * \param state The common state used to create test window. + * + */ +void SDLTest_CommonQuit(SDLTest_CommonState * state); + +/** + * \brief Draws various window information (position, size, etc.) to the renderer. + * + * \param renderer The renderer to draw to. + * \param window The window whose information should be displayed. + * \param usedHeight Returns the height used, so the caller can draw more below. + * + */ +void SDLTest_CommonDrawWindowInfo(SDL_Renderer * renderer, SDL_Window * window, int * usedHeight); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_common_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_compare.h b/include/SDL/SDL_test_compare.h new file mode 100644 index 0000000..5fce25c --- /dev/null +++ b/include/SDL/SDL_test_compare.h @@ -0,0 +1,69 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_compare.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines comparison functions (i.e. for surfaces). + +*/ + +#ifndef SDL_test_compare_h_ +#define SDL_test_compare_h_ + +#include "SDL.h" + +#include "SDL_test_images.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Compares a surface and with reference image data for equality + * + * \param surface Surface used in comparison + * \param referenceSurface Test Surface used in comparison + * \param allowable_error Allowable difference (=sum of squared difference for each RGB component) in blending accuracy. + * + * \returns 0 if comparison succeeded, >0 (=number of pixels for which the comparison failed) if comparison failed, -1 if any of the surfaces were NULL, -2 if the surface sizes differ. + */ +int SDLTest_CompareSurfaces(SDL_Surface *surface, SDL_Surface *referenceSurface, int allowable_error); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_compare_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_crc32.h b/include/SDL/SDL_test_crc32.h new file mode 100644 index 0000000..bf34782 --- /dev/null +++ b/include/SDL/SDL_test_crc32.h @@ -0,0 +1,124 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_crc32.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Implements CRC32 calculations (default output is Perl String::CRC32 compatible). + +*/ + +#ifndef SDL_test_crc32_h_ +#define SDL_test_crc32_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ------------ Definitions --------- */ + +/* Definition shared by all CRC routines */ + +#ifndef CrcUint32 + #define CrcUint32 unsigned int +#endif +#ifndef CrcUint8 + #define CrcUint8 unsigned char +#endif + +#ifdef ORIGINAL_METHOD + #define CRC32_POLY 0x04c11db7 /* AUTODIN II, Ethernet, & FDDI */ +#else + #define CRC32_POLY 0xEDB88320 /* Perl String::CRC32 compatible */ +#endif + +/** + * Data structure for CRC32 (checksum) computation + */ + typedef struct { + CrcUint32 crc32_table[256]; /* CRC table */ + } SDLTest_Crc32Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * \brief Initialize the CRC context + * + * Note: The function initializes the crc table required for all crc calculations. + * + * \param crcContext pointer to context variable + * + * \returns 0 for OK, -1 on error + * + */ + int SDLTest_Crc32Init(SDLTest_Crc32Context * crcContext); + + +/** + * \brief calculate a crc32 from a data block + * + * \param crcContext pointer to context variable + * \param inBuf input buffer to checksum + * \param inLen length of input buffer + * \param crc32 pointer to Uint32 to store the final CRC into + * + * \returns 0 for OK, -1 on error + * + */ +int SDLTest_Crc32Calc(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + +/* Same routine broken down into three steps */ +int SDLTest_Crc32CalcStart(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcEnd(SDLTest_Crc32Context * crcContext, CrcUint32 *crc32); +int SDLTest_Crc32CalcBuffer(SDLTest_Crc32Context * crcContext, CrcUint8 *inBuf, CrcUint32 inLen, CrcUint32 *crc32); + + +/** + * \brief clean up CRC context + * + * \param crcContext pointer to context variable + * + * \returns 0 for OK, -1 on error + * +*/ + +int SDLTest_Crc32Done(SDLTest_Crc32Context * crcContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_crc32_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_font.h b/include/SDL/SDL_test_font.h new file mode 100644 index 0000000..18a82ff --- /dev/null +++ b/include/SDL/SDL_test_font.h @@ -0,0 +1,168 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_font.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_font_h_ +#define SDL_test_font_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ + +#define FONT_CHARACTER_SIZE 8 +#define FONT_LINE_HEIGHT (FONT_CHARACTER_SIZE + 2) + +/** + * \brief Draw a string in the currently set font. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the character. + * \param y The Y coordinate of the upper left corner of the character. + * \param c The character to draw. + * + * \returns 0 on success, -1 on failure. + */ +int SDLTest_DrawCharacter(SDL_Renderer *renderer, int x, int y, Uint32 c); + +/** + * \brief Draw a UTF-8 string in the currently set font. + * + * The font currently only supports characters in the Basic Latin and Latin-1 Supplement sets. + * + * \param renderer The renderer to draw on. + * \param x The X coordinate of the upper left corner of the string. + * \param y The Y coordinate of the upper left corner of the string. + * \param s The string to draw. + * + * \returns 0 on success, -1 on failure. + */ +int SDLTest_DrawString(SDL_Renderer *renderer, int x, int y, const char *s); + +/** + * \brief Data used for multi-line text output + */ +typedef struct SDLTest_TextWindow +{ + SDL_Rect rect; + int current; + int numlines; + char **lines; +} SDLTest_TextWindow; + +/** + * \brief Create a multi-line text output window + * + * \param x The X coordinate of the upper left corner of the window. + * \param y The Y coordinate of the upper left corner of the window. + * \param w The width of the window (currently ignored) + * \param h The height of the window (currently ignored) + * + * \returns the new window, or NULL on failure. + * + * \since This function is available since SDL 2.24.0 + */ +SDLTest_TextWindow *SDLTest_TextWindowCreate(int x, int y, int w, int h); + +/** + * \brief Display a multi-line text output window + * + * This function should be called every frame to display the text + * + * \param textwin The text output window + * \param renderer The renderer to use for display + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowDisplay(SDLTest_TextWindow *textwin, SDL_Renderer *renderer); + +/** + * \brief Add text to a multi-line text output window + * + * Adds UTF-8 text to the end of the current text. The newline character starts a + * new line of text. The backspace character deletes the last character or, if the + * line is empty, deletes the line and goes to the end of the previous line. + * + * \param textwin The text output window + * \param fmt A printf() style format string + * \param ... additional parameters matching % tokens in the `fmt` string, if any + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowAddText(SDLTest_TextWindow *textwin, SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(2); + +/** + * \brief Add text to a multi-line text output window + * + * Adds UTF-8 text to the end of the current text. The newline character starts a + * new line of text. The backspace character deletes the last character or, if the + * line is empty, deletes the line and goes to the end of the previous line. + * + * \param textwin The text output window + * \param text The text to add to the window + * \param len The length, in bytes, of the text to add to the window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowAddTextWithLength(SDLTest_TextWindow *textwin, const char *text, size_t len); + +/** + * \brief Clear the text in a multi-line text output window + * + * \param textwin The text output window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowClear(SDLTest_TextWindow *textwin); + +/** + * \brief Free the storage associated with a multi-line text output window + * + * \param textwin The text output window + * + * \since This function is available since SDL 2.24.0 + */ +void SDLTest_TextWindowDestroy(SDLTest_TextWindow *textwin); + +/** + * \brief Cleanup textures used by font drawing functions. + */ +void SDLTest_CleanupTextDrawing(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_font_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_fuzzer.h b/include/SDL/SDL_test_fuzzer.h new file mode 100644 index 0000000..cfe6a14 --- /dev/null +++ b/include/SDL/SDL_test_fuzzer.h @@ -0,0 +1,386 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_fuzzer.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Data generators for fuzzing test data in a reproducible way. + +*/ + +#ifndef SDL_test_fuzzer_h_ +#define SDL_test_fuzzer_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* + Based on GSOC code by Markus Kauppila +*/ + + +/** + * \file + * Note: The fuzzer implementation uses a static instance of random context + * internally which makes it thread-UNsafe. + */ + +/** + * Initializes the fuzzer for a test + * + * \param execKey Execution "Key" that initializes the random number generator uniquely for the test. + * + */ +void SDLTest_FuzzerInit(Uint64 execKey); + + +/** + * Returns a random Uint8 + * + * \returns a generated integer + */ +Uint8 SDLTest_RandomUint8(void); + +/** + * Returns a random Sint8 + * + * \returns a generated signed integer + */ +Sint8 SDLTest_RandomSint8(void); + + +/** + * Returns a random Uint16 + * + * \returns a generated integer + */ +Uint16 SDLTest_RandomUint16(void); + +/** + * Returns a random Sint16 + * + * \returns a generated signed integer + */ +Sint16 SDLTest_RandomSint16(void); + + +/** + * Returns a random integer + * + * \returns a generated integer + */ +Sint32 SDLTest_RandomSint32(void); + + +/** + * Returns a random positive integer + * + * \returns a generated integer + */ +Uint32 SDLTest_RandomUint32(void); + +/** + * Returns random Uint64. + * + * \returns a generated integer + */ +Uint64 SDLTest_RandomUint64(void); + + +/** + * Returns random Sint64. + * + * \returns a generated signed integer + */ +Sint64 SDLTest_RandomSint64(void); + +/** + * \returns a random float in range [0.0 - 1.0] + */ +float SDLTest_RandomUnitFloat(void); + +/** + * \returns a random double in range [0.0 - 1.0] + */ +double SDLTest_RandomUnitDouble(void); + +/** + * \returns a random float. + * + */ +float SDLTest_RandomFloat(void); + +/** + * \returns a random double. + * + */ +double SDLTest_RandomDouble(void); + +/** + * Returns a random boundary value for Uint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint8BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint8BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint8BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint8BoundaryValue(0, 255, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint8 SDLTest_RandomUint8BoundaryValue(Uint8 boundary1, Uint8 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint16BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint16BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint16BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint16BoundaryValue(0, 0xFFFF, SDL_FALSE) returns 0 (error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint16 SDLTest_RandomUint16BoundaryValue(Uint16 boundary1, Uint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint32BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint32BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint32BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint32BoundaryValue(0, 0xFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint32 SDLTest_RandomUint32BoundaryValue(Uint32 boundary1, Uint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Uint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomUint64BoundaryValue(10, 20, SDL_TRUE) returns 10, 11, 19 or 20 + * RandomUint64BoundaryValue(1, 20, SDL_FALSE) returns 0 or 21 + * RandomUint64BoundaryValue(0, 99, SDL_FALSE) returns 100 + * RandomUint64BoundaryValue(0, 0xFFFFFFFFFFFFFFFF, SDL_FALSE) returns 0 (with error set) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or 0 with error set + */ +Uint64 SDLTest_RandomUint64BoundaryValue(Uint64 boundary1, Uint64 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint8 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint8BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint8BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint8BoundaryValue(SINT8_MIN, 99, SDL_FALSE) returns 100 + * RandomSint8BoundaryValue(SINT8_MIN, SINT8_MAX, SDL_FALSE) returns SINT8_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT8_MIN with error set + */ +Sint8 SDLTest_RandomSint8BoundaryValue(Sint8 boundary1, Sint8 boundary2, SDL_bool validDomain); + + +/** + * Returns a random boundary value for Sint16 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint16BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint16BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint16BoundaryValue(SINT16_MIN, 99, SDL_FALSE) returns 100 + * RandomSint16BoundaryValue(SINT16_MIN, SINT16_MAX, SDL_FALSE) returns SINT16_MIN (== error value) with error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT16_MIN with error set + */ +Sint16 SDLTest_RandomSint16BoundaryValue(Sint16 boundary1, Sint16 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint32 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint32BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint32BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint32BoundaryValue(SINT32_MIN, 99, SDL_FALSE) returns 100 + * RandomSint32BoundaryValue(SINT32_MIN, SINT32_MAX, SDL_FALSE) returns SINT32_MIN (== error value) + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT32_MIN with error set + */ +Sint32 SDLTest_RandomSint32BoundaryValue(Sint32 boundary1, Sint32 boundary2, SDL_bool validDomain); + +/** + * Returns a random boundary value for Sint64 within the given boundaries. + * Boundaries are inclusive, see the usage examples below. If validDomain + * is true, the function will only return valid boundaries, otherwise non-valid + * boundaries are also possible. + * If boundary1 > boundary2, the values are swapped + * + * Usage examples: + * RandomSint64BoundaryValue(-10, 20, SDL_TRUE) returns -11, -10, 19 or 20 + * RandomSint64BoundaryValue(-100, -10, SDL_FALSE) returns -101 or -9 + * RandomSint64BoundaryValue(SINT64_MIN, 99, SDL_FALSE) returns 100 + * RandomSint64BoundaryValue(SINT64_MIN, SINT64_MAX, SDL_FALSE) returns SINT64_MIN (== error value) and error set + * + * \param boundary1 Lower boundary limit + * \param boundary2 Upper boundary limit + * \param validDomain Should the generated boundary be valid (=within the bounds) or not? + * + * \returns a random boundary value for the given range and domain or SINT64_MIN with error set + */ +Sint64 SDLTest_RandomSint64BoundaryValue(Sint64 boundary1, Sint64 boundary2, SDL_bool validDomain); + + +/** + * Returns integer in range [min, max] (inclusive). + * Min and max values can be negative values. + * If Max in smaller than min, then the values are swapped. + * Min and max are the same value, that value will be returned. + * + * \param min Minimum inclusive value of returned random number + * \param max Maximum inclusive value of returned random number + * + * \returns a generated random integer in range + */ +Sint32 SDLTest_RandomIntegerInRange(Sint32 min, Sint32 max); + + +/** + * Generates random null-terminated string. The minimum length for + * the string is 1 character, maximum length for the string is 255 + * characters and it can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \returns a newly allocated random string; or NULL if length was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiString(void); + + +/** + * Generates random null-terminated string. The maximum length for + * the string is defined by the maxLength parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param maxLength The maximum length of the generated string. + * + * \returns a newly allocated random string; or NULL if maxLength was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringWithMaximumLength(int maxLength); + + +/** + * Generates random null-terminated string. The length for + * the string is defined by the size parameter. + * String can contain ASCII characters from 32 to 126. + * + * Note: Returned string needs to be deallocated. + * + * \param size The length of the generated string + * + * \returns a newly allocated random string; or NULL if size was invalid or string could not be allocated. + */ +char * SDLTest_RandomAsciiStringOfSize(int size); + +/** + * Get the invocation count for the fuzzer since last ...FuzzerInit. + * + * \returns the invocation count. + */ +int SDLTest_GetFuzzerInvocationCount(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_fuzzer_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_harness.h b/include/SDL/SDL_test_harness.h new file mode 100644 index 0000000..26231dc --- /dev/null +++ b/include/SDL/SDL_test_harness.h @@ -0,0 +1,134 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_harness.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + Defines types for test case definitions and the test execution harness API. + + Based on original GSOC code by Markus Kauppila +*/ + +#ifndef SDL_test_h_arness_h +#define SDL_test_h_arness_h + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/* ! Definitions for test case structures */ +#define TEST_ENABLED 1 +#define TEST_DISABLED 0 + +/* ! Definition of all the possible test return values of the test case method */ +#define TEST_ABORTED -1 +#define TEST_STARTED 0 +#define TEST_COMPLETED 1 +#define TEST_SKIPPED 2 + +/* ! Definition of all the possible test results for the harness */ +#define TEST_RESULT_PASSED 0 +#define TEST_RESULT_FAILED 1 +#define TEST_RESULT_NO_ASSERT 2 +#define TEST_RESULT_SKIPPED 3 +#define TEST_RESULT_SETUP_FAILURE 4 + +/* !< Function pointer to a test case setup function (run before every test) */ +typedef void (*SDLTest_TestCaseSetUpFp)(void *arg); + +/* !< Function pointer to a test case function */ +typedef int (*SDLTest_TestCaseFp)(void *arg); + +/* !< Function pointer to a test case teardown function (run after every test) */ +typedef void (*SDLTest_TestCaseTearDownFp)(void *arg); + +/** + * Holds information about a single test case. + */ +typedef struct SDLTest_TestCaseReference { + /* !< Func2Stress */ + SDLTest_TestCaseFp testCase; + /* !< Short name (or function name) "Func2Stress" */ + const char *name; + /* !< Long name or full description "This test pushes func2() to the limit." */ + const char *description; + /* !< Set to TEST_ENABLED or TEST_DISABLED (test won't be run) */ + int enabled; +} SDLTest_TestCaseReference; + +/** + * Holds information about a test suite (multiple test cases). + */ +typedef struct SDLTest_TestSuiteReference { + /* !< "PlatformSuite" */ + const char *name; + /* !< The function that is run before each test. NULL skips. */ + SDLTest_TestCaseSetUpFp testSetUp; + /* !< The test cases that are run as part of the suite. Last item should be NULL. */ + const SDLTest_TestCaseReference **testCases; + /* !< The function that is run after each test. NULL skips. */ + SDLTest_TestCaseTearDownFp testTearDown; +} SDLTest_TestSuiteReference; + + +/** + * \brief Generates a random run seed string for the harness. The generated seed will contain alphanumeric characters (0-9A-Z). + * + * Note: The returned string needs to be deallocated by the caller. + * + * \param length The length of the seed string to generate + * + * \returns the generated seed string + */ +char *SDLTest_GenerateRunSeed(const int length); + +/** + * \brief Execute a test suite using the given run seed and execution key. + * + * \param testSuites Suites containing the test case. + * \param userRunSeed Custom run seed provided by user, or NULL to autogenerate one. + * \param userExecKey Custom execution key provided by user, or 0 to autogenerate one. + * \param filter Filter specification. NULL disables. Case sensitive. + * \param testIterations Number of iterations to run each test case. + * + * \returns the test run result: 0 when all tests passed, 1 if any tests failed. + */ +int SDLTest_RunSuites(SDLTest_TestSuiteReference *testSuites[], const char *userRunSeed, Uint64 userExecKey, const char *filter, int testIterations); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_h_arness_h */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_images.h b/include/SDL/SDL_test_images.h new file mode 100644 index 0000000..1211371 --- /dev/null +++ b/include/SDL/SDL_test_images.h @@ -0,0 +1,78 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_images.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + Defines some images for tests. + +*/ + +#ifndef SDL_test_images_h_ +#define SDL_test_images_h_ + +#include "SDL.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + *Type for test images. + */ +typedef struct SDLTest_SurfaceImage_s { + int width; + int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + const char *pixel_data; +} SDLTest_SurfaceImage_t; + +/* Test images */ +SDL_Surface *SDLTest_ImageBlit(void); +SDL_Surface *SDLTest_ImageBlitColor(void); +SDL_Surface *SDLTest_ImageBlitAlpha(void); +SDL_Surface *SDLTest_ImageBlitBlendAdd(void); +SDL_Surface *SDLTest_ImageBlitBlend(void); +SDL_Surface *SDLTest_ImageBlitBlendMod(void); +SDL_Surface *SDLTest_ImageBlitBlendNone(void); +SDL_Surface *SDLTest_ImageBlitBlendAll(void); +SDL_Surface *SDLTest_ImageFace(void); +SDL_Surface *SDLTest_ImagePrimitives(void); +SDL_Surface *SDLTest_ImagePrimitivesBlend(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_images_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_log.h b/include/SDL/SDL_test_log.h new file mode 100644 index 0000000..a27ffc2 --- /dev/null +++ b/include/SDL/SDL_test_log.h @@ -0,0 +1,67 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_log.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + * + * Wrapper to log in the TEST category + * + */ + +#ifndef SDL_test_log_h_ +#define SDL_test_log_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Prints given message with a timestamp in the TEST category and INFO priority. + * + * \param fmt Message to be logged + */ +void SDLTest_Log(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/** + * \brief Prints given message with a timestamp in the TEST category and the ERROR priority. + * + * \param fmt Message to be logged + */ +void SDLTest_LogError(SDL_PRINTF_FORMAT_STRING const char *fmt, ...) SDL_PRINTF_VARARG_FUNC(1); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_log_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_md5.h b/include/SDL/SDL_test_md5.h new file mode 100644 index 0000000..538c7ae --- /dev/null +++ b/include/SDL/SDL_test_md5.h @@ -0,0 +1,129 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_md5.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + *********************************************************************** + ** Header file for implementation of MD5 ** + ** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** + ** Created: 2/17/90 RLR ** + ** Revised: 12/27/90 SRD,AJ,BSK,JT Reference C version ** + ** Revised (for MD5): RLR 4/27/91 ** + ** -- G modified to have y&~z instead of y&z ** + ** -- FF, GG, HH modified to add in last register done ** + ** -- Access pattern: round 2 works mod 5, round 3 works mod 3 ** + ** -- distinct additive constant for each step ** + ** -- round 4 added, working mod 7 ** + *********************************************************************** +*/ + +/* + *********************************************************************** + ** Message-digest routines: ** + ** To form the message digest for a message M ** + ** (1) Initialize a context buffer mdContext using MD5Init ** + ** (2) Call MD5Update on mdContext and M ** + ** (3) Call MD5Final on mdContext ** + ** The message digest is now in mdContext->digest[0...15] ** + *********************************************************************** +*/ + +#ifndef SDL_test_md5_h_ +#define SDL_test_md5_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* ------------ Definitions --------- */ + +/* typedef a 32-bit type */ + typedef unsigned long int MD5UINT4; + +/* Data structure for MD5 (Message-Digest) computation */ + typedef struct { + MD5UINT4 i[2]; /* number of _bits_ handled mod 2^64 */ + MD5UINT4 buf[4]; /* scratch buffer */ + unsigned char in[64]; /* input buffer */ + unsigned char digest[16]; /* actual digest after Md5Final call */ + } SDLTest_Md5Context; + +/* ---------- Function Prototypes ------------- */ + +/** + * \brief initialize the context + * + * \param mdContext pointer to context variable + * + * Note: The function initializes the message-digest context + * mdContext. Call before each new use of the context - + * all fields are set to zero. + */ + void SDLTest_Md5Init(SDLTest_Md5Context * mdContext); + + +/** + * \brief update digest from variable length data + * + * \param mdContext pointer to context variable + * \param inBuf pointer to data array/string + * \param inLen length of data array/string + * + * Note: The function updates the message-digest context to account + * for the presence of each of the characters inBuf[0..inLen-1] + * in the message whose digest is being computed. +*/ + + void SDLTest_Md5Update(SDLTest_Md5Context * mdContext, unsigned char *inBuf, + unsigned int inLen); + + +/** + * \brief complete digest computation + * + * \param mdContext pointer to context variable + * + * Note: The function terminates the message-digest computation and + * ends with the desired message digest in mdContext.digest[0..15]. + * Always call before using the digest[] variable. +*/ + + void SDLTest_Md5Final(SDLTest_Md5Context * mdContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_md5_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_memory.h b/include/SDL/SDL_test_memory.h new file mode 100644 index 0000000..f959177 --- /dev/null +++ b/include/SDL/SDL_test_memory.h @@ -0,0 +1,63 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_memory.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +#ifndef SDL_test_memory_h_ +#define SDL_test_memory_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * \brief Start tracking SDL memory allocations + * + * \note This should be called before any other SDL functions for complete tracking coverage + */ +int SDLTest_TrackAllocations(void); + +/** + * \brief Print a log of any outstanding allocations + * + * \note This can be called after SDL_Quit() + */ +void SDLTest_LogAllocations(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_memory_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_test_random.h b/include/SDL/SDL_test_random.h new file mode 100644 index 0000000..0035a80 --- /dev/null +++ b/include/SDL/SDL_test_random.h @@ -0,0 +1,115 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_test_random.h + * + * Include file for SDL test framework. + * + * This code is a part of the SDL2_test library, not the main SDL library. + */ + +/* + + A "32-bit Multiply with carry random number generator. Very fast. + Includes a list of recommended multipliers. + + multiply-with-carry generator: x(n) = a*x(n-1) + carry mod 2^32. + period: (a*2^31)-1 + +*/ + +#ifndef SDL_test_random_h_ +#define SDL_test_random_h_ + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* --- Definitions */ + +/* + * Macros that return a random number in a specific format. + */ +#define SDLTest_RandomInt(c) ((int)SDLTest_Random(c)) + +/* + * Context structure for the random number generator state. + */ + typedef struct { + unsigned int a; + unsigned int x; + unsigned int c; + unsigned int ah; + unsigned int al; + } SDLTest_RandomContext; + + +/* --- Function prototypes */ + +/** + * \brief Initialize random number generator with two integers. + * + * Note: The random sequence of numbers returned by ...Random() is the + * same for the same two integers and has a period of 2^31. + * + * \param rndContext pointer to context structure + * \param xi integer that defines the random sequence + * \param ci integer that defines the random sequence + * + */ + void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, + unsigned int ci); + +/** + * \brief Initialize random number generator based on current system time. + * + * \param rndContext pointer to context structure + * + */ + void SDLTest_RandomInitTime(SDLTest_RandomContext *rndContext); + + +/** + * \brief Initialize random number generator based on current system time. + * + * Note: ...RandomInit() or ...RandomInitTime() must have been called + * before using this function. + * + * \param rndContext pointer to context structure + * + * \returns a random number (32bit unsigned integer) + * + */ + unsigned int SDLTest_Random(SDLTest_RandomContext *rndContext); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_test_random_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_thread.h b/include/SDL/SDL_thread.h new file mode 100644 index 0000000..849f70b --- /dev/null +++ b/include/SDL/SDL_thread.h @@ -0,0 +1,464 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_thread_h_ +#define SDL_thread_h_ + +/** + * \file SDL_thread.h + * + * Header for the SDL thread management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +/* Thread synchronization primitives */ +#include "SDL_atomic.h" +#include "SDL_mutex.h" + +#if defined(__WIN32__) || defined(__GDK__) +#include /* _beginthreadex() and _endthreadex() */ +#endif +#if defined(__OS2__) /* for _beginthread() and _endthread() */ +#ifndef __EMX__ +#include +#else +#include +#endif +#endif + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* The SDL thread structure, defined in SDL_thread.c */ +struct SDL_Thread; +typedef struct SDL_Thread SDL_Thread; + +/* The SDL thread ID */ +typedef unsigned long SDL_threadID; + +/* Thread local storage ID, 0 is the invalid ID */ +typedef unsigned int SDL_TLSID; + +/** + * The SDL thread priority. + * + * SDL will make system changes as necessary in order to apply the thread priority. + * Code which attempts to control thread state related to priority should be aware + * that calling SDL_SetThreadPriority may alter such state. + * SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of this behavior. + * + * \note On many systems you require special privileges to set high or time critical priority. + */ +typedef enum { + SDL_THREAD_PRIORITY_LOW, + SDL_THREAD_PRIORITY_NORMAL, + SDL_THREAD_PRIORITY_HIGH, + SDL_THREAD_PRIORITY_TIME_CRITICAL +} SDL_ThreadPriority; + +/** + * The function passed to SDL_CreateThread(). + * + * \param data what was passed as `data` to SDL_CreateThread() + * \returns a value that can be reported through SDL_WaitThread(). + */ +typedef int (SDLCALL * SDL_ThreadFunction) (void *data); + + +#if defined(__WIN32__) || defined(__GDK__) +/** + * \file SDL_thread.h + * + * We compile SDL into a DLL. This means, that it's the DLL which + * creates a new thread for the calling process with the SDL_CreateThread() + * API. There is a problem with this, that only the RTL of the SDL2.DLL will + * be initialized for those threads, and not the RTL of the calling + * application! + * + * To solve this, we make a little hack here. + * + * We'll always use the caller's _beginthread() and _endthread() APIs to + * start a new thread. This way, if it's the SDL2.DLL which uses this API, + * then the RTL of SDL2.DLL will be used to create the new thread, and if it's + * the application, then the RTL of the application will be used. + * + * So, in short: + * Always use the _beginthread() and _endthread() of the calling runtime + * library! + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD + +typedef uintptr_t (__cdecl * pfnSDL_CurrentBeginThread) + (void *, unsigned, unsigned (__stdcall *func)(void *), + void * /*arg*/, unsigned, unsigned * /* threadID */); +typedef void (__cdecl * pfnSDL_CurrentEndThread) (unsigned code); + +#ifndef SDL_beginthread +#define SDL_beginthread _beginthreadex +#endif +#ifndef SDL_endthread +#define SDL_endthread _endthreadex +#endif + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, + const char *name, const size_t stacksize, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + + +#if defined(SDL_CreateThread) && SDL_DYNAMIC_API +#undef SDL_CreateThread +#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#undef SDL_CreateThreadWithStackSize +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#else +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#endif + +#elif defined(__OS2__) +/* + * just like the windows case above: We compile SDL2 + * into a dll with Watcom's runtime statically linked. + */ +#define SDL_PASSED_BEGINTHREAD_ENDTHREAD + +typedef int (*pfnSDL_CurrentBeginThread)(void (*func)(void *), void *, unsigned, void * /*arg*/); +typedef void (*pfnSDL_CurrentEndThread)(void); + +#ifndef SDL_beginthread +#define SDL_beginthread _beginthread +#endif +#ifndef SDL_endthread +#define SDL_endthread _endthread +#endif + +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data, + pfnSDL_CurrentBeginThread pfnBeginThread, + pfnSDL_CurrentEndThread pfnEndThread); + +#if defined(SDL_CreateThread) && SDL_DYNAMIC_API +#undef SDL_CreateThread +#define SDL_CreateThread(fn, name, data) SDL_CreateThread_REAL(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#undef SDL_CreateThreadWithStackSize +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize_REAL(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#else +#define SDL_CreateThread(fn, name, data) SDL_CreateThread(fn, name, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#define SDL_CreateThreadWithStackSize(fn, name, stacksize, data) SDL_CreateThreadWithStackSize(fn, name, stacksize, data, (pfnSDL_CurrentBeginThread)SDL_beginthread, (pfnSDL_CurrentEndThread)SDL_endthread) +#endif + +#else + +/** + * Create a new thread with a default stack size. + * + * This is equivalent to calling: + * + * ```c + * SDL_CreateThreadWithStackSize(fn, name, 0, data); + * ``` + * + * \param fn the SDL_ThreadFunction function to call in the new thread + * \param name the name of the thread + * \param data a pointer that is passed to `fn` + * \returns an opaque pointer to the new thread object on success, NULL if the + * new thread could not be created; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThreadWithStackSize + * \sa SDL_WaitThread + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThread(SDL_ThreadFunction fn, const char *name, void *data); + +/** + * Create a new thread with a specific stack size. + * + * SDL makes an attempt to report `name` to the system, so that debuggers can + * display it. Not all platforms support this. + * + * Thread naming is a little complicated: Most systems have very small limits + * for the string length (Haiku has 32 bytes, Linux currently has 16, Visual + * C++ 6.0 has _nine_!), and possibly other arbitrary rules. You'll have to + * see what happens with your system's debugger. The name should be UTF-8 (but + * using the naming limits of C identifiers is a better bet). There are no + * requirements for thread naming conventions, so long as the string is + * null-terminated UTF-8, but these guidelines are helpful in choosing a name: + * + * https://stackoverflow.com/questions/149932/naming-conventions-for-threads + * + * If a system imposes requirements, SDL will try to munge the string for it + * (truncate, etc), but the original string contents will be available from + * SDL_GetThreadName(). + * + * The size (in bytes) of the new stack can be specified. Zero means "use the + * system default" which might be wildly different between platforms. x86 + * Linux generally defaults to eight megabytes, an embedded device might be a + * few kilobytes instead. You generally need to specify a stack that is a + * multiple of the system's page size (in many cases, this is 4 kilobytes, but + * check your system documentation). + * + * In SDL 2.1, stack size will be folded into the original SDL_CreateThread + * function, but for backwards compatibility, this is currently a separate + * function. + * + * \param fn the SDL_ThreadFunction function to call in the new thread + * \param name the name of the thread + * \param stacksize the size, in bytes, to allocate for the new thread stack. + * \param data a pointer that is passed to `fn` + * \returns an opaque pointer to the new thread object on success, NULL if the + * new thread could not be created; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_WaitThread + */ +extern DECLSPEC SDL_Thread *SDLCALL +SDL_CreateThreadWithStackSize(SDL_ThreadFunction fn, const char *name, const size_t stacksize, void *data); + +#endif + +/** + * Get the thread name as it was specified in SDL_CreateThread(). + * + * This is internal memory, not to be freed by the caller, and remains valid + * until the specified thread is cleaned up by SDL_WaitThread(). + * + * \param thread the thread to query + * \returns a pointer to a UTF-8 string that names the specified thread, or + * NULL if it doesn't have a name. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThread + */ +extern DECLSPEC const char *SDLCALL SDL_GetThreadName(SDL_Thread *thread); + +/** + * Get the thread identifier for the current thread. + * + * This thread identifier is as reported by the underlying operating system. + * If SDL is running on a platform that does not support threads the return + * value will always be zero. + * + * This function also returns a valid thread ID when called from the main + * thread. + * + * \returns the ID of the current thread. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetThreadID + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_ThreadID(void); + +/** + * Get the thread identifier for the specified thread. + * + * This thread identifier is as reported by the underlying operating system. + * If SDL is running on a platform that does not support threads the return + * value will always be zero. + * + * \param thread the thread to query + * \returns the ID of the specified thread, or the ID of the current thread if + * `thread` is NULL. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ThreadID + */ +extern DECLSPEC SDL_threadID SDLCALL SDL_GetThreadID(SDL_Thread * thread); + +/** + * Set the priority for the current thread. + * + * Note that some platforms will not let you alter the priority (or at least, + * promote the thread to a higher priority) at all, and some require you to be + * an administrator account. Be prepared for this to fail. + * + * \param priority the SDL_ThreadPriority to set + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC int SDLCALL SDL_SetThreadPriority(SDL_ThreadPriority priority); + +/** + * Wait for a thread to finish. + * + * Threads that haven't been detached will remain (as a "zombie") until this + * function cleans them up. Not doing so is a resource leak. + * + * Once a thread has been cleaned up through this function, the SDL_Thread + * that references it becomes invalid and should not be referenced again. As + * such, only one thread may call SDL_WaitThread() on another. + * + * The return code for the thread function is placed in the area pointed to by + * `status`, if `status` is not NULL. + * + * You may not wait on a thread that has been used in a call to + * SDL_DetachThread(). Use either that function or this one, but not both, or + * behavior is undefined. + * + * It is safe to pass a NULL thread to this function; it is a no-op. + * + * Note that the thread pointer is freed by this function and is not valid + * afterward. + * + * \param thread the SDL_Thread pointer that was returned from the + * SDL_CreateThread() call that started this thread + * \param status pointer to an integer that will receive the value returned + * from the thread function by its 'return', or NULL to not + * receive such value back. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateThread + * \sa SDL_DetachThread + */ +extern DECLSPEC void SDLCALL SDL_WaitThread(SDL_Thread * thread, int *status); + +/** + * Let a thread clean up on exit without intervention. + * + * A thread may be "detached" to signify that it should not remain until + * another thread has called SDL_WaitThread() on it. Detaching a thread is + * useful for long-running threads that nothing needs to synchronize with or + * further manage. When a detached thread is done, it simply goes away. + * + * There is no way to recover the return code of a detached thread. If you + * need this, don't detach the thread and instead use SDL_WaitThread(). + * + * Once a thread is detached, you should usually assume the SDL_Thread isn't + * safe to reference again, as it will become invalid immediately upon the + * detached thread's exit, instead of remaining until someone has called + * SDL_WaitThread() to finally clean it up. As such, don't detach the same + * thread more than once. + * + * If a thread has already exited when passed to SDL_DetachThread(), it will + * stop waiting for a call to SDL_WaitThread() and clean up immediately. It is + * not safe to detach a thread that might be used with SDL_WaitThread(). + * + * You may not call SDL_WaitThread() on a thread that has been detached. Use + * either that function or this one, but not both, or behavior is undefined. + * + * It is safe to pass NULL to this function; it is a no-op. + * + * \param thread the SDL_Thread pointer that was returned from the + * SDL_CreateThread() call that started this thread + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_CreateThread + * \sa SDL_WaitThread + */ +extern DECLSPEC void SDLCALL SDL_DetachThread(SDL_Thread * thread); + +/** + * Create a piece of thread-local storage. + * + * This creates an identifier that is globally visible to all threads but + * refers to data that is thread-specific. + * + * \returns the newly created thread local storage identifier or 0 on error. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSGet + * \sa SDL_TLSSet + */ +extern DECLSPEC SDL_TLSID SDLCALL SDL_TLSCreate(void); + +/** + * Get the current thread's value associated with a thread local storage ID. + * + * \param id the thread local storage ID + * \returns the value associated with the ID for the current thread or NULL if + * no value has been set; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSCreate + * \sa SDL_TLSSet + */ +extern DECLSPEC void * SDLCALL SDL_TLSGet(SDL_TLSID id); + +/** + * Set the current thread's value associated with a thread local storage ID. + * + * The function prototype for `destructor` is: + * + * ```c + * void destructor(void *value) + * ``` + * + * where its parameter `value` is what was passed as `value` to SDL_TLSSet(). + * + * \param id the thread local storage ID + * \param value the value to associate with the ID for the current thread + * \param destructor a function called when the thread exits, to free the + * value + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TLSCreate + * \sa SDL_TLSGet + */ +extern DECLSPEC int SDLCALL SDL_TLSSet(SDL_TLSID id, const void *value, void (SDLCALL *destructor)(void*)); + +/** + * Cleanup all TLS data for this thread. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC void SDLCALL SDL_TLSCleanup(void); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_thread_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_timer.h b/include/SDL/SDL_timer.h new file mode 100644 index 0000000..98f9ad1 --- /dev/null +++ b/include/SDL/SDL_timer.h @@ -0,0 +1,222 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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 SDL_timer_h_ +#define SDL_timer_h_ + +/** + * \file SDL_timer.h + * + * Header for the SDL time management routines. + */ + +#include "SDL_stdinc.h" +#include "SDL_error.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Get the number of milliseconds since SDL library initialization. + * + * This value wraps if the program runs for more than ~49 days. + * + * This function is not recommended as of SDL 2.0.18; use SDL_GetTicks64() + * instead, where the value doesn't wrap every ~49 days. There are places in + * SDL where we provide a 32-bit timestamp that can not change without + * breaking binary compatibility, though, so this function isn't officially + * deprecated. + * + * \returns an unsigned 32-bit value representing the number of milliseconds + * since the SDL library initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_TICKS_PASSED + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetTicks(void); + +/** + * Get the number of milliseconds since SDL library initialization. + * + * Note that you should not use the SDL_TICKS_PASSED macro with values + * returned by this function, as that macro does clever math to compensate for + * the 32-bit overflow every ~49 days that SDL_GetTicks() suffers from. 64-bit + * values from this function can be safely compared directly. + * + * For example, if you want to wait 100 ms, you could do this: + * + * ```c + * const Uint64 timeout = SDL_GetTicks64() + 100; + * while (SDL_GetTicks64() < timeout) { + * // ... do work until timeout has elapsed + * } + * ``` + * + * \returns an unsigned 64-bit value representing the number of milliseconds + * since the SDL library initialized. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetTicks64(void); + +/** + * Compare 32-bit SDL ticks values, and return true if `A` has passed `B`. + * + * This should be used with results from SDL_GetTicks(), as this macro + * attempts to deal with the 32-bit counter wrapping back to zero every ~49 + * days, but should _not_ be used with SDL_GetTicks64(), which does not have + * that problem. + * + * For example, with SDL_GetTicks(), if you want to wait 100 ms, you could + * do this: + * + * ```c + * const Uint32 timeout = SDL_GetTicks() + 100; + * while (!SDL_TICKS_PASSED(SDL_GetTicks(), timeout)) { + * // ... do work until timeout has elapsed + * } + * ``` + * + * Note that this does not handle tick differences greater + * than 2^31 so take care when using the above kind of code + * with large timeout delays (tens of days). + */ +#define SDL_TICKS_PASSED(A, B) ((Sint32)((B) - (A)) <= 0) + +/** + * Get the current value of the high resolution counter. + * + * This function is typically used for profiling. + * + * The counter values are only meaningful relative to each other. Differences + * between values can be converted to times by using + * SDL_GetPerformanceFrequency(). + * + * \returns the current counter value. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetPerformanceFrequency + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceCounter(void); + +/** + * Get the count per second of the high resolution counter. + * + * \returns a platform-specific count per second. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetPerformanceCounter + */ +extern DECLSPEC Uint64 SDLCALL SDL_GetPerformanceFrequency(void); + +/** + * Wait a specified number of milliseconds before returning. + * + * This function waits a specified number of milliseconds before returning. It + * waits at least the specified time, but possibly longer due to OS + * scheduling. + * + * \param ms the number of milliseconds to delay + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms); + +/** + * Function prototype for the timer callback function. + * + * The callback function is passed the current timer interval and returns + * the next timer interval. If the returned value is the same as the one + * passed in, the periodic alarm continues, otherwise a new alarm is + * scheduled. If the callback returns 0, the periodic alarm is cancelled. + */ +typedef Uint32 (SDLCALL * SDL_TimerCallback) (Uint32 interval, void *param); + +/** + * Definition of the timer ID type. + */ +typedef int SDL_TimerID; + +/** + * Call a callback function at a future time. + * + * If you use this function, you must pass `SDL_INIT_TIMER` to SDL_Init(). + * + * The callback function is passed the current timer interval and the user + * supplied parameter from the SDL_AddTimer() call and should return the next + * timer interval. If the value returned from the callback is 0, the timer is + * canceled. + * + * The callback is run on a separate thread. + * + * Timers take into account the amount of time it took to execute the + * callback. For example, if the callback took 250 ms to execute and returned + * 1000 (ms), the timer would only wait another 750 ms before its next + * iteration. + * + * Timing may be inexact due to OS scheduling. Be sure to note the current + * time with SDL_GetTicks() or SDL_GetPerformanceCounter() in case your + * callback needs to adjust for variances. + * + * \param interval the timer delay, in milliseconds, passed to `callback` + * \param callback the SDL_TimerCallback function to call when the specified + * `interval` elapses + * \param param a pointer that is passed to `callback` + * \returns a timer ID or 0 if an error occurs; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RemoveTimer + */ +extern DECLSPEC SDL_TimerID SDLCALL SDL_AddTimer(Uint32 interval, + SDL_TimerCallback callback, + void *param); + +/** + * Remove a timer created with SDL_AddTimer(). + * + * \param id the ID of the timer to remove + * \returns SDL_TRUE if the timer is removed or SDL_FALSE if the timer wasn't + * found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_AddTimer + */ +extern DECLSPEC SDL_bool SDLCALL SDL_RemoveTimer(SDL_TimerID id); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_timer_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_touch.h b/include/SDL/SDL_touch.h new file mode 100644 index 0000000..c12d4a1 --- /dev/null +++ b/include/SDL/SDL_touch.h @@ -0,0 +1,150 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_touch.h + * + * Include file for SDL touch event handling. + */ + +#ifndef SDL_touch_h_ +#define SDL_touch_h_ + +#include "SDL_stdinc.h" +#include "SDL_error.h" +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +typedef Sint64 SDL_TouchID; +typedef Sint64 SDL_FingerID; + +typedef enum +{ + SDL_TOUCH_DEVICE_INVALID = -1, + SDL_TOUCH_DEVICE_DIRECT, /* touch screen with window-relative coordinates */ + SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE, /* trackpad with absolute device coordinates */ + SDL_TOUCH_DEVICE_INDIRECT_RELATIVE /* trackpad with screen cursor-relative coordinates */ +} SDL_TouchDeviceType; + +typedef struct SDL_Finger +{ + SDL_FingerID id; + float x; + float y; + float pressure; +} SDL_Finger; + +/* Used as the device ID for mouse events simulated with touch input */ +#define SDL_TOUCH_MOUSEID ((Uint32)-1) + +/* Used as the SDL_TouchID for touch events simulated with mouse input */ +#define SDL_MOUSE_TOUCHID ((Sint64)-1) + + +/** + * Get the number of registered touch devices. + * + * On some platforms SDL first sees the touch device if it was actually used. + * Therefore SDL_GetNumTouchDevices() may return 0 although devices are + * available. After using all devices at least once the number will be + * correct. + * + * This was fixed for Android in SDL 2.0.1. + * + * \returns the number of registered touch devices. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchDevice + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchDevices(void); + +/** + * Get the touch ID with the given index. + * + * \param index the touch device index + * \returns the touch ID with the given index on success or 0 if the index is + * invalid; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumTouchDevices + */ +extern DECLSPEC SDL_TouchID SDLCALL SDL_GetTouchDevice(int index); + +/** + * Get the touch device name as reported from the driver or NULL if the index + * is invalid. + * + * \since This function is available since SDL 2.0.22. + */ +extern DECLSPEC const char* SDLCALL SDL_GetTouchName(int index); + +/** + * Get the type of the given touch device. + * + * \since This function is available since SDL 2.0.10. + */ +extern DECLSPEC SDL_TouchDeviceType SDLCALL SDL_GetTouchDeviceType(SDL_TouchID touchID); + +/** + * Get the number of active fingers for a given touch device. + * + * \param touchID the ID of a touch device + * \returns the number of active fingers for a given touch device on success + * or 0 on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetTouchFinger + */ +extern DECLSPEC int SDLCALL SDL_GetNumTouchFingers(SDL_TouchID touchID); + +/** + * Get the finger object for specified touch device ID and finger index. + * + * The returned resource is owned by SDL and should not be deallocated. + * + * \param touchID the ID of the requested touch device + * \param index the index of the requested finger + * \returns a pointer to the SDL_Finger object or NULL if no object at the + * given ID and index could be found. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_RecordGesture + */ +extern DECLSPEC SDL_Finger * SDLCALL SDL_GetTouchFinger(SDL_TouchID touchID, int index); + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_touch_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_types.h b/include/SDL/SDL_types.h new file mode 100644 index 0000000..b5d7192 --- /dev/null +++ b/include/SDL/SDL_types.h @@ -0,0 +1,29 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_types.h + * + * \deprecated + */ + +/* DEPRECATED */ +#include "SDL_stdinc.h" diff --git a/include/SDL/SDL_version.h b/include/SDL/SDL_version.h new file mode 100644 index 0000000..27ffa63 --- /dev/null +++ b/include/SDL/SDL_version.h @@ -0,0 +1,204 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_version.h + * + * This header defines the current SDL version. + */ + +#ifndef SDL_version_h_ +#define SDL_version_h_ + +#include "SDL_stdinc.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * Information about the version of SDL in use. + * + * Represents the library's version as three levels: major revision + * (increments with massive changes, additions, and enhancements), + * minor revision (increments with backwards-compatible changes to the + * major revision), and patchlevel (increments with fixes to the minor + * revision). + * + * \sa SDL_VERSION + * \sa SDL_GetVersion + */ +typedef struct SDL_version +{ + Uint8 major; /**< major version */ + Uint8 minor; /**< minor version */ + Uint8 patch; /**< update version */ +} SDL_version; + +/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL +*/ +#define SDL_MAJOR_VERSION 2 +#define SDL_MINOR_VERSION 26 +#define SDL_PATCHLEVEL 4 + +/** + * Macro to determine SDL version program was compiled against. + * + * This macro fills in a SDL_version structure with the version of the + * library you compiled against. This is determined by what header the + * compiler uses. Note that if you dynamically linked the library, you might + * have a slightly newer or older version at runtime. That version can be + * determined with SDL_GetVersion(), which, unlike SDL_VERSION(), + * is not a macro. + * + * \param x A pointer to a SDL_version struct to initialize. + * + * \sa SDL_version + * \sa SDL_GetVersion + */ +#define SDL_VERSION(x) \ +{ \ + (x)->major = SDL_MAJOR_VERSION; \ + (x)->minor = SDL_MINOR_VERSION; \ + (x)->patch = SDL_PATCHLEVEL; \ +} + +/* TODO: Remove this whole block in SDL 3 */ +#if SDL_MAJOR_VERSION < 3 +/** + * This macro turns the version numbers into a numeric value: + * \verbatim + (1,2,3) -> (1203) + \endverbatim + * + * This assumes that there will never be more than 100 patchlevels. + * + * In versions higher than 2.9.0, the minor version overflows into + * the thousands digit: for example, 2.23.0 is encoded as 4300, + * and 2.255.99 would be encoded as 25799. + * This macro will not be available in SDL 3.x. + */ +#define SDL_VERSIONNUM(X, Y, Z) \ + ((X)*1000 + (Y)*100 + (Z)) + +/** + * This is the version number macro for the current SDL version. + * + * In versions higher than 2.9.0, the minor version overflows into + * the thousands digit: for example, 2.23.0 is encoded as 4300. + * This macro will not be available in SDL 3.x. + * + * Deprecated, use SDL_VERSION_ATLEAST or SDL_VERSION instead. + */ +#define SDL_COMPILEDVERSION \ + SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL) +#endif /* SDL_MAJOR_VERSION < 3 */ + +/** + * This macro will evaluate to true if compiled with SDL at least X.Y.Z. + */ +#define SDL_VERSION_ATLEAST(X, Y, Z) \ + ((SDL_MAJOR_VERSION >= X) && \ + (SDL_MAJOR_VERSION > X || SDL_MINOR_VERSION >= Y) && \ + (SDL_MAJOR_VERSION > X || SDL_MINOR_VERSION > Y || SDL_PATCHLEVEL >= Z)) + +/** + * Get the version of SDL that is linked against your program. + * + * If you are linking to SDL dynamically, then it is possible that the current + * version will be different than the version you compiled against. This + * function returns the current version, while SDL_VERSION() is a macro that + * tells you what version you compiled with. + * + * This function may be called safely at any time, even before SDL_Init(). + * + * \param ver the SDL_version structure that contains the version information + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRevision + */ +extern DECLSPEC void SDLCALL SDL_GetVersion(SDL_version * ver); + +/** + * Get the code revision of SDL that is linked against your program. + * + * This value is the revision of the code you are linked with and may be + * different from the code you are compiling with, which is found in the + * constant SDL_REVISION. + * + * The revision is arbitrary string (a hash value) uniquely identifying the + * exact revision of the SDL library in use, and is only useful in comparing + * against other revisions. It is NOT an incrementing number. + * + * If SDL wasn't built from a git repository with the appropriate tools, this + * will return an empty string. + * + * Prior to SDL 2.0.16, before development moved to GitHub, this returned a + * hash for a Mercurial repository. + * + * You shouldn't use this function for anything but logging it for debugging + * purposes. The string is not intended to be reliable in any way. + * + * \returns an arbitrary string, uniquely identifying the exact revision of + * the SDL library in use. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetVersion + */ +extern DECLSPEC const char *SDLCALL SDL_GetRevision(void); + +/** + * Obsolete function, do not use. + * + * When SDL was hosted in a Mercurial repository, and was built carefully, + * this would return the revision number that the build was created from. This + * number was not reliable for several reasons, but more importantly, SDL is + * now hosted in a git repository, which does not offer numbers at all, only + * hashes. This function only ever returns zero now. Don't use it. + * + * Before SDL 2.0.16, this might have returned an unreliable, but non-zero + * number. + * + * \deprecated Use SDL_GetRevision() instead; if SDL was carefully built, it + * will return a git hash. + * + * \returns zero, always, in modern SDL releases. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetRevision + */ +extern SDL_DEPRECATED DECLSPEC int SDLCALL SDL_GetRevisionNumber(void); + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_version_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_video.h b/include/SDL/SDL_video.h new file mode 100644 index 0000000..c70facb --- /dev/null +++ b/include/SDL/SDL_video.h @@ -0,0 +1,2150 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file SDL_video.h + * + * Header file for SDL video functions. + */ + +#ifndef SDL_video_h_ +#define SDL_video_h_ + +#include "SDL_stdinc.h" +#include "SDL_pixels.h" +#include "SDL_rect.h" +#include "SDL_surface.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief The structure that defines a display mode + * + * \sa SDL_GetNumDisplayModes() + * \sa SDL_GetDisplayMode() + * \sa SDL_GetDesktopDisplayMode() + * \sa SDL_GetCurrentDisplayMode() + * \sa SDL_GetClosestDisplayMode() + * \sa SDL_SetWindowDisplayMode() + * \sa SDL_GetWindowDisplayMode() + */ +typedef struct +{ + Uint32 format; /**< pixel format */ + int w; /**< width, in screen coordinates */ + int h; /**< height, in screen coordinates */ + int refresh_rate; /**< refresh rate (or zero for unspecified) */ + void *driverdata; /**< driver-specific data, initialize to 0 */ +} SDL_DisplayMode; + +/** + * \brief The type used to identify a window + * + * \sa SDL_CreateWindow() + * \sa SDL_CreateWindowFrom() + * \sa SDL_DestroyWindow() + * \sa SDL_FlashWindow() + * \sa SDL_GetWindowData() + * \sa SDL_GetWindowFlags() + * \sa SDL_GetWindowGrab() + * \sa SDL_GetWindowKeyboardGrab() + * \sa SDL_GetWindowMouseGrab() + * \sa SDL_GetWindowPosition() + * \sa SDL_GetWindowSize() + * \sa SDL_GetWindowTitle() + * \sa SDL_HideWindow() + * \sa SDL_MaximizeWindow() + * \sa SDL_MinimizeWindow() + * \sa SDL_RaiseWindow() + * \sa SDL_RestoreWindow() + * \sa SDL_SetWindowData() + * \sa SDL_SetWindowFullscreen() + * \sa SDL_SetWindowGrab() + * \sa SDL_SetWindowKeyboardGrab() + * \sa SDL_SetWindowMouseGrab() + * \sa SDL_SetWindowIcon() + * \sa SDL_SetWindowPosition() + * \sa SDL_SetWindowSize() + * \sa SDL_SetWindowBordered() + * \sa SDL_SetWindowResizable() + * \sa SDL_SetWindowTitle() + * \sa SDL_ShowWindow() + */ +typedef struct SDL_Window SDL_Window; + +/** + * \brief The flags on a window + * + * \sa SDL_GetWindowFlags() + */ +typedef enum +{ + SDL_WINDOW_FULLSCREEN = 0x00000001, /**< fullscreen window */ + SDL_WINDOW_OPENGL = 0x00000002, /**< window usable with OpenGL context */ + SDL_WINDOW_SHOWN = 0x00000004, /**< window is visible */ + SDL_WINDOW_HIDDEN = 0x00000008, /**< window is not visible */ + SDL_WINDOW_BORDERLESS = 0x00000010, /**< no window decoration */ + SDL_WINDOW_RESIZABLE = 0x00000020, /**< window can be resized */ + SDL_WINDOW_MINIMIZED = 0x00000040, /**< window is minimized */ + SDL_WINDOW_MAXIMIZED = 0x00000080, /**< window is maximized */ + SDL_WINDOW_MOUSE_GRABBED = 0x00000100, /**< window has grabbed mouse input */ + SDL_WINDOW_INPUT_FOCUS = 0x00000200, /**< window has input focus */ + SDL_WINDOW_MOUSE_FOCUS = 0x00000400, /**< window has mouse focus */ + SDL_WINDOW_FULLSCREEN_DESKTOP = ( SDL_WINDOW_FULLSCREEN | 0x00001000 ), + SDL_WINDOW_FOREIGN = 0x00000800, /**< window not created by SDL */ + SDL_WINDOW_ALLOW_HIGHDPI = 0x00002000, /**< window should be created in high-DPI mode if supported. + On macOS NSHighResolutionCapable must be set true in the + application's Info.plist for this to have any effect. */ + SDL_WINDOW_MOUSE_CAPTURE = 0x00004000, /**< window has mouse captured (unrelated to MOUSE_GRABBED) */ + SDL_WINDOW_ALWAYS_ON_TOP = 0x00008000, /**< window should always be above others */ + SDL_WINDOW_SKIP_TASKBAR = 0x00010000, /**< window should not be added to the taskbar */ + SDL_WINDOW_UTILITY = 0x00020000, /**< window should be treated as a utility window */ + SDL_WINDOW_TOOLTIP = 0x00040000, /**< window should be treated as a tooltip */ + SDL_WINDOW_POPUP_MENU = 0x00080000, /**< window should be treated as a popup menu */ + SDL_WINDOW_KEYBOARD_GRABBED = 0x00100000, /**< window has grabbed keyboard input */ + SDL_WINDOW_VULKAN = 0x10000000, /**< window usable for Vulkan surface */ + SDL_WINDOW_METAL = 0x20000000, /**< window usable for Metal view */ + + SDL_WINDOW_INPUT_GRABBED = SDL_WINDOW_MOUSE_GRABBED /**< equivalent to SDL_WINDOW_MOUSE_GRABBED for compatibility */ +} SDL_WindowFlags; + +/** + * \brief Used to indicate that you don't care what the window position is. + */ +#define SDL_WINDOWPOS_UNDEFINED_MASK 0x1FFF0000u +#define SDL_WINDOWPOS_UNDEFINED_DISPLAY(X) (SDL_WINDOWPOS_UNDEFINED_MASK|(X)) +#define SDL_WINDOWPOS_UNDEFINED SDL_WINDOWPOS_UNDEFINED_DISPLAY(0) +#define SDL_WINDOWPOS_ISUNDEFINED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_UNDEFINED_MASK) + +/** + * \brief Used to indicate that the window position should be centered. + */ +#define SDL_WINDOWPOS_CENTERED_MASK 0x2FFF0000u +#define SDL_WINDOWPOS_CENTERED_DISPLAY(X) (SDL_WINDOWPOS_CENTERED_MASK|(X)) +#define SDL_WINDOWPOS_CENTERED SDL_WINDOWPOS_CENTERED_DISPLAY(0) +#define SDL_WINDOWPOS_ISCENTERED(X) \ + (((X)&0xFFFF0000) == SDL_WINDOWPOS_CENTERED_MASK) + +/** + * \brief Event subtype for window events + */ +typedef enum +{ + SDL_WINDOWEVENT_NONE, /**< Never used */ + SDL_WINDOWEVENT_SHOWN, /**< Window has been shown */ + SDL_WINDOWEVENT_HIDDEN, /**< Window has been hidden */ + SDL_WINDOWEVENT_EXPOSED, /**< Window has been exposed and should be + redrawn */ + SDL_WINDOWEVENT_MOVED, /**< Window has been moved to data1, data2 + */ + SDL_WINDOWEVENT_RESIZED, /**< Window has been resized to data1xdata2 */ + SDL_WINDOWEVENT_SIZE_CHANGED, /**< The window size has changed, either as + a result of an API call or through the + system or user changing the window size. */ + SDL_WINDOWEVENT_MINIMIZED, /**< Window has been minimized */ + SDL_WINDOWEVENT_MAXIMIZED, /**< Window has been maximized */ + SDL_WINDOWEVENT_RESTORED, /**< Window has been restored to normal size + and position */ + SDL_WINDOWEVENT_ENTER, /**< Window has gained mouse focus */ + SDL_WINDOWEVENT_LEAVE, /**< Window has lost mouse focus */ + SDL_WINDOWEVENT_FOCUS_GAINED, /**< Window has gained keyboard focus */ + SDL_WINDOWEVENT_FOCUS_LOST, /**< Window has lost keyboard focus */ + SDL_WINDOWEVENT_CLOSE, /**< The window manager requests that the window be closed */ + SDL_WINDOWEVENT_TAKE_FOCUS, /**< Window is being offered a focus (should SetWindowInputFocus() on itself or a subwindow, or ignore) */ + SDL_WINDOWEVENT_HIT_TEST, /**< Window had a hit test that wasn't SDL_HITTEST_NORMAL. */ + SDL_WINDOWEVENT_ICCPROF_CHANGED,/**< The ICC profile of the window's display has changed. */ + SDL_WINDOWEVENT_DISPLAY_CHANGED /**< Window has been moved to display data1. */ +} SDL_WindowEventID; + +/** + * \brief Event subtype for display events + */ +typedef enum +{ + SDL_DISPLAYEVENT_NONE, /**< Never used */ + SDL_DISPLAYEVENT_ORIENTATION, /**< Display orientation has changed to data1 */ + SDL_DISPLAYEVENT_CONNECTED, /**< Display has been added to the system */ + SDL_DISPLAYEVENT_DISCONNECTED /**< Display has been removed from the system */ +} SDL_DisplayEventID; + +/** + * \brief Display orientation + */ +typedef enum +{ + SDL_ORIENTATION_UNKNOWN, /**< The display orientation can't be determined */ + SDL_ORIENTATION_LANDSCAPE, /**< The display is in landscape mode, with the right side up, relative to portrait mode */ + SDL_ORIENTATION_LANDSCAPE_FLIPPED, /**< The display is in landscape mode, with the left side up, relative to portrait mode */ + SDL_ORIENTATION_PORTRAIT, /**< The display is in portrait mode */ + SDL_ORIENTATION_PORTRAIT_FLIPPED /**< The display is in portrait mode, upside down */ +} SDL_DisplayOrientation; + +/** + * \brief Window flash operation + */ +typedef enum +{ + SDL_FLASH_CANCEL, /**< Cancel any window flash state */ + SDL_FLASH_BRIEFLY, /**< Flash the window briefly to get attention */ + SDL_FLASH_UNTIL_FOCUSED /**< Flash the window until it gets focus */ +} SDL_FlashOperation; + +/** + * \brief An opaque handle to an OpenGL context. + */ +typedef void *SDL_GLContext; + +/** + * \brief OpenGL configuration attributes + */ +typedef enum +{ + SDL_GL_RED_SIZE, + SDL_GL_GREEN_SIZE, + SDL_GL_BLUE_SIZE, + SDL_GL_ALPHA_SIZE, + SDL_GL_BUFFER_SIZE, + SDL_GL_DOUBLEBUFFER, + SDL_GL_DEPTH_SIZE, + SDL_GL_STENCIL_SIZE, + SDL_GL_ACCUM_RED_SIZE, + SDL_GL_ACCUM_GREEN_SIZE, + SDL_GL_ACCUM_BLUE_SIZE, + SDL_GL_ACCUM_ALPHA_SIZE, + SDL_GL_STEREO, + SDL_GL_MULTISAMPLEBUFFERS, + SDL_GL_MULTISAMPLESAMPLES, + SDL_GL_ACCELERATED_VISUAL, + SDL_GL_RETAINED_BACKING, + SDL_GL_CONTEXT_MAJOR_VERSION, + SDL_GL_CONTEXT_MINOR_VERSION, + SDL_GL_CONTEXT_EGL, + SDL_GL_CONTEXT_FLAGS, + SDL_GL_CONTEXT_PROFILE_MASK, + SDL_GL_SHARE_WITH_CURRENT_CONTEXT, + SDL_GL_FRAMEBUFFER_SRGB_CAPABLE, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR, + SDL_GL_CONTEXT_RESET_NOTIFICATION, + SDL_GL_CONTEXT_NO_ERROR, + SDL_GL_FLOATBUFFERS +} SDL_GLattr; + +typedef enum +{ + SDL_GL_CONTEXT_PROFILE_CORE = 0x0001, + SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = 0x0002, + SDL_GL_CONTEXT_PROFILE_ES = 0x0004 /**< GLX_CONTEXT_ES2_PROFILE_BIT_EXT */ +} SDL_GLprofile; + +typedef enum +{ + SDL_GL_CONTEXT_DEBUG_FLAG = 0x0001, + SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = 0x0002, + SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = 0x0004, + SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = 0x0008 +} SDL_GLcontextFlag; + +typedef enum +{ + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = 0x0000, + SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = 0x0001 +} SDL_GLcontextReleaseFlag; + +typedef enum +{ + SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = 0x0000, + SDL_GL_CONTEXT_RESET_LOSE_CONTEXT = 0x0001 +} SDL_GLContextResetNotification; + +/* Function prototypes */ + +/** + * Get the number of video drivers compiled into SDL. + * + * \returns a number >= 1 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetVideoDriver + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDrivers(void); + +/** + * Get the name of a built in video driver. + * + * The video drivers are presented in the order in which they are normally + * checked during initialization. + * + * \param index the index of a video driver + * \returns the name of the video driver with the given **index**. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + */ +extern DECLSPEC const char *SDLCALL SDL_GetVideoDriver(int index); + +/** + * Initialize the video subsystem, optionally specifying a video driver. + * + * This function initializes the video subsystem, setting up a connection to + * the window manager, etc, and determines the available display modes and + * pixel formats, but does not initialize a window or graphics mode. + * + * If you use this function and you haven't used the SDL_INIT_VIDEO flag with + * either SDL_Init() or SDL_InitSubSystem(), you should call SDL_VideoQuit() + * before calling SDL_Quit(). + * + * It is safe to call this function multiple times. SDL_VideoInit() will call + * SDL_VideoQuit() itself if the video subsystem has already been initialized. + * + * You can use SDL_GetNumVideoDrivers() and SDL_GetVideoDriver() to find a + * specific `driver_name`. + * + * \param driver_name the name of a video driver to initialize, or NULL for + * the default driver + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + * \sa SDL_GetVideoDriver + * \sa SDL_InitSubSystem + * \sa SDL_VideoQuit + */ +extern DECLSPEC int SDLCALL SDL_VideoInit(const char *driver_name); + +/** + * Shut down the video subsystem, if initialized with SDL_VideoInit(). + * + * This function closes all windows, and restores the original video mode. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_VideoInit + */ +extern DECLSPEC void SDLCALL SDL_VideoQuit(void); + +/** + * Get the name of the currently initialized video driver. + * + * \returns the name of the current video driver or NULL if no driver has been + * initialized. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDrivers + * \sa SDL_GetVideoDriver + */ +extern DECLSPEC const char *SDLCALL SDL_GetCurrentVideoDriver(void); + +/** + * Get the number of available video displays. + * + * \returns a number >= 1 or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayBounds + */ +extern DECLSPEC int SDLCALL SDL_GetNumVideoDisplays(void); + +/** + * Get the name of a display in UTF-8 encoding. + * + * \param displayIndex the index of display from which the name should be + * queried + * \returns the name of a display or NULL for an invalid display index or + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC const char * SDLCALL SDL_GetDisplayName(int displayIndex); + +/** + * Get the desktop area represented by a display. + * + * The primary display (`displayIndex` zero) is always located at 0,0. + * + * \param displayIndex the index of the display to query + * \param rect the SDL_Rect structure filled in with the display bounds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayBounds(int displayIndex, SDL_Rect * rect); + +/** + * Get the usable desktop area represented by a display. + * + * The primary display (`displayIndex` zero) is always located at 0,0. + * + * This is the same area as SDL_GetDisplayBounds() reports, but with portions + * reserved by the system removed. For example, on Apple's macOS, this + * subtracts the area occupied by the menu bar and dock. + * + * Setting a window to be fullscreen generally bypasses these unusable areas, + * so these are good guidelines for the maximum space available to a + * non-fullscreen window. + * + * The parameter `rect` is ignored if it is NULL. + * + * This function also returns -1 if the parameter `displayIndex` is out of + * range. + * + * \param displayIndex the index of the display to query the usable bounds + * from + * \param rect the SDL_Rect structure filled in with the display bounds + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayUsableBounds(int displayIndex, SDL_Rect * rect); + +/** + * Get the dots/pixels-per-inch for a display. + * + * Diagonal, horizontal and vertical DPI can all be optionally returned if the + * appropriate parameter is non-NULL. + * + * A failure of this function usually means that either no DPI information is + * available or the `displayIndex` is out of range. + * + * **WARNING**: This reports the DPI that the hardware reports, and it is not + * always reliable! It is almost always better to use SDL_GetWindowSize() to + * find the window size, which might be in logical points instead of pixels, + * and then SDL_GL_GetDrawableSize(), SDL_Vulkan_GetDrawableSize(), + * SDL_Metal_GetDrawableSize(), or SDL_GetRendererOutputSize(), and compare + * the two values to get an actual scaling value between the two. We will be + * rethinking how high-dpi details should be managed in SDL3 to make things + * more consistent, reliable, and clear. + * + * \param displayIndex the index of the display from which DPI information + * should be queried + * \param ddpi a pointer filled in with the diagonal DPI of the display; may + * be NULL + * \param hdpi a pointer filled in with the horizontal DPI of the display; may + * be NULL + * \param vdpi a pointer filled in with the vertical DPI of the display; may + * be NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayDPI(int displayIndex, float * ddpi, float * hdpi, float * vdpi); + +/** + * Get the orientation of a display. + * + * \param displayIndex the index of the display to query + * \returns The SDL_DisplayOrientation enum value of the display, or + * `SDL_ORIENTATION_UNKNOWN` if it isn't available. + * + * \since This function is available since SDL 2.0.9. + * + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC SDL_DisplayOrientation SDLCALL SDL_GetDisplayOrientation(int displayIndex); + +/** + * Get the number of available display modes. + * + * The `displayIndex` needs to be in the range from 0 to + * SDL_GetNumVideoDisplays() - 1. + * + * \param displayIndex the index of the display to query + * \returns a number >= 1 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetNumDisplayModes(int displayIndex); + +/** + * Get information about a specific display mode. + * + * The display modes are sorted in this priority: + * + * - width -> largest to smallest + * - height -> largest to smallest + * - bits per pixel -> more colors to fewer colors + * - packed pixel layout -> largest to smallest + * - refresh rate -> highest to lowest + * + * \param displayIndex the index of the display to query + * \param modeIndex the index of the display mode to query + * \param mode an SDL_DisplayMode structure filled in with the mode at + * `modeIndex` + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetNumDisplayModes + */ +extern DECLSPEC int SDLCALL SDL_GetDisplayMode(int displayIndex, int modeIndex, + SDL_DisplayMode * mode); + +/** + * Get information about the desktop's display mode. + * + * There's a difference between this function and SDL_GetCurrentDisplayMode() + * when SDL runs fullscreen and has changed the resolution. In that case this + * function will return the previous native display mode, and not the current + * display mode. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure filled in with the current display + * mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetCurrentDisplayMode + * \sa SDL_GetDisplayMode + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_GetDesktopDisplayMode(int displayIndex, SDL_DisplayMode * mode); + +/** + * Get information about the current display mode. + * + * There's a difference between this function and SDL_GetDesktopDisplayMode() + * when SDL runs fullscreen and has changed the resolution. In that case this + * function will return the current display mode, and not the previous native + * display mode. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure filled in with the current display + * mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDesktopDisplayMode + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumVideoDisplays + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_GetCurrentDisplayMode(int displayIndex, SDL_DisplayMode * mode); + + +/** + * Get the closest match to the requested display mode. + * + * The available display modes are scanned and `closest` is filled in with the + * closest mode matching the requested mode and returned. The mode format and + * refresh rate default to the desktop mode if they are set to 0. The modes + * are scanned with size being first priority, format being second priority, + * and finally checking the refresh rate. If all the available modes are too + * small, then NULL is returned. + * + * \param displayIndex the index of the display to query + * \param mode an SDL_DisplayMode structure containing the desired display + * mode + * \param closest an SDL_DisplayMode structure filled in with the closest + * match of the available display modes + * \returns the passed in value `closest` or NULL if no matching video mode + * was available; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayMode + * \sa SDL_GetNumDisplayModes + */ +extern DECLSPEC SDL_DisplayMode * SDLCALL SDL_GetClosestDisplayMode(int displayIndex, const SDL_DisplayMode * mode, SDL_DisplayMode * closest); + +/** + * Get the index of the display containing a point + * + * \param point the point to query + * \returns the index of the display containing the point or a negative error + * code on failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetPointDisplayIndex(const SDL_Point * point); + +/** + * Get the index of the display primarily containing a rect + * + * \param rect the rect to query + * \returns the index of the display entirely containing the rect or closest + * to the center of the rect on success or a negative error code on + * failure; call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.24.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetRectDisplayIndex(const SDL_Rect * rect); + +/** + * Get the index of the display associated with a window. + * + * \param window the window to query + * \returns the index of the display containing the center of the window on + * success or a negative error code on failure; call SDL_GetError() + * for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetDisplayBounds + * \sa SDL_GetNumVideoDisplays + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayIndex(SDL_Window * window); + +/** + * Set the display mode to use when a window is visible at fullscreen. + * + * This only affects the display mode used when the window is fullscreen. To + * change the window size when the window is not fullscreen, use + * SDL_SetWindowSize(). + * + * \param window the window to affect + * \param mode the SDL_DisplayMode structure representing the mode to use, or + * NULL to use the window's dimensions and the desktop's format + * and refresh rate + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowDisplayMode + * \sa SDL_SetWindowFullscreen + */ +extern DECLSPEC int SDLCALL SDL_SetWindowDisplayMode(SDL_Window * window, + const SDL_DisplayMode * mode); + +/** + * Query the display mode to use when a window is visible at fullscreen. + * + * \param window the window to query + * \param mode an SDL_DisplayMode structure filled in with the fullscreen + * display mode + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowDisplayMode + * \sa SDL_SetWindowFullscreen + */ +extern DECLSPEC int SDLCALL SDL_GetWindowDisplayMode(SDL_Window * window, + SDL_DisplayMode * mode); + +/** + * Get the raw ICC profile data for the screen the window is currently on. + * + * Data returned should be freed with SDL_free. + * + * \param window the window to query + * \param size the size of the ICC profile + * \returns the raw ICC profile data on success or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + */ +extern DECLSPEC void* SDLCALL SDL_GetWindowICCProfile(SDL_Window * window, size_t* size); + +/** + * Get the pixel format associated with the window. + * + * \param window the window to query + * \returns the pixel format of the window on success or + * SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more + * information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowPixelFormat(SDL_Window * window); + +/** + * Create a window with the specified position, dimensions, and flags. + * + * `flags` may be any of the following OR'd together: + * + * - `SDL_WINDOW_FULLSCREEN`: fullscreen window + * - `SDL_WINDOW_FULLSCREEN_DESKTOP`: fullscreen window at desktop resolution + * - `SDL_WINDOW_OPENGL`: window usable with an OpenGL context + * - `SDL_WINDOW_VULKAN`: window usable with a Vulkan instance + * - `SDL_WINDOW_METAL`: window usable with a Metal instance + * - `SDL_WINDOW_HIDDEN`: window is not visible + * - `SDL_WINDOW_BORDERLESS`: no window decoration + * - `SDL_WINDOW_RESIZABLE`: window can be resized + * - `SDL_WINDOW_MINIMIZED`: window is minimized + * - `SDL_WINDOW_MAXIMIZED`: window is maximized + * - `SDL_WINDOW_INPUT_GRABBED`: window has grabbed input focus + * - `SDL_WINDOW_ALLOW_HIGHDPI`: window should be created in high-DPI mode if + * supported (>= SDL 2.0.1) + * + * `SDL_WINDOW_SHOWN` is ignored by SDL_CreateWindow(). The SDL_Window is + * implicitly shown if SDL_WINDOW_HIDDEN is not set. `SDL_WINDOW_SHOWN` may be + * queried later using SDL_GetWindowFlags(). + * + * On Apple's macOS, you **must** set the NSHighResolutionCapable Info.plist + * property to YES, otherwise you will not receive a High-DPI OpenGL canvas. + * + * If the window is created with the `SDL_WINDOW_ALLOW_HIGHDPI` flag, its size + * in pixels may differ from its size in screen coordinates on platforms with + * high-DPI support (e.g. iOS and macOS). Use SDL_GetWindowSize() to query the + * client area's size in screen coordinates, and SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to query the drawable size in pixels. Note that + * when this flag is set, the drawable size can vary after the window is + * created and should be queried after major window events such as when the + * window is resized or moved between displays. + * + * If the window is set fullscreen, the width and height parameters `w` and + * `h` will not be used. However, invalid size parameters (e.g. too large) may + * still fail. Window size is actually limited to 16384 x 16384 for all + * platforms at window creation. + * + * If the window is created with any of the SDL_WINDOW_OPENGL or + * SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function + * (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the + * corresponding UnloadLibrary function is called by SDL_DestroyWindow(). + * + * If SDL_WINDOW_VULKAN is specified and there isn't a working Vulkan driver, + * SDL_CreateWindow() will fail because SDL_Vulkan_LoadLibrary() will fail. + * + * If SDL_WINDOW_METAL is specified on an OS that does not support Metal, + * SDL_CreateWindow() will fail. + * + * On non-Apple devices, SDL requires you to either not link to the Vulkan + * loader or link to a dynamic library version. This limitation may be removed + * in a future version of SDL. + * + * \param title the title of the window, in UTF-8 encoding + * \param x the x position of the window, `SDL_WINDOWPOS_CENTERED`, or + * `SDL_WINDOWPOS_UNDEFINED` + * \param y the y position of the window, `SDL_WINDOWPOS_CENTERED`, or + * `SDL_WINDOWPOS_UNDEFINED` + * \param w the width of the window, in screen coordinates + * \param h the height of the window, in screen coordinates + * \param flags 0, or one or more SDL_WindowFlags OR'd together + * \returns the window that was created or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindowFrom + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, + int x, int y, int w, + int h, Uint32 flags); + +/** + * Create an SDL window from an existing native window. + * + * In some cases (e.g. OpenGL) and on some platforms (e.g. Microsoft Windows) + * the hint `SDL_HINT_VIDEO_WINDOW_SHARE_PIXEL_FORMAT` needs to be configured + * before using SDL_CreateWindowFrom(). + * + * \param data a pointer to driver-dependent window creation data, typically + * your native window cast to a void* + * \returns the window that was created or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_DestroyWindow + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindowFrom(const void *data); + +/** + * Get the numeric ID of a window. + * + * The numeric ID is what SDL_WindowEvent references, and is necessary to map + * these events to specific SDL_Window objects. + * + * \param window the window to query + * \returns the ID of the window on success or 0 on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowFromID + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowID(SDL_Window * window); + +/** + * Get a window from a stored ID. + * + * The numeric ID is what SDL_WindowEvent references, and is necessary to map + * these events to specific SDL_Window objects. + * + * \param id the ID of the window + * \returns the window associated with `id` or NULL if it doesn't exist; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowID + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetWindowFromID(Uint32 id); + +/** + * Get the window flags. + * + * \param window the window to query + * \returns a mask of the SDL_WindowFlags associated with `window` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_HideWindow + * \sa SDL_MaximizeWindow + * \sa SDL_MinimizeWindow + * \sa SDL_SetWindowFullscreen + * \sa SDL_SetWindowGrab + * \sa SDL_ShowWindow + */ +extern DECLSPEC Uint32 SDLCALL SDL_GetWindowFlags(SDL_Window * window); + +/** + * Set the title of a window. + * + * This string is expected to be in UTF-8 encoding. + * + * \param window the window to change + * \param title the desired window title in UTF-8 format + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowTitle + */ +extern DECLSPEC void SDLCALL SDL_SetWindowTitle(SDL_Window * window, + const char *title); + +/** + * Get the title of a window. + * + * \param window the window to query + * \returns the title of the window in UTF-8 format or "" if there is no + * title. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowTitle + */ +extern DECLSPEC const char *SDLCALL SDL_GetWindowTitle(SDL_Window * window); + +/** + * Set the icon for a window. + * + * \param window the window to change + * \param icon an SDL_Surface structure containing the icon for the window + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowIcon(SDL_Window * window, + SDL_Surface * icon); + +/** + * Associate an arbitrary named pointer with a window. + * + * `name` is case-sensitive. + * + * \param window the window to associate with the pointer + * \param name the name of the pointer + * \param userdata the associated pointer + * \returns the previous value associated with `name`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowData + */ +extern DECLSPEC void* SDLCALL SDL_SetWindowData(SDL_Window * window, + const char *name, + void *userdata); + +/** + * Retrieve the data pointer associated with a window. + * + * \param window the window to query + * \param name the name of the pointer + * \returns the value associated with `name`. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowData + */ +extern DECLSPEC void *SDLCALL SDL_GetWindowData(SDL_Window * window, + const char *name); + +/** + * Set the position of a window. + * + * The window coordinate origin is the upper left of the display. + * + * \param window the window to reposition + * \param x the x coordinate of the window in screen coordinates, or + * `SDL_WINDOWPOS_CENTERED` or `SDL_WINDOWPOS_UNDEFINED` + * \param y the y coordinate of the window in screen coordinates, or + * `SDL_WINDOWPOS_CENTERED` or `SDL_WINDOWPOS_UNDEFINED` + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowPosition + */ +extern DECLSPEC void SDLCALL SDL_SetWindowPosition(SDL_Window * window, + int x, int y); + +/** + * Get the position of a window. + * + * If you do not need the value for one of the positions a NULL may be passed + * in the `x` or `y` parameter. + * + * \param window the window to query + * \param x a pointer filled in with the x position of the window, in screen + * coordinates, may be NULL + * \param y a pointer filled in with the y position of the window, in screen + * coordinates, may be NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowPosition + */ +extern DECLSPEC void SDLCALL SDL_GetWindowPosition(SDL_Window * window, + int *x, int *y); + +/** + * Set the size of a window's client area. + * + * The window size in screen coordinates may differ from the size in pixels, + * if the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a platform + * with high-dpi support (e.g. iOS or macOS). Use SDL_GL_GetDrawableSize() or + * SDL_GetRendererOutputSize() to get the real client area size in pixels. + * + * Fullscreen windows automatically match the size of the display mode, and + * you should use SDL_SetWindowDisplayMode() to change their size. + * + * \param window the window to change + * \param w the width of the window in pixels, in screen coordinates, must be + * > 0 + * \param h the height of the window in pixels, in screen coordinates, must be + * > 0 + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSize + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC void SDLCALL SDL_SetWindowSize(SDL_Window * window, int w, + int h); + +/** + * Get the size of a window's client area. + * + * NULL can safely be passed as the `w` or `h` parameter if the width or + * height value is not desired. + * + * The window size in screen coordinates may differ from the size in pixels, + * if the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a platform + * with high-dpi support (e.g. iOS or macOS). Use SDL_GL_GetDrawableSize(), + * SDL_Vulkan_GetDrawableSize(), or SDL_GetRendererOutputSize() to get the + * real client area size in pixels. + * + * \param window the window to query the width and height from + * \param w a pointer filled in with the width of the window, in screen + * coordinates, may be NULL + * \param h a pointer filled in with the height of the window, in screen + * coordinates, may be NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetDrawableSize + * \sa SDL_Vulkan_GetDrawableSize + * \sa SDL_SetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSize(SDL_Window * window, int *w, + int *h); + +/** + * Get the size of a window's borders (decorations) around the client area. + * + * Note: If this function fails (returns -1), the size values will be + * initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the + * window in question was borderless. + * + * Note: This function may fail on systems where the window has not yet been + * decorated by the display server (for example, immediately after calling + * SDL_CreateWindow). It is recommended that you wait at least until the + * window has been presented and composited, so that the window system has a + * chance to decorate the window and provide the border dimensions to SDL. + * + * This function also returns -1 if getting the information is not supported. + * + * \param window the window to query the size values of the border + * (decorations) from + * \param top pointer to variable for storing the size of the top border; NULL + * is permitted + * \param left pointer to variable for storing the size of the left border; + * NULL is permitted + * \param bottom pointer to variable for storing the size of the bottom + * border; NULL is permitted + * \param right pointer to variable for storing the size of the right border; + * NULL is permitted + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowSize + */ +extern DECLSPEC int SDLCALL SDL_GetWindowBordersSize(SDL_Window * window, + int *top, int *left, + int *bottom, int *right); + +/** + * Get the size of a window in pixels. + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window the window from which the drawable size should be queried + * \param w a pointer to variable for storing the width in pixels, may be NULL + * \param h a pointer to variable for storing the height in pixels, may be + * NULL + * + * \since This function is available since SDL 2.26.0. + * + * \sa SDL_CreateWindow + * \sa SDL_GetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowSizeInPixels(SDL_Window * window, + int *w, int *h); + +/** + * Set the minimum size of a window's client area. + * + * \param window the window to change + * \param min_w the minimum width of the window in pixels + * \param min_h the minimum height of the window in pixels + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMinimumSize + * \sa SDL_SetWindowMaximumSize + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMinimumSize(SDL_Window * window, + int min_w, int min_h); + +/** + * Get the minimum size of a window's client area. + * + * \param window the window to query + * \param w a pointer filled in with the minimum width of the window, may be + * NULL + * \param h a pointer filled in with the minimum height of the window, may be + * NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMaximumSize + * \sa SDL_SetWindowMinimumSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMinimumSize(SDL_Window * window, + int *w, int *h); + +/** + * Set the maximum size of a window's client area. + * + * \param window the window to change + * \param max_w the maximum width of the window in pixels + * \param max_h the maximum height of the window in pixels + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMaximumSize + * \sa SDL_SetWindowMinimumSize + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMaximumSize(SDL_Window * window, + int max_w, int max_h); + +/** + * Get the maximum size of a window's client area. + * + * \param window the window to query + * \param w a pointer filled in with the maximum width of the window, may be + * NULL + * \param h a pointer filled in with the maximum height of the window, may be + * NULL + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowMinimumSize + * \sa SDL_SetWindowMaximumSize + */ +extern DECLSPEC void SDLCALL SDL_GetWindowMaximumSize(SDL_Window * window, + int *w, int *h); + +/** + * Set the border state of a window. + * + * This will add or remove the window's `SDL_WINDOW_BORDERLESS` flag and add + * or remove the border from the actual window. This is a no-op if the + * window's border already matches the requested state. + * + * You can't change the border state of a fullscreen window. + * + * \param window the window of which to change the border state + * \param bordered SDL_FALSE to remove border, SDL_TRUE to add border + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowBordered(SDL_Window * window, + SDL_bool bordered); + +/** + * Set the user-resizable state of a window. + * + * This will add or remove the window's `SDL_WINDOW_RESIZABLE` flag and + * allow/disallow user resizing of the window. This is a no-op if the window's + * resizable state already matches the requested state. + * + * You can't change the resizable state of a fullscreen window. + * + * \param window the window of which to change the resizable state + * \param resizable SDL_TRUE to allow resizing, SDL_FALSE to disallow + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowResizable(SDL_Window * window, + SDL_bool resizable); + +/** + * Set the window to always be above the others. + * + * This will add or remove the window's `SDL_WINDOW_ALWAYS_ON_TOP` flag. This + * will bring the window to the front and keep the window above the rest. + * + * \param window The window of which to change the always on top state + * \param on_top SDL_TRUE to set the window always on top, SDL_FALSE to + * disable + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowFlags + */ +extern DECLSPEC void SDLCALL SDL_SetWindowAlwaysOnTop(SDL_Window * window, + SDL_bool on_top); + +/** + * Show a window. + * + * \param window the window to show + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_HideWindow + * \sa SDL_RaiseWindow + */ +extern DECLSPEC void SDLCALL SDL_ShowWindow(SDL_Window * window); + +/** + * Hide a window. + * + * \param window the window to hide + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_ShowWindow + */ +extern DECLSPEC void SDLCALL SDL_HideWindow(SDL_Window * window); + +/** + * Raise a window above other windows and set the input focus. + * + * \param window the window to raise + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_RaiseWindow(SDL_Window * window); + +/** + * Make a window as large as possible. + * + * \param window the window to maximize + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MinimizeWindow + * \sa SDL_RestoreWindow + */ +extern DECLSPEC void SDLCALL SDL_MaximizeWindow(SDL_Window * window); + +/** + * Minimize a window to an iconic representation. + * + * \param window the window to minimize + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MaximizeWindow + * \sa SDL_RestoreWindow + */ +extern DECLSPEC void SDLCALL SDL_MinimizeWindow(SDL_Window * window); + +/** + * Restore the size and position of a minimized or maximized window. + * + * \param window the window to restore + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_MaximizeWindow + * \sa SDL_MinimizeWindow + */ +extern DECLSPEC void SDLCALL SDL_RestoreWindow(SDL_Window * window); + +/** + * Set a window's fullscreen state. + * + * `flags` may be `SDL_WINDOW_FULLSCREEN`, for "real" fullscreen with a + * videomode change; `SDL_WINDOW_FULLSCREEN_DESKTOP` for "fake" fullscreen + * that takes the size of the desktop; and 0 for windowed mode. + * + * \param window the window to change + * \param flags `SDL_WINDOW_FULLSCREEN`, `SDL_WINDOW_FULLSCREEN_DESKTOP` or 0 + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowDisplayMode + * \sa SDL_SetWindowDisplayMode + */ +extern DECLSPEC int SDLCALL SDL_SetWindowFullscreen(SDL_Window * window, + Uint32 flags); + +/** + * Get the SDL surface associated with the window. + * + * A new surface will be created with the optimal format for the window, if + * necessary. This surface will be freed when the window is destroyed. Do not + * free this surface. + * + * This surface will be invalidated if the window is resized. After resizing a + * window this function must be called again to return a valid surface. + * + * You may not combine this with 3D or the rendering API on this window. + * + * This function is affected by `SDL_HINT_FRAMEBUFFER_ACCELERATION`. + * + * \param window the window to query + * \returns the surface associated with the window, or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_UpdateWindowSurface + * \sa SDL_UpdateWindowSurfaceRects + */ +extern DECLSPEC SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window); + +/** + * Copy the window surface to the screen. + * + * This is the function you use to reflect any changes to the surface on the + * screen. + * + * This function is equivalent to the SDL 1.2 API SDL_Flip(). + * + * \param window the window to update + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSurface + * \sa SDL_UpdateWindowSurfaceRects + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window); + +/** + * Copy areas of the window surface to the screen. + * + * This is the function you use to reflect changes to portions of the surface + * on the screen. + * + * This function is equivalent to the SDL 1.2 API SDL_UpdateRects(). + * + * \param window the window to update + * \param rects an array of SDL_Rect structures representing areas of the + * surface to copy + * \param numrects the number of rectangles + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowSurface + * \sa SDL_UpdateWindowSurface + */ +extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, + const SDL_Rect * rects, + int numrects); + +/** + * Set a window's input grab mode. + * + * When input is grabbed, the mouse is confined to the window. This function + * will also grab the keyboard if `SDL_HINT_GRAB_KEYBOARD` is set. To grab the + * keyboard without also grabbing the mouse, use SDL_SetWindowKeyboardGrab(). + * + * If the caller enables a grab while another window is currently grabbed, the + * other window loses its grab in favor of the caller's window. + * + * \param window the window for which the input grab mode should be set + * \param grabbed SDL_TRUE to grab input or SDL_FALSE to release input + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetGrabbedWindow + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Set a window's keyboard grab mode. + * + * Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or + * the Meta/Super key. Note that not all system keyboard shortcuts can be + * captured by applications (one example is Ctrl+Alt+Del on Windows). + * + * This is primarily intended for specialized applications such as VNC clients + * or VM frontends. Normal games should not use keyboard grab. + * + * When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the + * window is full-screen to ensure the user is not trapped in your + * application. If you have a custom keyboard shortcut to exit fullscreen + * mode, you may suppress this behavior with + * `SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED`. + * + * If the caller enables a grab while another window is currently grabbed, the + * other window loses its grab in favor of the caller's window. + * + * \param window The window for which the keyboard grab mode should be set. + * \param grabbed This is SDL_TRUE to grab keyboard, and SDL_FALSE to release. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowKeyboardGrab + * \sa SDL_SetWindowMouseGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowKeyboardGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Set a window's mouse grab mode. + * + * Mouse grab confines the mouse cursor to the window. + * + * \param window The window for which the mouse grab mode should be set. + * \param grabbed This is SDL_TRUE to grab mouse, and SDL_FALSE to release. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_GetWindowMouseGrab + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC void SDLCALL SDL_SetWindowMouseGrab(SDL_Window * window, + SDL_bool grabbed); + +/** + * Get a window's input grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if input is grabbed, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowGrab(SDL_Window * window); + +/** + * Get a window's keyboard grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if keyboard is grabbed, and SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowKeyboardGrab(SDL_Window * window); + +/** + * Get a window's mouse grab mode. + * + * \param window the window to query + * \returns SDL_TRUE if mouse is grabbed, and SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.16. + * + * \sa SDL_SetWindowKeyboardGrab + * \sa SDL_GetWindowGrab + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GetWindowMouseGrab(SDL_Window * window); + +/** + * Get the window that currently has an input grab enabled. + * + * \returns the window if input is grabbed or NULL otherwise. + * + * \since This function is available since SDL 2.0.4. + * + * \sa SDL_GetWindowGrab + * \sa SDL_SetWindowGrab + */ +extern DECLSPEC SDL_Window * SDLCALL SDL_GetGrabbedWindow(void); + +/** + * Confines the cursor to the specified area of a window. + * + * Note that this does NOT grab the cursor, it only defines the area a cursor + * is restricted to when the window has mouse focus. + * + * \param window The window that will be associated with the barrier. + * \param rect A rectangle area in window-relative coordinates. If NULL the + * barrier for the specified window will be destroyed. + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_GetWindowMouseRect + * \sa SDL_SetWindowMouseGrab + */ +extern DECLSPEC int SDLCALL SDL_SetWindowMouseRect(SDL_Window * window, const SDL_Rect * rect); + +/** + * Get the mouse confinement rectangle of a window. + * + * \param window The window to query + * \returns A pointer to the mouse confinement rectangle of a window, or NULL + * if there isn't one. + * + * \since This function is available since SDL 2.0.18. + * + * \sa SDL_SetWindowMouseRect + */ +extern DECLSPEC const SDL_Rect * SDLCALL SDL_GetWindowMouseRect(SDL_Window * window); + +/** + * Set the brightness (gamma multiplier) for a given window's display. + * + * Despite the name and signature, this method sets the brightness of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) The + * brightness set will not follow the window if it is moved to another + * display. + * + * Many platforms will refuse to set the display brightness in modern times. + * You are better off using a shader to adjust gamma during rendering, or + * something similar. + * + * \param window the window used to select the display whose brightness will + * be changed + * \param brightness the brightness (gamma multiplier) value to set where 0.0 + * is completely dark and 1.0 is normal brightness + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowBrightness + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_SetWindowBrightness(SDL_Window * window, float brightness); + +/** + * Get the brightness (gamma multiplier) for a given window's display. + * + * Despite the name and signature, this method retrieves the brightness of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) + * + * \param window the window used to select the display whose brightness will + * be queried + * \returns the brightness for the display where 0.0 is completely dark and + * 1.0 is normal brightness. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowBrightness + */ +extern DECLSPEC float SDLCALL SDL_GetWindowBrightness(SDL_Window * window); + +/** + * Set the opacity for a window. + * + * The parameter `opacity` will be clamped internally between 0.0f + * (transparent) and 1.0f (opaque). + * + * This function also returns -1 if setting the opacity isn't supported. + * + * \param window the window which will be made transparent or opaque + * \param opacity the opacity value (0.0f - transparent, 1.0f - opaque) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_GetWindowOpacity + */ +extern DECLSPEC int SDLCALL SDL_SetWindowOpacity(SDL_Window * window, float opacity); + +/** + * Get the opacity of a window. + * + * If transparency isn't supported on this platform, opacity will be reported + * as 1.0f without error. + * + * The parameter `opacity` is ignored if it is NULL. + * + * This function also returns -1 if an invalid window was provided. + * + * \param window the window to get the current opacity value from + * \param out_opacity the float filled in (0.0f - transparent, 1.0f - opaque) + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_SetWindowOpacity + */ +extern DECLSPEC int SDLCALL SDL_GetWindowOpacity(SDL_Window * window, float * out_opacity); + +/** + * Set the window as a modal for another window. + * + * \param modal_window the window that should be set modal + * \param parent_window the parent window for the modal window + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowModalFor(SDL_Window * modal_window, SDL_Window * parent_window); + +/** + * Explicitly set input focus to the window. + * + * You almost certainly want SDL_RaiseWindow() instead of this function. Use + * this with caution, as you might give focus to a window that is completely + * obscured by other windows. + * + * \param window the window that should get the input focus + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.5. + * + * \sa SDL_RaiseWindow + */ +extern DECLSPEC int SDLCALL SDL_SetWindowInputFocus(SDL_Window * window); + +/** + * Set the gamma ramp for the display that owns a given window. + * + * Set the gamma translation table for the red, green, and blue channels of + * the video hardware. Each table is an array of 256 16-bit quantities, + * representing a mapping between the input and output for that channel. The + * input is the index into the array, and the output is the 16-bit gamma value + * at that index, scaled to the output color precision. + * + * Despite the name and signature, this method sets the gamma ramp of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) The gamma + * ramp set will not follow the window if it is moved to another display. + * + * \param window the window used to select the display whose gamma ramp will + * be changed + * \param red a 256 element array of 16-bit quantities representing the + * translation table for the red channel, or NULL + * \param green a 256 element array of 16-bit quantities representing the + * translation table for the green channel, or NULL + * \param blue a 256 element array of 16-bit quantities representing the + * translation table for the blue channel, or NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_SetWindowGammaRamp(SDL_Window * window, + const Uint16 * red, + const Uint16 * green, + const Uint16 * blue); + +/** + * Get the gamma ramp for a given window's display. + * + * Despite the name and signature, this method retrieves the gamma ramp of the + * entire display, not an individual window. A window is considered to be + * owned by the display that contains the window's center pixel. (The index of + * this display can be retrieved using SDL_GetWindowDisplayIndex().) + * + * \param window the window used to select the display whose gamma ramp will + * be queried + * \param red a 256 element array of 16-bit quantities filled in with the + * translation table for the red channel, or NULL + * \param green a 256 element array of 16-bit quantities filled in with the + * translation table for the green channel, or NULL + * \param blue a 256 element array of 16-bit quantities filled in with the + * translation table for the blue channel, or NULL + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_SetWindowGammaRamp + */ +extern DECLSPEC int SDLCALL SDL_GetWindowGammaRamp(SDL_Window * window, + Uint16 * red, + Uint16 * green, + Uint16 * blue); + +/** + * Possible return values from the SDL_HitTest callback. + * + * \sa SDL_HitTest + */ +typedef enum +{ + SDL_HITTEST_NORMAL, /**< Region is normal. No special properties. */ + SDL_HITTEST_DRAGGABLE, /**< Region can drag entire window. */ + SDL_HITTEST_RESIZE_TOPLEFT, + SDL_HITTEST_RESIZE_TOP, + SDL_HITTEST_RESIZE_TOPRIGHT, + SDL_HITTEST_RESIZE_RIGHT, + SDL_HITTEST_RESIZE_BOTTOMRIGHT, + SDL_HITTEST_RESIZE_BOTTOM, + SDL_HITTEST_RESIZE_BOTTOMLEFT, + SDL_HITTEST_RESIZE_LEFT +} SDL_HitTestResult; + +/** + * Callback used for hit-testing. + * + * \param win the SDL_Window where hit-testing was set on + * \param area an SDL_Point which should be hit-tested + * \param data what was passed as `callback_data` to SDL_SetWindowHitTest() + * \return an SDL_HitTestResult value. + * + * \sa SDL_SetWindowHitTest + */ +typedef SDL_HitTestResult (SDLCALL *SDL_HitTest)(SDL_Window *win, + const SDL_Point *area, + void *data); + +/** + * Provide a callback that decides if a window region has special properties. + * + * Normally windows are dragged and resized by decorations provided by the + * system window manager (a title bar, borders, etc), but for some apps, it + * makes sense to drag them from somewhere else inside the window itself; for + * example, one might have a borderless window that wants to be draggable from + * any part, or simulate its own title bar, etc. + * + * This function lets the app provide a callback that designates pieces of a + * given window as special. This callback is run during event processing if we + * need to tell the OS to treat a region of the window specially; the use of + * this callback is known as "hit testing." + * + * Mouse input may not be delivered to your application if it is within a + * special area; the OS will often apply that input to moving the window or + * resizing the window and not deliver it to the application. + * + * Specifying NULL for a callback disables hit-testing. Hit-testing is + * disabled by default. + * + * Platforms that don't support this functionality will return -1 + * unconditionally, even if you're attempting to disable hit-testing. + * + * Your callback may fire at any time, and its firing does not indicate any + * specific behavior (for example, on Windows, this certainly might fire when + * the OS is deciding whether to drag your window, but it fires for lots of + * other reasons, too, some unrelated to anything you probably care about _and + * when the mouse isn't actually at the location it is testing_). Since this + * can fire at any time, you should try to keep your callback efficient, + * devoid of allocations, etc. + * + * \param window the window to set hit-testing on + * \param callback the function to call when doing a hit-test + * \param callback_data an app-defined void pointer passed to **callback** + * \returns 0 on success or -1 on error (including unsupported); call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.4. + */ +extern DECLSPEC int SDLCALL SDL_SetWindowHitTest(SDL_Window * window, + SDL_HitTest callback, + void *callback_data); + +/** + * Request a window to demand attention from the user. + * + * \param window the window to be flashed + * \param operation the flash operation + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.16. + */ +extern DECLSPEC int SDLCALL SDL_FlashWindow(SDL_Window * window, SDL_FlashOperation operation); + +/** + * Destroy a window. + * + * If `window` is NULL, this function will return immediately after setting + * the SDL error message to "Invalid window". See SDL_GetError(). + * + * \param window the window to destroy + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_CreateWindow + * \sa SDL_CreateWindowFrom + */ +extern DECLSPEC void SDLCALL SDL_DestroyWindow(SDL_Window * window); + + +/** + * Check whether the screensaver is currently enabled. + * + * The screensaver is disabled by default since SDL 2.0.2. Before SDL 2.0.2 + * the screensaver was enabled by default. + * + * The default can also be changed using `SDL_HINT_VIDEO_ALLOW_SCREENSAVER`. + * + * \returns SDL_TRUE if the screensaver is enabled, SDL_FALSE if it is + * disabled. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DisableScreenSaver + * \sa SDL_EnableScreenSaver + */ +extern DECLSPEC SDL_bool SDLCALL SDL_IsScreenSaverEnabled(void); + +/** + * Allow the screen to be blanked by a screen saver. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_DisableScreenSaver + * \sa SDL_IsScreenSaverEnabled + */ +extern DECLSPEC void SDLCALL SDL_EnableScreenSaver(void); + +/** + * Prevent the screen from being blanked by a screen saver. + * + * If you disable the screensaver, it is automatically re-enabled when SDL + * quits. + * + * The screensaver is disabled by default since SDL 2.0.2. Before SDL 2.0.2 + * the screensaver was enabled by default. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_EnableScreenSaver + * \sa SDL_IsScreenSaverEnabled + */ +extern DECLSPEC void SDLCALL SDL_DisableScreenSaver(void); + + +/** + * \name OpenGL support functions + */ +/* @{ */ + +/** + * Dynamically load an OpenGL library. + * + * This should be done after initializing the video driver, but before + * creating any OpenGL windows. If no OpenGL library is loaded, the default + * library will be loaded upon creation of the first OpenGL window. + * + * If you do this, you need to retrieve all of the GL functions used in your + * program from the dynamic library using SDL_GL_GetProcAddress(). + * + * \param path the platform dependent OpenGL library name, or NULL to open the + * default OpenGL library + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetProcAddress + * \sa SDL_GL_UnloadLibrary + */ +extern DECLSPEC int SDLCALL SDL_GL_LoadLibrary(const char *path); + +/** + * Get an OpenGL function by name. + * + * If the GL library is loaded at runtime with SDL_GL_LoadLibrary(), then all + * GL functions must be retrieved this way. Usually this is used to retrieve + * function pointers to OpenGL extensions. + * + * There are some quirks to looking up OpenGL functions that require some + * extra care from the application. If you code carefully, you can handle + * these quirks without any platform-specific code, though: + * + * - On Windows, function pointers are specific to the current GL context; + * this means you need to have created a GL context and made it current + * before calling SDL_GL_GetProcAddress(). If you recreate your context or + * create a second context, you should assume that any existing function + * pointers aren't valid to use with it. This is (currently) a + * Windows-specific limitation, and in practice lots of drivers don't suffer + * this limitation, but it is still the way the wgl API is documented to + * work and you should expect crashes if you don't respect it. Store a copy + * of the function pointers that comes and goes with context lifespan. + * - On X11, function pointers returned by this function are valid for any + * context, and can even be looked up before a context is created at all. + * This means that, for at least some common OpenGL implementations, if you + * look up a function that doesn't exist, you'll get a non-NULL result that + * is _NOT_ safe to call. You must always make sure the function is actually + * available for a given GL context before calling it, by checking for the + * existence of the appropriate extension with SDL_GL_ExtensionSupported(), + * or verifying that the version of OpenGL you're using offers the function + * as core functionality. + * - Some OpenGL drivers, on all platforms, *will* return NULL if a function + * isn't supported, but you can't count on this behavior. Check for + * extensions you use, and if you get a NULL anyway, act as if that + * extension wasn't available. This is probably a bug in the driver, but you + * can code defensively for this scenario anyhow. + * - Just because you're on Linux/Unix, don't assume you'll be using X11. + * Next-gen display servers are waiting to replace it, and may or may not + * make the same promises about function pointers. + * - OpenGL function pointers must be declared `APIENTRY` as in the example + * code. This will ensure the proper calling convention is followed on + * platforms where this matters (Win32) thereby avoiding stack corruption. + * + * \param proc the name of an OpenGL function + * \returns a pointer to the named OpenGL function. The returned pointer + * should be cast to the appropriate function signature. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_ExtensionSupported + * \sa SDL_GL_LoadLibrary + * \sa SDL_GL_UnloadLibrary + */ +extern DECLSPEC void *SDLCALL SDL_GL_GetProcAddress(const char *proc); + +/** + * Unload the OpenGL library previously loaded by SDL_GL_LoadLibrary(). + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_LoadLibrary + */ +extern DECLSPEC void SDLCALL SDL_GL_UnloadLibrary(void); + +/** + * Check if an OpenGL extension is supported for the current context. + * + * This function operates on the current GL context; you must have created a + * context and it must be current before calling this function. Do not assume + * that all contexts you create will have the same set of extensions + * available, or that recreating an existing context will offer the same + * extensions again. + * + * While it's probably not a massive overhead, this function is not an O(1) + * operation. Check the extensions you care about after creating the GL + * context and save that information somewhere instead of calling the function + * every time you need to know. + * + * \param extension the name of the extension to check + * \returns SDL_TRUE if the extension is supported, SDL_FALSE otherwise. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_bool SDLCALL SDL_GL_ExtensionSupported(const char + *extension); + +/** + * Reset all previously set OpenGL context attributes to their default values. + * + * \since This function is available since SDL 2.0.2. + * + * \sa SDL_GL_GetAttribute + * \sa SDL_GL_SetAttribute + */ +extern DECLSPEC void SDLCALL SDL_GL_ResetAttributes(void); + +/** + * Set an OpenGL window attribute before window creation. + * + * This function sets the OpenGL attribute `attr` to `value`. The requested + * attributes should be set before creating an OpenGL window. You should use + * SDL_GL_GetAttribute() to check the values after creating the OpenGL + * context, since the values obtained can differ from the requested ones. + * + * \param attr an SDL_GLattr enum value specifying the OpenGL attribute to set + * \param value the desired value for the attribute + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetAttribute + * \sa SDL_GL_ResetAttributes + */ +extern DECLSPEC int SDLCALL SDL_GL_SetAttribute(SDL_GLattr attr, int value); + +/** + * Get the actual value for an attribute from the current context. + * + * \param attr an SDL_GLattr enum value specifying the OpenGL attribute to get + * \param value a pointer filled in with the current value of `attr` + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_ResetAttributes + * \sa SDL_GL_SetAttribute + */ +extern DECLSPEC int SDLCALL SDL_GL_GetAttribute(SDL_GLattr attr, int *value); + +/** + * Create an OpenGL context for an OpenGL window, and make it current. + * + * Windows users new to OpenGL should note that, for historical reasons, GL + * functions added after OpenGL version 1.1 are not available by default. + * Those functions must be loaded at run-time, either with an OpenGL + * extension-handling library or with SDL_GL_GetProcAddress() and its related + * functions. + * + * SDL_GLContext is an alias for `void *`. It's opaque to the application. + * + * \param window the window to associate with the context + * \returns the OpenGL context associated with `window` or NULL on error; call + * SDL_GetError() for more details. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_DeleteContext + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_CreateContext(SDL_Window * + window); + +/** + * Set up an OpenGL context for rendering into an OpenGL window. + * + * The context must have been created with a compatible window. + * + * \param window the window to associate with the context + * \param context the OpenGL context to associate with the window + * \returns 0 on success or a negative error code on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_CreateContext + */ +extern DECLSPEC int SDLCALL SDL_GL_MakeCurrent(SDL_Window * window, + SDL_GLContext context); + +/** + * Get the currently active OpenGL window. + * + * \returns the currently active OpenGL window on success or NULL on failure; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC SDL_Window* SDLCALL SDL_GL_GetCurrentWindow(void); + +/** + * Get the currently active OpenGL context. + * + * \returns the currently active OpenGL context or NULL on failure; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_MakeCurrent + */ +extern DECLSPEC SDL_GLContext SDLCALL SDL_GL_GetCurrentContext(void); + +/** + * Get the size of a window's underlying drawable in pixels. + * + * This returns info useful for calling glViewport(). + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window the window from which the drawable size should be queried + * \param w a pointer to variable for storing the width in pixels, may be NULL + * \param h a pointer to variable for storing the height in pixels, may be + * NULL + * + * \since This function is available since SDL 2.0.1. + * + * \sa SDL_CreateWindow + * \sa SDL_GetWindowSize + */ +extern DECLSPEC void SDLCALL SDL_GL_GetDrawableSize(SDL_Window * window, int *w, + int *h); + +/** + * Set the swap interval for the current OpenGL context. + * + * Some systems allow specifying -1 for the interval, to enable adaptive + * vsync. Adaptive vsync works the same as vsync, but if you've already missed + * the vertical retrace for a given frame, it swaps buffers immediately, which + * might be less jarring for the user during occasional framerate drops. If an + * application requests adaptive vsync and the system does not support it, + * this function will fail and return -1. In such a case, you should probably + * retry the call with 1 for the interval. + * + * Adaptive vsync is implemented for some glX drivers with + * GLX_EXT_swap_control_tear, and for some Windows drivers with + * WGL_EXT_swap_control_tear. + * + * Read more on the Khronos wiki: + * https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync + * + * \param interval 0 for immediate updates, 1 for updates synchronized with + * the vertical retrace, -1 for adaptive vsync + * \returns 0 on success or -1 if setting the swap interval is not supported; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_GetSwapInterval + */ +extern DECLSPEC int SDLCALL SDL_GL_SetSwapInterval(int interval); + +/** + * Get the swap interval for the current OpenGL context. + * + * If the system can't determine the swap interval, or there isn't a valid + * current context, this function will return 0 as a safe default. + * + * \returns 0 if there is no vertical retrace synchronization, 1 if the buffer + * swap is synchronized with the vertical retrace, and -1 if late + * swaps happen immediately instead of waiting for the next retrace; + * call SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_SetSwapInterval + */ +extern DECLSPEC int SDLCALL SDL_GL_GetSwapInterval(void); + +/** + * Update a window with OpenGL rendering. + * + * This is used with double-buffered OpenGL contexts, which are the default. + * + * On macOS, make sure you bind 0 to the draw framebuffer before swapping the + * window, otherwise nothing will happen. If you aren't using + * glBindFramebuffer(), this is the default and you won't have to do anything + * extra. + * + * \param window the window to change + * + * \since This function is available since SDL 2.0.0. + */ +extern DECLSPEC void SDLCALL SDL_GL_SwapWindow(SDL_Window * window); + +/** + * Delete an OpenGL context. + * + * \param context the OpenGL context to be deleted + * + * \since This function is available since SDL 2.0.0. + * + * \sa SDL_GL_CreateContext + */ +extern DECLSPEC void SDLCALL SDL_GL_DeleteContext(SDL_GLContext context); + +/* @} *//* OpenGL support functions */ + + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_video_h_ */ + +/* vi: set ts=4 sw=4 expandtab: */ diff --git a/include/SDL/SDL_vulkan.h b/include/SDL/SDL_vulkan.h new file mode 100644 index 0000000..ab86a0b --- /dev/null +++ b/include/SDL/SDL_vulkan.h @@ -0,0 +1,215 @@ +/* + Simple DirectMedia Layer + Copyright (C) 2017, Mark Callow + + 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. +*/ + +/** + * \file SDL_vulkan.h + * + * Header file for functions to creating Vulkan surfaces on SDL windows. + */ + +#ifndef SDL_vulkan_h_ +#define SDL_vulkan_h_ + +#include "SDL_video.h" + +#include "begin_code.h" +/* Set up for C function definitions, even when using C++ */ +#ifdef __cplusplus +extern "C" { +#endif + +/* Avoid including vulkan.h, don't define VkInstance if it's already included */ +#ifdef VULKAN_H_ +#define NO_SDL_VULKAN_TYPEDEFS +#endif +#ifndef NO_SDL_VULKAN_TYPEDEFS +#define VK_DEFINE_HANDLE(object) typedef struct object##_T* object; + +#if defined(__LP64__) || defined(_WIN64) || defined(__x86_64__) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) +#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef struct object##_T *object; +#else +#define VK_DEFINE_NON_DISPATCHABLE_HANDLE(object) typedef uint64_t object; +#endif + +VK_DEFINE_HANDLE(VkInstance) +VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkSurfaceKHR) + +#endif /* !NO_SDL_VULKAN_TYPEDEFS */ + +typedef VkInstance SDL_vulkanInstance; +typedef VkSurfaceKHR SDL_vulkanSurface; /* for compatibility with Tizen */ + +/** + * \name Vulkan support functions + * + * \note SDL_Vulkan_GetInstanceExtensions & SDL_Vulkan_CreateSurface API + * is compatable with Tizen's implementation of Vulkan in SDL. + */ +/* @{ */ + +/** + * Dynamically load the Vulkan loader library. + * + * This should be called after initializing the video driver, but before + * creating any Vulkan windows. If no Vulkan loader library is loaded, the + * default library will be loaded upon creation of the first Vulkan window. + * + * It is fairly common for Vulkan applications to link with libvulkan instead + * of explicitly loading it at run time. This will work with SDL provided the + * application links to a dynamic library and both it and SDL use the same + * search path. + * + * If you specify a non-NULL `path`, an application should retrieve all of the + * Vulkan functions it uses from the dynamic library using + * SDL_Vulkan_GetVkGetInstanceProcAddr unless you can guarantee `path` points + * to the same vulkan loader library the application linked to. + * + * On Apple devices, if `path` is NULL, SDL will attempt to find the + * `vkGetInstanceProcAddr` address within all the Mach-O images of the current + * process. This is because it is fairly common for Vulkan applications to + * link with libvulkan (and historically MoltenVK was provided as a static + * library). If it is not found, on macOS, SDL will attempt to load + * `vulkan.framework/vulkan`, `libvulkan.1.dylib`, + * `MoltenVK.framework/MoltenVK`, and `libMoltenVK.dylib`, in that order. On + * iOS, SDL will attempt to load `libMoltenVK.dylib`. Applications using a + * dynamic framework or .dylib must ensure it is included in its application + * bundle. + * + * On non-Apple devices, application linking with a static libvulkan is not + * supported. Either do not link to the Vulkan loader or link to a dynamic + * library version. + * + * \param path The platform dependent Vulkan loader library name or NULL + * \returns 0 on success or -1 if the library couldn't be loaded; call + * SDL_GetError() for more information. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_GetVkInstanceProcAddr + * \sa SDL_Vulkan_UnloadLibrary + */ +extern DECLSPEC int SDLCALL SDL_Vulkan_LoadLibrary(const char *path); + +/** + * Get the address of the `vkGetInstanceProcAddr` function. + * + * This should be called after either calling SDL_Vulkan_LoadLibrary() or + * creating an SDL_Window with the `SDL_WINDOW_VULKAN` flag. + * + * \returns the function pointer for `vkGetInstanceProcAddr` or NULL on error. + * + * \since This function is available since SDL 2.0.6. + */ +extern DECLSPEC void *SDLCALL SDL_Vulkan_GetVkGetInstanceProcAddr(void); + +/** + * Unload the Vulkan library previously loaded by SDL_Vulkan_LoadLibrary() + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_LoadLibrary + */ +extern DECLSPEC void SDLCALL SDL_Vulkan_UnloadLibrary(void); + +/** + * Get the names of the Vulkan instance extensions needed to create a surface + * with SDL_Vulkan_CreateSurface. + * + * If `pNames` is NULL, then the number of required Vulkan instance extensions + * is returned in `pCount`. Otherwise, `pCount` must point to a variable set + * to the number of elements in the `pNames` array, and on return the variable + * is overwritten with the number of names actually written to `pNames`. If + * `pCount` is less than the number of required extensions, at most `pCount` + * structures will be written. If `pCount` is smaller than the number of + * required extensions, SDL_FALSE will be returned instead of SDL_TRUE, to + * indicate that not all the required extensions were returned. + * + * The `window` parameter is currently needed to be valid as of SDL 2.0.8, + * however, this parameter will likely be removed in future releases + * + * \param window A window for which the required Vulkan instance extensions + * should be retrieved (will be deprecated in a future release) + * \param pCount A pointer to an unsigned int corresponding to the number of + * extensions to be returned + * \param pNames NULL or a pointer to an array to be filled with required + * Vulkan instance extensions + * \returns SDL_TRUE on success, SDL_FALSE on error. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_CreateSurface + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Vulkan_GetInstanceExtensions(SDL_Window *window, + unsigned int *pCount, + const char **pNames); + +/** + * Create a Vulkan rendering surface for a window. + * + * The `window` must have been created with the `SDL_WINDOW_VULKAN` flag and + * `instance` must have been created with extensions returned by + * SDL_Vulkan_GetInstanceExtensions() enabled. + * + * \param window The window to which to attach the Vulkan surface + * \param instance The Vulkan instance handle + * \param surface A pointer to a VkSurfaceKHR handle to output the newly + * created surface + * \returns SDL_TRUE on success, SDL_FALSE on error. + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_Vulkan_GetInstanceExtensions + * \sa SDL_Vulkan_GetDrawableSize + */ +extern DECLSPEC SDL_bool SDLCALL SDL_Vulkan_CreateSurface(SDL_Window *window, + VkInstance instance, + VkSurfaceKHR* surface); + +/** + * Get the size of the window's underlying drawable dimensions in pixels. + * + * This may differ from SDL_GetWindowSize() if we're rendering to a high-DPI + * drawable, i.e. the window was created with `SDL_WINDOW_ALLOW_HIGHDPI` on a + * platform with high-DPI support (Apple calls this "Retina"), and not + * disabled by the `SDL_HINT_VIDEO_HIGHDPI_DISABLED` hint. + * + * \param window an SDL_Window for which the size is to be queried + * \param w Pointer to the variable to write the width to or NULL + * \param h Pointer to the variable to write the height to or NULL + * + * \since This function is available since SDL 2.0.6. + * + * \sa SDL_GetWindowSize + * \sa SDL_CreateWindow + * \sa SDL_Vulkan_CreateSurface + */ +extern DECLSPEC void SDLCALL SDL_Vulkan_GetDrawableSize(SDL_Window * window, + int *w, int *h); + +/* @} *//* Vulkan support functions */ + +/* Ends C function definitions when using C++ */ +#ifdef __cplusplus +} +#endif +#include "close_code.h" + +#endif /* SDL_vulkan_h_ */ diff --git a/include/SDL/begin_code.h b/include/SDL/begin_code.h new file mode 100644 index 0000000..1f01e0b --- /dev/null +++ b/include/SDL/begin_code.h @@ -0,0 +1,187 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file begin_code.h + * + * This file sets things up for C dynamic library function definitions, + * static inlined functions, and structures aligned at 4-byte alignment. + * If you don't like ugly C preprocessor code, don't look at this file. :) + */ + +/* This shouldn't be nested -- included it around code only. */ +#ifdef _begin_code_h +#error Nested inclusion of begin_code.h +#endif +#define _begin_code_h + +#ifndef SDL_DEPRECATED +# if defined(__GNUC__) && (__GNUC__ >= 4) /* technically, this arrived in gcc 3.1, but oh well. */ +# define SDL_DEPRECATED __attribute__((deprecated)) +# else +# define SDL_DEPRECATED +# endif +#endif + +#ifndef SDL_UNUSED +# ifdef __GNUC__ +# define SDL_UNUSED __attribute__((unused)) +# else +# define SDL_UNUSED +# endif +#endif + +/* Some compilers use a special export keyword */ +#ifndef DECLSPEC +# if defined(__WIN32__) || defined(__WINRT__) || defined(__CYGWIN__) || defined(__GDK__) +# ifdef DLL_EXPORT +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# elif defined(__OS2__) +# ifdef BUILD_SDL +# define DECLSPEC __declspec(dllexport) +# else +# define DECLSPEC +# endif +# else +# if defined(__GNUC__) && __GNUC__ >= 4 +# define DECLSPEC __attribute__ ((visibility("default"))) +# else +# define DECLSPEC +# endif +# endif +#endif + +/* By default SDL uses the C calling convention */ +#ifndef SDLCALL +#if (defined(__WIN32__) || defined(__WINRT__) || defined(__GDK__)) && !defined(__GNUC__) +#define SDLCALL __cdecl +#elif defined(__OS2__) || defined(__EMX__) +#define SDLCALL _System +# if defined (__GNUC__) && !defined(_System) +# define _System /* for old EMX/GCC compat. */ +# endif +#else +#define SDLCALL +#endif +#endif /* SDLCALL */ + +/* Removed DECLSPEC on Symbian OS because SDL cannot be a DLL in EPOC */ +#ifdef __SYMBIAN32__ +#undef DECLSPEC +#define DECLSPEC +#endif /* __SYMBIAN32__ */ + +/* Force structure packing at 4 byte alignment. + This is necessary if the header is included in code which has structure + packing set to an alternate value, say for loading structures from disk. + The packing is reset to the previous value in close_code.h + */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef _MSC_VER +#pragma warning(disable: 4103) +#endif +#ifdef __clang__ +#pragma clang diagnostic ignored "-Wpragma-pack" +#endif +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#ifdef _WIN64 +/* Use 8-byte alignment on 64-bit architectures, so pointers are aligned */ +#pragma pack(push,8) +#else +#pragma pack(push,4) +#endif +#endif /* Compiler needs structure packing set */ + +#ifndef SDL_INLINE +#if defined(__GNUC__) +#define SDL_INLINE __inline__ +#elif defined(_MSC_VER) || defined(__BORLANDC__) || \ + defined(__DMC__) || defined(__SC__) || \ + defined(__WATCOMC__) || defined(__LCC__) || \ + defined(__DECC) || defined(__CC_ARM) +#define SDL_INLINE __inline +#ifndef __inline__ +#define __inline__ __inline +#endif +#else +#define SDL_INLINE inline +#ifndef __inline__ +#define __inline__ inline +#endif +#endif +#endif /* SDL_INLINE not defined */ + +#ifndef SDL_FORCE_INLINE +#if defined(_MSC_VER) +#define SDL_FORCE_INLINE __forceinline +#elif ( (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) ) +#define SDL_FORCE_INLINE __attribute__((always_inline)) static __inline__ +#else +#define SDL_FORCE_INLINE static SDL_INLINE +#endif +#endif /* SDL_FORCE_INLINE not defined */ + +#ifndef SDL_NORETURN +#if defined(__GNUC__) +#define SDL_NORETURN __attribute__((noreturn)) +#elif defined(_MSC_VER) +#define SDL_NORETURN __declspec(noreturn) +#else +#define SDL_NORETURN +#endif +#endif /* SDL_NORETURN not defined */ + +/* Apparently this is needed by several Windows compilers */ +#if !defined(__MACH__) +#ifndef NULL +#ifdef __cplusplus +#define NULL 0 +#else +#define NULL ((void *)0) +#endif +#endif /* NULL */ +#endif /* ! Mac OS X - breaks precompiled headers */ + +#ifndef SDL_FALLTHROUGH +#if (defined(__cplusplus) && __cplusplus >= 201703L) || \ + (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202000L) +#define SDL_FALLTHROUGH [[fallthrough]] +#else +#if defined(__has_attribute) +#define _HAS_FALLTHROUGH __has_attribute(__fallthrough__) +#else +#define _HAS_FALLTHROUGH 0 +#endif /* __has_attribute */ +#if _HAS_FALLTHROUGH && \ + ((defined(__GNUC__) && __GNUC__ >= 7) || \ + (defined(__clang_major__) && __clang_major__ >= 10)) +#define SDL_FALLTHROUGH __attribute__((__fallthrough__)) +#else +#define SDL_FALLTHROUGH do {} while (0) /* fallthrough */ +#endif /* _HAS_FALLTHROUGH */ +#undef _HAS_FALLTHROUGH +#endif /* C++17 or C2x */ +#endif /* SDL_FALLTHROUGH not defined */ diff --git a/include/SDL/close_code.h b/include/SDL/close_code.h new file mode 100644 index 0000000..874a926 --- /dev/null +++ b/include/SDL/close_code.h @@ -0,0 +1,40 @@ +/* + Simple DirectMedia Layer + Copyright (C) 1997-2023 Sam Lantinga + + 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. +*/ + +/** + * \file close_code.h + * + * This file reverses the effects of begin_code.h and should be included + * after you finish any function and structure declarations in your headers + */ + +#ifndef _begin_code_h +#error close_code.h included without matching begin_code.h +#endif +#undef _begin_code_h + +/* Reset structure packing at previous byte alignment */ +#if defined(_MSC_VER) || defined(__MWERKS__) || defined(__BORLANDC__) +#ifdef __BORLANDC__ +#pragma nopackwarning +#endif +#pragma pack(pop) +#endif /* Compiler needs structure packing set */ diff --git a/lib/ImGui.lib b/lib/ImGui.lib new file mode 100644 index 0000000000000000000000000000000000000000..aa1d1fd560c1a8edb7b5354d144b5108c5d3f8e5 GIT binary patch literal 5847042 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�Z;0ZG!X-X#RRL8p0fRfrflj+L2rC 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∓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 DH<^J8=DGBhHCrPs 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

qX) za*$h6Xwg!NmNtmAEMsYSLIuJV_{K;+}+nrBdHkr~uj1@czZ)F4yn|BVltZjS)Jj z*opfeX(6To{8&l-he7&t26!Nl6{YGO5&CXda(Sg6*!%=FJN$Yll`6LKgm>qHuui4h zTV~J~o6CsSK$Pn|)6G;vB-ty1a3IL>4f2e$FasbNt0v!YFczRnLCOhG*svUA@{3hs ztTLKWlK({n1VOu(5LC{EbmO~QTWJ}|S7|2p;D74r%aO2&79$9WuUi%>5=VF2`J}B) zwt`KDZnu15nS^k(#kJ5n|{z01S36Z*OVi@tJt*k!8$^cx0N%K*u1T7lOb=b zWeQW?)^r5d@CeQ;8ClyAT+1W)CzkMVMZhRW@VE<8rCrC9_H9lZgrmW8UuC?P7^HHH zqjJ5>^dz{xBl!IVu}-riKF@L49y#RG=E|> zZ_%+y|s|s{;_&ZV*1Y2dAun&Ga)i%!2_B6ENBfvcTaBpnbwkL%< zScPaw+h+<>4ejg*-pw_HTGUp)Q@OOe*|bqqBqVjPYi1H#*hZTSdD}fxnDW+S1*2#J zA<;kHlVlBUidO$bn+*D!Glfb2WGfg&Erdk>Bu|q2_++`&zo$(G{d;5zlm01IFp8!U z68$fooAp#%J<1MqEw@{Ru>26z#9dNbW_rp@r%fA0U4$ev9hpgNVW-(-Fxj0cO!{Xy zg3~>MTXI22a33oeMf(zxj2wgFxIG7l`RPbarY4)e{jE0SZ@)}oGCSK5oaGVRUh;R4 z6^x>T2}%AA^dvDwvKcwlCPPLJ$rPrH%y9(QMXB9;1XkfvALdEFn&j^YPLC1pQG_Ia zqo8TeX4=Yeu4Xyhqh~qR6NE>C*KW3Pb=MJho7(am!)D9`Vr_pmkM^k7Y@XnxUlZwh z-$5PA@t(9MYg9!iIcZNUCwPh@cyc+x(;UH5J%Y7TyJt9pr4rtjZFsqS7!>7{_7mUGtZ*-759bLdeY|D z5T(7*rlo~Cak^8J*6x~lq^xx}Aaw=!Z>VMECgZ>9Hg-QRzR*()@5fc3md6JBG^*?5l zLI0zf!leHRD;Pyj5)%E7dy*{V>VMiMgZ`&7g-QRjRxpa5BP9Bt@g(`2Uof!s^MXwV z{m*9#lm3^iU=+PfNc6wxNpgy-|5cj|`d`TuCjGBl!6e$(f_t5$qugm_iZxhe=k#*^nYjtqv#_-qW{lR5iWe=-VZ#={=rJF z+^+SBD*V(@_;F9kKDWt`;mvTb%5KD^Q&N+^sKQ?zg+G@~#wGn-6aL{O{H<(4 zD!^Yh8A|$RrZ5Tq;|LykV#@LV?MXX{3r1;!hh@zmBqX&|K{&Z)V3MG}bD{cZ!km*Z zDw~k(RoY}IR6bLf1gjju2j))1vVte&V7hRMC+;;iWfavCk|I@mk__S`)`j)6$&jE>` zA<@5$CrR}H=lO1LlR^KuOkvW$qa*l3|3nYl!ISb5HbW_Qu_>cyS3;7roimeIS5mae zkh9$~g-L&-6{JrQ6B7Nqdy?!=ZQcwvIKWQOgw0OErm_ji-Xxn08Jn0XOoA;e2$w&F z5Hd!qauy-+XZ_eMHZ|f-*DhK{aTY-*dlWa6vTwE{+SR~xH88_5@JSg1ZJ7pwa4+yM z7)}Hge0-k0m<&<&CP5QA_HoR8@ebDBaD3OzCd12&H?I*H+0txXE>y^=c?j3=++j0(~15JWuKHx;2+fN_QIxO6gvJ zxkTx1^%yzEE;HXQM%?U`N_Qu#M(G|PWJ>p-MJU}7WlMJllqX7O7UhHRF7Q01<6C>& zXZJ7(O6g{MO81b*h}kR%!bil2zjTjT)lu{cAyc|nEkfxYMe;=cWqtl}@Zv97ndW9^ zq;C-4xcj#VnK{hcgv|Rm?-1fQC35c*f@Royov`0tEuG$d7u?v}0rZmAdmtvVLA(9b zFh3-Y)Y~8DKq}VcKk(R^y$E7HrTxUFrMK@0N%lU@OoEbAvd?WYl;yKbVG{h(3euNt z37N|IhLEY8ZwZ;o`GJsF|AKI`a?G{>D(5?Jla=#5h~CQii8$uz{7gtp{0RBP^S++z z#1`;Zn+yf~B~zFR_&W=t-&8ze^hZ%(5fX=|A-h>#;Wv+Jvy2vme}L!dH^0RWOi~si zGAGafcdXbYyh2F)WMOl>N*IKFz)NPYNb7H+!YhHLz-wZazY$bn{z; z(!FeE=x$;y+W@Fel+8?n>8uZUp0af(M~Xv8P|Ehypk&DgdrZjc#sXr(&0MKu3$bF9 zY#1R^vL!4+$*7i-4_!;PAXFzxW@f)ZI21fj$@q+>`_z^sK`GhW4at%X_n5ebCwM`) zl$h|BY#CQ^zog=&J&MivnBF5RuXqG2MwP8X$W+;?7NN?fnIWQ^E3LBSpgK`yX1ErF z%Y)~svZ2YwusR7!l})KjmTWbT2{V=q!ZpN%o4HbBSjQ@k!cl}!GL&ac!gP$)9z1pS zs@I0LL}BzQ#dTHJdXBEOvUH91=z3I6I*qlukee|cK{dL86^x<{2}uF^%7`R2rCQ&k z%tSov-8WW+n>Y$LDw~Wa$D7%N$nw7FP`jx|g9$6-rnj_dqi8EaQi?4yldu=WN!o2} zLKvN1pNQ^Td(xX3J*6DSDbc2PC1l$4ZWcjXf2l&Z;b^Pg&ZF8?V-Ri+o~Kpw`#i2A z*qsEWRTn&ix}wL(9FD|6*eFKa?3LQ}ct`cx$5Vdz&P(T8BWr=k_gyNH2R%(r!u5O! z*Ud;c!Abb=$zsu&UOWUMTT~)jY_aWowT2~^b_l{Q}MMJmm4@{P)LDh=ZkItf^=(q@tYf2HjWj=$1oaH4XRwl5^gSK2-h=|!a- zNOGpq<`6QKb~qzc+7W{CM=CnXB2?NGtruHqrT!2Et;%#Nt${0T&vKP^Fd6Vy+9BZh zEA1doRIbtvgGBjCI}{?lsI;R=&Q#iogiNKK#0ZskvY`AaicYl%l{Q1`MJf#~4W4BY zidf2YDs2(2v}xrk?N~D4ue9U9@mJb0oTyx-odAjQm3BNtdQoYok(_xW`gB63($265 z)$+)-q=#Jgf$+0*LtI5YZF@6~9F9YK2sHYToI`pLq(+Bi7wE}9kY6}c4WFfk&vpzy z=P~@O$M7?0!%vqre2yAER}G)%7=A+x*Qw#_)$k3D;km5gL-CC9 ztwnn2WRNxN(gqsCE~&v7E|Fq}Z+t`?$W4Td1G(8EIFN-rh8Of0ULb9FNLjT2Dv1JWE zpoSk*!w)%zw-&>AQZ`m^C59c^me#OC+QJ%EQmn)etKmn~@S~35T|9<&_88tNZFtAB zh96_YW_9CSYvfR;&z@tAxU{oDqv?{0@oeP@)mYY2~ldb|-yZAgvsXnDSRt`Kzk@HAnfUY2`ccXE;7dD+eQ{ z{B>3ShAMy4QT|O@IiD2^zD_IWV`6+b)2=4HrOMw{$IrImvbQ~sGM|D07~jq3}G&_kDkj%j!a*_m~iKDwl3;c`xWJ|uvSRgUdU(r8@2td+WyY5y_V0m>EUbo zY#Y`ZN!$H>w!c@~Kd9{=9oy^sY#RqK)@R$W#w2a?!g#XIe^T2&tLppxj1+qKy@8!U$S6RoZ5XHaCdw&)q_4TPoU0(bkH#VFYixt zBA4HR5#=Diqv6thYda}zXQ4&A7{q&1FQKk<-Bc%CFEZKxZTc5%&BNi#V9wm?8a!`V zaQF$~12W(I-!-$HZaEcoU06`Aq7v|hAFYj3oLjP- zYoq#FiPpAB^ey|Y$x~XI+@)uGN7uZN+Pk@QFkMD7 z5`&*`9>_ZCikz;QZs2G&A6Pew&UE|6Kx@0PwS%ob4tq`p(Q(EY*HGB%8y}Og{ zA(~XA%TMrGP&Z$+Bt92XPb;>yPM}Y6OvKeV#m1(l?kV&a?%d+L;pKv2GS*;?@%<=` z^jWiMbSZ37XSEfY*xJ_E1=Hqo&r{S6~JV3iD&&&6v<@eZa82yl-YkG6zp2g1Aw%FBMCWn>vC5eetujw*W z_ID+k=#x~XGMGnMSqF&;%}p&+=pHCq-fU{=On(hdvuUy_y9M}*DM4;H)J($_VfgMS z-6Y!8L9NWGu-srHfoGW^F<-B;0^^S1wR$kD8yqIcDD6^3mnphj(G`r~_pVghRf?`w zbdAX6uVn-Q#=Br^QoWLLuL_nIN`fA@Q{pr)+f>ogK&{N7%@%1XlToz#QjvVQL-N^Jbz4}^^0 z`%%$PjNtcvR`iRY+^>S7-xU4M2!8JmrTwYsFN4VM{jIcr6#c8H;xSqE3K+rfg-VMQ z^-+`)xqO}x{9dKulHV&Rtx9N7UxV21^}B(dUE1%}G1>3;YQZxT{5cqfVFh#6?et=0 z5Y$)}`Mo5o+OX1ouP-wkzh|~}t3b~3d$&@3mG^tMSqaBcdHmj^km{x1djztMx@^Dq zfVKU<^Lq~=b$P!x2je|d`{*FN-x@3H_indBJ^H;nA(-j+Zegy^@7)Ye+V4FGvhjP= z9!#Da%K5#!k)W*KyQd_P;rH%!CA@y`E=c^}{obokQ`YZ2VI<1vIoOu z{a!Woe&hExB4qsD#)>v!1i!bbqRj;5HWw6ap=e7+@OxV+ZEHo_7({+=TcvHMXq=+$ z745(Xes4#m?WAaDMZ1Vxepg2Dd%GDf`Msjjb{AUIXb}6o1>j!Nes2hq{eEvSJ1QRU z&5`|=S#x;ZbbiZ%-%GIOGpw}Vo0l1m-!msO<^eg&@6}NW%KN>3R>E;q9>2E$q-R9; z<4wMDes3TWl=XXqN)j1-QQU@qhPw%R)_Azc=f-@8(2S1Gz$(KU*$ zWdy%>ozkvXbc3QBMJ|66Blx|W4VV1hElRspXwhv3vEN$;?j`N_mS(cw?=8iS%FJ`+ zXsKB^36``h%ySd0;f9s=drL6G@q1Va4uWAIXZgKmDnWU_H_=Ksj>_Zrx*^p|zt;s> zM_snxYqz%lcYdz}smuF4X9+26v&PE$y-8N6N59ts!A!q5fw?}v*91=5@9hP$o#*PB zWI4aLClZwPd#xpj48J$UmGJt#Js|Oa_j`vxOztp<_b3zZfr>Z2&9D9;Ff zuTp6RMOBLWid?>$5&T|_;ga90Ra%|UqJ9Rk-&+&zCGGdtV6xxutL*oDL_uhhfhJ>9FUB>diYJs2+Q_v)$l z%j-`=Zln_MsWII)41&QRdfpi7Zxcq*YV1JZnpU^2gsw0WlwVWPT7s(9R6~+jv9;;}5L3JA_+E7scjTCLHXcI-78WcwTHxpF1xp1quU_@oB-co3_ zTM4S)TDbMwC~aGV!l-^bK@HwTYuG_hen&x7JBeJ?&O(cJQM9X|{BDYhigvdM zhYt?LGs8zBCUwyFc<6ro(mA3f=*?rgb{GO_KYuWj{eJ!+@a%ylX&!d}`asLV_%^|s z%`C^h*`}Tavd^8<`(a=uzK^^=Xt848QzO{YUW7_r!LM8ung;1~DIDL0w zF$mLlG@ABoo>1gh2IU+=Zc#Qy-<7})wRxM*+3_Ed{1{VEy*Lt>k2p7u@8mCn#LHh> zQ(IeG7t}2QLGujS=;Pq=I;tC{+*p3<6QQzDpu` z%hY!A2C1V7eU}3>Nv4lXK?DCE)Gh^)axu7e>5_y$2G=fQ%=B<_ppFaBzjlEB9#9LK z$qv_{a!4u|usqaq#4Yvgu3*3lAmialrN!!VzzDDrgMIAUhT4JrGtfNepfJ*Bq_&E_ z!-bz}Zh<+3*dVtuM6;f6ZYAZq`O!_yN;+iFNFwGfx5EjULuE%WqNzu8q@es!ijEdk zb&R581=SoUsNeB|YEDpeqM*V_f~rqebc&$5Qx%;isQ>AT&QNrwqO%O5n0mILx^skE zeJ&%!)boT^d%mFh3xr#Lq0%lgh+^u+f*LLnxrR$cuHiC4`O5`WT_JK+R|+kLVyZa;aSF)( zn0hi;iI{p4Xx^CGNu@3uQzx-NMoeu6v&Wd)4yj(m)E3BP$J92kdlgfsIEvh0<%y{i zA=;amIvIjxW9kG*cw_2#PV0m-6H}*x+`E|Cnih4#rX3*c!FD_`wTYAW5L5SpP;X;u zH-vpoHOO_bvHuWLry)UaV(JVCX8GK@>B@C|ZcsN9bjj*}kEwejc~(q40L=0+bsvb7 zjj8*VBr;;^e#XrIcTAlPwKk^e8Ju9ifgoqc)LCHnKBgYzGvbe_he9;#`Q{E$uKRpr zG4*;9F){UZLMEoZ!3Z(+O+op$6um8|>K#Sz3aWWeP`~#D)qJ4nLqUa)1XX{m=o3M8 zpDOxHQ2);reWB<}MPC_2G4*Rfb>9fL`ddbbsox2$_Ip9~KM1$}N2UE_5XID=1vUI4 zat*(VT*GgI^1lnJ`a|TZ{uEmDm!iJ~<^NIiucC@4%pxda>SKsOzxWs%RHlQ@#|AhVp9YL3@D0J1-(-VatHrrrmdH>N&F_5 zH`E*$3U3Cp$C!E_q9yV9bbn0g1>@x;^{Ie8B;^?nHTHl{udVF^^Oj|*}Sv9bRUQy)Qs-o(_$ zAeiNI>mF5ZEI)ORgDzS9?=kfWB+rVe&w^P#ralRgvN83kl0-&KecG7$|Bk88L#>Ia z+Or#i0WW}@9aEnJyZ15mMV}FWOnn8SSSG0zrH4UPe zx|X22wS`-~4kN_WQ9`R7EvSB7;nuIGv@r%zOdTtzVSSNn*g)hOHWZZKNKnKlkbasDlk_9qiY7WdEV`@F5dJ$8rAeS9e`+?o7m|E*7 z>LI4)A=;amT7Y2LnA!&t-k2J4+Eh%f1G#rGwI(g}PdZf@nq@>4f2=#tg{9#iK-@~oJ;AeiN2>iiHX z8&e0DBr;;^5M$>5JEjhWS{qaK>|iipVUV+9>Ox@mKBg|>Gvbe_i$gT)`Q{c=uKRpr zF?A~vF)?)}Au~_in-S)z`v}VKt7tz#Rr@PCKv2yrLH%Y6syR^6L4pbg3#vXu(V>Fs z4pTHoQ2)af9iiw*MMoJ#G4*Icb;k&|`dCJYsmBSe_IN?{CkVIxM5Uc%5XID!1vQ)^ zat)`7T*GOC@}~=`Iz!~D&JbS$MLjWfC${5>soQY!9%5=EgnAoOn;|TL%Jp$UZUP(o4>5Hj67(jfPKIEX z&#jxJ+*p3J($<|2wAc1+{kVS9p?B2)JPM;BfOq~YNtmm8SR<8SeV=?u75-~CLaY81hKEVhv^+`ebrxZOc zsOlL-&kCw}PEfz+1=YNu=tV(=mjqS6tmqX%b+0OVO;G>W6}_S8O+{}RL^1VkL3Qs4 zxB6X1h^g-ht@eFE^&beg{zIjGWDv#Fj|DY+B61C%id@5Ig7TjWs`^6Ys=gFj^p&Eo z1?9g{^sS=rEJ95E2QjEzO#K@I>6rQ#ll?LEPw?zKHF4nd56i+lHNpCwSx!tfM^1kO z*&kDX1uGF#e*w)KQ*WeFmyM~HvVhD}(ep}&Xv2%a>@lWZ2dQ4f)XO249aFCbyH_#w zYDZBIG4&FN_9muY2Enp1^&&`kW9kK*HWgE^0l9ZE^{TX}C#GJ(c04ilLQdX8OuZgL zy^X0iLs$Zp>*IplO>FEx#ME1mpf@q~HV9_<+`3zp8_Q4K?Vw9m|9ecm1Ie>u>b+o= zkEwS;q-;#Rt0a*TQ|~rr{=Z}D{ZMP?snWAY2Lm1eIXkA_2X^mc>VrNb{+Rj*M6;f6 z?qTJ+&o>rRzb6sIRQT|kn@JfT7?vX{bPsDahn;G{Y=PwY3Ub2)fHGi z{*{oq$MQFeU|ujRf@*gX-P$wFIrZ5U zgg=49*J--f>e#FEY9l&>^*c#O`SyYd_w?+ke2Hc|$aKe#+65V>QU8GUt||P*1bbAn zlCnfv|8%sDzCEF}lh5Ri0@>9HGPM4sTJ+ z!WK!WXN>3pPL_lvA}0)(RRMBFLsHx-^7g}MM(v}cfez>5*l8TlR)OTq`%LuAnR?%{T`i)Suyr7yD6pd80 zqCp`V>*9FdJUa%PdHkp#SPXLIf~-m|3dwZr=c~)Zuwq0IEMneq=W8U*(QEqJ1MYub z*fOw&5MvBwh7kF#=!HP?jdalZa#TWcU`_VUFujn9k5IekZ)+jg(cIbH>iUi#mj``f zYfF3L%CQkauF~kHgU!W>-4k$lTMxyK3UYldw{b?ATXIRY1#)z_6~>%+HHR{5f|@#{ z=BL58b`_hNr*<_vms*VqY6c`kI;S?a7dLhDP}ATO+1e4o$zDFCT2F^>%}Lc-oCc*H zx)P-|uaq?sGR|$hL17d%DQ$wHWs8BM9+G8S_6SJW^)b_cxvef|$)$G9?}fA27jnIF7W+W5th3k~64qImQ70ZCjb&z92HZuAF@qUGz7UlEQqfn8 z(C)uh+Bbr#z7=lOcS5WFUeOPN3O_3PNzu;+Q5gJ1X!&0S6@Ie_VekkvkY2Rx!y(tJ zmOTfOWn1=PkchQxZmWk{a;aT2`4EufVenv(vRd_hR61>}(xkh!IomM!IHa<|;A3EV z+O-XX4}e`J3_fi6sn+ccgHJ%ZY-=t&lMqR_=EAc+kyvZa41=#D>3nJ}0mWO_~BAojAya|4L^uj8_wbPya1R%RId8@cN-3nd8$AbvnEp~`#VEMA0MubjmTkSyygo`-~S7WRNMdJ%m+@j1&N zcM)ei%M2m%mlmG^Da&D0Q3=U{gh4&d$Oo0xZ%`N<3_(vAtOwoWE+`DnWpq1X(7D+l zH?QTE97T!Sa~K?g)MXt<&CrBM+Huq@>=TJOj_fcvhSHig-c87K=xGK~7@V%O8H#2K z%I~dcA4X{R`zmceK~?(;x9R|)RnJm1TTtOZMF%N5*dPjnhX^fysG!1O79kA2j|S3< zmi->&deySug=E>5{SG8zEt}iw+m>8v*Gzs3|p{2DgD! zRv6q2Oi#PEVQ>SmV`0#?UUbmWL2hHqPql95Yx}md!EGU3wlx=aO^Bphb7421NUSwy zhQY~5`rpG~8T+T56p}J7;$A|gu=gptUr_!5MGrE9J9tQF zg@={)h|uzn3MxFN=y5@PpHTFqpxUPtJuRr;Gm4%SRP&so=M}wR5I>-$9;15cg|k=^ za=mgE!y#GLSu6nw>nt$oEAY&mKJ_`wGT<&^jK!HD!~mZKT@0iwhjAK}kSu5z#L$`d zY;n=08wRh0peGET3%bW$P#C<}=*|d(msxJgQP4HF>LxO0gI6JSS;tXxT|y-7IBKr< ziNqX7b{Kq-(wa8@FCo*$E1qUVVK6X=wgo~(k)V7ZML9-j_j#pN3aTmyx2j5L)qNFJ z3o6tos#R2H5QV{hLd(|+D)hGqVQ^J6kY2RxRUp@^mc240%eL&5AQ5ZX+*Vh#5VQ>YIvRd^^c&@gwQvXO^$Z5mi+mOl%gKvT9Y1cLkz5;fcF!;LVr&_l+488;D zvaPxBX+k93nhT%#L}INuGYtNKr2jn({*GjsVQ>JoF%t&oCuG9lU_vGgE?`?=6fI~F zd)alk0mS^*+F4IJ2-X5CGYrl}dV3Co^Fb;d2Im1eGYk$=)#bwALL_Be#M*?6i&#g| zC_(wriq>TWcd(w&3S*QuR%rS41r;_>w4tEB8!6gYQ0*p)HWk!wGew&Vs@X!(mWsAA zh#$~_sPbMoi`kItm9v-y$+FJk07w{TLHici7eOzg4aog1gWN@&u^%&ph}FknUy!mK z#==xWvLInlcSrc{0XGaT2|-U7Tm*EFyPz<*sL}0&K~+zSqQfk=oP=1D@nT*ix_g30If~xiv zZq4jwSC*!;I5D^+nNiF36XSbE{yky#9DJ^7;Ht-{~iXXAekEmOI?^|gNG8= zgu!D8nJ{=9Arl5qAY^*Yi3YKkJ%t-U%zvGn^`wK~B(O5W;1Q&^=P-B-q|#yVD3CM5 z;NhyeTo^owq>PKWjgTqq?TYRYl)qEaU5wxk?iO0%9;MwYwETU73im5|Kv3TY6+I-V z_F+Yj2oMNb;U59oDNc`uyBYmn=evv?JfWu3(V} z(*9KRm!SOLivD4QcK@%^DxR_WsscvDtqO%!9VzM~sE|{XS5#>bg~5W*@>PNgeJw&5 z`~(f87cKi^$n~mae+0?0E&D@A#9B7D)ekJW)UKKQKFIMf_#Q}Et@>%IOKGf5t3vpb zA6n;s1yWgI@MSPP?b?RHXTgqzL2HL+dqM66%TKj#=4<=5VenN*mu=03_YxxM)?9es zClYJTnPKotB>nGU@CPJw!(gehDGXLq8#7^WAR!Y52N5!1aBkZIqi7z3*vo#+4It*f zzRG&iLGUG5nPIRW>FqfTHb5#J2K$4Y83yZAb-6G&FGhhcNLjd&C45(7;9S0(bND5w~Vc; zpo{}RcFPDd%DA|ckxZLasRk%bhR>;Jwdry$YJBfl|50Dxi66;yo(Q_6gP~CVUsBT)6K9gy>dd;*m zK%3@>v8H7mO&37It?p@DIp>4yRyW9~oaHDjcbn28AXUx?N8<-b%9Z0}?tKusa+Jtf zS>8$b3uNMz^D{_PIhrU4egcUqM@g(_q@(8yI89WJyvs#nw9}cUgEF{#rE|Xfib{W$> zrG3n}G5p$XWPMyK+q47$CIkp6!UcC>%LUh1lAGinN+1adF}49;B$=~KyG!m& z@4fflA@tsR@4XX3Z=v_{{om}av??aamkW0+ioNgm-n@D9W_D(F)ZAFmvbn*O(yl<& zHm{|umh5BMCm27KuTeS+;**p=D_1DjD>o~*Dz_<*DR(GOt4}E}EAJ>DC?6|dD&Hu( z*X>hxTHUdAZ`2)M_k7*Eb^CkVtGnJ~tH)!HZ5{_aj(N=WoaedHbA#tW&$FI4JifWO({Gdi zEx)zNxBccO?ejnCf6D)y{}um7{@48P`#<-8;s3_}t$+W30RbZdMg~j_m=v%&U~Ry< zfDHi$0!{{;3b-6_FW^bQi-0bHJp-o(&JWxixGV5t;GV!?LBoUQ28|557<4)4M$oOG zhe6MSUI%qn^;Y#$O;rt0%~H)!EmJL0T{5gvZBVUIjf&Z<+N;{CdZOE}I-)wJI;A?R zx}>_Ix~2L}^;-2<^*sKGs*C2S>Q?+S)z$dts`K$LR6RAN^}E&YS$}N(KJ^dQKT`ih z{nPa?)W2B&as5m6=LY{Ayd-#e@ao`o!3Tpk1a}YV88SL#R>=I2MIoC*wubBq*&A{p zWPivo^$7JO^%V6C^=$Qk&^hWYp>x%HLg%SRgw0p)3tONb7`{-wHGGl!b@*cS;)o^c zYZ1%U6B?{gA84>reJWhp2y)jK0Ms9#5JR4EO}J)nz$}8KgV>98LV3n zvm|DD%(|G3F<@ zRITP-U0K(|GgzZ-ThgwpylaI)6$V!rT47R!$rYwnSXg0Wg-sRiRk&Z_QH949N|l|J zU6tLGJ(azceU$^01C@i6LzKgm!<8eHqm*NmW0m8S6OJUhDHki3D3>aiDVL*VtW>U6u0i|Qpxmh3B(#$4XeB$9yOn#C`;-Ti2hnPd zD^Dsq< zyvIb3NgmTZ=6KBaSnsjHW246=kIf!i&?>1-9`ZPfc6r?6l*eh0OCER7QlEG{^?2s- z#-r4;n`a--zMj-(=X);nTSJWqL^ zLAyThc?E6zw&xwsyPm&!-t&Cy`PB27=L^qQXz5+Nx}v3b_v-7_-)pefO0QL3tG(8E zt@T>xwccx^*CwycUR%7jdTsOC>vh!YxYtRq(_R<7E_+?|y5@Dm>z3C&uLoX_yq}$kMJJvJ<)rz_Z06L-m|>tc`x=};(f&XsP{4N8n z{>A%}_Z9D}-q*aZdq41g?A@zg?|Oae4XQV!-iUh0HT5>s+fr{^yP_~U;xpA}rq67j`944Uto7O8v&rX>&k>)aKF54c_?+}P<#Wd8oX>fm zOFqB)T=u!*bJgdX&vj&{+sIFMeSY(K?(+(Hs<&?+-@d*BeFysv_Z{Io+INiaSl@BJ zQ+#Lm&i0+>yVQ5B?>gW0z8jItwj!JD_1%Yzb{rY)itj_;N4}4JpCZ5Y^y}@{-*2ej zFu$dK%lwx6t?}F8x6|*s-wnT;ez*K?``z_>==a#~iQiMdf&PR2hxiZoAL&2Vf1LkB z|4IIv{CD~9_21{e-~Rxz;4%N>{wI+OPy3%iK0NP#!T%TkOa7OU8LuKUUiZK0e+&8X z0rKQy|EK=XSf+fn=TV1B@YfJFgI0+t1=2v}vwt{Ve32W$!07O*2=SHPZty#f0I_9NpSVLA77z}bNF z$h=nrt_R!-;JCnv$lKEbrw7gmoEbPPaCYF_zZwuTWxD(lYH?sNO zz>~=8mjZtcycT#P@J`^vz(*{@k3fbW9W)i0etyuBpk+a;f>sCZ4%&yTf60>f9|t`_ z?tc;V68Zm4(A%I=RcBQfRd-bnRZsK=ebFEEM}IIvHA*#FHC8nay~8xsbo36hRI^oc zRP)hCEK@C4tx&C0twKMs7QMwL)n?Te^c6c*yHvZ;YwT0)R~=9tR2@RkaTI;Wan%X* zAE#Akgg)e|>YD00dXn3!JF2_rPadH^d7^r%dZv1=dV${Mt%~}Q9_UGWp(hzqe;9g{ zarMX7pIU!<{n_YQ4%I)5-sNchW9VT{);}fmGMCWLJgNVz{+s%x!QFzp2M-S(6+Ab1 z9{QaH!3%>Iq4!xDyo~igYtaX7KreJC_+;?u;PdEOxUEbDPc3h_J!>aI~aC2?0DFTu#;h@!p?-9 z4Z9R}IqZ7a!0D z(KDiN#Ndb_5$JIvmPM?NSR1i1;#$Owh?^0&Bkn}pk9ZjIG-5)7i4CSVnAu=%g98l? zHaOhiNP|-i&NR5tphslS$lj6tBL_wfj+_xWGjew1oXEM63nCXqE{R+kxh!%;G^%q{*QlOR zy`%a^4Tu^VH7sgE)a0n8QOly1N3Doj8MP{EW7OuT?NN84?nT{?>J>dOdPwxp=uy%0 zqL)N3jb0PIE_ze+_2@g%ccbq`-;aI}{V4iz^pogk(a)pbMt4DfKOkmc%#fI&F{5He z$Bc;?k1@c4n1wNmFa}r}vy6=cHee*MDP}W91KVP@$LzqEU{}oUn0+z(V~)lgi#ZW< zD&};|nV54izr@^*xr6b-)0k&5FJsid{jNKJ`Blc$Ot=QYK_hKK!K8YP4H!p5}9E~j2#I29p5VtvQOWd}&9dWzj_F}AY zFz#5~iMW$-XXDPtU5L9F_erJr~GyyxeGKF7%9 z^O2vA`h4`~vp+u=e>nbF{PFlx@#o_&#$SrR8h8a_j8K9w& z%t*}@%{9$+%>&J2%~Q<_%`44o%^OV@ZC7n~ZBK0M?Mdw!?O@#q-ALVN-2~la-Avsa-CW(zx+S{h zy0y9ux=p$*x_!FCx|6!Iy7Rh=x=XrWb(eKlbXRpZboX^nbgy+i6M84~PZ*IfGGRi( zq=YF6(-LMR%uJY-upnVk!jgnF2^$i2Bg7Xu`3C6A7mhE++h%a6RE>!mWgR z2@etmB~DD7kvKbXZsNSe`H2e>7bh-FT%NcxadYC%#9fKI6OSYwPdt@)De-#Zy~J@z zbCc#J%}-j8v@mIL(z2wLNvo39Cml*UmUJ)ae$vCF7fCOZ-X?WT?v}hZc|-Efin&cawihzL$JI`9bpIF8YD`A^K7JG5WFk@%oASN%|@JY5E!Znfh7!pY;p%i}g$O8}wWC2lR*Z z$MnbbXZ7dw=k*u#zvwUNuj;SsZ|ZOB@9OXAALyqVrWao=0sV7rUr#?u1nEE*NY3i%g zH>uszdZzVC>z&p&tzTOIw1H`Z(uSlBOBD5mhq19H{*TdL*rxPQ{!{vOXF+fTVrQaS5tRWPg8GGUsHe6K+|B;5YsTz z2-8T@Xwz8Jc+*7FB-3P!_otg?nr55kn&z7pVC=sLqyJ^5<))RU)uy$k^`?!c&897; zt)^|J?WP^3U8X&zy{7%9gQml#qo!k~6Q)z9Gp4hq^QH@?UrfK6E}O2Hu9s;KFsHk2Zf)xdleAR;}63NYaH1 zqg!qMuzOk?+0R^Xb>S*~O!rFvuzRr1K!0dH!-c!?KKl>Jh24|ik^RJt-J^L_N%DL8 z$nGiT?Zl%YIKii#>cU(H{VC7x@x?T+?H{tCzB)oF{Sy+=AhJPZL_|~r=}(o)kl^5m z2;3STj^DH2eGjwVzU5@;TyIU)yvR38-k*MIZpOT^$CrE5YqYsWSG-E`et8-F?n37Z zvTA~AslVw*REj`*Z&s?xmr?LJ-KWMq)9vol$f|0jey98PH{@g|?3`h_Pw+k6SFQqh zO>BXd`vm{feOu?c$>x4r#(hE^(0v#F!O03MlBcbIEIgqe=r@Ba%Ve1)P%imH_rcpi z6u{GwB&zMn|moE#-YK^}o_}fw~3rf=Co{Yv2YJ|U?WI@RVC0Q;1k=)Ll zD}GMQDaipRH`-j(z7Rhw{QYS@-m-@I#{3-k!p6eFmj3`F@AnzDQ-wkKMMZ^0Mfq(D zi%O!~7NLSlWYv1O1oRE#eprT#p+;M;?oqnwN7)Dj9{s8HWo0CrTK+P+mb!85-vD+E z1)uf5H8Jp~Nc7Ei|_(Xsv1^ zQ@U)cUT(ptfeXH$Ip*}Lp&A%P~VaIIM_!lwVe%$W9xWR?TJN!PGIOvn8rPHsd++Y8l?r5J|)XrQ|V9IB< zeE8E1wg1txFQP|;9Q0nd^_9z>o#B(u1hw6@H`rY9dTfaMD+gPYzDP2D&6^gO^9nl@ zE7J-vBOemn+#u9{NU$ncrB(+Ai z^u4kD@>9)jr3c^Mady%t6U)25{OkJIcR(_2RW|f&6zCSysz5WN(f1GZ1HbuU@l`HY zrJi(u)})RnU+;4t`gc}&aY_2y39Bw)JQJ8~w{qzorI!w(HQyuZrtFICMG1eSw3v z|3R-O<{L{q(+Ly>X5QZm8@fK}obk!Of1K&J^b_rngO@va+;6#Y(Gid5!#0e_UXbfP z*}%mmXer| zt=GhRC1$iU|6nfcV8+KR4V{YO%2k>)9h=Te(`(Sfi2HNOa=){(Dfa9bjIlai;i33q zWAE@v1t+}L_%xiKQ9Cj{V{(>v^hl4EXX0nAk-K}<{>z0IV;Z@nps-C)`xqJTalq0~Pot1g=dmEBlFPU>XveFNw z7rMt!Tz58h`{3P8Bge+H{_1}1D>d9b{<>PLwsL#sMrT(q_xe=Lf5>Ki{>>`Yv=cpI zU$@F_QWEZSVDz2s?gp>_nTJg|Mq^Z6fwQan@eet}RgYWvcy#AfG zMbyks-H-q8)KZmV_|5c=TJFE?rEc(uk89t4ylL@O?a~I%U6qaRPdBf7UHR5OZ%=kV z;cf5b|6zAwEHGif!VC!*d16q>zREQ#*7mHOaD!zT_SM&(_Za z6h-}S_IRf5z5m9su3NvU`Hk6q;@?^Fjy6UA$K0Y#|28kEQzb(7ZT9e4T-3Nuqm2IU z=Lh(ExPG+a^dk2Of2S?^HnuEUe`GqqiJMKPtXUF7^6%WQQ4qO!G zALBm$@3f_@jV)o#G_O0?xwvxGx$wF^hg*$Z6xpoO2c35JI$o}FWY_a!esv%BciK{7 zV~gUGW9I|^HN~%cw}mwxG*>PvS10LVqc`uZ&2arT>STDXzx&v~)0SczTLz6eXHZVd z9e(}fiZ(Z7(LH{-dMG&Sz$@?gvt7Q;oZ4Ws`%Yb-8l*`g%BV+m#{`B8Vr2{pf()W+vRg<-AJi}!r4S*+;`9>p^Pb;t8o#fRa?#}gs8J%X2`?}EGZw@Q} z-!;KT<5e^7D!-SewCTTAyV$0~_v4h4*BZ9(ds$rN%X3x6HJah|v1V>_JfOf9(N!6m z^sL0Rw8Yd@a#bSzHJFP_a?H8;#e$pO=iM|%Np6zMrp>cT2Pb4^XX>>21dVVn$KU%O z;oijg)_X$|Gt)9M)3ei{NS`6xFX!(+QkQ3sU0}UmotT}Ls?A7BCc~2R1OXRb;HV(5 zNForHq{~dj9|IGJ52KnE%izX~O%v=|FA>Yq=rXdjnF-liiw6=4QMVmSGV;ys1hooY z{@7={omVCDQ5h-8`gCn_62ucTn!NiVPc9p}&|1VOU1GY_UB2hc#oH#FUT*K$Y*E_sac6x2?)QY`30@pplu5dkOJ(yuu=lZ)Fh>8 z)Ah+&$r`M)6ku&bB-ofxnKxm&V8Ut%Azh=>XC-H+rfaf_^74zEirbZ7twcOSla``S zNK7=b>rE|rp9aym&B;{zfgIo(<#d|0ucM+o&>jW5=0 zp;#v+%uG$DJ}D_XAxZBLT&?3pc{{h9mdIylQqwaHsfh_mHsKW?r54+e3a!jHk zyE>>X5kg)_(PruNNjgoVlA`>Q+&1WT+X~9;0;rAWjR zk~N81eOk6bpUS&FKHS>QDUBPbspQ3n=d#RRj4ma-fD(Kp{ai55n>SD8!FOl|316L< zmXKyJWU|3ive<*#b-Y;;fh20~Y3bQnS=6^Dq_Mw3e*(?IXd*tmuvL6`F={YAoUJ3{ zHeGzUU{5-4&pyGPYzaOa?n+L}OiMxA!cuP$Ao(RF7|@BP*^J}lvM(gEiAc~H85t>A zSq4p3I}F$wV*5vYXnc5fVKMy!8<@A^!$Ml|T`&9Om5_=iRPZmsxES8JZ@qbEHIyi5 zV93gbzmllI5-g`(Ng@7C6(lS0k~4)UXe5zDZcWKb%tkMqB_zq>6vTj;&p5no$%0+s zd?zhHQ+Q~7!B>r?P@N_@D-HQ8Ia!mCZ!~7-xC>Q>or1g2eGG?Or+bo$I}eO4ygVIj}7gqK~m_(~#0*&;DB zISmgB%=IieSp@Cc;nxzuEKPP&woYeAPv-@NTw@Wn8#8_*5sgSr(q(JYlBtKGsL>Wv zZ!ZQ-dERZagrI3I70gafOHatsWe9?a`RMD*68u&o7=>Yeq9GXr6<%Xl$ zd-6_TWK>$Bz-0k8{JC!&^*x@d6+0aSGcq(*QCX=cL{E}vd=*@dLi7U?b&)BqSVhB} z=!}8j84|2h4VV7qWU@~Moi`l>(No%LjfU`95>CZ;6O}H8um=gd$rO*?M@iM1ue90P zW`-sPQ)YgLrbRjU8k-`G20s#PSIXoSWuJs;*91f z&jlh>$3D2yH0;Z(ypt+`yQ<(6S3zI{3=Lall~S6a8p)P0NPP>&MPeK!Mq4nV1c%D2 zSWI9;V!lJ8NN&_NKeyP4J#E3dM66S_arwBSOjb=`RkLHgi_!^{Ux_mEBV4o+%KKHV z7GXj|*REA7svw8Jd=A1@A{@X3N9lTO^{hpn<>Z^HaNDbJifZ6cAI*D)rqL`YU6P(+ zoTC_*mA(P!I)SDkGxkTo1gw}{l-3zx$nRi)~dbJsvx43ea}8^3IH)BBw2D?sb`Y|{!h*PS;We9d2c=9!!?9QdRbBaNP3Ne_r-X`Al`al_VxSRz~Y!FpGur=Ui)Wir>J_E-ElJEh;F<|FWbb zLR7Srj|bGLSiQjpNq`N3w$2pkFSBuRMI#QOaCem{?n{w|JV#`T1TzAdE`;%Ih)V%5 z)d?e)DGpbw$3lb5NigN<^K&p9wiMmkvm8T4>`H`sO>oJqgAMY0V!MLy$gN=w587ty zME)A&yOI17k}rn5FO!#Vb92dqhw^}sR-y$Xt-R}ibSKE2FL4$3}Od%Ld?*d9I>lKJS zi5UDfE}cJ?$?6hO&TRm3buHdU=svzI$nQWKfStH03jx`S5OZ^I>4=4caNekGZmxeZIDXn~y|IY#VXqfIy1?QJe; z)uOO%NkO5xn2jiu*f`V0lBZ+zppf;JiA}S8R54PA@oT2nn_vic58P?;>iM(K4MNvnHE zZaB&PG#ZzXaG9(IljBZ9-CYQwjG{iPR6j_KAgQD=xa@({2PEanU5C`mIx>rlC1M6c zVkAi%8jH)c2#W;ik$+6C6xB!_LgtMkvEk!z@kHNeE!Id#erO{p4HuFeO_F^l;Li!OoLNI!Y$KDbh&0@d>ARAr+H)hXluyVERT}{;9{c>dC<#{nln+sRg<~K$ zf#jZS!X?!p$hnDfAK1uAHIn2+lDxGUm&=e;vTzY4=Y0l^tsL^j1c*%{v5Wg~@z1g} zLNtl7pK*#6QZcDM5}Zte9S-2)f?n3z=qE#Pvs6%86(l%?1QmyHIcp<06M}n{WT?Gk zNQ#YIi?2fJ^RF!G;LsgPPH{paWpCzm(pKp@E;Z4=SaSu*4XMj2!oe@op>GDsoq2-G zlNQoc(Y`LH7%i2vw50`*nn_aCpW!n1drMmy0+ESz(fZ81CL4)aByoZy{Ly)_X2kL} z>6yXwIG8sdie{6T+Y4N_LQH7pq-d#BM(PYI)Etr;{1TV(Eu}5*CkXD83QFsY1m}`q z&)2vd%9RTCgCHKADdP%eN>$E=l-} zDy^jrmi*%4A(fNbN|Ha5q}mmd`)nl1)(WLh zx0vK6e+sz~CDOb?a+5s~W4tm9M)2rIV*(odFCn23pFyZe^{MPul?r(kGOI~u2HyWF9fXm=w;M<4X$GfyeTz&xN0~Jwvmk3sNQPRoSfq>A4O)Ye~k`6f)oSKw=PNW)0$GvUr23Vevm{i29Y5pR#eI zXH8it`Dqi$HEj*K7Jc!UxN%S$vTwg2mr-CQDcc9u5T_5Un+deO4M2MUinBhj9urwP z9sek63$arF0hX$t4eOl1N}%shc1mj!qQSG0^l3WaL%gX;z~esvI2ge1$T(N_H2wZy z-a*O6LVB8Z;-H-*+L7MFiy0`BRoFO)O~F-@$~7uzZO+FGk`w7&Bz>KvzlHRNg7iQp zEzJGFV23G|hp3qYBzmY6qCIjK0?FP}M7?QFcn}e_9iuF#UrO&#|@BHkgtn_`5juL54caYA3#O8J|1-bDZ zm@o}rdm^P0D94C03g4Dp8i{dk2%iASo^4J*4pSi&K{!r?dp$wu2!a<8+*pZrFhWXx z30CiDhDh*=E=dybmN{8|Zl)S|Cy3X$4|uV|S#H%JCDYu@PLao^+@-(_!XQ0`LDC(F zlZ5Em7l@ufi1o8el-IKzD(?cEB0y+A02WFBM;Rast8T`ew#8EU7MMuq+eR0;8;2QY zsCkpbHnS27i z=(#Dr@%eWlR|ztA5+ELUL{PCRmQxPmD0$#%%?6j;&S?Byr{f}5hMo#%{KOsqmKe95XhT^{Bb6b@nfwmJlBrLW>U09Blrx1*>6UosVpMt zL3$j456_6y1|&A_l5=Djr!YCg(Od{Da)!D^MtwOOsFy(15-POVjv~ybl)<=7jJL!{ z$CFr1f$=Y=3^uW2F-Dw_rGniGm&u+`!Dh|@X*@{DL_!Kl9ZoK%{D~QughErx!tA2_ z_Lzw&WB%kNT=ax&TCxhHos-3x7@Dx6oQScrlxQ%wZC66`){RPXO87}$Yedk}%!f5) zvS-A5e=T?)O_9mc*}S3a7Ydp;+*C!ry^35hnK2XE6%`j2@f{Yk*9l!Zl~oJu7sOU= z2D|E1nJk5Zm*aK-=c3?7NQ#~b8~L|r%P6=3uvY{t-33^)X);+hgQ4K%_=4BA=NU@! zO=ZxsL3=|q`aaLnIiQL2ttu%cJ*T+j9h9b^yd?^q_+R=8lt8|KWRQ!(I8su;wERvD z3)|854Sw5@V^28*w5~Mu|K$8eLl+Y+Xa|fdPD>(goUx@9F%0Bx zMBZ~03M!18l2g}X!-#gU<+15rDazYXTR zd^~hGL|QYH5s$M7*=K-_2kcWG_7ezP7rH2x0m;_}U>W&%FD$nhTfK2ahAog^-Juqgvu)WHrUD_f~137_^-$Ve}#s-PyEXAp+mLf`*G;L$egk`pg1gY5okimcm>%9e4 zIWyKZPZNYMn?1zV8d@ElM4-zAT5V$ufqco~EwDnGf`LghgCRR23IC!Yp~Vs@7@`e7 z!W#Vqu@ z7O0cX+mT6K_*BM>26G^ofs9G(oERR^*x)m(&ukXR`As0UCejl3G{P;20d6I5*0`Yc z_8u5G!$54>#;R}|yf{vK%W_N_tU@B(`0;_*M)7;B(ah(Hu#Ch;E;KNNi1LdWicN-X=g8YyiEs^J#9BpwYks#*~ zE=~j7&o($dJ$^rhaxHttl|%;OLFgj+r(e5ApCKsnT*AI2>>$=CM#F^AUy|Eg7hBL5VS6ms4bU{pPAsfEVd3FA5F72%85CLA^w8QX`co0K!}$f zm9cbGSzd*!R)u@ND)(7cHoB@vwsD>5GK($;=%RuWE|e~%bm>kP#baDCY~_=_?a%+%YLG2LBcD>wW|NOz<^As75)!tcl5CsId~5*M#}t zTVM_XBMyC{83wZjcBZhlX_t?H&8AI5lve2d2|E#Me=RFr1%+=&;cZg*911H6b{i}T z+38xslVd~d65&V9^bjs;5!ixBM8p3Z=cDWmb{OQ3Km2R*|-lJZKxX z6y@OCXVpra;yBZlPP-{Ed4tNyC~hq&gD$aY7*mNmFut(iet~D&)x`aoxEsK&%^WXh z{-HNcu)TJSv}nX;URNBC>Tgra<0OWyZDv^U*SKZbwctmt0-Y zIK@H6#LyJ8e#pS)*2a7ssz-a58yAv|78k{91>>3JO~d#nAzF}uf?WukjbwdgGc*lf zfq6}4y->S-Ft;R&XR!yT*kmjVU-UV<%jOnKb+BJ)G;AUak6@&DFBESj#jT2=_{~b; zu~yE-u}m}2sbWK-wO9rly#idAWxD|Xl{UcN%o4yGtrB)R$vG+yVipriLaDHkpKbT1 z+R)<_9mnty9JLn6&V;P>BapY&$YfuTqplKTYTOkGh3Ia*R$~9cNDVl!4$8I zP4UwD^x6QhcmEgc17LqfY&ZF}a$FJf0bQl+B-(w3JVTCPbi+IFE8&c;WcvA1;5)Cw zrwQfS496xE)lN6p)N)*QIqsk3xP|59NcI=2aCNG2gWb7JHMyfT`M}ap9J9w?T3z5+ zSkvS&M^nC>Kb1X>E}Q7Gg)TIT;ix<2SZ_6eJ`KjjWhH%T#)1ZIjjKWzN=n>^Xdv>B zsI7cT7ixo?nl3SPX+f8EZ)K+6>bw2a1BH8}K6wte3WMD~7c zA;J>?oYQ5ibi|AK3#mzc6zZ*F}Z2|am z!7n{4quP~M>QjlI{XI(NpTx!W6qVr&{pUGcT%OUVS9Foh#YI77m)fFj+t%2rVg5hc zC z_hy#nXRpM@1^m6DBV3pxj=&K;NVU%fsBXLipF%i29N{7#O+hi5YEtoUYZ05Y&BMfQ zdQKT7xno4IbsYEVur6mQf6Iu8ZUAoexJ6%{L4x>-w=(2<^iWm=X{H;wQub+ZIqph1dAUklb|r44JGr$% zb*_fQvmAL=PG(i6RYX2r(4rZiDK=O#1=;I*4GmV#`bcK)*JLFH0oR!>J?X;Az}!2D z{&Oo`6cbPeRsczGN}~h`H$&ViN+qH_IajGf?PE})^Jnm>9&@IvTeYfO?W(*p$t1r1 z6q9WfG{Whgx=-B>3K~ zpBH4ZPzL6WXZ5Iy*o z=>W!In8oTF<18xRNhs`33cqUtg_*x#(T`k){W+|vTiR$4-}_`QURguPJ{kuQPxB>s zd%>$Ajm9OS_fe<1)~HqN-LQDRnclKIN~X2J*zz}Ooz0p8Rp$~u&0$T)g|E*Gl-d-t zL?Y_5VPOY;;@E<;H*F5prTkm){_`t_<14(L^II<_R@(~i3sYO@$4w!ww zv|~ZWw`Z1lS+1Hu4rIwmK_7*BV&er{x=k<19!$h>0`<%T$(b2BP?difpH4Cla4uMT zSXho*Qjt@T3IUG%{b$hY$hp;91AULsU${~^xat`H0X@cD{@DlezzY#1y_R1$ zmL)UTv07xZ9Bdg(H$;Iw1fOOvIofRZ^~p%$%`_#5fvr92f=xdDCna!7U=bDNvPQcgS0E5QR5(rhQYm| z>ONGJ#!lQpUr;?RmqkS1-(b1cPQ!284JCm@5p4WSz~5THZBSp^$J=op=MXA zW;o=?+TBxf7)HGBCVsiq@kEoRa8KJa==H7 zm<%Tq=1zwRweI0%PQFNdZ?*DWdazlgY$cLnQf!PM9nWS!M-S)-W4VK+15QC@6UxGm zaCy%c^QW}noph7E6K(3rAqS2mRmW#R)ra?GvJO^Naz&n1Rd&1LHae_B@)J!7ZF0=! zd}(on6(kBb8p@7hKAHz;iw81UEJ0;17`d`~VtGuFFM$`f{S)lb#P0hu*lWSoF}AD7 zX7#`;pr;3GrMGL#-v8na|KpDXV@TPL3!yChAwGHYj{`2l-T5a;zS?QfENIHeFKV6t z|I##;G*ws$O?w{U(+d|?6V>sW<-=<7SJmWI+_@(1uK9uwEq#V78}hS`gSMw}tmF6& z4^td%apLH)ilZ$?eDo-P#wP`h^aXp#)Ia-(G>$Coa|o6uzr?4va%SoKJKZW^MgtXr zr#?KMeD*=PdLOVy6OQ)Z@%q`r5_`N*Ocy%>WHsxXxt6ZLCTOj{7w2>-&>GakhGrUb zxLt)U3T#{V=L3yJ85<|C2Svpelv*gSrGwPA&nYkxH?g1yn&5 zX~}gcoeiZiR8l!dCF2w$teP$5qwci~?Us2w_Bba|Cl1W-L)}DDr@RSuLnNxicfcFvU`ELD zA~ky|wDF%qhMP?|BfHW}@hlO_xS=`JOIp(uN8mr^6KGi|C@D!U{2x)i&QO zJ>SsUuBBszg1XqCKoxh*3uS9pnUm$PR>Vj8by^;3NyBLX43I<{_P9RA!Y4QAk3B)OoKV5S4*o=Nsp2!lPfs==P+GCk(pUELnNFMsjA+y_>0 zv`ER(5+kQjEOgLF3-HZ}KeC&><2U9zsJU4U#anEAF+rQZz3C zdrh!O*5XMUM~XLTPzDr1T=95{BFrWQ6{D!?+%d6ERVU|NIc^fHCO2_pIj7j~sPuQ% zS0rjBTAxAd9Mbw_G_;O_RzE&qST8!Bv`(apVy9Iha+i)494*A(E2mBIS;UHkeggG# zNqzZPsQfqo?R~IZX4#tQVlB#HE2;mUZ-kBYszBfp>tm4bTF&@ zG+oZpg^oIv({ZJ8I(Jk~r-#bv7*IJK<>{i>Wo@Ej#N(wO@uL|0*5qS1rrJbfs%t;M zM)yxSS!x^jSXPmBzqCP^+eQh2nj%Lnfum^TsQx)}C`ZSGx+qp#Eog|fPw}80n|8sk zCeeh8bV_q6Iq0Mb$`hfS&!w(dT4woytrzd6rl?qJ)sT{lmql=pVM*hn9CL9&zF9b# z=#M`oZ>18qDTLBVP>NY~8^4*tyNA(ugd8hRk>m_W()0=NlIsFTkN1&`>44= zh3(i0y0$@AX@7q50lO8rL2L}ZvK;rY99OlxTb=S;Y3mkXfi83~ zs+^85mD4$-@`iMwV?X6|OsBjFUFaN4IUQUnr*kOfU(d4+O1 zf>7R$E_76&oDKk#)0uv91?O@*X5s`OE73B`ZF&0!Z_LmXF}*~} zo&r!w=ctk{kARxdP*ar#dzhVRW~+g?#OF2rNewHhAmc_t!zGD^L8wpWR6I_#ZY`e0 zDkz|bda>f9#2Cw!gwKel^+N zXgsw1yB;TNLbkieNsB90FHSU)+H5yTondeC2r~KPM8E=kI9WC`*%h0nSn?&PoQG}! zl$r@!Hnn$z>tdnXCoN%Wn}Dl&l_R-l3r3$S<5?y;P5#@s4WNlA572 zNR2Ni3nuI3E*mRy(8D*JRFH9C8fMjb%f)tYjYP{Sd=%F-m#~hQRc3*i<;U?8fSk+Y zik!6`6=`ZuAUi6=?Oamd2XSwC+QDiHxPE^Twuff zIavg`z#iL>Vd<$gtB8MK=A9uKcsOe_;?KkcDBU&q264ENG#Af@=DyJUCH32KH+tcY zdrp@Mm>!Z>qd6i^x+v&}mK|);wkhmdw%xvFz#w!lZC?vo2nD_YobYB0y~Tp^)$Yc4f2mF4d=&<2F`w#X80qVMT#WqFLgfpGjle4e7N< zKFIdbr=xT^Nf%}n1u{qF<)}6}#Y(gjXG^>G!>ilWsrYV&Sve}0^j*t#Bza;A|FNj>ue7Udm6#$MAs>JPZR&@{0=G=0JxfP+=sT%iVw@qDv!;Ud(j$gNO z;h|Kg92JOD&^AQYiQr^$b9PA)t7x1EZ!pmh@JNL{*m#Xz;}smv-fF-@syKy2hbU}A zFm0gAK5)QkJ zsahPCaV*OTnDnBzDJ)r?EbW7>usexA=_2^^z-Q-*$mQdK=Vs7FK@Uvgsjq)Zk&xv{ zPkZRuMSAA^0zI#x$CKaNkL||_ddY-dTKO|@$Cvv^#eQF?*mMahBEmUYZT8-YoPVQ5 zL2t>3uK%OHvaO6FXgEL`X8Z~bCTI|k#iiZNviP>>OIx(W5_K8%VY~I7uM9SH7WdKF z-C&LVub_E1xv$4%XdVI0pOgFK@-!&s8q-BV+wxI9t#dEhp(zlw(m8zF-%A^`0lE)T zsq0>a?#s~4&I84OmfjF5yWVVxmKUIG`!XHihX}ro;K~U5N~4#Y%C59BR9Iip`W*Pf zgr9N^_@=;%HAZ`yL~l`EvuQWjv%|mK#H_aQ6Ya0ze<$^kAN1^@`ss2VdP<>(y(j}8 z(W_cw0e(l1ZLoa;iRXs~e?a;NB->mVK=tBdcD zXFwE>C89S1ZEDiFXY3EK{{_I~WMZAW08R!_46O$kjykPd`-DkvO0oXLwq}JNTWzoU z8BS#)RVPW+Zm1G#l}5hrOqtSgFbi-x=7Mu~$FdHM@5N}c@tl-olUt;} zkhbCn&~b|Sk93TM4l(&|!z3ScICh%CN`bzx@CQ~y&fZ+tA_9IPY{>&)PXKG%S8n9t zY?xwG0OxRP!i@v?5`n*Z2(TjBns8})64Bowr!DIp9p8r+clHZwt3s7)g|o4+=1VQu z8~nrM^QcGQHvr$Ab%fkmyl+oSbqJ}FB0et_^50xSZS9X~6QAnrERoiS2lO8y{TE4p zC+HUw{WPYW*J+y<|Cn;y1Zgw>CnkcrP=1t@4|)vcE1+CF!HFh-W$|WgxM`6~2MzoQ z7nf0J{8(}z3!Yh^`&X*iMo*x-Do$nO4}6nPhH7pKT@*AIjmAZ9!~JywBn_<&bYCXj zYo0=Pd+7d{(l#0zO@YhebLg4me^qetQJ$jhBPc#b4qx#Minl>Aj)uXoi{6-1&{Cpw zSp3JTS$s4kJe^u_oba7q0AC;HS4zGjLB;S++P4@Q;vx|Bug==|cAV>QpSyck!*ZhJgKs*zGv5Cxacvvrkne_HAM_1qxb-$Es}+9mtoF z!yh9+N!nHqzKf7|w@rew9nV#V&bOrVxg0uoL#GG-Sk$p9$KE+p(3(4&8h|49W_Ov2 zFp!aqxs)K6`r+@#t|0q;j$9+899p}iDFL=5S|$yT*#?^tFUn#aseA(Z32OLDiQW+O znq;?&oUM-Tg9c7P@60ttLsGXhQC9dotLCp%pKZJlD41Rplv3!@dr7&?5)cE zM7nk`g`}G)(}h`r!p1T9jV}0 z{~_qM()WrVHc z1VuIYrW=_aQ4!d4z}mFFVlcVwbWyD4@hru?18;47ReCQdg^w9tyO+CpDzGlVdY3G<%L z>ccDJ9DFFIMe*BUaPVLm)@gtpLD*x}fei!JcDQtrhfDqUF1Xd+Sb#?oc=ZPW{~)n< zh@-uHH_o=(zO%O919SpG$J79Hn1i+b9jz@JZMC&LuoDUU-w%P^Be7LmmaQo`_l57n z%ku1ToD4UOpePa1HSN$N;Rh5${0P*(5=+OGWhrKs3X5=BOqrIp0dpZS zZxC~-gQX+OveXILYH1#*i-@|v4yd;zmewxIQho`P9fJ1Gh^+_oDnkGKG0-0*+Pn6H zvJ5U;fz@sgz*iG|=qG@u0WRj%?PDBbL2S0-;%ylT;Wr%7xPzF*pMqK9VDKiMERBUS z$yQ5mfx45Z%{~KluEf%OM@#wGVn-V$;X8$~7rhKy$AP+!sF6xgk2=`;y`!z~U|X#n z1@3<0eo`0Q_mZrBrIYKNKjzU{q3QYU^Nj{`tHLrZzJo>V!$f{fwJTN<4n3cl34 zVoNK7Z?*ac*hh$c$ph>kBv#X+@gJLXl*F>*yrb|->-eV~G@hmL&t^|(90rZT`ph0E z*br z{UQ8$!YBIxpP$T$D}j&n=xWvk8AZtqBK;OXD9;!P<= zL8b#?ora53tfNZ^{wu*pssN7#+}0&@X1UXNDU)w?$aJtT6Z^;dU>Ace_DzAqoCgf+ zM(B+wa=4H|ZQ^9#hd9`Vkj;aE90#NjC;lLEp>$DHXYgG1U9FO2PMLg23r9z4+(QR0vL6w z)h9=5I_n%Vge0WJchOthT2Kv{>~;t!s~dpw4Jg9n{DGR>$(op(0?THj0bywUmES`t zcvlI^GqPn-6ezMZt9Lg!lc%*+8~M7Be@^l#(U6ap$gd!I>7z1V3`eil0pcYg&Jm&n z2-|kOm_X7*X9Zb(S`(001lbq^$Xr0gIICn|4h&J~xLs|DF{e18U2#dF@Xa+s@Rjvz zX-w|?0CTjYZ9*)x9hH`Xfb!{WeHq+4rZ0WqbX zv}Zc{v_D|o2)3JGdcbUbI){)_pE^TYz1thO?u48FIdK04PW0{pd_63_B-(C&lR=1B zNx1p}(Tfm$ffTVXc=WD~B$pm4Rk`xpk{k3i`|l%5(;o=Tjw!I?aT ztBw4}knczTR5}_QD)LR39egs%TfFA&mq!N6Yn{7q$@{ZL*l>S87 zsRLyiD7MwJkU-Mvv4X6XQVoy+1eu!v$QeMyO1V|N?C~=?bgUWj^~2^2g&$ZG%ckl$ z@rby+6Tx-Ow2YI_SLd$b*!%6E+k_)pjD+e~+W7zuCg4ZO0A>SdTUsczEv+NaTI$(= z4I$WTg7pMUEOk43yJ%~o^JTYx0Wy>zXHo!J=wMM>dyAwft1az;8Ah1(dSI?eY>5QG z$p!|vDU3N^*ayS^H!W!h>9{e7!-+V~0AkfF>vn|(ze5yuy*Ln?fH;DPDXAbvNr+zd z{^H%v8|ZA&&j8d&Lft1+OQ3A)@iTj`IRdS|O9E^Z!H%W@HX1Oo9`~{DMVAbRfT4lb zmpGwUh+M}Q`w+M>gj<{r+-3*cb`n(DqMSpm_PGN%mVm=E0DLa7FCQq!lqc}S_i%(3 zMhRXV9DBPX_ozWE&IHjT+mZou-8mypG;KmAN{2&Ek?e_$y@}t3KU~Lh9&i}YwVhIiJ36)+h~vo*ZrLEt1<|(Blgn_dBiHKN%3w|)=5=CT0#mH} zDxkG3Z0l@;CM&Z^oNSX0@8$tFiE!J$0PejngiXg-4t!P3X*0A%Sv^X0Nn>0E?iAu0 z8iE@JuDEyTA-GPf%3_}_RNBuk0d*Qt9}@LjP{k^`K~!l!F9v{x>R3Hg_UT0H-3YXi zpxIW>Wnwysdwj#aq%B#iW)^reh-YjJ-hS}Jswu4Mq=STo*cU5&aY=SgfpC(b<(o|S zen!%NcB_Wh?1`V+1pKGqOZrbURM5D zq2p)Lp=$~qt)WA7)U_%sKjatTbzDgnOXPha%?LqYEF^}q85o1Wu$?Ws$dl{_S7m?} z6X@+%099*bNiFBAaCj3{aT*}|?uand4JAq<-WvujAG2%~xfQ_UW#@ZFh z8Dc3RW_$xgZy?xLy`nK52EwM%SS*k>k56I31)AcDY!3OwkQbZBL1*&R?O6^_r3|Qq z{4&zNpX6^#cVT30*Qxc)I0a#9eyl(-h*VraPx04OhCd$h@h9FT^5T(<1ptJzR zwq0%_kTe9XAZv`(0AwXWnzsOC1R!FJeGhSbyF&@T-2k1wgulREsE=n*RJDztv8T7@GPvf_OVQcR<0N?=vIG_#yMlTBRdq3h}^IPRl=QpAJlTel&0VoFpN|4|C5|GVr zACS-QR{-Qe0$ETGAZG%I;WrmqM7C4mDV%`l@;6x8mWxr^-uof)Mn_U}F~Y{kiHO?| z__y{0^fw88;1WPT7tn*WaMeQ}X-O*z;VU9zI_$g}MZLwMK3|HWw%*?-gaO075aM}? zvHmw*{r-%&-M0z$-6nut0kA;|7?Qkk3PNRsQ2zmCyu&h{JQ8JmXQ9q;Of=$_hX3zj zn9oadY({yD4)8^oF`#IWj6ALN#_N5HhwNk6>kBNmdl}089mqHnvvmSv;C^7t*cL5-b{C-S&rp?|{)id7F+b-s#;SbJ%cwPUqcUVIq$j*~=@*c$ zG)@?UzJ^H8Z$mND4-6{}#>0iwMh3XP4&iZ{uM_69qX2U`U>Y65kg>i6rP(&ZR$#@u z6re5I0q-KfE0d_5ez&SPr`+$+&TiCOM%6ly3x(<}`8A|Cs zN1bzoZLxB`8zeDk{Z2z6IXpKBP5>#d-1A%qYt<{!u2hCrt)kOx&I*(<|DaH%b`rP* zh$)Kr6U+|{h+w9PveoU`%wOqucE@xFD&h@R#BoQXxF=DZ>6jQ~l}TJY%+sai9{~6k z0ggEa0P_wGOA7A#0p!~R8UHmv&HzXwEDXo$MX^OiF$J{q=LiznzzW?! z$VUQlP`5GWYvZ~ty_k@C`xM2z&tjhbEsFUB#h5OJGm;xGz*C;ygi@%0R?Jj=zycol z9SW#8#4ms|ZM|?P!#r4kNu0|2ne6|^?*aTW01q;WGkP1RA+n?p8N*OgHy0RRd@M>D zf2dCeCxRl$h?-joV80&I2*(lTS*rkZ6<`Lj=R8wy*ryi|Li$k@a6Ak6&G9Ip|6xAT zFT$q|7f5)BVj5bD2!yXT0tk-Hm?r_%_l-zk7qcz77OR{=3IayH-)l6L^`=>+`dsQ`R702?Hm;dO~d zGT>-Rx1i|KI(aHUu0IVRKS{&29)NqrH4Hz5@@T-nhVZXh4fw5fKFTXOgir4qHsXme z-9_ePb`Nq2hF@1vJ^c9$l>RVEH$BL!7=C4@OO0y-QacHt&LZzqe*~!9BYZ;s15nZTK=}wz&DkV(@GxrjWNp4}1XIUWJbk0?m3=K|(|fT`!=P651}Kk+h{=2&mo z`j9Q(2~DIoiR{sT1>mcK$P#WQJrgqP(y;xQ*q(77fW8Hw!7hYI_tqT4%n0e22Z8e^ z1b^%W0Kd4=Z<^fQ1HynY%RDTWLtli=ndYf&q}29npP(-~m#w<-Wt1ot2fR5&5Meet<{niG=B`#dq5hGZW0Z>LO&Fw%9LqyK{Bc zd9^cVRnDrJ#T7?Xu_i{vY?o=hQ}YuTrFLHk8|8e${l&$A+YGqF=Wx)))91Fq3@uMR zBVzktYr61ae6uW?%;LxN9Y_w~cH-urpu3g&LjCB#Ei{#7$2^TMgOHUmVmen~3s4ykK|94326iF84 z{(X@3ImsGwImjwqigh`Z`&>EwHfJz*m{**^p(=_ovuDpn{^N7{<&rI*ApaN4f8ko> zzX|yVYc0SH(^S^V#`erLvX(Wn!xhN<5i$?aHL}ex-2wZJHM#@707lZ41aUV(?9>$M zfQJ<33}#!A6<2H+SkH+4ka`hO7!7uh#?6AhBz^z<8{l^X{upg`Py}JUG^$B~G^OC} z!l4XD8E+Ux@3$2tVQS_0NOaF%v8bD`L{WF3s4Z9&r!(s}rMlrwhi^+5TcM0~+({aOlhW0|( z8#xL_u{AkyXUw4K@)_}owfNV;F>q~l#X(q5GtEA1whXgn@Y45ShrHZVbMu^EuVw+@ zqzaBVi@gB)I$(vrJZJCR+S>Z|&RXsR)!bOy*4os98GsHXIck_r(tvJLdE*q4FlL$? ziC+?a8vMnbM+PeVYH+$9Hzt)s+G^*w@|j!GRkf%+kPWiIbfu-hy9%AF;2j6NzoC0l z5M{5^%GM6*gL+NGjXhI@OlyI6@PioiKtUmBzHwq70WaN8KuoBbDT~|c~O6rPSziV zKgXTb=NLdzW_4>k(ax z@vhTI&|_#&s=K!&$TVz9(p0oX$-NA##=Iuch0TMPv@|v(>X+8FGuef3BH=IYl)|N> zh||Y9;uz+R5bpLDK|YDSJiVG;?TMH=W4czVhl`3~k<4sdT-ViXNsCG&Q0@b&0wouC zTm;XF!ed5PXJ>1Rs@??{B6l=4RJCBGU;U8_8{zxxu$XEkUC`dN9NYRUNo?~aH&!Ww zs>;#>_u;;26%`A1nRNiP%8t?-#T*Dj_ZnDXe}^{DgU3ZghscMdX1UTJc}@u!CW*>$ zG!2VXm;y{YO2uEEGjmIi@ha{SyMrulT0*|BQE70}u`dE)_HPZ|YoH-Dn?rSusb3)w!eq(}hU?5AuNLBxlZp-TtQ7*{YE3@65Io zL}NpTd97U?jpbeK9l-+`wQ#VYCLs4VbNo*TGzwQ8@WuKQh3xUWcD^DlHwLtF<8T~c zr=Qy(T(Qkni5x4_R9{hr5R}xZle!)zTi;Vv9Nwl92=-`B>`?7841U^ov2hOREYiTb{vbke_ac-WLsxfdn1(d5v_IY_Fw&PDsj&$AG0KZ6W# zrKPmhwaey;K4~%p_L+4z;qz!>lwjb?e%fA++W8WDspT(F*nvRsk1UMm&KMyMu@c6K zYDVDcjscczj|zAn|6-%O;xjj66;7`3eh6*nC-U+T)dEEr7qnV?toGh|Ut!*#<8pv8 zhnq86t)tM>q=^igjDpZ#x3)uNK>RvqH@DVx?o`vdXxdc2Dk@BjD#H?eIeP)Fup3C` zdzX_*Xgua1;8sj9b{yaXfTC5VoLNaIBY4x=CxF>kQSU4OG8G*{wASpF)S06!O*5iA zJWqOg5IXazwcicc2Dz^_d?su7GKdqpamq+|tKg7CttO5Y!Pak;!``TNzIX@v`5o~;K&(p`n@Q!CwH)nfFuVWL zK}4oOtU|8)nTz}0Dy3J3sc4ToL3M|EohnhQzJ@&vb@DT1!jWQG=6+2bO)$P~AQVDR zj9BJ_EHg({qpTbEQyU+xdQCrbkC2Jo=`kjGiS_xku7Bxqp+6cMTe47i$Fjkk2@q&7 zQi#ZrkAU`JD(%XS`%RYlj>^zm%e|F+;Bi3C^m%pdN8)@dG-26r4QCJ{9?0Wrxb9D3 zi|BU+Ga?6hh_+d^q6N+uKabrorI*u9YD=`rFIe)e7CVI`w7{Kw0G2*hP6A~D-2_GY z3JE+J6*x~>74?2DZyrLWJ__U1vsrf+kR52hFw-$7V{52DlVwN$Bh&v<VigIL`w$qf9)AT21RL8BQ*!!)D9ssI0p7rbesJ z4Oj8kgv))Uo$1QdnbEkkZh4b!FoxP%S?&BCgZP~Q#yrms_zm>dGL{c8KBVbiV9HZf zrOrkZ@tNjr{jB)?1nTG<@_UW0Q`S(pTeB^W6==Yxu@RL3x@`!|sot-%b>TiUtfJs| z$HKEI$^)aydl@FcO{}4xK!)spoo053^=AZ@ldZP?XaK%1kvJahXWLn`n$ekbG}*Nf znku(I?l=#JP0XAMl{QUzZ547;f!N1Hjz{-7(`lB=c-^)T4hW1pQfNT8lN+^?L+#v7 zU2kU*f;^K56ooC5Lr}L*uo8HBki-KS-C=g3^JE_9J}JW}oWiE#N!Ah7%57R!=m+xa zh4}FNDBAT<%%w8O_#BkHPR4ekb4D{0!u>p9k-ncqe-7}~7*W@EhV5iP2ay)X1C_WR z%6f}sJ*Tu5dpw?k6@5~sQa(H>^Gp^x0&<7R3>kGqo=Kw8p9ocO0eQLrWq?`!I9b`8 z7HJ_gts(LyY`AZmmNC=HV=G~H6E`y@&zCeZSq25N!paa5MsF-op-;h963AuP_wEQ# zzXFvS>+twWw3-DuP3L}0T=o!wq&>kFozb2^pROjyENkKrG=V>o)q7%qHlwS#8Lnbq z07IJQ5*+0btA)(WYi#LaQGQa9dsr*tDDfxyQpuwT4gAp^+YrdsxKb5PLnK!vx9_Yz)4Z#T-PnFE-$##IP^SY_SO zjqUKk?2Mgb1pMC+=%yT=;u=<7L~ixa7;=|ep9Sr=zym?s84`C!Tk{$7;mK)$`B__D zwP=2gj~-r0M&obKJr%g^J=F41a=J?|9;1_TH_UF~FVDG5`@MyEf+3*#Zt;3EDdKHN zh0G(N>Lv4Y1ErEgemo!PmEgI2{k`XW5BO0n_;F`XyJlgnbS=|v;rXrV0A*$Bc=aG? z+UbPs$4xami9Bc5WNmXp({k2w_Z_fC@E7|IaZTzl4?)<9EmX5zo{ld>rkh{_{RO0bs3`LS}RgyesiIFk(P^xY@rS=OeCzHk|Rh5YBnDyqXn_b=dLSG}esG zDelBB8R^v4c62s0wbs_RE?d^xQoDR{8+PaITwL3MHV4}T4&C#?wC|~&cSRVPbrd;u zx>@zZNm8v>DKzJTqK8CiN`{Dx`Dsf^yce>92&vykYW(FnJxap-#Q1ob`FMqCoAykh z)qG+nk4Yn@19j7~*rVhoQ1SyPi93JL^^ehR?abB{IAqnZi*KZ=pEPQR+VVbNMlTT% z+TI`(&r_86(|7nv0TEg*H|X-S)kZCh^Bfo3aan4~n{G`^qFNe`&CKu@cYbfM#bjO0 z(QS=kg~#?I?*(xVSVUhA1mY`=I7u5ZW;lS~j($>rKdd!sbu&7mb|vd&%`57ThR2aH z9v)}x1X9o~rl5Qjbjjq}+GV@!1jsL{MwaJXtXbe2-2y$pfp*N6V+yF2y-NjDM3>-{ zOmCj^TNmIwT=W+0Sa5GDD^tUdIZi2XxGZF*aMEPAPE3g1tv>qRPKEqBy{eGj7){N*_}um-E)^S68RX0&N`Q+k>l8(OHu zOHGr3E;YRqfK9`sDgMwJJ)%Q0Grtv6iuH}0$!lscQvs$*LTQBylrZ4}d3m<35S3BY zh-!yrU2s*X{ZG6awo?hLr3O|hV3pb&wUkdScU*4ioY~Y7(aqWE1f($}Vwl(i6Spqz zP25*-roFaPiMK80PpL|XI}b&MddPUO!K!Iny(>-Z1$c1Y{BqAq4MuQCfQNDecuWeW z5SqLg4|Z)+GqFkRtm@A8#?Jbs7HT0?uCOy)LW9V2o(6W(E66^WoD+fMyrv{4)^DN% zW2_B5ZJXC6{S(UakCQ1@v#){yRZ}*ja#rokg=PEKmd`1hKYvzb?fk0p%8CV)+!;8i z1)Yyb3@fAry@xWnWW2YslSh4+X?$c@uuCt;hFe+aw1VpG-o}{f7e|QV{8l!HmbR`= zDp0LwGD;ytCI$?9d{eJ(`8=E*En-btP##QDkUhw*1FeV95k<(S`Y5&NnPDtswdrQC zP8Gd3{5yyWu*%4DHXz(pYQ=Y}cqS+HM2iv8>xY7$)CsCAj81r{UpuVLjv1|p(pa`o zX80BTemcSFc>s~B=>}CJtYOMVM<>z88x(m@R~Ld{_>pl5YAB4?Vh`^ zhk9sdNfCDr()Fk(x)o%ZNK!&#NlhS$kaD}>9Y>LWfQ2iyWo8z%f__1nz^Y)_%AoiK)1#lFH3S((J2{{nCJj=mL2EbU zd&V?|8<~%@w!Uo|TQ4;PK?;oWIF<7kQ$rUZv`b({glhqOn*twqPSgyc*m{a9#G2qY zVJqhqJ=>|tlH2M=9W`QtO+4L^F1uT!LdM&5tQxFX*)qKDo0Z)S)?cW(3yCaWiZQgs zU7RPP#$>gy+m|)9V1O#~>)mL3F|h1>X?ul5TI(uRt1yAS4J%vwvvA^7!wI5sydFII zoiuq@-PTx7>2F7A_{(!r)~L;vSfru6;xF!88r7)b^g6O;X;X(7ETB<$ff-wKDGGa5 z$(F6UQ4SS1{$e*wau&BYu55Eo><@z+EO`i;>Ox`38Ie73-;F?;2P-e57-H0leLL*n zN%1RryrB}mU|T^5PC=tV(mXTl4gO>J^NT3Kv4cM|nd`aa?j=#&g*nm?QYslaI|V?V zv^z}I&T1bz((<~I7O?(+v1GjxMsl7Lix&&$uZzO2x~r`X!qkZ4S1^P& z{Zb!<;2zXNe^CcsJqw87fsm_G1pk%sbnF~xkW}x z_*ha>T{A=a&PI$+VgI77<5*?WX|J);Daa?PWoH5#%uG?e;W*xIV+f_ylE1On$> z($aD56nq5&j3w+Rl*>Pu@Ew8pBm9f+8rj@qI)4P3; z%OU*g^TOH+K;`HIYN*x56*kT;R*{;WUnqgH4oGvm`4$sPyI&22;PN(tpln#neRi$! z2F&!l0d~~*+{VT>9b8n70e54&70qv_lUhh(20^<4Vh<(KoS2J)PE5LEuMkyrMQ=l4 z`cJqd%9Enr2E+Lfqk^bjxTdwu(yCNlnLA3%Y3t~$!wCT6X!7Tj6?wI5>WpNLvfc&t>W*a-9TXAZ$1`cFMA!)ej`h+}Sk~!{)a} zI6gD7KiA30bN;G39JJ0QGuvC+(z~R({Gc7Ew`*189mIuMJWWB<$YEN zr6BaF2s_QT>(T5o8*20hoP9B?)Y?PJGG&cECfd_X2R%wMc;*%gFv)ay5>tO{)}O8E zeHo77>6}&s#CokYVq7P!f+IVn1>n*dVOOzguX_4YW-)wdnOkfBxO0?-Vh~Y)%IfPI z+u;46Le?veR3wBk?}Et%xd%Mt;(1Ps>Da_$svQZ_l_3^)cCt~og>QbEA9^E-i@j}! zZV|c}R8)cgp8*;CPgF1m9DgO_tKr%i=2oV;GB43lrsi;Bok3IBfC06gOA?ng1T{ruIk0-kRq=$HE{rvt15rJ!s2+&pihcgBF8BLvV zG}axB6}!l{po|u4cNYmnx4Cw!G;5?|h32*I!(N5H^m_EAvE`%EldII8Nx24T*Ga!y z*hz;w{^CxBZy_w4#kI|~)!39~VOdSp!rIxhX3d;YRzA13refZ# zg}^^xHLSj`YcDt?yoO{c_F8W#X7;NvyPep9m*&8GiGVy4g|9{s5@16&ro@3`K^qK$ z?$zkJjztt2R`MFPtWx9KUsSgSM{@>aADs#2WNKP#YOEnfZ?-;+B^>=*yEr)1y9e#^ zX13v{qz#2V&`SP?=cy4}p3`c4O8yzg_m8T~QVB{9!r*jV9Cy&|Ai^ zHThntoPcb&c+J@Z{Kd}6b!rj(*V3x}$e5}Dk8c&#_>?D*ShysC9l>FUek+*ngR!bN z@@R}Ae`aHI-O=+~+p%`hZ@;~e%)v%+dgnC1)r-EG(b|9rJ7a5PwqIaqypGNv{rgU! zd~eW)Klr^p^8EhEj}e&(v-5n-3IRFIkONFmmU#T zXX`8pUaVyVmQN;hl)RSG8PzCUM>u6SYO=ny?PzhG7*{T~cXMu+;(le?ba3zphEy7R z>+p!O>kw<}u{gSH5_6?C{w?7|Hsg(oJF`5{w%b9+_lRf0a`f9tgiOyf!Lj{wBIlm5 zh7QgO1(cBvo8orHF>;2duvECHS|$${c4KE11MPh3qQXfzVf0%M_fYUex)~ZuAjo^s z6?BHj&BVNS04#7lS5M5ZVht``5~#q(QGs_$Ydpe3!&E~!{>r=$iUx~ax`k)nE^lpW zP(I&F%)oOG-OVGvbjuNN<-Ne=tdxix>tefH(H(y9?k;wN4Vvt8FrDr*yLZDjw;Oz4 z712I}3Mf-sgkIb640e1R14H4!4UA|)_&Kn@)Pk~^?D(*ZgMo#mVE+qHg?|NAdCqjO zSX8Jjfk;95!yoJ$52eU1TGmVXG+JpEL~fHn7M`GNbMZ}>r~xWyPOsrF&*`#9^7wGI zL1y>Nye71=?A<%DJf~u?Cn?_M6&;vPlTfj^k(kr4+t2j!s>((4=2zFwsi>)4IIFy- zc1~I4?ArY+X4cFB4*~`b&@PQT!?m1Y;-Z!f5T^z-pnkAbNtwM>1wMk>h-gc{L8y*_I-|vqH`(T_>S>jaD{6G6z6-`C z9wg?xP9!cdjXh`wp`>P2xpC)q-@>*dM%jzEU)Z{0 z#u73}&k{ye)IF&Mq`{nBA|nY@;&08)1vOLU-3v8n`_n2hinMpRKQ$!#!2hD*gtb)L<-%OM6!j)}l(kN;aw_oSeAx zVWtT+*$Ki2mT@|bA!~Q~wP;I|7rZGOX&On{h{$pETVZ+y*q)_61;#_;{9d!Oxvq0D zly$|jMlB?VDr-7cD?-wCM7u8~983RGdc`Um2~V;`?y;e$p{6&vCu^4Ytf^IT8)^c~ zhmbDc#mKk0&PRtw{UO3#)S|she)21j{9zHfZFHq`i!IE^+a_eV!u8xiSthntbf|d_ z%ceBSljj_*8kaabPdC$vSDR`H zE{VZrW44JIiq7Ns4{;~K(LgATbSR!DjE3iLBlpb`p=Xc#mGPFBV||8g(o2-Q9OV*T zsKIQnDus(3pOW4PO0O!y1R@6d${U&;)OH+*(D)c) z@Cc=5A30XiI$txQ9`=J<P+RG(q|tOzm31B7 zG9`dG&@fY_}W{;g*|wB2@Lzbo}fdj%KcHSVbU+nX$MtEF%up zOPlOip)@2;%8iZ2ps=ZBc^#I;)H1GaStF+LG3nfd)9gK|WDwg^V0_$pR9gyWzbu8* z{8k384Y4padQKYO`!x*mzE(* zm(N_A=cYmEPT30H6@0wU0_bF{h1JfGJm(}&0Ijhc5b=ATdAVlG$WG9*R0#~+3u3g} zx(L!+e`ICj^2X*0@SOUmP-)UQCSR103pR??I-p$^cDMA=LzMuhFH!C}%N*n=@CURg z{N*`M8SkFu?9g`7m&R7T0?yu$8dWP%i1QXB1rprMkuiPH4-%K-*OleUQJ#LYw1cf3 z|LthgZrcjltNaJ+!G3y0mTXliZFpBpelXFYLuyqj(Gb{aG zGph3n&jJxyRZwK2LCvM_$n9X89j4V)*I|fj=6!uYmbeHYqs|b4 z6#H$2HIinGaQf;QY46*n7psPMA3d=NK7~>&XZDQ% z&y_HATU}4Lrp=REOF}5POO1_CZ9Mo&GNoDSCUCv-X2+dtGOwISk0DaEBsJizn&9-) z<&ncUr0&FqsIry-OY3~5T1__E%|o@;rkM+C*pH5=RTJnl8Zq#}Y*cd-*5O+o?Ow9+9%-eC6i)_7o=>$;Z9TX#SUWJ$ouNXd3mVUa5{=Pn&y@4Jlv} zv#1Bmq|4v5bz^#F;W#+wBYF{bj~AUawP`7G=9(axLvfT=P?!1hHZ0<|Dsm#$BHN74 z3vV;3%@TBr-B-Z7`mD5-<4qkP@_&)lD$?WrX}YcmbbU2Af=~8)%SqNdT1YMB&R~js3}#_8ZS$4Y|wB)Q;b@LJ5R4&!5f# z>t&vIKj>qVRVSeiEto=J(GMqVq7$IWh)1A_2J5odCJ7j~WY#~J{?ml9CZcrDr;vod zd9!r3j|S|cnS{SQ=QD4Ssqt*mP{_f=t$c1ZqGY-q9d1MrdY<9b%w3EhO~Eead9mfo z&9XJ|E}=76-qdJTtNv&z_4G)q!WPkt_Czl2i3zp{D&{D|t#8f?n%RGiKw(a6d($zP z$*XHt(2lT!&wIfLGQ2_Y*>b6Yg^W)ZHvfs5%^T6B>$TI2UfU75zB0z;TA5(5jZ06$ z*)-Wq{$M7qKGEb@2v{qlJ1pDEN+DA11<|uJ`&=^?V+-!Q-d5Kzi-Ev?8%rB>EWyYp zKfOB8Q>1O|Vo9-Q!<51UQFZ9$f#il3F%GGMry)61BQZDY|D!(lVU zcf?l1AZ%=)zKL*Iy#N-!ENZ_6P8If49B}$sfYlqS7Gm#jlh(>RRsWA5GhqJ*^Gg&Ua+w&w z*e%!>i4j{kfLvt5gqzAye6o=ubtpK|eIQJFnnN+1Y|V}DBC=pZ9B=PMW;qC1?q-(9 zy;2r7E)EyO)70juqOips^BsYFj7GvFIik2BY#OWd;B6$XLSp=3jIJDWIxW6*nJ;IO zbk7j7n6@?c0b*vXG|)m%KYL)VF};zO#+`$;N(e+0MJ+!HBoO80MOo48e_PH9vAbwA zI9OT~zpKnXC}&2P8dy~!JI3|V#GnghOuC|k2-i1tVDpZK&ZS{@S43|cBctNZ3>%O= z)Trn%dkY7ZuAN4BV1^?A$l%dRYk8_Ss|F5mwithTPLpZR^BNIbQQv`q3yxYqilo*K zTNJA8Zn=&?g2H`mB5Egk(`t&^e8gP838fJmMi7B5x{W?k5Uib^Dv{?c<{61R*pHbT zV?wBd>CNtlQ%g&yRG95qSz--xzsuY>+>*IBif_fdz~*H8A^&^KKiSWZEvcGi>)hUO zFgpeki30#+1A%lYAPZWXkA~HfPKLEtINGR9M;kzVNDxOW5U7;pjVlQ#12zFrddy5* z+5zYz0yfL5_-fPC2{<1U&Ru}BpssVN1qj;wS&AA!YqW~rRV%w2l119L09CgI8s3C9=6nCC3B`ZSPv5g>{*=jQ6Ylkl>QO@Pg6 z8@o}dwr8z$s)i>XYHOqZ|I)a#rB-CLR)TX78<{@LJq6awZGPWx4+*vPGN*B+j|Ez_ zokSY82vxYN@C+=gyYPG_^t0ct`6D)oOti`-UMd)qTY;`T)B1WC>4T8!0{rKM95OIhZu+RVvCG}S1l`+sn^VjR$Ea+DDech>gS|6zXAS0=r6eO%L4VOh`K1PhAd47Jq$AGM;BDmV7ECAV1Y zVfQX-z-oPuJ8QIDTVq+L`DrOzO^B+1Xwfis8-ZPIRW=bi61~usa&U;ei>UB!JMbd<(AD+Z-tj0j5&OL9`9B z{v~ptDJF*$X$=v3@n%C$uA@9H3M@9nk|D3Zwe3br&hnf(Qy(aptTC_tL>1eE(4u<*%JjTj`gvzOVzy8^vjUt;Hd~7M<582(FK%dw6J4 z0k>CGzy3BQuw1o8H@1|OOMS~i0>%7IqqDWd0q+g+O~I=5G>2jo7hf( zvA@z9P^(iQ`Gc`p{v0W28R8du5jFJx*NLbxe0^4#<0PbhjTX9f3V^P*3j~tF74V zewyvngumhM?^T&EmyTjx%-4?n_3>cCZaT)VUY?oW9SYNQs?9 z>cF_EU~tBr*D_nl60QXS(8KeLhBD_3@AYNV9zAQFq1XIFHydC;%1$SES)=ST1|o1U zYR`&@hHBg90>|4*j?MKPt)8v!8(0|kbB?oppY|jWk9=)!TN3=qGko+CxzJkgsD*I@ z!2feID_x&k88t0srWg=BTUo{zXfWCwHWQ*xDRVe>MaCG_T7TA>yAqv@h7@-W*P<2} zGkQyKIn2c&pl$XfTp*>?hUXZjm|T#VTJCt?SF>U;$Ua0mRcv{n+{|d-GgN6xyTLs?_7M~)z z>bkTTo$94nXLqD{Bsd(SWp}gL;$*bl_Lcgb-%16n8hHjswbhkbBR}qNbL8mW_IP5{ zli7!fXcQ=e6oJeh|2zv*m4U-FR;bg-VBjIptFwciC|{66$wfdszX~S?Ct?CCV%`dc z{}QGR{^E|CLDi_4NE`;{7q<~DlK`}(J~ZF13_u83lv_D52Q?b1Q11PFy0n>JXW~sT z2&Pv~kj&MQ#zak1XLBQFQhW?E+YwX_zg1143cJ`ZYQq7`vg0MV`3KV!?(ylj6|!iY zY%-WHj8JQx7S`=bvjCYYJ2)pw#d9bhv6Lo#B@NfKpCKAy0R%|6 z6IgBl=5VnA{&3VpXyN5lHqNKj!pl78O|c;u(CBTiq^I8I7&Vg6oT1_6x%y_z+NXlP zI^Er;SzYuL-4i}}hx>1_^u0{!_t;0b3mKtcYo>nEIImXvRiqY0syTT$%UbO%)lf&F zR=6GNcVxOUgtmc)T8HiSZFWH~FIsG2qE@fzuFU61Iu=F1Vuh7a+PC~|W zBN{j(-uu|PaX_rIQ<|61JI#n}{?Y8TxUI%fR$Fl)a($N-`jlSNh}=3Xx1FtxD>l1C z?VhZ;9rQoXjMxA#m_pj6=b>hQd29;Di|jacH(>ZSq+Ue&3~i=K1T2Qg;JVQlu_E|T zX=a!cI5{>n?o)c<^cE~K5(dm%jQ1WvQ;A`NeVtFw%?C4L?TtE#5F_YP9DLo}j3TegJc?BN%3E%uOykH>6mq<$EQ4KvMLG8URhUR;Dg)w!lz%ktRO{*p z4059PXb&Wj>flI7MqwNQ%(9yiMAaKlhzSxh$u=^gU_8!mjkiPTL-6jtZKalDmuC)X zv(6}@U*M0@m9CAn7X5vk{HB@FKxQksUWT&bwlOOr^PDvSqs`x7T~1%26eR>_IDIlC zR09g6{Lm~4*~(_5G0wc8EiPlx!FX&~KJLQO2onvfQe#*5!ZF`qC&$hdj{PY@r(hdG zoWWPu)?t;I*=XRHsm;`&EDwNAZKVJ32xZSAhR&wb78q<|C%Z4Gj@laS^)59raJm!+ zznJ|&BmJbdE$R=$M<|Ol_VgrYS!=^$Z};uTz>%}1H{Bw7L~TORsU|m5-6FR8Rg+R8 zO#Yl6QgEgYe>fG-a0X<{rVIFZaYBDQQ8iYmQ@rKI3;08Hbw(l9?b4To%u)=G(5L2v zqK!H&GHkBobL|+Vb+OFTu1O_=p1dN+urF)#xu3`c8td4 z3+e5ytgTJ+3=AHS5C+53Y3jtRp1{Y?%}}rtb;9w4n&-xs3PpRKbH46z>=7$aG`$Y? z`j&CET7hm2rvc-5(-PKY?h7nyKT|KjdA>`-0efn8?`AdF$#d>Z=Yo>2ca_%3an1nw zh;Op^m|TouZF=_{2qn6=G^;^eJH}Tq)fi{rX=Q@e3!6lV zM<513wez5}&Q2_SjTZ+{3Q3t_3!JSww4*4i{cUJVyaSi^{Kgggx6?pqN8QXc?QRQg z^MGAyQb#nqHKF(FcVbmOoU8~dYEiOCj`(j+2Lifmlaw#2Q@2v*45 zfI?R)Ph+f9_KXM|vV!Ss=P%OJ6j>&vCF`oW2rIm;XQ%~dd!u68mtyZ-Wz~$GL_j5t z*Ej)CyJeCgwI#F9iQao1Y$rPOD5t#SkVS|9={Tga>5!Q?-DMel7Kbcp>O5p-7Zxk+ zH}eo_SckMB+P85rBFP#O<=btS=)^+)j>Lp|9RGycYfoTiy0N{bt{I0YI|DI+KX8ZH zWfhebv*%S*&nv4bpHnirwtQhtZFSAeimKX*>MHK=gRKo0%qp*#T`_B6^A8ot*xt>h9?SB<5W|l@5>{7Wu^e5(hZfF@L{7W5$@t#0~(x>>9qzVM*8WSMG1{ z^StZ%v){M|{Juec_aC?YBqqO0o(7K@qs>$fV(|K1c|CB?MLt1its{(qQ&x_fvfBZZ z1=Kb2Y7pXQtLy8U8}}Nw7+J4VFO`BwjB6Ozf|obS%Y0T>#mv1F4Eb=ge8>}XbuXRx z?+U{Hjg0OFP)T^Jyxd$zbDE^LsqC_mnR$1I%FdAtU)4+Y=jCO=!Q(m(J=i1R(1Aeh zMFrR=VhP{Aq<|PIQd7yg|EQ!1O$Hf(x3B8A2H)*>A{$7e09OJaSkrKR*yc{RxCloIe6UH^bMB(tG zV=@|4V*I#{@e{{Uz$zqlKlxoHzbhwAf><4`k?7DtA$Y&9yx#-+ayGUzp0y-_ z^Os71>GnG=p3KX{1g+z=H)yOSfqPY2Ab^v z6L@u?yc#6*iXigkLGp62ywsw|*9Xh%0f`BSm?M)9G0$*N@cB@A9+;RgyS??8#umOh zOkQ=b$WeGuo?1y1e^B;HAXJMX42f~uZ9jD}lmo_n^7d{mUzGp2l9Cba%y4Y zQC*E4onSJyb5*Ih?G9~WNDouU6t#-SQE$dI3>1F40p$ zaW(8vfm8jO1xvwbAk_@uHH<^kRhq3tH|xm>F&x$7PDG}I|837^*CsWv4MLO{SK1Mw z2v|=?NvffoMz=tT+H99k#i{}kKHt?MSR^Jat6K?dn7c!g3{b4XbEkf0i=*Il$#V>1 zgNNnn0WyP!73v|CO5tIpJe2vOBDxl3h=%nZ#&u9L^EG~r+m-dA*r90yByRiX_r_le z+<3jxd(MC%2Ol8T;s5tb)yQrq|6->q(fyNCHEr|7L${9i8#kc)N)|NukfHrHuNdSE zsmi@1w<;%9l{3ED!M)l^zMMNd^-^x?-?^z5b5k$mR#p}8%l6fd`%>=O8QqD=Ju|wT zX}pZw?e$!TA9vto%Cw%cPN$5QlKQ7W)4x8G*=F<%nQvq5qIVKTk+T5|Ug6$RFjp@Ae|} zA4w&Anz0f#CiEy&gdPx-&@VulALqIoEV&QM-N#bq|NhTq0)i@YUzGVtuKS+PDw}O# zx%)(l|14wi8$!Gj!8y;Lh;SS1Hk|PfApl&v4LSkf>xP zaqYeWpnxwQvd8yxh3|h2zI+D0O~7|)ztj>B-!Je!xfsZm{|{XXcS{A@r;4IEHQ_D= zPgj$tAViRKm*CAAe1qh8^S^i{_>12qzY?6k1UTT#hwO3AfuMr!9}UiY2F@+Oxw&8J zNDpTOYxRP2voK#_dnA7UFCM_NRq(`!o_O*hdpw8c3Z4bHi7fD$0v&@u$5NZcv@~~b zf%nO$*jlq zpt*G{wUviv67Q4G8#INVTU-3xs&_<33Zmly1Bmh=D?~4XlI`wL?Wk3nkA4QCp8(O1 zW2uikL_3kd{RrrsLtS-_r>j1UDP6^5q}`8WM%Aj65Q=kbUG-nVw@bArK4g#YmkQr6 z48D8@zPt9Ho!Ys7YN!6DJ$;4u$%n{T;M!eG>~`+Iw(LBpBUsDQ3GCE=ZTb0BPe`FK z#qUq0RpDB)TYuKz*MI}&@*#UOmM^xJ_FfGAp6VysR|F-INm4M8)SvIzf9w8Mepd& z6Lfz8NI;hlKDq@LhsK88>(C|HL&I-#$Wy6#;P=n|?(-<@lEk?^<<}>i*+yP}MkbvO z33|%cp_xHY$M=-q6Q9=e%Tfa6UkoF?S*0*@x}$T%GUX_Fp+B+5RU=SFEH;4@)zgBM zhx@xP8d7cmDXEA0rylh9uF+#^BnuMcKG+{bga`?xRD`$>c_~Z&Ed=1Ii%laSZJZum z7c>cEbo^+4_azW;73<<^67Yz^ej10ybMdXG{6?=DZb`V0^oM#wwG55LCOFQNwX<$Q z1D#chZWx!6mjyjsE$QeZMzk;lqsRNZuNap8jTk)^!043#AOD_k9}8dvb6{=4DS1^8 z!PP>fk7ByHLFAqO?iWDhRD{IHthPKzx$P8*S)N__xq7z(Ly_pv2F9yv{eKsidzd@-_ z2Z^$CKO4kRmL6(-Ifz;bS4&v?Sj01?i0@FuH-l1N4@!MCNcj?y-{e^StwW$myD{zO z%%vNy=if6JRwfRIG?N5oaRYRvZB~J)exLR2C zQSa?~Bt;GuXa z;V76C%);(NVdPcLE%{P###I-K=7xk80euw615ljwASm*yGy?F7SWpb98@`NNFQ@{( zgoMJEFcla6n`?ch1@bO((k(lcSNkJXk}cgV!1whM=BS{P*TZ;C~jmvp(&N?CWeYc99p;CcEIc; z3o~}ZZfXdwBX`?=2q+ZQq8i6!pcACJ@~J!ml{s?!9Jv#b&l2iB(sQPvXSX5l z^`Pez(sQn%2d{d{FZb|XtA2sOLvuJrnYOB+4QjifZEkW`W@lQJUG+les$OWF@E+If z(L2kaxBC$H2B7z6!vCv5FL^lM_LN^Cc*!Uj^?nu8+&ap+6AUWs#{Pj$WwGMZje-cS z79xFYKIa)k_8Q{e1VmnAAs-k-(CYt!1h}26ZcL7J82EY2`*4)?f?eB(_(bOr`n_`! za+zClvtWp;E(Buw+Ne!H_k4qH=@9o8gYHK_H#L1oYVRS&Ef7SSnUFe!^xk-3@Uy-u z3f$?|*OI>r_PFXY)3EQOP+nlLFB{_i1K7VsX1{HijaNP8*Lr;Yc+?d7vaGj6O}`zf zD*jeM4A<-{{u+bJpnP|7{@U{Y5|{4LS^*{R9irbVt%Es=(fEGuXb0Z5(?=I}55oeL z$|*e$emW}oV0uy*ZfA{lbOtfpikSWorq7vMlFFy<$Mw*hQFC=U;OTz@646JVUTf$W zobPTAI=&|zKTskz&lhpfZi(&lF(e;tbm+bEi&ouzqrv9$6Yl2uP+Fb_m;wz@MlDdX zgW!s*#o|7qcAY_ONWQzHLG4Gcx_9gyqvVT2kSmBZNV{CB;G9HZ_c*dNnV0WbgJ^SV zf{U%MWU3&JYxam=ZxGMVcc-NzJ}rb5nQE~z`O*;N+H}Ns62x)M9`SVs@q&DJXM^}p z9>;eMVP&L2TcOAj#5(kyk2(G1rQ$QX!;)PDTU@ip_6CFP(0q4SgYC~Aw!8L@jd?WAtnmr~r8cepxcXtOSA!YE;5WMXvzu#*haLpc>n+-C<^WD8nwfN0; zuZU`~q#s$*g~{2?U6jj55Wr~GNJS~0?{%J)XI{x>yXbr+Do%9XJ}u*6jt1nvFc=uJTR zQG;?#zWcsG`5B^Iou675MwzLREQInxA7%d=QNAbcR_DXXEFSZc4+LdgbwQho@?!?& z{qx-q4a(0F<^A$gi^3=~HIju;UgV?feqZLY3U-9t$f>4{*@;Q-|+kKV|42}o;}Unl1~H~T(cL=Eq|ehJGljJ zUcuV(YsUcoO=G~coPv~7VC=SjNCwf2sat<_+f3aCs9Rj!exYuJOC1<=pKKi*e&!YQ zl)GaB!%rZ=cg#vpj`GGRcS-WQeEk(I^x84BVt}YpGdEGq5l)EH1C1H&N&2qGv*ZC;SdSN!43Q9jUK$06xD@r&J%pgpz@#=sa1 z2i(o^RZYE6mTra{5OXc=-~!%ag0Y{19;%2Gl~W!(vFGB%TwM~B5=ts55aMvno}RIW zo?)P;upqTXL29^9&+uO9*&>pjLZPR>(Br4D>9JCH^r(_FJzEMrxMok!I781?pr^PX zRaB7L+NWphUg;@{q^CIQZLW~#XRyihGgxmWgGa5xLsPqrP>XB!)FutJqd;w{j?fUKdseC*=aT2IQ$MB zDz4e%J=x%02E0oPQqwiw)5Ca|M&X?=c>8HJ-hNsOZ#%8VdxqeRYxa1j4BoSW_soJ+ zxyHLZjQ7kayp_oMX*J${S_^MGt;TyF!5i1?@!sCxJr{Ua6r|>8yyt}Ru86{03ACS9 z^-!#?h#uH0Sd6S?t!g^ zA+F=j!`C}K1JYPh^P}FXzTD5i(O`N8>uorL#Q@hY!Fn6cV6{RkgY{Nh3lE*R**{?G zDN4alP+GE3_=#)w{G4L=xj*>1s328SkUGHU=K;O)vnGmj?xLu-%3AOBID^GGD}(hmoWbIpmBD(eEgsEJMXBcJ;lfW`Eq?aVK~in_ zSzq9ufKli@9ECoOQK%XPBYI1{Rn`EaEchL9T)N%w!6}z13a6421r1zv9*p>ilO6K($S>Q*Kd8?-6j#nDes-Q*&So1YPOy#=-{f8Zz?+b8FX3; z+|vv?{~|gq1*v5Pspf*zk(#Zjc9p_MEn~GOR~P88(nNlK+jJdPiu^t0&q-%M8Ggq5 z1#|L9`UoW6(OpgE$HW^InS%`mIhy;PgKZKymi0Y{4qa=B%u#Z>a35FAkxk|P{)YQU z6}W#g+<%_jZ}XY1KJ5lQ`r3=`TQG`*j?-Wy4?G9nfWDs-Q8p6YG{xPKr2}zVMJq72@8dC3 zxYl0z-NAGOf0f)Lh~Sz%({D9puO8~I8Hzbdmi@IU8w|WzG3gd{WAfx|laySGk6&AU z+*oA#<5)`3s5J|g6OWN&Y!S{U!TfhfFjGrU$Hw5^< z0Q?mV{Eo57{nC>H_{##E83gzn8u%Rq{_s!>_y_<$ISJtBB#HS+$-?fT*lU?>pR3y!>h`6&eWh+>a&qJr7B+hVo4bk4 zBZAFcz-E@l=DxAXvFS;H&HaK6GYB>n8k_q_YMY&74uF43;NJ=G{{r}O4gCJG$*%OI z0RDvlX9fX&j0S!`f!}NAr~&Xb;{p8I@#N#B;|sg5)W9DYn|v@mDS%%wo_u5m0e-Cp z{s4hLW6R9p0RAk2zbL?;0r2Mp_z6A#96L7&{itM=qPP-i|IM_}lt9FV()*H4b;=2| zKN*vR<_ISRBG5)UgCHVJ`w*s=3jM*aEfx?|f!${~juTXa+Yjq0|0dWUp-{eK_Q`0a zFO7FMFT_B5EGE709y_;WhhbEbxE?wH;b96vD9PK#ZbHk=!Txw^IVO z6))0~*;-XTc?35v9S0Ugw^k}il?%<#&!t){az!^oKNs4UpG!4GnVR- z1a?md?0?vx{v~STPS~O~Ywt_9Xz%>2`_N9I<`IX#kxo6gsfIN<-NAEMe@wJdNDFe3%-iT!r3%>v%X!!5$&lY3T~V6-Mz1 zvU>nFnu!9)x_@Q-6pDA`ceaf$;-)}}$s8JI~;jS5hWC#Wj1L?r3;=RiQi6@bqU^@s+xYkLCwfF_8Jps5u_z?Os_3mI>Qb z0&+Jjh-8B7%Mg{s;v+b7qpgx*K*@o(4X)s?~ zn7XDgb+x9wi=Q>^pBmbECc1lVq48s1Q)o!M+T(}H)GI%tl4RsZRN^##>?8cZHG6){ zH2ip?(4AxWv6}o?uQ_q{P<${AeI?{uthVn=}JJmvI=9dF5c_YTJKrF7CTs7L!qmrwsgD$T_-1h12^IJ% z71+JrF!h!3?ni}eget;rs*bbEm`BN~`*AjT=ypL6?y$m!^|@5&BKFqqXZ~+A<7y!d z*X&7KWJvq5&|PFm`+~j94~41k3sc_}roJsqeN&kFx-j*XCi7S(C8I$mk}707iR=$v z6Z+oM!ryrWeCs3aeq;Uq+WP&K{~LtuCxqdeJz@J9!g7bX`w!!20N9>DY04Rva)zaT zE=>KT>A9;ADKtGuq3Ah*^yCaPJ&1z@+Ej9X_HlH7@_z&00|Z}OEqwdpl#_ubhUy0b z(SPXyx<9w9-cooR3?qA+TRuq2$5lhZ;P+qSvqc6@moCG+`eE)-!08?0v|+rS(LsVE zkpQ=5bz7!xE$Y^)ZiK<@cT|32UkL19AtY?X1D67$kH^Z)xYB6B#9L>RcOo>K#Z#A4IG2bEom3d;i~Zk=aA5<#y*aVmV;`kO%&OY#yN5!==Yc$^m%kB zEXC)&NV|SJ1vOkPZ2BTpsGn;LHs20&hYiO$KtQ;*4Y=B<&flPBQ&*%QQrH=(e* zppXuqo(KOsK6y)eQt)#11Uh_}K^#8Am>wRy|BlB{{5$5rkaYsmeIh(Z!7AOiis!?J z)B3@EwUQO8dz7YYn9+cFS~1i-rs9orI&tUdbn!jMypCd&-6MD-9(RL5W*5 z9M#3|F+`Sfagf09rcl&(*;zPPiDAIZ#!mUJ3FxrC{>H`0QQ!yqZ2#-XykAJapS+i_;7;=xb1!A$ zuObuYLMDpInUUm-@MH>iS9V7Y2edqbboAyR+X`8@W>41jhOD24xuZ>0{y?&R)MSkv z?*14_R#KDYef7w?o3PUA`+OnmJdm|D$r|gCw(M4Ih>Vmv|Vce9}xwm#zU zg~6eHxVvUc_(qAt1`mfdTlSRyEI805x@saNibLk`mM+d%A6jcfL0FE(W_8R1@I%Kp|X`x>uodIBC`+4oOELc?$CEt&qy z@t2lAHYs`C2y6ZRwSpY37IJ;;C;noPyKRK~Adq`v5-RMuNq#@E8VR7@nT}n8N<&0q zy>|)0#GKdK$Uwk{+=o$vpLipq2B3b9PXX}`TH~RJm>;Ulh=l=hKz=Ns1DF~VIRVBOmKiwb?ZIW6-KcJU=3@zA79^C=jZWZTC9nLX?^dNb&49zx+jEnxLU01V*|g+uhUH4mm^n^kH0(7@5M{^n;*Z&~@lA<`@0?`xr!^{SACt1cBS>!nR; zS@#$k-yAVJ^@f&+3pS%^?R3|%&v|16c0!Wf*B0RiOzXF#Xk0Ch_E8w`HKn~hLVIj3 z)J4VU+n8JOj=;t>d)WUpu)hE$pKD4gbik-k@_Cq&FQqhGvoGyIQ`*-k?JHf{uk6yk z3YYecl!j~er9Em&`^oUFb2D)Y;RIjQkutxXB4vKV6|zq6)raPI4<_(tl_opV)93V( zzMtAQ_-8>G*X&VVZ%`gsgwq6yQkxa2nf{;R+*!-%ZlG)pDDoYJo8hzfjlnZAk5q(HTbHWgR625 zNlq++)>(rH%<%x6b11Oqk6w0gjV_^~DyN<$G@yj-yb>C#auz4IHziDF2}@7{e`Hm{ z7|_tY6L$K=Z9ClL=m$Qdv~{Sg>x)v?6{W5%N?oI>49RxJ*W^V-YHK>4OzmEe+WHie z&A7PN6|F7*kosxEBt#|Q>RyXC!Q(cr!JE&R=3Pni?j*1d5)58-cL84IloMBtS%iOx zZs&eKH;}sST~I72e_DJuG%)oVy;EEr72GX|!>D!7@ zZc*yiqSQY;ycgnY@^ZUcZu9YWT_6~&mRkjVRKiIzM|~2uJrg4OTrGD9h1Dn)6!IZ^ z3hR&=gdHe^;Rl~V;XR=6?xNIPMX5VI@{YhKkZx7W-9CACwcI6iscN}XD6*^NUO~DZ zz<@L#vPZfdnSpB)Zqi!#45S|f(*G<_%o#xKaqi4?cs!$3WquMX5)MQV)CN9g9yO-Kv&H zee&#Tc|_<^)$*`VWLL}Mg7hi?1JZoR9_iDO8MyWcuK2-cApI1OezGX_L{VzJhxBTE z3O4a4eWcwdfZd0afF0WSdLQfLUZ9d1t9vDsf;fR`nN`9`|Cy)+ujxN6#GHXbKnx$U zC+0k41`U4_8t{Y9Am(2n=GmguGae;4=sQHovpyv@`=8kqLY@;sEx|49%VfNdbK zPm18DM|oCBEa-iFb3ZNuy2`ryNEr74-hy#_$ewXuA~PU=f}6BUK7(A-J8&RAr1CTZY0yb$2WJ&VvlLVi%9`bV*=CokUi6Q+z?=RXDIO*Oe+P` zrWdF7E>7*`@r~yRA?ZMM%frp^?b}JSg3?xAoSfbVz6}D5-_qfKB z-;hq91IJ_D4A*{|v?wTT)y2uGK5#7o7|Depu2uV7v!$)dV%q!&ri~)3>S(5o#y5AN z&$NAoX=CsfOyfiLOxqEe!HkKx3DfutrqzLIhZm=6i&KYre4DD0PE)s?a5H@ScGBXY zv^5kb5AOrtb_R@OeQ{9vH~4&W4+n#cwAEUSJ1l~6yAW7IG~;%~H@Dtr+!4aK-S8HS z<3sk0D@SH9Zcp5VaeM~jjsoM_ic_r~*Ji48v(#-iZiZ_=OYTOYW#4`3ua zLR{{6?>(mNr_$}OZU^9InD*_Yo}j25U!3gj1Je!!jO1~l4&iv8X>K>TV?^!uKG*s( zx-h-#K`i6=Xl5RaZ|-qEGgk>S55Ze7lMmT5b1^c5nTO*h%;Ynec?Oud+T-LBm1wED zHQ{DB`O~DcgW`8qadLGZIQc8UNS+zu?R4A>Cx4oBb5JU8EKXk62TraAjN}a=PTuHq(w55WHjR;I zu!tL@8Tm(ib8qk&xlR~)CfxlXvxjmumncd2gtLxzFdNdzU4ZcWxRpFJl?^MKkkqd~@&hnR$;e zb1mM2nS98end^`l%)AOWVJ4r!%qPIi^&Tg0P>F6-x0`S?ocw9hvq7nRx;VMM51hOi zFp^J&IQg{CNn0w{ZyF!@=0OjKkyce4#-r#SU?aq6w&)SDhh|Anu~H;Sz(iFbVB-M2-IFqreEB;FDp;Em_|eiLtkQxe1N`6jR9AKNoxbC3zP~@uLsy>)r{D9b)A8Qh^F=tf{wj&c zeaQN?i2fALAeu&U(cfb*w0{;Vv__|8O{m-d76PNs zzE_KUcUr!YAW&mJDQZ3~L-9#bt1X<*i@ujQ*J9&{lScA5+qRK7e>HK^Mx1LA=TCjr zkA2k-Hpq5p0sv=nehPzhC+A0rPT&9kAaS{qvra^}hck$#kz8~SExMCv#pKY2=wBfE z=f0|`uUcEa{ zV1+h<*@$2^^i{vvNYbc}MzSG{#Kr&HrUX({Oc5Du1A)*;9>_oph7V8lV}&*XX_pQ*0k4`K^n?S!sp!;8{}Pv(iq28H|k}7#hig*%^Zo!yhCD ztk6a<9T3cB#j3rHWEa#&BiSsB#GRG)n-WMz31nAn1A)*;9?0Gp4E?)_eyq?&AX_4k zEs9mAVzs%AWgp#jUtR2n!kn&~s=62B*c3i%?ON<@!J6NBYPdgqcwLI4Y1=gfP&Mz|lw!?k^Y&UWcNP6EkgqD+Rcc zVpVLZ{Z;q-n=Xz-VW@4W%8*g`tTk2al@vhjDERQobEu_4YHnJUIM9k?p#7b`Qt{A^ zMw?$ALMsz!$DkI_Xe5XB9}EVx6Ho{=+JH6?&{VOiDOS~%+bO#1sk#`4!fE zZHhfr0JqcN!y8;2-5s|Hx%mo!%;CPq0aqOZ?sPiaCLY`wX!8e$;06h}Gf@k0G?IgB z#9)9s7lnYM4RE^v+|I>nCrj;O-EX`uCZI6XHdNI`vu#ANw{rp1E`bkkcn-A@AvHJK zc6Olc6a(#2`Wg`r?J~6a!$WAh3be~n3urWwL%R`!0qt580*yAH?E`3g7ppNA+7#Vy zsxEFqVW2ft9T-iu{foW53xIYre0cli?4tXJ(EPnY$E4brkXj+~3Jj`3r z=IF z#>w$87o*MpR|xZ;0`n=<0w#^*Fkix8z+8?(VA2N6{{iM%mgLL2(<{1o6@?+Wq3XP7 zR-RkzomBwI*WklDCx_&@AxSqY&)PJQuX7XU#)EtVZT>kS$g>6Ho2Ugy8p%QSYbzj& zQ3y!d0C_h+-c_vbELO9N)vRJQ(?a#o!MnHEyQ)~<@tx0a2;LPU@b8pl!Uc|f+Av#4 zpvFFJm{rUlf7+iY`ZLkvD!#V!yAJ%)R`(aH z`z*Sh(8rrs>`e>MT_|6!bkNOdhVH>;=pM*HcYlt3UjZoPSwRlO;SlG~i-+h`hY;rq z#1R+-mJsRS3cfJL} zO+RaxFN6+~pBwwm`XfRLeXdFc-&uW3LOK8&K}a-`hjcs!Bc#7dBv_%1kd`2%XN%SH zVzsPTEw%BSfL82lI-c>2=h^spmZN$?iocu3msRB(x66w0<+~aNg$gYFrRefq2Xwhg zy4awem!M9>mJk$;f>g{6nRrI(4_aN~`PG-L@^VRY}A}+JXLyZ4!d}cexoViPb7#AqZZHVK0P z>IxK+*|b6ILlFC*SiN7Y-YZrsEw0IE1x+UnJ_uR4Y5l%H(h2aMlgcXvjho6JNenl@ zF=C*RJcd~qj2Lbf=~$tS7*-*M&x_S(#p=^y^+~b%*oHA19im};9){t6294&@_fsd1 zPn zVzthO@fKR63H5V)7)@aq{(2{$)-{XaSBc?mI7SRKlE<(LgCYGrk&YGGh@o`}UJz8G zib~YRVzr@I{bs}X0v)`zCElbUtK^cYRY~|{v#2EZXt+@Va*u`^a*l?-NodKBhTlMp z-?k+7V#%ovkA`hZ80~5d12G!OiT#Gb@bM!GIU3Riv5p|tp+s#~qS}|Jb|vO1@CLMk zrn3ij2wAzwyBV;VFBG;f;V!86zILd;ieEIe=fKS+hK+EH7-%Gqp-(%Bp)(4Jfi_~; z3NiF5Q9Vmkj}q0rM0K-aY>f_HpAv6|JL|o|Nc^77X1#|59R z@%zNjx>Fs_dT$|ChG8H^BRR1e492WyQ3x^GAXW-uB_*o3MD;CETU%TTt)S`5dP&I2 zo%LdYq|bqUomt;n(73Z+CNT_zW5hrsc?>&ZFk%=g(y>AtF=P-!xrec0ui_!XuZW*#r#hVHtS}mZVPHff zIitNX7-;HI$UM^qqyAvzm8gCe&_1XKIX%Od@M6~s>9{l8FP!1v!hC?J+!qd@l16fs zhhs2QjumlOp$(NaP+47~s!CL)6?z1kyn#7;Zgr^DuWB}vmH*FY@^28~4~(Blr#hTT zC5(>5FfgK#oY6lq7-)_~Au~xEjJ5%z!6j;t1@te}gPb#ygF`y*Ob%)`lS4%1$#4Lb zG?J@48-t;8oQT5;ZK(VMRBl(Iwk=UZt8zfWkZhYO30?1Up{%(bWzm-gd0{ zosX{0gAZ?539cS>^p`P@cL<~Rx0Bq!VF&3fI_C1Ho)xxaJ!eN`VzHUi5g|uU8{Rvr;F=RgzWZ? zvKw9E?Op)8iSXg=RT90T8||>$-Cre5}?n0Y?SP1Qp0_|?p0ve6v(0mLAvUd&9qT0CF)<7uqu-O_ z89t6S|HP2t3Bqs@YQd03a)$3=Fc`j$LKxBp!%M;Nk`gtcM2#;|7h8<)>)s#e;zJY$ zV^h^tgcctBt|;*?DFEX~@Znuv61_OTBE;xl0!HQ@e}cntyu*y)@fGnLKS7&+ zdC2iH;rJpp?f)DSVlIShN ziV&m!CK#Dqe8b`Ry2J6c7>--f@rrnkz0u~s6LNf8IQBs;IMPVYu^$E_7fVqHN7~@{ z1vsuMQJ0VoW_4OOe7x%hR7x2gb$mGI$xl>_nX5Tculs~m=(I}AUI zVOT}KU&k}7Mw|at$nZ;HSc6(Hq>-FqEe3<(HYkK4Z7}==41X?BO(kl5iCSkd?x=h3 zq>G(V7>rF-MWvDB;)W9M=K?V90w3OQIj5HmAx8gaFfzH=s6;xwRx%PSZW^9?5n%(r;Ghj7>FCH zx)EY{ZPTUH>%^Mhxw1Y0KD^GQ(W}EQrS>VAn~R-F!zVwRmxfP%I-)-JBKtu4?NSi4=+_3{ZuI(V)RSF$mC*)!?D=m*f)mb33Qx}=XfI8{8Y%X zTsWSDT5zP1oa31o437UsAslIg!y)BVlDL-qz zyn2*3q|_T&0K{|P!`mhY;*b!cn~MWc9sOudmF9djSA#CmkLJuBU;{TaBp&K{X!ExT zp$-;?Dg5ja_ zkW%l!0+`+jAKt+^Ob-c}y6JkLgY*CgtY5_2xf)DTX(&&@Q zGeVgDsi0#Hpr?d1?aLpYrh_x$Nj-x$|MZa5X+mlVYC(!da#F8gFi1UzLP*gDsS82s z0*mQY-RU)5ypF|o8K5x zx=1L!japEmk(|<}7z|49p%6;6LFqbBy0%nZV?lkU`+cs9RVWOorm7pF`8282yS4yO zU%-bqu{8R;bW#Y)zt+j8Yhp-!Ne7eSNqvPje_}}LdLi{SYC(!da#HIs7^J>KA*5)7 z)a@X3o5i$VcWTnb&nOJ04OO$E`81={yR86Bzrcq#JqOc_5R;ovx5ZHUmE&i`Q~C{U z{`8R29YSdXYC(xca!Oq`6H1*>2qoH}^bjaLSgIbdpt|aQ-E`3%MF`4|f|^(AJy-y! z9`NDKEyZW%3vu0A)NnPQK+g+7`45J4?DrDR)t`($fTrB*)+huVZGd|Q;GQZ~i%Zp$mR&iTqG3Megt<6>m`^%k>X+;+5#cE~ zgm4oBkQye~dd$H78UcjW+ zz=!ujY4kfCFFG`qBV=<@S{6el_+rXZhm5%fRrLL0d;$zaoBu+X0M84@L8t{s8p$~h z!(iYWfrZvLoOI8p0-_)y}gg>%F~ zBY7N0VKCx2OypyQHsV-~IKC-WUze({O4XM(j=!VT`=V6uve$B#{lwYWY9t#Z!mqzk%PsLzFd6Gnl71{{*M}+%B zsrtTDeP?4GhbC~)v0l$ue+XlBkK^B?I(qB$U2aYA0q{=}z-e%d0B9r+;6e0u5)@Hii+qv$jEE(OznuS55i?)TFRnXF&~qUJLDNVc^wSuOSQkjFSfP!e zdm`u_WvY9b>Q<(@mZ>f_=x5L&8gvgQ=%*GgdF=QOe0arW(c@K#L$VLnS5@JA)%L~5y@iwB0k#U)?G4}xx-2P+ed72o+Wg`& z`^2%Y;9H4W;G>Zo-xnARY9FDH6Dn=ss{_7~Wom?F_oeRll`g(UVc2b`+JmIR=MME{ z-pB&jeFGofZaM7gLw4>_V`K=*9}%uwXshX~J|5b)X!Caqp^Xw~YfuYlG?GL64TAyg zClmsWHlU3Kv;)i30cC1`%WZ@1x=|NJ9YStRRevO<@M`XmGVj0wxV3^0@8GiN(e{v# zn|~kxnX9=2LRkL(;kpIan$8Z12iFE|{=p%*g9Kb#)B+rhe2O+}{E2 zs4{h=rPf3D>#2)gD8g(zKALUEmU%}NKy54d@Q%r$c5Fz^&9T`xQ_9qTEV?S)yIL1DC=9x$ zsgpp;KQ4c1M!j&qMLt>AuInPhv9``y=7QWzn8=_+#PNHgplEQVYmls z!H`CBh6iIX819Wi7}5sA8^CaKnVM9lCYGt|EyhE1??ZL*M-&EQQ`ODUT%20wO)dcA zVesKiDZ`bGlZ#VBjQ(UWGPyV@> zFr*EJcbDVWr{(I-ay7eL%_=vS`Fz)%H>F&s%~T%3?kW#2^Y1KY+Te6-@1bX-W*UE0 zI#K?@!^D(73pLTVT($UzH|{B?x<+gk5zn zYte+zb$B;3y!*rO+zGu;;==Xkw3L6ZM1*zw_WcJ%^mT9s(KM2az7>O^)xHvsHbl>Z z=(*+U;d1p*xte2j^Hq4>t?snU4R!kuLtu1T9uoQPw9JtpP-EY6)#9`~A`$ZKd5Dlk z@(6=h(9M>>5Grj%_$VS=P_E{eE8m9qAj6yIPRoKYJa<~=OI&(de2K`NmW3jEjuuTL zx#%Y`7+QVNiWS-r{Uk&`QLYx1tH;aLV^;TKw0bk$X?Y^l?Jt7B=(Id8^4)29OoAwQ zS{6%$Phqo|78=PTdJ!Qjt8BGY?*;}3o!*i$QX^Bfu z%Tp4OJ1t8^^eb=%(KM2aeh-78^$pRA71|K}97I1`u9lapWmfe2Xo~LQ&xWG?)zHv{E$g~m6O9^52Oi$5y*F3~-}Acj^bWL9V+n70wkTjlCa8%amhMT*AS=t&yX9(yjfHQ%i|*hn!&v-xompA2DZ#ui z!SuyO5Dbmv!Susm#84(NV1+h<`3S*$Sgt;>k?_@b(MUcFBXMWtgG~wKV+o``wt+xs zBoAaL219?f=*J3e1oAlo`K(-hTCP5^v23fmZl?>r2hUu}HdTFHj&nu$FyzZ}?=#l? z&I7pZ;lul)JbEzsG6dv*=1ldcAtC=0tmnQAZWx_?Sswf7Z3ndZUzFQNZ>t1cEouRd zMsjewVK8{{ZGW;~(gwJ70JpYW{bZ@t>wdfIVhvt6eBqrwE#yWIk@00dMCn%fD7KD z_XmL6E~U1$)J{PMY%As!def?RjAq*oDQ~+1sGSCn-mn~MJA~BSY}?L(wrvbFd4t{# z@zCTAdc#6!+Y7Yd4SF<^Lkr%FXWyVl8`-uypw*|;ZYed&a&z9E2Yh@1UYKoTqS>}r z%BwGc+oj~TXDWK|-z((i*8`Bb+gUJGcO9d=sDd#~f;hh1A?^ zJJ^ACPzFcm~Xnd2N|Hly8p#qKX&;v9Y$)Vka!GLxL3V}u&(2fPPV^Zp93oZW( z^O~woil*8LDess9pvepKj!#8TqbG#W{9{1Jq}tITwL@;!<0AX9UsCx zPGCN$VbVwr^HB|Ru7OD#Fi!)_ah7E8TD`|~U%oXjOuw_D>33$z8&?2HzH-kyBZuUf zAxSs=#%&r%c_ZJM@gVsoJ^zdlS1q?=3E0jhz<%OFDlP~u3Cd9+!3;X=> zA1O41n+EbTZensg$j{N{PYOZekt!gpLM=ejNDlHR42F-@C#)_0A`WASqCe$0rMfioMTCDraN`eMMo5dpC?qRs z1LSi6`D{upPpM@owbT-=M60(X<$NUZY#6-1T+#?PCH5nUWx@b8_9Ka|Ddk~l|WTf>gApFzK`H4+8*#piI9H_9J1ORk_U1T21EbZq8}@?5y+Pa^US4E<9@KUQcXkRK4p_bK&VO0BW6OxIm! z=wc=cbGmM-S|7deS)1~{FW_`N3qHJ`Qqi$y+AX4Bc)_!Bc< z*y;Zio|u0WaCe~=;AkWVHy4A!%f7~wHo&z>*Q?fP)hcbC8P3!F9?=C~=V_=-tL~7- z5j}j?+CJ^IX3g(BGvr%4y>{s+wf1TI%+O7%*6Hw(VJocXLR&yz?bET33?D_C-!5$* z8MaL`;Dx9KG#bgFEyG~=cmjo-PG|#KPeALDR^8L8o8`7#cYRhD&!I5fnyR)YrSMs6 z@3hyW0B+C2hqqNax;yp`x%oW+$Q1llL41vDDTp?!zJfbk^?fkqq9wgt4IX*I+``(F3^ zK^J^2sDaj0wL>)3woiLQ3xM_$e0YDz*+sVxq4`5W$E4bjkXj*E7Ut>KT5e_WmDCm(X2c;?Hy16OTHu4J1A#YJ~(9QAK+x={+kAKYi{G< zc$j_B<{uQo94j!3Q45$flEdte!GM`YAuwqJ=8=H;H%oGW?o_FZDins~wCZD{S$TBY z`&$7dtKq}@dk)E?Ly~S*{%zAh^7XXd(eWVpa$5iIA;_ZyWbkHL8p%Qa3oZfjXcPjH zHb7njkXNVGRcUo)T3wM=ms_ZOXQp>u+B+?+@Az)#Hw3Q^5%^b0GT}sRpEg`6Bv50Y zHe8X8{?6%g^q9&E$2IbYH`XNk!yBhUl7C$~_Fd9Wb@-0bYlYi53_}9aNY0J##RRwi zq7ZJh!R-cco19jY(rRK_U2mcBeVJgYiA^W5$ssW}X(ok9<4+Vw`b+QE3n1JtPc?re z;zo(#A~;42G?K@_H%B6d>qR=-?JpTQ{w?m76Yy6Bm)!~faBDC(nFwmlroYsRF3`l(UrOY^O(3$~S)6?pX zw7Na5ZnL!Jpfx(<(?eAL9f;ms2HY;JDvU7JL@wgj)&kJanMK}#}gQg zIP{Azu|gYh+>JQyN~=55YPJpH$!0;^6$as^?Vb5!nB6RfdnAU%ItCiaV|Yc!uvDZY z2HJ?>A;d5ztsYFP2h!^Pw7Snm@+vxbbJO10?on$_7>xfQWJVvxJs>f;N3HvFa`-+8 zt>vRu++PBD6Jq?i@!9KChuQnE5PJ*5FzYmu6I+GB0L7PaO7_wQu>~MDKdt<1dW@yk4g+*!ZBi?kvxVr?Ii}jMN(p*jTn|9 zh9znBOjS=wYc~KNzim={e_T~ zJL}I2Bt7fTIkWz(pmAsYC5d5cI7SRKlE=W8Ln4MUk&YGGh~Z7d@J3p_o>s4=)vIas zN?N^aBdJ0k@9ngAQ4q{bo^sy^gYjR7(&)s$CNa4a|7y;}zmj9WEYT)Ugn|Fnk8cL}W)t6g zAwD-3Rth(r3-3C)u)c}RSkzPX|;rOxDJU%@{mr^A@Mba5)y69 zQWHX2pH}PAYOM|CR5W?N$YdJH8C{6MnD(<#2qW5Hv;mBMORHZkpo>rsa(cG!Vgmmb(s2{`*KoFj zcSmd#m5p!!l{Av83|?4xiBU-#D%)i6lsKbWWmHkdJSgT%4ZU`m=t-(|#y-~dTV--* zvIsSiUzGiyXL1rm`0X;Ww@^-XIFoHNoQ26421YcJGrApv;bSTanMvAU)B%h(%c%Ai z&>g4;IcFv}3+cEs*pnkcY_>vsrd-R_}${?)u|5W zwW|>GF$~0LBqzq#2m;h&C}dt~gVk-i>TYo@MJs4J7ahGqR_^Tf3}@Hx zA$atyad$!Eo?LoM49nmcG0;dJ179nM7+w(RSfPy=iV;KKjM_S*`q%*8)Lq}w#oH*% zQ>Lb>R0fCJ@B@pojMtYnzw<%Q3i$9!Gq|gm1DE`IL_t55-X6z?DB?9h!)B+rhHT_0JSyn;i(*I14C+VE>$_uDr2C1PhSJ$ zq5Xh1Uxm^C$U=*PcXtV)s6rj~*)X0n)kx|1fy3KWOzVi@cxVXG&A+h@!vh_L2gER}px;B|8TLb)e@MviU}5N?77S@5XSg#41I)H4 zgduG(yc!Iz%BU+d>WYlI++y5C_uf?(!%-NFO;r=4xp-a1yQ%<;BjCfkHWR%My)MM) zUj;@c7q4_UUg2=OJci>)I=(KRV;$Q3YeSCL2***V1xFgmIqr|a;J7CW;Yb@CZv)3$ zGwPO%nr0y$pt~NZi?JvS#A($tqq#UeS#Dn0&yCVnU^bn$(i?=!qZ*dq-i(z;$ z{Z5Z(cnI43J3@xH3&TTE3x+h3Gdu=^!SDza!jLu?J_LqyGU~yMdLX0jw;1_eLG(UO z7ssP87@Mm6XfDpncykKCcp`jwb2HKBxbs4c{v0qex%i;N@d1b9{V^Q>LC5prIsOxE z{@jq`!@}`js0BwF$vIw(!60)k3gJi_9G?cqr!s1BMm=dE@-=_xIzbngpfC`pRWFa` z;?j)wQ~?k#g%58@1|KWvtC{==~u>9aww;~Ge?Tq(&0pO;=hxb+n zpD8)u-gdyf?tpvE0rzSQxLfG#?RapvqRoFR1ox(ZyA8DfM9Buv&A;<59<0908BaP%7pT}Tu)Nf(L3T<#~oy8yd&8niT z+GruZpu4`Pi@CTwX!F}Xs-Lk4{);y87oVXpB%7-Gl3SRLeX?H90!V%iA71Zl^yy=tkfh%e_)I$X za8P!4Pvz-Ab_XRgAz&BRSUf7!0i6q7baK zfwe!ddRf&kt17Z8Yne9b-aqT&7Zir+wCb8@c2;FQuK=dM!iQIx!?Y@7>Sm|sAnoU1 ztZ>$|F-U*oHmc&0@_mecWr%cuAl-;sAf=HUX`YuF?g6B`XH~t0ng6ARO;vkG6LfUe z+r0po@>0XSve5^oqeGbf?x155v_7P1lTY4cI69t`yvcB{kkp<+DtMD2jpU@Vc->X#mF` z7Eg&UWAy(RQaV&9@gk0bLTV?}f)tJ9 zr1LS7g=Y zS#?=fU1}K}k5=!JtPW=m!@0r<=W>~KoI&k(!!DBmQDeRv7JXs)rMb;9?}Bz-fPIyO z%NHCXTpG#4Jp+RgF5faJ;nGI9*CX8Pvg+Eby2i$OCYr!O$NDg1y)KN^JrrCU&Z2)! zxE_2+F;PVS7tSD>Msm>?V=zRYBU-US8=|K`^o?0{Lsm`Bs!3M&c(g|6=*CdDe**+Y zKRBG6I|zmzPsL!wdY#0I71{{;Rs?-ZR!z&Qn{C85 zp$RmcnYty6*qy0q;q3S~hwH&i-6o=MhBJt!kzDk{7!0lVh*qr7hUmK?`mU_HGplA> z(Q|dzdAfK6g*n_bRXq?rD&Lp&?keDL@6Qg`?HPYQ zo!u9I7+Qcf|K9L0bdP|06tw_HBRRMw7z|#EP{@8s8{i%VxCL1?-%?wu`z_POaukNz zwCX3K2kFPN-hu+CJqsV+V>#3w52?BNvmgZJ&kxrvwCCvS@px#@qs@OTgtkziy?|Ok zqmdliI~WXTub>cUv;pmTKzlB$p3SP|mfH&5^<7=8L}9o!RlO3;wwJQra|LjF4?esX zv(f$TrI4Hd8~~YYdp3mSFAvu(xcBMorFd{3pv`|V1owh~`w+DNMJgK#4^WP6iy(gsBp%$cQBq!Ceql8|BLP*gDsc%7Qbyj_oRbOY- zSC-f2x_2jCY=Oe?YO4A%nq}W-z10Qq>I@&=ciHIq?0bjTYA}kP&%P0A&NYYswcH1W ze|O`n+#WHfG`Z|B_uk#9;`?~$J<#TV7eZen(0ig5&}k%xp2A?{TOSkxoi?BsRp9Tb zWYvbO`pptg>#iAHWKkI6)2iE507CddYnuvhV*$kb!H3tnB1*hXMfh0AxxCw$3)0_^ zgZj7J9>0gWlACW+5&QJ03T=Mt3j6e^RRu9sqZX)XBuBji2E)f-6oQ&IPm;3Xd&EF@F4;_$kEE7f@#yQ&=JyQI_Ym}>Pz&@llB3@bgMoez6oQ^M z&}V@@Q=!roDrLFvue%!U_+SyX$O zs6PXap`J!^^=Dx)ME_SrV}&-SGNJv#>T4bKwEZiiVErqi_Lw2; z6$~BB^-&|ZEULXm)SnHB*9%n>m|(G_B7Bp34s z42Fj7L<3f6L(Ibv^NX=PjX1yi;G){OqGuR- zLl2GQdUnKM$fy+=SfLF)KJ?79dUisk*A(b^l6vMf2J&%c=k?0LQG?MGt4TB+Ll*qseZRmLddKOix z$E~D#)O+nK^^`3pqD5xP{Kw5&@QCC|k+nNUKo*VUvi8DYsM%B0V1+hhJp)-!RjS2S z)@amwMS-lRDeEai%3o~O0$EE$))sW?Tf)svyZ633T?=G7P6LAs-;%eeyI1_ zxU!ZRG5%7s7RY)|WbKa;kVPZ8tW)qpcc}S~yjLD8v?1$H)%EJIYIAHn6_s)XIIoE3 z$%{t#hgD;TtHByhlgRWMSU5ytQG0kb{f)y2Xrhr^(-{~HAE%2Htk8z0zd+NUt)??k zNloX9oCSM3#SK z#B`}0Eh^821E{2tT;=%~3~}d)IIPfy%HyE&SS#@YREoq4jKpK}YC2vtU5F9TL?gMT zi!m5d__t@|ijX!modiuMT213oDVi1=O(*8n^bgTA0VAM^MsiJ;VK6jZDpIgQ8=6jr zrhi#Ym!p!J{w3MjC646M+Go>QUc6sw1Sa7P$TFpN&g zt7)8Qx)vj#iAHiw6EPT4t`{j-p$$!EK-1|~(3Q{>DSG&4c%X+yay|Sj zIgoLi$iND1==mS?oMrXgflBJ>CVI}wtLJRdGabF5hemQe4`484+%Gb)LK}J-pyynx zhktTM=IkjmXXobCbe?FMgAvd~Be|xz7z`;7ixjNThNg?4>B4Gtft586^_0~|FkKjt z(nv1xNeqUvCqx-mXhY(aka$J4y4*_SpCyvH-GbM| zIPv*cP!=yk{mac7&eA+1UL~@g!U)KskzCdi42GI#L=9GGL)NvBbxpOp+R9prdhgMI z+%l58rW#X?TkBK(tMhWZP6RH)SO}z%T;Mwx3|()FF09aoz)27|(W+a4NSinHQ{C?~6y9ys-pj#MK8vaJZm*VGK>y~b&>`4O_-mZcF~*;U z9c57m|MqHB%0<}_q##>YvGq1vtuqtPZqf7wngE(c^1%2Pl;A`EfhDZaMqslL*vx7* z!v@B`f+Rc4z2;yzGZKbBBVxKop4p;uwN^De*)} zhr9CXxkvQ;fZm`+Be|Zn7z`Odi43gJhMxPO=RT`v9V!Lc#Rl1Zc{M#Cn$}|kG|@<| ziGSJ&Qut@2?2-sl6a7OW*)1X(U&f#$bp`i8!p#hRWBV z@>MG_gG!Njfyu5{^J;osG-WXYnrI}~GysDkr9TQeBG87WccAHQtEm!|qG_?w^mblN zD@0QjMnDsd%0<6MB>pH4T&_8OFRLCq3n23h85b7n1RG}jY?UG{Htv;x1D(3i+S|Z5n1^A z8~LU>D=JTd1E{2tT;;zo7~=jZ;;=#+DhEJi{~G04l_#ShSu!U}B&90q~gTXpB4k_`3D@%DN3>>zs1MQ`Y#kzCLD7z`Qbi43gJhMt|EXGg2& z0#s6uet58BUOhXDo(s_%dT1oqb2$b>#$_S{E3~0!H1zCMqxQ6tuF(CiMB(jS6TMmA zr$*nb?->(y-C+g9s~%rO!e|BxL5qmewY8!;I1+<-zd zlQsf79D)6*Mjd7Yn}T}Tf9%crpR5?(G5Ci?On3h|LR3zL1E{2tT;&W5hRW$84lA^w z@;^}dZ!2*oDn+8bIsSKEO{a*aSr`FLG?Hry{vzI;MpN(?@lJ!LaaPmafhPR`VO(B4 zr;DC@v>qDC_1uraKy#nbLmQ0#3q5CAJrAIgjP%X=nR)e`C3=ECaz`V%o`#=N-jUveDs06Uh!I5h4z1Di0(no*1s%}osIl$F zwylK6v2FHk_4lCr2|UDs~cH_4~|EUE2>>UK_@~GR}u?qn1tI;O!7n&6ec#rJqB?Ljkt!% zy3-BP$zQ06FV@5xZZt!uV8vUgf_5M^c-utrHcVy5MNUV|(qIG=1l@3x-p(S8W8}Do zl`D&i%7;A_Z185Y!D;k!XvIRlS*hU#-WY0WIE7r$VGJMN-hv)uJB;0|5@W}J@R4&Nd`aV-krM;rV$ z4#cg-Kyzt-z3wy-h1Yt}l%?lg{$h2zL7eG^hfp_MD*O!tr94QMx>Fn7X>UBt)1Af) ziL?$DYm^=mX=^uVly1}m2xBrg-)hj5XV2U6?dr|7=P$T?eb{j!xYL-fXE*?!PqDMuaDylr#nms&l5`fq?J?Y3LI_^!HoLUQq4 zN-SxEM{Z@lSl9n5_B7tq$LSWrY+X(ShR9iHN2{Z+wk%Kf^*ootFa3;pW#S9dZ zgS3%@JqFdQ?t@GY&eEM`qwuy0a| zB!!COW}%OEmnVh#7@9FDRMI?!?uLGyLfLrn8C~t9P@&>8apKFhJ12#DMN%kYMN+7| zg}}0=&7@FINuhfY98!oz;uM;Xu}C2wg`^N|q)m> zAtsKPQ^dB-_wVPhDZPIT8-#P%LVbv8_zdS(y|wN2*2agDws9r-5rGk++vh3~-)3XM ziNGZEV4?jywgTET64QPMV?q0E6hfOeXxD=F4wm)`RB8pg4#MHGdAPgehN~&;)FShp zqLKPLxP&51c8T_kr2eiZ^$n99g~_{+3??)ZGg*bPVDh=3zzS_J83884Et4-$siUmd zQJ#+qcPHPi#o%{~hNL}>8iXUsLcJ$7tm1{*aQ6TZVKOS}AktQE+RR=#QkZ-Rg zF_U!|3lwWnNS@FJlRd#?k3nj8i)B6Pb*k*I;}4JNx_UodO?>)N$KS)9cim|p-KoeP z2_sX!kC}3Fv~zZm{i1E!-QLZ%xqI_%j&5^oSTv-^TOfp3^# z9NjqTD}46@3!iQ<;2``rgJqpgd9x7QG2p&HoQ-W$yM|5?iImA>8Eax$3qSShCoDz0 z&ox~4^V+{CWh_&&wpE)>(pX-izmdN#5F%xAAqN>DKZ}s{RtVR|pP%LL%^)POOew!Y zgAg_vA-@Ddq)aa4U?b!=5%Q}M;&Dv^{{x~QEvC=9fKsc?w~noEou|HSp85`X>bpAi zB4ayl&M45oU)caTOa>{FhklF+-Mfm(&<{(U3|u?E+sX1v8E*S;SwFYxzv&W>b!>jW zH#(ah@&o{OQEh)TQ=OE_)g5cpRl-lb8i1u%$2C`7s@%`5>R4W^v$QJEAZ2n5#~BSZ zqM_Pq;99V!WAl!MExTqz(O^6x2*jvBjFid6++oCAEMgk5R2N|(RPYt8h5UMA!)hL7 z*al0!zsN4ZdhiX#@u=a%NSR#6bfe=k_^DTyV5ufxAv%~34fZ)R+wg!{9x}5_u#Vs1 zU4(C^T#g#*kTSUreP4+K?3M6?FLYw5QA`O?d`lFpj)s3#uvsaSZ&u&MVzbxEX0JAz zW#szP6;?$fy)M|Kl*ucm9|6Z!HSo? zc}5^!%H-ntlt9GK67e&QcsZc(O~b>1UteC{g*K^v5@Uj=gmOuGr)l`rHu!X8veJFX z$G-U=^Klc=R{a&**{J6sOUmRyK4^lx7k=;yQ7rXQ({f!y%E)j1ArCv4{BEZYn)d|? zq)e{hF{9uGQScm=>RB#c#6llFm$vh1G}hhEzrlEas_2Hsx(8B43%TC2A=?!PRgP$^ zdoV?%ZTmOYJ(L+pjw24bmR;o=P}>|D@jX)ZV-A8wyM z^EGDuJVW!1iZF=`cEITzaJQS=7~QVZ8riN>AK9**3&SOti#HJ|=R(TlbFs+G#Y*_8 zS1Yho?{M)p7w=(VCxk{z6T%VsnEUjZuQ8La)o;nAN3CW@T-0GO_Q8rs-NSn4%;$u3 zBZMOzooUcB>jse97!AN_ZPBF_%K^Cour4kD$9b~=Y>Jqf3R2{KfMSYBnLI_FFe&mm z{NTHwSgKFB_?U}TSlASy(Nc`L z?R*;86M6PuBxnC8&xZe0@+d~m;JPn zy-{Ruu(G*k_EQI@pQpZUq`{fgeD!TxYyCx6YwS`c*Z+*s-v)m0j(#jPcCMK{#nqpu zzOC;zxcc+dw{0C6;qEo=2&X=0gu7e2Bb<7}sBOSV%H)ie7)F~3qxM*;c39}6QAe!# zG~;GFPkr0S0GF0Kz^QMGuQlOkm3V;9%{AK{Du!*2YCaU;t*P_CBk0XjZ}4QT13Thr zy$l%J#%DBW)ybqATUSb%9Mn<+Y7026SDmob$;35mWRxZ-?_O?Vlj~P-X-=6*) z7*ThV?RB-=<61LFSwE-_RhSw)5p~-l22UZa+StoaExdamT*~Ca`B}AGSo9U)eXvx; zSm=zx-7SrlE+;s`QyC{ zY5*2`pWqr&%V#yp)@G%>{@|n<)!ep}$+yif0LZon!Vi81fTgOzLT{UE2BkyAXSbO8 zw!S;S$+yS=r`{ZR2f-hMkTQ7?FPI>P!cV;#f~DGqi@{uMi-pZ48ZG3K&k-?^`Sgjj zX&dR_MB;OM?4WO7^0_g+^13nGX(NYX^RULK4)Sd~Y>T+0OpfbCgR2&P@MR4w)i5r$ z$3jTq{K0j^`H|c;*<6()oNQXqUr?8AFd4BPfE?$&MV2(}{Q)+ot&jDu(SI zY+$#7H=rTuBdythc)|H9(Bd}YJ009aa$qkRV0&SFz1kB?wFeiYv9PH{qovg12$NcF z=FnYCeOp254s!QEcaT#rgY03-C<@YM3^v5Hkuo`jmkot|;iq2hgQY%7a1GNPUU{GV zMBAdY-@JN6+oEjn0pflbLoHG!*Yb+dGFG%4h^0D!i~X_CGr~2W3uZAp;NU5T^LAZP zGuo4Oj%n83h3#gjPN0L(k8-6>nhKX$fl#Na#0SRcpK%2FXcjy>6<;Z;i&=;MRWtiy3vl5F~zJVnMD(CxB#M>C#wtVT}fP zVcpdohT=`7MMJO{jXwFhw(cM8TKixShLm>02;-McLA}O=F`Z$|3B$MuVW>M`tJ|?K zyaSaSC7q)I`Rs~#a$;)MTgT+nyXjr~5Dd5hV`8ZYbMC15wWW|ZaBMiP0Z9aa}k8;x^VXL&_(Sd*a%~n(yHCm*ncsxFMwPB2P|gPjjusw zPBWS5;l9Y!>vWt^x3Yh;PyV7iIuA+BYs{H6*JX$P|7VxAKL%K&w1RqfP!ZwF=d^R!@27flbadv7*@FAh`!;U&;pRSs9tX+#* z&asr%|E31>n+awS-1_UV2H$p_&{wwLhbdNTjqLn<431*cAi6 zCoKETGjQwwip7k&t9UrMnn-?uZ5hyL>H4078|!8Ur@+R#x2j0XNjPzDdT`pC^=KU) zg5;t|SjPKx@-&ZMr$?M$GcUf0YXpNUs{IXNkgt@^C0Kz#TN$8B;KwhzCJJ;TDlJeN zEdk}=7IBGt(}UqQ11fijk!~S(hfkzO=*a02y&pHq17xirl*pt^j;ysowv@=)gvhQz z4hk))G=auPz+t9Gd<6OmyKSIV%H&$x7_G~wwOyQ6RvIOtR(C&edxTn@9&NPN_JLL@ zlWT2jv@WOC&EmAOvbk1g-es8S5o&dMw25?y57^yI=)?^;xc})8L@Z_Uh})TnpJl|G zhY`!stRrllPF&-jCtae^MK1tM#~{%=1@fd!F0Z|j_Z;PInImrtBadea8Z8|gI5;Xi z=U{8krLrB-a$ zx!tlQ5ihwD8S#=o%`;Iixf{vjCAV89_~lHWU<#y6J_VbbDR_lbuyr^E*K-P9wo|~h z=75?Jpo8Dee z%v8O`sVdHys#on)aqah^i38IuWRa^qjWs^kgD4cx0)U%vF&Ip49bVputK{*Id#UC5J5d?+N2tnPrOrSdg2}D zW@5!KuSJ!?L>1=Ds1%pYROaTR?E0?b@W`9XGBd1yjLKYx5tjL#8I|I)1(kVNhK_St zW`+%DQDqFv{LYL@af$S=plhVRl*!Y-vq}GVnEsV;7Nq}FrvKX}{iP*e^84(@U#-X| zn|ZnhLFVt;Y}QOy{dp**83AF}9Iw)~wkkj(WpX5443c+=q&h?*C$JS330sUJCZ>C6 z_Sr4w)TIfFg<*pS#U)WXs#sIBNo&QYOdQ)!=-O zI8_eLl@=#k^5SH-7@Rt^_>nD%N;|IkWjOLOS~ zTXwV3-JYTJn4Yym0_jpFm)^rj|Af+qhSKFK;bSYEEm7$nf08D@_$z9t+zOwAvUBt* z0q>@mpB1O>(6_3jeu{h+RtvxSCxocHKNUPFGM|&VTh$mm{wOiuR@o)+9@(l>ueUn9 zrLER(i&ma_q)d*KuUCScztS-vc=`HvcJb)mIc986Dd0zqzuA*j(CuK zniy$jTASE&Jx7S|)l%#t*N6&;|NkJW*@TQ~NmT7fv~ohEOgE}(PVL?8J@vD-~&S6sIW*+z4BjIaQA zx!o#)FWns)P>?b?h2Dn37o>1lNa0qV`Thu7KgY)Ju4v$rDDUsCIM{?2V#w7kAAiPo zC1RIEv##MB{I1uqYn)g6J0=s;2nJSE`zM6Jon6Z0FiQ>0Kf_PGIs!|bNL<6`#!QQH zd~Q49)OMTK;QcH`Ty5P^zmfJY!M3GLzU?xz?W1JdM`Ee|hJ^^=b{g)%%N2(6wM`!7 zE#&qaYIvk)Uv%KB;PE|r{VrX6i2~nGrvttXSigxjc->R&-%(3SQYKegZj>GiKlSPu zEY;Ci=tMgnYkXI4E1wMzA<#N?l(*da?AKU#=>WH}-R9`hy=~h8MMZ;WjBH5xbO8@| zArwLk{zCI{sH0{nlWR^H&HsR(dUX<(>O?HG=6_*LYi2{PX7(dQ-)VF-`y36WoqJ<3 zy7r&2C{)ViLeoa*DezOT{)46ZHx^pxIIL-*Y{(VLej?OqbcJ#>G;S?APlZ99QYP1# zg-(2jFe7rYLK|O1|1Z4arQ%qsGq^Y%3z3d473kuzi5byKUVDYweloD~f2c3=IR=eB zd!bAZJDb($<(cjDr;~F~Yx?T+8iL;ZPU8SJpUdXJMWovn_*EhHVAH0D^4CG42tU)( zPAci70Z!z7U_RZUrK5g3nBMR4hOkyXW#lw;?quHPTm>gS!XaOCK7eDbt_GdPwyhOlmBL5f=&Vp(dltrWQl(5jsrB$77dz9bVF4C1>h9$i zZ|>vCdV? z4m|Ath$r6sg18)MM~-WYZ_>L*Hwuhu;6R?b9vd*Y`C;!-bSE4slf&8Fz?lI*{$p4K zaPBwP8{XVrQXka>F4r3_y})J6=-S5vB~m6=vWHPJi%J%Wk_S0Wb2v>iVaqfP+Xb0z=7E%H)ykX(G83 ze*CAfa1(AeY$p^F4UlV>2YniH<{~*iDc@D&XAr6JCy9`!qUIu$0LK?_~tv z4L|-8EL_2N!FC1nWa9{Cvk}ap1qoh?jub3qa=}j-!AtP2cK<^xX4EZbt~_V6_5#z= zSofjLl8@Qvo0?#M{s(xE87;$2Cw_irIhn=DD-(F zR4UEpd3gBPs?`Sy{o}h&0v%E&*YS+e@ho+G8tQm~JJ)j9Y8e(X%|6!}>n5hW%djGy zqx!(`M=)%x`=O?1!>LSKItX%L3=eJq*u52hatAL(wV$Dt45du2eTmWj0_A*;MKIZ- z{dw5xIV`kxu5qhA>$Q?oTeX%^(I8}w?a?@+W2N(Gx8|`%9Lu3Uh#0@gjciBf5*ve) zv4dn4Hbf*+CP$+G?k28G4#uA-@Q=e{M%_dOtv9IPE)i}2M75L2|A1Lkc_Np#snvE+ zH@Z@qeD)8BwayGXNjlbGDgGPl?p6lby~^p^eG6XVV$;v7V7Gc686jQud9hYDSt5Gp$viPnC{6uoV9} zk%xV48qDRDd-F=X4FmLR8KWi?fn;(VYpy( zZlt329GFFw|Krj&1@TLh&;DWjXG=#qmCa#)urvR$a{B7{O;Wst7bcCElIp^Qs+Db3 ziX;3$lCDs#4`gT3J8(#u9LJLe$0yYHEfzECJ|m9LfkS-^TOS9w#=A<~Bi@4d^s!@O z-Io#wFQqOWAU930t@_k#OFq!!XFCpcgA8y-PaWOBL&vL zR@GRDN?aU&itZ>lN;>0&ZfWBWy|XLO$+;-f&PNSvbx#H%_nAJuo8Gm%z+fCwS|KB- zW>bDjX2Kc_xBjkJ1YxaXSc71zfmq~(wTfY}b52<7YJ^7G8P?pCbj}HjU2Rx&X4>Pz^5|V6Ma=p; zC;C}w{J>V0haE_-&cND{a7Z*#+F&*n&02$IFSzx`VlkucXD0Fnpb;S60zREHEjpAL zbsO0S&yjI`FbmfQTk@F57xY|QGunH)U8H+g^W&!b?3)rR@UA5D<=EWreUf!gwcH(h z-46&6#gDpRzzib1iQ|pJ;ON~Mqiw8f7#Mx_bWlKEN*f}`|GX*tTCcXjA^#MTzgWnh zKM+(e85od<=q=C*#g@A0tcxzX=&Fluy6CP8dTkzFNi;le3`fVD@Wuz>NofTkyz>Wc z!l7gkgvkB)4GiyL3GZ@-H`xiVT#HWWBCQLK^!D#;$1oh`(Chs$`on%qx!3yjY*^Wy zIn?;fqZQu4ah+>s)UD{pOBN21JNpkg;&6^=HQIZkOJoBj*ua$;^u8g(4P24w+0d(- z-oTo)_e@-8Y~b1qH^3pXfvq_L8(5QWzJUQrHlRDVyaA*|KMl;&MgI_AB(&k!^7Mg& z8{0S3bS^5oVj!P2RqDP~x~SGgjV_cfI1SA+so@Oxh-MS#7SB&|vT1IRO;R4wCOz6} zLPlL4$*2N<2{agjB%^L*M$L=KD5<0r>gELi&aLccs&el8wR5CTR}7O(TP2zH zIWlb(@`fJex%8N!7iQA<9daf;+Iy)>WM~P7N)Fv3IW!G9ltM;0L;3ReAy|y|ZZ$Db z8*&JHh0dWqy^%wsYac;7kMdGF*Cz$C+QzV&!tMB25W3z@a9BU2v(y_lHty)|GTK|x zCDP9Z8O{1;{RS8qIsIzq2a!pcJhCAsvZ;)0fkbu#BfHTYSERDB?oP>q;gE5UtfjDa zzpOQE*s`byKNO!gaPS@JxyV~gt-fr1G|(nxa&1G6wwtJJVT?BB!co%FqQD~TWH|!c zXoZgj3Z+c0aC@Wh7AkyP6h`wxDos)}oJ1kK{s?|ZIDF{PS08U1yvATrphe2$T80@d zvM)Rlr-hY93ukh=%pVo~*uh(Z#)X`_hGE!ee7CRO_jyw;PuSe1TsNlE7=85}-<8*3 z{|~mP-4wJ%9l`%O#wZ9KW9^f{yh)jS-gYqab{qWoOR<=LAE=Qsxtg7fn(0*YLYx{_Hdm9I30lpI zff^~3tJ&G8nL#x##i?Osb2YgMr`5b1sF5VnN;(NsL9DURyI#5oo{l{pbts$ z-E?w^){c(uOo*M&10#6>@>3PX-#fLT-h>TkCIu z#f-YeB)!}r{a20gZ@M^A7f0!W4#?IFWhe#QzPsHEmk?9@?^!<|+5rXv$F*p1wy@u69e* z@-9J2J8MXv#gX(W@TTG4kT2=en(5OyCVixmGN@M{fn-ge+qwj5q)dLCxWH_FYi_Gd3&FoTLT&4?-)Q|nlDC*my<-MW# z06tS`VfSf1pr+*k%_nuI=%i9@W8I3JN!=m9D5d3qNqr+SsRbTmZvh*b)H+h#U#PAm z)sG#j6E(+4x|pns8+37_E~e;WsxEHQ#m&0lHkt?9JsK=G-B|ZYPOt|A!Afc6A=s6h z608p)66`4q_FM_}GY0!Lf>r;4ZJwFW)yn7Tg5#t+K8Lrt{aMQA2!8%Dgp1LU9^qw= zoE}HlHlQz$ZBp88Ba+WHC6f6jl5ueBpN9nXulU8j|%Mhfr8$}3fHf1u3O$eRf*6$@DoHqy|Tr?;WO!p;qx{KKJ~Yv93fw4f)r&Op1#`FJHG<~xU8J$Cz36S&i0`V(g>R$-ub=Tf zN{TgG<3-+2crr3_T*F5E1+=7;Av5aE8w6VCMgGWYfkzwc?Wu!$HcaQkMLaXVWRTZC{}4QPzI_lMY;&MI z*q+UCc(8rRAUxP^zOjnr8?!@xXJh{`GI1F&2z|$kFhs6}U8kRx{tvyFo>Css8V{Qd zCP2p!=j2)7wNQTpT?CvB|8(R+$0zU?pqjLUZxNkO6_pKK+NR(Wcxm$4AKhhwE<=`O zhMmXGKHW1u@r9&%WsuXgdux96f^WY>hT-j(wX%Uq89BC%HvnTJ4jN?Y8^fs&XK-{( zZ<&br-nHjY9k5F2Ff1@}hZ=^LP~&x2%&2>f4Bs+|i-XcYbV4ym7lU=NjV|aw#x>Tx zZQ)=iq$^X!18&?-80pjjd-wg(aUG=!ce#VPvk&I~(Y4nH0ZVBWBZpqwlpOjGbpWI7AVl`eRcPqe zm7g_q4I4JkY4Ew3#%JCcG=htw+NCf#-BLQ!UEnTriV1fi{M4&Qu~ZAVn9qfeg%12# ztT}-;P( z%lz!0(> zP&7vV@B4jc=A1cm?%iGdJ%65uGk0gcKHq#(&z$h!+X&F42_)^ji~P;#dlcxDPR3(K z^W6=o+j|aGSdu zI2eFD>NZ2^HZ6ryLcJxmf}`329y3D+gU1r^*Fg@MpPFI@$)rT4#%JSK^PC~*eDQ2? zinUX4vUL2$!5R?4ftmxrjm`L>V5cyPLcEYqxr_+4e%2t#3b)GMUb*sfEMW4qkNMwH zI4v}qq%kXXFrIvFtn^1(>2k5sgLIZhV$SlBR^`Wikqp=dV@E<(hn>$+w!U(BwN!zSrcx zn*5;2|1=>hHIiXN3$(K;;Ul!OZ0IAjR$liA?uu(pktPD+AGEfRu04vBdv!y!<~83=9pRyb$giAk<0KZsSNE+-N2z9TNQ`O8HZX2 zq)WBpP}7D&?2Cq)BX19HD6YSid|SEs<-vz{nL6|tyuPnvcYQz6Ant*Q!O&KqzciSJ zdUneENdjng7eQ_|=K{yl$ z*AM}xzJYK@eNFLZIc+y}%H{RJe(B(-iYw~nY?3*({Ac1!Bo68ti_=DY%5(-;w6m%n z2QN;>+@+H!obGfI<+65BLbS5g@v8B@Z4rwxsFl^qO-gN^_8q5lR6|D{HmU_})h zV5ZoO2Q4Qet5}7lpqBCL?5<-M^&5jr9CfpDegl9ieg%#g#-5S>k%92)+KK`BI_ix1 z@n%R>j_VO=I);pwomLEJZNV*WLPf4^O6M9`UAfkGhHC;j;wn^dpno8#A?`?e07ka^ zR~30cu_e}PcW`V|Zz`+?G)tS~F{Alnw&+U`aO&5^-}OWA(Ag30s^uRQE^TFP6$=`g zmL@_I-ZG5GDDuKF-JwwLhM}!Q<_?}%eiy#`{*#z+XDE$HEMJ(IBfwVU zF;qKKXnm(t$r7=?a4qUMoZt_Or3}B)`W_qyGh!4ciY0a+a{n> zYQ`h(ZrkE-bvNlvSWGAJdlOS4l_HZS8@hw-fEDjdS_0_@42s_mm=Yl-(iG7i9q$dAr9(u= z+u2a>GOI%XY64IQ8^{+84V?Nq*1(B@ZyRFBG8sdbm9ii-dEED#wfOMW@PP90VAHJJ z#%i)%#GBmQ_1WI;k{ZRrxYKd3mcpT-wIsDF!W(XPmLobiyWIiuNE6wI20JV=*k6so zB$Hx5-aftg9`>?oyl}&3;qXuvNjvF^FwI_u`I%(?M`3<1ZU2N}4xpXYV!LQEUXux$ z?5fFbn(VGgnD9So-`>J4vm0u=Kr-r90@FS3?l7^pjNf@1pFJ zRQBnZvX`mQmuqr`CRb`g0=_0YxSEjel;*!BGTj^95I4QvA^xW_5qf)QP4Pbno;>RE?9kxdba1S7 zeK3?$3nIyK^{2$ahUl|HtN4=SEz0uNh_i3JtZO_9g*%fP<1q?*qG2x4xy@u>r{W&b zBJ(=ca6rlQimC3U;uj4AGe5H`W-dW;G4qZfRN7srUD*hYZ)}YA7VlH_?$>0tCJ$)x zpeCf_tB%oE{6;I1$6I)=>V-DsQYlHT2vF$C#?CH%iY71MN|jRKM%pED70~bEC6tyu ztGxhI~A^I&W z%SyfFK)y6w>TM?L?RC^!{UH1;vj7B_`P#Ie(1duw)oWP{)*JPClek|uavbqSV@+|& zMht4xx))C!p2^(a7+jNvK^JahTqB;uwMj&qXwk3%bPxlA5s%D@MNkC8i-rO5+F@jP z;jo(GRl;z}!oM^Ihm}X+uE8*JB%*MHoEn(SEVk#8a9)9jlk+3>A*Co*OB~dX4*|uL;q)*dKkx5amZeAFB;k zl*fY-&x^%~Ef#xCE!MrL$kG8VQ6Zku<=GceNc@&8M9}%C3BL3$pKJZZCKC>S>&&;B9npySMoz~2v zw8O0Cnxre#D6^}!fEj0O!FF@y7B$8G8|&!f&cZ0{1)IZ; zvo|Q)3LC^|J#Q(2w>5c3lXo@wmnPzeN#d;?A^vYA@O}k46WgW3O>al9L)%4xULPyZ zPc->dlg~8yT$5#*e4)vgntY|n*P1NX$&Z?> z)FgxM1-P^MQ1w7eaQ}UZi`C zNFPenc@vsq;Jm-XFRK1f+DB&!Q@Wc4Iiom->P^s7O^-Q^I# zXljm(h$f6KAQocjSA)Q4)_N|Zqm_|d{mUzEr!=2CsHV71$msKd!R&GfV07UiGIDRm z1*6Xgf{{!^oC-cwS+z42Nk;**3e%Bb)V0ZGGFh1|rU74;x>^JS{v)ibdm4i=*^lX)de2rMapa?nf-Aq8u3RkTYVF)t$Q1TOUk2w**RO$j6@V>J&6Z1 z-kZ+s+RihxD3zHZG7eZ>0;I%(w>_cnP}cWv1##zzp7(84QydlQd0%7j@A4>M{jlgs zMA5S;)bl>*3D!AfJy?^?G^x|1UXvl3Y_3UzCPOu8)MS_@TWGSSCOp3e4#PFcYcfI; z9w0&4Xic`(WE)MIG!bjaOVN&V{;<8oo(gYvg6_6TqFIx%nrx@ZI8CO?f>ZapyBb;o zAE~%1NO!CX($aR3pzofl;a-~Tt;s%`?5oLsnoQJWe@&!fk|U|w9i>_-j1axSS6#a( z5b|KFGY>Qd zrBkf*-H6mIJf5d%;l zg5A9vxI>NJJ4x%9NoLo`8R6T&Yy&+byzrx3@L)LvaJqajIT1}bZ9**ckssy2Xj~tc z(Wc7i>{`lJORdhrs>GV%J&DT(1TEzd!03;)q7u+lrSPuAWjMKwmUvFA?(#Pz>#j~2 z|AiXfC+55z8V)t)e5^4TQ62}p?-p|sQ+N+E=6sCiJj_FFRd!F4-OIx6DX`m3*)5#g z82q|C3b;Kd+=wXL_Ec`b1G5J_%)OP_N;11(1daM5n4KFkn+H!Rj{;^>N6@T96lNEM z%;td^%=$+)>-m~opvj+NwoXRcNh(dHNGtbkI{nodiZpu!B;h@Syf3JxxW1Wk@kYn< zhXgZuJ5M?u^uUdcA-3otw-j>9rO2?{0UNr=U+*nm{|vvav0O&-3oyX`N(b285Bi`s zIItWB*qtpydEyDXOq zvaI$5mesz~fx*Jh`UQQ|aRO&m27E~|aU8(?$OlPzjfW%V#wEtFtV8c|c6 z9|n`h8-pR`QNV1T1QQ|(vxQ+Wd7P1JiibH!nSD-XUkJ0$z^wXb(#b8H-xy3Sj{;`P zgc%Wq*%u+R`DAvxhq;9^ySM;mmloJ8E-KU%>q2HvGzNbuj{;_w6lg{w3bS>Ihi>i( zGMndNHYu~&WcIi)yC2L(hs+i<22Ykp0kcPh84-oqn2^~5jmZzHt30a7W17sZ;6JCT zG#&RJivU?F_z#@;ab-JSlP5G;pvjY(EYxI?CQoZ3kt6Bnw{%uci%?n4K=x#vm@`XR z{f8BVkF~%X-oftc-V!9Ic7Liac+uM$u_$1Mz0wd-DyWrs6Nx9m{~6WsSxx?~$#a@K zuZid{Tc?g#i&d2=d0mq?G)e6ZG7}|sb-XvQ2oSA8 zZvfwW2W+M5nbN#CtNW3dI5o;<;VfRDi-Qvd3xKzs7H8S@y_-ZU%J5@K^Xw5sEr<4A z5-sE2&p^`uPQp~_wGP}?1^t|Car05dPqE020Kj@biB()MQlx(dACqccFo`m9hgQrjQbP=}qtM}CaK z53%*Kjl)kT$};?TjD)xhAAH>lu84DR#p4jZfN^&9j=%`cTO-Uq9@&DyJN<}(%U=Ox zA@R=C+0|p^6dm%uEbI{S%UpBT`t!3}<1eh_e_6+#<#rRtMgN_i{l3Yz z$3g7nC!qeRNBsj2o(g~F!F`wt_qhl63E`$RzYo8m^NLH7;ujud9XFJ4h9UNuF2H^1 z!Q~asy$k@5UwM$D%0PbYK{l0vT<$@REd%+D2f0HT$ZtK!Hie8IWr02`Jh;6T&K@R< zMIoB>dk^7gMbO)FV0(P>6LA0a;EpqJu2)Vn*=+NIZbsXQ0Xon!bL>zjMLSFyEqlD zn+JDED%@%w+@+~--95O=QsGwj;4V*vtM=ez`x?F9z+mxe`W^b6w0ps8aR}G<*sELz zV9piQf4qL9lA2)1AIHW55o zZ#_N8nF^U`n7ur>J3@+bHJoi{YkF|A2t1aQ7=;Pv_nq8Fz#G5h)-RCg=aG2BgC(o}9^8kaXvsD_z=QlmA-^Hy z>_)cs*>d`?)`MI|NY6!o;lX{83Kw{AU&i6|;45?)=)rvzhqJSoK_1-Ksc<rFUs;Mm~7)uh4=_24#4 zg=_TSHZ^dryJyq0YfZK@#5XNrm`8nwI6U1}J{i7+2iKYkx1|R+Ar)@82iJ`|WyYGt z40eSK@4N?F?ZP%jup>O!UJ5(A!L?TJ^z0gw9lP-hbB8%YDgPGY&-gn&+^82 z)SFVJ*w%v^8;8?#^w6r=gWDk$Zmb7)nZhMT;@f#}SHo&rGj&UWO#W zR*&(LxPaDpyLfPKDBKG4jLjwXjChjbcn|XJREiTkxIx@^oYMRqDLyI`9~Fwbd60)H zWO8tHgvs{mVRw(j(F&Vv?#G$z^38n@k5(J^m%J`+PY-Tyh11qs%w#TF!vx2@JlKhb zrt4}4nQTwRy*(0#Dr{24BTROA75DLI9qsXDUGM9`%_>iv2>W>m_g6-k=pj5r1TVJk z@4=N);STWN=2RBoKo4PF0-@=h(3`9WEN=Zo~Qxp+%Q=Hl!k-MP5Q@#f-(d)#HawhZ^y zj&Se9O2Dr??$zADISVfv<3{A;hRD|!Vap>uxE>0ZShD)H2iJ>mv3EEVwSSa{(5eWD zUhWvc`H>&@ZN%THbRz!*rSm-_|Hu8j$p0IU@zJRo9p}Lvr-c8@Ing4S6D^WBeY^)b zSs_2}=LWH9CL4kNiY&X1E3)#S*Ph@}nWW%9uwQt8Fu~s+Ovn>G$nzD_cIdG?Rf#ak zL%4_tUNAYygS$)#C&pbTdvI47I9K6oO*U(=3xmE1{HJ;(rpIB6Xh%?3NAIV3u$QGS zW1Q~6%_B|sD_tXJ6Xc2I}%NLiS1yykS z6-w)Wbo+V!fagq)`G@-n^W?h2CnlRBNFA7ZILjlkOku6xCEEDe9>Uj#xa%h?(zAas z*%Za@?-+3=gL)y4xX5>jCEb58F4kr&n9)455wEDu?Bu)C-&M&wsd!s-7a{UN_*Q8L z-Xs=d@dL{SQ!4O?;V?13$c$a&^p7m_zR1G(PzgzY!nGVCy}V61LF9j)?=0fY$qviE zaNUx@r2KV|{pNv?{kDNzfW8wqvC8KBoxF&Zw`D^1T|?O=U1ixr%i~SH-9+*i`H5+~ zgcp8;_sA$;3=O$f5Mr|2x%(}SAr-^7`(ElF9GeCVC4Q7Q`-mb+Ob(AAy@WUW3cH6| zNGh+S8#&-ccqOn?H*SQ=;4Q7UVQ9{hrE)#dnUI(erE!faWG!Bm2}0}>Z;8jz!F@4N@TtfCwuI88*F3j z8Ib}vGj;E~CE(vS6ESO9b*4mC+OhYk>c$ID5JAxG;TuS8-3r1sCoFL9=tO|B;Y-@7 z>gl(Uv=e!C?jTU%dvfq4`ASR&D@Z;HV{nP19}}5@kBOj~(mx8rYEtq(cKcs>kxKq$ zsI#O8;PWl3_yWG@FXvbf7X72|ZFW$9#5sdWjNa|XI3`?BzWV;EC$VAkYE zl0iFuhkQ!&pAb{m3uEfCegP`L2QFK23zy+oXW>_&9+FB-H6##IacXi^8m%0~JR+fv z`c}J96*?HqNa3LICAg&~2ez?srjsR}u$dUQgaj#q`jj1(@bgH**ap$d}z)T)qUmB)(g(d{@LlwB^w zF}Ozhf7L_waeK8YZN^G|&? z;82RtHQ2?8xbP)1YBwGPlUXg+g1`5+y~}82rx^P9#~_PSVcXuEE&uV9+U@f`@0j(@crc%(I=~nNogcDg5v} zRjKOfu2Kh5Nn}I>_8ueAO>fs!Q@r$Nn2eRk&DMb2<%25$hLO@J5Pox@X&7pn811HR znQmQpu2b!DD(KKIl6KxMLycVyq4vMUBi_7E$KUE$kMZtm{^>ODTkPG{y>OJ>o`U)v z;4l}6pMtstbS`uSw2z^ainRy7@&%wXuSuc?}AK&Nyo9y6L}(Wv*E{t7@l0|?13 znvB&J%q2SC zY`|ix0c2M6Z9TiX+2Q~=w_sv|#~mJV8V4#Xlu1xG)}6vy*&uVW0=s7>pZ}G8v%-w9 zb|e*Wns*Ezot+<`0v?0SWSL?7&8Vz>@W5xySXqz7D(f<}@8z0Yp~;n+T&2mMHMv@o zYcwHoy@bFJrtVqHtt($ZaGj!GugMLXOxNT_O>WZUW=(F<6c@90X&#=zNg-_9;X#B&NrZ_Y zdZTNy1N^LmB#R%|)^BLzM`QS(R2PG4VPDh|W2L0F{h&2IxGJsjb&!i)*4?15ZJ$>$x=;T)r15D5AWlObFeds@6;d69jVq_^KG8WsT4XU*7^F{D{Yl=0!BZi!md-qx!z9$-gvtPZJUd&ZGqm zvbG8A?U2m39FaG_HnOJp4u|9oQ>H8)*%Hi5!f%K$^&R0a9Yy#RfL|HHKLz-|C*c{^ zE*}N>`vm^7Q8mS%{aookJ(B+Np-T53O+M1(V@*EMY7w*(nFIq zH0h~HFHP3eL~2HEV2amFaSnRS%AJDtA`a4$RY7`VRggYe6{H_l1*sQ;Nv935>8c>r ztqRhpc9Gyd8)#K;7^`u-x$RV4o6@QHhIu*y*1syhVZL#Utprhr&Y{Zqel}BtR5a^_ zXx8(kSx@ag56yZ=JmyFrJxOsMAkKVg+OyHLx7Mb;@R^apu<|Gncg`qo$r4d^Gq)uk zZUT5_ByIxevbJlNqO$sktiF=Bh`z@B`8dpljf4P5|HRELSM4r&p$b-^)g?V(Rktx^>HQF6?zKR(w5gc;2DZ5wqr>%H zMA~sPem4rOKy)q*VC`R{2<|@&{Svb7EC~CV*h@votwdlgXN# zqsbIaNRFbrOCgC*v5*VaNqJ%t2aUotyTW#%UXof#px1+rULD+JI~Rh8UIpqkF4C)H z^pZ@90eSn>@YK@-qxsno`$Sx^@Ft3atQk!>h_G8X1hhIghfD;P8 zb11x|ofrN#Bm5Z@zW%p()}PMD@9@y=fIr|@iFve^NV<%YV!2Zy4A;$;4sLjV+LYU~ z`Zj(*jIsE_Jfl15R9gEdN8H3zN5UK%D_0+>xz(rplIfUnQyNU>>E5o78C3$^!&JP%j9jJ?W(RoM>NEBTtM42r z$Lf=`^VRo&slIDLCyZg&<7YC4G0%h!HWIx=sujPU8H7l-U{I-Dh@iB78K5SR`K$mk zxIGKajFTg|d;c=IvGY<~p>!FpP+}3fkuj4ntp-Egl;qV}h3i5aNZNTDJZNliBW+NB z1D@izCH@kh<%9zM*qhf{tr(Cg&gFy~6@cG`n?mN2cAoh^4fB_U`Add*uoS-%wGh0@ zJQkR$D2A`&%o|-I=9Dq>N7vCzuvMRK-3DcNvy^!YrbKN1X@3N-At$sW-k2%8f3O;tW30sF_TIJWBbJb;nKPi;c0UGHD^d` zOW}L`O_3z+yhxuLk^T!hp?m)iKNE&6G0)mmKAymWyWQNG3z93#-mP#{S=FVGi8pek?-Ez~tdAm&+t?BzubSO6J= z|CvG;l(V8F?YtOY8Zo*>VsuXtgLzgAdz(ol#%iG$l6GEB<;aUo3}hc#vit9JbN>h6bV-<4>Hlfp^c!>TwqM zcz}GGPSVcH++<{a5Ol`XKY*u(FaDY`=IN}72$STiUIR*g{`oi+)_>D6xU?`+cqo)c z(#}gW#z^z9NK>-X@K>5Ne!fam@(VIpwCuY{T0yp4K~uScVz~mm_tbY2HN_*LDJ1Q@ zDYiAHcvMU=$C`q_98+Wll)OBtEK@0ug_20xc}bd$B=ba)xmFVXawG{|#Lqu6<|2=W z(n#8QX~r69o)Br~TWR>qm4;jgl>GcNW6~@LrIEDr(rjm>St!yxX{F&WR~m91Q1bJq z#iUsjN+W6Kr5R_Wc}k>NY^C9^G->?&xHM0P(n#8QX|^}gED>q`W~2$8#jj)^%2M=7 z>@F(_P!RkB840ye)FL<~Lc28}@hJZS@9vJ|QU=Lc5eD#Q2zh zIZo)0J|QU=LgUL4Vm!^iqJ&B`aQhxXPLVlvfa;i3$O+#G;A?9pZg`k`SCqkXq#io& zIeUmk@Rhe9^SJtd;wio|jFSP`;wUm6lvn_l$I22#3`KYwndB{L=Xp;wyjKYCZw>F@ zd;Cf`Xo-2orbT=89fw4);iRe(vGJn^&OBqFmesE9J7iKoNjop#F-E}Z+i0BC@f73W zxH*3(n#qbxrf0q<^4auQF75A8F<9{_4y6ndW&}@XaYrzoJX|g~ZC%ymR&T0Rlu!NP zTXmx?t~<=((rTYxoC0B<_Uh)DLJ#tX#*%hkn4~p@t!s;AW2^^|jazefHdd@d`UI^*N)&B|4`U~(7Jp(E) z=Mgf+C6t22;4KqdLQz)?_DhZWwQOj+98)(lXSxUwbV*4&FWNgsw7-K+=#tOlXVN8^ zXMJJNPGa=$=nIe17jP$1;ki%{Njopd`$mwrDM&dDd9YJhwzd)Lq|_17ojgV!c|Ja5A+!P$;>iotM1HNWLfNjH}-RPnCRc{7OpB zQiz~YzC;MChjaNo7ZB77OCd_%P0NDgBRyt?2)_z@fhzTpwDbBLVDz~bbjH3#=OM-U$Nk9DJ5Es0p}k7p}~$M^7SVw1@;pd$~3|DYGZ84vcNG;({g4 z-o+`|W}_l=u~3OJ!m8ZQb%k+OiFn#_Wj*QW4g$OvZ>l)Lmx0&iV}Zv~z;)n8`%2n* z`yOcQI~{bwh;S2rCQMsmp0%oT?TYUD6mAUVkhJr1oNVNHJ(8m<8u6oYGGhbOQOxA% z>x)w{lG47vrSL|`Thh++KE?2Ui@fXqiD&(rc&MX&F_ThYoujxRJ%y#HG>O*)3TwJm z2T5-uhqWPT=Oy{Qk>p>XGp_z!JnP@VLnH~uH2j;cDu0e`DG`W`SXZ3o=0ug{JrqzD zNjopgAB-&j0iAL6AL1DogMY`wD0~!hleF{P&NAFS7jB>7S^p^>F_ytLIH$vU*ogH& z2>eyYoIUU;5t^ewbqY1XGUU+&l6Fd{Ea!kdfQ_UY$?oQFbPBD1p+Q>ktltR_5fNZL z1+2s@2@Du=X5Pj)Rvfo)ei!5`8J_+O2$W7()N>Ogckfut zVConC!j#L-em4RPN5H~IW;$zE5U7}G;w)>t6{@!pio8I#TgDI+7$LZ>N3g1Aeu5=Y zD_8!oa)VGcfe|vBq>#ZRT#A~jY=_+HUaL=9+xRqJV0I6rb%`&M? zWg_LmBtW@w7aij4OkB9#KqPQ+{j<;ZZB=cV@qLS#_D>{;iw{;JIV9rZ{2MO*YlL2m z9>BtQ_hu*v_C`jcXMhAeV;nrn4^Oh(_7cl<4j~__yhJ{CSi%>G`fLhCNZ1BWom}jN zEUHtF1nTIYomOY465$8cMIHVPbuQ^Ku6}hm#PEaH=##uEN`_yzZ3iU+TUzm5fVd~b$e+YxLe7D__EiS!_{Asy+eg6**F z!xzOf#m_(`8a^%yN0vgDs>IF)L~n9N@Ql!m{j!(TVWP2P0})X+Oi za9oOxsl31n#vAB0S}W6U*hY(6REZUjFCkip{>SzpBf&WZPijNgVd{QvSiYxeSd zYl86ZAPnm}x;PgwSFH_tZuxuKV>~~cBGVsKh`7inDUpK z0G5ZVubI;Qh<^+}6+|HL3-ZNfoUw+3zJO0P--1<`)?n=vF!(l3%Yq_-F}$uR&LAwl z>h;oaEEqNaYq%@ERgXh92K&|nss@bZm`voCs@{Y0p9V>+4XG;!2d{4*46dlx`|@>Z ziu^tltH7ER!xb&K#S6pb!OGqf%u8g>+{nfy);}FW)G$6B)7oBCed$H9mQadnYjeg4*50{AVjxFX(u9`|?2oktDbko~qD zVe_tdqD~}B_6agjr`KkRbJ#(f*n_H@GsIAldNMj6NYvAlwWF_Iuu@&4+pnduC@c1K z^lX*$!wt9v*)B9!$<-c-rb4?qh_o{96c5|C8FTzH38v>dj3P#dgOgw?eg)AD<{?SU zVk>eW3%+*XIKl**ZA^;#j(yaC%d`$g6NunddyXz(D#P!vBv|of5;n(4?KeaY_u!^$ z$AK4EIetNJYF>E$6+z=3E}Mu0OWM2Lo5h*@DbvFvpY)Yq10KmyNe)_dCAxw%4Ah~$ z&iZHoBeK~tI+#>`ZT_!-*En^I`Ee|M=*%5_exs<4G3^R<)F8#x9Qyt9cUscNfk?17 zSGv>bpgp~6-t*cA0W0A9ao6y*x8H*XA|O`I0i*B5J%pFYPa*6ds6uk#J#M^2 zOO=7TDTnM>jE93Sl(&0N1;G*tGQ(6E8Y|5N{fsET1z2qGA!EP%-Be6eIK%w-1AgFQ zouG&!^fxz_|FT$khqSIf?$m@95X+I6SyZ0>aQGhbHF1J67lGZS=LpFcdCsI5l!2v; zEAjU)dgt{;a5{&eh;vLW$L(I>7BDYQP!78{?N%&64sU5~R#2F&I#^6a)TA3|Qj8kO9p&K{(y%o1aa4h$ZkQLME7y zW{I=PTf(j8n2(0CF()RMa1*&MA-A(ZIO(3eaBIwmI}|fG4Isawl`hkNTuR&nWl+vZ z_{4s2a*~1zvjxl8n@fXo)XvOSE|S?w+F`rNRy{O%bJ)(bYl&T)6Gv+S>_0Ap2yPgT z`bKByo3;@F{L4Ljd2^jx17*l!$YkDV04|!%*<%_OP3u0ju2G&8>I#qO98?29SJnq| z&7TQv;ssV<$zWE0rocivy=ErsT;WB;?IXZlFwEvgM=IJ6cg2XU9fo;LWsSMl= zfNQHpI}-`SpQo2cb>*=X$ymmRZn;}6Qd31WX@$$<7-EH1FX?cMoN`?xd)8UBR8G1f z_z5o38a&Tbi-dMNNUS713UY=?N z>q{iyi@XE-L5bF`i0NsDn7n05fb zO=I<~T)gxZzMK0%k`4|2=0Mke4xI)7;N`KzOya>Lo!0i~3`(W*P?Antdvtg&lrK*y zN#`Jd!PCr)&9{$SSuH?uAA2}S=TLxPE?0rhL+ZaX^W;Il(`6jfZ9hVaj&phDt!RJR zE%qItX=pl$@!2dKqIbW^%b`}8QAxZaD~P3B={{596Ug~cCODTNz#VosVc!pdJ(-== z>?#+!n_0uiaz&T_6U)y}kjr^Kmtx3;tg2G*77*``9v<2hMprV2Kvi+&Ir_^CO6z89 zcOTaY@nrCNl9bLTC5pl2Y*z&(iR#A55NF`y+ws+C#X^ zB6P(1-K_PE2unaQ_!D@!)vBJ^DNlKZlrAJCHVeD)@qg_V&w3^}-=uLNN9Gzc#y z5sIIvx-09i;fVYq8r%d`8=U*PdWVC#nROPDJc{AyU}hZ~ABHP4>nusk31-%LBe0hs zOznkU+|F?5oZ3-3bq<|>la3Sf?b&Th9&K7T2RXR6!9m)-GxRFnqA>-- zyVNbA4}gv-low{Q`G;sMnM;0176zh|EHJqeLNdAfNSVb~th)5fm&hpIT)UV9J5nMd zd`u9>!`?xj&M@Q)aB}8WR*5>&fo_ zET=-3!Bp5>m^+d^)LdDL|AzUOYrg$36`JU`%)bKp!Jn|Q;c(#Yq+AaAAs4y0pZy^( z1x#$ntpEY|IZ4=UQJOoG%|C*?M2Xqf3Jb*rzY_|O<-e4LvZsh4Bq7jeN@PJp9~F}Dk~-q|&Cj8- zq7SFx@}mkrf|IZWqbuc)a$hyv)}!lKitttJno!0rz_8g85SD_fE-}RU7a8nrkM5%LKF~zM1gK1kW2S1Lx4+a`A4nrt5N2KR^|(`F@Zuk5e)=hXm?McZDkhPk6GHQ z3oO*^fgg@IdDK^8WVl8WrpR8~)tM&inS|TL_HA-OIAMAvVTzpW`EYA`a9m*!I7i$f zmx5BVxk}?wW#?=<=(RlRvpjf8yS4{+hkG zHESYw6`!`KYD;)xOHPVPgr{SMPTD{JXTpNsIzkUW`rt=!Epmg4%Z7_jWlel8ULE=r z@xl-dJK``Ltt$jeZ0u~#`MG3dK;2-{Ukjy0)fhR}$Bz=_AhsoA2temP$LakX-H&?! z!Gcekb_1ZbtzcKtg33IT<4r3`& zKg7>E)TP8wV!}yZP^86jVzIVrSSy=kqL-it4<$WI(Z zXZS~*IW=HfOFuGRy&&G26F-zagZ|9si7*K(5`qRG3-Otq0Aq3fas1E#T#FL-#!3T( zP2X#<*?dcR5Gl`ZFH8!&(B7Qz(}C{x_lrj&U>KiDtRgj}h!d_B zrY#0#^G{GZH$ph@CGzK3Nya51yfmw!!U|Q}NHK4umVeEm( zQn-~;|J3>#?9ZPzr zRBR2X&vAefWyWx^w;<=0k-a^#abR2jj1FvfWD3sb7SL zIat02N`t>4BRJp^bHJ#M3r2*5Y*H^WFG-Bh_ax$rMEnE~XgBvL_DYM7Vz2bnQ8mTK zF))?k=U#+d>Osy2r1-#m0Mbs~$jk8MvEbv76Z@vU5ZilIiFL8Ws?^tDqkUGDShXb< zPX9n`Ul4_k*r4D|Ps}GloYh`ad=k`2Mc>88NOQS-YbzhhXX2`6}mRrvMH^8b=>HF;1HJ7q*H{6*S8LMG(XM4BCZ};2 zIdme^cgt0*NbiVde!lU2VQsiM-LruOc5Lulz{%k#(NAjY3}$hnBVH+;K@nLAOQkz< zV6AkfpukFJ`M52fzgA}2F&z`-z zApXanNNf!dTSbrbl@!;qtDhH=e$P(Pr)thZ?aIC-O2`EYR;hlLj7D{`_0wd`Zr(P$ zLd+HAB8XC=C_)IsMO^6$+gwZu*F?5MO;-%0=3G-=Lh!W+Zb?C=vf!7JXi#Y`zas z!R&G>B9qs6h$$0>bm=4xSZ?VgWG$w*jxT?)?n3R2%(A8;GlJf*LrX!_%87(+Js{&1 zkkR_>)oPthAU{ckv-gduPHsa!15*?ZilwN;OxhwYd=q*Foq6`pZ$wn^x`y_U6{0v~ z88tg>IKw_+0oO7H$SyIp6hxt%$R?J!7ScH?6m5HFAhNHsT<5`Y%hX*xqpMvHIEm*H zU?kSvz%0gd3CEVA(dL9$Il+>eohyJ93?pw+@JhAO zIiO_6P_bnYDZNGM@fIl2G&&Q~CM}zhdf8i^{u^ zT(@NTv53vns}UG5T*Ct={S!YJtzT3V$1UbIm+GGRCTr)H1R7{B<44ele9>4`2!^?T zZsGh1oL7{U<1A=DTASJY7;-UYQ~TKSu6?ys);tZHE>ahPVN+G2IH75)di2mzBck>P z(k%%eXYH!&1&UcnN*#e# z)j~o^1bQt+AZww%`LVu0F$+nlBhac^NGORwud6`i-4)Vhs(X$YCz8cH0%2`C=H;Zs zk*cb!s|beheFJ=*#;1*|MDK&o*|x!gav~vk+?;xu%g!aNHK+?{S0zL!{SmOgE67cyq zMghN-HLC4F+w}eaK|!z+GW=U(K0=Z0(>@_wE8&RUiO&5~AUZfj9^&&yuAg~uGYB`i z`QmD4B>XuAIfNS#oaz;K;6_ATq-YMnVV+Z@tC3hJUS5p~SdML2m}uFm)6?bB1iddj zJ?6yqut!6_^x&qU^~kbT;`*5qtH)k7;vCiItpVka>hoM9mR0Thx1ev1I$}LuPo#cB z^>+q?s4sz0zGdz%$=nsp9UtcE2QC5o9djozm%D3b6#PANcTML0m$|zM1#?_Iei-!! z7VloR_Zaarx)E3x$GNFfs2WgWCA${D9paeY7Bew00tb{e(;aRty`P-?xBP`o+Y{J7n5qDh?EGNKH(d#5dOPqvhfgpk-g7i^A z;wI6>ow5btlBTz;)#R=`}IxHo{HpySTx>6ZvsS#2rHrm)z zGUWgu>PIj{w@o@E0WMa!LnMeB&~+#}OShgQ1WaVvw1ct;hRD(v7{Pwv;~2y>Veg(! zAp=F)$)5fW6hmJsl&s706{1WdpX^k#Y7mNH-!01DN##YWe$*;nUq{Jo$;mp}PM}uj z1d9LJD1?Y8IzV~E$;7JjF3YS|;2_j5l3d&Tuo3{KAbklC2I3F#Vj(6>2PbLhs&$FI zBAm=FA<+n%C1G_b+u2~K0}OmOL=XM+ZYz5|iaQ?ILn?N8OZi37+Ab)zbuY{!kDPFV zs6#{y{Mei_$NjTtM=z;#azaN;(?HaCZK!!&YR;IhYD-9Dw)uuq)f3%uo!3)2#8QWI zjVWZ}Ld90}QD530#q~`c(+wk0S~s!*k|Jd*<&WHAgb-ka^ZE>XbPktPNp}G$RC6Vn-7gIW*L6 zPF6(Lm`LzN&~1G|HTs}_a6l2(5|d@~_gmeYsk<5BTHU2wNRIVMx+cdm&TLCtF*5}##?Hu<7%5_iId)-IH;tk>8C=V>c095xj;3Ix2dRtG$cwii z$M4OtqTs{&eJK_r1WY_<0t9err}gW&I)Xxo$h&$Nj~Qu9$aW(BZh*IeU@z5|euMEv z{vltrRubdIZJ0vhuDf^`Do$|9@a`7TMUA~Zpzp#mXk~|@6lG8Ft};g&?6^+@_xZ_Do9+S> zonM8p))Sr(8H9kC@od9v-hb0k(toUDkBx^%C?LXkqKzyMQ( zHC#HS6(7V_yvVYf+5vV^kSKA0gqE~gi6bDyD0zE9Ux;X1tFTz45aN(xnn-~k=ceFC=YfDU4>7j*%K6BWj?6JkRBOgpE)XG{ZlY-WGV8jz@Ne2)h(w~)dgQvzZjS@4weWZJ@+Lf7H{FvdvkV~ z{8GSZ0CEiO+g3$laX0jlG@R>;YnkKCrxlT!L*1j_->T481i zG?c!b?0=8^QXDhtg-y&_O?r1A`~?UOtPTn*HKw97$dm;U<6tGShAYapD$Xp)E@sm^ zr%%RsqRT$|5*&(kYys|nrMTjvadD$@X>R~?t@sYWN%tWti=k&B3j?Y+UUU}PE>z*r z{NHIM#|_GjH?j&V)q79UE;<3xiB~4mB^{=g#6&P^4@t0JP+!$arxi zmadAPEn=0CSqmuv2$3T6kUW@gj);dJkE+^nOU9PGOEK)!pb;yN1&!w^mYCr&kS~Z{ zZPhu+Zd)B(=OR0p3aAbTjgD`h+IwJ_*#4=lIOPPBCa$W1# z8{}+57pz)y6yQ~&{i(xfE^()VUDMCbHgI?;gI?i?x?DQg{JLLDW!USunlr~qOi!Fy zjlJITH7anSr$9Iu$MwwdDHh>miuDGuR_#n&12lPTP~r^Ro1ljg>}8-I)k@(~{F%vJ z%%?31N3c>mdo!x%pT~I5Ln&~xujoIBr)vnv{BH5G;s#<72yRk~1I;}fvo!*%DuhW|? z@jWp?i5|}N+ZT|w>*^)85}35Ff=hqCZkOc}g4Y zCxPjQ$dys6$S;G$kCEk=j15U|*eb4ExpJ9&-V>;w0uIBkcyo!5L&9pN2c?cfV&$=M z$cr?i*yS@J4?bTceFqS-`fqP;HFA&*J8=6X5Ey+#&HF;Ms8JR&_+*cLajOXm>hwf#ly0hIR z6UScu~a|aba=~xw2ork@>G+7#E~yDy^*h`Ba~FW z&|rx!XFU*D#V+UPN!}@4PGtC`V&Xt?zluOIZOiJVb~N@4bw_bTrhT)DmYa%Li3@fIlrjL>Gb*(SMOtL3?2H$l-Nsg0X@I57;g#jJ5{0v8wgY!kKo!j7!3V zXW!#6+XF^Mo5DkkwxjScvqIPF{e_bL`8TX|I{{Nh-zM0{V^wey;PeFY@%>_OY2lAc zUS$cfUSv%y?yXS=;1026p-x9z@I?_-lx(G_9LzYaUHb#S2Y1H=u1TC8JTaDV#u<@d zvKigQ%z<~NC}yQf7d}vVyC4_a3oE58=T2?&la&hA zU)1ZAt0C78Z=^4!GJ@%}Le@VMTdi$SCqA=zlfLBA^&`L{e9&@H1^zp8pFh={mvQbdKNiGGwd5uB+Ng2MDbW$L(qJ&9snKFi?kwB$*ZG#62tNj7~+kA2jhm zor;c!_Cr0M_Lu^VktCFyjyZJw<@$=WOf<7I!owho_=?y@ta-R6Udkbn4Bjq$C#N{_`U*V#KVW1|+|I6xjvVg-Rr{G6$c10xtbt<7I z_0acdyY&t)%smac;(S6^Z16jwYx%N0L|-nDVeNaA!2xiq04FX4L;}|D$@j8~(xD0j zUf7?R!v1O6izm;VkcGE<{%x&s7SJ4#5^p|GjYFj}JKS@2d^5q+k=QC-*ebo~)GA=R z-Dn`=ithx$w3eug2e6$OL2P$+itQGbv)%jFc9T0`yCXDM#CJy{$z{Y0Nra?Gat=xQ zz_B4wYz=xEfP-5hj%xuo=3!HL&Jad`bA2UU_bX;Hz0uWtVD&qX^snyYQa^}xnbQ2~ zKqzi(;KshT#N++;K;-oVSVqYV1!=!!8XkR2$F+$e z?F}UJ1qFB4a7!f3VP=V1l{->Uo^{k$My%6@)YHlTORAB|P@oD3DUvb3i1V!7ZX0omI>c&$PT`PEE>k+((;sF+GjmNP7<0WP`i7= zGfDA#Qj|U6I7KeH%a^7SS7eZXnLXj#)heWCc7@quqhWtBi_>#G^WChXe~Bw9*`ny3 z6zjhr<5)Nu60320M2TJ^9!YoQ4<0qJ?cpw!D6Ur;mHcXy$YEBr0~(GG;&U5;m1?>> zF1=)n^!F&!xEZ3=$r0UsR`$wg+m)6aD`)e9Bs}kp^OS7ic|Wp)A7FxD7RM#LTfVrI zW39OAX_3ZZB)x;dFtKOblh{SgCIdOA^gnPZb55zmIn^yF6=#%3k= z5zxgffRrJBes#J@u-h8SV7HKg5O38&afdmA1+gBbSP$4SseIS0y}D(+K1RGX#cHc} z%@pk@dM@*+ylW66?K~9Anw!WeF8DaIpa5~GKs6N*8Rts@cs-#I#=%%SMc?Y#o}C z-D%h?-`@41yRhtBJEAAybBbl^bq&dr5~6HaWUa2>O8}&ZrU^Eq*Io`-?PXrd;8rgTLoN15BSoB5Lt(j3h4Y zG0u$o{(+oeZD{Y0`d(mBZx*rK+SY!^l;iP6jNPXO@b#Top#Rh z4xwv2=vD}erWwAtZ=v5M^m<8XHlx?Khjm^U4#*dVv)ca!NNb(<;(xr4Kj6%9U5flp zvNctHBp9fvJ|Ms8?U_p8#Z(_DZ5oS%8`>$`Ge64G`#6O+3;iiPE>jxKlAwDSyU)U) zr*(wpO-RIZ{d9>Uh}(Tax%ahlvsJhX`%EP$@%|rSAuAsux9Igb>1_lgZweAOV-!nd zphJq5t2!2{N6$Ym1HlrV#7-cWX)u0lG>yj1(KiQ{SktUfW{pMG(!mW2r%jojZImag z`HRYQIGRq-X-%c`Wo0@X7bobnrPBF|hT0fnTg53mVN+*FUjy8F>2mx5$23+cu~pDK z+5Fb{r4IQ`N8}_+HcxbH6vd9D!o`TfHYAr5qA=mN!WN9!I zyNb-%h01hR>I*gWJ%wfKbEnF|Q+%Z`T@>$?LPKk%)V6~aMRGb0YCeON;xV@7GpmKZ zSA`$JrpT{|4f?qLNZ#54CBCr{{lzunl=m;YknqovgcCi6$mRqIZIsN{QCxhkzFA#(x#%(qKjL0zFWqsVB40t zONsV#90%KOqL^&Et(IaBJ9@P9McNV_PqVd0_cHcy<+9^w~wd(bvdh6BLkSmPcl}t3GC1w?}6|0akHWCWL zWlgGLBDSF0^~hizn&&l(rgfiM_j7Q>LCTqR{5apO_MMzH_)gC7bzOXyJxTJ!+uQ({ zF9m#?=g|Q*#XZ)AB7zZuXM!z!K{k^fK~C1Njr#CvJk=ziN=d_Ebdpfcrc6m zmo455#h7Xg6ac$u8Q{-Mu9i<*6fRmyQHk)dj#GI}@Hn$*`3s`L(se@K0jmR;S*r}m z(9o%Cm9g?@tuntoiOYz!UdV&b5Ner2e#c{ONLykn9Br2DPC97q7IY=3ls!Xa{SOq11rh zQlc6lA;)CestY?3Bqx9%+9*WvV;JG-J_-1oz{?w!TeK$tHYj%@bw_b_uhHsjc!gC~ z0j2V`BxibNqT4irIMmo}s~N4OsCw~^c<;6vzAcEZku=>-tvV<2i8fn-ZCm%Y)pFuS zn9+-y=fq>B)efgzo6#bsPK1-wkH(rJ))2e7kj`l*x9HlqxQUJ$>tHEUx^fp|v?Eis5R5p!#xvEMJWl2=X$gW5JiHX&)b zHNtFuXA#tKkuqbWz9DQ}(xTLsxsxP?n6A3nL6%dMi79hPUu@H4Y_lzX1a*+n!E~=s zaEmJWM{=*Lnbhk+z2ouLv6R2^>c-)*qDF}vOc0KiJzcRsQMXTj1&m|M{`p;4Rbrm) zDE9~WK(wx64eHNz`uMa%0!SIQ@%pPtcp4dXEz#c5;M%|=q|X_GAz+WfcnXpeao}*{ zL`gVY8Geq%95tgEY&40f%}=muZvX#BP2D?5s@XFqg2**pqOhz(?*NfxMRjLNDZ_4Q zeiCw9#1d}3mT64c{H`S6z$V&*Q&?56{^p?X zEYV6ORz6wjtms~)tL5?dCSDggu37QAl|KUb>#_$`rW$=b*|E++prtNrI{06A z@s_}%ipzl)%d*40*_z@ySa!HZR?xQqU#v^a%7Or%Tv2#f=herOqrVF-GxOLkxZG*M zE$~zaIeQEUhMVHQ0YPc@qN}vT6GS}+(;H3lWb_`^o+k*S6S(HTrYWe{{Pk!oqBg;cA86xUJ^&x4YupSzlY`= z1QzzD>*d4&;dOsNwv5P%=Es>o$waH5M8{g-S)u$nkzXQ{v_*+bXN&M<+=op_J1MtK z^vmx{6)}mgAVx3a5ZyhgzZ1OvXa9_g13FmD*4wQpej+ zgyXcKsg*^J+EA*<$u?v(h>m}iZ>yx1GDd_XV zvGwr&aPFwQFubPt{w9#jnWR~g=7YB3iwYS2yf9q0G3{ZKtEiTPY|rf2AQH^=Bw41C zOv^)(OY@YZ)L2tocT*6H4*)pA*5%i5_Yh!)za9npGx%fFkS>9o8p=k?Zsd|4ELQwdQIQcvAN8w-sq2w<7Aub_U;u5ov z6jUDt`TDYp|Jhe;9DUDvq>^vfv6`xxarTCDKdfJ>U;T}W-G)%o90i4yAzCZd__ z2i?7rBK+8{mP@HPzysi+HG+i;$rckltgO>0A16HNC>Wr+qmtUZ6bj)-eBs$SL|Z%h z?Rcr%OqL&pKS2n`Em=F4P1w_?tnTrXj>yE2yH!}*xx*6*iSs! z8emD1o@!#~xtiDd+5DKO-A)B#p)8F5u8hlQbc&VWxugW)T@h!6-;QqqRe=_&&jVV% zsV;ROM^|1{Mlo}C>6t%O%xPSb)yajrs9AM0J7NMTrhO?XNceHkxKBhMER`2wWx)=I zdW47w^Rg!lK9_o0JHk{OVFXZwc}3`;{+1@C(wk45uS36@go!@?EseZO^KjQ`qP9iL z6f=l=B7%JGyGrIT*8Gs+HP9EMi+rNz>&(I~UrySRM2mkWrAYaJ?OT9B+hngfrTL01 z#%)(*Guiy(yGMR>(*0~(Z)tWWQ0E>~{7HSaiopjd0I=yXF5=Gn4 zZs7(Gjlk&c$9~~x9U{$kI+2qZ#dt`)uD<)s`9Gx0vZYJu^OA z{4q0r*qVp;*|fUrFJuijv)05uUDw>PS7z<;U9#-EKLiaVA0QF4@o$V~Zp3Kj3>d!t zw|JN_%zsc8`~eyM80I4u6wtH%O3)Mm^GPQC|ScXhZ5f@-A`x`1=}Pcp@#K56Oo`97+A-a;L)6 zDlge(9j%I1S-USyr`6M$ahbmKWLlUilW!(0X|TpYwLQJR@_76|-o67)kD`A6y~~kY z3J^lTQ18tpEUe}*1cCQn2qpwVNkqhefQS)kiYRKZqQ0~wAieiaC{jWTEK)-6p!6oa zND--0CI9DnW@mP0-+kY^7y12@&+WTA^PO*>@6?@jC%%SEH}`d!rLQbonhB5RXPL&2CsiP{l zjpcZ1H`q(F8P#T9_TtpiNQsUCmHO6VB(siX7W4aR zEtUavLTE;QcSC2$VzlaXAi9t~)+w=9Z6M)TNm+qfJ`1IZ}-NJc(G#tYCk9tQ%p zSzI2;(TPZ?7jy+?oy08W_a*3x!k-YHqV}GQ8$)>|FTq9#}G9u9kL$pWdBlOJMcJZm@bPy0sK|WNl^kYn!nn{(Zf` zh+hFEc!Jc_x+i=MrGaEk{761N!xJt+O*|Ju_sqk^`oUVri!MMyeRW)$S$|;`^ZTlf z>j2vIQY)gEu(0apeB2mbdXZB-pN}xVlBL?JUwU0rnruR+(rb6+QiozaWJk<&_z6;9 zIaNZ~C;HgeXYor=+_Z?6N8)JE8Yd|y*3--u?5_h)LOga$k{Qt^R59Kowmqat080gK zk0p5P2Hg-iV9+V}kwN*)stto)25Q!p8zDKm5()LToXV^P%wm3Dw%l0w6T-`USK-D` z-UK-^h-o>lUOQ`Q;gY5ow_q41Tc<3#g@^^C+uS98x%n2fLQHNfJTm!l9A&Oj`6{? zARc~Lc5`4weHXdb-Qznb4J2FRNAAIAxW{>l{C|b?J=gGZ9WK^YwgE_V0}@QQWxj0& z8iiXTf(W(}m~gu-@hn76LS#1La_P}uRJ8Mn+Y$Q4JTzBfilD!5ap%`@eQxbZfcs6h z`mOt}O14-^M)R8-W?G)|Ypso`P`oBoC}5t-4@iY4gCw*9UzS39Xx^9#zhad5Wcg;T zuNkh~CLa0#c#9%nUt;sp)HKHd+8l6Dy&eqFeRc$k@Imv~a_?^!lm?QW@gpDPGklN- ztxWB?6(o9Y;pJvrtPk!A5Z7YthKJ}*i(t>nWm+vaMnaKS(Et5wFX<`v$>tIm6wTLYCHgVs}J!Jv*JqD zZ1HSEj+zA}IYL+E6<2BwvLj{&l=FR~L9t2*;oN%u$Af?S=9@>T@Xa?bKYR17_n(fT z1AQ@+EUE|9Q?1nebfrP^bW>?-|nc!-`yktD6O)I~dcb+h>8EHmS4r}~ZuaKPqI z*-kPcUZQ6*w5Sr0^1K-);r8%eqW*aVxdk5ulDO*+!&&lAcvx+J?yubfha5hNje_@ zt{@>dgqi$Kvx>Aq!evp5fC*W?j6EFr+-RohAzL4BXpGbqN@#|B z!G-yP+khMFUZCC3L$;%h8!6`m(MtV7D445FFz1er>sTCb4;@*@Az72C1idH|MFQE45xAjnR zA8)ipA)j&_&}hZy zSFtLX<=75WSA0Ig{kwTk`Z0x&AP8S#QX%H)yoyZa2xLsFCKcr4fge1RFU{AQ8Xe&N zY#w-~5u>rhRPIGOyDJL=0cW-S{RrW{@AVuhHAc&`PZ}}#eDk8Kq3AzWjqX^?yz4X& zD#47x{4&pAxwOpw@O(@@kHLnFaN`lD5b9H==T9Dcp*i(QW~sQbWRnHpc0Jq4&=;Gd zb8f#AikN-TuFY^enuk_8SqJ3T|5Q=ncojDooSHUaw=t$OvWSC% zX#PNRChX;CDKZ`LkSC+H$+K|y_T*W3ku05P&=VPZt)8*E`Z(C}@;abH?{VkoX3+rS z36)T%_YIWLb`}Yw`tmO%RX;-=Wfa$M>rwn|-~jh;;YUj1Gom;<22*>6fL|NM-$6#S zI1=hRK<_eZ31%_hb$}}7CE)xKhwlN}1^D;tBt8v@WQX6YFV zjh89wva(K35+2bk;Q*q9n(1d0wfs}q`j9^W*rKI?El^R`gUG$P+(GaWdGHKv4tz0! zFP#SueHim)J znjbaU#*SVwXNsXlX=E$=!rxRp87&P{He$gNWPVwsXLDpoU6QF^%BK!DIDKViJtu}^ z({mc{&&QQ38#|&)Sz3W=8lh01YsR4JCM+Kd3pg7g9&+x`p+>>B12{~5Q%7@YOS6w? zAF#ArfKQv+51Fz$1UzI)kM_C2qI!AQ%t_A}9E+efdWu~I@sZ8cm31_8>e|e)z6@EX z5dz*ab%iKWb;T+#`lDFBjPikLmt*Q^rq0`p4Ilrp$#ciUFJI4guDXrwolYhLwsOOf zFmF1bq0+Q*z*#yh9t(-up%v;$h9<4mz~#`&H&{+3R4<9R=GdC8D)HPa2fqksO?yDlF zX?;{hOm|hbAQ~Z91?9rFt^Q;`_NpITRYh_4z?kS&u7CNYYQumJd5e0`Ydu4+@GnHK zbu?e$$Ju^YmB)f0+S-L`U>BBk9N<-Dp8I!InY-D=kan|2V2CI01?b%?T72WH$zgm! zBOMBY79c&0Z&gr`(WOio{VPU$scm|bfK@2oyeV^a za$;^BFlalp@E3^I;EYvj(=0uxNYI4zfrLf#n`~J`+vQd#&o9D$QNVNXJ@!!dpQ45W zqkl@mR|9n!$E|#uY7$oKDfza{WfnDb-3Ea)Jf2LB8`;b+;b)JHO?RAc!_V&6$es1~ zdFFsrm6}!GK%mrwB@5}tbsSq1GyCAqkXRDQDc3Lpr*$?Jc*g%KunnIzwqC#0Bq?;uZ-`UGhaM41K4^t3n zH9B)kCcPpQeWeu&&O6YqbLFM_W%3=b#;Y&^U_|Fy%8Qkk5I>(2io%=Gm6+g=uxdq} zNKwZj)odj3#TX7zi#{l0(UPOwx|PI4ko@<$XrR(vaO;x-_kUm>0BiiUXStHz2M$+# zf$NwG2Rp}9q8@OGXW+o|dE*odzE0$d14#iAY#pI)>DK=*iESQdf3w37w%o zn>`vLubWDp?6Z=^7*^|ro%vlMJ}bijk>8%-$mS8%k==k~zqn}STbHbx-i+$9RkI(w zY#Kpb@Pd<00ar7IRORBaJXaNaLne1(PC_+T6?RtMx|zBmb5|0pMS^h zhH0_Jw1^|qaE7DX;81AUgbMEJt2ubcHU~4*9Mqk$m&zwa+S#`8rdIf~Z9IC2vu&XU z>YH44T%E*fUQw~G8RI7MzWTXQ?_GcvGZKShSw<$CW=v*#iIwljW~A5pWOePF@~P4pZnq;(Un@wrhqG@%qE6Mh2<(oCSn?wW7d(pZ)A zEbQ!?7Iqt&Rx16rvZHm7pjfMAk?PvakH5yN%SvC-QC32DxIo|!li*@zCAPb=7KWBgau4Wt*I*CE`6`gxV4M#)p6Z48iWF_*i57OHnp)Wio%6# zVTE&hJJCbSR(^MA&Uzke6V~fMTjSMd>icy}JwPSxKjnD5l{L9wT}1)6I|Co0$g<%iC{HRzpbw(?gJb^Rl|=s&o~uN(0G3_>nUB3}u{v?PW8;lU-On7|GEO zkx;LZLzuM_vzXtPMh+GJgz(bHF1Rt24?~V@J(*K4)g74ujR-&*IU+0?>Lekz&`r6r ztHXGt3P8G}nw2CTtl947iX9E;{F<%h7ZqAx<{K0XULoWdz`G{zSQb9Z#S?wHGi6OR zF^34u9fuOCc4AzTodQYRwr)iFOC}dLKEHSwCSG^ZW9VvxGV!ynJL2+!&%~BggZRA2S0!A^>S_ zURads$RdeO0{SV-INSutDi)uxdTa^vagwWb-4zv;@aKvQ)Nx)ty$~HdYfs1i`GC%Q zmL-;Xmf+=C7Z5(@OcuU~b9tBrND+d`zW@zAtok!@5=#suUnt&jbCJEdnDmZK_nhoJ zni0y*GuYW?k~K?+49AzSK**p2aB9pLnGbNex)_nct{?`vy5*Y)8o9a;lj+$t!FkV@ ze}K&^Nw+;Vk1g-Oy%wc`DX&9rv=lLg5+@ftoz=|9nC3ao54~>`!AE^ z=yccOVF+bY81httCOl-J&3?Cy)dYe79wQ z2qGIkRag0g6Xr>kfH42S4To@k+3a-HhD-ODYQqRD2nvlxV9%udR{u!qv3LOCXDtWM z*_#*0$`sejs|GCfCJdy#*gIZ zGde8XhB~#U2Hdu<@-8x>{g7b#D$MGuuj0d)J_bjmVb|q7qTL_J5+Axz*X2LrE+Kqz zPr&TaR_A>-fQ(EZkj4?`+m~iKhNm9|6@)bTF(9CYPYimWlcrM`l{t>ar=)QJ<)Dsi zZ;4VbD5K}KuoEvfRp$~sRv}RPuc+bXGgsE9oK2`xoB%D`;sxa(X_Au6jxIwj7Bz{t z2m}%`M@I6i291@O@2#+5&`h;OWfL?}O(!jNsv7z#*wM8Nl>;fhysQmyfx*rE>E~gM z5jlM^InZA4dXttg3J8V*V00)JrL%Uj=nG;R$0oj)HL89KIxsJ)>G||u)T~jK?tLK* zs!#}6VGu}G_ocEC7xdeDTv!%3fNB~1$YOj(T)13u;m^R`a}X{zID84Y(V<8%M{h8T zTP^HBrs$+2;_#w@IeKFh@f?Pn;uyFbvkymh;#08S)l0W6gn5UXZcm!$jZyiUTYCtb zer79$&1Ie(Aj*G}Z+WRFKu5=XtUP|++=D+D@QrRT^4Z}H_~QUJbh)~Y&c<0sP5d45I#M_&?lEPV|IX9Doki7 zF4lDn2*61(Rk2&R80|Qv@eyW14h{})-;gPyj2NNbuu8N(z_d>lzd z#0dH?`X|16hX5=yl(Cykj zhc$YN`3-eBJnfgPUJM*sC0Flk*{>Ft4b5$V#{*cW8%o3K3dvN8)@vX$NquKBI4e~T zp&g+72`ttgo5z;tbJj*_AXy7P3WIz`7(7{F@K})OIR+OS2G>DubOI9c(VdXCPr%08 z+s^7|u@TR*rYC-0HeyUI>Nc}iNcBWe2;iqXTtRYUG`&P~646isR$MJa+x}-&k_Wih zUG)b;W$a(?JsE|KuGX~(^V%S<4!;^Tl1)1orZ0h}ScqiY_4^`?1JX|+*?_whodP`X z!#>!t23F?$y1`5v+RiNNb|w@e_GxvPL%GXCE2k197NF2hvXVDoNIIP{FjhHvve=if z8?fv~*p+-8-MIGVG7!t>&$f1%pCrEajPoB)hTykTfDF!W9$R+)jZqp%rs79p@fptl zJvsjwAklL=F4p-sL2h(566(kAn=Ad+Z3bw!Ml#KRm`*(B0fiZZ5Ti9) zqgh~b=yfy9eCaoc=X~TOlmdFTPW~;Q+Lna+3!!{Mq5gBbV!q8H7otecg6cOJgFeD- zs~%Slxwl0XZ)2hfB)|!ODBK2J-4zOhn~Yru=9%=fyx4P=JLi=E+@aSIFUSml02yFHQWS6jcKjB*ov|b!2-_Q z2d9GVU;6^i7#+Cx!-HCIQCHlPM&$>ykqO_k8pSK9uuxa!N~iKU0H}AAtwX7)`OoVp zIaGy?0@oEsVtH;c%L^RK2LiykypmP!5K3|}pmI^7pq6IpFbiE_B`Yu#2ZIC5cYm#| z4kbB7JHJ|ZRkoN&dqNh8<Pth+JSk91jKb^Nw-^!RiTE+!pnb0Lw+5to8-vvt+y` zhL=}{R<3gTJ_=Z(KcRW@PDim$YS&D0uqWYVh@;7z1yH3e_Tpmzm)fyCRtRf-Kz$-` zpbngXAJsTMqcL5e#xwy-Jy+vm8`G1K8(oV86DOF}S4&46buHZ~qLL7kjp*5gOz-tb zHr$*Fxawc|2oG1X6m%MrgTg<-Y|iP}+d87$hKYW?%y&9rd&iSEIH1h4@FQjN8Opp`%De$$SUsL&GHyc>?Tgt|d5e#M zB}@clLR41olU&EJyK)PQf`NIKfpc*a-HudaFTY%)o=Hk0oDMxt2oqu|u-6?V8)Rm+ z!BmD`fk-Fk165TrqNk~3o$+-6k^>Y4CjCnuCj014yEXfTfWc^41Y+q!9&-_?-bg;t z@6>PW)}0R=Q0^u8ktBSEby=~e_S^~F*1DG>!v&-(@DSaL+_1ZEBg~b|zOP~S0z>0L z0XRo_0FR~kZ@fk}D|HlQB}}BFkgFm``8$h3maBvwH&>I5hmdL<#V^;$QBoSAqa;F@ z5L3OQRGuN(AhXUheAgoGKxQjC7E`LR`Q}MNAo+=JdbDG$+OZM2P>j+0( z2XI-7W8tm`9DGPrW2s6$bc0XxCOp9SPXe1)gP#!hkMZiVQo|@KA$&8#JkFx9$IU{I zn_F-bJ%!Z%8z!X@8s=6ZOo*w#Fwc=}kXdJ#X9*GuP=>h;2&t z3m1$-Shw*$+|6q#sdv+8t@U{juf70DX!2Ih_f9EJe-Q(W9+c|C=#;|-mZHUVOQos7-vr_6KY@t`*Kg|vZyPLwm+&Kl^BD&Jty<}S z0k^Hy?Z}AULPEk+tNDVXb`;;o^6GtQj_W6-3B0nR4Ir+!^SHt}yP7-Rp)I7CPM~}9 z3OeW{q|iYM?|=gN(1ELM37IEU2bO&Tb`~S>yLonM^@IXOCS^TI5~*E)g@8%8iFP=W z(>OdPd>oF8Xi!GY4d43<^2Y&ZdcH9xlIG}ei8!k@_X0vW2U5=W zC?_?;yo5&3O{ScLnqXR9O@mncm=OUtee8xwNR7C%7ZU>S2@hM88XHBoPEZd?|BZ1~ zFDY4$MTJ;OV;yB_M2jf;g77%JB~h}kE)A~3>EiF2fNQgGL+aq%n@}N3jgB!S6YWmf zUcK(i4)uBtp0uWp9?lO_4@?g{Ol1?A2Utu`gj+=UzUg9E-Agr7PrV zq;GWjG>joEGDh_kiKwG0r;O!a>UNGMvVfIO&5|klWkIrA(a!hFy6Z5w(|JM+;pt7Z zV69Gry= z#5OG2jiUKp0MP{v;dC`txt_?jEdI)p32p0o&!z3U*o z_+?(hKd$e0q8-I`T2*Yu;z7~sd*osqxhS?lP9u(#glS9%^362LS`)YloHpbWD1AJh z*T`n2%2HOsM1VK&!tTl%EDH2L5PIC~sG9)Z>oZz>WTEi087V#Hd!NntDXAzZ{SfG@ z;ujMcN>-Dx6OyB~0A;!le(-73eMl*V-G^O>XKmm~7?#|r5oE{fHqq%z6L_V+?<$F- zby0wDsb;HqEX5UGT~?}DWhI0MctUEfYIaw8Spryh6IR^(h%Bv#R9iwsx)MrjyEs{E z7$lp9n2lt?809C#I}u2ttwtma*^J7>%^J5K4~07(C&0{}a=_S;wNW?%CLs@wQLDBC z6v+1wvk9@WfH(w}Ggq;9*=7iAo%k8R&~IF-03KA6RY>)XF(YdUsA^=vT^Q!r9_`QX zY8^uv7;f8O{Ok>18nY%ZSQHc&@~NLv6HAULX6Hh%gJbeX)-EJB(`IzWDmY^hO!Kq; zi`|CT@+h_l?ul|$xdzZFS?FdNbiQHP^k=%Om4IPr@6R2gy;K66{0cYt`L)4deYf`) z4)Qn1iPpzse!0-6#z_h@39G#We%6LTR=U4tX!VyQ5Q_}R|5oI&1ef}@@zlyJ$Hnjd zM=sd@WelcVEMDD9T!;*~_`SHm&EA$;P$@D=GdKI>Demm$5sf808BGMl2`9wMu#2TO_n~V)_ZVcZzU@Yp3X(lgVx!*Yt zd!4(uiYby5v9$9hVTUkuvcC}19uAXy)$jDw+zb(0|7`lJ9@B-uqmS^n4gMGQhcLi>u zZ#Bf`BIA{W+Y)dIfo*VPeZxTBm!B|_|9X+|<Jq#bRT|P$+p}9qa8wg`%tX4`SW*NA?!$N)+oi z7PHQpS9ii>0qX{?3F{$%V_j^B^_%KgPqkjI{E@th%bR^J^KE{vKjpa0!_{%w2*7bE z2E^qpbzG(jE?52}1^X4v3tMpF8rpjIT7iHi(yhfJrHT)C4i|_N>ecy7CQ=CCL=poM z>25NhNaI(KtR@Zz?~LE~Nc8AC5K}H?#`s&yk7n@dveK}itc38u5R8x8hjdrAViBOd z7ie8rwa_4te)GuZ$!p~60C_I@5?{h)T2;)%!Y={uGmLK!f*#}FCH;6?UL%{8GOnzI ziDbMu{&rWkV^JHSgt%}0M2f&Wb?ZUz%+acKFWC=pnF4Qz5 zCb_7cQCg(4oT0p3l~ex%@FPa8MV^rp%#A$(Y%_)#E5&jedF7K#9)hWVwQZXEe;P^X zVPy^DEPNYwA26E@CCsC2|4d^p`)d$CST*RUV0N-!fWDNFy5J0mz7pTWhI0Mc*Bag3yUUaPh>I$@poC$NySA_pY$)XnIzAd0!F2V}14T8_%zFR2nMl>4<2~*uNOSqnmU}w(idC#DEh~v!wemb~?(COz!Wczf%N*|s$hQrVi<44w( z;ZQgzc`afT)iv3S4}0fPaPj;;h*b~ZBh;g0spkW7Jck^UZMPXJTy6))AC935d`M{Q zX$feCi%1B~ACF0gZXaVcg4}Cln~(|-fwlAt6(14Z(j#3C%HC&(eVcPs%md)I(hKq` zYfewfKEgrV^p5mA@Q|%xMv2*}F#f6GpOW%iAgw#T))%elOG`E%Qs|TJQ*K+An)xpg z9tebuzDn~M0S*E{$mKo8U>TSB18H(EAuS@BKQ~8H)ZNRWDGdRdgX_?^&${tcg4_@# zUtn%1p@P z{m7Dg1+xvhLPPAM&iCc9b#Q3qT;MTvtz9MH6$5k=9f2Ix1Jg@BoPhD6yt=HkjZ;=a zc(`^zauWR9OyG4_4r5WE@33?ht7maFz}s)4r})T1Ve{tYd(GQBW_k>b-iDuPq5O&exPIUmHo_=?Y0<7ZKgiKbSXR4SEwFBGa~1+eZjwDK2%#R3+g zk(mTTV`ZvmFHR)OGWD`}n)DT1hQ{(uL#D;im5WGPM3>Eo4vv*9Qp+P5fno*ov!Wr) zDk0^}mw?U)=8>Ml+{(qwjg=@8E2%WFt&E%KMC2xHh+OEjo6ftKeFC#BX3a|W@%=jL zeI><(#PZkQVk??rzM*D8ab{(b0iA#L@USwtqdlsZNIVG%nMPaTy6w#viXka|#Cew) z1(!+KkWvj!A8JKVEkM;A@HCdlq?108`2d+1K?VCwAf1(L70{5UNivy#RSA<&3Rcpf zr5jthlp2s}S0j7)@`&xCA#nHgnGp(u4!$8(j6HzM zoI<~<67Z|Fa1)(^^uU1js|LAAXToXHd2N*YsIl3^m7ULZ`p2IMZQ!)4 za=GKQVma+4%_#7JM{H+&Yb{Y}T@PI}{{zG7+J`S?$rfau?72NfQUW<(dysa;T^eJW z-#xE_7arkKy@Gtk;udnQD_;BPi*?WvS33FDv+_-(e69I-y%5&ZPXqo2p6-M)f>LBU zOL{7f`~HIiGqMwmcX=?J7QhNY&#)lAqSpT+gtEwe%UD5A?}wn71Wg6a^wC&Q?H~I( zgi?rJKr6HMw|3TnW+4Kn%K#v%`2+Y~p^Ss)T1%V^}r;+q+^S-|zBf|C9Ds#PMH z`ip}$%TF|PSA;{NOrr#?#Y(?%%=#xm_uw4x*dS;o0q1H#e1!UZu2XtJN8#+xje73_ zwE7B}v>{iU4sFQQ(Y27je%JR8nROkrnD2HDKeeeQ2|ujz&BF;8E}L&u>;z~x*}IGA zBrI&FG3oW$fU|RG?+wT_ToA`m?8;I??AEkb43W zv&9mkb(8%PrGexZ_>sx@43pgq@uv3Nglo@@xY#Mx>hh%>R6yV)FwtOno?@$^@ev2RR&S&s`f@ZpJ2Z^5B zaIw7qUbzX=EyLS|^Bm-GQCIIhWG;Z)LxM4zyQ61yOj)Poq+~){18DVv+I{H3X4a!z zxtl~{krMBFgS+aTOoX#2Q_k`SB=?0}#<~t{lxqLdD+0LVAk&qD7v8Y$bPQ0-C0*>n z34bJVs>oKF+T)-v9}kYs`BTPQdn_JX_p{l+0b3n_AIZyS*y>o>>R#|*%`^uY&c)^m zDq((8n^hjA=7jh_6ltgti^yoi_~QL63Z)B$lzx!m?O|lly6IxyLxhVT;5D*Y=|rfq z5+(wiMFwJQqX!N; zuz-@Ur^RAX#U?vxB9@ra+9BY<8SYR%P;YU*Q89wv_ z`OuS4M$Z$xJdTU?regpSJ&lC=_U2e-J;N;K_toAUFIoxVZEXpg81~jWhW5S(0K?r0 z#80lYFr>ri;bqE~zE129Ml@XSJB%lxgwZe%DOre4A))6;X#demVJqb5r8vw!)u1N> zSRSeT$6+~58PUruka_n@%#UB-)n%pLt*nIb01q@U$u+Xwl^0nQbWgY3M6V;|I`h)N*z&I3E{zdLq~jzMWKTWgdR74!AFqnCJ#hx8=$wBx!Zht0!siB9w6OnJasS8yE{(o18BupX|Jtj^y9DvDXq)gXKg{ zyOogb5|n}UrLI_#OSSV!*sp7~;^V|Ft%ED>0bB;S>OUwYqPKoqkKR`T2ROb0KT-~# z5xtL8^!^mMZOmSP4A+n(c!)}u_$~q@*D$q>sdM)oQ<{JaL*8Ev#(@EJbum1a;sLxy zHY;@~WhG3cLy-p?+x^Ja!JIy$WMR4q$<9Vbwb0Vd zOtm&@E8xqWsX2JL)PT33h_n2ycz|n*Tr3;NwQncdAz+E7Z%gPJFy7#Vl#rs-_Hu4j z@eURm1_%q!%GfqGFnLjPzI=Xl^G+Z_SS5WeO0ABYQbNpHh3esBtVAj7E`dWCcawp| zksCPdJ<5(oFdYn~9nGbLWJz9KR_d_IN(fJfO=a({3@0q8+-u4GjpUX_D$y>|LO!zp zZpe*F(^GO^V&QlhUL%{8l2cZ~M3VFU+^-+YvMA6$AoK~Pw1%){$04DFu@8T`Dqj^X zEt>l{8`YhZenEf0H9PoTosdfD4;nrwKG>E9x_a06LTUED;-_3RV!pdFo{Ys}PuxFb zO=oo{>&+Mz3vkBJ8AD=;ibX-$ESCDUM)WX>y6W=?@mP;*OHw{uReO}#{Wd|d6xI>5 zmL6X41Q4T!*eaoA(aHo0De<0EHsGEj12(X?Sr`3>vZHRmdo^OTbkxPG%Sv5TSqb5r zxoDY1LG)?EoCQzCDp%HIzW95FZ1r0&DWaTpz4m?aSg5gyR@}#8M4M=z1)-{~xX&8?*%4vCRw3I5%FatLE~vOklMN`U!z1pm939&7+eTUg1;gx z(W)rtX+9#Fcr33jE7iQR62dpr{3F!|GMSx4f0p#m;XX)fG%rV-H7YWJWRnLAve62rYV=h z-Ds}n-#}iq%6tnCdiPWO>%GIbnKZB}OT~hdm&m^Il6T3SA8u=BLq(bZv#t}=kT{vZ5E$$UnakCUHMd)9`DY?tptWJJA4NSJCnVcB#Pclc=p4Qw9? zNkV82Y&XKM!Tzx&^9ixBU+K-rTD)1;`BOrj1|@_v52jY|>iBxx4>mE~8+s78gIN?b zTBbbLi(zuxXj!x`Q0};pH&25+{{87S-|XFT%V=l^>}qzY4lQ7LU`6b-?V<$W+ID% zo5h44Hv_4^Nk}!(%P-fc`;yWKqt_rK9x>VIRn+zGs%%USBw{CuR3!^uI99SM{$M1# zMt=y|+Wg;MhxTOB$($gS|5t?3CkNTqf3ga@P222WW192(vscFGb~@K!-SPo z@*u1%o`)T1U>mTBDGnE3m&h08!l3t2_fAZ-2b>nfUpL8OI~+>_DdMK|8q3_OG4d?c zn59V7w{x}-BToYl|K8oH8!Lt%Vy_FY^x_fC3!5f6#9m*$EUQZcS+zocz#v?|tw-dQ zfdhQ4gdaH-pAnIN$cSu%@ff5;Os2Epz>`Z4b#E<&|alWAu*{)_}u%8s|~?{BG@ceyQ+)|H`{G5 zx*Qbyf)- z!>rkBb(#ENOPrRH&3O|8W3jB^_m{yk2Fg-yEVapTzv3imgBhpXvSz6^Wef~Ob?|d- z`6cyCrqU#Qk<6ZqJPv4*l!3|IC0N~*N`ygrNVh#Uk1a3Wt&P$^vKD@%cs|1u&&<|} z*Fj3OHHg*E-B+0P9cD4VuetkPK)VpRp6Dbj?D`qu((ca4GCWNrncUK@EtqyB&=VKD zR6dFD+oE{%cdDG;vg0zPlCkr4NN;TC+%}8J#PnTaV%79&VGeEs!uj7mPguz9%%I26 z-fgb8F$D$Cu39NnH(rLk>SeH-RoMjyjQAS@wz?G`A*GTfcl9;tpvZ~GINRD;{R2WZuB+^ca5h6PKLI8&K*@rZnc2TDp^}k8X zFAg-l&mZMEBg7VjI6M7h{gVhN2^nEbP+-u8jBgRX=o*w4_~?A3TLpu)<0v}ezf&%dee_Yh+arS zl+j+u%h$g>iT&5e2#x&~dM8lv^%LpeynF1+<6oXT`~30*^$=7-TdilY{CTRNJm9GI zEZ2zYH0o>z^2by#(!@3TjbR6+@O+**jb|^S`yDcJ=TA5U3d8&dy0sC$J=9WbbQ3*ooS-n(J;?~o1TBm5VQ)zFn@$vd{%xAfVh z=npDSrS3cBxy_LF+-B3KshBy3GkrlG{FdxNoG5QgwV~8|ohbF5IhE=6Wa*DYId3z( zbXO`Zyyu=5zYdle>=wQL`o>uYnJtW$od+Gvo=niHL3RK=$r})5Ve6iY;h8hnVPOj#`m<%0jM+*GTzc* zo^Kfg?MpKBnI?jAYinN6{?z!o-hIY^$Dirz)eLXw0D|eXPfsfwqqJKW-w*6+r?51p z`Q81Q#Q9y>U*T*Hh1v%g6$fam43(>6SyFpK1<-m4eT6rc-dtb`Jdc6B{yW^hg)5G0 z`a(frdnAn;A0C(|GQE%p1p>x8tOmLc>%mmQz9g-Z+>w43u^eGM06`EceFpS z;Uti`1*h2Mg0&*M^@{wUE@5<+F9aQtpyu~uFsMM_2o-I}R;1vi04np%0D#GPej5OU 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

)hyiuxjTrS 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%0DkgNPzM zrOfk7bMg=UiV5?IgLOcG=45vU>N5=zfTuDPhTz}Xin&KjD1t&EnaQ}ZcfF2BCV;6Rf^`9n8Mdz#$C{pcK|s(`e)WD6CnS8;v7d(7#rCF!HA5Hg`Y{kvf|A~X07bhOun1SfOKFvT}Y$b-2DZkw2C&uNS&4+dM!~-_^ zzHCKj=h$&$osG_A!y}CqBO@CdXO4ERXskYN^{TN|$1YznIU1C7`e;ldd zd9}zR#7fgSS|*1Q(J`-}4m77LK7n7^yjl%gv~|VbZ#EgV9|%Nz$U$#BWSy3i!ZjB9 z1Pc)B!l(R$SH(OpOOR5<<^&iOG%Q)Xgq{9xtbeUYHKK;wY1XH|CNzsOuL5m$q9jSjFh9QMjn0KkvUiiiQ)N4fpLg6;+s5(DJneMLl+L|b_evHh2 zGUwPo2F6AK<-CQqy>Y+BB@Pu=*N80@NN|UW3yUtnCMS#dAu=e#pOm|_J?nd4yzDdb18|HnnIY7Zg~UQ54Yak@Z7brj_P$i+ zF^*4+YzoIG_CkE(UKO9fWM&)i0YOla58~vcD1gGxR5EFP>a;a$%2VfzP1n&Xynp!I z@y%N|EB%bSQj_I0SgdWJ{4tD8p`*e7@FL><Nke?uU|A3X-_;F_nCXeFuHqiwbzSVI^r$fHSL#bOR)G6 zqEu1O+JY-ksa2$PrWc*lpT%z96WN_#TL6wynFKTwRVtAHVjl#nJG*%jMk$BpNi^S$ zSVYsKrF9F+MN14bnv3^@(&WXh5AwRG|H_;(_AxvUWMg;Q_bLqj=Th@<~}$VB@AQ zy8&zrD5^Y{u=4rWwtK4qM+|4X75h|0@uk^;bvp!YdrWQ7iy52wEXNK0AxbkFiU8hG zdm1(#>|MNQm${bLJoGL*l+nyNCGDw7Ue*1QxV!S}dx|Elt+J|TRoAL4>WOTt zQ{}(4NB7Er%#kd3Zxl^YaR9O=O_dl}>h6Yz9yM8%=wo;D1L{yluX9AS4J%_d)t%o2 zV|A_in>5Y+pV+G-)%VwVsXj~*pq@rxMQ_SzR`iI-fmI<9>QfroE;#y2XnWp6B4eK}M53r1HO-E_+C-v=W<8WA-qHy@HBlT%0!lJUv zJ}rFmUUP`&MD80VL!03=XEL0D^^mz9&={MZo}AKYYN;JN!36v?OhEL16OWPl#;v#H@`pme;QWMN2jTxAj_}!sOujtTZa-f@ zbGrU+D5pX9c`y4+za6W;A#U|ZQH5gAf&%T|q?;|u zmx`~TUObZX%;`$x7O>Ree}wPi27eO;JgY|fofDRWT+JABpSYYlYg}}Df0vp zhpHf{;hLRO5tDvGS*1S`p~n{t_tA*a!R`P)^~c=IiQd4nr@$Jf{{dx@-i#8(JnRPR z2aGrG7qOPHSVUa~#1^)u);hH9%qoDg4J|tO5&AQLR#rslTpz{Sa?n`3d?3K9sHk074 zyx%1>By{|qLUT0gw(@f{jYPXZ6c_F|2_g>v%}?zlEA)snS&x14dLb_eb-mEfMNAL# zZ7bDzoJzRxE-8pIXE781rAX7RC`GpmJ3W?1@=%@)S&zzR=uk!QmW+oc<1f7pZ0gF; zW0=S!vKP$vh4(1nJ^r+~Sj^)wR+vVamxLDT%2qZ|O*4kyS-oCZiTXyoCTiaGz{SDU zT$n_TE@q*2uG$3To7j;VyQVVT{^A8&jzFagG)jJc>fsnn*WMOXm$@iTvB8Al%X9-f z+!;sUtP3S-SK>uWZdWoaA|($|RQRULW{pMLZoTQ>nFGH$MwBI!F9UTwgU}*FOx^b0 zyy?fkiGW#+XLw*rmX3>XI$*hAJ2#J-m>~7oeDG7yh9@RQ$G0`mlWE5T#_Ia5_!2D9 zlg7L$n`$?48O0nOfvzR08_D7hTIAI=G!>&d{0OKs(d=erOhHp~9?fJI5gn|g!dx$& z)a4yo4cAqOjyD(sn{-EF5*U8u8v#I;h{$I|SU;Gd3xq1{e!=xrP2P3mi@=MH)M{i_ z01a~4dKVsfqlwsjPQ0^{#zq>j*z%;y_^5c;Tzu-t%=LTd)7&k1Jr+B8Xk z(it+uT$RQQaiE=?X73YkuCShkpH8MQZluIwZXt`g8)7`70Uy>hrDx??O+Fq)M{)WK zLPDunrHK{LvMGnjkdYvj$f^7~5uY@24<>Jy?Z>NKfLE^)p{sYvafkgmcL%+P+2~8+ zb|8I4HDl5c#w!vQqZL#L$X**D^KZP#k6S7$n&D`(xjujvem(Nwh-NR`B*65zlOaxB zTucQMivt?r#&~OIwGrNaEJnbGi?7?t1MR}nW1_pusk)`XKxz-j+jbgPJjZU_ZqaG% zkeqgVqY(;sd1tn!A24AC(<30hj?|ZsD`$Gi)0Fif2?2cLr6wKjsY_d#TqE5 z4kBHCBFN%(Zx_`I!?d{tzdT3RkCv|kT4vTRLUz-Zky*5#Z*1H;iGE#N$_aNNbk@(Y z8n};aL2y9E9snjfBqVykP*;7!HvF5 zz{HdFEWk>0%At3M^zNYbCz?2Ut3n^jF?yePCaoPHpWi7`#E;3cztczKF#j#%F;jms zyQb}mm3wiYpNjmQ^is^Rg#Lt1XQpysU1398_&CZzl26@X7=i{89A4z&1y|T%QU<=~ z=Jjy@Hux-htXe2WI-+SkdqRqQ6FL?&F?egyfwiwMi?F3Go5Oy4n4m~qgf*vKhn4ge zb6x#>bZ#&yJw9CPUxQ%<*(Ke6Op7JW<-)Hk*lzLH{o_C3o|BV#!vb0ffMo-NN-n8 zNR`ITy|`67B3So8m6MI3@*9ypTw_C3)Q9>Twi70qWHswx|29^^a@r!BKwSd)^I?_> z_laz)MO}~|hEx}HdQ_=3bJi#yIY;C-P(VmsIHdU?BbXh?Mym4GkdYLLkP8M9dC;D8 z8Hk?M#@i-j9k0Y1kBX?Rk_9wBG__1lDBa%DzG#eg$-tqA4ld zW5zM0?7rU1WLC1d@D78o926mu2=PG87|jX-8B%rMjhT8#f@6)YF(=4KjK8%WW^xZByf;Dlh9+Gj(uNbmuBH zwWZnzUr!qI0hXt4G;s)$rzMf_)IE&##D!s+;q_eD5Ef7W0(+dGjrxJ% zZNsPIWXszHa7?a8I&!6CX zEz!a`gJxua$wz~Tk(mT%zC`jo8Z@FW{YsQuEJmD+TuVk?HlF?jZgfVOGN+>DF9!K+9h=@>q%6aY!y{vBi}lH~C#TMtT)VcO?KwHyRp&nT zYuA>uIXxFk=_6tn}UX=d`mi_Fhh0vwBsMBRU)TFBLzXQ-|*j5M)rDE7ozcZpFr!j>`1 zynfV2a?|j>(hzcQ8|dxT8aYuqgd>9R^?U0Y-Y773(hGKvAK2ua{k1(NKV+OZ3)x2p(A-VpwJb^JV_O8C1DvMfmL z=)gCxW@H(JEgpOnM|zbp2?rx4v>7|K)R4H(gf0TcH%0k7lxyxsfTF5wno*Jq$bc(T1!wp z?orHuw)?QbET(#w&s+fxhdF4`2Q%^(l8&3tnUnzKQ!r|W`BYdc6D#fzAra*`S}4P0 zER*`J2CTF`c={&bz`HFD&|KrOb1e#d-eg#nMaVg0vm94TwW7`Hgq?*l-)Go;UA(9k z-EI=D)~Prr#7V;SzD@dcJpE7n^3r0Jg_d7hegsQxjnSQ3hUolDQ;4o4FKr_f+&WKX z@EI?hvd;}3X=?fl7!aHP2Vl_^;-VU`LP>tpI1&GeNoiahUEFwVh~%LPF{-*)A1r7- z$yomyHXlY$q@rR(ZY|y$H>^XQ#R= z*)^RtY4O3GnqT0(xXm>pi&SezZ6D)0g3ArLY8ENI_?_9GS!O;4WYIhyB2voPZJu4& zgh)2$?)!jR_q;}9hV?T5j$0QIgL;p+uSPGygQ6g3F4_8e>BXSAD@6m?Fb5i;Hs?f^ z#ZZSjQm2A*hw;WBC+^XeJCep~<#fbDmRESwhaMcdimtp*437+#ZKzpk@N*w^ci-rWz#akoVQ91R5Rz{eB)U*mnb)>#-+vBJl zcy5mKph`mMNZo|M4jvN~=48gUY@M7LKWlPqbm7dVsp(lN z1eL$mKv#^I3W>S30tuYZe<6fr>#j-p^7bYUg5KBGqoZv0K4|HOIO%uaP zqOL+}sv$GOJ)2Ud{Zi-v@X$-dWepESi2xOJtVfVf=TcGYG>C9yRh3KC2D!~pWHn^r z%4`y><7dR6fU_ewUMtBL4k(wm7S6B zqK7bnEEY{TwG)Rf-QH>{JGMWy-LkseP4Do}QnP zuLC3R7k7#6NJTu!G=(M;(6S8wPOrpH-xAe06C(<`S=#0Nq`i?j&`KfhO&Gzo!a*P% zp(~RxV&ms44PuZ|T1=p-g;eaYM#nE_^|f8F;9*T}L8|k_Ymvr_xw!ehAZpctRhxi1`XH#5ucoNp{VPM^i;I-X1_#0pz~PK2_b?V@ zgX&5L>Sf`|<|DkK&2FLesUMiow40v>J*CD~heX?8k4VNUQOvrOw|Z+RpUwR|Z}AO- z*E@kzAG`=<<}iuWz?6>E*|5s=yhGgSnLRb5zFpL;vbj_0NC#8+3Y$KM6h_J(5i$FIB!j77f$8&^n;IP} zPR`5@PfYN53C8AC2AipR?0-ZkdyuH9_gxT$j(3op#{jR0NF+PMkshgahos){A2Om| z7-c8qgo%2ZRwsDaeE^=r19jZS`_QJ8za6WR6EiwO4E9ygv#vqoD=_~TA-yi>T3mdm z5+%#fR-v)t_Ti!&FK%R3r%3((h?Pr&Ib?3Yf?kh%qtakN8U13O9%p4TPSE5LwxsFY z2imnlJ>HudtHg;ol9bOxHMeDR8V7zb7Ta$4Iwwpif0{0cMotO>Y)WS{uPUTZk*<1x z_#lL7@h&ev@X6&hKXrE;`EwAagnFAgM2=2`W80IY5qeEw#x$l}_GSkQAZRF_6?3m7 z&d}{(43FC9Lf3U|N$d8};;UPA&CW|FjpUdB(=m&>mulzw8;MZ;We|!>P|?^|2I5kC zK%~fV1r50QF{ZAlCi;M#jPSX(UnJ~UAhMQl5)-29l)%(gs0|g+ShI*B@Mw!yE8-~t zcl9o=f6V8`x`7$Zd~rvWsZ9G)(p3B5(5raulSH}h7`HZInOTPGP{!OlLjp0$Y+qr1 ze6+~X}N7zv4vejZ9M zQ0Y#iCKc`9ML)4tHt{7YFH^5pK~IuFNQ|U4b?M{qD0j!)PHzHsrcps?r|!SucD&U4 zMD>=9`sP6H9IFS8#x8Fc1p`|~VY|S-i{GWR3q(yv>a$mvm(lz{J<6bYl>J3%%6+AT z{5_Tp$sL@xuuxqfntPf)g>(-6L}8zw_nzt7@b_~kFwWv@9)OlnlwZF6g4okQX^ zl~$Xmj>mtcMOgkvA|-~25DpQ@E7Tw{2S5iV5`=B}Lxx!$Jfz9H3SA!cdWAf>SLqe9 zgDCB=jp_hNpOf_!0QU2jH;+t5vprp&>Q9w%e@BSpcj?qf_EnjP3E zmxdb4P%~JDbZdR|%<(L!S2rO<6*;MdTDekbU6E|2Tmf?5Mu~jra1794wpzvr6w<<} zSq2&&4i?dw1yA!f)laM=_3w+jN@y>f#V;3vDmzlC#eF$SHKP<4)c1*m0MrlDLJkg< zQa>efwnYHzm;idkJ+y=n#889g3!{Cblf!9Y>lGB4pR;%V9U^xZ{8XJQTCbU=;>ycC zr-vnuff-SYvGuYTu|=|b1fCbyji9qsx$y+~YcDl?bPrLpQrPG!c9b~~p(8KA(jUa- zjO<8JovZ0~(_k#_Eq z$K$(}mf$UHj&!($9^-5wr^nAd3bkT50Xo~ec}YBTF7w2Dr!a6UPaXix@8PROYm+_roNs66y*TUd68>qojy#8l-EbgG`6Xj$^{cn2^a zK6FuC)z2+tUh-`uP_9wR5vOG}*zniAgd05-_&6QNM?b=du}(Vz(u5d?i-_x5NbCX7 z7M!gS4#wNLDrDC9n1VV&pxam(mv66Wl);e887$^mtqlhYZ)>m=}rl`gf1xoyB zOELH*Lw*3IiVC$-sVoEkN8-*JRP5}DWc((syT}YP8mjMsn!Wb{` zXZdnHrWIjmdgYH%y99h^7BE0{=5^!8|GXUeFOQ?$)O7FGv9951mk~|GB><$-kXs_w zsiqK|&Lrwrek8jNeDWBPH7VGIG7V``FOUS0mv%~WVOdhp=l<4OM3Zu#FqWC_hZgZY zn;;zy3Nd3frqox=tL&}kK-7lMoETG*p=)Xy1!*%S)TT|t@eO;0WrOnxW&s~FvLS`k zj$@+siYc*z+8-&z3SPl{ikDnw7$a%!KXJtkAD+*WP|#4%gAZ7vu8a{E<0HefV?fB8 zmD<^ndaG8qCWdD>PEBtvZXU}I&ko}guipo>N=JB;sF-SMjZULA{)Ze)zMzAFpODfS zpxk+(_#}}dWz8oHO;Wz~-(s*S!c06GqF2JE-vv1CZ!-*4q*+(l8eAGcUOR*9&Y-Xw zHXdd{^MkSLL@KK$oo9bhErc7SDd|BjCgi|01%>u*0ccD8H21*;3gD%SMrC{q}bid+O*uq||Y0Ma23+YcOQ)V+r>@0t9!c zC7a72nYTSH1^9LrZ?718pmCZPH^o}^L|#NoKaRyG#g}&VAC;G(6rkjtjMGFR`^KC+ zB$71uY04V+pZr%?{Q8)u!;D?HT%ciL=IlDkm~2Y{dNoGV%}>>uls5R5s7V7RSD07x zIe&Wa?Yww8C+`P(HXKyTC}3M?&zbT~Mx=S-1_~1i1+UeXUJDL-rtDQ zn+euJ+2}9B+Z>AN1_w4DV{OBxf0Dod3{lia=J{w`P?X#nBI!Ru3aws*c^szG$1|en z@i-<_ZV5GPGMtHiZoO^hP3)DpHkzWKB^#Ioja7r9LVj6Y*Ws)yCM;0s`|2QcT&WE@ z{V*aB3H_PjeFz?p@s8Nqt-(S}SWqUqvzYGY96}QuF!oo_RxQSk8}tHHBK_oykI^F4 zS6pQOM^sC-5oC7^jq;}Hx8^^D=3n}G>eq3zPm7q;ewjdkwM|L9X(|)=hR9!B>&NzF zvLN-J`v$CdxYf6Pu2Qp5T>c)VbRB+2a~)?8!+C=#NBK>Rsbwa@w$!xV%9_?kL|C{+ zbZW4`sO2h|_Pd`>1k9BV$7Zhx7 z&cD&YCS{FV=MxpgS}I&3a(`{_hE#C&6J+PExqX5~!&Ty==c#z1S>vBulsa=bV?;&t zfoP0CCJNLVO4YG*k_=}1Z8Z#;B88?~<{(j}{y4j&AE#c91z#ziG%OFOVz!;C$y@oT zTbiTOq3IyN5GwcVw8s>ugi!HJA?cM@+O_;w-V5yEV2h zb89*3o*9(9nWDr5hu8#KetWAuOa>GGZ<__VWo&S@DCiYwDMY0F4%jatVWR~vw}-Sh z@zQ)|Uw-L3THPhcdDG1xblO<1O&8fL?sbmHx-@BpI)pa$HSyjeO<49VBh>}X7Affl z7AR%h^1b=E3aa z*hl1;0|nSLwGv}9w?HI?w^Xm>3K(!zDJJS@bR#%qN9sK}qX}dI9Kv-^fg4ynX;q%cftmVkpY(HIWF%~;S^uReeoW}bF`yb^e zc1#KK;nAI-vAVI`!qLn2Gs{!t_b!W)#JIdFXnTNw3rZUxnoW6k>$TG~CO#uxBGkbF z+2-2%ZovG8?8{R|N$d5|_ms~5eUZm1ymfOFQ1y#uplUvQ>&4Um4vzXY5iCYhlxw|u z+8(Q54s4q9OTFMvUxy1+eXbbmrS-XDy7BG*2wc0lk}m#%cJB4k)`ynVwe>w#Hsf!2;b~g%arog;GCF4r@nSJ(Z#JUJ+TeE#z~S`44{-x~!geSRSs+{K^%n z)S)c9FNq;E4J;U{+VE;`h*&k1sSAT8C(qe3jmqYYjTuM*l~;NZf=dsv8*5h)AvAq( zEEv*3ftDi=)Vd$_dATH$s&58gdChNN45B&~RRgHTQe|0GpvA})TY^Xm*{pav!QBhK&&q?jxQCdNr6-fl*I6QFXm^y2B>zVrjSOfoVZR7 z3D<=}$^C|DH2SrOqXwc;C)-|R95wfQAi_;@)#1tMT8HAU!e;7!=A2BEWtFo>>s-)H zL(RC15MOTn(c!XMhHGV>PP zax1>A+Vml+EA!>3pTIT1jV9FW@1q`7-x6`h!->QFo!Vi>bw<>)MIzHIlIPu0v5WCg z1=AWVCHQG<6&Q2Z3-eN4eWfm-;u9t$`|hYtYby(ut&)`6wkiuw1WjzcqB*rZ!1g0e zLCF&_GQ!pKbXvC?f+c$MU;H*a;wNJkS5#xnMpw;flGy$&-ij@r3v87d%rq<36w}8M z6I4VVfpxNOUPx|gV(aEfl^s%?DNItX$SAKEWQMq(VWN6i=Z9nndCSI}*$GL*Zeem}_X0JAOLpY_*lPJ- z5$K9(8&rc?XP9b37k|fMa;AfqK1IZ39WaA5P$m!@Ok`H%K__I|mAX!L16Y1kJ`e!< zA?YvLA=ao?`|4`=1!*qqxE(0ejJpiaz&N+aX!d*K`*x0ecHCuLKE=^sHi)w;j(d1@jazgAA9IP@^$(OP7<!>WpNx?bo92xk&gwiel7ybl*MUC zp~YCWEmzK2%r!0-VH2rnFya>WrtMxRm=bBy?38s9`o9sHHHFEB1AxsM=|tN#pehz3b@ z>gdgQpHTZ!~DbQtCxh*M*zonh>+-&I(yDh?b?qCb?@K8u7XGSRP@^d4ny;R zCB>J9Wu<@5H$DT-8LP@RK4haU(a5P9|5-tw`Utt$~-?*I?MM=@*h(@}I1|()a!gsQ*fhf=XKa7t+dBK(6 z9`*k=uQ5o)a6ZB7{LbJPt<&2IHnuKXu{>ANPX?MtncFRHiVCtvf1pNUf!p(-+bJf# z>W~9q=!+3jA^D(46Y4!#BD)Q*wNQo|Etix=ev3U`7qf?#byA?$;hgC3RdqP0pC}*0 zhG|jo1h#}$-;Iu8g5{PJysKy4&&0TI%!Lw*8}BA8ZZ3-AxJ@>+{y`(m+BUpT0fFWA zaC*9e@HAcoRi2`bDs{Kim zsM;>_QiY3QunrX|z)rbvI@G40QvEK$JMPKvm~9cS2s~?X@d`Tn1s4&cUEfn|=wz)* z=Sm($tHRj7*Z$!xG6A^Lb)f2pgR%k=RixgLhaPn(fpV&}UH&tP9wwuo8pVWCLLPVZ zTsM5ca89V(k_+Vok#L*>CQf%D1GuXcOm_Bi^UN37zW$!58)&u}xczu-GJ+EDu+y|fM1T}fFI^=HR$s<;rqA=Dnt4OtLFP-FC z)@$w+DV;mfX(b)LxFAQ{5AuG{aORYQB1sAxRgMDgrqViY1h@SbXDB@UG}LRQCvh|j z^^HAfNu?ZbmPqMOjCoHRwU01wT?`S1JpP)=>dLBm>nBb>iRJ$gHG!6kUE9ohJ`?D0 zEVi~4a&JKDfjV^Z#FflLjN&to0fs7Pl?oRc>PIqpgSJt@pBauXF%(R_$xjvIUQzQ5 zmRdr){cv!u&m}-#s$^hoLIv&Ga|q@5@~=v;4V46h6qTeM)j!DOF(u-eW+CBG4+iZL zr{<*rsfBS`b0RHFwaws$jiqwC{a8NDDp^PDA$kii3c_=Z3{h2jno}$N{NXm<>ch>Y z+4)kgZs%iy=>4_XWbIupl9J8p4s|7Q(z*NL-*QuO4b{ek{9evwxqFG+Q9r-#LZZS& zIwc!&6l3GtNkF?Dc^{x`^mOpt??OG?;fT?RBxvFv>RanYy!5AVmk*05G{N~hF(DUO> zG7ZiF6kl>XKZa3^SfhaIwJp!7%xI$lvp0iL+i?*4PdJPd7UH&0b2Lm_O%F%&ufG@8 zUm=pHqsnQVBqu7KbD)+$W6gY)`F&@?rBUXN`LVTZ;x^x(=H(v}#Yse61h{Q(e*(N8 zP;y$vd$eOjLPAsKI(niZe$Jy`TCbmeDPZ2cdd8yh_6hu?{1kxm4^aYytq`lmso^pc7y?dV4BurQH-OV%`jOwyWfak)^jb;y`n0UQA&rKQ5fws zrP9)ad_wgJR_%jMQ&1`%*WMDhPS72@1yZJ=TdZPyU4)}aFD#&h2`;L+WgT7*I2J_C zsxUPS&8U+;L=b+^J^D7|01eOw zHsS_RUKHPwBfRAQ#jrY)ErK2{C{OIGb2GK1wFBv^0shN92j;}|ULKv*Lgf45zKG9% zLX*cW+{jqx^aK{EFF5jAko0LHu26~s*CJLxVn|79&(-k@MviYc>1HLx2V+z+>Ojyf zGC`NcNGU#%eqxl6+UK-}_CxeZhUhhce=gJ@#AKj$=9`-khCar4Yx{^$YVA{|3t^Q? zIzjyFRcNmxb$+dPh)00WnqlV`h<8@>3QtFgTKXZ=Zvfe=3G>Zf!Y^>FxUSK#2oalL ziK*boXR9VPsWXoNb{(nB$YInui?}CcEHab3S;Q>Icr0(InUtRL_1P|14W$9{*hBCQ7SVT&A`NJ@ z6X;8RpuHb__UV@Q#JsOiQbr?RLic9JH__mPc6NETiUg(4#g==ETWZP5Gw#B1SM{%C zGBte%0Qi0pk+~6x2^lDFp&iGi{;4!BOy4AbNCIp=n6ddAy8Uu(dTeX}gB6u-Gcc9i zIy+U`GB#P7?3+4^S5x{==wr18{g|Zu&LRL5zeA0r9OnNCwtPQT48LiKiiKxK-N+1n6sWH%xQW(ox zON!ST|Hb0;TOud|jz$rCpoY@k?P2|3_yE8#6vI#yHbVn5!^`T>NXyWsX@rSNPqDlB zIps4T%wSUAPp%j9V)-%`74v{J4GOdnq?RZpIg|pUO0UK zNbF}KnAox2Y&O^x{ZP3ZEB4C=Wlx#p3DVKf1cf5$p97grH_=cv4_f8wk&DM1ui^ZG z5&vI?Zpleg61ks3e8HWqL8|NT(ZJuDZc)Tb#4WB^59<>IrjsWc%BKr(M zv;-i@e24kNVsRIBt0pVP%{e3?pWr6{#e3ZBSMC)HCWT{eDXwWsDc(0&U#p2t)io+< z3GQSUF7ikD-EAQbb(cD-D%F0$BBRPLw#dFL;;rFQs@}(VNX;Z}cIdT+V0s92@gbg@2MT=ozF!pc_!Q1W!T^R2T!itnfvfPG?`h#PpqXFRs)%tH zP=dv8Tmz8gs(N)^Aff4ZD3*DHc;j&3JQjidH$H}zmx-`c-T;kWrQ553Y=}=M?Huzr z5Mf8^^>rxn0?&a}5FC?lt&@iXIS%NYu7REsuUE$P2tk0ZrB6h5~|9z}?*Mgxl| zs@sF|DF-t>uF~}9u;a7hj+$eXFf5ETCaSS8*K&Jg;g=}Duq5vnB2QikWhAP@oN~nqb9ummIL`Y$4`KccFz2`(r5EY(T^sQm7rPnglV_ni!7lN19gw zX_knaXjm}gd$Fkb0c4;66_q9$6HLNkJxTs42e}YsXHeO|q(-$5_?hF5-PK!(iz@qApoLP$6S`muJ{%(x=x;uv)bexvhMk;)N+gfbowCZjKjuUerZuY7r7V z;1~G5|B}g={TDvFC^?p-uff@$kJ&<@h*^;NQQPC6F2o*(iELJ5N~BCnr^;wKXJO^% zZZ29m|$$YyW1^MpSR5B|6A&PNS(Oz<9fr?4{;#8;$J!E~)Wq{yNMN)TS7I zp?=55r>X2r($ov&D=}wGOnH8^BFg)E3|hI0jeX&y9Y)fpWA$%)URfpMxV^1gBWPw^ znPg%E8Dq~Hm%J0Sb!-kVC^AQ-NLrqMm1DnA2tiwL@W$XB2cRpkqv$D#h3hb3x#U(! zyWHD+pi=CIH8coEH$=mC4F@Mf=PdELo7@(fu)8tflw9W)Zr;14S77O96A(7S4(g0S z$x>%qohPQ5vWNE4t>2Y*q%yU2ax^zJJ&9S2wW%$AV;g7r%&I-SlOFek_K>70Lh=m} zao7v*rf@Y9mOq`zsPiC=H?B{QH+m`WyI3Av$tN+Rjp;8-moA0u#l!R)IwT+Y3!)06 zc!dh+0dOXVBe@^rGUzWmi5CrmcrA1L{0yCP`#vWwPYJ)24QC15Vv%>XOpV#;uh2e$ zYayTtb19K2r$%k5P)o!AG>~JSE4Aw;JB%B^t1HPiu5Ld$ zzYJ_{pO|YI)j*Ta|0nKEz~idQxbd6mKnnqZvRL+jv;xx74JZ|CC&?rkI?060OcxY~ zv`uLsO+psRqF7{Ac2vX#S40#Acddwu`}Qe{3N8pLC<>?uF5ve4-uEo`+_~?$bEka& z=g;$$HZwQpp7Wk}UmZ@}7}lBFae!Bdj0hZ*lFh%bGaQD$f2%5SH3uxO%UYLi$Pf;z$> zK;KU|mfNa9ABjJrs={z?2ceYzp5K98yz2&oc+hpw@>@k@5Dx(MJ#F;)Z^+n3rL`u# z-|>Lf*5r#tj!uKFkUr^5Me^_EO>oDqMWO~tR3{w+yZE1?f!1IZtiyJ26?}G1R@24a z34AT02b*hew#w=@T=+Hd_<<^04wb1zH8E;H66HZk7SrF>D!KM{YN0kzT7zy;kUu1k zApE&#D5=pg&5%1rwCo}YJ?QaF4sks|0&mjo7#nll?8&h3fZPcQ!>JFn3SY&)Zh{2_Tqw%2c_UYBn1etr&)|8=D7_ofHK#PrVCKn zdg$TZqoYxYgE1)DbGae&zWf^GRREiKh-!W<@+{PQ)6qJ~j`xTJq(wXzVr%>i8!?!! z_>FHavjqZvgGdNsyhy)Fsd{#KzmD>E9N-yI93ZWr)Qj@>PIiFlM5j)qrLg!T>EBEx z-32TVt}xkJ;mAJ&irS(VJ|KYdhE6xHa2QRkTLk54iAhk4?+r zRCeTA*jmu$I!{3dmcEX4B-N_@G@{G#3wekr57`6a992I~4?y`lgr~(qAup2IVpqaOt~U9WKND|`J!iUiK)Kr6 zn;Te{;=*pjg?&eKM8twQKwwk~?qIXwQ#r)@B@s2Wfx>NW)$(qtZBt_ct_F%cDzZaJ zrjAu!`HVqy=vLoZ>FLQ+?Aij(dso@BnMl7TUWGc4QRQOJK|fvIfZO=BxP5SQck|q; zy!lOU=1pH|6FH?eyZqo#l?5f)mXe#X%{TNAG{J4nZn(;N8t?7T&ML_q%R`hp80UNy?+i{b-#Z0* zlfRPDo12{E%2Z*+#f42718-*}KU+j{#b)Z>`dw^!ncF~R~aSN&gJ+7_j=}S9ios{kZPP+;bjLI%B;91 zi4L^aI4MENkNT9L^azPoyJFUAolu384k$Nw5(BMierPY zGruvYGY4b4e;09um5?TD?2<#f~ii94o(;6IfjpLuBY+d*$DdGsda1WC(-bw2! z0}Xlk$T41B=r)11L@S)UL&M^ID#CF+>#k~+HYv7+Z@AOVdvwR=6()Pe5bSJj#2)IE zUn9~ZISE$vYL^CDt-!0DF5FT8R=-muo6zA$>O`&xrKNM7v%Gn5qa=Xo$9dqhC4>^s7qTxe%iEh?r8fXNNHsOE1W z)G&qAJob^gU;+C7$D{-QDsDh5+M&@R`(k@%_|t%LBc_lB*$=viiWOj+0`wPb_O$nq z;6w>@KU(JDCPS`Ni+`HKIrdZMKXz!P6VW(EFh4c=HB7#bfL+%PnW%%q-; z6MfTLh9-tLbPjDA9vzy*lm9bM{^CXhGUGPUS3bieyc{NSSeBSBgH0=hKLxh3kR=I^ zyyk)*C4&-O`qZED*t%dN>$~Wt)n7t%ng-5v7TpYGxgRhK+LblXC(R=0JJ+;vJO+rE-0WP zQ>(Dt9+8+C4b6WGrJQ2DeC6y~kNN+7oy|l3f6)h_ZGo;^1&9 z*0hNGt`QA8gOL=dtxtLD;CRR8!QoM`nRO;7e5IplqdhB$X2gt2oo*$}wWs0>; zgQ$($fd3t_vA()v{^pAHkhk z{rq;SUb)?FaWyJfa|ltatx>R_??=pE(%Bj?d=|RO+fkxM8}%eo%26LubrE;L|4D~S zGaG<-;Uqh`Q#pqpyNk z=rw{BF+Eb_^^Cq4w&`|4NUmU-{I!W&Q9kG=WoxDZ=NHE4dSQ{-hS&Tyf#_oXT48lB z|ID0=)hBe(cvpW{u3Vuo62k!6KK&cI*J?iafFUtD__(ebFDQX8)r)7yj@nN|#3%|{ zuP1sV*7wnECJEveM#@i^Yjs8hq1j#)tlnTAv{l`@-+6}5Xa~%Zdt(e!iP%GArV^E5 zE5PeZ&0@&O*vU;CwFS7)EDlO#HqPtq4@I66AE=*bAhHcD!v|=FA*lzHK2Sz*MNe|H zAKCT2sFK}_$>xE^$O1=DEW+f+k+ZP(ABDUb#G-n}c2wIHNJZYPIt_v~+gxta`;Lth zOqo3CRCtOM66(Py9Mn9*FkNi$kgU$Rz+G*Y(#$3Z+|!l7Z4Jifa$Y6kv6LUu8vKZ> zrYH*zo>HovI>U(OSJc@yy+~Ccvg$A93Vo4CHeThkY$!YCrF9FbxYPh*x&swnl$i+F zcfva4iT%$qx2rpH+oEmVIp$RhZC0nZd+b^L6z*ZlGRL*e!C}eFaT}< zeG1S#qf*OtP)}c)z0S)zxKuw)AVeiQCxG&~ZV~l*_ilR1wY5m_>V)e}XID0cRQ5O+ z4Xwd`*BKXyRxVY!+{wl#_VzINhs0Y9TtiA7=NiUR^des~Bl#W{vBe8_i$$p`T6rDPEYS^^+L@$p2)rA|2%d=ZRy)Kp8u5z_bOehc zFCxSw-v;^E3?F(O)Au>eNOM=o7Nj|ae4f#v2{h}e;m`Qs#{4L{5Qm43 zb@4efGb@-Q5(_)@;+_I~4}RHv2Nc=u3HR>uDQ1gKu2WsLt^cww$8o2{jVr7*mDNxc zNo?*|^2F{;?`M4_6O{W%I`3xU@2?lF441#Cq&6{e%73U5Aa_<=RWhmuXgku`#xQjA zJ>&6NZXxHh;yx9Gw8q4K+8PQTC?E)0qv&AD9+=skSh?FM-nC$QCVCwGP+5el-ZeoI z3bhlqY(iDxr9j$S@RF(sEu#!4r@d;nYv1HQ&fzUB!CSsGBRFEk`0#l{BPu|&az%Ul z$`z`Dq*mB6KGL}sN_)q|(BKq`D9;_+T1P@*h9(NXKcQmfR00uSBi{58yLi|^~Hx4HldrJ9~_Aw<4<6S=s}LUW9SAG`rc1OIoA0sBez)Z zzv~a-u6sq$I9$hUy;d!wZljB0W*t=1z#bb_Q`q=b*&nl^a;%KR?A-Jupio?d!Xk~| zk@*TZ&`)6r+x)d^UkCPy7%~>gb0m;g@mR{tT*y{tJ7O=;{>?Tz6EXEb{AB1cd)RbP zt#od})lJ zAA5HKUcD~C`lVz-HTFkYhh#=HzTfQ5j6(;=+g1*888zOKh3Ced8m#UV~gAuLT1>K##_(q4|q(9 zD{5}Z#YHBuMDhOgf&a|TAk^dj(L%mw?M?nEY(e~obQTd@`mN#Yc`ai|STsIPc7Si< zIB{vkd6I9!DN^##6;Uy2mwiW+5hQ~X1&CG(52F$m1+iwj#;!^#?)IBC)pVh+GwgzG|35k|HKV z1p+&T8ui8rz)Ut!_F=yiCr|q9$+|9}4}o-0oCw)&%4n?BuUW1LGTg$VhtXEc9ZR zJF8TP_OS`1eohuf(F!a?jLP8p5j{zYSFuwvx503~S>(wsf>RphTB9Y`#}oYL9D)E@ znzT4K!LMgMh6SbVlHG#042amEk06brfY-XW&{0E*GfI2WX4-KdIG_*NFGI})FS37R zB>BFpw3YK6RSMqG1T|hEmAXdJ(6hw7YkbfT9>r@Lxh_LF=AC$Mn+Q=cnTD`h_7lyL=ohA)ipZ;GEmWXiglmib@vd>NR0x5S4+!f z$|OkXfy=xPa`}FkAJA$#(3dA_fqX^;rPlpy+vBDpGbi)G9up77_Hn(LnX)D0Yk|>7 zm@6Yz1nYuYvezK5HyT?iC*F{wMp=s|%#PBi5SjaxV9I@qPqwQl1$>qw)t*zbKBp#H zwD8NB2Y}zF8s&zPn8@y>IdaIg!sR!c&qPf5?c!A!naJ~k>!t}1Gf2;B7Bj24UIdGI z3tBONHzN#L%&nssNqWJ1Iz-}qY1LNk?s2H3+-rj1iMmo|175Q}&Mhe=xw|y54zMSl zg{&rMm|-?cs12J3S-9R~6dTIQ_?$eMv2%D51qJ6fGnkOg&nzL4JVh`(NPQCLJHS5PX+5wVXwHg&C|-E3Ny#||`eoFWX2NNBit>7RTgQl% zdA;b?4B)0L%A+L6Q$P!CFTrn1N}8=Y)OnwNj&LI|^L%k_s&Fe8;CqHBLvJAj zH>q_>zPJu8uhH8ClXE)V4n7Ia&Mv&;Igx=zr7G}08nV|=Ryr7;sWGUt+hFyy20ufi zZR!`t+!v_wfI*cr#KUSg5VQ-&nd|h*vG4Umaz0LZtVkYefRaWZ#hjYx`LlCCl-Y~& zs-iPAp=4aem&+*Icua~tk{@gL$B_<|gKLTxnl+*fgR$3+v!qJ)R?*Ew4!oM%*~VlR z)u;7&cbL7AP22@C4A_iTBo;Anm2R5O)0DXvz%S3MMaQ@;Uw+c`=qQFrZ=64cX72N+ z$rW+F;aU0m$ML0}`Zg;#NCbsqF*PY1Vql!0I=r8u@EMWBjKVMY6k<6&3NThNYu4Xz zGH>HPk-(IQ0EN2)Hl2jTD38}-!WNz00z^E~qfBz2txnIR#(29TKQ8@{HH~o*moyaX zQf@VWB87(XH5=blW(E#&S1OkYE8x&BbVDh-wx0pL284EqhyzhJ>x@vr#IFj6`cl|p z*$=RSdQH44(^d^F7Rxi6YU@JtWJlIZ+4)gh@hI3@i;__cSLU&Ewc`Tcn4&FUd!Pm3^6Y{FG_jgdi3xsb>h z;-DW--VG3cTf`IHzS3zChZs9d&e-Q}vYXHK)6d-Cs<_q*7d_ja?lBUt(@V0MLvWNU zZRbb|S;I$$jvm@UZdy7dw}+*S)UgDtrjkk0`E9Elgtzq21l!SwMcxA@b)TB_-!DQ~ zU0{?R<3SJ%i_Tes_ntm`8bkOR2{5Ywx zeywbZ#%pJ8!pg4_MWHq$Nzs&>JoriXD2R`J#rrm5p8a|+$l(4c-}Ou4{KpufFa`Ad zL|=<>^CVNn0%NXHWMv6C>r{7GHEx9=nOI7`2Y&5q@!i-w%0|)J-ioiRTheo(RUvx4^?esx<+8sx@F%|ol7SBXJ*RpFh1SrOxxEb$Vqqrh!9># zQ@^8w?7I(+<(W=yo!l@ux(Vp6nhd-NG2e%PU$cV8MdXU&y$#~10zQhKH|232W3~7F zB89~|G{Fuzg&P{uObYZ*vN!3M;zx6m+>N51l)9a%clivpGrdv7M9tZ_$*T!1n$RVM z0HV%KKPuLMimOEiEjGkXRQ3FCp#kB)k7M8BB@)sZu!ou&^UOaRj~eNX_lUS7DQNNX z9i_6dv(5x_l*0D{XEEOCEzJ6AhLIHLlJvlYDWdNB&WWGPXj}98V zJn5hXG@+=dbS0B!Vg62=ZZQi7eusQuHEX+*qGN{hn$^wU(YJW{dv*y^>E6!xr5gE+ z&}#&3@=dcJXefFN6Z64Wn<6BVp?4&KfrSG`3aNxq4AdCFmQfp@M?GB$W!=h;tvZIe z>V+Q-&I44=)2#q7TvN}75W4{o5zkC%oM}ypDvKI3oXp#?^3BOt1GV9WUd=*g9QUH$ z9LLjrx^6doW4$PTG?{UWA;Ea3*6*C+kTRq8c}9+Q@l~8x7&D%XE)T`Lv(#4%n|u2) z@aO!Jx$zJjyWUMMa1=XifC^RSwk;;PO)k`^p$8N3U5dy-lk8t9$|lNQ#l9b22~3(mcUbaRgKvD;+}x?YDr=P=YXf=lR%V^p^LNF|h^eef!=UEu zR65hwsb*$1QyDS98prEI>ZaHp%vj_O^rH1PMyEMxgvhuhjMTh55DAhB-~5PUaJkTA!sxOlzoo09)(^t{nytwgxNqAa~8~IV;$9C*0eQu;n%{&Mr!o9wec5_g9->8RYz^h$tTO zSsT^~MvQw{UX;F>Rz&P*P-5;!7LbgJ~x{ey!hr#2F?%nI7;&Z>G^qR|9e zxS-og>REWlW33-uWgGs)ry4>ns=Bse{0Y9*RYn^l82;QvvoM!UoirV)?FZiRjW5m! zbh5qCVvK1|rORLtKQ!fy-6HuIeV-G!Itt}7iYma<%FqPq|55GKFDv$ethm%2dWQ@P zcj(;{#!dKj5qF4I$ylqeS7LAwq4>3u(;15{7ME2h*@N^0CG-qyNSXP*KQDceDBmba zrrZ-RI&4OA@5JWtXGD*X+PX3lRFb9;BlbciQvh!K@w4cDT%JPl`WE29Lq@Hsc$F!Y zu&E6)np8zT%xI;f_l?L@WDmtip&>!T5@M1#9Hza(<6(TKc7YV@{Zy(XVZC5S*lrSW*| zYA3e)N?l3Nqne4UT7rSGv8gq~qZ`MzhMR~yz=VFcTVryG@pkl4*b-<1lMPY@s7Ujh zxHW4R+O%u?h$x>Po3YbzkJ>%QtvmP5l}Gk9FZ$TW29(vT;oWCVzMci**{s+y-|11QJAJMuWzip zVPb4#WIZd7dWyIE0N?UvgLza7vs&CDnFKoTivC7^-)S&fQ|#>_-rFf!Zh<40BV8C2 ztIDr6D@DKN-Pu$zO23~I;-F^Ez7_)mW=VRdQo!mS<<)IFfh^d_la~Tls55hS4zsIR zDWP};1|8+v3uqi%$d`dMj~Je~Ra>Jby@=l^nxm8oJy54u*!EktdAzR^TpquDg-9M+ z4wD~-y{Tv+s1wv_AP|a;n(Sdyfhzm<5X2!e*SN&UPy(1e?bS0p&CBgG^8w={k7!>< zt-9No?(UD9XFKGwCuh+8;>MLojPa-5Lci()?Vw3`Tt*F3rj*%)#lItx1>9Yo9e}jz zc}5L08ZVbUm1W-3=`4L^0QX}ya)s(vpp=ds#50sa^>6#fqu%dfts&i;^!%8*P zpfYsc)bzvOEqMLRY_MnBE=LC2UIbO_OUIGnd6hNp z?Lr`mgO#e*8vOL)Owe!evfNAaMK~j%)Q6|CCNFh)9Wh|qN*QilYGT|`Dy=HyNs~;~ z0Db{3XD(R-DsKQoN6_pHsu~)eF_03o2S{Y!9Jjk{_CO46guEEPdOL*G-y>c#d5vQ!|=CC71VL<%S)KzhJTwtf}JH=f!^)$lJ2K~BG7s$W%9oN3l zhu5u~Q}*PfJ~@M;Fts)Vg>?!p0YW|Oa*tYT6K|scM_6W5^$Jpq( zL+8;#aO91kdqv_>&O#Gd=t)}W7`0IQ&;`Ro6CKm*hasKV5gBeL7j9?a!i9z29%r2? ztn(DDGmLfm2d6eW3w2CSoI6w*OJ2`i>NsH$a*$Cdx)V@BURU;;ny61h%FzZTgv!h&*MJ zd>}w3I6&6q)|DxinWDfU^GaOFx+G?=US*UoE^60=#B!*K7~|7?u7h3itL*vm@CC!8 zXLh0Wai-ZK^HH?=JS;`r2*Aln$%;}Fi4N6gGb9w z384lhwF=x%us-1b1~a(ZI83e;RS#9mrmXE9v=I*j`5Y)VwpXSQw>fpP3mi`1CDiOO z?0xAInX%Lm=s3g366zMIulgH2_@MmK(P$>+iP>fSIK3w`t>Z3bJ7t2>Cx!K%0+gR)P<~1TCGld_e3GKuDO=2Sg9ZFWyz=N( z+oV!86vzmcVt-GX!i}xG?KyQiACIOfbf%6!(TugSDEiV^A?+pWl1m_gHo)VD>ENO6 zkl_J#!ae;A+M1tJ+~`^c&2Nn&Qh}V#7g2(Y*6Hd6P&E5Mr=WJY6=%E-te zj~@G3$ltdOILlJ~Y7v~WpfL(iq>aCqL1oqflK)GTjzYdq3V^*8k_4R$t;+^dV|-+2 zqCADx#5mf+CLQBunG{hjRp>^dvXmKbt`E)&>gI>R^=24FqH2>pl-*w~BH9>O!b6~h z2#+*Cq(c|2H>20QjfLnn9-ykaP$>y&+jEivycdXIQ7jP^6rsx~#of1nSXzVA5dl&cq9Qyxg$wiD$)*Jk+-m$H z{}a($Xav)q>onnFb~4+&c=0>CCwpw(Y^RgLtAbcB>Q=CU&ng3>HF$7tze+XTHd`su zt-)5xWa2 z{tjia7i6!CP%MbW`BG$?kBZEwlbL3!N^38LWp{3A!wcRj60+k6+|fYO(OCT5kmD=h z#;YN=V4`AtX7FNsY*o@0KN z7ZG6lZOBZ?Hwk;qam!tL)AlWu zH5SgK>L!aTC_41bCxAu$1xyJja37{>nexj@UA(vG=di&jp$i7|AB=-|CQ#z7R{1K7 zj!$Ej&G}=~iH6M0GMsB< z%Ksha8*}Lozr|*$LF+;XxzJCIi1$FvokS-+z(@YAIWl3?oXqCP(4F*5F!AdEC_%F5t;A%9jl(@BRd4?owW7wI3Y^uaf`{2yTqI+{M&%-% z&sfb~`Nh(po)d>K!o8kyHDVBCkKkcr=qW?-*G}+G) zACl&O)3@-Z#Ys3x@%w&N8j^sN^RUdP5;hFtKrlDr0Mwk!e3k+#7vm-0wO5a9Vh!8H zD%&Py7?zrX{ZO>&xJ#tj4^@mbmAkN(jkkA*QY=IQr%P5Cl~qQF&*8lQjQnmbe3(yC za)EMa=0>&-oZ2JOAAG(?w?ROO`c+qc6lF%8VqUThhSarOa(Kf&5dpKRZVJaJ= zo*S4K53{@kZXcGgHE*0!=5(c|Vz0(_JV ziT}U_wT}`>o3%b_sYU;Qn#{}dug20jug9OAd)J#l+J*QTe8dNvEmC8>eQlA_!X4~PY*U#mU~SkW5% zo6!(jiqjD8tIBWR8oULWveo)j*>$3mL}{hmK~zcZ5;SR5J0Sbt{To}z_GuolU%~lx zx`lDXnx?!vV?sd|5~Z>pNmy`59rK2aM&$v(l&1J#HWt`PyaA8b77j^@ZZ<+e+u%R#SXo< zGkJHm7XkIh4Ey?hDyYLp-u!6u3jp$uCM>V*62tsstkHj&E3xumd}SkG+1^5Zf0KQ0 zX_Ch0=csgyj1i&wtJgj={4A?$9ZOEVy5h2jHJ zK>v|~=|WjiksGBv^W@v6IPXQQ3B5)nGR1Y2-&}_&!itH6>Yy3S%|DaGXX<)AHa8*Z z5}?UjM7_}DLTD!-h3QGsrC<&RvEOf6L_Uq!;+Tlk{shW5de${e!1#4baMzAZX`qmz zvRUbV$eTK|b7D;MSCHw~44L*M=p}-&Mf2k^5}KUo810*{9ghyh0B8!}9SZ%VHTaO} zY6Putc6Da||>H6ti2eo=hYrWi>0j(UZA z70%LQ<3Uax3ndNUU~e?m(SJnBtv4*d3RVMBq=V78JfpJKFikI<2$C`?cqx!$d4N7q~@`4a&HZd z;RbB7P3X>a9^tb-Wt^6j$a|~EI-z|yXkOznH?TWYazNvI$((?dKUklV49c_JSb@p@ zyky$f#pZxcDd4G9gkYPg1*B|{De-`=Y>4vICZ?B>pS!%T?XELDIyrpi=+MTt;Zbg? za}ttenPFa(q<8iIKWKQ9*$Y%$5V24n)J86q-;3jxYKl?WRmvJ)ZT8n3|KD9?85q?I zZ@bXFJjJ?i2FGX(-fhDM7NTH z@Eqc^*_HTxe#%L3j{X)3gTka{q=Y-^*Uw{>=V_I8tkOF)ai*J0p16v$$iK13zi5#> zZDnW*PJ7JCoa)#-h@o2}JG!lZW5w2B%*n?#`+78+PoH$;@IqtWO?#JSV6IUcfKxh&xP!=t16)M-LAhpzm3aXq^?UR04 z70bZSLID)ERY|{_op2mg3!_+sTdC9-qcb1C(tmMP$ALB06`^j)CPeBfbGgfy_8U- z57%Ofm9J&=dqC8~X=NvBPN{|D0#!aK0$UTPT0Gk1 z37zh$c-;<9#8}Q3@Nj~;7kyu>sg&Vq9CxI$YN{r+$mKunM{wGkNh$5a^R-+B)YV?q zjY^@9qW3nrmMfTD!ffnmS55vW^ECkQ6#3qS@xm~yv~SOU zCDgL@d!pVN6>YFbl)tRL`I|mUbk>{q1lcmXxIUG@*0o+&^}Kamb47F3!x`(f8jWHf8QU-jgLZrj#s?<2s#)v1BP`4o z$a3-4^!}X8Gb0;fMv(ss$>sSDQ50ZIR)zWv#B=-lbA^F44ywc9-OD~R2hFbs>5Ri; z>uZ~)M>n8#nreD|9-3Zn!+?od!G<&f4>j_&ek3X{Mha*@qV*O*y_cI^9*~3KB$0d- zaYYf89q4Y&Mp`#__N$DV%f)l(i>mX!Qa@@+9_1eMG;1dfNcZ9c{kS2%!kZEf?TvT7 z_ChRkCM4CLM0AscNsPHuP_rzx%MSiGWG=jQ{pdTj^A-@RUVjg7HVKbn}#{EHpK4J6Nj1Ag!Pm1+; z!+S-XjwQ8mJtXYN63r4%ac@WRz1=Lf&|-U^bIm4sB@QO|n`i|{Kl&IYqgJ_Zoaxw# z(5;Bsim8~ca!oLk8-T}?A|9t;CdP6|>kWCH;qylEdQD2-K%PV|&? zUQ-e8aoj~~a1K12U1Ot^Nxlb^KPKv;s55D?g>3sOc??wwI65BCd+|d@u?n$iyl+PD zZG3Opmjo0vJI$99~%7(h+r%o;w~HH*12Np97>=5$9192(=bgrKcdV zr+OsV4ZD0c9Ni6oeNhE=F?Cr)JI$$Zm>rqIbu4i1V3964=O>bynF7kU;vr zW>ekRo3nrfSFi=Jw}=J&a#dZ0wuNYKH;{raW^Th_J}L4oDxhv=0I*-`(*WQt@>Ro! zTggWgjFeK5=H8bBg?<>K4T;dq*10WX%&4o*vC;2MvTy%=5j>ne;XVFTm)5OAX!K>^E$M_0ThIEpahS` z7@f(1h(DBYY#Z+}+Mo5gr@^puvHj(;aAg(|)p%mA2U2JopCNlM3-Rx|p+PfoTx~K{ zSddb9E)?YovCL|3C$eUcU7TM_B`1)X&r{#bbk0FVH72R$T zFEm0>;|8nzD+l-vxkkUw^!iE>;e|#GT4hjhX$+0bp8(`7>Cix#OFN1N&oUaU6VIWs znvY{6!PWt3|50@+?^7J@NgVC%Z?=W5reTM2hLxBRmlr$h=m%JJxC6rw*keN-)z{8; zC#KW}#->L%sx3kZUoCC!Fx2ZSzf=HDT;>RZ?vZQWiP+|uY z!1vr-602G8QBtNKlRkf!xbXor4$YPGx-)N7DNdJ-kv*Q7%5Sc*C1_QeKaC&)dY=Pw z=e|s{jJJvRrSU)7W}#VEYIYHe##2a_Q3z0giJ$KsicSwkGJK(Tj~ItN6Fx3Fs`TQ^R%7 zY86x-$Wsdw#zrg9;?urfie-94AZrA`lrk!}%fk|*xhhS!M%Wi1UXl0$p579vSuS$~ zExq2b8{Y9l(Uwy5uW2*PJJL2Aai0{NXCq+r*~ZIrISn*kxetq9Jv{}>zgc9&>?~=% z2ID|x!`nr?*0-wQLit@txX@W&FHl8X$;ke+hnYZ7^E^{{e2@~37+_<#XWszk(Hb0# znWjMCat^X^U?8`STj_v*U8I6%$Y^sdCGA?mP&~|)Y$A)2f^&DWyL=gTmWNK&#`@GH z3B>E__TjxZL&W{K`UfaVQ(0HWG&Z<>O5LFnsy<|?eX>c1r^x6bA~~rmWiDGnD|gIb zAfuW2RV3Nd&r+Vi+PjE|2)c*cgwn|ROPEBVIc-y!WY;r#JSPgfn0Bw!x?;6AM@1Zl zv8Rm^Y-8#C0a2|BS%I?0%-Ui1m&S;hSq4?)fJ-4)saROaMAOEs%}CX&#FOGCm=LsF z4|VXyZ_Uo;W9{b-Q8mrn__skM;`~%{1>G%@rQ$D09D_Utb41&?6H@G>%rgB|iH$~p zes-nCeMVY9d|x*Px-+Hz3>64(4aV^$hADvRf3FPS)?g_YVHEpy5%~j#8~oK($|xBP zqv3$QczKYw%HGjb&nu9bk=nGHZN8D%Q9I zTUiZ+y&z$6$G}d>*(fD!M7*yk>w(s%NYb?^4T}H=OmSP!FrWKH!uF%tlwy?9&!cb0 zN!}EXCRlrP2~nHdh`agBm{$N3&W2EO#>(albv-Czp|KS(|0h%tHDB~J0{5Tr15oA; z^)OFvm#G9@9Tb)F!u{V%{iwUDXfLwEhx`=wS>|XLiZ4}ft1I5MDW}R*_L!{M3^;bS zWv5_rYGQo-#Mw4Y?hp{rl?alx2EV-8SZAR!K{yRY^Dk2cd9S!HplTF%o3>7RSe`5p zSLYN&p+<>{lPFlw?98R?HyFe-L>g2ec0yN3!(N>)o`{qn)qalCGZ&>GzBe-QwTY5n zLYr8&o2GTe1X9lF{v=59$KimxcvG#q5qI$iSjDpwHunHtoT_S)yT&$5PY!LgodbTS zN|IZHqvxr)ijXc943ZvLzWk)=(NStlGk*&C((|Wji2Q$y_&liYX?*ts!`biKU+1!7 zLh=xDI+4;kIW# zsEkNbDO23(k8!81!C#P5sEEyk0yLQ{1Rb$Bx~;yvktmAShy3=}Hd4OOmhZto(Shj> z*ro~!Dv@8L)Cj(u0f38rZ}j*V8(UTp-#c;tZ%tPKW`p>)!cUXk#TGJ{jszrb~ON}!1fUC99uuI-}N-x^pxRc#P z)FWq&RQ^~u$=EL$-o*DXU%YU|P?!nF)cK~|M4w_te2@5&D33?rLzzZAwLV8SBisWB z-!)k?+R4XSFDfaeUcALAUrD@hKUz_K?QPp8c;=?Vca@Hzz6%or?-u3aN3jqPIU0^*nfSLX&Fic0^+Wl;@P- zlcb(XwbdoK2%OFuULa?W3@Ayg+EVMT7ElDVZK>+lIV;##WU&hJ5nvfRCbu?+;mIXf z@%>@ulJ~`#-{5u+6fcC0Z&yw zJR#yplOty_rPm@Q_zBq7EadjWrjHUgO(J+9G&8O7rq9|Yqp>yE4f~3`7gs@VWdZ&f zQEj78{3?I8f)_h81t8Vm61an}MY~EnNpTrh0!kAiloa}4LKL;(#2{*r@7fB|)Mz4v zn)Z>(EZLRG`HLd!QLl)dq3QPJSK$!v6-|IJUsOvsosZK@0OUxPY_Ac;0O$L^uo>ht zSOnZN$ArzDHd{gv)a}B>_)dMe7~d%rdZmbcDI!fAZApPH2Ld18*A%2-g*4qKEqfF| z-WuG2{)%X#4DzzWz=q?rP==XBndu3+F6I#i*jaD`Fu*8z?J4mr9(@H23f@}`1=Vbn z{@oa6*(t`KA0-f3E$RnIvF2Hzs@C9=-$EBfi9sj4*&V1dEx@Kh)&)190o0Z$^Qa|w zbPi_mmBy!rVf2)z#?T{bXyuAUD^}E0fgfz8jl*NL$qj>}n`&d~v6U-NT)DKiDi>Ut z2{J9S+71g|g1!Ud8CV8T8-g6zUi}B&4cbTEY;B@YpDCKZ&kRBuLNIg{?mq zncGu3XbMlmjKqjyxhj8( zCHG(?z9vq7$n}i%RZrBm{lbno*dwMxk1&rYK0QEq$fmh4#@ugA-T-T#C&HLUDwlg` zN>MSlj)HmyLD2gHhF4vEgm?EC%hDEP55rWJ`Wev!L!%pqCMtvI>@u}_cxY?gsAwhr zbgm)Cj9C*}>CB973$|T?B7kolN8Yw;Z8Mwtg+cOfGPMG47O4YLJYfh?GeYq|CW<3u zdBfR`QJ&^=Qg!Dr;Mz>JZj6VS&k_V|L*jwTYRuq3|0gQ^!0`_^$N#;k5i_TXWrN$d z`YH5N5PLT?W&j93xv5mq*oc4iR|7X^CRh%R9ZR+YjXuMO7noEKe5g8Xy#MSRD6ZMl z4~-W-jH9L7)TY`vB%&&Qeka^uZ{*U4J4FnNgx+1nUl+aXa07?q7@=+uU&`@dv891i zQOFNjSorC54!`Jm@kLST0q?ZQSwONfr8mrQ86#u#6|s>;>zx1dA2QbV(^SyvBu5Y@}1pi2Y~P> z+OlGNomo&gcq}!JBz5&DHKi=*fs|m&9s!cV z6(UU0q1@=IA^mx#A^pka{z`wX14)N{)qYSzsoD>raG7zFyjK(oE-fmCR#W=|FURoB zZg)PipNEfv0?rfH#|dqH0?o$Mr7>K7>VW)?eoFhL?$N&?iu}HVq2K{U`V*F7j6K zA{+QRQ)Y6$jQQbL#W&~^C?aIHunr9DK-A$Be$S(>FJ9~Ci!phKi8G~3p7hb5x$8vP zLo-Y53%uPEkptK?I(7iWe6_^=w(cGpstSYm)UL*)c7t2gCxYp4^TMU4bo?oj-Cdjd~( zv>(kp$b{ifQ*hd!0PsIXmJj>G!{(M?fisXgrzSy72yaRaJ?AWahfDJiVVD& ziakd4N54k%2gdldqWsmArO3&+pt)WG_OEI=jR^GsiYl5=K(c>a#)d#$|Gwx&`d1$VP&-VnmXo>iVH062q@xouOUYxAwQ$>io-%R_GdqRa4PSLq(S)P|>0n zPDTrGjagB8M74IvTZI-BWYL8}a9XqI)eJ;^-xxaCtJv#tj!3-Gx58FXt4c{%X>&gR z$%Nb~Duzln3Utgp+A*1~RxGUnW5i!!z}$Q9*#iSo+&V>gs#itN7bbZ&6&3z2J90k& zAu7sT?nw?ow@`U1X9W+5XD5bFnb#WgQe50LYrvn7#T;8nip3gV59WcU_Vi@(fZP{F zN_2EdGbYo_heLav8X4@!?y}Rg6D)*N5hVMn4{Rh>0k!8$(CMEdcT?ABcs|mPF!dCv z=V{dXT^Kw5mcZyd-Tz|q$NkLiD}dtD2^S=w`i{gBGM9p>-suiYhL=VSOTNc=i$0fh zQ0n(Spelh`Zn_?xx-gsnu$SSmmx;F|qKrWv5o!Ey8Gv+pd%{_)9&FIQncUhlafEk^ zI)=&O(;+tST*|&R@8F(qDM)r6^V(Z%E6tE~V1KdRh{ z{hybxY(w_wUz*tC-lE6^q8N6BG7N$U8qQHcMmQ!l1){v2rQ~N4C5764ipBa^P;`rn zc|~p)8cl*D5HrPmQ)tdKCIxfGPsCQt`A9pQRkV_6! z#06@+Ls1+na}ByPNfvhOk?r!Mx(ahO1sCZnHZf79V8jc}cg1gS6_2U8-s=AsV+wX{ z$#(t)GvZedPIPP;U%BXbtG=EJ$Iy46zRn6>A>yNx)JZA^yh$h#qBJE`cczK#ew{J# zJ{QnhMQLur=x*5IntBV`1Vb08oMFq);+ZZ~dv`!6N!2Z@{-{J_sv?{6chRL3`wIgG zi%h2~F3$^}WmdP;gw81E<*>t(n#EF1t;wjRT-v=%huF0V`emefQ&URi!>m*m=Z41T zY&Je0OWoXRO3Uj3w=GRg}qLbU==X9R{Wae?XNvyEuYvRc@+AAWD7B239r)w3^ zuQk{SRSqN&^OSFIyKd%wZ>yC#b*B&AOrSL?+Q;Ln#7;L&0maWVw@t%We~j@X)DJB; zH8MEaF+Djowq;;w1GPsx#Y`V5%Cb-Frf#e*u4%UX(GS-BA@Y8^<9Au@Ggk3f!mMZ7gJn!x(3Yr)O?jY$OAjEiP|l^QNt4(9H)~>_O}K&P zbaVerUkX@#IAot4HC6fQmr!glGQ`PbWD!LOd!9|KXXu(#!UL6SqBS@X)IeqW{pBi+ zZ|7L?@y4l=O}H#qyVCU>S~pkP3&30Lr&f&)zwnCX>{Wbe+eL{;DS}XW;f?C0l2ppG z)7;rojCbKo5fn2d-WR+fri>QHPA+`$-_v5;)9#{<&{hr(4EO~ZKgQN zdvKILiDpLBArZQHI3C_i?!q+V_X*-PC>o9B2pD6gzGGb7@JIg*eFqTyhzVdiv$Fu5 z=EiH0`~DRo^L2G9t%e}A)x?9MeS`g1-3s{U>vWM~PM5kTC?U(RuNy>4(q49= zC400Mod)d%X?6~ml>QlsO5w+*tE5`I#xG^9~&2yGXxTp(O~K zfvrLEC4!o`Ikb6pm!MYo&@Ao+6V{9xePWU@x4t7a6#&JWQTs9XHNf0EM1dIP9M)Bf zo+x?*cN6VU7Bj%B;(MHqYZ!a829q;StAmN^6JD!p3zYpOBiHxETXZ?BAa@B!;Ds*W z<(Fgz0iU0ULLzQ-5<6|eN%20Q#V#Tt8jZIn-?2*ffikTTT}N8Y_K4EcJ^W<UF zU1yYbmO7{^i@{*IRNNxn9~*5E?=FfXR=S{ib0A;R0!{tZlswB`$ya-bC_FhX=BOAc zF7e~I#Qo~nbCr~Z4m1m)G<{vrVPOzA7s)EWMMO32AJoly)zx|O6ukG7SqRVd`%#OC zKJ7F<07gR#m>?TytGx`6dv98oAy`Qtm3XK;jK)yOKEy=1F%bhPqed(S*5wA|+zox> z-t%Su&G>g{-5tP7oW3-LYW=Jw5BLAya$&?ny&dO;WgKZZP+WrQzJv|gA)we z20hqG;W#7_vK&uwJxqF-(+(E0e+B?<4NgE&xz6$lV+}^Jzu#p1TzWASd&42ACmSwV zO&kN>Wz198n6?~|N$;(}Ki=CC2 z&b;8MFs5zFfXV2qQN<{?xnHwXE#rR6qVzV?Jdb*fJh#l5N!Z87h8!j^D_aRvm4qW>yE=I(%U=2w77Iol&4 z>CgDy*&RSW+Z?RTT8=uRQH)Ecw_0}VeNnb8py2W6MW&!QSQM|~%?h2_0QP-;mYd@{ zd3{oT!4ix4{Uy*5Oz383>CDHG?yu7-Xc%aJrDi%qEAe1OYh1mc{L<@1d}P0bn8LgU z?Yz6w_ws%*i@G84CD`Y{I`-+2<3}qku&H_p7%AZVB*S@UaqZ}hTKx!-K4?hBJWich zaSgxejszK~15mC2j7KZID3f^wZsIvn$x#Sucq@mLc|;`;C}oLq=4vQm>qM&Vma3=| z%VE4!mYIhmEV@J6TGSDTw^u_4L*+SEwo9?l3;QcHyzGN4Fs;K>*$iEd#YdvH&gfXUMVYrdG_rBtKtQcD@s4?bdZpV$BBQB-3R$s=d zEp39NDO*cxaqq(F$&K!)4yya$Q5}CW83ngAXpg(pIg>SgU@Y7AxO+jEUN^VDsyl<7 z1IIF}(3?aRS{*XxS#~TH<6S0A1B`(mb@mXdpo})A1Aq1@<~CarI4`qXw-;hK_5npI z{YXabMu|C&_JHvNkV1K-ar#1oqM0ekT0*rIZ-^t4=40gz$8R5MB9i1t>CnH8{28=? z4J&|91fbi%nWII&=Y5=j`f}@!I9&v%lb5+8Cf}nBw2z3~CscA?KTfMdfK^OFv9Y9%zFkV}!UXYw~DYz$R-AHX8N)Li0@nZGS#f z_GX63ISGhl#u7t@6zmYihR8&XC!S3ZBeCLgP5CL)Bd@^nmy3E1vnZXTQbMHx!GTQ3 z6tLJG!Y|u*9P4@z4w`p}*W@@4cLY3LYZ z-%XFz%UH;*aT6OGQm?&2}@E=sAqk$BR^}P)TqD84WhA7Vv%6US68w zJRE~%FCtvE`989_LT$~fz-I4c4f$y!C(Enh*I47EHKk18nGZc;dO8 zv6yl+ez>>RD7GZ1O%2RbO^8bCM;#Z!L}=1umJAh_ zd@zhxu(rzyiEbxVrKj?Dbp4FB4;jUo68$!cQ46b|f(U3Tih+jEh1XA5iy(oo7jJ-@ z)^othshr#~Frae~WhJ~ffi=Xqs|p;34pILRMzQpuNC;7T)X_#$;K$>P|1BcqjZWWR z=^@u!N1;eHA=Z6N8=h67b|kQ3YrsyqemdzCVXnPZ9A_ z0pIZ@)jDY?JjUU(Y!_0k?|2<;VJM@vXBolvx3*gg}kw5YRe?`rYRHXNO0w| zXFFV(=9{cW=St$tCmYWE5s|1&L=9E01Dueq`A$mZa|uhwFDB5H$rs7HU484TBm7i! z6)^R18B=*$@{;EJZhZ)QMq_6LmB=23B^vv?q#L(1+ z&1Il*h`i2IjKp`@M6_+hiHaf$DH4u)^g;{92r}DPqcO~~_k&xv22*ntE3gHDxU_2x zAR%Eosz{RNylFkYWkU6OLw+gzTm*0Hy#koYcZL62g9WJG(4inga!R+t*JmhSOKY%? zy(>BM70*&GEB=En(2NKqjUdXO{a8PR#ivD;Gv5biOBE(n1&yk}p2(+ME_dep3i0Z1 zuOgG(y@e$BM^kOzQSH-{?FCr=b0W4Fh7&U(6u5V|$%(^E}C}JZP7Jl-68(#2Cg3L5&cC3a{yN7ZalPTdM zOW$P^4j3`W%fYVq4bqS%mW<)17^ZQQ1@-Fe}Tpi4nL({KH z8te3}P#~^=7bO-}fLcI71y&1=NI+7>M2)@UYTQxXz>lY2VC(xIt}BP^dUXAz1_r7L z1DxwT*-r5~s6wVRhpifl)7wypEzTlE_0^e)$>9rzYADW_=A%rBs&`ZX**uTX#b)GP z>Im+?SUM~eaj;y1h*KrAzGhE;Z2J$;;obyvh*6FkB2LZFufl;qrzu|Z05h_W zhK#HO`-I9z&Ndb5(XL<7IW5%gP)y+DI{D3!>b?p!!L#9q%w98npNqERkPN)*%oSOU`)gy;^j?bqTx57wozkQi2ZENF`9 z6p&d=iRWqU3CjP&XEQ;eJao?V(CF0g;0SqF2DgC4eaWzZ@w!?MkSVgvA+`Hd*?>Vu zU&#lJtb3U38J*yP9QS;uQd!8DVah??rv6s>iQq{-0=^1{=>gc}s<{;Y@Yd62hdxdsuNp!ZiWF8)`{^ajHU#&RY{Emb47#G zvZA2qm#cHdD#Qa2;}2%v+Aw)spKQoiw#g{hb3vj+#{Xgnne=cEi7D?G?+(PYEO-|#gSWwK(~ z8abLaP4v{;6xf}47|POnY+rb8xCkEhsHy-$-J^(*>c(nLT9k#J_l~k#aFo_y=A|=& z0=Z$k1}U-Te7x)j#+$TBRD?lQZb%~*ko4Xc0+J|NOaPrLf?fYqQ%&vOjF;RYLdj)A zCdG%k6Of^1bNo_>vTO%K?k=9f%Y{x|ITNSXRYQsohWVzD!P3Z3Bp$SY7$c>MW z3~v~uxkF46uzH=3Dwy%gxSbDidsgsm5j_+{qDaydGW0VtT$TXtuz1B-%IvVx!BdB% zeV&_xnZ4cqUG6pPBmKvJJ&u1i5~o0VG|mVzn{7Mz3Gm;n zU~R&-V&z1HK@gg0+DboxwNDq(T?Y$afXR9^kpCHxkeQU2YE1)GOG{n|Wv^nM_)O^3 z=0xjt6-0VE$=$F6fjJr*dxU?7Ho>m(?lPanVIL7M$)ytG(=#=nN||o1!%b!quljLg z%Le*}7MAe>3@?;3)IIhK3H-!cr(>o&r4T@wH{d0M;!6g&E|aq}5>u%C>}mnlJ~)N( zOzHj_K8klWzU1t!%x=#RF-EZnd%+xqR6{tC&(p7l%)@d;Dm0iR=Q}smlI#SQ*|&{_|`|0wN%+{`t8_E>k&|hgnvT z4Kh73vfa0(hygk7QB8YG8)@F^yul)-T?m-@ zXN8&B!2~ybIHHi;^f$7b{^2;+S#(^~FQpoR7*-In95y^{?dg7i?TO;ODJ~F&Fndp2 zM;p0#%_|Z-@Ly(n_+yebhngdFhv)Q7&{>%~<{G}!lsoUWkXLUKPsD1yD15crqLUc7 zo+rhr4q(hYQp8LJJt6pSURBKX<f()hf_pv!yu<{nrtxXu&DPgy9AUEw`_z|{zG19wM zpmesNl7Rs}>P5uFe~gKh?}O*wEVfBQ_XG^VoP?JOCu`6qje={RNsvu`A`s}>e-D@7 zHJ8cAnG~H=oCFQ-olElgu`+YOI<6B{7K8t*G4z1bwANzik&~^KHX(LDW`rLJG2hK2 z(`jOWxQO^d78#`|JX|NR!Nk_C1M@GJsW_2OoglYgj1{gIp{n&`;>E?)`EnT9h0SFX zH(_zL*K_L>fPM)8Jt|sW3ee3sfZ-i;)hEy0W_M<@>`d{f+`9hfnT@$COcbCz1GQGpzKdwSGMy~?ce&lxD}7Ih?V2$jVb42;|tBcmX+`0 z+)Z)G8=BNW%NaHL_f?{->_fs&r2uM*Bt1Y+M4*Bj4)eG*Xb*%Hv}p6?-rrLlPORr2P$5L zkV>a&W#2^4^?7{qjCgXx&%!$LMplFW{BMDFyXx;PL8+L>b-@8~4m((@2``R0ST(-! z=Z(=V^EjaPaL7b4;i35&0_s8X8$pd0Yn;uVd}=gx*Zoc%Bi1eSXc}lk^ND&bJSQ?l z_SUGRDKJ~~>_Tc>$}W*NFw46#OdUtMOuS_j88lXXi9Er|!n;h)I9Yh-7^Pw<|Bk3s zQ1a*764U{$A-T@fejYFoa&f;BunCLbDWhX)S+od^r%ri)M{YPTrDRbN+Bl!1mzJ@K;VIz&46GdgW#*;o3M5i z;#BxR!74SS4IPGTAyHa$@f3dDJ|e`U@3OaBtoG)bbd&3)pGxKM>W+X1@ zY@io8Ci$*{GwodfD9Zxd$dCf4|4xTr?fIVE>OyIt2U-6XlNmkIO&Ys|y%N7pf>I|H zt6D2W2mN&*5WVqHZA|o%hnmhaxshG>yHqhv4X0*& z0Gac#`rV=Z(*?{-U5prR_S1%G(IBzg_SZ_(;N&FQG1bl;tW8c0;vd74wb8Mu+Qbm* zV29A%{-j!M13n%Z+b}pXR2v@~9z}K5WZTi9Zgl~|6pZ0dBmltg6(lV-1;$(i82mEM zX%{V)IILMOlx)#32+gIKBkBnX{ftw<_4%nRbhENQ)|z(t zd!^uZRvpbXJ=yGLRz~NE%#Kayv^GU%J2=r-5>UZ(BTonndqJGJ4vW8CT-?=1S<%LHTcnCfW^qJ;&Mve0vd4V zGL2?w$D(C!!8VT%9dT*fv(6^E61QX1)u_a?)`>QVNd7k;rprHh8}{@wadE~;7#%bp;0n=bbLhm4aiqA@7cuocE@B?9YN{t-)DjD|OZsu{(*WEz z6SOinOy)+U1v%<}36*~QAHo<@sLajSktGXjg*&sa>a?{90BOU*Wpef$xZ_%kMtH>O zPzyXz&~8KJ;qkaYGI!#YL*jLEw;dtszzOXRGS;sY!6P*z+RSo)X(21s?x6?G>jV7A=Cv+P%2xY^3;NS=z#2Lgp$Dbm zlBr-$F6J%bX?r+})lBqEOl0+gbEg&xRaZ<=FPdASj+DIg#XOvD*r~-~g(l=$QfeyD z8BOlPMnu0hSVu>Hi^%p|dCvSPOx1(25}ixqXHe^r#Qr*Xd36&=W_mW;Rl9p{F!e?E zH{3|QlO$nIt$$B6r}m4H8m`Vhr3WV0Z_(}EAX)^`0NjqCqIL{wMS)$LAYG|nU3>g|4`cl!HFzYkTp=n|n zJ^A6RLnoy?5C%1fW%Z%u3SL~vE@P8oQ4(TCT4rhQX0kOly4m{uheVF#tQGzQA9VN}tYpOdB0zSJNW4a5!nv?evpKTCw zR{vgJgazk{h>*%PGLWan!H|F{2bN?$hxeT--WYY^u`EO@D=NPxtyXskkZ!-!XE9oY zV#4jHOd$uKfxSQ9F!LcC;oJo3q*)hE39m|(Y>GM$!yDH5bnrz>c#jE6coDz8d)=?Y z1&^2|HTvM>$3{yKJ3T?eNHW1=0A% zvRm0naIuIQmLHLSz~x7ZE2YiT*ax_GnJ9lc;)J;s(jY0m8rSqo7pmjofr)SQvjsp|6Wd19w%? z;nv`c%kTtM@a8&m{qQcD=<%&N^7W044l#Wdw)nd71-S3t{hXfrWYe@AO=0j) z?W0|_Cx~dQDUbED`uw=M5#N3sCRg}&neJRF3F9jYY$;renIb?|Hh8M=A0}f*1t*(r zZmOFs6XjUK)E-U>DZ(Hm3mfCvVAqgoqGCxrK$0E9^NchnoIF6}vKlrWWuRj{Y!q># zGgxnbMZF}^h|hk4x$NC{W2dkWyNm5LTceMO!iZ?0V5F}Ttx&tr(cg~x?k<+vbHx&k z>FlX-BPhTOs>pJ)c@hy1HikS>ahflzIvZ<0RG0Bo=tIBY97gbpZ42Yg=xA!w{&iB2 z(xoW1FSj~ZDALHFMsjd>Eb>DUdzBn?U2H~YspR`P&4RNFt#tCE@VoGi=XIhq{PUO} zt&$PChNq@5pP+vX#s23H3{gMYP9)lBdhDJab|2=uX+iD+2Z&Z;$vZ^EBKIdNIs=-= z>s>o3ZpqlRn7wg#H@`U#;^Ie>DNfH zu5aKqxSaCHFaj_(t>n{q1pmQ@T!)e!rP8Vbbu5M&4RTxq9St>6jqvhltaK!XJ8<2A zo$jEZhK&xq$L|_ zt@AEXi0N+XC~&CN=b&0r@ghccF8iz=_lt3j+tq&f_}MSV?4CU9&1sBdtTFB-Do1h3 zkJ*0S6J%};vMXlf0$YXIeZ?R}UnGN}3tOsGSTf$^i>dP4V z#H^}pR)KXFd4g%+dnOr`bc#Dg8`T&KnC}OXh`p3(BmwoZFJtZjhFZZPYO$tSMk#UbnKMR8ZvFc$;scsFvkN1(Lp_e?`EV(PXHx($r z&@r}U9KVn=U);Vu6Oa%nS7_fI=Hv30@qB)CdQ14-I`iEp^gE&raax0ss#a5S8T%+ue& z{wpyPsx`QjuC8x&X_aXgw7WU+#JpOuN_e(yqgmuK1s>^e73@>kZDLEDoT9v)<;r-wH#7#Uvg{%hlsjT=BF z!y}}wt(z0f*!868(X&UP1ivDf8C>=y)KOI zew>_|nBFkewwn9tRx9q4((;Sj#>XbHC)0^NvXaid<#g?(Of5 zO;6#`IuNQ47tlqV+_q(Uk7--DVAC;eixzA;>L__dy0(+s z)bHTm@z=_py6K70HeuVZ1=_!b(f%fl_WbvZZ8x^0y;X(Z4enGwF=2TdP_!~QapusJ`zsf^ zKj_~FXlr%%)ONIe`vS}Y#BPr?n>|L~=JdIBR~}vztropSx~likCC!+5?qqFgZ6SVs zFaNv~?H)h9pMToL5EVYTRefRz8lQZCKiQd?0Diokf1EjP7W^&$yyx(iGpC1Z!`O6f z<9Uk~;lcapiks@ZKJcS2=)k*FW*vnUDl;oPms(E5J0H%t8+A|kk~(-l z%&&*5(F56upd6%gKxZfGgd`D;S&~vEX#DiNL8L1t?z8Mo_$> zO@`|VhP&NCsbys)a}?p*?CwfSC1?Wa3#FD0y5|C*_D3N7A2RbF&&>aQX8!LC(w_nZ z`a_5=8tMP6a0Dn@YGK6GNdE*OeJ>vwkI<1zSoz7!_TMES{gZqNfAL;IBc#Vm8R@Zt zLi&EZ^Qp}C#~r+{$GfNaoln2ucVY$g&QtNuKV`Q6J_MBuwtBq#6Tkki-q$z6J9A{L zpk7~Q%sRBi5UO)!j9Cg6E@r74siWA6gIRo+RbUqVqbbaK57_CJQp;w-jxB)8E;G93 z&zv!T=Na>NnxT2==)Be$+jp8loZ=W}OpEFN;2C3lkXJ%}f#ZMxX3hX%@DX;N0Y<~j zrga8A>>Q@3j*(;bvwYVXc<(qiPXB0XmFJdq^^DBd^}}cDsG`B&hlgZN-lE00e`FmUq%#w|x*x zVZZc4^ZR{9?f1`Szw|TqJBxdn)dbN|QenSREeN3rLT z8S~G!d(Pl<|DHz}_-eOjw5em>Y_n~dR2%CFDn}Xr)$s65^H+lfp zz((nZ<~Mo>ei{2anD>W&(9hWDi?Pvtv-9_{8$A@C&$~YY&wVXC_etL79NuOdR=_st zhvv6A7r%_%9l^W9Kj>#{^AK$FpzQnu?KbD(^Lalt+hlkiTnm1KXd(c5WhGb(7^)Ph=IZnnS4YRMxOs z^(2tuCYM+JnfE)b=!t%4e!qWH`+e5zmwv{6PuQtz{&73aU%Hc_C$#(s=6#a@i@k0; zfOdD>PPgUW@qbx65BMmG_KznN3DS}nkmOSCa9KMAP5%h3Mwd;SA9i% z)d(0sMFbTa5}F7IieO<>6f86a6%{M?f?`)nsQ=&d%@)TGeP?!d zckXV2=?G8Dd=ogl;jHq>G(91Q@)YNP@KuFlS*M27gIiG#;F1yE*&Qg1I<~WqI3XL( zc7e0UG!#c`XLlmrNpI*nTS(3x1Lvx3=j74*cK0}TcNc1cyJUoSHyr~BUZ(L_#R=JP z_e8i`-cTH`-K~dsXSI)Qc@o>>_w8(VcD6q1fwN?UceW7t*%9&`3m zqQTxulzr5YyvNaXpc{En2Px`K3n?ob%8xxM&p?V;(NHYc++9JG8`=DVX?%1ocj^JoHlHxFJ<~j0xL-`LJSxjhNwT5X^WWd;?e8_;o zsrl?}mo7&-!6h>GHn8_vqUqjBlx=20IJzP+k`~wHQfThs`njRp;^A6G{q|Es zv9Y1}v7z`uUl6V=Duc{^bn*v1%#EC+obCnjTv+nhN@;psx!0 zsi40Ks7B`ps;#R0`zTf@K8>cSI%#0$RGx>2yq*Q?WBR${ZQ5#3I=xeo|sjJ_^u~DGLGbk!)PEJiUa+xDBH?( zaSRXiY!B$h=5iZ=enlhVYns}BY_6uUZD6{QnUbIOcq9yaIE9yfy23;qUT#wUv+v3N zN2E=nH)y;p@l;WiuSRqY`;TLI{|9*f|I}P=_x%6H8_|gJ+#!;`L_1E;-W2UX^i<0` zxMdu}w|tJ*^3ToX&e|>S)Gbq&)oytgw~V9Ja*9{+rC!VRTF9m?W|jX&efGDf8JF)x z$bjHt6dZb#tut|Yhf*=-!%#^Cmry0~2h2iWa`7P16x?;*FV zV&=_ev~ra4Ap@3VV?4%_uI;h}`-7uf3;fyR^C!ibaE#|qQ43iLe@4XM&q&W7N3?KS z@4p0BWLo7Inu2*^!6y`@@NBH*8Qq4ZXn|u-{2Iktsd1V_H4Mt=4j!BzhdG9Y+Z1(Y56@ZzW8 zZHieDbZgs$Bw8H8eQ#2f4;5w4vWGajjbNC58LNZ4lRbC4wvf+x?*0OI#c?e}mloc# zfZu5A_bg;kzLeAQCM zM)nd%w;{~l%Zuya@@miJewp$o&*gRG^68nPZ?emj8`+Xv?rU5&Y2@Tj- zzp&Fdx=qz`I>lSj`<~MaGv%*v`U4so>)|xtBAu%#wyJ!K9tqnheN^1Nx<=8RrlRaO zb_U1rL-WAK?(0syEZHP$R{8um>R%KGwDc^ImgPOS)kiiA%?2uHsDk}e&`1RtDrl?% zs+Z1NQ*`Dd9;tHJ~r>7V=s-~GmG|i-E zVNCVMf0>qr^6rGwG>e{TaCG&dr%*UNsnel|UksaP$wNVEDUo^)q*PDg69yH_x1n}e z38Zv<)_~`-rFbYfnqCV!t{Ai53(< z5}8?|h3Z2GOZqB@&p#~gyZ+(!kS4P=!7P22sn1$?XIjS*tOG~4?z-ye@9AinC6DxU zyiYoEl>2V1@m=O%oGgiV{Bg{FFUJpcu^z?l;OJ(rt2<|S?&M|3PM$j-kUP0qqIH%y zFiW&@v7*~m4&&NhyWJ_vazFZvW@cVC)epS%#y8W9P?*#vW(z2 z;2ATpggdVun0g7i_o0o}sh4m+UdatCQP!F1`OLj-6t)|)UEp(ci9Xnu+ioOE)5zW)x!Tw`C%s+`^rTCRN zzDq}6|2v8O!O@zaQ*_~M&xOJ)*~4?;Z5lTxyOYStXn1K9iT?I|lZaHA@X)su4}GVw zJ2-}S=UmU7c$Td2hB430#aSYjC8AlP$Q{pR`_o-4t@1OXQxPySX;eHcycrfRAVA^MO7wxiylO@__i8fi{ z)Bqe#pDdQ`oaTnTRVW?LW!YArweik+RyepLp2{Tgc<~`WEPy@kbsxraDwh-Ic3x)L zN1vUh&w6`je6M>oUg6e;ae>;(da-;QE%_oRU#eHe<0qX8JKFdu|Ud<|>-WFNrwWX0Zt!+-_Y> zU#7~h%eE?SjmqzIQ28W>JRj@iRAwKbu8}2eoME-IqVjtk@|+5A<*g_`u8}3E99QM< zK!@Nj75uG&e^jtp1zS`=ke$_b6UV@tSIL`I?9D6i=0w+<*V;Jm)XoZTUT1Hp0DIHJ z_2xB_8u5CMI_YFo{s&dQoh$zxmH*eR{Pi|Yw02fh{ts791-SCzZso62H9%`xew11x@akZ*)oF6o& zw*{i$tCc26RV^+4Aeno_vFOeu9KqEztpWlG^XFs0NbgHplQfhmOnZc3?Z z0i}WmxG9B^Yf7m>j#9xR*ObCAGo{psM5(}GhEBn7e>w*Rc-U~aV>F`6)Me3==B|pe z&v}gCcs|BR-ETCFyy5Z20rCqBkN0R|Ux(o#Hsq*@{i_`3+iav&m4C$p_81J<&*_5t zfTxWmcoywP7azv%EAa~Y2J!~vT|kdL3;6q0&+z)p0<0g!X?^A^q%Pr_=mzyHzE0+S zXP1|~Ofo(2CnxvpxO`02)M$m<1|F)=M%kCl0!Qn{mf{0lhNu6{1LU_p{olCyzi0j5 zhS2}bKJ|aE_0t4hmdS?gDAxca|i{Wyl#e~_oYcaHqgH$Cu!#*c7T%~Sp0 z&5U+x4)C5U@F_fg;as+no5wMH^9Os)_sNkzdCl*p;dh#gf6@U+@H>IAx6HdqEW^-~ zry;{adbNBpjw|D5b_d7s?sW9rIXy>i^10Jjxr1k~O-bGuB=r3hwu(CcmZRQN=HhNZ z-!-Gx6#R}2zXtBhzT)B-&A)KLk0FC9q`u$Kt|JZaz;wDc{>ktff+9 zk9PVsC#?kj;MW0QncP?{mdZbuCB9OF(*5d}{lZLf4A1lsk7@rL`Mbw-4|Q=rw~O0Q z0(CK*`OBN;{)1^w_R9e>#-=h5-QFN|V^ASknf$~~wC_8+Vo z$MC8T^;DmoBmeYN-%bzAXXS`9bHo|0_9!L0+W+vhUqjl@%JDu4I5WqSc!uVo3hk3e zP?o*&2+CZG$6w3?$M8H(@Oa#mBmeezj3*w$ToPTgk>FkE!!W-2scpOW>Bx3Gw8>$b zgvyFxx{WURf7me`!#j4O=h*NZx!H4!pO0t)bdJwPY%Q;LdS2}$uT%!lmo4lIj^Taj z?)mb+9J$r=g(2PSLOL-U3ANnuL%LZ*QdvF6wy|S4hIi~V&#^~xWR2(8MC!eVbHqbA z;z8ve(mdY|M+bgE6WB8Sn!2H#d=Tjiqv{@hsCy^hYZ*0Gy29RaHYTu#GpqGMRG#Q4x9QL!pHkxEwUscQ;%Xn(p} z%g4+)F5}%S4ae}(`g_u5=g72{^w137u~%Mq@kEZ8l_MU{5i@hdj2tmNM@(~NcA%^T zT4hzvUQfDKu)a}HtYE$M|0$MC|=@Py6Jk@Z@-!ba0* znwKM<%n@^Q#2i=8V9Md@K@O#7H0hbA^*m|(l5?%|Ip!Sx)@OflwERtFQI20U@v7bc zj(*_2pqtN@RV)pjG`vRc>$ByC+&+$OO?dhJpj}vJu;_Aw2d{ZcnGc`7C!aR9b3f5R zhAWT(!Idf)s)DOjaJ34k4*H3xDo@_$!21nU6Mig;B?Wr3X@fT#@7dg+IX_J1Hvf{j z1J99@4w4jHX(O!2+wzfjG+i6#qcks}KJb&n4I zHIG8&C9iq+rz2b|V%KoAyh&wHp?~Ii-pp(%m%^Lhh<=UNkIp$>tT(pqY>)H@+Vcut z`<%+G9O|8_<-fOcF07puEXTK}1s^KF3qCC=KUVO5Z--a$$EgHfS=%GuZ_FGGt9&(z z`7#!UBd=*I|G*uYEu|@PpYJI}v#-@w`bJAepB7D1?_SPu%0}KP=~d+{eU7K31WM!^ zEzw<+-k_oSJ_*;MKSELIy!(~E6O${ZVsuk}r9Ey~n`!S0>n9hlGXxyNYktbp{6tH+ z5}LPD@9seFidiky8pP_Ba#l;+YRH3z`Z;Y>lUdfIkd;re-qEt;dsKfe{#TT(Whpp@m$JZ<@?=Z7&Xcl> zq|9}tK;t_03y`5vT^~E?<$P{SJR0cHg?Zq8_5(-DkF2RF{bc`D&yNi);T78loumgdWhaQACw8LuLqx_itb4y&U zLCbOeT4)8Xc8q&t^B&lZuGVN|4TzM#(H_$gjumA;ap&R)U#NdD55C^s?&%cg!KDDt z_n$9X%1x+g1@-hwucr}JRlb({g4ll4w&Tp=^=~$d4M#+bb+J{~TR+aBzA81K*LkGZz&bd% z*>kX{l{^g&en1ZX1P4W7E1ozJTUGuXdq#_`_yTBQE1I>@S@_jxSs!j1$M9@gHgWss z@K&;~*Yt1H^kJ%L^~(t7IZF0?I2k^?P(mG9Lbv9(F<-5u`RcG%-ZYE_&9~d9m7UIx z;TYbrfu3WTt!1Cqv&w&>_O_P5u@RZ`*kBYvnssC{duXT{8HLJDk?`hoztx9Nrt*#@$ zzm~wa5k6>t7#+O3+Zo(8j^W$B)N4DtwLH^nyGFNtrf!>70^XpuUr!*T$J>e}=%=)s zUjA0XIlHy>8Y={0wY(mv-y_uPfLdIqt~dHb=sGyC_fLebN9sp>?a?Ilu|9J@{6Mu{I$cGz z(#;L)D|{cdK|TH$$&@j5(&W6aI<54eI=%NhSB?AG%MHvCM{AU(h;Fin?y}Z$m=E2J z2HlPOL^n*M$q7P(YCUwcXGCh~Oc_(Bg(k30D}A5nlo}V^O^gml3tfsA_*@U&t*zx4 zp!<|Y-51scK1*F5l#i}il_!M@99PzCQ?&M#mDwN9(iELW(>&^}D*rO+${NeEaCBS6 zmGx;|uB@e=#&NB?i@V(s@z{R!Xq{Gh5#4j{ZjE2-@(uz0ae_zdd$?&FEutw7#${e> z<6FBcHdEZD8qnHCMcKVvH;&=!e$%VF8cL?PN_x0o7-c0>l9f#5)^H5p+H$Y8>1b`5 z+u9JjwQ0$%&EVE>4By&nueCWIx9j)gMWM9Hi_u5w@%zcv>hZfjO@r!lIb4oQ@d4h6 zU7hP{=byKa{Poq=R&&{99K*Z3#&h{O09x2uJmWIjok73;#^2DOv9%B*+x<*cK7(^_ zGYs`}z~{Mj9K*N1)@%I*57-{GYc{?vTg-LixUafvZ})z=DdZ(XFTY3(_CpVwF z)%Q+6r+50f&X=t*>&(D6FgKv$^z-n@MJM~%Whl6XfxXi&p%wU`(5 z@C~(a8Csx|P%V4{4V8yuH!1|B2zYx^veDY5x!uK}Trn_LT#_p;&gDluWIF<>PXAoB zeZmmxxk0(KgA0b*9~p9B?yT}nG(T-jV8X&tUV<3^marEi<}b?g1Lyf60dyF_U{!eo z>g(BY%!qh@{KvQ3G3}LImP_6piDsdYjPMGNM`6@a#=>wyHWXd~g+p@1;9POJmRF7> zNLTW1BzZ%OJUq*8g3ol6gIO2O$79=DR)q7v60Xx%vePG^GB`~}c&GcIFnm3keZ>jc zaQa#}eNC>oI#*nkD~4*n`y$mj$L^MEjNkHVIOy+|tJr;X!dU){dTdk1Y-T$q29TA{2(OvsoBU$cDoILg5X$;`&^1otAeok|5pc7A!J(qt5P@>sgoTmg`uN z-7Pn=)0dz!I88=)r~iY(@O3cziW9Qo^#9=W&ADQDuDB^z4AXwo)~e1$cDLMY{FcMv zpubygV)yNC8O9<~?v`6vA??%(g=B zEtN)|-7UAVF4Zl!vLd@%MzGT(P#K&iBfQi1pfG&JU#^6&I3XKOSHbB!a>b}zF;Y7{ z9!dU7{0`%^90l(-CEy*d@sY-B=Wm*$Fk@8?!=%8A!1QF+6N~hJ@syx1{n0GuUNizR zWP}&QpAEGcctYr;2Asb>QL(HSO;t{Q6 zJ>vaJ9yLnrUU{T0LLOrwAE6BhAtStyZ&4Wjf5!gfglq_z1|d^(MRl&2qP2XdvVO0E z9}w^x;-e#4)g+eY;$E>Mk=Bun6P%g3&Qyxom7uTcVWT}vUBwOR9ZKiCWO~90^rL|v zQHL`l*FTxeG=St(tE;OGAvp!-f6;V_`H#QEhRQZlWixZJPLKAimZ+hhkS1s3;>k`u z-A!k3KO+|4$OsQ^GYX^T-w^QBPd3241#qi##VSpWwgX2#+RYomHUu8E-HD%xQDrGn z+YM@KbDh;GP^&>5&YC1@YYjDfSgp38tqOof8-%0XKxjLVCf68fZ!UV{0*_lwVuydU)#N&xQ{dJVbvWB{{gY&k z;U+f&karXQ#{&0v0JvsUSxqpw=17y<47jZft_5NNj*Rf&@=+KxS|Z@lMmE6hm)Bi1 z%o7dry!Ryf>jcQ>{;dM~Qv@Eh-H9gndrj78YnURs)sJ zTIPuy&FxT?^)MA2j=B@8utZgVVXZ3Cd4Om!uKq4hwTEHTj9Gqh6>3ut77ht?m3 z0j(DThDJ7^9R+Ad=7}RTv@=w`GgWXF0uNeE;u!x>E6a0^Oaa>2sKe=;=f91X8EEoI z(D8=a5r$eSZx`O(bpW+d77X(oq{+?(W+#SuE@AA=82l* zWh&FAUOneI438O>|sdS!|%kpfxLp6=n)L^N~Fn?4ak!i zl0LcD%qMv4Ylgc+-1vew`Sk@%Y@sG;0^PK)Eu>2qD zaL!7)ahz>f%Kp}<>{mCKw@@2r2gAG-Y4R)s^Gt?$8)5;IjPNk;LSewX0|CP%8!!g} z=0HvIZk1`A3hqJRk=&ga;vbcl=Q#sYAUPg&IF}`nyxfqqN9Dk}fxMTRxI7r-1f(M_1=A6DENc?O{iAYNo^yQ) zEN7q&=f*@w`Cbcmv80Oydbk2j$C-cPIJTXU$Y=|TPusY{SBhv1ixvWmTkJf)q^L6Uz&Eig{Yr{SIVjQW)E zy7n_FKH&>o0bj^sTA~q%AtSt)C<;SEE^ELE*%0#_#5|iP7HK6h#QT*zYn0gd7u7|` z^DLwoZ9oVa;e{N8!tmc=|8YV#guDnLGEXed6EA2j2P4Tpl%&xj7hApZLS4kX#9}(4 z5r`opyqIHA7#fab4LBhiVqSrmC3)gyt)vU${YsV?C3dg8To)m)vXJA@2856iUdX8^ z4F6AL|8YV#guD(RujPqld19&7(o1FSt%B1Kc(?1C#7h5z&+NXF+=}0NOyR zYke@ZK}eGy8fYIdv`Y~SXk>(k_8$}mH2jfU1&wS#`wq~)%@g0`iLW)c>r~e3Rd53W zk6TURC;w>sG0*un1#bUE9nKGV{>$-4!%cn*K;Cr!jRo%O0B|=_Wj_Xk8-_Ibg8}zF zgS!c_07pi6a8)P_aJM1g(MC4F{R41+=ZU{Gwb3fy7!`~~;8EM1sPT`st$EJhDNwr; zbvRp+sBJaW?9ukO1?{f@Xm?RvTZ5t9jWoH%K-9r}AXst$tNg8;v4?3)fSTCijczh3ke90x=D-fJsJpm`|cG>UbOh!z3Fp z4*<+;O>&;fG+zZzA@E4XnG}+d`Y{M|$KrCRA5gz8dC=8gZ5im@$ z0rOD6JVcXxPi0!Cg7*=4BzGr{@{h_RBF-Txko*93IEN>ZJi?H)N97@P1Nk8}aYQi4 z^+=P48<2-F$d3>UkYt1h*%p8L5g;Q77$n&Mc`-m<6cHCj#03#?engz7p*qOm42(G4 zBkGNB1bsvBB7;C)$b$*jyk2d%fJq=muQr??p&x(hpD4=nkmFw3zY2fO9bcOKGb7*& zk=AQ&2l{)6X@}C0K2cA=B{?ucrv5=%8t;9-$BtG%bfGU)Uc%f;Q4HM32+!?k6h_k> z5imEh!R-og8xj$NBjWOixGW+rjfg=S-7(1H42?MbU38=P%as<()cA7-;+ep$Q}b{{Qq!)z3WhAHeiPRNFaDbVm(L`;r|M9!$hnxP{@HrM_&xX$? z&4!CuTKL)US2!bI44w_GXfqp1CiWYOffyO#iS0sRfcggk&xT}!*sCD+N<=J)h?gVc zC5>x0QbE(Y0$(w#?7_Q)A*tE$Wvka;Vl?(_xRf>QLB-HOMtBXa8?uJx2v`Hz(C{`i zycH3vBVtuVtc-{iT1GB1IBO%$xpuF=Wt7O(aMR!Gt5}fT>noFbeFaMk-|Gc%My?I+ zbt~HR`Whxyh+-f{MtEW!P#C=)N5I6$2C?@+Y+XdW7ZLA9#5)?7Kq_cjy}r({vU~kK zhNOD^U8~pMVKjEHf4~|JLdDQPMtBWJqcAia#;)UpY-sox8a|4M^%3!*7H|xboKKUU zc|I~4%YAU)l;ANB|pW(3HfPoKU>kJpFd$n-B1jS$OzBq zR1^l9?g+S_$p)hhVDx!Je5L{QLOjT+9=?+vc0V_C>>mEi^sxJ2{snv48x_DyGQxX# zE(*iTe(W4h$cC5Sz{{^A;;V@GQagGclAQ07uH3JUukx!}J^AJTdrw{jC**g*J!wUo zp8S>>U5sL2L`HZCh2iB5>>N(WhL^v<%S{pSb42{49lcd$y-fv`2)q@bn#7;}wY1+O&ZZPr zfNn<}&TkPsJu3Bg(>VU!sF#~~Y+xF~ucv-C^5suBzn8v`j2AO+DR%@__IvPJ&q$=n z-^^OiuMBP!VgZhf@Zct*FnEncz}-tW!0iUOT@kS}B6dW?cFpcSmHU1bJb=KktDlca z%dC#4=R3PnU^fYMIBEI*C%W`}vpT-ZVz<*`x5Jv|w+C>1kSb2k4_p#|2x&4cUoVO8 zVU7Toji{i83-5VWtoX8HQ#1=$qm$%Ah$)s+?Ro0hO@G=6!t&N{salTWS0=Ffo!-*x0yy9SP zg%-Dhe0s4{?{xVA3}2yoi-Q@yiZmHB45Q3&DPqBpjPMMkZdr#2MovMi@Wp1UHRfpjWJv0K0pOI2t156iTnIx zaYDW`E(MG&QHOJHzWB@3uJJWpTVSfMYAFctSA81Cb{0H5|t?$JU4i zM>4{5Y>UDeivbDmWH_hp{H{ynie{o9`@00b>``;VeqJy*z6$$^~HLjm4)e zj!#(}=Lc{+jw*gOm}6I@$wh|aLgv^FvEWEXc#geL7#zDJV2)&i<7?o!EMF|m7q4oF zy;auJRL}>32XS{|g?}u*neQx10b*a&;k=Oq@l6BK9*fH?hD$AmuLdwYo$7rvm|;Jp z$u|tc*O_5|#DXCi;Tc|n!eBT60W%~U3_k$F_w&WNeDPkscvoW_sB#Zd!KDa1j5Uc* z{A2N>eCPcXFkX&2ob~zsPnAA080Gt5u>Edu69HaHH$%gT58;@f=jjfOZ}WxZJi|3lzG99Q}?Asf#>YaUm6 zg0nH-`7Q;Bx1tW`$0Udw4Mck^eurrPM|0oiCw(;c4YK$@n)BWOE2*K4!BB5Un*7l~ z{ehv5KrEn=5gzIU6b97M2pB5afVvHXb8EiXk}o#ri+}RP-x}>iRp34q+>gLRTa(!3 zAD=t&ovkULeE@Yh+w=XO;_fhLthHQE7`!he?fQAxIknSh(-lszXI>I@ClWBwhHDT@R;sSv?%bs z7B(wz8dJ=_ycW(y9Zu5%KhtIf`o-EFu8j-KYhgx#dA(_5o$rS{$*+q~QX9<*0^hOc zAx$3YgZT4(FI8Ovf5b_L%D& zK3b9gr7sXLC9*;36j16>AWqhxeo*;-RKZ3B z9;li`Z~u5YwZQ3-0;r!*htspbzg~K(0VR7_eE)blx4=0o1x!0ohjUI6rgIG@ zdpw;LKxrqHKR1}tE~LqG45a}~X*Xg)iHz`+S~OxxO%O08vO#GGC|zD4F4LegRlY10 zWFs)3uJ(f(THsus0;mH}hjV2CJ~Ll}2{)~B0hK~MT!fk2|>oO!IPwY8V z-_T%iEs-X#G~ljaaIFvvaAbrBSBSzGUbzSu9N7T(KY$xvAZ{uU!!)}hB>80yw`AV5 zcbUU1nQD`rTiEd^Dum-?gm=6>3d8X@`->B@;rIwRURfY+D-gG8$4gY!gbGR#c%5F8 z7)@PlZc29)IF%`MdI!|uj4JSdr{fNbMkOSBH>KMG$hcojxz!@$J%b9W`;OoNa1heu zC^G;?GRK1v3yx%j=hz8_f$vZRJOIcB$4TILe}TBKKujzU6Ew=sNcF3}-%@>_rF!Dt zRZp-~tMTw4>nKCz&_PCc9haambPQnkaY8n9%!G~^1!8)Em{uUBY8?ZS>Qon~OZGmx zWM^19rn3$V4E>$iX{-h@-gjo{qha+8Bb>;o$;sFnb;;g$5Ph8GUIrf^myGaouSa31 zypmPoglx#23%PR&#Owm`gw}cklE6V}eSoyiFu; ztVMkRW05&`d+G&t`e9TCr^yKK^g!+y0d9T1fU#+u9uEqJr1in|TH$Gm&oYV#IwmH`?fS*y7>w<5npCe7aXKtwP zGQJIn1wJyuuOKq7dB7(_FJcr!mF+%X&>Z>TsGC`e)l_ zg?hb4HZC+za~U}IHnMAE&NaAtR9Umaz=fImNRv$q&B9C}iEe;cfNKIHJh*HWMjcHM zFgUUSE)U>x3q@;9?EsZ8M+Gern9){5jLc{&D0FgDpw=!3WA}vMw-kw&>{>i7qNgwMtEo?C=6&(1PqOAK!5j}oEI5)8p5t*S430-3V2)&inn8TId{;0>l$ghjUyK#I6RSJ^qd{tmM%a!!i@E8Fr_7y9P5n32E{;!>|i8 zJQ=ZINJe;uXP__`o{E4Ok`0Ev!LV1MIJHppEEE+QXifrqgs(a%2?`xZLA zQouL>bvS(r@nmC-#l8lk>;*>NSUlD6l07Ys6((MDJclao8_e-sq{%*p<7v$CJj8+{ z8R0n&L1A#b7y)x68yqhL#|sL@`Gw*<4e<(<^-2{CMc_f)ofzaFii1F`owa-7iaY+$*SA}Mwkc{vOX=^&vaVHDI3E5D185CYxBnB0U zfm+^uNP=`FZwkq~)X1|tbP(&p^JjHb4rE0**Sqgu&Q9Nt%HT8^;hmm_!thmZiAOe^ z9tx+gED~1~i6KQ|u=bm_!gJ2FyX8vbx4Z%l`nzQayKi^PU>1QGz01`;yX7iYNW14j zAsOKnx?9lAVPTL;HWdB`3a>2^*A$7XwY-HSZ>ZfZ*BW_tw_L-zRJUBsitKK=j-6hl zoF*f@)32d0e3k4gPRNGS!{GFdMdH6j;)Wt|z4rTcq&nx>-EyPxTmBag`n%-@cHi!n z>sds~-EtEvd;`s*TgV8n@Ld#!u$3$fCuBq6El~KsB5`w(7_Q~Lha^b1u9p89d3Lwl z%(_&!3};1lx7^B3uR~>UnvC#He}TgAbv^rv6SCp-2snLvk*F*Zw`r%pM3Vm!zuh=3 zE8(4Y4Bg+?HTjPPPMp)fSij(a>KlMOLd5OYV77^Ri`f_T4@ zJB$(=|ERhM8O=g|MH>)8MtC7LC=4Ngvi~?C8$#}akUNXS*dj4TYuSz@{}q0x(IUrM zy)vdQV(w-!JJ1NkkP%)?2DW&BhI9nnD`Z2=c!;^DNQ~1;8YAAXO&88VXqhPRNFshal#`A~8uTp{?)yN***y>|U8v7aLUMSGSvW*ldZ0P)DV)7;5>OVxK32r)S|$}kj_Yx)kS(SWD0{TLoC3N5gy!$C=6b- z+aF(-WCPrMfSXq&p48O3t9&P^;A8|Iwd&HhiP1D(wyego<$@w-UJBHDpbqEhBx(x` zHG5div!Fd00PPg2Ye6uy3Z%)W4Ya2iT2I6R8X4iCosYtRb_N25MmC^*4rrehiBF5f zCz=~=u7|AFUV0w4n#9-s(e`DL^H~bqXd^!7iz5Fd`K93|KLa4|Cj6-d?vns;yd&S2 z!Qg0zJ^6(Jw}HV8LM*_M5gweoi{2HegTcAG==}n4n~KEGn%Z^90BQkS=v9~g=^t&s z7de|!p!Q$X==_#M?RP`X9&MW}Xg>!);~n&V4~E7&=>2A({mRhX9rVZu56#^fPw${d zHb&bnK-*a)b`**2nwzzI9`MlycxJTKqxVQNx1~j$ohfj;i@5D6@=yM0QS;Ke6M($Y zw!;FqJpdf-l;@;H1Lro{FHi0<;C3^(dk~A!Mn-sW52G+JOhmw=jckBx7VR#YMn#jT z_g3!iwr6do=TWOJ%_eGQZp(~1O)2JI?g+FKpVK1hrEG%~_NdlH3F$4mqajchUF9sk~iy-xT2;^P<5pdB?mW1GA7}E>tkd2oLjR z1@n0iCfR`50WeE7Nq1YlS5#iwHO~ycL;S<<;HXoY0!i9(&p9ZG0Mqz;b4FQ8B8z9dC$N^Dtwr06S<=d)) zZ3sM;HHi!Tqw@TyGav<)HK@ZmFX;wzzF{c`Sfldny20E|ZJZwra|hDoc?RaW409)9 z0h5gIF!#gWHh`JNJL}+tY``1>n1eORMk-T=3K}EuNLH6#?H`pxqt4(INbZk1oGX(^ z4mBk0Q8~D7Ae&GVLxVv!MVh?QfV_f1HbX2xk`W$cdlUx0A_P1t$p**~0C{^Q-5Rz<}fQ87x(>rC=SxbpZTi7F${?%O*|-^x*}$X;X}!%mker^yKK z^hwI;F6=A3CmT+WgVT3M#a&TxXH<;UexHm~f4AIi{FZmYLI2wKo$S8dEn`^(V)RE6 zwY#O(ccJcKofT*tokK==odZx9@@NlA9)4s)=S1k75Eb`E#dt0993%mNwE{lDh_pNB zURI}`k;k(xyL0Yir_V)YaGH$pPSZA)aQb5Q6(?lF=?CHTq^NixD(=@#(>|2`5jDv; zEgyh)-ZSd`#_QV8sC)av8xOIVE71tVkP%+YjVKHa*RTehkPR`9Ld+vk@vv4h4Do&? zj~FF3{)g)#WHJl632i_K8R3Q8fx__r7WN+}WJAbQ2&s;WDN*s5)>4He|4^znTI3X~ zS01a2m}x9#G#Y^zGQx|wABCY|9BaS{*$^`mVrE3ebgkq8#QT-ZFiPxRnO+wmkF$_T zXahpX2rpzN3d8@&2>1dg8$#wl$n2TsTn`iJd214z!cy7~!2NY27}@~ib6s%&2HjhQy=luw!)^IQh^Bw_)MjPT%| zM`3`|+jx=MTxy8tvNYyp%-kWkby# zR*NlYF9bk)iRyYe7~0E7lP?))FEX?xhy^qtu(+~g_%@}~Qh7Pu7w;AqQGXH77; zcaSFEHsIc3aPJ}(;K&FMZUYJf+)Pq)&_}xF$evLXmr2uU+>TrHZx#Ix+RL~HCN3yzfw}1HUj5^y=Ah{pvaCRh-+-XSK!*5&NKsKT#b_RpYK$_fPKyGJ{ zjS&lwWP}HqgTesW3;}~A8z39Ux{HjMXcY4nvRkTrtyFLz0*_@)qIt}ByKNeCGAQO> z7P4uNSf@$MKLIw4ndSeCm>HFgaPF>ThZ&W*)JD@-;HLt4NRv%sdVzcY7=ef&7BI;O z53?N#qmCE?hDkPHwg$`tHOclWQ;7-^2t1P2r3J*z+=3%9=fD(5mZA3Cy zmG;bZPKh}kV(N`=27N>DB!fV9=fMQJdbQz1CV?2e+HgXQzRzub=TwdylWA7?ga7cx zAL0J+#`SPXo)QcE!y8t#*`u@vbGre>FaXI2&yDuQ1h?S`m>b#P)*IY<#l)#G(K9A0 zG&I^T6HFDc$B9@kL(CpDrTi|Gmmg!kpi-XDoLjWyhXilKpw@EU06NN9L~ zUB?O8(9jiB+^46DaauhrvylX|>Qiaj2@zwiwBBF_x& zaVy&N_!&%VCW?U;8R2OyL}5Upy)U`P$p)=+LF=5D7!VU@$HZBh)*__(d;A=ON)CW} z?=j$PX2r`Q`gii~&!o>{NOrHE$2y)x<8s$ zypIgdl`-cqd)69k#K_CxrhhT+GS+0zT9+n`;Xy2I-?LWGUjq3E&d4i+N3RuaM(-6& z>|+!|uagm;*hUlvDB6sZM=#kRb}fiq6BAd*#8ojdRO9*ysi0}iSJxO;cE?}Mka+OQ ztE~BID5J4Q?tfUr&!`w0$Ox~YK6c802HHiEHINMrw?e}$G4a2cxH%?<$HYxqMgwGU zDr3&^cCX)Jl*s?VO@FW7%!2G*AD-0fH?g$vy`BMQWMy!#ThXT1Z)0MOQ4GY$2v6)l z6b7;82$&ezAa)0cjf#npF)<=0Zr8YI14+=ddVQ2(W%v3>hNOCZgw^Y}Ga9?st5`!W zDuxC!!fT+-A)%p=UB?O8&@c`f?v9DOV&cx27#kB~Vq&yb!W%!1k2y!XVxFK|?%hU= zybGTCJN{1AWOw}7q>dkxWRGUG;RnJ&5Fp0~4+JaP41{|a;=w2eh-8F^*ad~b?r>&@ z6S4vE0YJPzChm)gi7_!DChpY)dCSLfF1|U0?|y^N9t-y|H#HU}T4P~?b$&0Cvd6_F zmPC6;LJ}F_CDGP~P(oWj^4L~e9Xc~0X?jddi;1Z*Q5_Rgw4`&86T?OgZ0Bj=jPR1KQ<7*KLzYA~dg*CMdMYO7$HY7>=6WPK&m=vKJ!SOB z`Ebxb!soFpYlPc>=HXu+yn`RZhQSH>Oz=pyqRmKNz>ID}F?2f_;TerWVRZW~2$&Js zVDu~)EsBYS8qghx2RYT-PtpKhWa!ufc%kWSckhVj*vl$Z058c1@1?t8;hmnBWW!4d zFBiwe3o-G$c9b?XbY4ojNi82j8Q~et zKwEOuQBo%VJ`wcK2Cia8@K;nQs`6lT9 zkb@pI7sDC3BDi0zXw$FDnV3W|5F;ZzG1^8Dpk6`1{Yo~7y$xb-#l-5ESQQg1HLjIN z1x@Rr<1NF=?%maFP*02f{LjxJ%HPE(#(6E+W#|hcc@E$b08x!xu z#9A%jBbD`I6?}rgTV<+AtoN_ieGqfrO<|SkGt}X{AH%DqqB5UmuMZ3r`7R`TuaECo zSk_u7yyfBzRM`i?>q%cAO}=l|lh!e~FA)oHWP}GtI{|{%cL=!i$p*Nu0q(1q_)=4& zy#bN$R~7t*z@t`O`h$OM?z@=tRSMMpKpoDvNz}eG)aFjYdhq5Sph7mFZ3ncPnAjE*TVrC2Mz_DpO?&(yJ7fMgzFh{LtN|l$z-_bGZMCk$Edd;xQ^mW2Inq{za;M?AgE`Vh zh2Tg=c#gDFACMe~fCnGh;Mk2G%gky#oj7A?ZJnvF%=Xe@E}%~W)|Zi$*c`G zFLw5)n15Mirycp6X2pJp&5QLayFLE)FV>6fvT^Y&{l`5r5I>o|Mvi4Z?*eW^^)|=f z5vIk_L+NDQ;9_xkvAC>QT&gkBzJkboxe5j&@G#aS zuJ(_`p~cSN6fjB?HmEi@ableBNUCTmZv$RPRf{4BtnZ ze9nDr4BrC7)x}~}u~=CwRuqfnn&fw?!1pTn0f9%d zCh@L+IIb;rR;NJnN7Ui0DfX{Et~Dg(YGCq)<0=c~N(wI|t){WH2+F-0dAx*9^ zSl?!>v=t+;k`W&3HWUU{+7ywok`1gIfc5iY@maC>v{-zinbxS>+f}dwfycDE^c(-^ z{HoabJO!pZQHS$o64S2?Q+srNZXx~5!uY9m{z(ARUDU=`!ANO8M){>d`UNB1gIFLX zBRtZ*Y-+e0NOu*Bof_ueH#MwD)Q|h-%k;RjD+QRmsbN~&zhIgk*Do(}7wC8cbf=-I z-%@xd!}NIITMF-Fm=@P>DSMcdyOSXq;Yr1@-4_O50RkR;WMl9(i{n?paqk_kjmp$k z1r7o;=CTQsdB@9)J54F(U*7TBp$?}-5~fUp$sTh}Q)*A;GlMD7W{k3hq0~H1 z3TYEYj3+X}Q#t~LQ3q|i$dt$ir2o zQHN6$_b=N<4JerpI^KAS1duAD3ZlWJjz*d+GNcNb)G>$!DKf&7qRkH>opx(vQe=Zv z2aqb&m}nP7WTI^k5%fUdVX7`Y#6O-6jyt6(U^)eLI0wbC=B*y_o}p*sgDp&@0ca|y z(80lIdLm68WY7pkLz^rD4H@ClT#mw!djSGQLpIQy2s9_eMR{Bt9~a#;qrpgZy2h29 zMI`40OHMiWI<7PQ-LT_XAY#1lhWR%v@0Oe#uotwo0d{wmOB)S<0lBBdMUS{RS!=xsN#LNgK1W(lFHzqguaF z>&v3=f+rA7MtISaQ5ah9XRSCP8=}vI=riJ?e_Zs_iXTG~XjnaUhEZ(yRDaVuvY$D3 zd+IE9dI~Co(`1Bq`Z*Mauk+bgoRAHtFNV_>#l?kjae;RFd6o4A6)Z;JO*b`(%lxzQ zpty5U3e$~59nQeGf6NXtB;-Yq?9Iv-8u{`9bFS}YFH&WLf~TREkR}J3Y3LFL_cCGu zj*Rf&R-iC=Ek(fBCD{P?AAq|yF0RqkR;qlfRInO>N3FW_M*k#zL)^JG1!`}h4(IwL zYBv~a_V~HhfRfjka}Dins_TYeXlsxruQ$-HV`ys;3ut77hxRE71KK(S42^6+8wqG5 z;^OwWsMOp(Q&~S(!3G2#x0=Kl|7fdzTM@D#Xzo9U|{fL0UkqvP70o=s6n4qcsuJU1Jp0fXm zz@t`O`jCILO^Q1cQ=s-Y>Tn*2V;WPl)eCfAnPgF$Xz0iZ=3JB7OchKDCbb1=@&QBY zekQdQu^>f8cv6iUv-C6sOp0ufdK{!?#>I@dm>w6?G_UAk_gpea`D_yEMaen-4Rr}MFN0AhkR}%!)GsjVQp5r^ z8R1cPMq!}th=5U(4b&@vdPQ6;kBc|s;tfr^OyxdW1;-%pXxAjx_{aBKac4yew7Z}V zXLSDE~Mar~D`h`1<4=sR2KmocKH#_yDBI&kXQS8TdJf1#mJ#0YA1)@ALt^)B6+X z0f3y=w!7HVM(l1QcC~TWQ!YF`P3~^v`<2a}c&B=8YsFUXNlQzMQ3};|5gjg;yV}eu zf250B0XiqUUW4{&X&q-4uW#D{D?`{ej;n6cjf}GNwkUK-zlQx9l%Se^^?Roe;tsV^ zFNI9X7FuTI!*CDd>LCO?uE>Vu3`lO&)>}M!gd=66wm!k#;+^(~;H20AF^c879`!1n zj1xB>dHz*><$7ZhR{0nbSsaRyxXLLeH`A~)S5xMCB~&uJ*6ApW`llga|Hy{crqJ3% zYn{Q7vWZ{oMe$C}p*1OXc#LAXu9;q?kK@G6M_Qw<)@H1A77|%2im}!wOm0i7$~>Dg z*DE0-yw)dC7+U8dVE@R5)=X$^p|#FKq-^0=+AW?OGa#0q9CcBxOv7XO5lcZ9%bkz< zp@59=3KpO+6gwV@I>+!=uyHA=k(9%}EksH9Mn-tw zo8@*)bu z1<5Ypglzbd3tw7mUtU5a2D;@->sr3#u`e$pCww6zyf5#eFkE<-UBC(1@FgFR+Y~orXRK4n+HFW2lYzGo$z4)L1BRX9RY(S8(SM@giM?%r2p(u^)>WDsQm%R>Wb9)|@m!zQ{M_vN&3ZIVYtg%2$F>+sH=rzn z{~+M5AR8mcS0^jP{YBIQ|atI9{yD{OIEhcP4KIE)G8wIjD7Ql8&-%*dy@C?D9Hs`8N;G<)G#b|E`biF|N`jL?pZ zMp?8!irdEt*>GeK92uw`8G}eU&?V9>8!&D^z)$2-c4RE_!4Wb-J900|qWy8)K2FGn zBUiwYA=;4%h?GOx&K~*n-iTbuj!Z;8I6}rg9BEWJ2bY6ANRGi{d*z?lu@S+q2zZc? z4NvZHx{Gm+xZCj_Y5$^pxybo9owUlzN>6K$o}N9Q86yXdtKD2DVl#!1wUl$m18BPW#4ZnwX~AzaS|ew-d3Ds>pjqoDb;#gQw-_N#Yx$NtQW_9>8&;AedVD1 zgJ>1OBm^v%Y{=aXxiya1rsdN6o80D9l`o_Rs_7YO=A|1=1Aeu{c>2DJ z`;&|EYn89J@ACfSfb#YCUEZHuWIy5W0BZNe5?`OM3-_tui7KiYH%`a~_x;*+7Y*Bq z2JO6QWE$e(=Joud)fFf7abPC>Eg;ztw_xs#(fp^*Mn@&xlzlNh^Q_mBM(wCYdMCwX zK*l~Mzu>{L3}sQpQUp9$$cEER;Pn3OL}TsrYlw#wb?ZNhZvFeSXZ@?npX(wUoAaJ| zdEG{2cT6j5%D%mha`26e(7r84S@`xQyMz<6;ady%*1Vl)rhQw1czC>onyu_azBM=g z$Y$oer|ViKyS5U=;2IfWT;p5DCHd^y1qc`$*>G)T305^r#PSlauLp8G_jad-X=zsNTKqdd1h)XkM<`*;=Q!jdH%4vqCD zltt?|AYce&1M9oM`c8>htFaE}c*a`hVSR_NCd*!H!~Hy60uohZHIV<+69kOn3=NWmJ%HC+@38rgXD`{Ficw>cA^`qD;oRAIo_Q1W}C1RI$?>NM>dj+0*yW!Nx3`~gG*hv;n?t=X?-OXOa zYb(2obMy3^mY{aJp&GbKMrc=0M_E)+!5-p-Y`EGe(OvA95DgQeLBhNA`yq+FJfV6y6__5FNGaf2w?cBPcm4 zfh;^~{(726FZ(#j6wSp3CsB0)xI5{(L(M12IT zjckx81BuQF(MglYQ2F*pP;#6mfj_y8Kf92So%TYaDbkt5vFvDbn0^w+XcBxTJCj|H zNvJwq5}X?CjFwBfa8;S8O4?-}Xe*ejq1lAbciIAiF68QFXdNI5pZCEtmA* zs*Xohl4BK#?i^cA?cp12bs=#o%7R1>1WbZ#kT?}2dL~4LCecgf!(SavE9t9A^nvO0 zPRNSAkm!qa9vY{yqy1p|N%Ynv_)PXByBU*Eb-E-tHQE_1m-OMP&OlX?V-<;B9D63U zSFePO&|~64lm&_N5HJa{L82c>oUSq8F9uVlOAwTttuYLQ>70>}r|$*BAfz*fGug|_ zVEQqfp)v5;VStdXE)Z3vOMw%kozZZ~SzOa#)FiDUiba1;8$ylNDBZ8F%|){AR8<$0gHu(6IMS0L4v=;Xa29Q9>b)8y)z+&%kL+M|X2Zx802G&C9KOFa~ zgi>CoFbhg7$e2;SxgAE^i`I?nlASoJJ91I4tr9HboQN9E>0B~Z# zOLy()sg^h%3@wHh-me%U3|pZT?5JeSZmY24c1VOBb+9`U?1mY3?ZZmjA}Kn$I2cw3 zyX|m1I67i?l(6f7Qm~_vF}t0^jth|pJL+I}EZ7}W>rcR_hD9JHS585~0bB{Rwc z%rHv&tqYF(BZN*uWkHDr8B^+p_CWNI2qo&EbOIz;JA>|@wHIe3&;Kc z6H0rlEGV%cV@f^I9+Z3}LWw#kodilJ8a}`pc8`iGScMN)J|ad2uK><+{6;Eagf z>B8=Cl!6_VjM*I-c03q~u%ixkXMx?wV(&~t5Z_nM3(f?sXL|-CNuY%HjPklsa)u4Z zasObTZll5nn?NDNzTd(V#S{*gMBiIu+%?IU%J{wNS#xf%E(^Lg{ps z1tk__OzBdz2c-*6YK`XeJG&HfRaoE39 z*j%HsV8nuq8QqBX@YnT7gb{Tx8Vg3%hR)4lrCX5{jV}(WLF@$*y9WNkNmB1BX5n}+ zK00rY6Na~;6zr&E%^Go(L-~KvHyNaWEOgmXg?X_zNLlpCbbt53Y>P zLQ{p|Qz!*HDjBnTG3@wRB*Kn5*j)p5R~LKJ48bKR52k_EQ;Jq_HEC#K_<~}dKV8@? zQ&})#LB@<;MSJ+`B_zU#Iv8CKM%NiSuZ5M~KvFcbIJgePmXp}E@D~D@zSaFEjt4WN zm^wokzJ*e-qmnVZkHe1NLn7>`gWb(wcT=%sduBxQR40vCnYWzeU*K zQ+kpGBNk-L=qI#?zt$iTM%2ORHZYoH==_30Tv{&V)nPTS{DWEGwu;;kDe-jup#&QHPYKsuRTg|%kTKsq&>o2YLn3pKI`}>ZzRwnW3k~1B zP>x#(7T;&%d>7WkcW*TI7YW~eR2F<$kTKuhXb-+UkO*Ju;JXBT7Z-ak8oqcr)A8@( zINulR;ah>m{!-z)pUQ$S3o_>05ADGhUp5T+QU~9cz;|V_x5DrpfbzJ1SH}6SsE6;N zXzZ^NzK5wS__82lzQfQSe5;U%f2o7-Yv8-O*n8FRJqqR616uQ8b)4_3_3%9!js4e! z?{Jj`UlwG{_e8V@-{X)7U+UodHu%0}$exTs+;m#V`$pA=^W5_m*uBZsh3z2Z3$nUi z=-IbqLg!9-{5VxExZtth&_Mvba zji%s6C1Y;*N*}qMFO-m>4sM@<+b4$Gr6|O<+T!*}YHptix69BJ+^A&CZ4%mo(s-eS z40Uk(8r;4r_P#XqCZinp!@@Z@n8W&2F@{d=8dhPfgD=7M-Ds2-%P21nW9Sq#_P-IX zQ&kpxS&%W`>(L%GuSOzskUIGO0KVTBdut5enJCB2GK=r`alUKn;d=ub`#%cb8&wv3 zS&%W`IcN{Qw;~a~)WP>x@LgN%{bKmuiE>=GSbW#U`TkN5-@DM*|4sPLRax+5LB@O^ zLVNJN4~g)l4!(ba?>a+v9tv^W53e1z%c~y7$*>OWKIG`*5(aXqjQ&!raXiAoTk;V8 zU&8MZGzB**8FRyj^2qIRp@a-|aN7WG>kYT3QHYy<7Ps}Oxos3~&!8!|QOTIwVzdRN zMM4P~>fqL>q|(bP(a(35q7avY7B@O8h2I*N5O^7yf*X~LxvfT9K)fWBkf9E4&A~0d z#A{~gy^eC+kqqbHa1Lue$1i%3s~OmS8jW)7(cl|s>=y{vH&qsVS&%W`kI)`8-$f#G zkUIFb1m6}V-e!jHCn(45N{ercIN#0c;rl5X`>llUXDSQ6EXbJe8ng%BuaF2|>fpOM z__izY+8Vw;pd8oQ7TA`!mS!M8p5Zf(f^ zg~Iq6-x};bk4E2G2uD=0+Xdwgs zp@a-|aO(nYyOelEhTgU)kFW7v_~v@F#*4uA%V?BiYkWI2_7lRjgUW(03o_=rGune@ zArhH`)WP?E;OmumC5G=VD37mkFV4559==`B*xya~CR7%DS&%W`ZfFm__}E;?mpb_F z3BG%jc-;)&Jy9NC<9o#UcB_Z)UTEy^C4Bc*S@2~+#(aCCJ^1=a#J|+Rw>$Wj8nV4n z7+>S1VE1)2`qmonGlu8!F?qf({L0Z3+^A&C?I5%TxBZ0@GStDXC%BavZik>SzQ)T^ zbL%DC@U=N|qmnVVL1+s~hYBTRsDoPtxb-pI2BR>39`BQy+kV3B2s8yZDj9P-7HvW4 zNTGxbb#OZf+zu@94lwkNLwS6SABgkJm}re30Jh&oqa0h~_>Nhgf3R>pL1n?01sU@_ z1MNZcWF#^Nse|tT@aFGhKMjSq_R9asimIiIfZ|u@Vf#{!Hr7B+^#`e zaJy0{AwwP9jsdsfhTF9$#N$(o+wj!fjumd#p((gg$(Y+MXbVa=2qk2wgWCz z3x#+LVR1V?HMjp0ZnvQ+xKYWN+dXItN_Pk)WT=DNso-`>iFdN0cOS~}Y&YCXp2=Z7 zh2tl${>w|KCxh)T(I`JFqm1|Xc~A3xH1Z3x-e|*j zG0O3r$KpFC&KFyzI{mu@js5e4?^2ZoUlwG{_d~P?-*=G+U+Um{5%^wc$bO8%_<8(7 zu=_QN@YZ?U`r*yR!tfI`20JPlv-<{Z!R`wog$#ADs|LHv47=}87(bI=mJYkI!fp*3 zgB_KO+5L*PAoY`wLWVlnO$56MhTZQdjGxOVq{A*L?EXMwu%nVOyMNIZr2ZCC$WRBn zDPT9b#Jj=}%-abBV^`&qLD2qv)fLd?7fRvHm)PmN5nB6Gg=}M$1z{FsOn5W22hV&Y zG8L(V@HHTOb%{645N?U``04y=hw!v|2)9COf4UHEt+F7@f{Y2bM|%+79ElL74#G1* zct(kLy&=3U%H!wr84ls=>mj@yTKhK$;SMSb!Ys&`@O9lt5ES#e<2z-g-oK^c2VRQ) zY7_>drfu+ySGg`bhn8Z2HQq?+()u}*+IxbHUPO!AXnJk>zEF?juW`*K`Q&8W9SLqkPL4IZwzzHUPP9Ah&yW zuWLHwy4oYVd&I6iN7gD>5ehDe@{BkUxoRN?*#P8{AUC1AH$EM5 z6MF6ZJr`v>$hON1`6KHdHd+(%g%-fVfL2AVVEo_63(7{XE}rxew(< zJ^KZIzi{J?*KYYgOBc!e(vM1`MDKoiK@SowE$h3B48Zu^ z99}XUUm&*}jzd#*NUGxVFLT(sb3r#{>+$g#{KU?GJp&(TR}{k8R}|7AC!mtQZ+}_} znYpDCj}}YEArVWd!_spH;_`o>HuDM;24e;$E5`PUb8VuzUK6iDuGgb(#rR&F7vp=8 z>hyS>0@RtoIuoVNM5%LayiN<$nTb04O=2BL;#?Q6(*||EE@WTwe{;tdu+H`II$NO5 z4eV>O^fg&i19}hI!vS|9kpZQS0lf$Vdf`Ct0yC!fqCB`@ zpdQn3#DWV^Fus==vinfUzgWmXW=`fYv)p91F&yU@{qplWY+x`4fc5h4Al=%9$aOphLI$ghJx{k!VnB4 zAEJ_fjgW!NoXnSK513Dd12WV><~oqMcAz)ikogMb!E{3=3`fDWnA_7hx5Ie!H7fbn z3mM4F$^3%$;P8WRK!!TV+yF8&2YNFMnYAbnW*9PIEDL51WE?ZW>{nFsZxk|+nUh(M z_TccBa6pDS$lMGvHyI`yP#D}~nAAU=_~E{q(`h3h{9A-4Wad1Z4Huq`k)U~_YU}vq`^ui{v0@7b7 zokC{R>8ztb`jbXt=!ZzeQ0kyC>S*(ggilej2UkY*1_Tzh-x_^1z493j;iN?+ll_)- z{4Lr7;w$M78S3cx{HWvaP!e{$KI-@a>39tep<^l;cf1yD(ce$fA2QU@@g-5mzoI1U z_@AibOQqxAa0ne!$++XGxaTN$HcuRmFWL_Gjvt=J&BNn|C(G~ah3h5U**qc2^FG6U z9Dhpxq~Rn5nbjqU42L0i5y)LI+&e!Va_0|ER@@JAa%b~`h}|}z8`uYV1$Dnn*9SoN zVxbG!0CdNL?%3g8bvksbBZk4)D9`&0kuN6*ImiYeHyPw64fifjhur11FDFIpI2U)f-fe!1H+iJFQ@lRXQ-r-0%mqTDXwwGL^Z;cxM(2=A8nK_M) zXb(2qN$J1;8Dyw~)#+e$ z+DPwI!|Gs^V{ad_T0mB(jpPm4Xjk67nGf;>N4U5Lv4vjNW z!yhFyATy%z@JMvK)o6B$jvqnC^TLjUc_R@laUPP7m>1-AvI@ei?DGHnFE4L1$>rrW z&uhV3iq*KkSj~N2L0(0lJZ|+6Cm$7dkQuR)06Al4aniL&WUQ!z>rJC7y&Fd9067zd zLSs8@bmcp{H;hv6Nt#zG_?{ncKjS^vn@7>_H=q&XC6$cB_HAejh+BjVGStCpHdxIv ztY)Jy&T1A|$*(YMR{Ey+?ZWDIGy*Fs8MC?{Z9(Q9A%hHcu$l{2cN$g?pb(#&4Bw7> zic9TIu#)%9%$sJ``-FE3s|V2ttf*wn>It+3na6|-GStE90kFEyuzC`O;;RmN1n;YD z1o6K_qG5bcs4YNCP@|GDwdc?ljGhrj$WRBhM?r0#p|%KxaccAG8^*_k)$?csR#Y-( z^%B~G%yJ=v40W(t09H>JR;y5muVq@p_(Xlf7znGE(Fm-lWX$S4v;~>BgbXs&!Rk4% zS~$vk#t?fS<>D^$QR#)FFlLAd>YLKf)HbksX)Y3;9{>Y9sbtLa3$z8jPlO&a)WLHZ zcrF>`EjB#AM0uR&67aNsGPStAQC==QzXAq$QpuR-&u9yJ-wQotsDtOL;Q8_>ZyS7~n}IW1j2L7WDoUddN@*&v(G{tx?{ahUW&9 zi$Be`&fkiU`*qdd;@Bf}H> ze|+@(!}^GRB1D@51VpK1OtdxHg5PGs4;ktp`Zb7tIm-LO5N(6dlS;-sw?SLb+fwKuLmfPS0?!{tdEXnJ+oC+q^9RE-bm;f>5&c<+ZU+z$rIInx zozWKjItf2ysDtP_5dD3W_nRSFgmQdQ)>=uw$5+yC;92L1@K52n3oyWwO2#~QLtD@* z7JA4~2hV@ObHgZaz2Vsv<#C=H49^02LwtRGME?__y8{G7sboxaU$h0keS{w})IqfQ zX#C@q(O%QhUX#&!=T(M7GWfmpdAr%@ShQ~%SDTEkXJ1w@n%(vUB$!jlnE3%{3y3~K z7#Zqd-WJSTkM>%P_F5X|2jWnid23L$;(x2S+7is`+`F|C<_7^1%&BC|d=T1#@Bkr< z40SNy4$QY1?X@56ZEcuW;gB%zPoLx0A;C7IV`qf+adm4juX9>=5axpc3FcHXWu4`wc%FjtqWx{2yT*AY>f`AN&r^W`o>VgCc@Elw-kCxV8S3DV!g3Q2eEBw2-N^c8DZ*zz=9uTlv zvV5U>M8K9t$bd}^TX|>@ zufQ9k&&p$i=U_kyYSREo8^nM;fQUC#A-%2;X&At2hH=1_M&o0I$lH735Xnl~AY^?Y z;)kn{-aZg%kYzQ?+iYss%43Cig}AqSpf(MVv_T9g2O_>!4VeaaRx@PzkRftyAH_`4 z24Qx9Fxwx}+YcfQdaP#X1#D?FK6Hr49*9G9qofT&wm%T@o-(9&2t*oWSb)AZddba48V++c*WwV} zC~1R`y%C6bJqgmA0g(n-RO(h(db1L!?2L)vS5IriQJ=xOj#5 zJlG4hX@I1;7|^VzigA5_Sn2hK^m;+0VF0To%U7rv$CgH8j9Vcw4$`l{A(EA}LC78f z#7eIU(i;Sk23b~1R;<)9j!g|)iE;4?^!7@LaWBDuA*f9QByA7_jsaq&cQmAT6hs;Z zu$o~Uu%*!$<05Y#i$f$UX@ihG5r}xl5z;#zA`P;vW_g=U4O@wE@d|NopM=^pK+*;= z;0z$*%?ijgxU-re%NQ5A_Dsc0(gtBRN|>Du>750U20d0Y^a8dt8e?2Ub~FyrjgmG9 z*$aVK>75Vhod=NySyr>=0h=1O664|(;`87l)TRNFW@W(E|H%EgvF+r};iX6h@)ja> z+@0HDLSvY-J*2*CKMn^17U1_@_~H?MmuEEISmv))<`i^AIexUq7v0qBZXMBrxD(MF zd_y&p`-Y0=m1qx`$wChq>fpJf@a$~yyb1>b7DPO?MxOj3OT@E!5P3rSJ1L&mpgDMk zY8E_iM0?PiA@q=;4xU|v=Pnk{n{Xgt0eO-ce-jZh+XGKS+BCy^C-{zPLh-r<)xj%N zv*0xs?Lp^up@R%{@cN(d@*uquied;o;&-D;QCAdzPv;K$=PUP0!+^C>%tLvFrF%mI zoXnv6b+dqNaXcVsvSPv@TFIY2X)Ez-h9-^cINGd^@}`={1Ew2AMgQCM2XR3DRk)Cn zUr|0Ba;BLP=Y1^Bj~Fn;nM2ULF=atBk*42AbyXI(2^3~i-TPy@cY&AQA4ie)ML4Lt zv1<&%6ReC+6pEU~pe{mtz&wpaTu&W?+5>p_EhnVcouU*%59;%%QdEWl(2oZ7MQIqY zN#vjkXnIhW=w<=ia!?6c_n_8(v{@akjB}ToZWI;m)@3*#gDRxNtt(7jMTrAa`tu8UcsK@{9#dB8YCoVFZ08K%sk8fGmf1hzn16W8?4M91W=lOW`xg|+ zGH(1Y?}c6$TKfeBZB z9YK6swr+;+Bb+3}Y|A?s6nhAwtzL{+Pj2L+uFXmNfaiZG;{L|_#tc1`HUHl0gP zB?UE@olw(1jRj^fJ8L|tCwM!Bc(wCWgLArtx-;s>XouElBHE=zx+iHXJ#|5mOkLR= zV>x5~R&T=PtUC{vvzgNgHsA`7UFt$um{+}NZS})10Th!Nmj;mowv%BiZ`Y=2moN(P zByep(z*We9iCk`N{JWUd`pv!5s&2>Zg)3oX=xQQz2L zLe3#9rM&_D0V>+$egcoK`y&&h9rY5>C1}&R`^D_2u3Cggt)1$xWjid2;Q6H&5jr6q zfQ_LwK=V5k8UGSiGTu52MU0~fX)D2QAd1BL*uX@lXtM{gp6!o1j552|!DxWtw#PLJ zzmbD3tKlH4mUd9-rDChpm6>pafWzz|$oSPUBZs0$jFd)V9#fEC zI$r!F716gLalB@80y6%@n7jTDMdB`LEABc8MaI@P+N6_NYTH_eS!M>DiUu-Try&!o z9G&i>iEw!hA6T`F59+O@{Fz^x6gNm+xWVu^T@yM38GlmD4QHZA+#qem4QEO9*t%%C z%eac!1zpFrD=fXDKE8^HswGZ1TX%jAJD(iue3b57K&A6BEaJ{$oY-Pd#q$Iy=Fn)m zU?Sk=NB61qunVh{P7z?KC2@c!Ni=)gbd87M#i5OGiR*kE`1C4@in^hfT zU4wfajiR|6=N^IW6oLu&iJE(o+^>mozg%;dzJ>c0C^F|;v(uQuwsM|KSm(@ybw)^7 zfiq!6g@m;<64p#jSd$`Qc{E`$Oz1Q7mFPa;CIE{i+`XJlJ1`(u(E@xtThuIeFEh{{ zFxMgxZ&AnYb|6& z^!0Fkr~w_o%}?nZ3wR!y6!A#R;)shT{D|&N8cT1Fu_^r*Pyjgw5iLtOw>N2A$I)hW zl$*OO^G!F(fYxfHp1^_7^9gGd5|)<|dR!Kus%BY^=6U{2^Z`aJz!6NjP|ae>y@2+B zc@~LG3hJ10cL5&1orLu6fY4L!MI0@<8wD~a!;7poxX6+buc8ZCoAVA=XA=hX)!tu< zb^*~?h3%2MYN^d@-_ZY>a6pujYv0H>8_8s;Cr-^9$-lU*!fS|trdr^?q8hG+ zY%FII7M2ERf=c4H-%(%O5h#|irZp#$4ICY9R!1u{k=D8F!!x4pRJ-O+w_0I%$5@Sp zu5M=EU#KtZMNE?Q@(+sqCukvN$9kh+s)dDFOtofsp&4L#@?JAC)G^f-qLWJR8A$JG zil-p-EXzlgqUTV+S!TW>*_@?|+|mM;KF`u|?V@`an@T4EL2FKmfE{uQa+cZmFkVEt z9@@=-;4fx@{{khLw?L8jOX`WgTGi~wI_)p9@LCgZX$-H8#*=!2*RCdBjS0BSLfr!O zjZe&a+>)jAUqJs_^LuN7hbirmiMb)#V+C|E+H~%|k{#7mi}0wmQ~kB<0f;7ie(4HA zC!_I#!12fbXwK~^p8pwd-htJIaC(MiBzc4uV#S7Ju)h$1mk8i|oRvxpa%%LT_C z{apkpMl%{mSv!T@SJ%TatWx@_082$7*hOGLFoBH!T8!YXWWx(gX(R-TS;PxWAt=+> zLy=jO=0ayT!pUMvSPLs*EsBISh7jWfc;fEJ4&yp&5cO#?5iBQcV zWHsp%hJm8|*$h%mA-yILX}p-jYWRi>u3~Tk3)s?Ve0Og;-x;Cwo8u5kN}9_{IEL(Y zK*WzXA-(nxX^>?#+-(P0`7|Ay8n*K8Uc3U|BDz*ydbth;bUAkrYqYSuhpQ^Qu?-HTU<&x2m5O#>v&#en_#s2DdKh?U+^ zklv9HX&At2$?_R0#<8W*7~^J0jDz%#!6A~Bv_Z&@0wTUv1?imykp@{-!>7`9jAK*7 zR$^Sd0=+#`V%!ZdU^Hse07)CffQx{LFNZ>U=R>4n0IM0s0b3f4F)s4<#W+N=k~Rq0 zaX_r}sv*70AkrYqYL>Uz)UcHp7q1Za_IT8$0g^U|0apOA(z_fo4eqRF$TG%7uAQuy zN!lRHrU|nvA-$;(Y0zUeLoZ-UqcO%sWUs~{x>3>wAv*(zmELub-n9^EkYzP%9fn|y+?qmqO(3-6&co50lgX!w3s5LbcTIpPO9EDoxiMhNSP5=b zqNV}pN^QS#O6-tPnM}?{7qBQ)v$5zR008GgF$5Xvu&4#_E4@u2y-gsrMHl1f%~#|v zEN+Fu$Rd^mtQ>QGz?QL+zTH^U0Cc6cUpZx--x8I{l{2)B4%(Wm><6 zPhOXj_k6>AFu9#7(b&w$z$g#jzF7~0wbe!h1txV1$gFfW8Z!)zwJ{@oE) zjlq~887%{@bTAw`xd|8^0qG5f&~7~!)dChIE8dlxUA!?mzp(4v{U0kVN$%ep-}SBM zV8>Wf-Y2WGse7#<+15SSu>)>E zbj|aJ!JQnR^Wk_5a;RoJ$QOo#e1RTh>KNqV0LMlh(mN7D23baaA^WaAns43lClRoSfca}s#!;8l zj8nFwo&Y4DV=*1n`lKm+4gENqaW4pP4Wz0&&$ z()$rYFC-5~0~T;$$Q(hW`f*TKv#$!+q^^Sul;CM1ZurW!$c_t$WaE%eY-< zTlb(2u4`cy{j?h#fGH5F83)(h(HbCK#mC4{hqM0xc%}Cnr1vXC7+g65VQ?ME;L4-) zE0*C`g927Fnhvh(P)Kr;W*%Jk56M+%a@0X?vniOK9U$gbtYvWBz@W4#bUi2bLp?hf zZA5VWWzer+YA;refMB#1VT1t5ihmJYlYb+)CV!P5DX>d_dmN$}lA4~&*)EIVS}9h* zj&^_zc7RZJR9C@{w$Qyc6s;**QM9CJ0Z}8&)^3@`3@z)bZRxMwqQdMS2(vZZ5`|f! zBrC>NVSL9{^$plR;*UJS#*?HmjI{$&AUd(uL8MtO;-M)Joq+2g(pxU#VJQ%usOund z5M0E=Qy}7k!k%XiBFEN69GC)ei+T|`Wn9ETK=eD}0OzfwW~OC3Z>s<)r-#h}8x%sQ zdHY9tr-x38jilM19)^Ghrrr_41{vyDOgjU;(%TWz>kOeo!B89xSiq&NPY+YNbe-F$ z8hd`cjS;X(T?aeHn(_=#XH)keLcHBA&j59{bq_jic?PJnt$WaE%WZv~ZQX-TTW;&? zZ0jD>r==peljCzF9FM6Nsu`b_jz(*M93^9m40R0ht^mhVCP;4=i14(;kq=Kx<9S-* zQI03V)<1&+Rx_GDEfu4X-L`%j)uW|mV-2~k}v<86VUHC0o8CobOIs_ z{*5Y6KsQ&({*(V7bu_K-;UL}OxY9ZC)Ige4MW{*Q$$cHHTOBOtlv4w1aut63Rz6v< z${Z}$Lg!>t18X#1?+GpJ=^)K^eC3>E9HepW3ajzYLClYsdZj>X8=r$I(0T(6gHVp7 z=ynWJ7+3GkpIwFAZQ|P7stz%Sn(k8Pp@O;(wZNfU2{^e5|6^16w~u4T9A~VY6J^|v zfLt%npHhWO=P5E=6)E6$s?RMo;r0WZKO3EJO-gE3QMPMxe?ZDf_gcUPb0E~3yoYOY zI&|+EimNH6QCvlFCB;;VDHM|_uArDiaXCejVj@JEi(2>XF6t`BhwhY@I~mcUCQP)b z0}{ZD*Ry`G1D0Z4J76@4s~TwG(muk0OR=;aIJ$`w&&<9d4xDSMv$`EPy52H%r~{T_ zfjeLvOe}K!^UPr>z?}8%fN^?QU`IM&DHd5AEQ|%oirG~Gryk=0{D*LWfN@l=z}#d3 zm=ik&d~~kB+<^g@%O(aqJXc_D&u*;>xF};&>6jG2PUNZ6$6WF;#>eIgtbELX5(6HQ zE3oo0!&MCUxLkpij~NVOK0Y46{v9Y~IF{4|&}_r;34oMvd>vqeJ0Vm!z6#+ujay`Q zDK?VUat)N`{n;M4Pm1-_9f|Bfsbk;vH%T>{N>cZ62l^z>5r3gj??Acl;sUK!cbymD z^m%X9{mu?lBOub>haD&Zk`)1Wpw$I7oA1kJC%UiL z1B=$vqUMoBPtl@(v_+{+(M>~BuoD#vLf$>KGpyZc4QE6rE2Nn{_G-OS zAUV6ydXRbp2?N^)Nzo?gFpQ>i^9z43kgPsWR@fDq?t%)>a;vmZwxSEM_tK3EtYh5r z+Q(Y(*z;_+NcL=tWH|S;q1#x^xy!YiZ($vCq1)FAy}u3JVV61ig|iFzo_cG28an_L zFzT(ua$KCteI~yp)V#!Il;%*Q*1QFkkV66M%QIa3n7DIk3s!^^4+I#UR;|YOMQ5@* z`}+8(M40963i&aHfF4ce7e2t*4|#|$gc8!5yybfk`tu9eIo5%sX69zQ4h|N7z#|*D z4q5|St?YT}g_|~tjilL!n_oZ!4*f~kAVVFbe4q!13901_H}7z9c89LR&CjSOBcQ^~ zyBL9GRV$ouqYFh2mWL~mU|8N|ndnGk}!@bM12{UWO4p_1; zV1t1W1cD{+(~=(0YwV3{H$gWIO+c7YoPW~}P*d=O+8jU+g^&9PldSlVA?8B~F)vl& z9sKf_#QxtMtdATlC&<*mdReeu7OX!UEN*1&fpL~b4Xo%gbzKT1XG>fU(w`2}B8QW6 z!RsO&+?y|l@UJPt#{Rvz-~1~Dq;s{H4&>hsr0co%@he6b5}z;9A^e{dNF7oknbXhu z6i9dn!@j{(laoQ(kOIlsmDYo_5lH?Z%xA7vNzMAocD4QsNZETG0N9`kLao+MxLPZr zd;3%DM^Qo1hoYRKH$^Xso)l#eX)bNukGr%tEr_38QY>x4L`yp$0WNH_x;Jy+Qmk$V zjz%TRUnX3*z*{(Q?lg54xC2K=Van*4+A;;0v&J1Ty50h7<$$GF<_;JK6N_6f@YX57 zoCWTHae7!_Z5%MyXU@`gz&PP7Gux&Bb5^$l#wl!pwMzl!EN};mi^2liJO!Au#vL#& zGYf1Bfcb+_#$_(4S(w=_^DO}>%ltsV21h`sWxhJSJewlq0rX1mbV%qi6Dpk~Y39!y&fG-k zoQ_1U_^5-iS z-SM%rGjqUbROnw#IG7l&3VHj>s7htj;& zv+t&|@O>n*@Tp_L{7O>It|X~-T=?S$W5KLNpZbTorSLvusqgb zViO=)F>x@iy$Y)b^FsGenUd_(&qr@`ucW4LxOZJPOTSF)fF1CCiggr!Q2b8u8$^vDP`i~HJ+u;+XUePtw2!PPP{T)26d+8pV$xtlfk}h=24rDP z!2?r(IZ?m?qj474K`FqT7~p`>Nfy|_4%ijWRB&Q|14ch5%l~G4`dcQ$Ar2hFo$WOz z3OH~a&sezY>%cMG*>FxAaNsyIEK~cX0CVVothkX8s^mIGsFJCJd8yA%{X=k& z5lT|iH{3gAa2Bsav=uvGNpHXgeIW=0OKzqmy`XzNDat7JrRYK7Q*@^&rPzmJZ;HJj zY6Ps>jnq7ORUKIL2xl&bbhE;J7j@Zo8xab1p<3 zFfKR?tV;^8F7c@1fN?QfU?6wX!(t>L54aa-1#ImRY=WYgnN(??mXx^R)33ncC3B~v;OwMcQ~YeUmtlsGkiPh}XzY+)OUP(>gaPORKV)Yua1D1>fY;Y9>fndoav}7!F zubSdAic2Xjp}3ghB8m$sE`X>Jp=&o)cM+P32(4`ULp#cf&@~(tMQFk#D;{NpeiR-f z3u_*(O9AFYXa|gTSzv#r0COU=14d6-V1K0mb0V|@M&Date>-4|(6-N<2WSOGh30BrCagtB8b?U)JOn?Z3s#dQ?dQcS0~2BJos ztKB>e9GZvwXQ4q0wQp3Ikga~=o~njlPrG{ zXBY@x3_K^k33NHWTQEAW#|x;1V~gY%GS4HEcoBsxeZe8{rbEC9j&TBFXSn^MkF7=Z zVy>`iSI65_{e_l~vLOT{KWvSEQyA5NF~pbvE!v& zVQaTzRj#mnH4dA1u2pN8U(OYlFUA3ualnFo1+ZrJyb2|;RC#^1)8VHL=f+UKT&pWxo);@dQ1+1Ap??Fi{S6+YLKJo#N ztWZZjgd%5Bb+-6A%kgm5$49xss_}5v$H%rEpU{q#%8pN+4%cL9hjW(rELYgt=hf%7 z9beFnmy{h}IvxJlFm`;ED{Sp{d~MtD4eeN^?D*E{@Rx?Mm<4su*N;VLP@+r_n4yJ zP=t@v>P;GVq($6;?u)&s)MPwtR3`gRW*e8u7LM5_WwHxmwrQE1nwf1@CTBNh^UEaU zGTXdNVl1--WfG>C-K0!bI9#i7ZllE zp8Nqwx%Qg{*x*$Nb$Rj+FHdfT?%hIhGsR65H$tR&QKI3Ti;@lKlZNUSep6hO5XHJE zA&J;U$wmh*#YIUR4m_S5yqUQo`Pacpv1V#u$=Bbpm7}|?S@>VBuxib4C@k2#R&hsW z%vP-#4zmT@2(bQYlyRC#Y9>au)2uNdWtzphC!7X$CfsI@pHj>aqF57-Bx0AXEyNhk;Jkn|IUD8LwPW`Wpki+K8B_fq{sNi< zrA9doW_juRVSNOXKz9=&g+~&CCwD_yNvDVjt&u^}2FXcXTJw$#9fS`j9np1e#V1E} zO;)Tu;-+N9r$;Ot*Stxa>Q9Ri(cVH0T+>e&EdTqqZJqo}KO`UAte{!aidOQ(bH(7U z(W1k5w56haN4uRub8RmDNMX?l1}mJ%_#XL~fWwTGUoRhX2q2}tKyL0p8h3rHAX#7_ z!$~ZVoI^IG)ECGt04ZPl7LQ9b-4aC^gdt~E=z%wn+qV+Z@nP)o9tdHuww7bav_~fK z39W##jYA;CO@KH7nSSAQqjIEv&1u_QVO6kElUKuT2U!1IMZE*<_*5y|I~}ID36QQG zJLC#myB!^Kg;haQ%{A?w!dzk1_D;=p4ciH@#_OG-BtE0pP0@}h!u~~%3nyU_Cmr`M zQj_zfahXgxW}B4BsBv?_rU_{%%V8&|{_6xs)R)x6>1?C^&VZDt{}5n<&mmOQ|ASHg zLFnEC6!%lyM{zI3Jrs9Cq#5-!uoLzFhu-b=og(TJ#fthQ5sUh}i81h7H-(!QkgXN` ze}HNQe_DlL)Uou(upAr0K%+{KFN}^fcaC%ytb}T*Ln}Qdh~H~O{4*bxVGpBDKtJgt z4r0gd=E$Z_n^Hkb$nk{q3nPuS`)IREk->rPNKWc9i02&+5ni<9dFM}a-uX+NcmCpe z=WEo!dFO`kyyFX$1TM#Qr9YE4&O7v|v|=rO_QXB!NJWY0JrtUDj&b)d3X25>%Q{JL zqS+@2sV|WGI*`WSYePtwUnW(M>4{7cE0`|A1uW+w&T7*ID)&;r*yp>>|22dbC>ovL z4h;_(v}r;P4B7;(d!x1d^9rFMOv_ose_kPDC+oKlitOp0Vpr`8wI1$JzE+ z1F|5rpBzJGe`FHB(E=!y4uKSRCF2BSR)nWBH9k559*`@nIt{4#pa;UL?ND%$aK8ru(hv`;ea*k;}|H3zv*>TbS#Rn z-P3W4LAr=RncF?7$%WFiOhPiV&B`RIF`Hi|OO4s)WwN%I-K0#WC$pQD$p~|6$ZitS ziJV$SK=r>M5o`@5HJiC?w}!_7QnrSV0XFytLTwGF48hj$QRvyq zStzncBgIxFJ{rd7W~*|x1DE1)PaIChG2D148}zyAoLpg5KvF)`u%iI$uZO$1m?SmR zKikDL8j!M><^wipf}v82X-Rr7@HFM%f{movzrb@$YnjYPBavB79n&uWdhofBx@`zv z;F-@Az5u!`Y0UoNs3+4weSYBaAtyGTHDvaX_^Y5A0W15qA$!q7*f1TA&K0(H z$BoGqR_(R8sI2ig7qDhL&V!QpUb*Ldr^96pri021h zrASTAghpj@c3`$~nFLs7o0LiDW439TEOTa?mB|8RHor_J8?(*JWOgxIP$mP!YZrE& zkgjE~ITfn^73pDvBdIxuXS*Y~5|FapS`64=Eri+;yvZHGi_pCnD4wTS1d--uKqEPu zfostnZPeE;+%4C$86b*v_9ltgX5cypF2!ab4hJ4{hVauk;ZERs2P?&Sy#|(kTuygc z0e?oWuxd4MC@k2Sfc1Yx8K;7zX7I9|3O4{!rou~r4Ss`AQ{in+g_Y2~6%@-UmQgIF zSOSseq|lhoq?qlvD8(oe#hMf(!7(%gdAr!bS%%L$$U*Z+dp%UlKYc|=o1knOY=@-klcktJ-VhN>VI^-4mF}j*K_OSS-OFIuuUiZBDSJ6 zyh3#!AxK5JG`(A))v#@&!lJPTD~yG5f1hItCzwaqQePnN0i;~*iW4LP-HW0O)~_>E zdNj;t{yrfc_j!-MK?t6`UydR305XYxX$6!A9RewKt#JY}C&KGvPGW00Jp@?)FV)Ax z?C?LO%yT+Sv1?7Y!$)$3RbfGmp1z8BG*?)4l2j{0!#)OB?wFDU?OOdEY zr*u^Pk4~GSv*^+3vO4W3-Hfad_h?=bThZFu?(#`R2~x`ynvQ$M_7)0@1qREy%f~Ud zU$oN6W;$mxOfO^F5k_Fg&|Tjv@0hGKrS70?I26 zffQGVaRM@D!nnstZpFP<0qf_hK322CR!Vuz=`h9BVY(f@o-3@1dusG_fO;cWSQYow z?9s4q0@k?aEhvfB$~|w}N8aI)HtNW`Q0%Fa;_9$Y$2k_hmn*DtoMYkpwjCePj<&SJ z82urN5ZUz<;lwTCL}g@`nl!a(nM_k=o0Z7~Vm7}_oW*SOGVu=MJpmH}CkyK%sD5L1 ziFhxmiO|```;P%B@%~-R^`ITFRlI+n@%|kYdT&#_Me!!Z8xU!RdJX4<`mfL@4b|5* zDMCF_qEL^9bB6GlOn4#kweTleUO;+QoNrG@MRA_CNSxoAFAE21??7O@pM*A}g%qJ-A(6`GFL#)54X77GlPwM*rQ z+0k0+3*--glxQtZkV*9;itN!y5v}8+VSH|)^-m65iu)vSI2p$<_Hx2mvG?a(VbzLO zuF)~;mt0|0C{#nEVb=oI-<+d_g(|68TG=ktUjZo#^*uNy*bdlgp+1O(n#T7jIw&@h zX8)+?x;C;#rX!KXLmjhvcc2GH38@eHh~#rdkFL-qQeaVCi+VE4)T5p+aQp0oA#V?g zKkCs42pAvYc?JRa|6sd*Gb#Dbpl-`1CEu3+`NvNEqj8Y#mDKbN_kNho!=CHK4p>qO z*kCvWfndp3v}7OX-rf{@QS3>v2SqoC8o{u3+caiqTUTSut=co{1}VR{TEjE4FyxUB zVUiVJ^O4Wja1jYupGcjR0?c{frybY)%R==W`Se7^j8>b_c-xV^GGaDXE!E*-p(n0VylLCt!nPA=K1d!>L&Y z-P@O<2Zc}39U{$Hso~sNc|SVEvV8!_Nrjz&7Z5pF@h#s^7&lbEpD=!C_B*sWp&S^&Fr|`A|&gS9M#Q#GB^!u<>LuMW_ ziIY&s(nmC;Y0vQc%n*(AM*(lr=&l|`ZT|$-^fBU`OvMz+ZFu`AZ11G2iV{g2(_ZGABq)S0p06EQBKjDq8CJ(D_X<3 zEBZxridnoEiMj_%(E9Jeo`xD&(dy?zOG1RDLqf~}V%|VY)=x7)ao$(~igV9e1#hMRa{^Qx zEL!sRKYw^D1*8+8;*bGdLQ5qhkqT!SaY#j^*?_r=pB;OHvbQvW;8s15)DFA%G3WK&ZGilX2@{ z=-xpT2T~kBQAx2sM4G`%W4giXbM%ZU{RI+rBbA`_-$*?VH4wbiZ&1Dr5xycq7`(`> z{@`_fh@gVk*JxUF0g7V5>l>6Jc(E!MTa69PMK}QF-%2%PzC$KajY5{L(U7J+gV(Y; zg3kA-?O&*x{y?0uO8K!?oRxLp{AA<&Oq_8F=NBsDm9o~Z_A8G};1R>%HxwbpX+m^F z5v^s6lbYg>GO?A}W@SQ`+59r;k=f>D(jOxq0TTizk?(f`UJSq@jwI{4k&lB>TjcwL zEibWKhFAYQ6NE9du9oZ2l0BsvGdW$Yn8_(`t-wE1fH^VK0plXF!2U`B=0r;ejBb=@ z$xI#5Qn5GD^6wNqI?>YUk?xlsnW>{kWuocvpA0!{lLn#JO^rz@Y(HA1kV5%|QVA`y$ z1fP5)>OLny>%Y%=Icgx7s&~(uhX@5k2!koP)gMeJg$OE`Zi1#oSD+{sOgBX-f+?$V z71ju*Q*Z!*Vl%0RObcWZSEG=nEj6TR&tST`jv&|ywf)JeX=~zKL&X%eK@p;xu0du+ z?4Hq0YLZ|rX}fB6_a2;6>wW3tsKm@=Cj<8@%djxj9;95WF}& ztl-5dX3h95Qh+(Z%K_u0wZOJa0p5=Z29+|15 zM`fbvaqAR4I>F27kxSijSo;)UPVjQT7(6VnZ2;ycQO4jUsR=jP2Cr=aDZy(XV1wxp zDtLXA-reYH6&p#jzZ-oFXkhIfEo_jXj`)#(4M^<*F}LF8p}2?p5F=_c=n^O*CA0B#Q0?S<xRxH%mNyssqRG z{MziCAmYH$ZCJ_r=HO}K<3M*3-h3=U9n6l?N?w@e1aUx2*`{)D^ zY!W9j60m-;>f3LBn|0?t0mp`&tz<;fZ!P~yzCU`GSixMvKM z#BRzx=Qe3WX_-tbW}B6X3z^L?6Q6NE$!-$TiR>pQLiKkg5u9cu zH7AB_PcunC$~k;Xzy^ClsME|6o@Tay?rl!dj-o9^8;aHxtsv4o*JxnpTr&;5(`0?6 zo#Ny`6zg0=60wuR)ec;WlY;|CW38Zbjd+Ia@&ejyy;QOMTJ9%P$t$<^MuR{jO^+?nWd3v?}8}j?0Ms!1dMx8uM%g6^?2+}WND_T?A zOVLtM-VK?l&}!J$Q(@6qgB6Acc`2F`1Wv$CIQ*WM)ECGb04cAVhnvjMv!RA8s_aZnVrKBddWg98) z2BbvF?ExF~fl!fh86#x}=-ze|+fr;p(Vk*!imf2hjFcMKiInruyS-vkL`tGqk&+~0 zk@67-E=8nt;ApHh>mL=*$f^ivvlS^1hH6DhItUFrmL3$A;}jTZZt6AbL-dh+=SbKl zA;%MfE0OdG=^QiQNo0^LK%$-w(ChU-9oQc=qNf8vopzM=B`ZWynpebDw6?Yv_oSkP zy{8nKj-lZpNeitKrjB9b}-sYlC1(uG1g z?)e@Ef)G6WtQ4hJaZMW@3Q zJMeTnT%0Scill1vbjVwhE3As7YW8T@rGPc=Sq3F>sB+J8`^X9&IZPc{3B{f&DR$s> zI?l21rCec^;~WcD*>=24I}WEE#^_g2gmZFE#4|!U9ABFmU*+ZyDpH-{-Wgp=RZu!ua z&iyitfb-W1+z%o^vf^XhFROeH_sc3*%3U0G={HATbgrbPXE=97HuuZsi50NpbJ|f5 z+3_ju_zZ>Krxc%1d`$5X#fK0z&djx2rZGdy@U@Q6mIc}^*8Q>?ZlT{~Q!C7p6`%2b z*=O(%NyP4#1rFTjj+dSLWh7<6(VS%YD&8+!C7ymt+!E;W@D|r*XoMO6v>Zd`8DtVI zI2=$GIt0FS2sn4x;snIbFrd@NRzQC?S6CG$IDQuFbGgE*_{s@l!7c)3Bthie+9!=<^x);=D~a)njn!L@3Q$8x}$@mK*R(OS7@ zrPJY$4db4d><(A4!#1kJmz@rOX_yXQ$rZNt@pv^?*xJWqHDJwnyapxFR=MYOr^DYG z#yxN33R}B--pm!YcK5smSmU0zp(NVTJ*Ma#6k+qC0}O+75rZ-}FH)0nv{9LaWM&(e zN%Ntpx&W}BADB4D;znM_Y+3(90DxTRq?3F$<(H19(7Hz5(6btN_D$!yQM?*US_ zG~Z&q2Acz0?H>N%S@#16X1I70gYbd^hNOP`fOlPkB zE1XnvPnly1Czv}SQePm~0aEUSh!Z5b{fVLs!h$nYdNjZe$>01_go5#l|W40>VsM(`o8v)k1r!ka7XS&A}H9-+hwc3Fk)*=ogPqk8$ zo^ME*O~!R;@Ucld9Wj})#>wZ#1Od8^x~_Ybkz#NHeZ!Oee0jM921GNfFnGV#PI*h{d&5Vu#G(fHbYRR!oOQag8=f zT-!A)$JQm#a4N3Jk%Y99xYkC%F&=G^LDCM1y2DFH)PIM!2;D??csH+;XK4xfAg+;q z5nIuk+V1d5MF~P%C^Q|{jBTF6Vu8W3?(lLWn?Evd{QGIk^ zhr20dd#A$`S6JzGxI?b6Dz2%~(*dYsuCOYusoA4p3ju4~(+NtVE8Sy?I->}2O*@do zTEt;wT$7sgeA6-+L}r_niF+B>*fb#xWrFPp)!&KWh-;FXNR(|{+X;{o*EV3xgWZ9x z;@UrqYwJj*8+LZIO7kH_H=pRHBwA5b*Z@kU_E=67`}rZLR-B>pcO6sHI-C?pi0C(o*({ zs6~=RY(>tsMJ=f)A!c`lrlXdzpu56ifx)tNV;nI%YDs;8>;_1QTH*wmRC}Pv9*q=H zD?S>==O$|H>A|D`6;_1=H8dJ_AHe$EI7(Qk zlA5KJ?LsXDq%72pa7^F>TP@VLuu#)@B+)~$ku>{95_7kfHF75sSv=G+tA7J}u<5lV zwSkW$rVK;$_!Wf`DX^&SLOq#f>XF3MVJ9|TKXjw>NJ1kZU~IrGcLF3Ut{m2NZvLK= zhILEk@3~QKm9tZSGxSFHN^1IsdpBhBP~vW}1D5!4-x9cdLRXs^UiI(SPwc_{Jp+CVVw8#U98%EV*ii>$yX_CNarnm7ZN|- z)$99V2kF+TI8yugTTw1j`Q$3ziJDx+0hs4tJy96P>W~6!G}l$TrcJwWfoZet-@HDO zYX^-|bns}d9W+kS!DG30&?H3%^PLXd$yQST7>L(D{qMh@mqlMlcsvDU*EAsyh#;Q; zq~B77JxNWV$~Nph2}n7s)M=VVoq{y#w5Yod!uU&|H83yWLczaI zDeT@B47oF6flw)7F+QvVc?kX?pd6PC_$tRgDNX=!|A-SzbTi$@i@VYx@{I-kNtl;& z?K3(j#QKbiYxem{u6;(QiCCXeam_wo&9%?y%n|D|Dz4e*YNt~kx7JF0 zEd`i!8galFz%8)X0p_>n#KgW?QWNsCJ%PLdNI8Kt0&LI@LR|q&zzHOc%aY9%8%eXj zEID)=xh(0AL@rCHWARNQsq2N*jA6Jexr1l5%c1Mbk^!j4wW8mYx)VF;>xa$6w%dNI zT_fOpHDg%cfB?ygyKq^OoQ=~%a;9vg*`+@Nhv-~MP0w)djA2>)vhXmm0(MLRY%mjo zK(OO(+A$frcLhX^vu^EH==Px%T{Z72?E-aSa!+k8ka$9;2#aLJy}U5F7rtQs$?_X{ zmb_8iFxY|Psl)cDb8SLW794G|P8~p!2Q+sg@9PEAHn&FW^A`hc5MmeFXLF2^(Ov?i==iGhsCX zhWdUC5&`hxHcr^bIbk1=kz$vAEA&O@N@{wBbMMb)!agQez>X%gqjhA*Gqj^IbgvOa zjR{-36}o+B1tx6B`$_ErHDMRl=7MO#5+zyjEGO)<@CEx%mOsP^`;fR{fdj`0YkSn0 zunrt;vLLrBU`wO5jFDZ1Lv*904MO&HAXa*-A-z{2(jd!f);wTS z!?r!=LA*kI9=w6tG(gg<4CsEB#JHcE$!Yl~Byw7&j?>x0b7{^)kluq74?xICEMN}t zKVUIa)Kd2{0T9) zVlnp#ukrl)HFUjCxEJ;8eZuQFNxnF2iL+182spzo#<`II$%;3I;U@sE48umX9BrD$L#^G%^hy7zr^)2AX9I$sB2Rqva2aIMV%a?H% zvP_&j-+^$PGDY}o_AK`#hp%eSqbQ*$hN!W6YqwLQhj!u# znlkKG?ImmZ*6>oadRl>JGhH1tcf@)1(>sZ9WWYaf!&q@%vrn+7@cH+&33@} zJl;0bS-cJy{TzE~`gRA7amt2smahZH@r=c(ISw4-lnv)RLv!FbGb~f@NCDq#ziElne^E&qPYN-IJGB$gK`M9h(1a$PW4fIB+VsG zO)ii)H3^BtDe73;qe$xtq4hoE)H<&1bD--ubp`6#aq3UZr8UETaN?9k!210j3y%QF zioY1AN`7OUD)~X;6g%}N;~-rusp%Uo{yw`nHAO6eEtdf}m;ym4*zyl;xfHs03B|<} z7g1bDaRJ5o6z5T#OEHFGG(?TCRlC``v(RjWEoJ8o+G$qUs^PRKY!N0|v7TXTJ-kO2 z*1Wti1(*}I95C8tf!&k>%n4f#7~N%o-JAl<30n>r-EM*1;(##*+CFoFmIKB?i^afO z9k^KzoD;O-a56OEJ4u{17Ry<=!m4+YI3q3C+ZsoX@d{J==j}#J1rI zwQ0OQiLQ(Avl-H|a=3xs}j$#GZwvGK*!p+x4IwIBP*l`V33 zhuDB17D^C8QIHTq2$7J)6vciOMXZR}8(_im^jV%QJ`48Vu=j#u@2DV_?|;thoIATa zvkC9LPk!dkozwnv&Y7~avv>Ra#UnNuE&K>Xaxs63ZMgW)|7^rQk6VJaybi_9AL9?H zLR-$Ew!DV#17D>-tLV=w^yg*z^Ai1ek^a0uf1bym$T)3ptTv$^L&Q${rt3L_gYZ$VjToDM0Yb{Wd9XhB(MoDL}?PZ`RtY(ZIQoDL}? z-y6!V3Mr#;+VojyoDM0YpasV1t3&E&8KtnHYpB_zCK$Tk@xLqyM~HUJIo>^1T7Y&8zXp z@0O>aTeiHNSNN%qhd=+LkuMi#v4=2(=7#{`G5lFkv}g)Oh8qY%ac3F`cP{n@6??lB zd%G5UyA^x87khgYdwUjpdlh>H#opjzudvwLyV%>O*xR?*+YbtPFuWCaGKMTDnx8|b z!-q`3pG?0dI}3_#oPu5b`8jm7dw$NSk!+o6iLU^Qfwd6DUE_r~l#4B##vsE!8HP@M zeTKrvp_c;0pVArxXwejN1Fhw|G2|DV8$5)XKN92SDk#?O7?t;Dn+F#ZJ)N6KFUn0M zM&%{4@%6o36X{Vs@s%*w0oi8H;!2XFW7#Wnn#tsXqHp?ARS#6X&n0>VP5sahS;>N00tE z|*o~ za`J+r#hA8>ZkeLr`1QvW^~SG1;9ph>m%UX&dHq%iWxq#Gr5Ave=Di1bs_N=*aZb#?7z6 zd8_B(@ec!xLn<@7hNKF{kyJj*5|-l%S96=P@|i$qXiv!d6jjdk#EE&If!s_ydQu{5 zZ%l);7UKdJf6(31Y4{zDGTCTG@dx;V2@Kw(s+AyKhuIit6A7)w`T~!w7nCq|7A5TI zQ`iOyr^XwbNOH9Lt<0HrZxS<+KBKszC_QOb)^8IxO#EZwbtS63x@UTls zhYJ`vt&@|yP)5s7gFHS?#|IN{MPZ0ujfWO_YY;MY%FId}f(yW(M+B0lIIf+5(x(&1 zz^D93%^4<#dJB~WFa?O$J6Zak?m|;eJ=w=A2u(lJq?3bx;VX!A0>iZCp;JTrizYDd^=V}h?xv1txLpf#nWcqoGHQ+j9 z#Zz!tq(i7HpGb!wSLzNinL7lFa)(&NHUNtT(@^g-jUE2qb_he+#&rlK80ioUh&{I$ z$OBGNZU}UUj0-sD>AFxl#08Lt1D4=}iE$m`OG}5i5Q2F`AZcrdxX9$NbcjscDBqLP zAucxMG93cQ)$4&TG3kyDaVdEIHwjOHuq3?il5oOLk%Yet2qfXTn!|QEsyX2~B{|`* zLKPx$wSrvm6)ihy>WExcJuyXf$|o=h=Y0bXq|{@)#6*d&QXk=^{Ud?8#`Ipe1&Fck z8@x`PhVYFTzG2{-$<&#2HA+93d@OZnl7{ zxdqptI`0SIV)s&JQ{HBFE*|Mav(qDeXyU$>cz+^ZYDkn9cP+rXJcoF%W6$KR(~LYT z75;{=iTq#auaLYwV02_YlbVSiUju!byP7}G|4O1ze?6;5VFh7YkJ^9;IpwNdFto4f zt5s4+`RPs6uIr7F`=j23_M_f}_6BI7_VAjJC&^~gNo1;~OY1)m&<%bochHKVSLCWW zjndG;OC9<25tw8?>e@PhY@+-7n%c{DuV-WZR8y8Q+lh9s_SLl`o=gyA&8Fn@%J zfr3bp3S+p5yh#8ZO`_b8<`3=CHLIh}jhji5)CMFoKths9l2n=U4@ly7J2)xwIli2j zv^uZc=UeB{@RYwke+okbg+dPq|9$7DgrK?M|Jk~u1KMAzS=jxIywBT-3=lum-c?3@Pq|7k$VkvdT7fY%2 z_YiLa8UtOLc3T|#is^ev!fTC0Kqa*)tP*ps|2B8hnRM%pquy`H+ZPTki^!?Vt#(E0y7*gA$U3dLiv&NI%F zDB$}Cs)b#64j7^@nA1OWNMKM+=v!Ec#=M=-T)$D-OkRsS#EG@Ij|D9sLW{|P>r?qk zol#w`cA^!&UgduTk;-%$TZerv!Qf|I5P#%v9ZtvAq3ENo`v!US3%=vwKCa9JCw-2h zzC#dJDF~l3ggQXj$_e33AHt*ngzFp-ZdCQ}l9AVyk{e`2*lxz8*Rc8lQ2&Ng{k^{Wy#nfQSL$D+J&?Oy>OY72jE7e$5hLf*k4LMX z)>Q3D@*x}; zfbhI(;m@S(38m~iRyG96zH%yi#8);npzJ-REYhAYRQ*~qa^}QLy1cCFefRPR`#l@q z2gcVpjX&%g-#=jdQ-|@79QCgSj5~Tg-6*R}7XZ#jPB;(xaP|$r`9`V#h1&dY<=CI0 zj87WS?X^VuH`*!H!xXp{Pmy&kzJ1e|{qY;g?5t->y*Is%Y6pdD*Hi5-s1-dlz0z9o zt^R}7EL?C??ygTRT(B&cd4|(0`#U6X%Vf`hrouh&74N5{ze4hN8JN^e{LmaQLvxtk zJl&l{p?(9aN8t}bwijvxBIYiGuM&XWy9|FSwEI90uN%~!$lhcue=z;c(xeFuIH zSX-oRGde8t3Gb0$^PM)1Ne@*~3uqm^{(wO%hOawdH~NDuvr;n7*RCG(14mZNf_!^$ z`+_nNZUdQ(O0|;B3TKdXKI?$hY;C?R3NF+tk=OMyIFP!Z^cFAS+ef`ejV#$LpS724 z3eB_>D%qqYr*JwOl z;Lf+%v6PH=VVeoRC&S53RH{=KoT&+PnPdin(m_d5DJ)5Kh9vjP_CB^D8;y-F1H%?t zhmF>$VM!ad4(z}@f~MV~;Ik)#RXqpKq$mh;28l3ds(Kcb6LUU`aFTX}sY3312r&~m z#9hccL&g3L*%#!9x(s6Uw=USW7}{l|@MiT5@McU~cyknQw3!y(c0pd7UZmjWfL)oU zEtsj!(f%)g-|R2iQl};&#lH-mQA%$?%^v|;-n7n=XUN?zdQXC6i!L91rU6*1!e{D;Q+g`^q_H5M z$AXf!2*TD>m93I0pU2{oHmKeP)jSc(*g`n18>AgUpxLbli4gjLh;=hsi)>5AvkH0c z%jao~FKubaBI4-Ac zg|9JTPamO^B^M=r$X+kDCxrsK!)l(t| z1zd{I<8W*Q4sjh6!0(o^EskApZXexE=HoWj_L;|RGFJWT-;BR9q|hZWT&)k}WO)1w z;oyNB(>+0kf?09ySr+G>pdz>jM}Oko!?xHxbir&K5wg0+JR+27pMPy`bI*DR`VQ3e)(*Im)VHX%y+>ETal^0KTwmr^I`(wc zl!DnY&CR-U%GZ-)xDVh!TW$va1 zUooYiDyG4y%j4o3RD|YU(Nc5S7B{yqHCG+^v^Li~@|kI_?7iqwIYWA0g33tY|z6H&2 z#~o8+-O(nWjbpaw2In(&c1}L!jXLFQ%^UNSbH)|2L1)RE;Et6wZ~T3$;DKnNw9`80Wd5A~*_1ujBKEZLw?mlWWuwZL4d{Bib3)$Tk{U9(U&5Y_2b(Pc_bsX|Da4 zVZ?mk_G^5D*%~)^M{2M-du?s7dGQERr#*nduC4UV46_P)OFsYgN17k>_Y0o5PNYpe4Pw=1J`Ix5=5NQ^ve4g=J#!)qt)Box>nCL7{B7Ale+i^t zkfES1CIBt<&7dlHJpKqUR`zU-eY`VyMLnQn^-ACYot*%Zt{Bs@PmHc7kLw6kc8jf4 z*)!gVfy|fD1KCmkg|mXHTH`FX#?GQUF#dBi^3fKFx|=WWttc|-w8aym4>##_7vW5L4s-p49@tD=&qwPIFga*5>uP>dllC4% zx<;6sv`^(9)2EF|bxi+2lOtC&;N?#0bTQre6Yum9x>{2s#)lC7c(?)4`*{-W_x(JH zl4T_7@j-X(@=jo~Iz0MEX*0!fLD4cgUw8)p82cHyBr)1#RsI#js%fCjnPDB_}{Ij|e&?BPlS^x%|D#LSs&XW9g!`F=AfRKu^GCjKsOJ~ z)5urb#|>~_>H)3_16-ul{+3BN{4=1IhqiJQU~eWqqItA?aA-?g@~DFF5kcqCqQg-# z-(ob&%OCUERtt;+#_T)WJF7H0}d1{xKN# zIih;*;WR>=dpKug4eW5%)S^(>h^Wvbf&97g6M8*#0Q*t+;7pFB5?a);g_yIM3IL#W>9 zu5PVn;T|V$pJwGVofV~75n6T%3i!B6eO%4ed8;3!bq76&l{1LCMA3rjKXp6n7n16As83)8T*TK^Ogs{L(P0vGk-dYr*QEUDry1hJp2&A5Db&er$d@( zuy%1S?s5(51;fL7Nj)rKRs;16qT;bHh|{xQOChJcxfG3wc(YADGw^xnW!&1zLD`g( zj_6>7$~>O7)*o6MDJM+j%bganuNw>47 ztA`RdgM%@g4(nCfZkm(%EHGm+)hWFxahokiqv;u$YoyW3xlM@ZH7HmI=HzM9!_QJ` zgg|}z^tc5x^j>T6DypwTbxC$fn|y}C?!5t3pxlIyyt4q1;!D%p*FE#D#aERoSjb$A z_t$8;nl>{#0Yab=(Vv}hUXvDRLdvY|)RZX%8UfWpEkvMjJ%`jA`s{R2@HeB3218Q@ z4Y=8C04?s&fa_ch$PLL080x2v2GGQ8+7uZYcNIac6NNzItfK+Di;OHF{$Vzt0CY6q zdRGJX3CWAiAs__TM?xCzk~v5Se8@KA=20Lx8ZcI5qye|00l4Kiz-w(s{mJjB_2G`n z;Z>)p{{MR?r7@0)V5^(b8~OhHbo%=PKfU_HH2r|v3J}$Z^-pdmQtmbs{y#eJ?a&(@ z5@GHRRCDKLDBOAP{C`4lH}vvccMl3MeJ?)pE`SI0=%Dg_h+Zb&XVPhOh&%w@Y;w>r zp)|;~%l#%jGghR{2buqE@`Q&CpnL#y|1oBB*r(CVc6}3gjM)^R(L>IGW-fH7{gfE` zF=kp=KM0c?iHE3w=l;`=punzs6a{==r9NKe>X>HJ3Jq7=l zbM{5hW}CBhJ=$oUvu}W$YT9dPOgKR?sW1b3<8^LrS||!|;E=BOU3G`m#=Qx5tnH-c??-R!h9OD<5<7bnD zHyHUx`6Of4nsoAeD5HM?y>jyIt@YknzW2@wdyiJ6{&PXxBzW&__TJmdd%waCdv84o z?7iPnfcG}wBkH}--pZ90@BIP6JR)fCh5GoPCY^kDCHZb4`)(oo?k|&r`d(zS<8PCL z`dG+D0(W8s1NDb%$Od1`ESq2<5DY7UtS=+krHpSWz3J2cLpko*?GT~}=A_BnhcN|^ zygYr-8QEt~*p>c}?iBbdOLl2(1}yY5U|~1|==#EcVv6k{11{kVxI|?@7VK~aWD`KT z^I>j607wq%X^QuZO%7CVLUPG`-t*Y_eVTTVhLX+j!C6P&u}||xW}l`#YVvLY9QQs= z2Nr53Cfh#Et*BSpJA$$BAM_QQDqPJi?i`h;!06qXe=2#`*+t6J&r+GmV<>@VBBwz@BfsOnMQ$kDIOIw&f}8;{@@`S&G$Z@xTMO=tMV_)8U=29VPzBua z2UsnFz`dON$a24rFdW9cMHDxUg#O{wf`7&1wwyiEuHsV#!Qy_9h;^>H&C#@#)Nn=aV=6OjdX$K$pf zc?_60Q~`JVkw=Rla9_r_FY|FT9LBv>6gMr`bkDpe7PtMJO8|hO49GWPOi_YB9vo8` z5F_6@ikudb{;7?Edt;H?j%5UJ8>)ai{#b@Z5V$X4k6+?@oZ&F;ZKAkoiRPbyEVwTo zx8;yyz`UUfxZ@8wS_FanBF24@kDK8z?jFGHFCvopyqMVdWzY7|fo0Ej>;e?%JC;4K z;MXhfN4p0$dDty+rmAK;6EgsEXiEmhI{#2M44zZsKA*NU$_EX^?Vi`Vx{$|v(D)mF#dB3+) z%g{y>7h4P(%xGg}+>Tje&ls8TpHI@D*gOuG)Et;Q98`)sgdw|_O*!HR7@u;P9TSo?-q>7qql_vFxbU|RKFwD zzo_cJ;`*<+egM_Kr0SP&+AraU(sn{Umc5C?qrdK%ykJuJZWJXg{W2uHy<}4GZqzCG zDNnjBc?y2YGw(I2!#RukfhQOdg=7L)oi*d+c?&jrTV0%n_i&2*5iT zK(Eqw@(^Ucp6&yBLw(Nx`V18c(4ZJVUq%3t;sr%t5umT)0DS~L-$QQ@APNm+Ueg|W zPkqk-T7wD&Xcq>ASnrC0q#OGLd2->TW*sFY#S%V=v|E^w66%d<%`_0vbLn7IKRvs9 zn31lEUn^@SbWlc&DsA=vBR|*2uu9sNWaqQTcp1;Z=9;eZWD6j-~Y|fB^pJRbp z25l3Tp@?9G#_(XOF)X&munvsEGV-ZlZ7eKnYMQ_dRV}6_17mv(>>vPZrugfLSk0`M z7|lub;4qh(uEAx_(uaU6??>oTOOm%RG)sm67nT?_$&Lh9;aAjP^aK9f`1Ro!=zyxx z_~3p(-_Z|V&Gds})a3mJEADa#<7NGlF$j=2YKV~aSdKic-ho=Qv4=PAmJoa z`qW(i1QOHPp(UUf{^~c6KR2p*>pir~!>rA3&8gY4`FE&VQFLX0thbi+$7@*TZpjN@ z1)QlEjQZ;i_|<_pjq~M!&2#Cs>!?(Zli{T>OZz7ZH~6UdbK_AZG^)F|X#SH?{hQ8U zKb;R$cWq&!BI<&od-64^uMb4;d%j=uU0e95deBWOpn57lQTUgSia$3VRR@jgxNgmf zmHd98en53oKcG6c8>7NNb!<0U@DLq`J^B$Y>NDymS^5+tQBV1Eic&!=N(Ciy*K|J4 zUgpgU&{p7FCX{qd=h3-L)=o<*EQs)jj-;{5l2pJXjUQ`s6gM`=8%Gv;WEkCmKR3SZ zk|)*Onp52NiwXGU)b=^5?S7sR6=xl}!m=f)!cG0A@#lZ^ zqAhOXPr8Xyx;3{8HBr54EBysnFu;7NKE6^PB*y}}eSV^n4qc_X3pOqvD4d z;TOJc`z2>&VSB$>{3(cr;&oa5Htuy<+`4YMqhGvva|dqS4SkVTkMu=aU9`FG=tRMN zEO|$i>f$V*t1~@+`+`mc5z)Iq=_D5De7LXwSjoe9=Rw|?0ontg!2w;<4}ccXtGq@( zoKJ4@@IxQwfWVeYQbY>=yd{3u5ywI=+8jR_mx}~B!$15PP)*K#zb`t+?YV*afXOa7 zG^z%2%)-pr_5g~Jg&qC)@aKQgqmJ6VxpO8Uw;~{|>QN-4V`4P0U~@kvfga^x4zw0M zie=HGy7*1w&;LP>s@}Z0Yp97W_9zn2?elw-S!L}}CWG<`derT_y>WZ)$ii-Zv-ndG zp-0`&*X&UnJ0#|A-n<33Zfzd2|M$FB29RVH6n&pZDMes^8iEX6lUvZ8P=<#@2Xi=p zEQ9>?W{|5owX7lE)LQQNjfFz*X=LgWNvIfv(P(DEb*Kh#WAb?x@&Eii%gaEG1 zGXvPEb#vOLdPrQ|rFk1}-Ln+H*C>G0I)Cyf5^iqum`IqurA6X>xh$gVsePFrUvKni zpz6}eU#30OJ5kufN6w%B#bEJLm*(vl>SF};nbzhS$zXvXxwfh|a&2X9K`y}x=bD2# zoNFwLT-)An8h`!|a_!kJ%{@a+Y%$kJK)27&HM7c^YbFE5brpWz4L+g$%$3NsUVgLq zQxGB79t-5!#ts(qx-|FZ)}2oQytuUiBpECwB!C~#boNM}f*lBDIDii3Z~$2r0qo(1_j050y+%F&)=@Y1P1dbIzJF6vJ2Q_!DKh6Cte4hN8B5x{)ErTqCn2;h&M zn|BN~vBdzAfNq~3K(opkK$C$2_}zgB;OQK|(-FV{ezW*f5FvnP_xTS-d%4=f4{Z+Q z*4?@T0*Ig295HZdXLGVl$Q`6oOHR+?VY@qX{-rJXTT)4<-(AJ}i-AyK%K50XFs zi-G;Z&dq}u)e1s&3sALc6-Y8Tp0I;Xt3N5NzUf`CE5Qn^d4EbyWcGS6hug?6+8R~Y4sbf z{`kVUwo~&S+`7MdA%Lg#_7@Sj_N8k4By2Aoqc3Qo_e!sVy$A?j9h)3}E6plfD}z_e zCO0+NHxY=e1qb}{N-r8OU+JYze=#J4eox;={Apx$D_2&X^~&n=j?D$^lqKYpTYI6e zt?8&QHrLQEBQkwK(Ru70)lj+y>{&2Gd8cqNL&?hL?|aOk$@TU(2AZ2!VftGLzNk<_Fy%0X&K;GAt6{HBLOZ$D{RY!DB&eb zfmj5iM=sJX2xk(da93>LgQj+(N_QE)NWiE^8dU9=K;q3Y2>s7rHg+)+8dwl%4@lbPgCcf3N z`2aUmB56nz0Us*m1SLin6VV7C5r1wxA{j8A>eze`BjUbsnRXs>m8vcIP;dxY<^jXx z@COXDs^tO0ba+WAm6$6I+}HNkF&HkGEN6i#Hq5GAhJo^a_jp zX7Q&W8oHurNw5E48r-0#!RZ~F$8ziL?TI1bzMlS&z?HbK(37K?>Gb@=zg)MyI{1C4 z4~swli$t2(p?MtRc$d~wAGdZrMKag|koDARy3SgjQ&2*%!s{sqb2yP$7Kt?8ZyJC8 z4-)Cn4$TunO>8ldNIKzQknKp>%lW0`5oz!s3;fttZ$=@1oY z)@HDDzTaXqKNOg;fCOdfyb!u=9QzK ziI|b)W~0AI*w}g+T9R#&^pQhn>(reWvOo!R45d+@=D=6t8j9*f;S6xm(t|%YzNwPQ zxH~eFo62`waCc8Og7C>w)i(i3g#*^kxVxEEt#y0xU`y?On7N0K9HBeOg3#9*a8xq$qW{m92IER zW{}C)?+;JAjbkcLgzz#|TDcI$>0B5?P{aA$6A~IF@Lx=-|O(Sc{!V;>aNW^m|0gdoQ_tBITu0A0@X- zcwQ>&WA&N(#Q$7PpUG6)Pu2IfpYdmV&-30%CQ8TGHr1C`jITPbBC#NuNM&UuyhJ+D z3BM@ey)ER#f|Mp@GwCgmhF3H+R@Ia>R@K&6#or9_7&<)YXrFAKYM<4;ggx^OIAc8HrM_*6;k!5n_+-=6_6Rj)1Ad6G zbWA1*nmjKXHANH@1QUNV2x3vA!0$F5OC5Zy&3p zyXfc^vEDUSa(j{NL3~X!05oEJn^+a!i;8c-XN}`GHU(Sg2o$u@zT2Y>JTNRcAdm6kv@5gqD($ZPA^>Z=#oSF?k(*%fr!#SgVFsQ!o5{ahvNsI;?MDse6N%iSO zBCXW_X3(PQe>JH7Xy8k-iDx@#@XvGzC(8)!&gX^cIXBab!t_FfX`I&di!iN?FdeR$ zeiNo&-AwC+>2ok0TZh$!jCC|5c;32*@N{iqg9!ibX8Kc@{%|w3@2LIPu4CALHQHPc zVcI6bbhKvbFHHFnrjs?(05B!76x*pIEyZY3-7&&^Dl>b@fgKa&P4)E^HI1dS>dWTB zL79aQRz}FL+r{K<5iMtHlXnW!9TBEWG}B$e^sflhhnndgVcNfAqBI(?{ZKn262`mT z3hxtz_ePjjYpVl0=?D$z6pqmMnrUZYYTqeQm6&Z&S+W48D_qHY9U+Q-AxSE6pbuWnXg2*&^uQTL@=-8Z6cqOY#b$U8Nx zPOzx_+O6_CQTc6zsYExUU1yz(UgrcBnR6RTXIE5J&c<@pn12(RR<2gEMp!oM98Td| zweH`;gU{Pmq?Cv(Sml*2WIZ+;1 zi9Q4{p0}r4cCg59#UPFLcW01B#g+`xsMvx*8WjZ&Lte75bD{wk6m9$qiXj*ghluHI zpr>*MTx2BZ{!UdxqpA)RRmkGdGVEC$k3)p%pw4-vrG3U#G&a@OOqhv;klAbqh8xd2 z*sWxgDCrdrYR}FITud1u%LULt#rB;OSScGEBO`_+d&Y>NzF|XoVM9BF4fP2d8trWH z>+Bvcd8nU~biubgk&_tWCCBBtDv=bEXwi|(>x zx`e~{y=FR8n8v!9#tYLpH`6;^wYmE?Pc+OftFM?@Iy)t}i_ ze<7+rkBCb9zY?agT@!V+=Jn70K~R_2i$ z@0%FPes)X#Dw4mrnbrx@@m&)&0i3_NrG6Kw%c70Bv}>Zt+#XT^y~G}y^=>17h>+wDk164Q{!=L~dym+|^caSJ}b+={DkZ(}Tbb@LSW|(uRu4xmd>sL%o6(SQ6v< zD6;E-VRvH;QEs~ywYx=XuR-muk=o^`-6c|+=;j=SQqqW9VjA%eE3libz;3bvOS&Pn z5eQikrq}SK6_1wN3R8~=(`TA#dtutn&Gd*ct&A{zr!_q$OpiL4yyWBE5)IfdFRiL6 zopEeq1&3V?v5goSo)HZzx>2t(29&2GDt~9YUh>&)iP~9MGs`8QmwdikVs2T(98#c^ zH$nM}qWs3N@)sh?RinJ*OHt*o*p$C2%5UzLD9>zeqRXvvCg zTXI}?jjUt$kY^6<9)^nPOWB(!QWM-vlZ9!Lo2g!yj*2ji!NaHAQ<{XSp?mz2p)sQ5 zP_5)xQF2TRO6IwhoGD5cMwkxQmd+EVbHG$KqqL#1wk~lhbrl*NnSx$mosY1>Ssn3Tq`omLo#z~n;I&j0ymo$?-A)cyK}EM5>AcM zcXUrwm(8d!H}hrB`#w|E`|_o2@`LWB#dUP&tYLg(ZGBl~MPgwxk&~6^{b6@nqJ3hp zu6D70%B+=J>C~*)Dp5MLzH(GmgL!#U$9tSJK^s+DURG^x>&!tYJg*$25w!bhN~v2a zGeE+Qd_~z@qt*2~fYoC8$Qa92ZuPTc)z^#qx)}Afpg9^=58^n>lvZV z)?urLE3!az+RXvcVs{f%JMDHCyIX+G>56V3I$Y5eBqyY;K(s*G8r4on{RC28#H!(n z9pdcf+wJy`vs)l`_XL~M6?=eabp@TM7;Lv&7-#oDv3o#7wX~O%A7od4aGdfV0H)vfb`sadu~k-I)>9fksu@mCue-ezYiW1e>!_4H3&mqmHrLofl{K zbg?@>qB_v11$O0U#3{c@lwT2K^N)9_HR0u;1sjYusge6KkgSR6d6$CZ=%W~huMx}3 zVk|FptG_x{{f(l2MU49EL31?hI=AI(V=dn*mj4lB`DVBJn_|`9De7;JQGXj~j)wiy zWto>w_lWwtV$}aDR>!|ZM{|sh`#^I*yf;?;!=nDd81)at>UdmqJQ{()ol0f*BQ7PL zw-O{rc6-SuK(x$2Pomm61HC4YRz<8zKli*>;_SX|xBEt%-Ot4CYOn<(Vz}ZH5FH); zW00J#SOcQP6`!Np>55+j($5jAhAV!Gv-_*v?r(8++iauPL#b_IT#*FP>I#~-vO%=8 zw=Jrj?d>XdyF^q=dr5gWyYemKl=l(ky};&-Z_kKjW8T`qZZ|K^?rvgtmx$^>qjt9| z-y=?WxhO9SvIXX?>7WH0Eb~?=NY)s7-ZYSgHO-n;Q6D;h>K}GKLg>a`hdMs$C1-*d z4nLn-#FSSpppOKXkqrURRiHUQ&j!f>x)P-5QA;23ED+;bR3UUri{^spYEh%Ks2*Id z799ne19lxqPS~{|#=));dIUDSJzub$0zMbEG-wfQ>WJ;hqCS)dI1hP}&~gVeM|PReZOE<{WY>bv<(O+gb0Av|k^|YYSj+zq z%QwYXzR|7zhFJA?iu&7Q)ZgY-|4&hG_v@`fxB0bM%-VbZ>==eBB$48(!(0}Mw?w}i z_!@jcgvQ0iS1u(u;scUe1Vm!%CBFkP3?IL(`aPU+K8O~` zi&5=_yi6cp4YnXE!B?0g z20@D}UjZr3l`jk30{IOPEs)Y{SB*bTW77nPp~&A_BCD!t_A zAX+eefodnF^@8a)usPlMD~LhB;>KSTB9YjleHlW(sp3Sz^ z^WY}ih9Mj2nggN}bXySPKxYfx0=gZD7SQcc?F2nQK=%imGYI)0T7y7~%z<{hJH^@E zTkH;ws1|3D@_p>e_l;9NQj{MIHfN&_idgnDi|mfF+Z`Qe_i(X0Iifnys3~^kQ{$A+ z5#_Vp$~~_VM3q6745_x;of~KOM6r8ZkS(w;cr0kv1o6CiAUP0W4L)Dgr@`lp)yZ!C zC%N@|$d~J;7YuuKX zyDcxXSyuP65r%(=<(pzG-)K{>rj8qI>WRcR?(Puvx5cRcCuk0r-fFX~_8f1qS(b*~ zE0*t$v3!?X{l8+>KQ8JYjZyyyXpV-hbX$H{EQe-ee>3$Vp&MOY8vdLhdj@<)vInyG zY0wWoDpVU@2wryo zE|AtmtjfskdB4Tk-C(!-N1WZwwv#o(cHuy56Rx(pC|xhAX&h*tNUz2%%eW%>dDYs~pu%T;<#A4qCQ-fGseJ zP6sXMW?2iAf)s2HNb2`hrh()*nSdF2wpgAOW4XeuerBxt8c|;zqkax(j)ooSwpBg(gXU;hliPA*tmTu$@(D4Pk9Vs-E>`_~QGZH|`ZQ>c zhMnxP%uBR0ME&V8>Q9T+agOLXD@MnepgABej8%WWs6Q`8{kgF^E)pF}Vsu;pnginE zSoN2Q`b%QeUmUCBYSD3J1cosaUg1*Wd6$Fa7+JjJQV=b};4)M@hrxdeq+23Z8Il^& z{t;*QHoM*1a-#H!(nuj1@} zXSe%(oZY{~?jK-tx?%%}4p;mRlG7D`gJ^L@A~(hr9dh;L*bZz#tA;B!1JP->BZwBe zo#O0nCw6;)&FPA5Kn#NNr(W9M+1_q9H_q-rvAbhLwX~O%?_^iLbDZ*hMfu)fb2h3l zV%ccaes;V2$Jrevb`OcD4m4`CUHOad7qqftlL?M{ocJ4ftRMN|hG zRc%*3H%|F{QGQC0EwCm`gBENs+N3V$P6o-Em^iuxlB2I+O}J1jFNm>xx?BBevFgtg z_2KN~bh!_IPBJ~P(x60y8E#`5`Y^^0QFUn=VHW^i+84@B%D&>RiB&}EsIPFITh z%VX4E7OP{q=vW$~<7&_x5U+|=f4!)`Hb(t5u{v%R9XCc`aHmq)eS=Gh=dA$Ak=+iv%PIJ?h@-DkiSjELcir$Kad^rt{_y5e~d zEv|S0)lOHuE0ErfST$VnR-E1U>~`Oev-`E!{Ss_WS9}4Y)fF^feq*=$ZJgcT#qPR@ zYH2Si-(Xk%N1XCad+L=~0xR9ca|ncIDf|DL+`0 z9~fi{jDjOT3r11qtph-^HrMlpgA})6R3vm`V@CZbu9rLn#IUFIvGlP5dJMP>#|1!- z2F-zNlvuWJ8I2Tr1Q}-BiDJGa#{77<`EjD&ZvIfAN6dT4Ng%o$bA%w90xp+h4hPK< z&BH))_-ryrkxga!3FC6HToz+_x?6o|tok{kzA8rjY|tDHt8`nQC6?{cs1Uj(8r2}W zqERoP>%irTMlEO#m)D48JF>Y#k03*uo-F21j4^)#Xbztp50V4fabnqy>{y{kka@{8 zh%TQk5YVTA%jL8ApgEA8DwgfYP7!(p8GLr0m_H}R{Mn#6e0CN{4rFJ7Yy7 zf#k%tRBYQb;cB7Vu-z`${s}%8wp&4SWWp^VSz*)q;|>sA5xZL~|0~Awoo@B;?ERtx zFMM;NzZWzI`g`2!z2v_^bfJG(EI$}y`2n|jpnpuAcW{oZZ!SyPw9{-5_??gU#uRbs#!I@f%2S zN%E`EBcbq;e}HIl)t{(#x~g3-eQmL6uP`dZRhxhqhbu?u7F_K?wBYK1YA3FP1lI_# zIbC@Ghz?f{2PqD6kEwG-F#g6mnZ zIbHb-h(XZe%BMkct_`08G0x9V3fv7epuMcR-8- z{kG68pg#oB0{SCVJ3;>~p#KD$GYEfx7;KRr1X}4PdRy&!sCL@z&|A-j?Z6gPEzTn4 z9qr0H#VOxTl=lFevr*ebEE|p5-flNH&h9|5yJJLkpiw*7mG2y8b-BZElbj2wkI#M(Zk|RaET=HC(Yc&hABa zyBEjVT_JX_1Dn$o*MjJ9#Wf(sO%lt69_h_q@&*tsuDTJ`PFLM4knaXt5S8JoyTq=2 z1@SMTTX5Y6q6Jqos-3u=5nNA!&FRV~K@5VHf$s^B;#~Q-&@GUk1NaWZZwz z;a?yW;oTwh-lZmf@0ULVsrMlM39<@BX&x*-}`#xmdOqmhLW=ZG~kU zuqa23t*xrTJ3;YF{Nf{=i{@XP+zw17aN^7;r@s?JlL#8H1N73n+w$NP)z;pk-_Wb3 zoL(SVW7`vi7|-trBlND`0c<3d8psjA3**FSzT0R&m(jj4M)g~E>1DcT<>BJJ$vY&> zw`#T3i{t}VDC`SH5 zkq_J7AoA<;@FuFJs+s0HIrcy^@rFa6V!oGyC=8%&U+sW4eO(H&e2P^;J5jJ{-vj|D zZk!!>Ev^EwiBGICfB9WdbP^>U;*_+HRq{-}O6uqFAPHVToqB;kX$X8OKf%4k51*Il zjn|jvCk|HcUXZ-$h2L=2!;_3^ulQPD^R>P%T3@ngeX*5V*Fmf5-M{Ahxh2DM7ti}8 zKQVOX%!(TGy%L2wWQqP-_Ail@HmJ8x{F$FHUjA%!jeWF|98r?pKT%XWx2~eTEMQJ4 zYSTY)z&uP6HFz~Zrh_S3R{xfa?8Zh?$vyhFMIxq>d-li6$?>^Yf4ohNUzfB?f8DcG z&+rnPd)^?I;{6!Cm)yO7qPTiyVj=x1H;oCK`>#>j+qbu`Z*M=}-u_~5u+3gU|ERaM zseK%#M);-<@=YD=n>s{H4Y!#pYN=@lI_!<{?Tz*A9qQW~C-z3!?2T;6Ua`a81mE5y z-`-^3-eF>Ie2mv7IxHmI@8xW%hy`zYn?4xXV`pG)<02F zR$p0RzHmZ^y~1It+Ba3>o2vCq)rqMiZKkSXS~b^U>Jpfu6&!7zT-rY|46Cmy8d%j& z(bE*v1(V=442Zb!N4VWi?2(xtKJi~cjDMS7Pb%L z*ghB3pJ~+QYcW4{p`NVad@BmRwki0kMFl^Lf*)-PerQp_I%(;zmX=P{K>rlB4RLJA z0Xhna0nwF~Xv+bc%J}R7`kGI_l@Xf^Z3Z|NM$BzBw&B7yERO9EL4A;**7=4XggelMdbWl$Ruqh}DHz?N zf{CJ_#HL_;iwdSlOAoWOv|0n5E^O1{*eZmrJdSM+*i=8Q(x}aiquDOh_{js6Z%2uO zTAPBJ78M*L3Yu&R8e3Fwg0%EFOH1oD&{Kr%zER8z6Wpt(sx$H|_ zAWF`6DOuE_l1oL&#V#cmwW!1!tVi{~3lcMoyBPQt2~4_w6(sPwbv+KHsgke3yNTH5 zgDqlR29ua<*Wq_8lvocD+uA0!6^li!^%AjMo7naaYyCtl&!KpraO`MP+}|O#n~3dV z6C32fQ!HYmf@1U7*CT`0sFHm>Q^d+_V$*}xj?-e*B35M+o9(dHAYyekv08_<<3#Kj zhvKwwoM=;gfK5j)K$Hs67#V6@KbJx5~$tTOXzXe>hZ;HqI|cpjPSiDGuS)Wqc8qBwYroNnqkW2h+lwzH zQ|+^8*J+GKRyZb6QeRbBSy6wmxdpC%s&4QYY*^RKsseJ+e}azfG2^w4rtyiQvg+y? zW#w}Ys5!c-z7{XR7XDK-{|Ul>-1x-U+FJAdx%0u~dB?U&&ncqkWbjv4l+`rV9avx6 zR9941Q(jT6kt7ym;SNw1-N(Xjr9k^hL2d)$=}bSdRn|`z>+{DahL$&09bHCm^@W=n zE9RN|n`g1oQ(L8Up(tI@D*khY|Lj)rFBbkq;}gTHs}I5rh`@`1)oq6JTBYnFQMP1! zVnkIQZ45D~(t8`r{x-M@O z|5D+uQ_8fj z4=YQI#oM;W*4H*xptsV{WQ?AZ%MwGYtMQs_qR^p%0CiGXVq#UrG2^R_3)W98!##qA z3fwoWuV^rjAgFFMp)656YgPm9c9@IV5&)^MEr)=k_l++@Z>p{sT~=3DRa0qY;)FP? zR<~_ZZKAGxhIzYC2HPWqX$qJc>&zSfYOp=rEj&Ynr-Nx$4Tk^FSX#(4bl6da#6Tk*siv)$zH_`!gig7O)iyg6}Fo#Y-03Z!gjlbO^h}R+dURG zF}hON9&8A2#NfjCfrjXPK|%7g$UYH~#lq)ti>$zVS!7?(vSwd=-XbfQ-xAr^wX6&o z!2Ft}y@L5ek$vAL`(B*v=OX)QL>BE`ZIPAselN1$*kr$sll@I(*J@eQS3g^1#aDle z>>oDS4RNwLxR6sjs%;w0a}j!YhOe_4aVDbNKNDfpry3m_coK*%qP(M3IUL%-rX2O{ zUCPDVJw*9drgGD3-3{et{gy7};?f;Nd9Ox&VuPAar!R1rre})^28x3IHU;@DD%e95 z>}pf6ON$D&yueH7*mgxZu-bW$S38?iwRu%f)jT*3Fog5%!u@<?i4OIgh$zhNBY81d@~H; z(y;I&9Fu9ju)wBjj>$2GaHCzg!50?Gk7?nP4dD~)!pHl7?N zxXhR+&-8Z+?_mhI+9LR~o`I?ZV~0aMW^*Aw0+DikfINxQ-$&GbYM2bxz^q4dHoq;bVN^D8B7+ z(^JnU+oFu)q;*Z^Udtc(egOIyoV{W>^9|0vv79^moT=2FD5(Rld-)|g@;Z>D$285I zQBhw!Yj{~>+4zdaadeCmSB84cf@Q@3VjEjlUpBV_2iJ$;qI1ruikiws9H%z8b|kLh z6|<^ps?^1*cmroZkz`(S5OEAUwo$29TYJ4iXTJ9V4>>HADnd!0ZZ9Os77+|4E_Sd5 zUI7tf;q6Ntc6iu#90@Aj@<}Df5TCz$#|Pw#QNhkljz#G}Mt`W(jq~fs;RmDKayt$R za7C}u4axmUm_|^wtN8~A(bzqtO)qlm-q894$y89W@gr$1vls#KYRl1ZqQkRl*P*SqhejRyqBFYIr+~#U^0@dri3>p#m2(ags zP`%4ZpiLmRz2sD;RWvr$*CcR2MV*n%^^%8Ceb{kc@^EEm zW(8kgTRKAf?DlQj=kWh{6e83`j)JuEbQ9?@Jv|Q<%G1Z9q`Y;UuFF1NN+)nBnM@^5 z)O^_|3H4-E0yV9vsZ%sHb*e69&zI6^Tq1p^qr`Tz7YOwXp)M5anW_%m=`5)`o9oc` zv(Hf_=sQYmbdsi$=*`xz-c%Ox69o?XtBlmm;| zE*#qwRhySyRL#r$9)|E%cH!>6uq@xYYT-VHa8J8%t}iTWaIw6jA>7X{+}9V5THe(V z-r47hnkX>1_8=~EnXf#vyHj|7LwFy%@ZP>~6kn+!JT)x51;=EHFD$UBnq$&v2p?q^ zuJeV(a(69!f+2jYU3i`^9JM^(5Kh~LPxghQmd`ST&+xgTCeAmw&Lu80CdxDCIE61U zgfFxUFY$$=`2M;p(@!>_oG6`a+>*VIA8kQ*O5UAe``c&3Ic&9HOgC$`wgy`k%6PgO z4^c{cNgWn0ihxHT0|Z2Q>tqMe7G`%!r0L(oU{87N4V{~6ok824w~5vnByi@u_H_pP zDwGp-N0*rgDz?^Ha>x%E#sg7KRF`83V_viBn?>ka`)b|~z zdIS#tAhiuYx2NiGNZL_lBqZBWtqX5Y5Oqj$!;A=tG%U|x>`jbjNR(rGQMDNos^*aF zXbAVS3-@&jUu_7VLR@CzFX50}Mb)7up015AGvwzJV`=HE+WNU=)rnKHF_z*a6aBlM z6)klt@{-GmHnU<@SyOf6_{NHw@~Y}$bct+SR&`38LOQO44vZ1k8U`;QAv(h4ON?l$ zDbEBleHL3?9AX+<*3dwzb-dF{neF@#+wh9I#@Qpv6pRq>q7bix?L1GfzBq(uhnXD^&mz7CqN61JiEdhU199@9zMg4b@wOKw6mzmtr^ z^Zym~>JjB()%b$B70FK>CRcTsCkPyV$D;#DRb{p)n$U|np-wxdW7r}bBMlp8Fb*b0 z(=o5JV-5|=qtidF9aCb+?@f#`O&=epXriHL1TmJ?G*)3l28Wtvj;gAuu%yNT#5NZL zN>xMI+`4KT%Wz_8D6eX0sI9kXC?YZ^Z&7tsorPf-%U9RdRg5n$tFAy0Flr0~sKkOc z33Zfni02IzHAE_^2ATkUNPr&bKKm1i#}NMMk&5~v+J!%+ijLqKy=*^XD{rc<9$h=r zprl{m2<^*Csv^|qm^y)|p&lghn+&2(lu2PmB#JQB7>w1#IJ&BCRK?L1)y7^mjz`QP z(op)Tpz+mJ<$$VhB!G6LFBYb74|~$k|1V-R6Y(2v$P-i@YRJbr5uY~X?mm zY}{7RP6uArQbmq4&@>a%+^UB1(B=z(-bbYJx~8&nIvW?I-%IqS2Atu`1S$O~W4wn* zGpcH4My2j%62MHVnrYr*fx)MUa1D3F% zU$qN!4Ef(l-tL|CM2hjwI-=XX^Ba-u-uYD-wB^(>_tA#@{={ha^?pQB zquZfP7!B$4v5~|3X2^kGF7gua%|1koiPPRhx5ufFNcK1lCemDM-!CANJx+TOX?BIW z1T`A4C)G#ew+B@_;x~$Dp}rz+Ee28dl`&yP#7`K{H5iW}Ml*gpa{SH-%Oifhbo>?> z@~04^J$`8-#l+xbqT6F|5|QjNI8hn2^_3Hd#4}nTQI4l-i~oDGK`B*4*35N_Wy%a9Wu1L_Ww#>K9za|r7qZXNu?e|sdFNg zOl3WW(<eH|udJJt3thrSz1Po|e)xQhHWO&q?WdDZL=27g6d8yR;R33Cf9C!CScK zix*S1y=z>=5>@pLjgD#aLSnG@xFt-gZD<@`(TGc#ikX;{1988AmD2@VbRb+zw4-sD ze0bH|ikb#Khpv|#>Ag4v4-<&%zIpyPcN+ln;(N~*4DntMQX1-2hd;6R6F|1h$f3o|Jfd7*gOXQ5>c(d0eTgP1Ui*^3ni61Z==MylX?dw`t`(A z>RnYzrn2AT65YUjUrHb7Qr3qkscid5N*|-7bK-iG9l^hjNV8&se=RZCgMST^VuHV% zmD}C7jA-$}UrH=>B^C2_8E$Nrz03Z6g=kj)sylpMo7ag0!scbm^2EYKdIK#t=w7J) zUuDv2@T;JFiINJ+S175Ve2tO{$~UTnXVAWt(s#O){XLf`P(MiNM_tlhXH6`T-@K{|}+;$o~h46qo-G5Cei6z8v(tf3v7P zyYDBOE4zEKuRbM~Pz05){8ao23_3865wmN0dX$LV2HW)X2vhAaR}#%RJ^e^jD?+5r zS`bx7S%;E}=6aOWNccNSY9!piB|MFr{f8={^ZcnxS%0CVqW-s(66a?k_bh51k$Z+n zaglqP7_5!#PdUF5N1$Kks(u-ma@2H_ge#Pjvr$q` zZi|v~at=z$$(wKqPEKvAOWB*L65QQRm$KTUq}<&>N*$%tNlKkj(w*lO!fRg?zD%UJ z5WGYT))2hNqV^EHK(zP}JWni+slfyI_z+|fM<4{YsX>KcbMUGVY>ASZ5W1@pa(XLW zm%X)Lq6y(mLKk}a5zFg0xXrYTniL&PUMHf}Rj;v_-Bqs=%`ruE0it+6bR&*{AM8^^ z5Af-cXq&KBOc64~A7L;KB1UtHP`6H}hUGCuOx06FsUg1?G0rW+(hQrKfsM*NnNn2~ zrR+fzeF14~eeO>6{sp8_y&F|G*5V3vR^wp-6T2D|+_yJmrZFXW16J^tfvA#YCQ7Qm zR-mM&xJr~%@0*R1?qB<&Y;Wg2OtH0dZ=(3XgYXK8Qa7$-BCeQ>^)P-A2GjFkB07ir z>8#Y&GA}uUXwa(G$y;E1zpEOw@WVtnfLcyuoa8pIp46ekCVw(J5**4iH7F_1)S{$3 zQ;(AJOoNmfQPMstLfP)4VN9|4Xed#vJ{m$4myh;mB07cTdZLO|+C5ZFG`EN9h&;Y& z27W8QwyC~6v%9L?luqC`#l7Sl;tF&~V{Y)0bBR3KSc?RGd^E_)$H$?he0)4g%ExJx zl#fr5(y3CKFQwB^(tbY#WxL-GW{S=42NA{EsSY$K!K@uY6jwwJU?RL?xeRDxmG+3t zBbqxRClI;Ch@2SWI!Ja01A#k+*aCqwW)v@ZERo%TTL7{O+*v58z@3ef3f%c9slY8p zNr&c8lfq^Kg9N0-pJ4+_C`sqj`!gb zU4rbZN>~%`r%PG;qoiCrL`p+Z(k|atEOYIj*jqQ$$c z1F<-+Om-)l)1B?xcy0C~jzCW_W*^xxQOn{Y@G9RQh?4UCK`1HTAB>Xn{UKbUE0dAB zls!t75QWjYlr;t=6@_9cjg``&QW}Snj!X}fEs@!Vs_l{4nk8Z)vlTH|Bh#Hl?UC7% zXz`KRf><0EEW?Nv8<_)$BM=#5dI?3Q1iX608Xwk-5lcp#wijd=-yueGvHlKs!ECUE zkv*eFtWA7*Ty&zOQeZQb)QHs%B^A*2QtBY3j#BC*rOs07f|3sM$Am0;tKuW7wg>q` zmWT=R2gG0v^7|}m5Au6Na|QW%c2^E?+uh}lSY5%OWAi!Nirk1;L)EUGp3hi@nr7SS z`IM=4^s9;HT>5YB1dg4aEqu_a)Yd4eIB$cJ>gqjEQeAypF3~W%ohqS&Z?8*PxhSc8 z=qaUMDCszVM*!^s{Z?8%)P7{+8)C2q^lKKiyW}gP#Rv3DVsVV8-2mPlY#L9y6Gx!e zy2sN#;8o*kKa`Y{^HEYx?vIjk@{U|0Cl631IC-EhW$lELa`Mhn8ibN|@-NgLyOY-4`L!f3qfhiqZo4=| z9eqWqRA-bZY802hNhP+2Mit}ch_OHO7uQ$SgzNvL`WdzLIIdV!TU~1&ZQh-(y}dt( zp&V}+Dyy$*sI9S{;@#jI9a;mH#`@a2;6az)mF+s%j-0+*PqZ@i!)KF>16dw>a-Bh) z7@_`VP$xvFzY=v;RW%-tH)wzJjMTyD*krO3(fo6qzDv|WXMQ(eSK!L>r>)KX2$0{q zgf${(B<2?zjAsy|nKM1Pr5AqK8k79mwXtB$EBq*cVK)oH<)geQNY3~d%corz@k&Q8jp?M&T3BH7n=1BetoKer=Q zJI)^LPc)YchJmPkJv7V+UyHBKG8pTL(agj~_Vt-zdCUiMw6D)G=GF0b0(UA44R2oQ@`vzI|n!KW(D=X#5(f+7Z9A zi57~Vxb-{`b^Oi^Ga`P%_>sZ*EHRq#Tfp)AFf5Pwov7pYi6Q?QG1}wzDv@Ghu!`vR z7`#FxdkkJy25m8TiAd4&r!P{q#s4o*eboQYQ?@(l2ne8pX7k}GeVXWR{3%#nMY2s7);jwzjq-(E7v-)v6vznA=g z7;4oI^5Q%<-SD8LVN){s5mE4rRn5%OS!Lyow3-et9lhi`#B_9B;>m?X>#pt>9!{s* zlkX7;k3RTMJBVg4`8I2wNof2VEH?ryu3J`vpx&MO3rgzQre9G~&o=#r5rA^DEG($?|Qktns zKw6>eQnRE~DW%y`s*=)?x|B6Xmr~VInk%ImUCOG}rBt1ij*?QnU!rS_j}gt-%p3&f zL}hjDjI!#|qZ{Xy>LjJNB+~C9HG0XN4VJ2zR+gX04AEvb{2y)C0npUhweL+p(P~uO zoe@wFs>NBgEd-FIqErI{K|@FaNoAGc=+_bV-h1QT8~4__x7E6>wQj3c>z@B}-g}eW zgkbyq{mTFMdOvv2bIyC-^PY3wdD)?I(co&ik%`{1{t-7-vlUyx#LEe0eDD)0bA`&J zIvXo5`-6T@aybHrcoNa?)<3=l_$rkV`>ZGx>$9>3R4YABfl-yko+W&%*;1daAlIh? z+4%4*>yVZ|6dWf=`~nicBXh@}qcbB5%-U$2MQfSRpaH(#PDl7!!Vl0DY%N-7wHXat zvWhFYOL)77LO9X)*8WghsFvWF^1T`4*#4~?lC%*f}#IY{X=O+K+v0tm-FoxCR`tD1Qqj|mLmXl z!}U@0H?;(n-Ms|Ko6;YgtNSVaQeQ%Kq0`T;f5*v6yPit%rM{p)Lgb8T<)Y;Oz1H{tWZz45q1OB@Sw#`+OP5aqsi;{#2-|F&FmO!K8!Z!ZlzRxJxwej)JA-eNZk~T22+* zG&tDF^@Zgcb@|4Y#;!O6+Aj4geC8lerAiFZwoOP95Q{-YV}Hl2=kp6&xC>`ey=lDYoidHiee?=c#gg**5hb_UIU^Po^Z_8|N%WZEfY;P-VZ>wx? zMYgxqwzoC5x3#vnb>f>~XN&Q_-ePACw;2ji?C(EO$xVPKM1KwdOWN%u1u@Bz}Y597488ScdOFW~g-@XGQ8}ttw@MLm&2wcB`{yHGFz#P3x~$~h4n0j=*Xe1 zTPQAQ>jB;bllas2_E3Bi8txAMm#doHrr(#ul30mN3U-fCRABea0s2Xa5FmOX5>fkP zR;OrVoh!t>5zmRzX&Cpu^-`wS63U`#PL!`)P;RV3jR>CnHmjgAypdjrdylGIma&^Q zk9{>oA_Rvr&O%gRP-MD*a}(hRq)SyNLF6u|t62ppEul0!QC)8VO5r3 zRr)Kksv;T5TBXFokhQv4P%f{5H><4GT#)2T#d=pHBm9~r76$(Nl7jEKDA)5Yx*!RY3gRV_ks!57EDU@fv7lUD8*f&8Zxn035CtP7 z1;gJ~Fj_2#X&Ag&brI!)L=e^{N*fztjD)cDTL~dpJCTeUscngcQSeJi!B`gs*CI`1 z{=I`(5K};Sv(})!3zBnEYl#=hNRYS^3qz0uR*)K9i#NiT%TvTRBDM&T#ATy*bO9`Q zbzB%te{<331Rhl8LJp1!SXoGg6KpFVH8V0`s#yl!gqmfF zZ&b69l}k2f13^0lYatHsvNZaei<$*elS$1v8wIU38&KJ~W?3#+EM=~am*rSlxUSjP z65!*M95{Sh>?qPJW;z9uVyBB0>tZd|LsINwv0^8z#l91Z$>rbU&1#7E7=a|aq&Zfb zPbtTjWmzZYiz2F4{kU&C-|&%*R5L3MU0(V5in}yo2y2lXmuJk)OKxLMZkeqwU?=92 z)6MzGEekSpTE@3b&M>DYv%yyV978HsqtQLnAEx`J2c|zw4^59uk4;ZZPfgEE&rL5( zFHNsZuT5`E7IRN?FLQ5mA9G)GKXZTc0P{feAoF1J5c5#;F!ONp2=hquDD!CZ81q>3 zIP-Y(1oK4mB=cnR6!TQ`H1l+Gp?QY+{YE1@F73Fxs7^~d zZSHia(=VOwb$Zijc<1SzS9IRl`DEw4+B@3GDJxUxkD$ zuSMRAz1Mkf^*-u--ussKMepgg?|S$2`NMmiPamI`ksEz}s=di)K%LD#o9k@zx$L{c z=Wd;yJ~MoO^f~6c%jcBub)Vt>SA1{#-tisach7f|-wwb1enf4bKD@2F(gu9#j^o8mZ#>ML4hNbFL z`sM0q!;~Mor{aW?Qv~}vs>Fd>3(>JJpOWUYEZP=v# z&A3_pO1DM5SHD&LLbpx5Fnzmvs9}ftQrb@S^YkCpr;NMQJN3KOPty;pPpXfrU#0%6 zKC8Z{{!RUd`lC|A09t6zA%19{DSyd@pIx=#qW(@9sgtey7-^t z*Teq;Qv@tfkW#BYx8XW9~fBYtcA?f7l+cjLFmKZxHE|2Y0h{F#m~;&*p^ z8NamSsE&KJXJO6{V9*0#($f-_Cln?uPMDRjIbn9f_JlbJyAtLm>`j=La3EoR!V3L@ zgu@976OJdGOSqJ9Jz;d>ZFGW3i3<~_B+gBop13x#FmXfTjKs}}GZVKZ&PqIKn4P#Y zac|=3#QljU5)UO_O+1`kRrH|b?kAI<9|i)NT+u4aS=9Z+*b zH%7C$(>TqjP7^eTI!)62(rJq3j&_>nWamQ7iq11NJ3Ft`Ea|jEb5MI+bFb4`O=0RK z&2-~c%}c{g&0xcX<0knb_%={#57v+Pj?(r#$I=GvU(*HtVjWoljkv_B!>VvA2GrX}JDU`e^-n{Z#!%!y5gS^h5er z=_mBB4OjFQ<2C&>(+D_ zP9p5eJt|i6tgNi%mf z2V16Gu3Vv9sa&Njf;U^I+@RbDpSD%GO}Sn4YC`fT#q z?6b{hyUz}vojyPM?D9G2bKU0;p9ek9uFno?Cls*V+T>46HMv&Zs)$>TIsFrOwVeyXx$#v%k)XI(O^btMjnV<2ujl z%c{l)jP?{B_We6RXm^SuG@ z{X6{kUEh1Y&wO9Pj}P=4v3}$HCi+eCo9s8mZ?4}0zfFFd{kHgRV_yCs z{QL>{`Kx}{{cigG>G#m@5&V8p-PLv1)ZJKjPu;zBZ`8e2_jcXi>kjuH=|9DPx__bn zcK?0;2mQ(apJox@SO3fYR}crTAr9Q|zvX}1{|@581H^?#{!jd$vdHk#{}qc4y#o3K z^a~geFeqS107Z(C0iy%PvUo8mU`oI=7ByxC%n6tmupnSjz>*n6SOyIf6(Ee z<3T?MoejDebSvm?(8Hjoh*vLJ#OfK`JGgJ~fZ##FLxP7RdW}L18yh?>czp1L;EBPL z5zD3pPY<4fh_*0zY4GykmBB^9Yl7DWZwTHPyes%j@D0@iRj-iYA+tl~hRhFH8Zs{Q zVCc}WKU+Rz@o!Q1)sJE)Oskf_lsCTM= zRPR#nM$|s6KB7K`IC)b2v-&h5!;Z>Vpo@2Kw~Zc@~Is(!A1t?nJy2eETN z+#p2Hp@^g75kaTKO^ur#R~R=F@sy(JB1F<7_i6l#_?PjP zjy*f}>NpaycXY=wVnTVg<0VAl`-sDTc6`cW@h}#R3lnA{7SBc;o{JbfKVbo)?_$L0 z&4|sr5SI@i9t+X%CqGpn2 zvSx~As%DyIx~5PwLo-t|OEVi0eV%5%W`Sm*X0c|8W|?M%W~HV`vqrN{vq7^-vqiIA zvqQ5}vrDr_vrltCb4YVs^ONSJ=9K1)=B(zD=BnnV=AP!h=DFsj=Cx)*@|5JM$E)N}iiMFL^=o!sNxtOOlr*FHc^PyfV2cd3EyI0PP^{5baRy80`%0TfF@%sS8sVr!Gxhp1Lx% zD0NNhy3`FA{2Wd_ntD9-JO)9pQ+w-&>qjH+S*Bm1U!`BIUxO@Yqkgk~tA4wFr+$}y zuYSM&p#G5li2j)VC;bWiDg7D!IsFCw75z0ffEsETZV6B?*NWYYRIsHodRSe{wraw=AmEO-Zz%6)EUA4~H11_3AhranG|uFvmk#4oUI1ypchPn$Ju+T7u{N@atHmX!d$lxjAPR#Vnru z^BS)@9d`8UU7o94t~5t~YtySdj!_9eQhn2Js1_eP3tzS($K)4vPUY&O%p9k3Dz2i6 zl@s+&<(7WWb3aidNq%hQMBUS$YL4f)o;@7_ZRJG$Q@PLF%5alvI0D+riETjTro_p( zlkdMnueKjsIk6q+59iPdU+0#$m7y0ZhbE{;28`Pob6a>}ekV3JI~`wKR7T)8dC4(m zeQtJMc3QqN-kgUUUX>m43k>G$V-$4 zOpF>t9q?Zdu3m&WAItyj#E zUn4k9n$yh<;hw%d-7jt}Bd=erm** zhoix_dFW|DpQL{S*z;rIcUbRdf6EvD?JEA;P5igJ_-_yK-*3c!|0DkUt@!VE>|f94 z{9jkf+FV%fPBW+1H*re&uF9pBO&Go`W!|K->qj@vy)^V!-N89+%dYC~GsnNA zR7Y2RE)GQDvR5WcweM~=^gnU_d5dukj@I7%<4gI0y-jAEtCzFyU|?368=p7ud|6Bu zr5_wj-Q)^I;JP!nyg3--V*5 zvy0}fD&OvYV)Kwkqk5!dbX{{M;dYzA-}js^{9t-%&lmrkUs^^s5(DZ96}I;8@Ui=6 zX=c^j4k-_!hHJX4yvFP6H!QqAzp(r1SBE@D|C>#omv7MJ3SF|3?&zAlwtw{gIIvU{ zcjM@L!Jfyb`s`h?x%8^ve_QK6I?!`WF+u)oHG>^YjMY2%qwnuNKb|wHfAro-{>m{2 zcm6q`?uygf$3H%t-}}~azc!vT|2aFj&#Y|5ZFk$D&$8WrxVXtJe{gJV}BJ(m^Z_CJVtR)1r&XDw}b&l2>#yuI7wo-rT%=i7O8i#`Y$b@WO% zuluRnR{Z4kY|PeivCH(HGm44yU+Y^mYi*`6Q=ijAEA;ILmqzw^Kj`%*HGa4*FMO1G z@S1vmuWLgZH=VFNYxfV63!8fu{!bZa=k{PtP-B04w`v_n_TJQVO4(s?iB--e7j!GF z8J$=?c=x98#JCjC@^WY2_W!PLH;JD0yS?Z8-j{9tlAko=@!FP4PV_#McE_i??B-{k zHhuNYFP@&$|9N#K?0R(Zs$&^HqV&K%>uaj(^&E0NWW@1G?^K#TddIw-0|Gi-^)$Qx z<7(o=LD>Gtw0d~%_z9;fU)WppQKKrmKCfH4-uIIa)SD3;H2Pr0=S{yz{7%L#tx-ET zSR1C&1~v~5Zynh(EH+9N?9(!)AgfDOcDF3Nwo}nJlHB;Rg>$e4*3yQ)B*%F^BQN(C zYkbzojzo+}v(`)T<+g!M%9>C4Z1iovB&KGwHZe2W)owA~EA?FP{EaeCpPK);@>ZLM zFEMA+7CLKAG4EF{HB34Gl4r9KySTvzyn1f;{e0eG&5GmWpY?yWrAMKs_y3ML3=G^^ zooBqWH6nf0!n4iFcCq}@H+cHy^Ple?xxZtx$)BYs-miJJs;AdKXKUwH>cFBFv6V}` zI#c~CZhnwvef`;|`hET?O&^!v#P`U=JG(ujeg0<}#>ca;7nfDC<>vQR*SH?I;hjt2 z4_iex={L>e$;nphlI!-$>E_}2@{PrF#Q%7;pH!-&N+hk4|a4r938(qcE8}7+;jk$7mC`9kk` z_@6ViF?*5UV?>$vhh()qU38>Kajfla);jP_q5@_!#7X%{!vq1ljS-6->i9ehpKG6`s@nO<9Z%vaHy0X3n6i-`8t!yU)bT-(M$n z-+%hfo*C~e9!y>N@ruU&pLtIGH)Y9jkfm{g>Q&G8F0EUCp-C;@<7tyuG)pL3rN{mO zKbI=stoOx9zj;piH)Y9pkVWyq$%`LW^nk(afD&-d!ocGjmmJSY8|vSc~P z(tW6BL3wUR)bcl5fBIu#w}JP2e%7E_$iR;s2pQJ?>k)?^-92`^ZA$LG_WSGi|0rXKr|ENN7xF*!X5To-l78~V;}+ZN{HN28 zKkjz_^knYLAuZA~3ib}HeC}YKmh#*!o)i8}y_g+jxtaXvj&GxJ*LX{vyQa|@vo{Sc z+*x-~_1ytp9jia?mL2CgYB>L2%roZYr)uf+8)hhlth@WP>WPIW-(Nh&q_@dC5Tsf* zxYD&>cT}tx5@!l99Z$m-hRn9T*%N`d)(yBU`Wk&&3Yol~2lV+8^%I?Tb4% z%yWAzn39z3S$E-oTYp-l!2aPbEOc$`5F0)AX77`&-@TMI&-ag2<07wKb}!ocU18<0 zvCZ?xzAxj_mfGvzxJ_ticuc#{Rw~T$HV|v;F4T6ml4>jCOb+GSghxcT4r`@qr&e1B zCr;(NIFxS}(kirN>y|2fNzdpS-y$vFI=WqWOh{BaReruc&2{Wa5v?M^B12Ri z;v<8bxF$H@ND$U4HY_|urN>E8*X0jN%eM>(Ya7uzGF(Mx-&~hJBrV@Iyj{zdG40x@ zO!yG0>+*-C<=eE0jtY-$txC`6Q9^x>NQ+0r#74D=ZXK&K0pB(JQEB;hZDZPoMaP7x zOqu!JU6(&5EguyX6Vs+;t7ughn5^sa$ED?C!y;OSM@6+%MaH)4;JW;2Y5AyDkzujX z;jL9+5fLS|*F`Bo>vk=pBilqqs&JcF3GMaSN{KQUy+W%qq}asxiip0?F4PiUkntXPoSvekZ|c*s5i0q$)R6)PP(ld7_rkr!A6_ZB*g0VUcZGMMaVijL5UH32q#i zX5;jZK)-}>@>Kp89@=3gNGY%L)6)5dn(r-cx3Ks0A3l2WpXHv(Q8k}$3)tGd@`BYH zcQ;b(a_54B1EVwJjrxWv)t4dRs)QtLhIV&rtdwEzyiY}rJB3mo79)&_QHiAZ78hsn2I*-c4aPc~?NEYz$v$PDs;d<#YwHJ3PJU_fgo1b1M}bpM`b{Zyd@d+`GpWFV|CEd+5>yj z_fiA!*A%?s8W6}}b5(5qNs5wyW+Yh}gQ^oSE)m8F!pH$eb5WtP3N{hc^qpv2eOHi~ z)d8z)9de9%8~~OY1d}HRSeFUw432zT-Y>&(l|-ycPFQb4=>e4A2xUCB3s^!VDCH{J zB|=sZ%B~}DA;&WyTqA@dAK|eD3*a?Kv%GA31%7u0Ua=B564i9Ty)5|nD+7|MCLSjC z2f=Li#iKSBgGKdbSL78HDnXW(XzSn*w6xGeLPFyLRf5UMv1o6h{R@`kkl{X|q}Rn` zE>J$$J3@tK-s{dQV8y|~Q7%x(T>8oFD0R^~e-cV*oNu)xqr-XIQECxN9Y4h*1^xLwGJSXc7PPuj1faV*!ZKa;oNFMz zPJG`9#v=-Ix$g=+=PJmDdkXxCybW&8=#YaiwIXkHVQG(m^PI%6sPGsC9B;wWB0Txl zp1fiNK{bfZED?%zL%}7;Im;8ky&$-eA$Y6>+y@L!4wnG9Q9v9CM62z(M3q`F;oYEW zW`yE#9(dLcsi@*uN1<-9)MhqRlP(vZ$i@P{N+mkL#>{z>_k2lGz9dwh{Kj;S(IdyyUYC__ z%nL0rXISeb1$zdtegtMrz~eH&>IgMD0&!jfFVdJFYR*Sfl?WIbu5HU&OXkj_*I~iw z1we07UrtQK!{>c+H514-w*&MwKs)>;Xh?X1)B;`tu|J6!n1n}9Al4EPw*rx?#s!BM z3}J8rZ<7;{Qfqhx$Xg`j3xd1|NY<7z{xu*Q0+ReXRXQX;Lzfp;ke8pG*&btNThC|N zB}*p4arFK+LG{+)Q3c6TxV2eX=o|<%=+TZ5+9MhlG?BI17%*7o)NH@9mshExV8;SO z&XNUozZ1LiT0FLZT_r&oWvlaw4K)PGk&VUUdr`F0$c4o1;9m!jJ{Rfm=#CkRCQM>} zm%E$dCp$!JhAy9O!;8)|+HBF5S+lxpfHa7Zh8XeiMFt^;r(Fn7b!y^cG2%Y+nM)>F5pOcCG=lBd^YxyBem z817%;VX|Y?2gY(>bWQ6fvd_TDR)I0jxpG5^D4mE#gNRA*CaY7EpI(z!Y;>T@(>hWP zBg)rZ@W_Dov{TLjKReYBP>mz1@JVcxAU zjmBm%BSA5qD2`3WV|G&;1@V!+PpY)Ckt&45n?Ph^r{Lj@OppaeR;}@%tmZ%|H5a0s zNR)%8;nA^~lyWX8y%?q5%G6%BK_Hw&ggpz1x;e+yrMk(j&G)e*p_C_)PA1aUGx3OS zAtfcAcRyhDbT-kkAe%yDQ?}qSAyR5-H$UJN&!uEi?GWKqB5bn_kFTRJRA$XUCQ5|m zKNL*Vnc*bRO(VL;+wo`>Ez-GL>8d!;NjVbbbfUby1CJ}9R5Ek1QZD`o9Mg*Vi)kP$ zB(h6~@bGVE>xAeMlRx4WYo%mTendEf2)iA@LykPg-sxw6aEFvo+7v`MlL!^Z@Hp>4 zI1hvel_aRMVu)%sQRQ93BM4zwWCw-rQSypY5-Mjg=MY`l8+cSlWVHJVq8n9w*-t95SjaPJbnb3*v*Mik(5TN464*Zq8j-EkEyBBp7$LH z_eu$+ZAOHPh_L@FJdWw5ghN1xnJDtOqL@;a3qZM;D8GAyhdV;5-EZ~%nmA0Q z!Mos=2QQ447?HJtQuj`(Sx#gxiEJ>)?0%309qvtnI-B!qP^}=USMP&rbDq>J2YK^~ z$r385I*D#2(arb}bmQ`+eud~}c*Dj7W=KZFoPfr%tB7daMY2n+^`^K;~4>*-e}HnEP9uUK5vYo`y@qkP}CXpKs}Tk z)&wPQNJ@Siz@_O@o%pXNX+u9n(eUr={QIJ4X12l3|1LybLq*e?p=fUutsstnCI{e> zzI1y@s?=I4nfDn=e)YW_bbbJrlikf;k}%g%$@8D1)d?DqU#BCZV-xgkQ9AWpVMY$YV}?7bIc8zYIE|qLFL^mQVMwu@EaIS zd(ezPs?%xPgeaQft^A3Nrl2^@MxybL1C6CGt`rq%YTIe@w8V-VP~P2x_}l=WO+=H~ z5j36q!PAK}_pk)X;X1-E^H|O;Osz&o$2JX#iVaO@ph{vxQS9&s@g1OSCY1Y~fUos#3Wk{Bi(5OxBgyom5|afFTn zf-uyxA{?oUiAR#*cS5)dgbE@;e-Qx{AVP71+g%Wy%;r9k^+*L-=|ME14AEu$`~Y4t zPNWP;Wmh*AtMdaQ%rk&+H4%#ZCOJ|G^XVcxvb}9o&p(Ok6sXD&JD&d*?BB@-9n(Ro9gNw#Z6i#iY;(UVpz zUH89>wUe+~eFd!gLmaR!h*)76y38DxXmJgMSu*>aZ9p}S`;h>D?gGG(0PIY{xv}Bv z6A`ctjs!{Z8mnlg6g738M;_{j8DMIpwK+h0Fcg>L3TQOr`NoEpm7Z_v@HOTtVI7W> zTvp{PV4r(PtS)%~>Nkwzs*9~%Zlqx05gFOp0s<34(r9~$t~;HE`D{4Hd5CnCq;wt3 z=~+h1xsr7{HTgcGzCqNTKwV9wt}jxz%oYqqA~kDnk^Mx}{~^_1PKRw;jjktvAkn%95pNO=m4@iqfb3$&-!EiR~? z)kw>B@CBTu9FR^B(t*DCUl)K>jcS0kw_Pq^ip{*20r}5F{zre1cgIlFhb8$;kUb0m z(=r`!HzQ_Z#L9$*OFFW34Uw~8mXNbl0^TXYQx5{(=VMv&qJpHfKGJ!VV3C+DV;^`S zWMQ?27({1<;`=AepG7ktE<^eNq>ll4iy*(92gu;b_BP6N!ejG-G!+MP#iAWUp=nn_ zi2}-PLWy4hlovp$Ax8E*Clqn!tptqU3F8f6w3$ME4Z6nc=p2S2T&xR4K?bZLp=!)( z5~w!T>EBNv$78bBZx;h2YAOz53P~Z&Ce9UL#C1L=6v;AQAV8iF$iyW8=?f5XEo%)x z<}(nrF;AS8l)}(NB$LKA5!nb(PYKE!n*%IM0ri1cr-cm1HV-LL~35O9&meSSZCg73YdBp z#!6De=&YQAeA-vkAs^QoyTGf4+4`r1S8fyV-kpi-&Dn~Bo3OsIy@G6a1({+7!wf6P zMQ$R*1tzZxbm`=94PZYf?D{)^U2zu2MN)I}{2su`75q3!)!RZw;doXF6NS+Ldr4rH zeE>_C&2g~|3>7aWRJ^7$UUa@OvjntQpuHxvpo2hL2sG<*QGF>&8(m)hTTnUz zI|P)MKwHMXAh!mxzt9kV1gaRs@I)H~R=aLlxc#54hDn2h zk{04m0;(@TRrncD^8ocObqNH8E)yiRZL9107QF@5z@#sMG(HEA%JV6GB@h{F$P57S z3VJ$J(iu`(!3F>vOn{%A2jJ%btSd@YWg>&oW#~I*=XN0{9h;p8FC>}YjzwEIxNXD} zL{#g9x!}7;fx|H3Q2i=6)Ly`G&Gt^Pu5DK@#zYJXf5}D2@+e*jY(|3(#;_RrUjv(= zVAGD+xXBPA!eLZ0Mba3av#&N$D@oU894FUj!C8zZv@?GIEp8F5&P;`#-P&+`7RQ$d z6z_?Ln?fU?iYt_^P??XmE#FQA@)$zCejmu+16f?Y1uWJo2~?)=nAnv~6UoH7`E&xQ{wY940z}+EVy?(%Ve`jX0uk!w4B{vaZ6PTn zpeqEl!9f}V@*{<7u>mBKwhYm@HXQ%L{>Ato2-5cNVwRIIrZoe`Z@_r}2K)kMme6Kd z@KQEeTzNdIn4?VO_hu4a@8-ZuTT07*R;4q4s+f;RWCL{(&WdAFP@BatTL5!7Fh6FP zv~dAT^b{>Wvg?ct)oJsNqlk13#cYCG_8H*T0nTn0w1KBzp!B_kkRwKj5+;Q z)v>XV-q3_KkoSFv*)3vGJ_{_yuBCZEmZp!uL?W*kgpnl|%=Cj=IcVFlKGZE}_oPD+ zTirwjv%xDZ+k@XhF#eGkr{#h1>vdupDC56inrwwL3HTyhYHp4;&zN73qow1g-Ly!e z@ue#|!VYgQ$J7jF+Occ#`6mFH{T+a2Zi1gz(R3iEh_qvvv&{M0eB5qe%(oFHV5WsW zVP(1VJqXKf#@hxi3Z(8lamUI4(FY4cX!E-C$iN;eZ5pnTpf4k7p-arEqVc_4QyW#+xP)syM8O)5_qaCmL|Yerg-U!H=XgohpqJZ zEEde`A2EMT%p*sG`TiYvJIpjK=c&rPq9XRYbHT(&D}06tN4e?4+l(d6fU{JYG^oTd z8na7p2<`oeKy&|*<3hv+f7cF^ooh}v;{=SBec@YZs^TyfN<2QF445H+sVl-XAXNw| zwkd#?c)%X^W`x=FB)VQxK=%Z6mM21G+-MeGMvCOALOh9s%^aACU{;i$ucc3mX<>uS zNFby@)R5w@S;rS<*E!2#v{otGm}J91YrivEj?viV@4)pYxX9Un8wa>| zMYto*aCv|u;gF{}2q(;HpvM7aA*Aa=aN0S5+Yh)8Ma`Wm2G_;RrhWekt}nrLoeQ|y zdoWu_hAHDoI9_qi858;=38P&|*bm=YBMDbQ!hQtVcpe}-1G2UNNsYlPZb%{N5_mKV zK?*&~)*!GuTCnIRcA=#J?N6YK=L7T&KtB+x{ZNWWO`J>n=3F9T%G;q|t_J7;0=>Kd zpk4RERD@nhGGZHv6j`6fj0dN?X#bZBc|*j>c~Ri4z#d50zbpdwpTKS(HA00EAkzZ1 zm5h`tBk_4fX-rYs?37qxx0NeBlSV`}uK|NW#2|es7>wG-aY-aRFCzwWhOMaK44Vg& zz$Pvubi}65olS!c2?Rr13;e-^e_;ji4g0ZF!SIC&P*>oo7CecLL57r*!3j1twMtYLDQ#E9a4Kqd3lZ@)aE1J9FMH*us+PO*;1B4xk zLcO+t;ZS1Oe=QhZ1H-0NFE<&h2-SmEgi1LG&4E^jU&Lid)GT7;u^B5hix^^V0)805 zH&_q&c?Yp$L1-3M3u+c#5#bu%wZ@$EwGa5i3BU9P;2#2hid|nquVu|boaBOW#WQyK z`Eebh+O=1c{E@LZXOqPBk;!G$V>bYE1Yxe)1kCw|kPe70Dp4f0QAUWA_;w;u9tPz| zqDLj2=+(`6X-Eph#&V_~L-enSUIluKC(l^R>8PYToqu$vLyhi=Y$+hi zJ@P5dveqUVU!{}OXcq(Q}(6Z9!%#ElLyD zykd+bR!mABPkinl1fQUz9A^+ZKXH*ca&c1(m2jbcuf?|#b0z7Lt)IY_Su!E^{R7}K zfw&wx0xk=|#WEPRq2AAW3%OyzLB61VL;YT+m{g2eSIiwr`y@3yHZWk_T~edh;5CtW zMf?O_-HzeI8LUQf)-2T0Je@R^DdtG{ZsAatea95-B>rJDwd)ux{-U}$zp7H8p$Q@oy4c2YW@fgO>J$_+nPhEt1F~K| zfwycXt4vNZR3I0?Y}ZZEe3{*vFfb6l=t#P^`&{eqa7dJeS~gGs=Jrv(dWz}b7=iwWyCS8u0DO-~^ zs}4v7>_=jT7r<&du`;{MG3|B%H-HkWvOMY5O))^qz$z-{BXf*u=D3lL7gt9tjcSE9 zwz8IR{0STjiQ_U4a2$CNZ!JnOTP!oEtZYbGx1s>q4Cseh9IJ6TCJU=JRTvw&m)qN2 zo1aVL5-THV+iUfC_)Id5y1?Gr@K?Zo2C-jJAMC4K!!j2&JXV6gkfJhDZC6KQvH~(= zazMQX)R}}D(EzC1fSN~D@{p0}Jjp9pgcrwmYBIaoS~*DszX2Arh{dqRU@`ML$2BAt zJWq1-inhhkb2GEM8nyXszfW;!wo}2XmD>QHP2g3V0{k+-BUqEj7&uAJE8<*mV58u_ z&0!94`14b6Xn2F;>N5_a_$e;H^|*@jtrZa0>8+KxgG$UL7BS7iq8C^s5R1|xi!3P% zYgC{Hc1j6dBslX3b@XRI{q`nCm@Fj7SyE1!8P6P~;#(=c-fUozC!J2tlo)?p^&aXf zVm!Kw3e6|h_r3t@I=ApPPl!jQSyIh{l0Ca(0x?;bcUFv(3WR$zwR$Wh2p7_o=*nz8 zS7L$IRPq7DSwQ0K3xzmiZsYAsq34$SHh`u1G7^T3BZM@Z3B#<1%u`MlE=wdKAMRD~1fapFG6dSjMOnJuaBG-|cnO>(gwwYhaMl6GGLA{&CM0_-awxK0>AE$pTA+%D z7`p1R^kVFAp>t`Ndk%I>iQU&d!LI&OVk~Hw1!?BC#RRjL6VEU>B|3V{qQ20;j>!t; zl*0p(({TS2PjGrQDNBGg3|P$eg=Xdz^XyoZD&mF}d`?c-)du1>(8?Mjes39w1IqF=pMi-YX6|xI z%6Y{yJA%!z#7Ei`%cCx931a>VKm@&mYc>SM5@%+;GDQ>|nwYOzA+W^rjx& zKFV$DgmM6`BfxV-08B2&b6p9rtUMz?M*9V2l=tz9FW!P_!-@dbdcs<<4p^-eJm*bV z9z02et-TIa3&ZSkPBvy7-Y(k)!n?U1c*+W*6_u4yMlOOLTPg90bi<1<)2^ppiX~cm zY+!#=sW9s%ToWN@6Kz=8CFMMvuHtfW?6h1X^ESnS1zc-f{|LC7 z2=^&IO=!6c+{%=)VN(BkaZo+oS5n|S&nOC99CtI}?%PHx@f1}oqoo{0)m0K*(6k`F zo^9^Rq+e-Y-?gGCFmBDX2TWu)KDUzkE^03d) zK#6sZ@tbTUGMIbUkqub)MT)yqzpjPlBEqY52zZ}X6Wax;bQdWaRw~SNO0xt&haIy% z*h96QAiWO*@*E(mlGVHOBphhz z4d>g%7G|2w)1t|#%COCtz!LQYSNIf3?43jr^ezQ8;0vXqP@vvqz;CS z?Iu!eTXQ)Z3b&g8mm(|H=(7-On9mouNWp3 zL1!>v^-r9Tm-tTcci<*zm4@K5kGQli3ogFCJoi4e3T`}@EXBl*;yfdcXv4qIn2RbW zF?xGds3!Q4=2wB>u%9@5^$s{p1P82Pvaly3v3cTybJHbpOEt6bQoJ5eoWM-vXN?Ap z!S4X^J6Qqzs?`O*rh?w&MFDP%B{7pJPDof{B^{&_{A5vCEhR0Jacts^UhGQCH%R$&~f8<4<1Mn~bj`9UycmonoXby-62O!L? zuq1*6;}x~-&@s9$MwUzqX@m`%sUFxtz&=9Q>7M}G+?eNnU=8gCzrv<$B(U$62y3f* z6yWI7#+H2z0q5S-mg0~|SSx*7ier;aTJK{7_M#EME&$A5FhZ8!kp8fR&5lS_b;_D- zkkaZNC&)jW0y3w$W6C55Idiq$ZH5AqQg1VIfay<|(1%6)R}LTbOo>#gtg65o_MITz6Jo z9DpF$Mv;K+uLA5wW)`L8g4NRg2wt(u5hFayU~8>KKsZSV?b-n0dI-~94gObPGd_kf+G`Cg`>4`KN}&fFaYULB#%!YQ3W~0Ek~_T z8w;1AMB=g?V=nC_wr>eAqi$yirqBqOQc)17I%`08H+$RBI7v*p8>8{WW-Fop;T(XV zOGsM2}j+0z1^vF&(aol?%z1`J+t zq9i1ng=Yfb0s*w^34o;luv{0iX)*JmR^&+{o)p3>s0mn?Qe3fv!@H7fM#Gl{I=k&J zgY91=>}rF7J+%X{&oFEco{j4ifomo9pR4O3bpAZr!;)(J#%x3%M@0QHBnDrW3H&l7 zF|YwUCnhc-c7^D_5d7c~fal@>@5c09iZ8;s!j25w_%*(*B?jgg+ZGrQ<%9YXQ4gB} z>fi+4w&$snR4Up;Q$PV8AM3(-+Vngv+ctn8YmfBSS#(OEMcH}){Z~ToH5KUJ0^QP| z$>t{S8^BY&d6Ez7R1VAvu&$Ra9&U3!5_g&4?k@&hlVqN&DR>b&K zv1}C}exgIPX>3ljtcTzikuMhol(t7V(kV}3@`@kUNg5p|c4&`MoI0Xeem0&sAe?GW zM+d|3L~vq)x@mSQP?|se012*=1l!I-f~96i(1Tmy?WU3jiKDcy~y8t{tk5-wWYhp#u~=*)t}LfUAGS`wxA2H151TXP#=t1=<4 zPRM`Q)F0CdPlEG`E5(3?EzuoBR|0KGw=TOI;5FbAMZg_bPE)~eYOGA%r^l}4U! zP~}PNQi|si9yCo9L-NDC$w?Or!LcDNrCbMt>rLW1|2eo0`r0^ zUtUqO6fU~T@4;@P%+AegsmtwR-_S{kGuwU1N(dXraF~xaL(ol-zXaeVj(11T$cIuF zxS0UV%Wt`V!k6OdJg%GK14no^k&2|;wx#ngINYrd4zHEq5L8eChxZ&gw6X6bwvM9S zQiDr`KTiexsU_h*8ciLMjxAX?*t$3}K^x(#pgDNUDIAwL_c2goQ-J!CP)Bj5vCvBy zKMogH(GeTmi6~symlGgc9KcT8@QNpl5B8^rnR7AEgu{avG+|_c$&DCY_i*|oAJkTY z3<<)p%$=(O&U9Jmc@p7228i%=SDx!m4I?Y13E(pV_?!SO76I3D)oYggvGR_6Br{vfW}3(LsPGPWzoM?`W&4yBEd4Xh_q2z?mp@jG>n zcd~$E)c}PKib_Zj6rZFo&jBU7czzxN?js-IEE|~p8>+Gie$VYnt z_zHkq6R^xp=-8}R3mv*L-8fm0XDU&x(!=c9w%|c$5r{`y@VHD?_OuUpXzBZ#YnhVW z+;A^KbY;GDRq=>m6(=4M1sNF~^yt)Cf2HpSq?}#@f#2<0tcwWx#TiYsZy)eJWa^bos?2-fRCf(Q zw36YRWV=dOWrqQ)3NA+YRFG}5fOUefaLXt;U78bfXm&c=O{s*nO>pTg_b2JB?{I*9 zLANXnVQnIp!`s5WmVtDqM8vo(Y}EgIm=6i_gV7}5_hLK9Wd#cUcQ}-DHUV99N~!e- zLvO)&=nB+F1bSl(Kt}@962Viw>52}S;#Ub~Tzs)QOHl)DSF4gyb_VWa!re3(xVj&J zo62xY0oP4&Tg0Vd)nDS$AW16o7+^mkY@b=c?qdP=hkOcTF3Twj01R&*o1MXqWE7K_ zIaA@P>ZoYj6|*F94p47X``20k)X6=8diEXCL@5twqC%x|?^P;Qt5T_(mH87@WOTQS zjD=%G4}l|2iQ+n3;!Bs~;`R?``*7eaF_m2K{hiqzu5Y)D9R$A7a@GQJJ1g)*29EKOal~&RoG{Y?6G6`IslFp)Efy>=t;4)Td4|l|P-0k~LRi5t05z~w6 z4&2%ntBjP9F#l_{{N7;nj2QLsD1~*KQ9PH;l<1Bu>N;_fA)7%8rC3iUAg#|^nK)FY zFL?YxDx3Tcc=#a=t4}=KWvE9bbgUvN^jl$z%YKh={mTRQ2yiVU1tpb(2{7s9&=Xix zuPVz3kh5e^Mi&Ih*|@*nCR#ezAWNhBnnKw~Ka9q!6g?=n#nvM0mCMi|cAEx@cigyR z#ngf&Or$kRj(b2^dcW$BVbeIC%QuZsanx!VDec+=!SWT=P89%_x2N*lH_UyA49RAAsvx=?({O~jJLPR**}1sQfzAX9`(y~x zI?Hpi7H+{H$Tjr|avG2OP0(JL``jbS>@xF{c!fYVmul6@V2JpJ@EQgJ@3ZO9ik5XO z_fmV^OU@(qWVuY_5^=mo)>M>_VPv%lv{H zdhdIcWOJ*?mLgxNBS8OU4WeTl;zK;ZuM@cEX8M$#lO+d}DSj}S21hZDIte8=iUDg&>3Row1ZDWzy3up<+FYil4*OWPwE@RkPn zFEIk}2XI37a|Vuj` zJ4j7mQrJpLDbotbK{&SCh@>WDIZ55x5&7>(F4cJ|;I|R{n%02719&lb0iFc^Qh*l* z8*dXk#xZ{}0Czj#M#liRCr$vHnb@T1qAC=$gn>r96#uV<2N#KTrh&;0Vlp}wOun1P zb1B5com4Jmk}NQ3o1R^KXd$sj7gg9v=yN&%z4LsYQwf?Es-V!>QU5=J|47jD;{g5n z0-kHm1eXbdD|!mh64(DW)l)+1&};LdmpjyJdvydn-E_rl#zQ{03J>A8pj`(@IoO>2 z+qpP0=?W&hs1EfL!Q=`SLISA{r9~z?z$9B>LIa*+$SeV+8B2s|NgL2Hp@uQm?6k3M z%8+v6F5q~RsDe&Wl*kSq^dsf-4fymT9~7+zpSzfyRTH0g?0jy6&nyWa-1LMsw&G5-7%Rt? z{}zmT6QjpQFiKmFb{HnKLusK(!>jNxWW)yxOpg~rD28^zM;}~H+c|vEMLK;)A53{h z%4_``gcCH`e4 zcgT*psLCY1Y!c0L$=oq2!4Ql-P=QS+xiohq*1>Mr|CRb)k_ft95TO?qSuIzXH3*Y_ zMvUEB3j3);GBSiqW~`Hbw#&PuEzUmtK}vgf0Pteg0&jvarRtHS;8PSlDkglu=9H)G zH#R%0NCy+PG1xloQ=EgO?@07_voelf6SJTpU>1l)6=AAdhPf(ePtgqq3}}T+3T6Pc?sn4!AXMq^G$Mvh5`=EL0*))9$alXS+%HYjOe%XnxJUj^)}s=c0>L~cZl-!DPgv3p)8boQ*mL~ghh#rCDn$zu+7vF^9dM-3?SyG$AJ0S zjbN@|X|PA>z3y_BLb}oIuRLAb%F}(TJYDQ5Q{b+C+h;>C(cpX?m9UNxiM@>j3H{V$ zp!=Z$k*wp=5{4qu`NJa)oksvbX29(yyXrCx0AB*2yL1@@Yak1&@yn|5FREe1kZ)6+ z{}SH?!4;A09w-Vd?29HgVCLj)7lS1L`~ZR9ngQ@{0N#Xw(_JZP3>KIKs0SchZD6-9 zF@tsfoQc$U33m|H+B6Hevw&;a$2tS=j%`TmtGV&j`S#U$O?5Yg!HSIV__uHe6Yie* zz-_1&_yYuNl z{@Mw-ePn1zqlW(l@^C_~yA;UBx1n)_F_Sx;yvYE3E5Ku%$I=pKHL?i8{vxb_(5uz@ zA-=GJhl_L}{s?07DL!XtiQNGvzcKeEqZ5QeK!KWeRO3%TU)A}p)%ngfctteoNsdyF z&GOBf&@HOuNTQ`jrl+I7jwIwJ>wx?Q$ZV%MhQToo#DWK+wJJKvZQYqT2h^j8`UFwe z+6lP^a#0j1c;fA@Xk)K?OJkaju4?%QDi}?yPHzOO;lye#>jbh=1FG_=)%b#Hd;@YP zkzmZz2R>zrFYVkTaokDddULhKLQNj~`jvLW{N-LxR-X20@B`gdn4t zAnqhcM^TDCBno{VR7PL^lqotoiXtpA{*^Ex3D}ZJOJgNVgYg14mZVAe5z;i;Ev`hC zl0lYMFuqQ%_|nD-%*SJe@2?~X{c8#IkYF51uxB?UXtjsubkwzIZzwM)B$Qetf*y+0 zw~G_1%Y&i*rBHvXjmDEq>H8ql*1h5~r@Oe%xKlNrtQ)~k5GSm_`h}|Y#`J;=>`!zy zQtO5gVacltsyu-y{Q%%k@57NGswlP z6?j=P@t8;qPaXur=>0hQLkvq>84d+QwtQ!+2n*oE)*7%v!)d8iQZIX@*)DtQq^;Cz z=78-aVq4(|*nV_C%#($6lhNP_e;kvIm0~1(*wtQA%)!;dtd_!>1U7@kHB>P+xNI0< z8QW}g!RR1G&i=>1XeJn0POv^zissbct0ecUbRKq+3&n%hc205_t&uI4#uRtd8GXp=okXjA3xf3Am&Vz7=+6TLvKT z1puE);APGN{3^gB2pq>(q7Z4g;J7Thq6yn?g?VbMnqYGVJ7-9rv=p5-THRKHwY6ko zJ4zf33$w`0!EPF{Q=A983P<2gqNpzNomKf=Rrz^XF2LbT#@Sh89nH9rK0j40eu$Y^ zYunn4TeLz79rOhSB{ljz9~{IdW@|5kS>RDL`svb9v?=9tq>At!>#I`ihhJY`jgp(u zHE3@jec^$pE9_--x3+99J?7)VFQm62kWe;@#N?oSz7##m(BmC?P+RlVD#8{^8tn75 z|Cgujkj{G~Y2T-ewjImZ)>S%hDC}QlOCY3vK7$@#(<7fA-RSWjJW3Cyx6Sm}L64pE z*h`Otc*xJwThw+uV(8J99{6 z&F}x-k5;=oqqDYI5Jt-6wJ zLuK^YzCh=kR9-J4*FfYO>x#%F9J~CU?>yBG->}9lwk1o097!^x)@4ThdKEeGYl-)n z-{aPZ(8198q*{kpQ6!XWS)nHS-jiqSE-`j3j6JZC82ia@3sDL2*GBc54MK3wJw6*n zv*sX*dqnX%DDJtbDDL)3A^KWO@kV8KUf4c~anH@FcWSF7TZ4klfrNs7X|xVqg~qj; zi^c`7O5BqQ)FK7ya@FEUvq%by52!w`sefV+(hQCJJ_F$!ApG(e5x)L45kB1$#?r5` z_x2-;B41CZWN zUK0Sm3E&xf3ixFKYgw;@uGPr)ENZ}_zEFAMsDdg%vZ{d43iV5U8|=Cketmw`UUuV@ zxZtZ%95_P%ZiZgn7ew!kH?&6(Jt!3RP`|oZzbpqkMJs4nzZDd6HG}FHmx0~_=#7B3 z{2>ATyaQdH13gfugtlNjUlr=DpibCVsJ~57_j9N#bEp%v7FKIbSopIV(BA?2RiNkn zF=4pDK~L6yYhfF7GRG424A~It*IM7iYT&&vn`F%4 z-#q;rTE8Mk^~)_iEeLBh1a&)Pp5I?&Ccc>^b2t>{^KXG8b99c(gq6KoFw(&a+f}9J z4#+GTFETg%CCQI2!0W%B!=1CJrDHWPzXxVbgD}Uum00zLn;UGx;FEQAY5}FNHmhTBfL@8gv4pU>#$t2i!0>=tfS- z%&DkXAKe3)pHC8*#eXYAUv*@PN7oPeX#HaSVewaTQHI2pmabO*m!coHi=y8*Rnf=( zUA3Wx`g9D}@L%S*bHl=Y8y40WRj5-pp#+!?GR}Zy4Rh}Z@OS{vnJ&OX1-Pe!!!W0F z%Y`K%x*R77%NgeULfycE=Cg|7MZ6>t%zH^=VWu#T7p7bGSQw%?g!?xvtSPkbNfDw0 zSfW3s1`wI0LJ|$b(tEcFnwU>0Y0Is<37;$I!NfZ3Vr*j%BUfQ zR^gr~E?q{2Ba=V?p=}N}?+56i*#c_$U&-=pXUi|FB}NagFN)VkH>_EI)R4_b4cT^7 zp=DG}>!{)>qY9UfD!N_~i5OCUxkxtkrAp@42gkbSWTOvRyPife`Wh}9gsRQZI4({md;6T5S{V9n>S@fgpDKm#KZRufFgrjo0<%3CgO^n2?jC|7^Y2Daq=e zpu}qRc=RCfKVB&K0l^P!<80n*)@(kiAfYl`iOua7c~Z06b)bgkN6gaT)oV&Ns^WUA#j^}h5JY0 zevzEfh_y9@o1rCm$-?cpbgdfr1hV{)egV&YSLG}Qo+C4vH&N(QByET2oCQ95L+?(< zzxVbx&_Pl?7*~bAyI6`YTV05Qt!uyf%HhU6A3w)%nP~RtR8K4`azHZ`9-tk41Zm+kZ2B4NZKBwg~r)D!OKj1Q+WM*9r(rvcCPL4<1&X z@KW-<1u0z=!g%BNswy9a=D%+i&3~$$)KXc>$0>{9Y7vs+BACEW!HH$bw&?W}y_S=F?pLEl>)tB>YY`1Ie802ud>0KPq}7>%T` z77E%2P`@nT6vLNa+u}MJQ>*8J(>1q(YwRpN^P1h^3wyQ z&UU^tNlt48jXS|NKKc4;8IGQW!Yh9ih5q_ta&&M}GY}rf@2m79-^NMa3gO2^zYu>v zA@)0eQtT@f+nq#O9P$zQ@i95`ss7c}*QH>cHagEk{S>Iv-xSpPYZs&47-GdxpBU88 z`jH7#kiP!z#o8C*njW8896-=1D$cz#&EBgP}ou_5*h6EV_(V zRtczC)_ANjE?Hi%T(Hjpdo!@-3w9&7@TaIzjMf3vV>1@`*wqC0qF{GupMZY}@Yyv2 z{+WQ?r$RLcjQO)#p6b&iy{fe|@XO`qJOTa+z^w(+-w(Kp^Ja@*t#p^W){`w zW8xO(;DMs?YiO)kLo_C>m*ybW+g0RXg6R4?VctyaX zUMAuYPKs?gCzOeTdjYshfV)L-Tl-JgkYQN=D`-O&Ew2Y)z6j{tq<2Q74+`i>8%rreFrsj7rEk4S8GezXg7iH3k2y z;7voA=BcD1RbaE4^1p(88Q80UeP6JFrZ9_Ct|?Vf^BM#8D`4NZmazBOpj=~^sVdi) zLE%%)c}vi*0)1J%pgRO@bq8}`tJ0k2-d1O0sZfXfT)?jZ{Pnd3e4c<~%{fiDh4c7V z&s^Ienv+G(YEI%8YRI7fsU~ruJ4-a}wm7<~%6)-vd8pq~N#MFx4EU z4`aOU`C($%c< z`&TV;%Q?NOffW%}aQ)1onO$9lrA8CA~ufTxmaK3(T~6;#p`^oqhWP`F@yQTU=L zSPJ;4S6)#q1=){=Irg2hR`w4Swn-G9h2qi;M6pd2O=0;eTRxvFBUTYuqriUw_{a?f zepOCjyACR_3W*|5Qfcik_~(Fs7x)(fX+3joszlA2pol;C=<`9xPXtv)7IHH|{u0RN zM+q|8C>Do0GB=e&PEHb?a`dUbb@wZxe`_N}-yw*8TzPagLMBVEe}USifWH&q^8n7; zSb(zwz_+gjn>GtHb6o1_&-N+|pDzhJY;`f6P0y2!ozp(&2%UWL0;Ja3M5K-u zDW`kt(Ej+UDw-ghX1`2ZQ?rUG7b%fu6O6pfAYreXl2w zmvwalDc`3F{2jpe8ZGdj2YeqajJ^?V4?m8)b+O%>N`1>+pDo$5j*8} zws7AA_XBWu-XztIF9h7q;)}{jNz^ActMa+0@ID6brLBZFS9sg|Jrf!_y)>fm&nwh4 zP84#XexHEj!SGXFcNg|2V1K-|u#Xk?IFJ3C5n%rnY)7E}K|NZXoW+)zshT#A6#R+m zMGqXet>AAgXT1;j$N5+PeGl*SV-Wb1^R)$i642L;5%ja=oOglh@aso==*+m)YA8+x zTGCTiCud9KtD9(30ED*RUWDEkp=^oVB;Y*VaBUTA1^6@#|0C$rfL?0{L66-u)s&~S zOW35H0cB+zTRQX&wn4eRRnTVv{WqWw6?B&CCq03Dd8|$#<@-i~pAGnPI|}@qfbXO7 zd{3%U(=8Xsxq#fclRzHGakw_zdWlduops>WJ%!p6aC%uaPMw*3FisZ<^A0f27$?k2a-3dNjnfLq zDW`2h{T`@2dkOW~fYXhtaTRs#P% z;Cp>u;A6K)b>Z<#bGl%~);_phrMmiG9RbI}hJp3>5$2)7%<96U9y!#7s>ms)Zwd8D zP(J|moPg8zJf~i_+_tMp%e2p~s@`5E)Tcmw=?g-AAjj+Bd0q#>PPx5UxKD%o@V>(R zN5C!LGOtp`qzTj7m$i5Dd6udi|4rXXe-7j;zbNF5Mwd(XWse_9*GgIy{FLiAh0T=6 zz=`__dzP@R#=T2NomAv{W~Y|0F)|-ihqV$YVrpcd?Mnh)nPd7k51(hc8hpz0R|Ne$ z&`tXb`i_9-k8~zX70Z+wwxIQP^OLc_Gt(8Lg#8lOI~*YF-v~Q4PJJNg!Vod7&wn^7 zSzEvBGgTpww^-DO%5R~v=Xg=sam!qedJ1{r3_>B5PbBo0K_As1^cJC8o^J1O^OkPM zy}qKZ9o`JYf{YDK-ZyWkksY}2fqS}e14HI^)r3+JHZKyuUk7~c2?BpCCz7qIiKHri zDv;}i{RY_o2K$3RAUmI5Sz%o5l+Nh8YA>TFPi>&nT7dl3L_u!7RiY<53bC*!|LWIu z;5lhm#13W_9uV}KK)*6c(EWlA#JrBf%;;VvyhOg+4;-(FV|{1>RHm;7-kB`a?+P_r zMX%+7LzSxr>;yZS`K5aV`WB!sO%doD0yRxzLrHW%kIn=vxdS2tlczSOFiF_Zh`q}V zCj@Y!kp2eJ_ooVJt*wjE{!FJ7iPjCpd&$?#8JL@^gtG{^^7S z#KzlX^7DAlM>ziS2uThmvxMNh4bDHO3#VB)*&IB^Lxnk*LZyYFLoojW=J^?dIbAT8 zXWMGsP=#4uZ=sG?o8?Qw4qK}vVBNiUrtt0(UR+~tJ*u#?RwHdL)N&P2^Tf1th?yAi zW5>jz7!7PC3V(vaowG!txNR|7k11Ul|JE0FCJ$EwILzHmh5Tobzj~06cM`JY?wUf* ztcKZK0W6>AK>h{DVaG**{W< zZ-Mw15PvO1%l=<&SSkCb$2s26XsdLX2;W7^!Tt)$lXHafiBP6eyoMB?*|6}U)?Gd( ztW3rL(>O^Wq4-A&jk5-D`FsY#-6Msv^f1mhs4^jM=gZTF=elGjs zqy$BC69Iexz*_)pxLqd4?t_Og$9(*JCV}!HDAA!pnI)8LCfx~8m`N#6nlC!EF!~6P z*8w?2AeJx76un|a8t1jGV6|$s+&Qge&)-IsEV=gRS486u(TFSAjtvXF%C$C8s!~)l zM3S;4zYJG>dK2+Z2B*#E;?LP-xJkXS4M4E z*iyPOoP<=!%{*o%TXWuF{yr(1A5#Y2ZxPLjJEZwr5VdOgn}hVJ42t=q!u>aC`R07# z9xL1+qazYhA)_n9=5rkIcL2YxRp9ptJe%VmYV$><9IuX_X8l9Lei!Uh+JyagVO!S! zN~jgH-gVminr_Q&ZOiuUt@1z3;Om6_DZ*}V7xsobCK>$128Cy}Y2=5ZP+l37gE#0z zjs!cX1avx;hBdn0T_EgMVOu4jZfI6*0szNv1~OER^M!dFm{%9hlVbQ5kv-6)64s{^1X!scNe z0^Mq-a&@=`$gl#a1et2UX@WZmxP~JHcc|b@1D?^bI{DsOlh1SnXI<+Z1aT@5TPzmD z@q&muXiu$QcwR?4{a8Tywnw-s0TdS4HwAgRxnSNyTAOqV<`;q)8TY~-6Tp1F(6l-b z?*sAQKztyG;W5OcoDme(CZ2 zApVQQ|5_0L0c5bGr+;NW3CYm|oCQiiNM*j-ZP zdTZS()r(5IU#joZWqSs+G&aztBZYgYaO1Y)m328rxn9R;p}Gv?N^Ko| zt*nL)hI3^!LS24X$R8s8uk{J}dLi$c8P@$NMg9zkXE9K`uV093>{>ohe9a@4FMZ95 zp`69X_|C_L%LI6e0OR5oC;m4AEU#CyDRzAzFXf>8-LIto2;B3Q3-@{9TAliY5Oa!` zg$%2`?+WM~a%aC40{T=yfdW1*tc(I?aq@}?+PR<|v{GpM>{hOb(uJ%d<^fZMyjfu9 z0XFU^fprVaYP)X>rl-57R4zG=)Gse#M+xO4lw_Twg>tb_){2YhrJz)@NhB~0jR(2! z09)mGuCP7^>jJPI6;`auXRTYfP^$b*A?9o01TIvJvjz1DP-Bh})LLT`#fYJn2`ZP3 z2~yCVA$^|$wAHZ!`l^6}3|uOdOa>Z4KI_2w7SjIwH-vM6aI$qs4^Uwp5<;b!CcdNd zf!TOKFh3WJW!jeoP$|>A3XHSpigE5te10d@5&M8JN{bpr>u%VZuEQ z+@p^Z?&iBE*|^`jg-OcB{e_;-#xm$IGruap;{jar1OXl)z_^shfcprrTvtOl#=^;a zP|D{B_X31jd!le35U!Q-ZH1Uqj|3uD2$19nFnAY0zZX!TB-;opqa<0JysCh95o|qq zlF&BUqg++C05DXQJYcFYlLU4#V7Hzuu-O7Lh54&ane20mYRYPFOtGA(XetwC#g2kI zk(8cxir|hGTs_5Iw?7H4Vy>d4UB=^AvoBeUm(&dBp+oQu4a(Od+m4u3T|`4(PaS<6p+0 z5ad7fyTB^st!(}Z44u@b19ZjBV) zWr%m!w}khE@B-aB5QZ!0Ru(R=UVvT>=%(ijG}^mdy(WWOK?(A>sUEB)%qzhB6wJ>H z)AV3np|$I)*_jchiB_NI@*3aAM$ozUanPhp+H zaMguFM5Ag2>%aJwD-(|h^K1n0txJTt%jXl_jWItOS+V6z*#j|EU1XdTW7UE}zXo}H z^HQOIUFg<+{!6$O%S4iKSfnEg?hbEtt|XSs8!2Cf*f|g$+2&e{%62? zRaikecoQZom4gH-Uj_iY9_HS-On{^IDK7(m2D3sHo90iI8unHJp97~)TrS|50*-4~ zeF$%ea{mp0D;2H`vuVM)Nq9HF=ss5p?{eW;!Rj7SS&EvpZ|?8z)fwuu_==~Srj8w~ zClGWVPaGLV-vNJvtAzi!@B_(qiA1?%R}G(+HblM)k)5s3K;=@$)$k%6*{Rb)!(O z7fN=x^e8}K&Zj_W)~+v*`vJM|CV~7`AXWwrSM;0-N_DlAhhrT4ik0M5+w9#Z$z6_> znW*m9;TjJ?qyJ{n82ZK3M0Iq1l{R6DSD*%W9)~y0MNI@8_JO;|J+l6wwP)sYoqWHO- z1fy|MSx#vz5q*m!T@J>Z!Z2gvA;QRMb}W}bvwtUmAHl@7cL-peFJ(0QVA2t4wvV6J zY*2m-%D&$d%7H@3YW7@!!WP5?Qn6$Hn$XTCQJdWUzb2d71e=%IXrW#R>au%;I%)qHwJ=1Gw{dPM zYdZ?{Jc?i821m741RSfC85cRgdj;4fzzvdZ;P=Q-&u00G)&FX5#J?EyJ?<0wMMBRu z2<*q#SNay}q?S@^i?-KyWUb+qiD>hZ>nOz=df>{53AubhSmTfkkuZryuzKr3yg8w$~|9MdG?*$CAg}E}rf#R)VgY;z} z|K$flZXRFGIQygrWxNWRvIIm*z~zwn<$sIJ^CDvsXD96{6OgF5Zvett`{&yFas|kb zKP=?k8_E;FcHPxYKuD%60Y4F$D@7bO?Anc)nvoqr@p*8r^OD_ElkPVP`|a#B`iR{?k3J^AsRBI2%@z(_F`{tih{D_K zsrit9TWU*Tp`MLFWz}!on77PN3FK>)Q?x$kRVu!Zek?LS5t(dV%&w!d`m+jdTA7|8 z%-6vD-Q&WHCZv@q`-`dzBH6qY%7JZ5$4lu39(_V!I|wWzhkitG4F5jVE>a!k<@pVp zp@iQAKQD&+#PaJ-3_lT-TSO%*2DUI&6GH|zmBL+ue8WlMr-J-lAO)87Rx2s$epOj? zo2jN)H~cB!kN!;H!zY#(7M2gMqOeq>R90TJ=1qeSUAH_XN@t0Zl^0f>R!l}>ksu{D za0-h$t65I~^YW*K`R5$>ENUH$`#ga%rhh5|Cqm%lXGLJ~q?BpacMb+U)%BY)jm)tE zI~lN*zYy5t0ocx34p-SwSH9dZlX)y*yqdbA^Em--Ik`OZwifIl4WqA*(#4ErX&)o> zYd}BnS3=cr`_pgQVVUELRgjAhF0Lz%#Nr0yUxc&{;I9Mz)!zvI;HfFY zTMo)_Eeffi z2<1ydGF)FRwA0AJ^IsO)X+q0#{e&>9t3(#MjL|CueLB#6uL^qjms3XX5NK{#lEuod zc3?To3Dk>+y(XwuK?Ota=e0fPe9(fOnjpGWmCJWG-LyFDz`rgUt$Fg5v$)FTy)Pcv(jOAk;y# zIRjqC>~>=IR+#BW1RAbzsBUhce`?){zYp{s-8;#mNE6V05628jsGRUk+V{!=$6NJ159dhFTAqB;I}$%wY_^Z&L1AX292z@7^XS?1Eas*s9y%_N9q~In~0!L>h zhz+`Dsz>xP6yAfvd{Hpd8KbBQEsV-~0Ojz*AqiuqSHQdYJ>gv;yr7X`EK-f#WTX&q zi(AO-4+Q=@z;AzF;4cKsGSnH2*#tf0m4VIgft&e(;MSd;;dKR*2YJD+Vh+TZuO2K+ z&l$2n-vR>*J`@Af#DEE((^N%&o2DhxwU$$zM$Um{*T>02{W+0;SEun33fD(OJy}uL zeB>Or(t_H zYQp5)){wB}M3@yvZmB*ivCkm(Ujo9Mf9qp6vr5H9o~Mm7{!0WyWDgaiV*3hWkBdI1 ze{*8CWtZpRTpxQ{dv6?@lhFe$fbhMGo`B)}mWp#P4Z7>?yqO z?jgL6g7BUeUYZZrY6ID3>&LZhnv0cd*~?Y;-wb1W76nu@x2)D)o6i}Kim^Nwm2uXR zn%@RPUl<~sS>-q-eVris=hcPCbpSJ$hsk!MZlg5wV^N?}oHGX`9zObixo0D}qZt=`wU39dL@pZm_>%AS7BIw)HnCMrG z_@v7=2lVM-~F6~`Qm+X=W+kEKs#+lRh zcggv?5M6SHM|IKu#ZsxYx4+cc-P+RGUh3gE>-OG0CFe*ic*KeA^Or81*1gapx&s9GqLu+=y&X`e#-k2sw1B=EXR`LimzrC9yE$CHS6}>{ zpF-f}BAzA9a1qy5#OXmqcUXHuG9MlZY!QdoaTlfOEq#jxX*^1~9KLB$P4pg8J!+`a zB6lzX6m+bJ(BqAzP8=|P+<-#{Fw2%(8xqE4E zYrArxOAV(n6Zkl$`c;R!M3abb=!0vqiY;5xz060eq*Tt=D-(Ng9Y8_6e$AB)PS#cm zww5)>rC_&>N*&$vmoAW7zvq;$Ykip7XyOKv7Ztv<(O8bn>R#U7 zJ9ELD<=s=;I~Fd23F_mra4!GW+cr_Yni0d@G28kgU%RHtmUguzt&-!^9j=}Io`WVO zP9CCUiKU07ZPy5_=AZ7Ec&nf0_OvN+lsi{{B|!S}3Z0GPi!}vR&T8jJ=`6tSOa3)Y z;zEbo5oL0(>f%FM^mXBup8lo1?WzaL&zFzCnrG8((nGs zo!u?{CrD!-&M1g2mAEG|&RE`hvQu-`hqY2MDC8PbrJlJf&Hh5jLVep^3OQ zlDM9R<9pX|ndbP&5_VI?F}YWyxvxO3;Dft^ic(T(H+v;L`yg8e2! zr+Rx?oGLxL9CnXT_$npBeaJRoJ13mKA^Luw>AvNYvi9o`A$>Hsqq}Q*OQ7Vz=V1~J z7*Nki<5;nN>2^ZutB#}*PEyVWN4f;0x372l*^6Nz(EM+V)jjgGJL&CSG)-qN)81y)gtGA^!yd`2ZF zZs6*olGWNXT9!>~S=rtz+3cmmksR1fng{c6u8ZI+V~(9^FYC?(-j2lU35m69qpjjL zR7I>bgRUqK6K2kxF(+;E-g4SnLUH??RH>*VGR~wxW$Z~ej>QodaU7c?v z-Lgy@m|^JiV@jQE9m`7ehJGL=)UW0PSrT0F^ZG_1j88`N)|07Lv&#-XaF+`0uf$?q z^mX5?2f^iizr6LUi?&s7DiBQ|zoxboVrfc46e*h&@|1*ankZ_+N`1*f#0M?nj(~d1 zy&dhnCFw$meshH$L2a~dEWb2sN{#yLltvOwU8-siR=l{54MI3IxLxV@l5* z#I$vk-)46dqtA79$J-I3nx7WcdFkzKUDWGa@7e)6E(05@zIjjeQ{j$c%`c15^47jw zkaZN~eIKMQT4>5LU4tdHKRPyxLC@#ZAJ(rnx~yV(Xzyun(TYFy30juTS>E2VI89g8 za#0)AT)jn9D)sfZb##~Xr5Al41UZB{iA`f-U;^n}xoeb;u{orc|a-^9UCbYt+ksJ6}vu0`L^ zOX?65*opOelN{b&rOGR*+UTHLR8%!IpFOKIb<*6~P0e$fCX|{Nuk6%^*-DL*OZupL zf6(vEjlL?zYinQ7vb3|`kH|QR$Q3B6sRwjuUQn|pt=x2){*M#H2&3In**-D9a6q10WybE&js?{P}b zi@rLli+ba)642f@sbXEKMAk)@$C>Y{0apxZV}f#{5x=#+iA5^Wq5HfJ)kY7kqk7y% zF2;3d_ws}LSNM*T7H{pY@Wijh?7zymS>+ zVDmAPfallok(ewo&t5;6$R3I6YcfM`}Y3UMJe3iQj&S1F8YPI zb4{1N{n@&Bj!e1A?N@zn*XWBu>ZkVb4LW6&?~Lf|k?7o=QN(@Kg806r8+-Y$7no^D zOw8K5AsO++A+)&;ON$ztAPVD2)s_RB*@)w+Snghnyj*8=qmW%aOZ%xhO_U-PKz*VIP8j#+U7@(D|O)d?y2PlG0z5PG>xI86hJq&B++ z`O@mi&eb##t!S7>X1j?(wCKy$_9=gpw#G|F!Cv&jmG#nhu&A`;%;?osM_-8xMBMiK zc>3ymXPeiJKv^-W=Y){f#Rz41>f(li!R!xq}*(u(AzJ=d2@TK z64b2kkF_pBb@+H+ORqk3-{llYEWYJ?1vPKgFe>TN=Nr9|44a_(p%I0j)%K3A0b`WhEb?rvQw>vCFFs*XaU(KS!FkyE9C(?w!a11C*x z`H_Ky6U*f{GJxq<7hR~y1t&O1!A-C1FnsVLrarfPQ* z51V7!i>rCcNk|!)8Cvp9oM z(f6&YVc74LzCjOo_aTk0w`q4Dm9YM_Ic4>c$CRSG? z?xxb2E8?t?I!#z4Ye0}SHSZPtD6*v4#w8tH8d5t;=YR?hChE&v!C7x3J~6|5J5 zYT5ECHuQF4#9HjcI3PAojEB4FunfVwPgg0&di`**F4`p++=YD(g`vmca`l=@C30G~ zn$$%deNM2eQ546Er(HA*)HI7Wz_fNtGJXoLF8Za{*RZk`d8%6d>Y{tJ@gf+_F(ndy z4$uwhRHf@zj1G6rMN4bz(j`kfTQp76Ug}=3ps&5Z&wu`C?22)dWFgK^Pp_&CIjC`R zJU>0qrCO7AHpXhCoLik|4yq3UcaC!bL5c!kT!b1F9Wv;C(_lSZa$ORwgy zE;{~Jo40DwP(`zVr6ZTNNOS|U{q&W_qFS#N$VVNJpl_69I%2wfb0?;{XvZKU+{c;Z zd9JLo`qf1vtkTOF%V?f{Yg%!2C9P1`r)_mjr(>00`wecbI8cp}zRMNNgZVXWjZ@}* zCA3$pLw?*Jx9iV@?Ygh9$}GiB(_$Z2a$ZxS;tHr{-Ztc?FPLN}QxI3V?7Xc~ikp}A z@OhHo%-H^LC2YY%2Le%~1QPOQx*aS11>L?K7)3 z`fIhpohA!Z0(w(Mg5jS_b27Z6H+c=c$>#p~bGzCw>{D%NAl8rNbFRL@O|RznKI2s$ z-7rd?`|c}~j%(Z7HBMD0Th*CX3R|b*+8~@qwjg_1kZ$Y5@{jNsMzUh<3jVrzV2=>xk9i-<+cY98Z z9Cw*~TQa-5J6=+e;$#9i{rIDmiDFdq;r0xcScRZs;>SuqRI#{T#iB0y;zpC3rcII@ zl64OEYhJ^2*^`tnmKyzPqdjAuf?CQ4as$1|9V^1FT`rL0%?86otX1FC_eZkzpBl36 zUM)%?bG~WTzUH7!_g4DmMJ;XJ%TpQT`=e`!-FZR0IUW6-?W<$Rs}o=Ia#qN+7YS#N z`7xoUIZXL{OAuHSziXz6iHT_#h4Oc>6|Y>X}YkZJyj z(K&1Of~++gyZnu=*1K`AF@7?OW5d?LM)|B48Cj`wGpD;Jn93{f`Z(^Bz708k=cb>* z_<^YZ>UFOebq(I$Ojz05(WxaXsxp$57prV>>Y}?{uX^usl78tx)s@)t>Y|Ufh`DUh zS{QFT?CWpQgN%n=-Ti?95o=A}R&$lIK);$F>=6I}pB;`=3gPkqYe3RX-!v@6zWi$8hK#DN z08j3Ki&aj3jjoNp9u_YR6PvYIsFmh)VG58hn7b)W2ZS7ieOGT+o7D9g&1#I4`?dei z4Rjc>fh*M?Om6++cP zF75X+5kX^v1(&Xm>_&~Xnl*D;&>irvigh&xG+Rl|Z9y#GXTDiM`!^23sg;gW578Tl2?@&f|H&_>I$gs0D8IGsl{@ ztyBqVgtgk0(0C>9m_RJX;2bRKf#&BGcdU|i!Br^Pghflc7Gu_ISrV)Uw8|fT_p~0! zmM%ilO;k6|T8xT?+R&aO0J$XB0-96L^htOi~zPEU@MIM@q zs92w3H=NShJ-?-MTG-XATA4<&2YyxNJl_a7<4L?eR}xs_C+X^{p z)qO$bP&PM}uM_rCZE{5=?io$zD(R}M)4jU65{z5WNDdq>q`^;pTYE;A;c?)>nG^KQ2kRs=V|#eO zfuE^g)$09qqneL3Mq7{_qdlT>bvNbeSy!&gjo>T|y2r}Znz>O_JQ}g@LsB75_k*dr zsM~Br=?9kOz1V8o%{O1&u5XpObBJ9e?wtZ07B?7~v2K2NTsGgB3GK8onG+c;1vtx3 zMTf>W(PWZMKh21!AeGhASifH1GWMV5ZI%>fIiKa7Yc4ECrS{(5uI|{BuDKw|_anxTjqgy{4v1trN>J_V;GnnscgG!AYe`1^j(cu8SsV zMPB&=vzh_1+S=W-(hcg(bg7N&(St6|K}lgP`ArNrSwTI*N=|m1Anx=v8Gh2=u=;R| zF10;Gi%rAo!a2LdvKli(BEgy@!*p`kn3@cfvBa@lHt8M3DJv7S9idRYKR zI$17&!ME0Ct&=Ywi_#^YQqA$?+MD3aW%=n4eOLG>r)I6f%{=^Bu1Nl4ut z+;9(7MUEioKWLL?a`doFtJGsxxb?2`Z7?Bm&jgFnY>g{YolMq z%!d;US&E^LqnXU}G86YDl?6uG+B>pT%NH~Kj=Jao3EkBcp+<>5`s5OPMUvp4lU>Sg zkxBI<2s5kV-WY^>iti<6r_w}|i8TG{qNU+@P#(7$GxLL{#gj@&=X)mW3#zF;QH*3G zQlBQa+{&g}Q;-c}Tp7SiQhAO?Xj3N12-n~Y5^=9X-cG*BGU(IQ-?}C)^J;80qAu?f z*GAt;Hv!I?)-Y%C%-PdR+6g$lX~OK8%`+#@aVe-Yt_(xR`v(1L!FOe`bs9QE3EVK% zd|%O0w7YDk^=d1Q*+yGII=!%q(TvCGm-qB`FI>2?#CarLrG71PWod~FGMcn3wW&L= zk45yg@3WVfJ*aVFV{|-w9S5G`6B?Sk_>UN3%JRW9d%|U1bES6sWHKuBbrKC0eGMp4 zi=_bZNJbQNE-=5^=;#!`#l3w8xBto13N@c^sY*ZDOIhOqj$zk6}g z^3|)Ydd#&YOD(RWD15De5>pS^@V3qTUDbl+#U={2wiaa|uqCi)v}%@DG9^&GtzGQt z?``W?upq67W@0?6wkS1TTw0mVXIPF(VLVoOp%!FT%S!DwYE#PFd^27fT{C#qFtK|n zrd{^XrJ29V3L+}hMsHP{7HVFi9hWIs)kz^%cRiFUOQ>$iQbZNj5NYs*h%z6nH@Nv= zwU*1*XcIy#PR;KwP&3f9q&?QfuUUujK3hWI2NU6HrEqeR^5H|c5|pe{`iBH~Seo|i z9@a0}U1{gF%w#osJV5^{GHQ55FxtWqHc|G%c z)1t?K`NytDurNr5Uq!NN{x??EuNB9mI(Iw;rZK5-Pu>=-jSI{Ke#>_m zi&4WWtnOM>sU~CcQfX#j)~IZF-<+vlK1WZf{uV6<*_f;qkwT`{!J1?=EQT2ctGD2c zx(a0rb84=v(3kEqdq%oZ;Y2Cd6Ow7oNfqoFU9tHi4Su77Kk2gIpdbs}5M^+aF-sv2 z4Wh(TPO3FKTY569p7Is-nu@zw9G5-Wnwt)-a^<;J6AjQNG=#;{*Ur9FH1&BKdSE6D zYVe@s*mPWt+L%JkrS3#sKX{V0NxL^}cj9_7gcSx(R)7CJSyJkvmA)i9W8B#`8@6$_ z=)`ArN}a~|qEi>$YPnv%&*vCtxGCRX?b;jK^mnbnnV@|mVc(u6$L|R#-#|jNSA1=) z-MwRyQB=IKN%L762ulZ5Ci1H#vVF|FzbneDr$|OW`=>ok>u4r=DjVvNed>1ky^&g& z@HeU0Ph11rD>)|Bgg8Fd8~p2{8`7RtXSY` zGc8-wrS5;~<&t%4nyi{{SKSEYI_pwFw+-lNO4qR**|8_PQ{!!>ZsTBWakx$v667;3 zy(friFLZh$bQYHOl_#wjeP0KcY;(ZmnKR~;8s>k@}GXZ0%6k`vPAmeCF&A^LNX*y_p*q7Bk_f~IOVxyQHf>5<} zk>a1?72ig9A~DC>uJwYNH`|e((BB)h+~tM2c&b|1b;6?T3utJd*SRld{&NL6D8i|Q zUX9*FRHdx!io5F3`+e-@(mgd~7=r~z6X|G3%c7w!yksp~g@!?dKVJFIU zb=kk1sJ>&YnHLVA`&P19ji2Erim_jOU~ep9&P!J z*U)7Od6Zl!-!QlC7LK}%!4;R(NlD!TmQG0YMn23RoU}J5gJ6Ooc8; zt_Q-T%5$!$Y@V+b{8T-&kJ?l*OH->U;p#QR;W`z^HO@&UB^}(jl_slRwRMTtrLA#d zFIZ>uI3Hh0w+AB#Jm&1M7ly5>q$To7(oX6aWOeW!YJkze!@RL99!gh`#AIRDh5 zq|@LfKVjO~t}&42V>-3ewO6(ktKYL>od%_|r5Z%7uZ0e(?>OJc_oC7|+(e9jX9U##SXNT(R%=2WT8>{I=cW7CB z3dus5rmlAt>T9_v2zTa1ypZchHurE-+^MnF(}_(fPg8KE&VTa_dB-AgU$pfbbAoCq zUJ#y2EZ?LJlbU@^XR~K(rF6yv$sFTn-D|qsaW&J+kE@A~vQQ6l;6|Bnf9cBOiI$(* z@G&s*PsdGKh7iaoYdomSGC&^KrZ4Mrghu zX1ni!hbv7tOJ(DJyO<3W%k9t^yt%{bc$iB+okX%TU95Aft@@pFx2^j1=aWe|J6qK{ z;*P|xwXd~*h5UYR^D|A#E^n+Z&F|=6;-*M8vxp~DT}oUR{UBSm-F7PhA7*jCmGN(H zqjHdctNC{){?%5h&rU+jZ_$d@7+{(KOh~-T=bY}7GI-NMu*^-gll5&A!zNB8Io)H~ zmzzL$4O|$;06bQ+6M*3Y+kRqICjS5|)=iP{Mf^CF!22st;EbC~u4aXl_w%=V{H0679DhcN*CH>Dn>4Di* zJhKwt3FdrSwqzimZ`aPUc5Qc3YMuKV+yqq8CzB~6Q97y?H1{Mgx7z6M)$GD%~TM7`)5 z$-AlxJFrDoQ^Z+f^4d!MZMH4V)#{VZ+_I6X9qs{P4NL2nbarx1Z%cSIE1^;gf=Na@rSyd^!9U;)RW zL9D@uT^F}(;b_ox%)LXX_fottluJIN#-w`MFl5}9kk~rmj>}24r|J-7KxXD=Y$z5l zm=L!tm(Z^^>I&LnfuxA}&fS&@erBM?ncz9~b?4m$;2LoHUca(`V#kufoBKUQ>i#rx zSS@N(Y)@y)%Fkj5VE(t?sz@g(N#HkTZn(30vGE(VW0_PdIFE?eB`L4W zRZkp@R^0X=uAguiEE7gWHHXCm25hhs)T5Z(+r4CN{{qc+x>6!j{C*?Xo@b+}_R+9}M+fL({<6>{3D4h7j+ z40OqehZwPgXe)^h%Zxkbzw_!?^X6u`3a@W@cALewRL)*@El{UrX{Pd4LiV*b?_V1P z1CgYan6Ol{u1i=dOS%2CxBS*dR}DV17@o`7(6w^;A{}LtW>ip&E3ZKqube(IE4sNd zBb9B-&KJ6EB(?!1)EjRz-5F6&2XNP>cI%|N%>;Pe#@?>hc6}wK{upm+sf+F-zFQ=! zShhq|OEt7wT(wlZf;YcNTo5yDqepmR8{NOYAV-pugT!CF_9CAhV-)Fo)hi5HDB{>j zYP}&Qu}+Lte!k%jN)EdpDoEY-anO!DX30@UR*dlP$Se~rFD9{)*!X^X%M@hW1&(!#+UuN zXh~2z$o)#cl)Nq~7UMI7f zz>ew@Gob%LJfPn!l!i}ZuyvvR(h!xt>sqHIL_5~0Iab+ejs*jic_F7hYwNkX2XTGE)!!xw-xRh^As<*XtdSzc_|6!cCTrPETi4lL#T21s|TumzXl5>xh_V93; z(2M42e0(6yRI4g4jxoFjyPOt;RmHW@hjGdE((#(0-Cazj&+697l$E{^ry>snI(aj& zbA3R%z-PwfWb4Y1DFw2bu&BLt@${D7V9`rn5!Mmd*)dpPDb9edkt%x9jA$!(OWW#p z+G*#Gtv=Xi4IeAr+{RT~uMv*Ff`XF_`kCN=!0NGN-9k8_YMqK8c5=)at;>UPmbkXh z&0V`A!u&$lnX&^f@9pRh%5YgYmnlOmQ=-vz(dnrUpw5>0bv!fOQO{Sp=~71RtJ>i9-G?M-Y8y~=Z;VE zc}%6_#ioV0@eZJj4Mzbm-|Hununtq5w4|qhWxV{=^=VLp#-$5%B;EM&duTCi0}Bj` z#X_Wd|DQ5H>mv~_URG|(HVgVJzuI@9KUQ96P9$Blq}T*%Q5$U%XA#|-Rn6?`2%bCF z(wzR-xa;LktIn+nc~Z^hyKYU$@z(EBK&AR;)}G$9e$x9*mZ8RWx&3Up!;OgnG2Ngq zjKo4Y%BJb0c=2)|*V-%0x2-}Zo!(a^v2b!G~)_1-2 z{47H8rsCKNUGu&+oMiW#a3;XVZZtF6Hh_GV0~6^nu4PuhG1rxAtIMiznw{_+zO7b& z%bM|I{M0A!S$^1COL1pTH>Zyc#o!yr~}YkOmpj=TyE0`e+L zHU644D3?|eYPw@Ow<)cvY_)3gcN^!%<_pTk=GY=naf;EW>4$iwaH(lV)0|SDKf2bH z+}z}sRtIN7`6cK7R_ELGf+$@-%MV|vz?IlnWZ%$FR=JV!D6{<3LDnc)4?$-R+N=NM z-dAMV82E$r5BJM7-&j5-$e-nGwb6I2J@YM))I2%SPvgGOu2*efHCkLA5!ZdP+~~yX zP7(je8r=ttK-w4v4W>KCYi?h=lI^6Jrm0e|hk4N3oFZn;H%A2p#8nS&IeQGKGMXWIrHsQ zX?$IDkneUR!f2utp%0L5uNR{ z6)%};zFNIM=$1sKxmC4G$RhhkQ|$`}nQ=W7Zx`1%FfhP`;au(qgVA$_YXM)SlL;!6 z$LeRljgAV@uB)|O-B}__)px7cM&~Cz7fqX>l4UD&ysJ-#+F_@~!=%NRRIjL0X;iJ9 z$;FL@ko5Ol&r#&#E}KniJ!=cATGD(drQ2m!-A=9-)!bNhX=*8*Cgd!f(_KSwcwBR2 z#yrVRREAz!q}>zFz+^%?NhKybROs^RlH$Pq)$MZBOJrYl4X$?XdsCeBz0oEv7Y71L z4f<(T zoeTV!6yOY3FW#104%ECzdk_~p3jl*9>Y2O!njmeO+G?Lmzlz?N?WS9~P!mmCAxU zjZaJ;OdbDMpo?B1Wd9v}{tWHjL6aX9<~$^}FWZ#IeNv!m%e|fc93nQSHbw)RNP%5l zb(HvdAmt~loa2c(eP$?4n~F&oq`dy7$G#{GQ&zuOaXjERm#m)sozk_P)*acX&@DVt(&ABJy#A;*np|;XQzHw0 z!oypW%nbT_$+jl!B**ybXQtLv&+X~%YH$nol;0;=_47z7>o8kfyYgA`jrF|`tEGz# z6k6Aqtcw=8pV;)<&Kd;xHAuahY?IHmw&Lo5w42TT;LPc|I`coRaavm4iKOxO=hpEx zj!a9H6XL#2meHLsndRE2jW-un*vXXN$i%q-=eWvjmUPP{T1JR;`-W1+<_-M{(I@#X zWk;9)9!}$=Mh&6u3wcXqI;xG%NmmM1*m~=dk{d1Q_@@eC%eLuKb3ahFO?MCK%wO0x z-QT-zU*>b2@f_4tI~QqmEM__~i9ND$(v+qdsgQFWYlgs&lz*m)qr9O0C8PdG__;+u~G@sbMlP<)hHnhS$iB(z>-T+WV}eENz^`PdG8 z+&t#dTPd|NrqzAhvD!{_Hdq{1?Cn!?#vb9NuDfvDF8UJ6?tAPb+&5HioZC6E@xv`n zmSsbHo5fsnJi$g~9i#pkKPSq<(39eBS7Oi=?X~=fzBane2G#jdyIETkT?p7Vv zu+-{yXF_nsG~3swJr#-7y5g$XYcoCC^bC6UAs7jyINAwBmbxkdy(LW{-}1I4Ek;^Z zPl=6UnVyomDYp(HvUIG3$j);jJHJ9npV6&K&Fy1N1y;SVkCp=Tm;$)%74$VR>&~~K zUuU2M>Bwd^DzPnuJ^s;PkeN2^R3eMj57tj6$s}{!hKJmu=uhmB&x(fbu#2BsK1TU+ zQuB))qb1#K3zCDwec-3gf zqQ3X+s~R=Ga^-Lk{j@f^YN?B>jWik6i=Ae^{$ZbQTBWtB%5hX_-W}yz0d4%vx5MFL zMoLiJ(zy09=;bC$Cc8WR znm5=6f+H;#ZEKEr{Fm7omIaEI`HGU99Xhen9<+kekv&ZPMtX9D|Py5?WIZcbnYMG_7g!^rq(N4Ra<;-FK_fgxPaS&2uI;%`7!F&nz9%G;va?dDf%} zO_Q4@&2IkESj{HfHYyr2Tm!AeUHbUs{?V}LrR$}ZL)PALdPiTMmcERpnb=Y83vR=G zsLl%AU2lv0+srw0X6kKm?5DFt^)?W{^|vn2+m-&U`QRy|_4YIW*2-3+VbRb1TW5D` zi{75{Z;Q0%MsH91w}qW6L3t+jlc(OEjo+4NH`B1_7ygaS9eR7tzfGAnvsrI1`nL&_ zCqw-e|F)z>2V@V6zNo>rQZ%!9w>|WB|NZWb-JN>FJ`@!SHAl%Ke%xf3Gdo5@23}or z*IjoRZNFXS`JZ!{himFLdbD$hgIY+7nF$%9jGh-n+a-OIbC&Y1{N_P#-mXLmD0_#5 zvJY9Aa*84thvUQTlDzS-%PuK8DcMz*T;xTR)Gv0(P!5t4g!GX;|9Q%e5eHTl+oeoW ziIbF2HiwXM7&SxL^X=j)UK-5f&Wn?k%?CLuAX4$9jdJ1;P|k=yLs>pZldxr!JyBtc zN*G^ZW6H7EeQW^CA*BrKX>vl!xa&$NCyB$wr-6teQwe3~j<1WYyM9?Z4lQ&_LwZ-I zEgoJe^u%2lNIQ;`2Z2|i?4!kG0*nkd3FU+xqeI#tZt1W9P&TPmrfejQ(@++MVyGcA zWt0`&Tns5CU6C^U2GaJg4kK_)D5tDQPnAxBCx67!Tbxw?f=Jzkt1Me;m)c>X&a zSNp(h^7C;Mc;n9bgF>|U=XoN8d_AG`DRv0ljf6vpGF8y13BlEp%5e}bazaPvj0`59F_<|IjS*f!*eLE zESU?a&LIXi76-k@@JVI{Wzl;nDLKkX&c~D#!2K-Qjw4@@S_m(-_>G$n6Gzl7mu45k zleQFEc?iOK(ni>!#u;yv%X24Aq4A8j;Ro!+i8deIiI52!JH(NEh=dWj%0Cm{=&Xve z*WZA$kiaz;2OSWKYol1J+$|?hA2$t>K?6Jd>7Ad8~Gm1voema`3M8vao_+C=HK4SguLIs#kaBkExz59 z2{|GYa==rFLw>cLbLrD5mFcG3IK7ytfkO9UkQ>&u5JC zQYPdqAEd|M9`PYx8?WK^!wg3^&~ZyTD0l+r1n;VIf_EOhZCejx-ea8ikly)v9&pcf z+xE$K*Rczn{~odcMulQ=w61|qc~U?OwOPl3o*^y({}q5QES3e>eRl%1y8qF4c)s=p z{(t;w@?Q}-w6iQ?G@1b2?te6v=TF`Le>kX5J)i^m-xMl_jb;%3_AB*Y;4E>`SiHzp z(4~LHn)sP_yKv`uh%S5PZqF9Z?n47V!Vu3ci&sv^uq-a&!83Qehi>+4e&v|>gEu_D zTDJnG#V@}T7mPJ@tt#!%uGM96h!^rxo*oNlGzrgTyz)#K{K0_-!^F+5HRETCZ{h4c z4)25kgE+Y3Hc=ONT*eD`dpAGQ zKzQOJ56fS|+Ox$8aYBEd;fe5;cG6|C#21J#=h?8hhw;|dJ7FvwSom+CD=epm$DOd{JcTq#GqNHa z>0L(`c%<2IEdGetjj-^Be!`Q5GdWsZ!r6036Q0Zc2xoNgGfaDi7V&Vm_&me2y%Qh4 zh=V-9#4n_6xZKU(XqX@GU>Uv8Jq%mvxjYW7vXL4uAOFNY~c7 zj9+*Hi_7wb@VIk_uBDMMCJW=;;&LaPxkDceF5IEdGyc%w;u$w{55s|HVR^Q?6?qVz zbb)CY+~Lj2vz1@Ma)C`;(vPm8W8}esx`>NxkoiJgmJZ_K$Aug3p&xu9W8Ces@VxU( z82B=G?&fFyp`Xdz@-y@U%jn}C%9Ll~B6nn9b!~ZkXoJHYEW@z7`J*3TamS4-#Nye) z8Xj)&04_XO9P*lHyAzIf!qS5~aVUQ~=%Q{xr|mv)hxM2(MmZ;Nk6*}@X}E8V%?}hj3^o_nmcxycq^z4Hw!L z4|kKcX&PEdJi=Kn;>U#>e#T#zhA<|Zv2S@kF#}=o-gS#S|L5+;SZl+634f z?xs%`mb>AQCVM6f7ue_ezznS*86xSJms_HJn;EEoLY$DMcM+1xFR;aWV?VS9&$r4={R z9m7T@mL^LFX+So-b0S-LDPZuAC>PvZf9 z+FZkjKZ_5($&q*_Gw$^42umFbkGM_MwUsV-1dkCa>EWUmxQniBbb(3S?c(Qwhpp#f zsUdcldgFprfokFGPIznCLFU2_j4gB_F;YM{xaHX-L^#}WBQ-oziY*K!4@uw-AA~2h z_#;K|j1MqLJ#n}b4nJ^tCl0)r#PGw7c!q0n;GH;J_z}i<#*OEYHvEB2+QBe6@Ju+9 zpWl^F8IcOb6wl( zGPN38#;|CsL?G7Enf(0FLiI4m4x+oQU>OxNj&O{S=f)g%~h{4^Y4fni* zXeqG1p!q@FQbOu^CoEWo%RA3s&_z7Lqusc1Ck`p%89$TSHhP9@aJSUOJ8{4^Ug6Jp zG@hVGjt~}H;{~Z0f5gFWr`XLTN*JWbyX6)VG&;sBG~f+7_z{OY{+5O&J;MVRxr;kt zz$31eIFrGya@$eYwz>}0WjvAot#la{G>kXG7;oGy4E!Mv!{FKCArI;)FbEG{q{G5m zI*5Zm?%d(q(#NQGZ(VbB;YS>3@@((h>6!3mjlsQAz8U|71%py%JP-#r!zK*+i92;O z;dqBf(m*)e=$DW#!jaCcbm0dtSZ+w0;SwIcC@qAy{I+zHclhlb`}0m5E|Uj&1RZK; z(mh)jSX`7Dun5ncI2IngF&%H#gjQw){Y*#6ecv!G%}jhcu9Gu%Q#;@NRD0(NFw&rhf!BbS%#( zGu!DZ=^CR8KV(TB7%p^pCJwyt4sVvfge47Fz_!(8^o_;=avS(1H6>K=wToDx)OhC# z{mqSVxPxk8%+FGYzq#>D9Nz72e)bNQ#la0}hhdPq^)T@#EVOtg)kwfFkR)*}$B-oP zaU%>l!JV8VJ{N5sZd^!@%ffSq9+%+|$I=R(X$(0=c;2B84X}+4cf!~^VGW-<^h3UR zw=fotxP&q7gfHAE8Qgh?H!kAiMqK09+|feP1D0tx;VJRRGt@ldLyx$GHJ%7Z&9tR1 zu%HDV{@|Fr!g$1iM@yS&I^p4oxcGA?KK{tjcmm(j!ZSGd6UVTKOL*R`RN%(NyX7}w zXtkh2eCrR9M&eSl;s-s#5e8b&+(s8+z{HJbY9i!;KfDp%i4QjZ+~FCzyXYb;`M~oc zUDjHF3-9OwVYqnbf-YD#y1w(jV1y8`r{cwA?Z7&7F5>nLBslbD6vO;bzaKK^DgFxD&=M{4ET3^Cy?! z$=>k`C5U$LzLl^`cCY4!JC|`?9?ty80n2ZmaW^Rvmv_6+8}l>zo+gcazgrjePbd48k1p1oPT-1v2OKxyCo(u~js(9=L;Hd_bQt#5Xxu#R`sL5(j@SbclCwjSsMqHU41X zZuCeGag2YXZP<1PGki8WCc7}7p)pGPGyAhi=Hz(i*y3Snlvg&z)I+=IA`RdX2Q2PZUU5f8xIqKHc!p2z_~S+x zqhn#LZLqk6rST^&G9ta)x7S4&_~lL*?(jk!?!@7aJ8q=n4{)7+X@*ZBsD`7}GanVP3=9zmKK71y;(Z?O0EspVT^$B$md2IOu zzr-hxh|4>d;ot{P#K)a@U{fBq(?z~QgL-B+UDN{>77R-l&){&k3qQNejXQ48u<$&a zJG2ZRUU(;*g*80h;hiw>jr`D4+~M8m8MehYcW}(jFu^l=<_|B#F@B+E7~H83h{H2w zfpC;7;^Ss_i_bgZp%wbuGya4%Ox)qY;*(Z;=h@s%kBlDixbWu=--gY*g)=&aV{yP% z#3Zh{8{fR+&qZ8tcqSfxCO4jqF0#TMUQAX-pDT)8xh-{WTr7G!PFA z{D}ju@eJNpx=1s;QZ@<4GZ*2x@Fy(sEKPby_%mJzgS%bE8}z9Mz%gD7pD@G&gLvl7 zGif!x@i$o*4sPadaV@^_$(_sMnw-HkH|QH*;27z{ve#SrO>5LBc0$827XB!?qK0& z`4{qlzsVphbGyqOeKFa=ugMcE(u^Ay@7zs)OxEzlW%S^iaL9$brIlymgfg{o7MHv6 z$+P7j_&i(Q;TK-U^Z!TNdw@%lU1fr0r3Q6()oZmdLeSM684>9sz4zXGZ7{N!VEBGwaWmDaLw#2S_A@y91w`vZ^hvD!`l^ZKn6(&BMCp+b0YJ;mu0%CCwBY$ zu0Q5K=bn4x#*KW{=qscnc(5OJU_yG*Pv-d)BdKFa^b#HDALK=OI7Z~2`WpF=p2$IZ z94CH5K0<@~aU9zy3u$m3kRP$49oUZv`*6+(7GeV_Nk7Ub{3ru;lQz;~A13rKmV^&W z949!i#8@I&2_3c(CypaO@}N$vlQxz_FOH!uM!pQ7wjoybG5VV&G1 z5j+G7p}`X49A#r29CCn zWg!j9A^swEVu^AP7y1E9-0z7_GEc})Xb}tYkT%heCF(*QC=2%y+^eyTaxsyZe+B9& z19^yVh&=4aI^j9>8`cRT`k<)LiEgE)wfu^)MH4Dq1t zL^mmME>JeH1=~ap)(IWT#dl?F6Tc81;vYhbe5e!0v5uH2NZ3bg!#*M(`*4i#qwUxx zF-GL!INAS*jmV4oQP(Lwjw3z#2~uQ#1R91OMHmqEtp6fY0(DsBhn)lOxTZY)P=Mp4p0w{V<~`yV@Qi7;>CU} z(SKN?o!E!EQ5Kdc7fTX1LlH{y zkA6gZuugPgACZqGj^h~CNsJNt(|JIe(|**4edvQzf1w2V*# zenS89v5s=>kPtu8p&a3{jbkVq6XC;nA#zFFBOlt1G$Kf3?vWp9(GG$iWg#EZqP?gW zWgg;A}-W}3F*k(6Wk~l=`i6K`iJ-e`;ZUYLu@CtOFYzz(pbVr( znOH}kp2iXKAU`I=d@2)hVIqD)8e#*^8786=OB^HEv8{x3Y9IEY-*A3W7s|zP)QMxb zS7F-(3H$Iq0Og@QxF29b8;D`!S(Lq(_<9#@!SVVL$G!I1AV&PZ5+!kRv_HB5i^T z`;doV!hUQcJ@TU`uubq`6k{6`)(M_dK7tv?akZ0`gfj3=0A&+>c+x@M(+ENu6747p z>zL3koFU>%ltZu*j7X2NkRI!(2kFob)Pr>*lk{U76Si^A@M%lzMt<`4f^~uueU9`b zp=_d$+{Pg$u4X^OKc~8N1Yf~*hZOz2XPXa z1S`rxn@|=e>_`ENFC>r z$ioupQ7+P8iG7%`j$=4SSjU7ia12jmWIZAck%2lf=1|A|@4}}7Ip<&xdJDaPeK-2m3IgPV6UM!a7Mr29b%hNQV}@{YZzF5&2l+YC(*+ z^3f(SB;-e4OvH;AQAmfo07ev+*oS=hZiU`M9EbtwNJNq+0nRWcvRfi1LW@2`UC4(C zc`T3+ACX1;K?)Tht#noiS(l#L=MV4 zm4P&5jL@SULljC<2j>xaP#2MhG^CCt(&IR>4RK(dfy6>WIk+1m z4eG)~^q_p~$5^8wVca1<`T=DSyod+un8-NMjU~#%RgQJkhiesWM7_w1ZREpoH6%SG zDI|>J`vCMnjZ%;bEkf;BVnW17LlSb4J=gO=;X*oQh$9!4nY zM;p;Td@Dd29K(cT*hYFB$5|n?XcyuH$MbyHMq1<{I7ywz!ErK%C28Y4pgz=r{iuh~ z5xY+DAO_TDgoM~I3Xq=QMqF4YzQHl1BmTfT>XbvWLqb}N4`S=17(h6$4@;yKLn8D@ zi*Jr76L&?_i8L`tXa}wid?u6K&JA_66R{A?C=2aGOt?$qJm4xq9<;>|iGqYY_rD&W zafp;yhp1GL@cH&KB-D!3^s$cpC=C&!#{2&gC15YMP!jqQM-eCKBXdLS!G1Cqs1a8n z;t@hZ{J3%@knVqD5pptHzA=MOsMZsE65ni$NFhW>ZkpLo|LCFr0;3U zNBI!vqkSmnqVJ8@nos!0ZLjbT+QPr(ivpgx|L3x6@UPiUo*?ZO=({h!jrs3!n17bf z9j{{j+b{>l<>QQZ`F~xvdiXbXpGV^V5py8kJx+`k-MG)&dmrQG#(msn`M*nmT*TLV zeBS5tck%hR^ZEDj`FjriUxr+NjX5ZaeE@8`dH?5S`ih7;{MXAV=1W!%jj~8eQSy;V zKqYlHiqe)R8kMcZWde21W~1b7n^GBz<*craP;8RRkb`C?^K2%z2iY<+F)Ge7!5Iv%-KeDpXqL zT-K{rQdKU;8iJ|pRG;j~X9D{Cu12aavKYZLffgIqF`_H@1B zNiePVMvb--4>DqgIg0KWO?0!8%OmCJ&`ISTqp&Q-mKBsf6{#`QR^p=rE59*H6(aQ* zBa`~0nnc&kStb#0thd?OxZE--iz*g?C7^0&qIK~!6b+=@_1Lh}A4gRoX`UMt(k9VD zu?BU~!uGi63e>BieR_O)=8kd8jS02=#umdkErtKC@Y1saXrcrYx1FX$xeL>+qA#=ylI7MQeqK&!&P5el zDxQeXcA2<7z1sGbCR5*~oQvEw>v>M43z=2Yihep1RMyFbqn6VP=2d!>+^*JvV#Vqy zNGIwDrAP!kaZSf)J9j(cwt#CLPRtTwuQVoU!suw0l1CRAZ$K7wCWo?y%~O`O&EuAA zR|(E!i9nT=H|E*6T%gSFBGbI0+>bad$&6VW2zw-sd6JDKg=+Y}MEATJLrOMxCequa zLY@!XOVaYr&V|f_WG3%~^%D*WYehqhGs&ZRjY-axX5mG4xwM~C=cReY<7^JI;?R5; zkxaG)heM;UYi(PrrYAJY>V9`By9*@Rsk$~gn2vY@{!>8%t9l9xTOOcE2Uo z7@Z5|%Zj5Cv4r%^l-SnYn9BNSP&E|ESd~zq^~Dm5Hz|~gvXy*A(&;G;vdyy5S13eg zkJ_ObuC)ofCt+xWRuc0(8?9I+P1fKrk8^!jc&G4q%Uoma9~n%E5aSt0qPn=d60Zt{ z6jiA!`l9ni#?0vpbt@N8m;2r9B;n^`rO{MI4IMqo8ea?rV_U-};Ov>PAe$4~sf4ar zr1(vL*VfNvdi5fx7S9qePqw8|l$VAUQGGgAVdWY(wGm|N3MwZnD{Q;uG9c)9$BAec zHYk0#C-l?Hey|fsPt%fU7`F_8RV$4eW_72`Tuaf^x*VniJB`zCkPXA~K-y)sa%`|I zPi9trJ0}xYW1Pk%FGXwW;wb6X3upSdh^Ywcx>`#lkc&eRVT7v+D}rq>T0c*$;^%&+ zG^;jkRZ&g>n{OpjvsXpR&6br(qp9UQw~$55jTl48z1@%~;cAt+j!lxEjtc;HG>@wK z-t{<|X)S$ru92~pIHNx6ofNtw??f5qniFrl-d+1v!WL~cJIA%;(lLlkr$HuGFjo}R zKtuVI8gqAK;QYy1ciUUc4Xkxk>u^ntk-{?>YqqNcEYM}(`kB--jR-AHj2l19BN z*i?J$j*VIc?le~_(TR$oS+Y@SJ4^+gWag~8>f17Qk0|SjEvBug+Nsyc<ghqH zwmi?vW1jesR_gi#v&5uqu>Dx@yva@123bP9m2R|@Hz>&D)3(HP#ihgnmP>nQPE%LZ zk;DZwU57`4-)cxj$9^RfuiI8rL(^T!FaqgB7MaFvD&umdK3{QKRhG_0skxr@1ZG_c zRWj0na@Z1~8!9i?UF367wL@j)hAP!6Qqc$~N|$f5hHS_k_Lk3UR(cyWv$_K3Uq%X= zK{eeC0Z9t+CDicL==bvsCGJ%{Ov*l(=_T?tLkXP;iYjCcEkP$;%yS{5w#Ip8<*sqt ziZfJ{>nY={(5S_UH?yr`mxbLsp7e!d1xGT-2B(Rce$tdCvvPSf$&@_9a6(kDxyR? z%9Tp>xaFv82zy2g6CKej!wr+nX{L+W$iR~rM=X)z($J?0+fcmN2q(fVWzWPK!)<9- z)D%he25V4lbeVVkqM+IJZ#hO*>KlWTf@fW9(0*}8<(liq6JwQ{DK{IM66X7ySzgli zre;cIGSlY_wKHyX2Di3rpR5Xsf@qeho9UTL4QyS1Or)lT3Bx3Fu8rvZZ6}1T}CT3@<8`HCMJ8jjPpCDVsMTKvZ32J`^`7=aP1e zRjAo^)W#?ayCT8dL3S3lBsC3XCAyyFtK4!>6VT;Am}Y%=>`kUhA(N@7_WDN} z)NIM!Of}$38}tr=H=*kLE!@ZrOSe^Dhy5P)!Y$Y-ToFUVH{rPY zuuW5eXoB7Jl=2i4uZ4{4dMuS$R=cu;-Y!E!rkTyC>WX!AqwjX9`Aps)$Rb)D+Z&l> zORYP**bU-Q+^=LKiF3_5nYf9|=v9$QqRv>&t<{Vzq+12?A}h0Th0IDy$8%YYD6N#F zIO@EskjEzW@LE|_bObJO!jzhBw_~oZNQ4JPk0;8iE9Yust`zW&G*a1stt5tARMx99 zCWX)G9t*~eImax!Tg6H**9oh;)sT*?0|tX{z_o{Co8L**Y+9XRrxV6~sSy_}&FV~3 zT1&8ks3kO+>y5c(C@&x9)8a(7KiBKb6?rULv-Kj)U8f}&59-pmnW6KlalOa%aB*trq_UCNxk_fE$CYf@G@%y)cDb#D%-WfA8n40OG_IaVS!+Nm zY_9@cab1#%bT>AuCTr-fJ%S+ZG39OCLYouQ199FI-n3zAXK)ne(*6=_k|b+G$$Aq{ zNBZ8W(9-b8!xp!@Rc9kR8*4X9ByrXz6b&LNuDaG45`nRyMywS_Z`6@r9!Vh))WJ)J$M zTSM&Dx6v%yU$kb5NW)u;uSU@(qoi~h8RheY*OW4{rPs8?AC(l?w!IkX45H;+ToG-q zeKWn;mSm`Wa4J$beDqx3qBI3(A;x8yoXZmM`NZ>xP$17q&B9@!)E?yHbxT=mx3{-N zq1XtIAWzFIU0Yb=N}cC~0p+TvmiQ~{R6VWex`sa=ZEe5Ma{q}5Uz7l}jO(i);uq1rs0%oMc9skd`^Nju0+4Wg!H5}v@$ zH8r@cMcZudvMKs)X3#5@?fpo~;ix$`POhJH3$4Rts+7vj^mUn45}Uc)^rFY8D=Cwq z;2C?h)tn(N+*vFQzg!s;P`-jdk<%7+JGSA416oj^-_hRs#=^OZQW4GB6U&ZxWT)L~ z**Ge+%A*QXXy<3``g|`yPuT`cilVECxpvdI&>ygzM=KMVgq}MF0eeT5U4~Tt?vl}1 zxVA>mgh!H&TyAvKn-aS$(~i{`mm$5hZ_L%qVrcGA#Z729Vzz>cjgt)Rtk9A+=?ts6 zI6w7tN^90Uj@k`{^0;Bh)8aa3HG5>jNlPy`i@K(a(pn7(7*{GM>J zUK%_QPyHa?dnG5>Zr%==rBswmFGmE zwI!m`!l`QA%Z-)22nZD$;JLs$)$+(NoRJ?Adh1c}vnTH=$gmPKXFadajS=2BBp$xE8S`skm%wF0`FO)#OV!^9ydQf_n)|BpXv04Z{pP ztVf%v)?k%y2A-)|W)_7T;$9?0$%ocOxVc;B>b7KU64SAUbq3zvl^JbUw2o{{2E95v z%S5^X3FYg~0&H!n)Eg9uo*_KmB|`=(0B|)9z0TmsjG1Il<95ll@y*!DNRv#mnVt3p zjT)_vDwF|{W~UEUnQ$`KUHK+CiMgC;*~(+hP%f8Nly<6~E0#kGv6^9)qf{r-&%rak zVz-9X>8-Uau&z@syLva&7#xju*HU6F0!kAQ>7=%{Vvy0X@H#%HWpS%rm9DJCLI}8= zA;b!mB7dcBTEUD%f?i{=a8%o0mJ9~Tc{nM`>ue#~9kGPHwz}+GEOgbmiNRx>hAr7yr6ni` z;3YF^D8W;;yf`1uGu;uVXs!Lx4Qq#|cuqMlvz&IwwwxuMv2FI$?1EAv!7Qs1xDgbH z1(YLM>>H)p1Vb4Y5&`Y@T6G3n*sxGo&(m(27CL5n*;qg5kCF-%tKf2ZXV=n@v#fe8 zvuYxOqDVKChfTGz+R6+z5IzdGT*YooRWs)ay7E$&#;Y@!h9xs?HwcpkSHL=q>$I-C zeV2xyajdgaPg*Rs%Ot|7kWy~kX#?dB_-vVxKhHKrnYlifG0v;vsz4w!F)@cjz=-mJ zRbnjG))sLE)271=#i9^6Fc1qmaR9(JVa$pLxR5~PGx;U1q2;srpHL4bwEhnDP4!K!vTr5I9>4=)= z==fsgYP)rEsd?^Fx0|ti*)9#t2daon2^R+bK{jPodJM@%8kP{_5F57%yJR%gH|-9Z z9ct<`MM$B2_HetgXGcJ#DR)g0*3qY4qW=x$?p;Q1eL5)s#qI7A!5^9@Sz*b6Kn&L zr8vFx>F4^`w#iVlRW@X5%;DBAJ<=IynFn@nuiIvU_j*`hsaSGjn;J&p7_F5Hgq!ou zTrX+ENoK8_Ri>M4IL{R6d4;tJln$=E>r4dtQf8(fN2PvgcnbLZYuaB3-8KpG$>p)5gp-DP36* zTX{+bO{lF3$2M?7n$X%;N%dqURGeEOHu(GEkyktLUs8MJj@o)>XYYOITJkzvM--8|4 zOHEBoTC;6?d{SdIFm2a+;)tZy5XTmgJg1!bYm6#;?lS1wv`cQX+C=cy+s@0x+s=wJ z!wt59^QPwuOVgeW3TrehA$%3g)>)l1Ss61rd7a!~)4=PYt3x4xRZ+0BSkMF%)I~NmVjd=*hXnmV*;RwgzF_lc3TCp;FgqcoA+SS}VrRu3hf-xH_27##&fpk-D{E z_0p>CGX8O>DK4jrbA8yHNk#nbWt0;L%xT(GbS(7Fuwph_%)rz|PdeAP<#ae7Hfa^X zs$|S=`gOIPF3lts?pz{>aOsW7A)6|V6Two!sEu&+1u?GlTr5!Mr=hevvTf(ejS?G8 z1_yDA-VFZ>W-}u>k483Ys+wK;y>4UP+bS1?+n}C;8TTm$IdQuLuT{y7I>fakA+2+? zfK>r5(-|Tguao7kS;o?GU2O2JM7~zB>s_B$-1*K}XOIdT5vRc6^<}z|!qhdFXA`5D z-gI7;n-{hI&T7iQNl+W$nwChA2^584YmX9DB11t~sTt)uW7AF$u&AraktJFe#CwgI zYcgEVSPvBuB$~B)Ox&%g+UA1Xv+7El%K;OnRAtW8FD}^Hwi^(|vcZ(0p`75IU3r-)J0B3khBPJA9^+J{^;inm`zu?fXE8xU*Riiel)lSV~gw43d-Hmuh zm5o4|R6E-~wf?+W7)oWL&4Ajm=XLYE+f1ftUtX#b+9Pr6l1{f^dyOSnigHd@Bg4+> z@=^n3)*~#d1yNxo8&pLK>eMV8bC~5+hwaFj+IYqIM1^yo#kkUlk`0-7n2BtYtT2;t z8D+Zw3m>XNl5S*f#Mi38x|E11Dr-|uFU!bec*g@@R0hI~9yZz)-bYM|Bg^4@70Bt6 z98);o(aMIj=e8==lE7#QhvRiH8R4{+m|YZerA5h@xE7S!8Ig(&M(Kz;C@KhrZTa~~ z#TZyi)KsOS;-sXUk@0T{#k6`ucYJj?ghi&ZfZ}OtqtG!M3Ad+1{cdUQXd2 zgbmJ^O=@X?d**1Wn4Zz5m8qwlr@PykcOh`ul2Y?h=%xgs`f`(8`{2ET^T5|!X&27b zs&d9GE2Ph3#$;Qxn5|^BFh^;(KG70qbw;@rEt>N;>E1ak`vL3hi+2nYhz>IqHycln z;7f4IUk()-ftdN6g*X45td=#)>WQpFSc3av%|fYFIZPWVo06pm?3PkkIP)+O6!|(K zhH@4mlgmXmZfG4_#f3>&V6%!~Rx64iZIk)oG}3@C&Xh$eGTY616=mNUCFka9jy0MG zMTc3`Tu}3BF*)0r3RI>oC{k&eluW16vT$;g#F)TC+*z-PRL)^BDj=Zucs z7RMPM-m`i{zA9Z_xmkl*V)RmOL6@eqMcdrC4cZby<2YEh4c&0*6mi2fnmZs_vMzI& zi|Pbk7u{bf6efvNQ`YZ>OIc(Q8!8yDXd8?aeGXNGRm7SC$!ud0s$}p2Blj(eOixf% z_Zf%8PlqzBg_CaTYI98#G)AjVZ^a$6yGJT#sVkv1{md+*woEvN4$w`D&ofX(Exmx1 z@%AjLNP8k^iW`}Nl`|xFG0{*7Pc>z$I-re9OT-fMrKcj79cD}D-z|O8D(CGv1e)_g zFD8&si(S~j4%)0oKg4TX)vUNpIN93F$T+G>!+4~umL2$>QVzu%;<7b4(+lUJ+B6=i z3R!)}#RTS@Y1xr3V*|r(UbP9bns~(@-mzn&s0pY4;&KyKZ>z-==RQx0O~HjlC|ENh z_?T*s7*ky}yry;f-dVLDG{z0#NoF9e1neI1LeECc37D*~!do3OTx%9I%Vu(2ZL@`2 z_8i=^QFH+gS-ae1kriqfgFGQI^&;sotfMSl(HK{3(6s1A`>ZeGXqXg5ZtX0qjjU9- zX^!DdG)r5!bjnxHtV~*sDpkwn1T#l@X7J?7PN`i9_i(;E>`0k&+?Jd@PRAHmaCtH6 zRTyP@=8w*8nZ7bE4&cX#h@o6d(6Xp)Q{_aWc|0TbY29;0z1XHD0++6D(mNEvf+Z%& zNEFdg)Rjnza|2s?>9J%rp+M0v^r%FtPF5bJ;P(cij7D0s!gIerE;A70*-nZE4ym0LI1fsO9pHINjP1I?5#L_PGO^%Y$Ez?h}4&khD?u^T0k)&ai z7)b(&c(P&GdJNX8f0Sq#GU1@oJ?JgnnRFx+W###ijY|vXTYA}%J7~(KGt0Aj_)1Y~ z_N(z$RW-3Rdx>#&7~R_Fl|{sky*V$-PU`tdXweW#~_^jkGrme(r4>3R7R> zx652`8WtAH_NG`UkXpHkMV6%N!h+QL$G4S8(}FV@p;C&p2&eVPDDF zT2^axRB#rk2xM)Xl=wO(*Ju|-3m0)Pl%zAZ>5SG$QyOoTa&nP5lNlRwL9?BXuR<1K zQ!|Ep3!Q0g52t{)n}UUC^~JKBrCAmlTk>c`JvNuhf~im475Sa{`OKMWSuLsfTHlIj zM`o_a#-`+kj87MvK15c9yKx*qaN)+H7wFJ8Qpcko1CHm#;qA zOzUQLq>xq9N(;BmhE;O+w5K(M!@bBLYE8$*i%z^QnY-(GE8W-5j%jkF_Y*NNRi(RmzBRr!dt z$*5CZxvVvg8kq%b1wxyw#08mCzJ>{Bpu4Rb{bqhy-2A>fYVawQ{O9odx zF$Hfxao4;riRiZ;FBe=G!ew?W@p#gaZJ3eE>|Bn{!rhK(9*(UAHFyu;hBJMv!QY!D z6XD{#?64(7y`WiK1Elp-vn(4JYDu|;v8~sV9DIvjMvWOKZ5IhQcit2>RbbVt@8Z5p}Y}oBqr@>|efEnb;mB7cC!eUMsld}@#ChC%|g(9vY%Vo1- zs@$f#PPijW+wvo)N@PwqZ1AHcL(x@No;$+Sq@vex4MA2q_E|cGO8EXCwk3x*Y zr_p4MO&5hiZU^7Ci$dv)4Hy@}T#;)^S-R;?`1G<6T#Qwv@T(7Ht|-=0`C%q&>nV*} zX+GJD1V!pJ)e)$K?WT0F5I4>0+_oat#{#sVrO7R&ZI97b$Q$gj%2Xm0&$@0}4zrr$ z)|S9bs&=%i#;i*jk~D@!E)$cFd*MV^;tUnf1<}#Q>8lOk!=@|_KVZ&B|Z$~~L1skAa>&{!R_Mkc%x*{n39gdJ!zW7m?MG`HBs%uHptjvGUsX4g84 z3qoSqAlEjp*|Fk$VH`;<;%zi6j<>B{!zfn^!(KCtv(s#)YAthmql%girJ{ailrqed zs;SekZKd3$s(vev4SHs~Y`H4flS*4!IoG%*0#O)ZXyHGHoiGo-qiD(8{=;uDG^I_p$J+w?Whn!RiKjyP3Oz~`EDO8&bB_p^v-SHXPO>2uY z+tP`xUZ(3!)Z@CbS{P1*3)wtfR+uw1lWbWf=}c-@VCPC#Y^Y|$?X}9x80G?IXG>B^ zeKpgO=q$o>x|ACaR83ExmZ>AEiA0lU1&O}L;}>4+Pei?-^qusuJJN9yiO0k`rR%vqy&1U#vliTO z^Y5@V`n*W(+_MEYviKCSlmp&&eBPWcmhr)>f?#CO#FSgRGj3yp&UiMJq^Mlgx8VxD zra!9pjf63a+5^9-gs)#RC4Bj%Oqp7ZN%Y}uOtI_NnDX2g66*DX8WYM-eX^Whtz|OO zatfYSzLYquga@z=QNF%=fg z&I5VI99er}0Y?CSv0C6VL7^Ew+(`W`8>L9EZIq@C9|{a3x1F-=vUUot-R+deL_4T} zPw${2si1>O)XEMjGn_c!#~ETLRpG2os$q;fsdEclt%=Qk_+aiYQj`i`jdXP(%nbf! z*0zJMNG`lM@|hL_D&&*V6ihlzrSNx9Is95*+HPs8#%UNzT}}1qbZ4~ShHNw~o7!bs z`7+-g$>DV_s(_ya$d#gSwWH+DZGM%K*$CBITdoe@)Ade`bvl6`R4L;{tv9GJ>w?Yh zLKhVT()y%Dq=jF6Y^CP>)CmtUIwPj)%C49?w^9Ql~K`*51OU8j8fS}8mdSMM z)xxO^r63!(n|HH+bY|AiIcgLs22Hz-$4Xs$_JG{Yv_>VI9^D@tfKtkq?nK#6*8$svq-Z%w%Y9aNA zzkiok|3|N>{*~AA_bZqFM)e@!px*NEWW=vq`3L~N;%wM>cYg1MJ5Qns-FfsBc=4<5 zp%=gE-jn@m=lyT%p1F2~pby5cyK$a_;I%)7p#SI%?jtw258vQE zM1np90rb(!a5)D3Cl4_KAsfHW2j(&8KZZdcG&v5EKYnBXq1OrekMoo8r>{8) z|4`6_Qa=j;?!O5(=e_F!{(%x!^;h4E zxLwy^!2prTgIMo>4~PQ1*tk00zc}FiB*BYqz}pABy_;P30`I4wpXmTN_n*Nd<#|8{ zu)mJqXuj^=z6U=22J|Ty!h_s*q30X12gsr4&z^~Zf1z#~@R&ah;s7%?u8#RS1S;75 z_XIPx0rLbfk8X0q3(Pm5|FtoXc;_F`4x#>M&pd>4%HzBVA^;~gu8#AC8$8Z4DEL^w zHU{)92+c$~+5c|At!#?ZmYhuHeX{J3s#x zy5dEUfFTQwtHb;vU}d1At=V>Oj8?m;v9H^7x>FZ2#$dS z5r)DiZjr6_KnX$d&eOf>lRVz_VLf5v>UckW!22nJ7u$eWf7{1tZ*!X4WIcTb`k9|X z#{$;-Z$)(4+pjvm8MY%hE%Ofn&Fxp+--6o{P#lm#{ZIK-1-Z#^8)xt@K@K<<8&?PW zx4;ZC{)Wd06>I}o8-TUk=FAsh{|@?@>$i_!zYM`z0Nl5og4>&4AFiE;`}ZIT;9}$I zaIZrk0m^H9tU?9b0M`p}-M2Z{1zh+;;%m&$Jmg#VBffRLK3E?Q_9n;yu-Ldd*f#<* zV0;6Q5h~aQun_0%+C|Byl+E~`8N3aaHBlj&jU#S7aNyw&))UOyW#!! zz$5AO)$p&cqfhyn2Ymn6?ftKTvTwilO%L4Pckh~y#Or5)=|~3z58Us8Wd?!DK5)PP z8TEsZ1BK#$x8P0B>wsg<{U>wWdMysquir-WkRJg!5yj_V%Hc^1ru^62``;j@d_S1N z{nTyl0~dZj!b55xd)T1;2X2EAj~Ma@<-w5sPhC)&ev>x<@}t_v40!B4{mFBIM*{xs z_-AhKe+vxwk2n|qI~wrQ2lQ%uH4ekr1NRSHOv4Y|+yC@!*xq1TUbuBjc3OB+dMqTPom=~5#b4gNAz>I_a7uK{SS!fXCFfJ!H4|#!}s<-`w${H4!nBr zn(23VAdsH`dCD+-jsW?i+xt%ekRL(U{KQF^J_`g8dq@Wa5S$nOd95&gGRJF%DF}Zu z$1|@L*ssa)>}zqDKFxaw@}rRuNk8(rEQRNZyZ-q0{xif~KZ*19(c9cdZgU^L&3))% zK^)CO9w2_$b^8xpg!!d8k5C>L#E1W3%7d%+ANhwV4=&n&^n%j#m%M8rKN|FyYo0Qs zfAI~+kp9%OKJL$-<^Jqh?oXfPH@p3xKZ|c!$5*XSKa0B(Ck8xaKo&q9{{#V*pLxsx=t2}2hPXF;`k9js+yXug5ejz+D#$Q}PloXX z@*&{FYgrZMr-Qg9oklk*xV-B{nJ+(l$$N?8MfS_xAI9@79JL|8y!1WMefL8AXZg50 z8PWp#drr;J@f~Um1QleM!lu9Ey$ku(9a~YP1&ufPKMDtUw;ttV#^H8)7#rdH?=Evjr*@xrz z**g&MICq!vYI^PtZqtw-b;1(;<`&i=gsi-uYfa04D1(E|D zy!c%>?_)2Ybl{`yV=#o5L-5>t=RH0Pn|_c-2>DS7gz4|T{5in=76R9CXa7S4?#BTx zXTQVQ?vQJNhe0C~P(K3N1|0<7$>_m?z5Qg=^us)Q$d5W7L;sXP`K<)K^UnT10s8-j z&i+H2x@3KyM5!$i$rNhMk2oDVMt55v*5-iW&-AnJj>i#5Rx&O*> z17d#i&awBf>%cdPS77{`UbzOhZD0S&i}&Ah2H~f8@PR*lnfbuuq;PQix363~GVlkt zFGl*eBmMQTiMxw?Kjf9`FNcqMz^9*lC?cNHr|%|qJb!mD13Uf}?f5&4i0AI|;c&c` zkllq>@>j?n`jdPOPj&z06>#&n+}l5Q7dEYn9Y6s)fD?BClbpv2`H734659VkpxwE< zR}yG{e=*(4*GI(s#vR~#7&Msn-TV~1^WKa1X>=*`rn?uXL0EH#4_vtVOe!8Yu5a4Hb_gVt{zh8J<`v@u$4aZX` zusn?Vk#THZzsYwV{0xsnla5CV`PI>WKSBG#-MyZm{pEk?T$d9TX z1O1ebqF*MUf8g%^69D>GFf@J*K=Y4CW{SNJ+@HCKgulY^ucVHv>nrg|6E^(`4+iq9 zhvpZ4-tl$k#@YT&XRo^7O@aLPQsA`fXWX?ja&Ef`WDuIS4#n+5@rFb3#zXPUq4>N* zfpT#VeE9n0Z4bYGzUl0Ndrv*|`UxPg4_Wah=WrWyxGrJ-=I(J6R_MDaJjDRe!#49? z+-9zyK}=;K?XR5y|8c{4_6*N7kRR=XnF8h$Pd(*KQD71OVtD5aenfD_J$J_4J@^N| z9Nh)j@4;8n_we^(-+vF!WAA~(00plD`{!Wv@aY9(=?CE&5WcnSpFhLm7LWLn0&l3E zKoL=V;2jU%buWC>1e+3QGM(|pL4I|61jL@VfITmsac@53zTncHFL+&h-uy&+UgYh$ z&D(QHaca*A#f3cwO-Fmakhcf&tJ^~pd%gthdFvVX#b?~xF70{S>)P|hPqgQ)PwKtF zn|H}@YThNoNiWZEVeJ9O(b_NNt%dyR)-uG}m%-Y5XWUC?+$)#XzVf=(zVsx!_V=FD zdy}{JlHtUz6NZysp5emU1CFD$6mKo$SGSfW)(XK|=8U7yIMJoGqSv*Sev(~#=1IMW zrFhA3V%G`7NiWZEVeJ9O(ONNYE#z0XR!FRsgSFflCq3g7m)0s?*IMb5?Amir>OCyf zONJA>P8d#ld4>yX4>*q2DtT)mzq+*|Vyzae)tqtagQtoW!96~F zGI%^sJU$4>ew2dO03I3SS4So$$c%u@aK`D6$n=jQGw{e>;E`Pp9+5phctmF6kwJcS zWDXi0~+s5OD{OY)+1h*4#JI*-! z5x4zO+>R&VzRTmjq&?!kq&>lXN_)iZ;&DTMb=(}m?E~DNGtPa)?S2%u=SjE^A$v)C z#C=J7g8P*Ah}+NOhWzTdWdwH^a0k!0z!7)gQQW~N;XVZPCG8RSCG83BQ`#f$2#*`` ztK*gv+zG%PJL95fT=D>&fuANM0qpznto45WtOY+%fV0;7;j9I(xYzbk7=7Qx0g{}g zVo&NlJj*W`@NMvMhLhe$8BQFqztnKj`zXW7Dm-C0={=qne(D`>_)l=wJ6H<-1WQdR z-k*?P-Jc5L&ph}ud&XtXxWc7B3$N?X%#%E~&pxU5a9X%zIPu&G!%6R>3@4sDVL0i1 zl;Om4Ck!XO$MeY1p9f2i{w(tTg#7CMR1$wy!JltG3@4sDVL0hMo_LP_JXm`4XPx&a(?@BI(G z?>!}^48hbp+kZ8|^z-;;+&$wuXI%S?JHMRs1I0u59@&?=xV7`g>CQ#1eNj6nwF^7G zhPMOqqxR3$jx4cbaJK(iV#hC|9sL9RWA7#QeV-3T#fRVVh99F;N4I_*4+rui`R58J zN8n7)_Wz2&`4xmSIpfA>+~|xO9^DGlexSI7_L|eqe8buCXQlV<-ksTxKPv_P2ku|x z9|jo1zjRT99PS?!N(@e~Z73dLjod7~mK^JqNBy;21wW$ML6YlP7YRzMl6! zZ{hJkezHM7 zC4?e@usqxUuLQ!+VcdM{aTEDgQ2hRTF!-?khc=P@f#~?W_%R2wtp81 zV}5Vmo^hKqZhgkBj`3{ze7qsNcK^50JMVfzWMWkOF#cNU)q77I$GCgFaokwQ_=fD_ z`}IX_MQV}o6XhRcYKvt27G(N%-Z7A0-7yv7nEwF|Cjb15`)6m|KRx6A$r<+@PjCnG z>KSh~^WDetyAI|4pApFWe|k~-C!`h$Gw?+G4&IY+2LDz5A{KlP&*ERDUcCPS^z%O_ z#QRq-YTtcP`z})BpLIV$g^$u8E;J9+aVKQaF)pV?nS%>RM2{rey;K8P#jV;3t0 z9w>+2r`X%zw)-nU8Wdl7DE{T4cyK7b>QKDnP@rCZKfCzDaQv~L@ZsC;_kqhk{_t(L z>Bo6nAwL3xE#iX@9af%lef}!|z+X2tad!Gs+LIyNP!B`b58o{R1CI^ztH<7F37+R)+{@nbs{21< z7`=;z=hAa89-fYWcy=5(pnBE)9W;=9FO8A*?evTHK`kF?KPq58`Zy`L{Z$$x4H@`I z``%-u{ip!^o_zj9__Gkkzly?tpBMfsApCO0sF24Fha)08y_P8xV*E6p^B$-fQpo>Q%5@uUAwIU;{<5fJQ~SN>lNGbd(}s z7ZJg(bO8|vCH$ZFJ$uS*Cb+}z&*#IOc~6_?`JOX%H?v+r)v8dlkkwEFR&#Db%>uG| zyW8R%biR!`-^-otD4hI^W5iQv>e&KZ(v4Qs?vC7QN8<=oaYw%@)M* zwHE0ECL}svRN#GBwJJIv*Mc}w1Md9IMCXgB^UvHlb0s?eoI3xSJO2!wf61K>D*K?I ztB2#Gnxixo??K(wR2N4|2$4AG{YkrO+d-vUV;+ti$yFf)N25do7Q(ysTAKeb*t&69$sYgt2pgq5YF>oB^qUs)m~`A|7vMwhxdmN|+cc(wB$ihk zfv<-tfjCIcEI5okw?=*aaca73tM}aH1-Pi?9rdpdlGs~SJFX9!uQdmv;JuX&lB!$m zhPIX3W6>&jH?*y=f7w=QS46Ae{mZt(eqdXvT?Va!_XFDs6Wq2^`vO`8PjK4`GuO6K zlN_yrXRd99X=Yog8HrYb(+pDr)4g_MG~j8&!;aaAAyd0WH#&B8Ek1$g2$p}x969_G z%@KNfWTeXzF+Dz|1N&!~9->`ibzncavDdy4%F0T<=Lvf{ChWJgLw&)AjoG*s?L|8u z=I)#rj;3{FJJhZIGy0QJs-7Fu2`cdzm~Tz_p^Yteo`#uX^QoBH1}>_m;EC-?%mPd2 z#FpX(T|MnTGhMd#`9CG$znJ~E58?lmL;5c^{^^dSiho<|Ja4S(Uu`4d|5WymWqALs zwg1=C<>|h|17B#I4zcPu)eB-rw@}9beO-ZXIOFY6#b@y5u?)ZYHhS}8)8(0Z^OZFH z#w4yQHZ?+lUj*jfe0`FbkEtieq|?_vdY6^VjA73>i{)S$UQSyrXMDQs;FB{>$-%W( zha@!?34QmUquf(V8ms%1i8ve3-|^6G3f>WdH!Y20t+*&2#BUG4i)Mm4q_JPyqAgAD zz;fC*cGlAyEbk(#52N_x@Cz@V-rZ zzn#3lnXaE>zmcvjPBJ`HqeJots!}bFpvqNvoXtG249}yp=CLweo}+mTB_1mhB%W=E z0==W(gZa%@ZF}`M&-T*ujunQ4s)}j4hj#gMSs0e#g>})wK2DeCX<>YQLcB1sJ>y>F7Z9PYTKx} zDz}7bLyukXCEl&HpQt}cP3|7MOvCh(Nmo}#ZcA=QN9h_TW6`y^JHx^ zf2PZev@#yXo$2C_bg?5b%OLzBR)7OCgsbb$5p+;e*>u=Z#M%N@5hSPKeN$09vBdl^ zEzz-R`82iMX%1a~@PPKFv$fn|*RdP-WNTQ4x7J%*JCH7WYim2{EVDmd>`NDW(?vzP z*pn`Hr;A+)n-5Y|0u7s}s>JpqvHQ&~w9g!c_ZkBgR%+#d3~#KD zHdeE-ytpyl4M6Q6noTtti?qh#V7jPG_?eTA8VNtBq5KRYKQ$WbGe{aLBrcWYL90<# z+I8r?g!N+S=uPFJ96uVxt@@=9`bFXf-F~*La%u9U;WqM6pDp+0?PHnf2{*rAva zc!KwP3*3tDr53nlZHanYnK?GB>QyM_O`6c-8Z7ylw$cagsO&gRk^7t4DK^`*s?&@n zj6N+dP2GEWA5%3_r>vKiu=NSrNh>&!8BH);R9+k3ETumV;y%nrD5{*_EbJe|Fvrg+628FMO~&P zUJjDOwy+FuYqGXg*;wZ5q1;cl4kT<9G?51aZFvb>rqtM)OMO)t?@?@PBy44otpa09 zdgLer|GO5)*b0{6txVBY(wfK?+R6d4axh^99$T<3K!!)Pf9$85^Mj3XX<%j-4pA*x z2bPYG2Ct;_I<&c3N4qBS4Cq)$WBO4`dpwt@faAqXmCRDf`zoQvbZk})X(}Cm=))~K znq!-y9iGA^rqe*WV6z!DTTsS{bRk3+aOxt?7T4xtr+!^if51V!@GPhe?P$*XRk}K@ z)hF2jZ+CO*(1q~Y7I+#rl21x!HNoDBM`ge@)tt2GPiFkR&=a_-If;jE`hwm1YKD!h z0FjbKEpa%)vTN~~Jh)gw3ylwsg9}@_Bc0-La2~+(`RBwYvIBZrOe4KSk2JE%N>=h% z5ZhJF+rFOvRde$Pp$s*#19xOWSUR&UMGZT(hC7=v-=#l6{ zt!PHkEpzfKUD68BT32mmUtW@US{3Psf9XFyC9)v`R(v`AVETl*iKt-Dy8 zXeQs#+paL%e#2~=o&+qSZ7+ornrv!gx`dsTTZUk)4Dcm*K%71a!0O=#F z1Jdok8c+I0%!k1KRos8QwwUQ+nJ|w7^~$)5I>m$JNR4_{Gr1I~KPA+k0kv47_BZ-O zXbA*V|B292l&<1^j}B5_n>GC>0=As?qAKO~g!MhXk6ODXe~e_?*gomte5gL1@}NG= zXHUva;;T&#F2p?BLk5#@nV< z_pIanw@7Qj_q(J$YaQFdGO<GJao;6Q<{IOZ7_#rVPUaCu%)@cK-qI1p<&G059 ze*0Q)tl-l6C*Cxc4$%}R<9xlfpPMC~*u0$BRBd{;(Y5#&?iWs!WFk7JG8dpF) ztsLSFuEATlwtJ0hXbab33x#G2*LAOPz1LcAp@_C{1GYdbp|%i%hXE(yO}|JAk?>DH zP>iij!C+0!5N~COH#5W=YRFLSWR!a48S2$^H`B;X#%OKBhs{{Xw=%|-Y@*}S`Z&Io zgr$5FIsTv9cmp{*sLrok=hryUVFrWMfd1&OTid}8#d_mEzTHmm`X3>b66`@D2C`+5Ir+P$PDpbhL~Y=UxZR`j5{ndt!^nH z&_68iv3v}|5dMsM2wr=}CQ=@j_t{}jY!(hF2=DMJG={ND*%($RhQoPqI5$Jg$q=)R zy{l0K>&~#uwf5X$nZv%+u*_yh?y$^f(bu3eh^8RC=sVCDT5m$adke)7{UJnukRcXj zh=mzqfzeGrTj5P|hvfsSTP}h?|FA4%`R=eRU=t}1%VKs&zk&gW6ohv;0FB}B9yW#* zisA4hI9!$?mS%`0#@>S{f^}zDmRWo5uqa8Tffz;tES z4G-ye@FBtM`k%6yVb}=FP!QhCNHm6rXV?Q)D2ACYVCM4-@tJWl3i*B~pIav`{?87_ z$d_#7C2RvmCpA95dgr znMv3P%uo>C%zJ1I4^!C#Rw#yHjmQN!3c`c?6OGaHRwR5zrWoKFXX5o&nW9l9 z-)x`){nQc?`lTc!dyr^qmGP5^+JHi$Rtaj&GQD)l`3q_l=)-H8>8I8#lYH~#usf~N zGwD)ModFwRJsBGP_!71o2yGwAWYbIotw|<1pkHGGGz!8)qn{f>ALcidCPx~D)b4}EwSB~j~XskyVQy94cl0BBL_t7kB@e3Z$HEVLdBErwh` zqaZxA6VMniS|MR*6a(5-fOci3_(!JryW!SORXtH9Cn3??D&p7sXWO-z-jykEI~jd= z*JSz+{?}S=@=5^Gv+W-axW5O0`x|w3Z7{e~P$sXj;I3wH?U4&`6ody?g2n)MIuZs) zF~I#B;BL3Fj@Lo$gag4SsWw|peUp_pT_tQ2;2gCdy%H(Sn z=Bo_z0ptQE1>s>nhQ@&T2oi=#F#pdq!=LQ0_2=b zG25_wMb&#%C9fgTEGy!R{IhaFrZ*=AmZQ;!H$UkFv%s>HbDUW@`|x1CPTN=z408<1 zW}qT)?CtJj^L*444yAc8UNfrD?iQjR-{1k zZS>)Nl0@=TOVXW{D-I9jJG6;UgF(KFGWm%G`7wi>fn0#3AUw#=(HJ0?Az_dd1LUs& z`AeqwIaBrINX>iHe`zR#@^2;f_3L1>qcwO9or3dY~^}( z5R;*AA(c2+J+P$4FX)MC4-|FhW6iBdyUGeR!-ND-^>>?MSJp6%jQf zqDDkNpK605|5U0KF^`gD&4?Y98dy&}OGadx%*a*x}5Z=rgXbca3V-HxN7-s6h z%n=b$*El&7`Fuzsvi3?s+D$k7pTR7BJ_ zUM^5oyQ}0vB>Hq+5pNj5vB^GbJwDZ2?nSs&}k zj}0%P&W?`+J~r%$GI?CYJT^R*!SzBez)=t$+&|D5ye>h)CuWKPE*s#oA|hg_U8(9_ zrIM?WXlj-5d}3suwdO^GkLc|j(aJvhA zcx@y8-SGs=O$q?ghx;N2TwwsXyQ#Aig2CN`GTGLGYs28~MJ~Wm5FT6^8Ux$|NEjT& z0Cy(9oe>eI8)}18y}>FOf<#lRjFu+Yw8Xip#)&?pEG?L{;OwBbk?8pVKi0ic~95#0>5k*eM(mAr&RL#v4Q z^iQ=O5%2sIpuLPfybF_d(H<6>JRfxQRO@D`rE(6_Pru4(8$E(yzJfA&p@rFerm}8JIOo{>X3c$SFkbFZ`dQ&BDA<-l&<5&Bq-<1*X@)Sr;Mjzfkl1N@@ zNxIYT^1}l;g*I_zFvzJWlmDJfD{qf@x2C{yKKk%(OWKuhw=CtY&aAxU@L(>WZQLFVb0Ny)Z5HOg z80I460wx9FVSa+ffVm6_!=xB6{|lJ+8Iqr>N}s9Zb0nH%W&A<^tb8Ei-IoH%FVKhg zza)|mSd#9nyzlTpeo32nAQ0>?aUn7|~EW1cpQkI)}~nmUH=uSr+Z$`u`PoNvf zU#@h}O|OD(S`~Ctlh92`iYKRllAjeMLF@o=az-#jC)+}NmmzjUGeD#uJj4sp7!XU5 zFhq(0aW){n9}%-6VrE3hhMqr78@Rn{uV_3S9onVDxSXvBAA4SBnh*%mCON^hJQHp&{`58=p zJ_`1;4B12S=Voa@IQ@3DCFhxOlQxBst zyxhxPutG6ReFIagBjW3bSQQapMZ}lJ*FaS8zD+tvthUzV*I@5|_O*&f%sohal{B-z zzt{)meIIV`A7Ef0y>5V3c`CBkH+xuGE2t_#qh8m z9)636UnAm|i1;}oelj*Dpn~7VZ`OwV6&m%W?=OyzpB*1RRq?TbeN05p@IgU%AMc?t zOl-0yPNY2$e*=B+pxPHVR`KyW z`mP~&s-e4OQ)`r~U%%|N|JnUx= ztI;t$P!Qh3dNhXgbu1k#6vIQ!EW98nOQdCqgAq{~5eJNo4XEJN&hnm1%qqTQs*z=% zY^G%;9}N$(A@^ulnRGNfz}CVa4Yxpyteq8jvE*diqhYNqa=R7HK#YR$#15b_`q+tt zkA@V3*pVPsFH0PeCF*90I$8QDa3xAX)7b;-Syt}kJp$PD7YgfU(JrX=zBJ8bJy-;qz*20f^HpIwg!K3bE+fi@I#B$IK#3%?)tO$)U>MGo4Y-U^MQi=dg#?=olU-2=C!EG=_&0 zSvpoIhKGE3h-QhrERkyroQ@)|Aj^Ma6tx~?9t8TYd2-o`Gv53j9QF6Ee|0NVQ+?u> zd=(E7vLJYzooqYKF=o^e&A^C)@Qlt!W1uNT!sARa7_|T+FH1BxfG$8j$f*&2lrDBX zOUE7I=5~Y=7v?QlWp{J{l@x?mc{v(GWiJ+o6^fy<2r3J+L_ABhGD5FFk=HtD&n>iC zWxUErw)+1*l2<{5Y#lt3PPQFM!Hlj(GcckcJfnZ1G0@zAgh!HMFggK@+GdG12GDKD z2RUaX+gdvANVcgmlI>XK?dSk1DG0Cfel&*4{wxkF6hr0Tpz`D_aZ;8z(FpyYs``LR z1|ZQ-fGXmrWnss&A6=cA<(*79fAP`PgXqI+pM|SO<^FM+$ERBN@?@SHI1J&hr%tl= z<%w9=CnfzT_aW-+)U3ddt{z62Y@cO5x;lly4MZ-$Q4k*7(`XD{Ly++BQVekC0NmMG zqBKi%$r7CnyWy(#Gb(u&iDh@bpIz51@9Y%VjX)pXd0GA|x~>kpvmJJ&4!bVSVZL(! z$LFZyuE89iN0~g&ay*wgzJOeCq#!)UF=z~qFC$@&6oca>;COMC=wk?uRrSWHWIPg0 zurhuH@v!qH2W^I1l@h_Vh3QK0B94bugij=O+uOMYoT4r(B42U zpivMWnnYtjn~H>?Q4DA|0osjO;)X17z2P=fRh^}h_mNm`|MGLYHOsp(1#Yv^hj&ZT z%)2$1+l>yl8=Q%EeE`Eb)bFjq4CkUu-eMWv%naut7Yr!~&u|?YgW;D*m?6br_!t;I znk9y0iNRT7kiqz!s{Or6en6rzR>X%9G<)!SGRu231&lwU5ATUA|Hb)}7NdL=jPyPJ z5QpPnhvT3Cjz3YyPX=@R8D;Vb%kgpM_zQBuk%I6X|3G7K+=PTVQVfoxz;R@jcri=7 zU?A>PRsU4UE+iUaW&BnDTrAJ>My3F9H~R2iPJ&o&A-enUNQdEz4#O7$81A8d%YzwK zpiI7O8NS2}_aYYzDG1N7L0x884+%4*7!1D#!&O=0t1R(lmiWS8Y^Z8CQb{@zjjACoo!|_Xp;}-!On^4DVf;l!tnf%6bT+JMt zAr~Ae2+y%O8e=YIBVmpdgX0EpT%RR=%M!mDh@Pt2LM1JcXo!{Zt^T>VIm=t00>oD6 z!`qYuakGW!&c*c(!`~c+zXmXjQ@@*o85W{UZn6wFGQ%R|f*}Rr85W~47@mNH8Bz>} z`@nE-mZ-=Qd$PoCgYh&~`*f9@fkb1hh^J-yj*FF9-rf{2o{2uZ14*ZsN{dnM1tUEd zD;$n{9FDsKIG#lvR|a$JfHHZ&a@@}xJ0cexDG1N;0yGB4QY6fgVsJbgc(u{hB;uE zoh`DmMI>8f8jRPf+SjS%dL$ZSMLg!8i_vT^I|Yn4q7N@G+yALj)MAv`V5H|_mcudP zaLf$gcr$ez4d!?Y%4DA9n9Ce*MJ_l}5T4_`Xbg`3M#3B^2FC?>QrtRQh-^`0ApS>H zy-y|oMWP`-QFsy|8_Ivy{6t}AuU)p+It7UTLm%D=Nf6svi0)i$jcor%b0RzGqq!nf z@qaX@?*IqThS~)~eGp~x1Piq-LwyLjfJ#Als869WpbkR9P$>q~PMDk>vqgt&aaOiC zGh3Wt&_1mi3|GlBNHp4t_}TvX*(KZSm;%~o(TCSL+y5zU7mHSQbmnIVXMUdL%+E8O z^)mwI>Im9Mmtd^Vp-gtRSW6h|^T-8O3c_O@i^jnE5)#HrF|hUm)}GnoqHNJ4TU=?afHvL@tn05FY6~GzL zC-oT`gVb^)Op0QV8VFJk8%&?8N?)ktOC%aoWqgQ#&JD`;9!>$%SLnklOTskBVshu) z!vU05QTsu`l)grpEVGmzVM?o!3rZA(r}PUNgVH)AOo?JpdIpq+XN#u|s9#mR-&C?5 zi3U{>f5AVWp3C-zrvPdL`tU|%`=6ISXF!RU#LZC2Qw^x&RlNo( zX^6yvl73J#vb||3fNF$3ymzzlnfYv7x26qvik?8vu%P5LOUHaK;Q{r@=u{LXUmvGa ze=~x?HAb0y*MfV8!8JiHz)=t$Tn-vzdSxJCa1;aFhXA)ITP(~L3k zjpJI)hacESF*=723c~xi294pPFU!XY#qhBeKDK0w&Dmm8w%BNVT#Hg~L$=ywhtn>* z#qqJ3ePCjk@62vuH^|Z7nWc}0)i;c=A~z-%gtyxdjp6cE zc8L{=VRt9&{*f(qWQ*;_Ykw4hgYx<;dHutBb&umaknO*9+Mb+~_yG7%HgFd@h5-t~ z8yJYj(0w24#tOwSuong@vc;Zku{&GrG9Dg5seimGtOvQL%6RQg9uWU{?Mf~V7%%4w z&T5kGW7C771g0qnZ~8ejhS#C&6)P0ObXpF6Ma%h7upfiZ3AiU^lXpBC_vsSE74AI9x^wBxus2ov0M;w_W>gDK%QPWYu zKUhcSnCC|Fs2n;px;s~Wtgnybd)4N}$4!}&+5wu_b#nu_hPuqk34G%C zEy`ph$2@V&WPEFp3w#uW$F~8ELG4E*d_tud_)37UQ;z6p*lkqxHmPJY63wnMeh!hc z&mBs0yiO^w+k!s4E=lZ4Ej#z9(aD069qqb-ww3xS4TknR%48P{tusU0hFn0SAUw1K zXbfn7B4KD016nUY>zN}i$`L&bw@Ov@pi0u}S#A~aONo-bn!7m1>zM+#8tB98ljA?y zUTnF^o&cn;<}R|ZWDmP;z}2MAE)E7)3uUs81=pLw)kZGBQ4k(nLo^1sqmVE-iUICg zfV(C~Ty3Z|QuWeR(in-IZ8!O6+YLG1H7QVQfN++ongRqaBR6d}>* zD&qI~C)~X`UjG!(wMHM_Jvlgqs?+<6bWwJ%MJM}%k)Ck{%6BL(3(o`uHXcnT8cNHI7L0>`o(@kovsXdre_RXeJr6A}%v zGXA)K{ym!Gm8Af&Gy3p`Btd-CLUiX}nPnv(aTpG?`G#RB_4{Zr!?RH)hggP#nc+Fe z1w#tLGwg%LV0bWWS&&5$W-t#G7 z?2A6UkvX`sapvMEi%~ugMtUwjXL-pH4##J0zTtQobv!DVV!?G0s4|MOD33CI3XCAy&pG`{&}DIo^a6ApQ$|cyA;@ zeA7a7=i&s*N{)9Jjyzyo(sVl=~;gEvx4(Zi&=;Ki~h82q8a4H;5$rY1x#aqVS za1_D1viCCCn_}&`13H;~;rg>YPrk*Dux{SIKaE8{gU%qDg7BhWMPq0+uf(GmqGv$# zySd_>T=90Um~M2_tMI&6-C=px>Xz?7pnq82X8G>0OlK3wF>kp#H7t@Hxx+G>MNe0vDF`om z0UATAWUW}C7@`+I^!!{gFIUXX6?2U4g(&sLxx+Hw>X!2$&_675S-v|gbJ#@6!?KVa zF2ZIpEEI%y_z4=r*b+8|6^h|-F&uuFD?Z2-i;TTbQ3UJG-twWf=MKvU>`M*HB6j2s z%Mup-89IY#3c`zChsMzQ6>G%`#Spz5qCd(N%W}n1Blhy_ksa0L| zkB`U{!^|fz^Kq_NX`F0EzTe5m)`^RM<>46l zl#Oh`HeiH;@J1@o7)G|UeymUoBVWSE7rEl|T=ALlvKK}EJ^TynMSkv#%4dgT<|{U{ z4;z6Q3c{PIhgUqnLk%Q6Dip)aYMA*tSFAEljzqrS$=BA2J1VOV$H+Hqq&~I*BNT); z(hQAZBjK z!$S^xzzW4M^CQgskSo47PUzKlekVUzC+?_xe>g^dVk0fE4H%&yypa>p82SrYKUOG) zk>6nC*Ie;SuK3w_IZ0JLStaxyJbfu!5#OAPbA^2vvN6~Dm2&>#0o*C*!`qPSKbUN^ zfaI^vQ2$~H$)B;F{4%)q)Y-<|z(;SVqD*ecHILrbGq_^p0vrY5!F54n@S?Z<@qS4$ z!0iUOUAf{Z|vFn9gP944-$q(F`#*QrJ{MBD997BJblGa zFV{m==UsZ5TSdH(xY^m(D$i?9Ie#(R=tX>9%RK)&df?-^kZ0FL1We8}?+&JTu!`kPC1Wga?;+i{35hgTW=PxH^VQ}eu&Q=oPidi2^SQ9IRAb7$Mh4z!a3pz#~@P7Q{}Z_sORp`F6e z5^vC>AUw3hoAJyW^eDz`I~&kS^F)_C(b;fw-kt}1^a4CP+q(H@+j)6jX$ssPBW~yB z`49f*S#Givfb=C_7YAJD0C4oCJny_C$2Nls()c#Mf_I(RJ%FP zyFLYI{KCAO^8BaKn=LeXJ?QAEcAce`%H4(jrU<_=@8)2b{KmYSEX*4j<}?M9g77fk zS1{kzFewJiy8yGlA(?os-W*kz-kN8p-+lh+cW<88KLwKX%02I%B$D@9lJ4~De|RAI zjePe8gQPd<$$KowyBQ?CLl3i(g76?$qA_OWVkA5(DF(icbiUIR&z?^PK9-%7LQ^}D?G|BQp>7SJ|^1SIOkgShB zymymG&afoiSvmdiKpsV#m=O%}Xq3r!Ey#BmCF;my3jFCB*=_93Vf+ z6U*|%(mb)m5N(B0Z*iXUk;F&Vyj;f92sb6>BZ;NV06FF(i6zMKeQm@y%jCLgF1bUy3VSudW~A$4{!X)W^TnsV1|P5X6{B~c(|QCV1;6s`2}Wv&J#Zw zC-)%V@8oCe#Kr&9;TZXqjogcEzz7B5jXZ+J(0@Pc#|p(TvJpl$zz^g?QqO&Vl#uV5tyMMyqRav7#^Nr4_KiXX12o2mOQc9IC&QNekWV36L(ZL zAC8gV*~kcN14bwaZ{&3}hW=5kA1f5Y$R9AWBTsD46WffJF{qN~X!`e|YJR7-yMnQOJ zOVJp8%tykf6N&*X9ncy@MZ>6QV7M()RX$(JMo}rorGoMwx74!8K-ZpCA|DCQT3BtSbcD%u%nJ5;?tR6?%>)zB*9r~0Sb zDN*ml6rlZyKD@sr?V_hxX!1nR(NnFRrIyN-g?{?Ai?(q}FwEU3lYg@?PiB~VkPDa; zgojxZZ|4Eb{pf>XQVf_SfZ55AtfeZ|R!JQsnq+z5IsWNa8udD*K(a3S@VX?CEVU%v z>DTG-KpsJxC=CW#4`s581=*QF9*JClq#!)VbTkIYV~{XNiUG1GKwcCTJq*jns$LV7 zG)1CWR>Uvy&&obg@1hh~(mP_k-buT1AInl+*!;Byo zFewNRvjrLhW)um-q!=)-2F$Ar$(E{8E0x5NXp-fHH~44eby4rC6i61L5AWI}lGj<1 z?yS7(@Icb*X}#-$LDI`<<+T>%H4HNGW?2ftgS-u00_1f_7$n62`7}U26&1sxVrW!6 z85K_$sPxWE@0qA~S5)2cjizr1K4lTeVLX{|qBc((hB67{n5PX-M*V;1^aN^*q6^1u z{KFgD!u{|@KS+|#L<8R??PS|`ln!TZ{m~2)kb>~s=)IWW_8%n7jbd!Bi0&L&To9#N0{qoSigs1Vd6^dViJy;eL6P{*j0m*~25~7#=7H?}6SN z2@lV*bgWPe59RRia#Xw&6{DhJr14OWQt#EIfq&Vt;f(l8RYrVN(uj{tam0h)FFYDr zD-IqM#6ob}S&>9mJuSdn`sCdoLnvPQch>x+T z{6 zcbM4MXogXzAUv`4Xbe#FGESbo6oc3-5StklGAiDSiWvsi29$!PbG({qS-Ar*84^!k z`JQvUn!#w?nfpF_*ocndfr9WJYSm>A^cG3>KruWlfrrIW@nKYa5EYA}Vxh578x_1| zQSWhg)E8SP@`xwMlM#YM#SRNH08C>)NNzimgeWhjPj`|9Qq(*(YGwL5P8h6w`VGkMT z7#=7H?}1(p2@g3e9V-;W!zy_ADk{E=iZ7z#^QibNDn2z%;;7@Tj(U$I%#5Q`?pM}~ z{1Qt21OEkkatHqNq=Ek|DgKn*hMx$nAx^Fio(N91od{nu#5QOKh!li}cqSTy-APDz zB2Wy7-vQ#fs8|~n-$uonsQAVZQ+|*q7)|m@yob_**lshlJ zXGdRt&=b5v}Kij7gRAu84zOP8T0rj453Y-w|_rA>~d zjgE~C&ieW)mbS8`%atVx!dtpiS)$h%vL%W!N)@oQCn|PF#V%u}ABwzvNmpZgtRJ}> z0{t_57u#}Xxcf5?e{ta*d>M8RM96)?Gug?uGkGsFx);qblPL(#XdoJ6*zZTej3@@9 zN-#PQ75fdKN01M4YP2WO1U_KtxD$B49qq)sBM!34GIRiy6oglqcwynAS|!C$St}n; ziStE`e36!~9~9F|4ZS+~{*zSAeDhdW*2qsD$u#8n{-W&vJd)2rgshVvcnjrZ+mWoD zPowZWnt>4o;TeraWArf!36CVjU{nu`j>s2v4WQSN4|2{(9%1RYBUzWR@S!L%l1H-2 zG3Wp)DG0A}IvPXe1Qv%CilOp2s5~}b9Fs4O&KF1Ji~2_H+o<3*$oJnMA8QrMW2%hj z(aGZ}kIEnGdl5)|)cC6#pM$u5843)U9ztM&q7bnzDzb=olU-2=9Sj zD+muOSvpoIhKC3|Waf*Ee9_DpSf#3dt&-J9^i!sacwRmZxAp^zoO~~na{l6jo;B#h z%g)EGrK0jC9ldfa6`2Xk`t~uy!P3k@p&u8orOtBjGoEcIF!j!%drb{q!$%}BL(3((wq8#q$v{SNHI9} z2FG6cqG!Ii$Uvlb@S$o{CHY7+#PY(v{`q%FzSk=Si1bE2@8Tqgmsp7I{Ojc~?CCJP zD1c!B^?OM$!{#WH7h8sXn4yPUFr*+n!!ytrU`|593@HY~r@(Mnz8IP>p3E0d7>sAC z+GnYx0}_p~B0j=D7oW-ZhNXb9Bl_@$=lkzNpRpL_Ffh_{aj3)bNr&ST0USF~$Ik?F zEJ2wZZaF^996KWy94QFTu?HH13eePIWj=3E=oo>Uc&l$A6(rzH2$Y!yIozE;v#Up5q`i2AKzt zFh`2P@dI#NlrI+MivY)LSl89M=`*C1#n;H zi!buU=LXy;RrMv6yo|(xTjK|}I^X*;1#so)!}~fPpD8)uRy*LnbijS#fcrcE+$+@C z>R@oMqD+2m!L4F&uOS!UC4sIs=Kp;0SrH*e(S^nZ%IB!nXDZ% zw>gP1rzrk}|CtQ!2Hl3$T% zk`?hx;%28~vzV8j0?FUdhu1XbfBM+Wl9cJdr>A2h2W3MCWdmpZc+?q1e-ez(gY})> zdfG^{V5}QZCYxHUO&BY^iV;{T2#<9S8UyR^NEj={z}f;>y_jeo69q95GfXQ~?Y%15 zheR_iFD&xU&Uno8Qee6teR!>sn8qzrcXoOX(&i4v0%tuIfb;-uBOZ*D-p43gS)?r) z=|SWIDFxw?R`XKBbAa^hm?$+ctAD9sMf`mK1nnC0&Q1X)ztr%&nE!!kR|`{~4LW*) zmRg!-^6{Gty9SfuHyNI1NuA525^pl3AUvrUUiXE`myLucAH|q_7lTwEgQ-AOYOWFw ziJfzo`{!KWnAax-OfArdcWDx)z7~@^=lTRtYDw+;22-M!G0ICVrAwF+y@V0-iGuKy zPDW!;qSr1mC5l1m22i>_CayD}{-)~D`wUUNJrWHHe+KNIPdCTB>r()AD*EtliuoVg z-fTh1>z(;@T>zfq*JQm3Iz-egJL$fQn3E=W-jo)o?O5Z38!jZBJSkh%+``WsC2 z7DQB{*B&A{7m3DHUU;8>KHVGh`lo>DJoMq+6T>rab%{5Xu8r??F!c{W)0GRD9Wepdg4Qh5iI&Y=nSGM2rqgN8bkE| zSSwa2hUk$H{bEeK5EIYG#B)aXV3hjD=tZkrz5s##4-TJC9t8gwJ(pY@Fh*7WMr{J{tQ9jS6VI`U<^o*1du zSoF*245BFrFZvxchSoP(D^@6m=rUA8sn*Q~gKf$uVzI z3WpnsKD@VL{y96@l8}>NS)b)6TKjT>T{ma^nbg_j;KR@?l*za3VdzZ;_dap~j)L&u z7NaqE%|pWbCB*>uKETb2iJ6Al5>;=hN|qtf)XEFz`w!A{W8SP3sC|S!yg5nK=2~j* z{F!Az$(eTDKwD0I%?*aO0%dZJg*Ka^twb)MQ4k*5H)srKpCMsr6a(4{KwBOYAH~En z!)=YK`mIXVBGKF`;-C3v+b1z^c?#Utp%3rln18?f#B!6%0Z7lbk1Q;?%&r@7-%)3u z1cUn?W%6SSZY6{J0l5H2L3nUm(HP)N$o6 z7o;c%PwL1c*?JlhCPgtw{SH!FV`588Y>tUdhF5)6`zVzhjYRXRi0|~zvK=vRYYM!M zMIYYwnE!mX!{N0RjQr=bElkb1=8&8DKG6Q|#-`*N0jD&+?9lh#4N1k0VCaodCbwJY z+ZcK}asi!!@X+(n81tK;57~9A6-gD-g#P=toDzs`hCrIUR|nT@i0ewC$s# z#syvj%K3|jaA%?qFFlENV@q2$C`g{)$0Nu0^&oj%f&c3y$0pYZfbLwf=~>>1v@{Mz zUxG53ZqYYl^qr9l^b~|ge<2zJ{W(Y&J;gvD1N!^|5iJmThIx^_X>-!igzJ&Y)BW% z4bzGr_GsY#g__VpL3l0yMq~7GJ4?U{#n4g)Edz~~JCI3Q2DHITYdQ>mu#p_-jek%U z7GX85Hx}JG(pvE#)^jInLk|Vv_1uNVkkOxIV1;7nc?^1ncw(@TbT{%xmX*yce8OX8 z@m5equ^i$@B?tRsoWM~l(X=hCckW2bwBpBE{XOUy>M01X{ysE@=>M>2tWXT~PeJ`q zPdsVV{}=fqht!>2INVWBu^j3LE1&eo-P%#DMANpk-nk3P`_rA%B9@qy6>-h@`Y%Sz_e>xS9cFAWp3Us~~`R@6}| zC5D3VVv3ZQLM?`3hk5Rgj?|yqFWv7>3%i2CPsF zG1DMsiV@QenJlJAiwc~4UM7UWY&NciXrA5h43(NaTd$K3dPVf8+v9LJspwh?Q`|a z3e+=)^>jjQ=%FCIo-Sw%8J$@MRw#y^`Oq`3m6&TJl_KA(+e!`DLP9i851E{+*AkCN z7OjRRtNRyHa^;$yKVwTkn zEg*}6@Upt2G1OeZYOq2vWPJo#OIwL0M%IPM_iDMamTEC_iC#;{TF$b1pao=65MI`u zc%eJg+`;da#|p)eby;Dl=v%0djs1|xM}P;@=sfvIN7=U!J6sXgaGJzSFG7SvBo@V& z7gB%y(E^$%2(RfLG)5nHvlOgQ3{C%lroS6a_ac)tJ-~YYUag)hS!V?HRrzq!^lRg{E7KroqT$ zO$)WATdLLcPu4U9Eue{l@R}Y+V`zGerC^0(Xu2JmZZn#mKqhIrjc3v!vbQLqYyIMW>vL5;w9_XPUydL_M9LRW$WnhJ3==m@7+-LN>j!e?i zfc4y0t)BZ?&luE(9ty(inTp1cF@ilONdXc|~39yYROAfIG4V@v~mlH|j_&^C8N&u&iWfJzN3rtS1LoEAcUwI2WxU zk%I6N7oahe&1Yp;p%@Z}LgJH!;t3;>ewK*G_Gr2$#)(fpNwVlNR6e2CaF(Vs;xLxA z2rVFsg7C5yqcPNc$ZD`cF=P#gtfvdbQ%2Sj%t1f5cnJfjxg%hAd{fo#4~S1wR-UDx9H+q)P^1k!t0@*C_*3V zM~tvSG4zato)?Xt?-P2iV?8fct7jDJ`9bNSAiSQRm7bqi2J}!2J+DAdd7*gONcu(9 z`xS}zTA}x8VkketPa`4&*V>=)V&y9xa@&TnWV%dw-(t0zYnB9kx5+F=S(>3S-C z&19>YiD$Pc+JGW}rXajA`UNHQp?+WqD-^@nco-X3D8?FN^eafb!@Q*rhU0uTse0S1Px$IH;r;D&K(0Nk-xhWRk>Ncsfj~R?nNP=MU5dH44J(*@ecC z@h8i`3dPVf1$rhMJ-d;~$OdU-ldIJYDLilOOkXqs*` z?MEhQx`G)^uU5}Htmgn~Lk|Vv^`zmM9P}L2dMJjT_n>En(NhDNq~}i7GoxBPlJ(R? zZRnvOyq-ErPi>X~VH88p`_MDX=&6fL9<#^vn9ZtI6P|9N8~iaHX`&#!reo0V~WKHJoZ9X3d==7@Y-e|2OEs7ViCi-D3Xrdszrp9OtDd{W)D-=W1 z5@=d%G&MmcX;OD@i>uYMl=U=4ZRnvOydL^-EXc@U8CanhdR9Qs@EkrY8bV={Md z%YCxsN4~Hd-~B3TD_Lb0I)F+F!mEs;F~sGuIIK_%m0v*R=SE^aGFjrodUkzYt)?$o zQw%MjiGuK&TB0$ev_Qf~1d5^Q8)#Z>G_^t|Yg(u^t*%zn8rBp?3uvMsye5Ih&{Twk zHBk&r>!4|^(bO85-a|Fj1>|zN3|d>Qrter2eEfB#t=upEym<1hRRJ)xzR{0MkbG@ zxzF5Kt)|Va=`^$eISRsSIunhd=?s>F6^fzhcWBybG@XS^(xmRiw^plX8|&$S+R#Hm zcs+?CZAt)8?Z>gz((1|JH->*9jc z2ruzwG={R9SQ%C*hQxeGj24MJBawc!jmP#Vy6?p}%BW8ket)C7p^mZ2ThRejQV?F{ zZD60;Te^;Bj2yGg-@3Be4#tstyty1(E(Ia5ME_JG=@0({W?C- zQVf-?p;8oyBBQcD^8GjKf<9{GoAsh<1-4;_FWo?lO1V5;cSr>OLNldUc?yRk9)Av+kOAiS{`(HMSSK*BSVVi>y|#x5%oeT}h^ z$mjjX+^k<_#Lyjs?CT5N{pSi+ISL&>B?aMCjzwdr9K+(ULNQd{0hRwY62~EvC7PS# ze^;yNPS!LYEue{l@R}08h&NGdO8g?;UC`9uXnG@|Nj*U5U#*_ISSq1kYW3X5dJ;c!M?rW!?LQE5hYo>qnOq0_@S;@oo+P^0tvU`myX>nB|6UPaB zEmuw#Wu5xB!+$)`yV{#3Y$?7#3=<9O)kMvQ`8_=k*F&Xide!MwyA^uuRjYfAYZKKw za+TtD1U7IT%+N|`GdFgxaRVv55oTt>jMPqU^4=Fxl2D>ruVzB-&GLQ9QzZo|;J1#I zbV|bq$DR7870)6;w?GiBgcda5Ioy6?kVhaPVH`u;9Eh8(#SM5~ReFId$=QndLPdPQ zi@NDZta!6Uq8vyy-dcXV14dEBc}_))Qd^iwm>%$w+Ri+Mqf`F@YuBcw<+fjx*x<{0 zgXPrEB?YtT%}N7S(v6{#hEvGH^}5mH+gDJdSG`_Gv_jinb&)ZSGH7(6o$IVf9`H8uI&g-pY|UwJUaCs9RHgIrFi%zL*3MVjmZQ$9iLb0q zo6f3GH6R$z)8=cm8TrwJ$E+@_uX^4=KSp(zZp6zP zZCH|$>yLcKjyZ&}2D+>x_mx(h)`lj~NQlN9q~H)caqt`*hqmZqEE1lB6k`rHYEvp2 zw$XENys9(-iPt1C2b(H~)l9FZRj1G-YTY<7g|dQ2A)>OKDb&O_g&Mk%Zwf_%MxmMN zu9_*-Ow$aQLRnR(&>PUNrcf+ce7?$drckQl^Ml0as_vXA)YvzLe35SoM@wY%>q=IvCaYWCrF+DE`C z;-sqk_i}7X?H}#i;2btv9ij&OigT;l+9_&lgRP_!TuIU=&`0!?WF_3U-dN&9peJ-& zro94N0c{FG)BXl+L3=e4rcE(u7lZbxhV~j{Dg|e?!Qry1-7}NzDhj6`lKJU=r}9*n zkdMik{+hn2f0my5n#pO*6kZ)l=s-IFig(d(wdQbfMP4JplNaboO`PD=XDydavxnOg2Ixm{1U!$!@d- zid{%}o=^-X=Yq*OZN%9I%O2#bsnSFFx5spqeWA)GeCkq1p5ulxB{Ez9GLr z54k?tIlIV({xa3w`Bk=gcGYcmJ>)jK`up|iIsXu4J#?9#p6BsU?1g;{1qES-BAS6Q zIG@o2{_jI;q~VhcEX5{TY^22oEcjXm_k5JWw@RJ**C=Se9TAP$W)Xb?h$ zTFAbH5KhAj>7#`lU?Kap5RcZ__}}2ZD~FQu5|nDx&j`$~SxtWJYVzwp#&fkMgMayQZkD zYw!~Q#A(GXP)zDL4X^G7t*#aNDHScTRO)EWRhO45le3P@ji^}~PiWvYyoMXKh9cHb zXf)7TVo%5Bod{cY!vSe+@rWQHMkK^=8eYunTFf98Q--B@1Pi8uuV~GtuO|-JN=F$g zL&V=-q$-K^#5WiRBZmft)9^aRXdREEpHlHCmSPANtb^vm0P~!g%J6`hA2L&w#5(>C z?-6`E7 z+kcU_|GeHlzOk()9h0VPKk1Q)&2k!kvlI1ZU*^q@(wil_>eF$`@{=x4Y?9OPo1_N` zJ?W(VDsS=?y-7)HFn40vc^&9+8~v-Dh8I8TaNFG4X~C87_qwLiS+#M%)DiVSL!^cY z`)=`T3GtkU7f(+SSo|0kKiY_=HDEe%@S`1-^t7~k5O2b5bMZJjuu_3j=`1{zHchAp zBcAu>u?g{qFYSf0lBs!VvuQnjKH>X^ln`mC-nzq+Q?wW2x3-SWB2-EP{Uwwqk&->y^Y z+pd%E+ithE9}X^iC9kXDf)8E5rT7y#rP;t~__3I)$Kp%$gD(bRDL$jcS6G;_px{tr zK`pAoEve7y3S+XGrq#9bG4VBaz^OUlZa2Bmzg?%)w_PXSw_P(9noD9VR>3Ka1*hT1 zVxAt0wdki*tie)zLyOh4Sciof5DE@8Ak?Bd=92oXt}ws4QhBH@J<_Uo#Ci4FVjnE< z<-MbJ&gwcLx<10biq0^ok#!9u7y1o2rHAa&h@}R}1}HDcfYW&u17?cokxERF?*NLX z2&dtv$b3CTenUU_E-04bXIlJ3i}hHTDMG=arU*iNeKdD=TQ@cvw+<croFVwhqqaQr^ z!BXs`#UHfTgN4Gqv5uqwdm^3v=keKpKA-*P;p|^bXMbu@Rx%s!x9ZsMXnPix)Ll@1 zHT7#r5@BbrTdiI--MabJ)IU_W&b5k9t()(5>*OD*TW1V?-Maa1w@!Xix82$<9$a?@ zt~B%*VDK>p#T6h$gU@OB!C#~Ye?R&u75lK{(U!D^5%AxXIJY%)k5aYLHr&S~-PY(z z`e3Xsmk%Ula~fXu2U_+)mR)IN)0*B-9hkD3{Mx<(XHculuU%8=PkTyX=QOM5FYx-KadyU(|$xmwG?$&M#CtowFonXXict(pg zqa&D6T`WZ%EY#8HNUTW;gGRfW{Mx<-E-kl#lV2NOYr>yZ;sHKwuFCFE(7ryh>7fAK znmP|W61C~nn|QKTk1FD6JvZo8OOhLus>!4ZYqsJvJg6la)Y0g)R2+q+noP8Yjamb{{ze9XR+IqX zVT%NS)9?W3D*-&par9FvT45<#Vxjg4TEo<)2ss-fNmTm)QzWEwB`TD@y2K|u}T1xX!g^#-^XoUamE+(LY(gEkQ!*e4p; zd1zlM&c#xkLyN9hn5jj?2jm%+6D@sh8ZrBh_ z8&1Ph_*7Hqj($qT1z4)11g&AX?UncK^J}L?W!3DCwbNpW4-hXz8`8pQcrBl4ExlMv zPb|enwCI6_8WCEPw4hl`6>#w6!+D+Kk<-=Va%xkh{5UGtP1OYIjd~=P)9`ZFX}N>Z zPpKG$r6{AtBUmW8zR#a1TTcmRbS1UX`R){=4g>OQ)%LY;d#a{|bhqqmp%yNx-6n2V z)im*K+TRr)+w64t9`|6i73U!^LYz5uI5&7Dt$W^p%Czn$9&>%eta`PYSNWPQf4}87 z&3P#Lkt4AfTe7_n5B+x+rj;^hd)~qrU2A*| z-O8z0j4jzmAn^w#2IN*$0!XUMRmw^R7AcSeOP;ECBHmP*)((rVs8e0lnl1cQi>D=Q zaB4OT8~Y9i^)_u|4B41&Z9D=S;&sGgG!~k7LM650%6>zVs=`l_rz*9TCrQ2Q+Qn}p zpwZ#f2svC^+qJE6=vKaiMPhWy$ktfINsg!i*GqClRrPVh*`&rA>ZMLJ(i$FU`ATU7bv&%dM7A*pJP zK9eSQS+B+axy$062`ro%!N4-u_cvTA9#rUKV!n=_LsjP|A%YlfHpG^-OAlqB*u6QnVE~2 zebA`rLTjbUKuc<%A5pne6hn@8d*kZBt>Eqkx`I0m+znPU4SfAMkD1KPq_2YWBN;&WA<>lR%)&vpj%miMS|;C;<^a2SV)Tnw3v^D!K~{Z3Ny6=F(yil6YJUw zjh5R@b?``r?uOJPbyK_-d4z;h(_LOl}(z*fu> z3}9BwV#Ek4C`SI@?|W69XLe@&{rP<8w_WwZ_q}>mU0vN>Lov&d?19d(I~uG)%g5Tm zVttZW*Ga<4LW{)58tex_4j*fPql04YWUvY?A8SX8^(kUqHwh~X<5&ajE@GC$#~R@1 z5MoJoIB3RK5_H(y|8zDU3oYN{b*#rv)8nqb$1<9A!MUar|634moZiQdh? z6IwpJP8QxXgx4biue*iED+N!AjSUnI1CI>0-nCThSXRGz0xjsVdPAbMZrtt(W9;8T z%XfQS>-J*0-3Q8o*O=Zo_l88C6my%xabE(7^qPu)wH-83VA=dwM6uVnL3M@s zLhAf(7*$u>KcvrRjAau2i^Geup)V!li!v6#7iFt8P1WBtmC*8=s=IBfSJ+gWN>j-S z$>r=-FWaWVBN*1THs0*rvAi`{@9(${%9k%)G8Y>AYO@1~vkf&xRmjRE9tw#fc_@^O zhz*&5DAvB&>Y|8LO$bp`g+(NaVu+Z5WyPo_J1_xJR80s`G$|}1QB(v`i7~3l))Yll zMvO!ezT@1C3UM74T7J6ru<5##={g9?%%a3)OxITf>B_pI=}KnXZ5cD?BE2H zQH7yc7FK3aipnA=3&he_9F1j7c1Tf_39&4!%%T*PNdH=@M*0gaKmB{!^nab{pN2A% z{?nQMui5mMnnKC%l8s-j$dk328U*sYzdbxjZm_r@g*q9BJ)L1T+)vMt>ecHf|7xrqVWsb z^d*bi)Nt0Ba0)FyoV{&0-)1;7k#N4{g_AV}!%4P;aH?y`lE$^5WFVYzNk1qioI%N0 zIDM9WR`$DHu+&VS=SW2y*(am>>i>bM*$g z(DI@8wb0)q^x+Zc%RK0;i9o6w$|R^yD+cL}9GJ8wQ$Wy`@81r?RkcGAjXpUR&LthjJ z*)+S7*lNW_Tpc|uL0y!s*1UALkBNfN@}sb!jlw64!oGeKuH}{Q_c+&eYz*HmC~kTDnas)%2O|+<_1mCLtv+j#R_{9|>(e+omdgDBF0iu;EkBr>+F1Trw&NzR)3px!v!wWEWf$F%_K(K4(DH3>W^ErRw*QP{=1({X z0NTmlj?ERua@!_{@E)Z7d>u!6@`8a|!Q(x8-AflQQQ-Y_D&TIwx)ZJ0?kRT=N*N`g z*hU)-y=!es?ONYJ`?bvZh zDpfyo`+T)a70`eUq2QwVh311%M$AIX$6ReO9|k>5nL}~R`~wHY{7?L)m{}3UOg;wD z4O9j&yOajfo*UxOoI4z61S+(ApaU(?qoAiLb0m(Lf8n4&kH%jLloe5+O&_=D$o5&Z;c#irsoW{%_GSR4d8SZcxIu!(1OBqzUb76JM#X_%}*)YUTJybHyOt`1Bs9di<}w8Tetbk3kScOqojs6xwc)F$YV${PtWu)Ey=#F@kJ~+A&U>E}hdFgs+NPT?Rn+J9VM`-!M+0h1P zCiJ)u;b4L@%g#5PIqOS#7!%@hv5m|6h|7fL+`|Tm(DIS&WRcuVB##J^yV*?lu$gYc zxir%VZV=uq^{tIhcrEql5F4chb@ekF=hwNEK;T#$NKS4|u47H0en7V_p<($^h%%-^ z%lBkw>&gG1$9)2aV8Y#k^MEG~heX}=d?#M^SPjT>p`&Ox?AA$>3b^*I#^&g``Cueq zq2&YK#R9$!dfbIL1OeZQ^B`beYyyB;Z2?oXB*2TnNWenN2mFKuybyb}yUTEx+4vN5 zsLw0xlREzm`T z^S%#su>~rH);x!Y_dT>aQ0T{Z9~c}$%g3?6;&_@kKJ;-cVdr`Z=b0yQkY;xIS8L-X z)y_HiLzu((5W`i7VQb?zbyfMvOj;^1IWU2P8v@w3f}h+$ODgvfY8gYJ^akGP$Bsq{2=}8+)U1jrvOEVYaxhA;mKE8;|i#Zpe=2 z5-ZKcI1rNMFvO4uEk7jsyPKGq?1i5wa1X{|X5%FpV7)wJ?h;XVIEn+Ad>Bqs>3{I( zRaI;abj@k0a>;KZR#}rhR2b`U6#cD@w`FX|?#Kjq`*!CP7p50yOt)H$j1X46F6P8! zTJ+%|#v#-T&xMxnc_;Y+6L_~bksX0Ug6GGeIN>-`C^@l|7Bz7AUsMN&g_iFyu68w*rTmjUO=_A0r%@_i?V{0RQ4$CGHVtV4prR zwl;n$j&Le<_7J%#19)~yy^$P8{#0%ySP4*Q0APuqM|^AnX7EEH?id_qHhxZks|c_T z=b0^W5R{l4e+YIEN(nPA=w7t(L+@lo=;T@ys^?O}x5`N;yYv@)3&NIVth`2>5VUD;(R?jUev-L@CIn*wm!e@Qw zMAu4_1uMLGc!Ja#5X@~4g$#{Q&zbgy=35(@U7*%&!C_|O4@~4=5E==H^8i=pY>m1y zvvDnXu#SxR!OfT-^x&At4SJ^4H9Pay396XGgF5 z1}=iEQbLF6gntvq8-@Dt-5I@YZOji1uRZN)A}`c)5t09)J$-Hcj%LU|ijkitk)JXY zQ9Wy@i9A4e2NOsSB|Vk&Qqo&VA0>U2P;1=1{$clM45MSjy)%t_LOnomZ_3bi3?;(= zMDE8gr+c%-y>sc_WdZjFDClY>1C>zH`CU&>hVC$jUfvwi%Qk1qy|j5%{;j^uq1FZS zYMs53nCoUXzOgx{EEJJD`(>1vM2U)K=h0pv1N~v(yc%#{UPA-_sj14Z-$xCs9Ox`a zVupbWYiNKXVqhamz`)9ZaRWojF`&%F4InKx*MK=n2K(U)xi%J-ZyZ|R+9_YxGnM+! zP_8wlm3IpzTPmqjl2O8Dh-Xs%IOqsx6WbQ+Cy{KLW3ox;ejNrjdzg?>=Y}$>#4myB z0Z20H3TD*Ygp86xLLqKW0B~(3pDl{q_sR9vIiP2Vr#HkT)0Ru7eT+<7j=Z5pS(lzL zVrtDme1}{!u-SR8S4gx!L?wr2NDf_t9I8e}1Vp*{djk&5&b8JDVnYt0S7;9P+YmX_ zoVyS89OZ=u<|ie_YPgNnm9*pHz@V!gGpz63Q_5{@Jio);rP*27E5zqH8P56`-w+#& z2w(1gCfNR2@wg8#F@8N3*R(b0g6#NkYTIIGSiCD4J&t8lmN*8Dr7RB%0@v(6BI$CYo@H z=6QogX!&TivuJK2nim93B;QyVPbtkenKbB-l+32dC5q!ZOj-sdwJ4N~1%x*kJO!&M zBc}AN#$2Uub#v}T6A7V#NR+r%va5~6n~cOq5{dhH#eT$&7nqQa2NTE+N}81HsAMN4 zJ1e0&-ZNT7j8qBtj6wD`?ir~ue0w+~JmaM<{GfSw#w&nWN^zZOhKe}B(uWRf{o&wa z6I!93OXFrX-XEGFml)|I5E_{wSKxPR-R?NdYgX|?VMUcIXrig;!jgjoVa%aJ{grN5N;_OJcLjsP=LPt=1TZk7~=z#b?RQymS zhXs^HqPS0SB=M9xAe?f9h1K_P%H?{Xly?b2y;ei|JRVA)5^oy*1^ALal}w+W3F#w+ zgh9MI0?A)`ZR=&w2rYk{INh4xh~{g>{Iks7=L6Y$vWEB+C8sLMD>+RG^~B>@6^ zV;vz9&&`boLOlqG=d}REjuY2*{5EtN@N|Ejp7pN;P5O36N!;MO`t&ML)8g-Njqfjpn zXw+9ijauRuI|H$iMr~wNeEwdadvm(tWXagoPDc3&bk01&K^Z)PZeiBqO+gF+02nRw`=Be6!}~wloNJ5 zhxc;(qiUBDeE!nFLvx73pZ3V*u{oCqFUK~ao^5#YQF}bO-+FR1)VinPKt=H6OL{UH z=gFQ>PT0eqjF6{D#tmw-)#h%23ejbBT%3XvdLq=b-Cj?+tYg|_4b-}om(r7!^yHU7 z0{*1!@UxP2A%cq)CF5z;FPv6X*xI-@l2#p1N*9EBM&ZKB_B6&O)`f0R>#i>@oHh(D zoH5K_`d(i_Z=hsDCH<6aq=b4zytT1aelnGdCc0DLTG>@ERLKqIuEjQjcKI$;+0mQy z=GWp~RhjsP7&w2%dz1ugt#OjK8Y?5)ADv%|e|&pR-k{5EV4@{dL}oUgHVn}^E%YO+ zC5|`_yp&FOD5G_vMC(jO>mnO1rzThjx1unoEZI2rn>C>V4+fj=F^jJA1;XbMrJ^E`T0<_Wx1 zx#S1CG|)N7vYPB^WOk{Z{)sLm)eFM{tbHr_>IHYdM22Da%bXZUi)2d&X9#3N3i8tQ zt$x${E!dpEEe(;(ojZl-5LTgq7?zm0BWw)MBF2kwnA!LeW4P2NE(WEcU;-JYq+ZEz zB~&1Ct&OjF!9gdaDqF+>H>nebm^!0(&kD5A+rS{~| zk$^89_dcj?%FM+vGY1EKtokJWG7Y`}&nZ}8uNaQ4gLAB-WULN8EttjIbakNF6M|<8 z&PPR`-h9^3+pp*vsc>ngb;0Yy#_^EKEy5|ATWFxUOYAa7S$7|Vo~Fz^95WB_a6b<& z4(j;R_$%NzEAZT3Rs`jG=~xEiJ;jq5{18+~`+1TY0+-eiw>m!*R<(x0CB_hgONKy5 zp28_ZA~X<^5_`a@HYCnv=mFc{Ftc$Pd%%~09&kLE&;w3Ta-x!xlu&{57C?Byj2v&t zzoVL|^&Hv1#mJuOrz87&!<_e$*)e$jB7-M|WK8Ht8I0=hVN|Eu@R~>DnK8lRC8_%G zBk_?aWqgG0SAl`oI*CrRtUaA3509nO3}MK!e#pK+$TEX*E?Fcs#A7n4@%DO`m935L zAWX~LLCql!vmi!wRw(gd;7^QQkc+D}66(ur)cPT6V${6&HVQf!0-@!n$kW!}e?X6W z3=T6J@2p4L-c|3*_{82}zlo8e5G=G?KyZ=oJ=G&|S>VJLC%cn0=$l0)OiC4@l=iO9D2Z2Z+YZzwLl zI5vl>^`a0e()k-FYY;FKwGaazYzAKn4pmm85+CFfmxWLpFB&36=26+ZYuB#80w&+~ zvHzQM$D5!D4MeHL@nnUK(%FpC#S*2tOqK@%$?~Z-)S zeq>O%#5gI`Ly63o8_J9leeT%FWX2l$-05<5kca5=lL4Pssh6vje5>R;C2N#?ujB_M zKPvf2$9cOentY;oK4QoRB6#;04CuZMgtEUtg8q*IWP| zu6OQ9W=Bt6Dm|G(ask-iTmT-f$F%;uzFu%?;$WC~jk{cbH;C65x3((3T3(2m*7W5d z=lmpQ7+5igLj^^|z<2UO3?-7TFeioYJQ;J`S`80hVb(<{hgYF8wYP19gnFnw36-`9 z)d#BGT1lughXeNc!|f|?_xF?3-$s60x$%`P{#rS0_+os%uXA_(KG6#9i5r9A6CnQb z77WxYTU6yIt}hqkPD2)N(d-Wv}~SaI>>7UQ7)M z90Y+YDS)@WA#hu!Du2DaZ8xp;;*9f$WOg*gB^h})$-cFGIb|kM25pVSX$zm2PJ)Rx zR@H;-`Kh>fDN}^EJ7tPo)TW3yfjisbbb^C#>|I&Hjx+dgSyIq{923%44}DjOW?t^i zySG7oK0{Dn2Q1iq-d+6Ln^Tx_jM$@cN-hiQkzXC@I8&BVVKS20&ZOx!; z9eu|A@s^;9<7$jFr3vF>r!|8nG-DSx(IVS6C0q5Qu2wVUSd9q#Rz(Y5=pRgN7H&B1-^y;ys&io+dM3~p{DYS~6Y%WtCw+eRBfk2@L%(=9Jzx6I*OJL7zQZ@^Q2T7cl) zT*rwFeo_K1@>_#0n8^e~*Txt~Lk0U^F+GufTvSiFV`f}gp#S_TPys!^9#r6};B5q6 z3|-{%Q`AdOq5W>eYjX?u(DKu5giW`Np~w9V4#9NW4(EY%<7qq7Ei!n} zP`lDC(&LNjX|rY91Qke=Vh!3RsDPed531aBE62-ty4f~2={6P($8-}~e!6XC(`^&z zaT{?6rrY*7*L0Js39FeT@vDigkw%f5CU59=c7RmyV$$r$b-;?muLHJ5l*#Rsr%VtM zLXx2!V}@i*rV~XviQuC;Hlu#A=1^0(NV3FZW%@)|{h~0duT|$dMzhZ@^C0sLnrpF| z#vKoCHm=Y>TfPglL_b7!Cde&L@BH<+@;ZHSJHBV@_-ltdJ?vjxa)c+k zAqB1}+aK*(J&X+Rif;_9c{qm~jW>lfmaS(J?f@&AbIrzep>hLi&5x5sg7!p1Rvjir zq9NY2edk%ScUHfR(hZE#?HP6fe8G$P)ajk&))qeQW_%P{;AX9qrpD^{jvli_vb7Y!|+<~r8EDS_WM#FS+!rYvh^L1=2z4_h|J`8y*63iHEE zqgorUWC!0it%cWTdxw|Q2n+MhPaa>bZz)xFxh4QR3b0PQW8wZ%S zpUyrNaP}eveX){Dlw7KW3gVvZ6!wIATN|H_c=DX_M5t#Qp3HBLCpQ6zcrxS)c(M%+ zGaDDvlcfPqW+>=um0YKUlFnQ7-%8OTKJ;2f`7h)~=-uH}`A;x-@>Q25!=3k%*|FC3 z@o?T+P)L@mzn}~rh%Omk!H*HZsD^h)yioX~bgn4m$!t4UMgn4Hua`zBzmo~uTYa9G$i}$E|_bQpKWR8-# zN~kC9I%Z$N9j&MyU*Uya&$XbGP6_oOz@bYU%3b;tPhP~9DsJvt#wD^9(8<9XqUDv< z+X|?)@jZ;ghseTt>w>52oGHodObWT*4DTO=q=d{Y<*x1H;^Cz@o20r2#Ea z`1@4Zzrrd0&SvgzEB;>3mb-~9C*Bpi(s~jahwJe2i~piXsIp>kk;=+ql^u#zb}Ux8 zj#sI#ZG-@IDpt9!S1B*;G>0U49SwY75w7$b%e-DX#x#~tPY)XE`UZ5q*ivtaL-adX zmX&r(L%lmv+U;hx+Z$-N%n+Q*T>u7`$Fyrbu7q;V6+Jx(wj2FmJbwfPr;nh) z^F~zVFB5~U3;x&O{H3r6pBjvyMGA_=>0*&`iN?+;-7e0x{lK!m?9PJlrOFXIMsX)7|=1>s|)^npJSg-T>=}?{tAT;IW&0O*iYpf^F+!v)_J?KJ@Z7` zFjjSCG!?4U*kxNGj5D`lzqxd)s(j7HI{Uc2!P%&=2#n3xN)|UEC}DIchl|ba4C8CP z!&z6Yrk2puE3(DFw>4Gy!{n)a>w+h0oYxBpz|c#wRRzVw&|dOno>G!&Zv|2X4~Ij^ zUaw}0JRnBzc}Eqzt7Msy_msS^MDj4Id_pP8KU4)D711-PO+9?*9rEj-HbvmqXKM3v zC0{7{QppM>E0uhuL!mz9F_CspvXl3$dpRg%Kx z1!k-&O-JsYZ9EV5GOuB1J0L*R^@jSoYR_?3~hGgv#OBHZ7TCB zW$=*|WZrNfuS}vo` zYZ!G7GNaC&4bJq!A_(AnGU`xJ27`mmsBZk-jj>q` z&KHG6VC>SZImA&=j9q1n&7!gYZ4hqd1Ju+4nmRX4Q}bc!-&H!Aelx_mvycD`O-s`d z#l+CLl)_m0%@7!xwSL&pp=wCB{^b_8t&RU4QkCyx46PXK%q}DVL+1^lq43VQFtlPY z49RUssDY1DQ*GReB#XdUk=qex+v(A6GF6Q&VgO%}wpxe)zF^wwt_EjZVG$U6PTGos z62ezZTiwOBIyWYHz8YIgV`p!}ApQbl>u#d0b$5gF-@+m=cE&agBL&4+H_9Q5cPAU0 zUcNC;q_{DRjDyyd0aC_-cVnP$Q`7fu1GtZfpZ9E2mEYF*c~67$VPO%NzF+*Lp!hk~ z_<0Zfgz2=J-a^TiO6rtklnhleOi8_x;Yu2mj8L+blC72S{WVw^sU)jploGx`g1RwE zwo~#OC1aIHG~}b`P;&mXql`U8zU+kF?NvpilJQD*P|~DiMh7p-cH%<$_6Xh9 z9-*ae3c=sK)Wf}%?4#uOO7>Oq2PKn~?59K;COVU<-C3HY$P6(y`KoJE1R(#cHV;(t zS0#T_aA-EKa>c_55xDy`3Y+A6Smr0vU|XXc!gt<>_phwDf?P=b3*P+RiWa! zez;owr;;O-{7cD^N{&)8S&85~`l{&IJxh&!MugwVF!L#fnWM}wGpE5hp|A*snXhD+ zp`Z*i$C_bgjt(=&2TU)D>3L2~&lm~Qw~k~=Uo)~Qf0Hpix4~IlSOlhT9LbTKf@1ns zV|uQdK3Pql54SIRrWH^JD3`i}5|Pt(raLISXK@fNg1F|o7>rErb>Gz~*deZz+OtD)0tiLI7i zO~I-}53^6=%0W(ZApsaVyH;F+n7U;4N?eIIx6u>N2((@HnrPeAsp0?8!+Rv0x4^^U zHk=PNIHL;7!1kRIPD+aH5jLC;F`R#iiB3>+Ptn{fV(v+p+g;5qc(}p&dtnh+drquT zP^|5x)*uICb7GSFsIj#)cJ3$!^%ofXw=wnzGNrHxj7=NGuu@QrookFe0%Hj4*&5b! zl$@*NKY>_BN7~7Xrr1a;`)!7`_3%eFnK-P*r{dd&|Wg9nTr++|1p1lI7qB zc5F1#;)m=~$XhNIM&$PI7ZzT%k7WH~{+%D1(U9991C6_9>Ov&X+u27;^gvbKG5x*CRFAM_2hvka!2(AdD<%)o< zZ0F*NAiLs*f|6IEISeND$VD*o2UI=zNZD54T;+LAyM+^#X4rR1(aM7u{;$$IZAX>cFy=Ve*#aV)ESuM>j> zUk-Ez6cT`=D+aP(P)rgvWtP>x%-QxUQRld#`d%VHN<9Pc%653yZ+m17eJVVr-l-_Joefb2U{SRPvCLhl}LTaf+t&{P6^UrAYoD zi62$7k12Uv$rDQED_Njqp^~SR$jA}R^Bc;==?N6a>BuwL(3mqzO?|=!!jH8e8pn6_PV4k!o%2%c(TFDkV|Z3-1f_u{P;L_CWbj|CJ}y!6tdi%HJg-Fjmq(`|Sc??a zXM}|Zsett<@}_np_K0bnu4};l2(f1#OI7A`%HZt;$XtvEaj%%0z3OL%JL$qQ@C6U< zjimUpR9`XZ1VM4;RRz3M$!khpSMr9EH?-|g;0XX)k*fi6ZyC(WrKh!V zQMEpg#EnyfJS?2W4RrD1M9yQt*G`M7dFgvEDwdb&M{DEkQ4}pC_CZuE72cnLsy~eK zROq%2e5?xnX?euWLj`||MRo*$)JIXN{1c-E{bKx>RO1sv__fv(L#Y4b80RA8#FxL! zBO8ePGq%`#>T5p4@ILc}uH{i({Qg*@Hx_?=nR6{_?~g0#!>+I+e~iN)66=*4o1adU zW%!Ah32_i1*;~M_~AZ#Oa-PhJt`K zqC?r&xt)x?)Rj{s)F)#JpXN zao(t$ObPljJH1~;&3KVvti{TB$rsi!4L*rBUH-W-k}!{U9&zSbdzmaS3NfTV z!~_mi0o^SJvByt-g73!|-w~ECoRyPpG5frTTNOXWR2)ZMW~G;BH1%_g@AyQ%Ut)YG zsqN@MoVUe=2jaCcT~k#k5(f0=@Z~OlW+GojjPIPnAn0^uOyGP9#Ddcy#&S$k!>xcTpnWx-q_s6ZtyF_~h|5u6~1^MeFGA(C?y`7kn0n;rcFbE7w7| z=ki-}B{rJpJN@wz^ATagf-_rZ$fTo7%;pSY!-yW*BLuC{HO6^^a<0x{uwBL7L~vxg zb&GM{telaK**(U0o6#s+!+HIzM~rV4`C@s{GsbsUB44i<-@R%#=5y~D=Y5F?`^5O> zDPN%>X1$m|o)5F_hFqTORWZJ)+c?H|zVbz`Dx1XkZr)M+ zi12M1X`QDlpp(-g*^Vi7R&7bcl?rFzo24ZOvRfqUYe?j@hvydqJ4N!jPrBl z{Fa=v8`#@t%iDjoG0v6bjHT%2F}|-7`J5Qv*Fipg@fE%dj`4jHm3MZ1I9k1vi>qvLV8<`qJIos@2aXB3n1y~S z6P+^lx5fUnB9-#D>7uUDF1KSWG22tjPJ6bJ}&{AVtmt; zuh4X5$C$tk7C<A)AT}>1JIDBLi|M4kUBJf?py*e8q08qy>Y38` zT@K4LGdhPphNQv?F~iRU0eZpvZH(_t1~d_(x$v9XX|j~FVyzKB>J665Qle32!q zzsLBxlP~ZMXQcK25fhl80+FlSVc?68{Mc_J_)TSKNV|3hlWp#zlThEOfsuu(3ABf|-ps zH{cW1o6G!m`uhs`CKX?c{#KNHY`!Wj;Y(r(7Jp#bN=gGBJQ5-1FEZmPa`KNXbHB*k zMB{|eU$HHRpqH;HcN6^2^P5F{IaxCP1?#z1lKAU@{rbVce$!wsK;Mp?SmojT?c9i! zyJZ6V?+kXK?Z$2*k1zRl7vwMTC#LZcp7{;lL;P|HG;pmU$5h#K_dC3Xls8}Zyuh>Q| z#dy?Jo86x^*#4Bl{31@CvEys7jq%Kg8u&0%pM5twJogGQX07a;a%oC0?0qXbasw2M zAh_(|H;`I7=EQ7TOkm&9NnmBi7g|>H4BSZiiF`VD0JQKsIpmW3N=%6jBtHscWhtXS zCNdL0CW2;4{!than4Fo zqIcV4oGQle!w2Q~!)NE!AY#dH*!U5P$PH;*E_a}bmC*h1yXx(VmFW<8v+*E_)QW+~ z6uiY)`iR=glavsYfc!58xzGY#xzCK$#OnMnsfifx7r+4;e(a*9WLmDbhtx|3qpTwQ^?Dpe;4fk z^92NA{!}+I0mfI^rH&*QA@YrUtG7byK2*b<=~D|F%H=~v4A4pniW?R;3%dj zfXLfkvu&FmtGDs1jmJ0!C6zk@&T$GPG|+`hY>HvFDgFdK?vXf{rnnGIp{+34*4P-* z;VVYtWxz$%n3uhTH-V2P3;E)2eb(cp6wzy?^OLaQiyzdEd=Zqp<ljMP4}U8?2j)RS~|EyilTA&pUNFYwTPY2@?%$TWA|t1 zagW6z7Q5qZjrA-RJCU=s{Fx>5!}D~dqFZ>C+L1=0Aqw#7F&dZY9mZDWFWeM2V=k?E zEg*aOU`v1z)U+)Wzctu)3=K^{_t=i9j+K0`Q{!?R^e`?$%a6-&8dAq-c^*n5x{kibZ%8Ee(XGPcqssP?C9Ace73 z=qGRTrV$!wno@3NFm>41 zHqDjLb>@Q1*ToW1oB%Y6P4_yAg!yFmH z51;G8Yq7+G_b5l}qJ>%H5R@#XIKOPbVyk6jk^kFz-s)y^h#|BKCT{Tfgh!Gl#8oYt zsZbxRhbn930a>WX@t&E<&;QDEv)oM6Izok=;T^|Ax%UTXfQJw>S!S4cJsRuxIN)c^ z*jNt*8tWpB@5M?kQF5u0%amNMy%utE%qpcrJ-0!E&Y&Hc!qBIS;Sv?3@-ND zbd;2Yj>n=pb_-`3A4WYM<=I^mG-#(KEM_0$Irv42IQRvViBHOzNcMko?l=m+t*whjH#;{+`TJp* z`kwq3ZcF|(;9qO_p9KH2QGO0<7jFyxdxZa@ZL9K|Zl?O58qIuJuIN5d@~M)~lzgt_ z3ngDFS)pX5lCP9}t>haetCXx(@~x8Zl&n$my^5j~Li%i|P2Dfh;`nkq)O0PXr|1{v$pTpaD*lD}#sRZ3 zh=%kWq=xThH^q>OZoL5A`Z4L&(>gtZZap+O=EyaAvdYY%%wy8EXQOLxr(Ju&;?d5C z!Xkh>Z(BZ+rJy{`+@5mS31IPP>;zERD;$@+n);NczLBqpR^k5n2;4t&=l3tLe@8xM z>l~H&oHE}Eyw3pdNCR)lXy=T=B7nD2;89TE9b@1vA-p~jc>Eb$WargmVCpA<_cP!f zZ{V$#OKr8rf1r{YC4-dID%o6#qhzp>AxhFpwotOAk~$?BB}0`AQ&O*FxRM4XBb02V zWNRhcC>g0Ft7MdtoRZN>wpB7l$#zP9qhzd-aZ0vV(x_y-k{y&ZDcMoUPD*xG!f{ZN z>voJ1WBK5ePiXVY5#aD7klD)@SHpKJwv;NkY^1OK=siVlEkrmY5xO59sChYt3-ZGD zT#zRKt;|YRGnG;|hA+qjQNj;&;?bOy6wkdepkSBglC~ZN+`lD=`6E?oLTfoaPj-dL3TbHF8ce(ab~t$;onErOLkDI zwvZ+h04=K3l}59 zHDlVbdT=C=%g8X8sXAOz^-j7xJCLe}sC$1`@((44DmhHa;Y$9g(NSiGA$a2ho@1gso#XeG$3}U&3Qq_}_pq3~>pd*V5kLScapK>_c^_e2Qf8ceeb^%@CHerJ1{{7k5nCLhHnA1_TlmrXt|(B!9q z2?3v?49df^|~9F^LzA%$i+p2jiDe4+;F58}h5fr)>WQ z5b-NVznXl%TRlxbH?yzpK#3WXs`$kESZ*Q{4#5NXXr7{^qPs|{PXC! zeTe6>%v*}jZYK}vX4m6FG;b(?%p01@?P7okEg#6`7RUr2$Zr#Xu&e+OY0cYs_ha8% zHouBeM8<&M)qodTKKPp~_>%}eb0UtJ6L>fo2YnoHD*kd=#%KxBl|+i=P8ngiZnkub z`j5_Ry`@^e#&;+&9=|Zp(VcpVt^Ly?c4DfdV$Km_Pq9TCYju$3)6WjFXrC-eVCKQL zC#i#AvLx%;XVaG~!KU|o%*F%F$LHLqzw}n~xH<`KYH@^U-4Q=A*W7^XYTRWXWJCtt89z*=}6YZv>`?ZFno`r%W-)5^Q?S zXX9a-?+iG{<`Y_e^Ubl%HywJ+7wXf|2ZrA#R%-j=Mnt zrm;}-We#evdltGGZ;oW|{flJB&I_@H(nZ)piB-6ajGK(xY8cdqlH58gca@2O(DGw2 z*T&#l#vpSIj*_@8|B{^L4F&SCH@CG~GbojRm^a*L0Q{Z1&KMV3zVWxM@mIw7%htHF z6n{lp!Fi2ktguayH=pA?GRCE3>$u0p)GG|Er8G~yKb+T5V&aG| zW^%9Ml({6dd{;iRu6z$YO_?<~X1>EgM}e>Lm)@DpNA%d3=n>;4yJTbk#RTEPI+y$m zInL${ozR^70q2Ayw0uY_ETkWy$E5eq_%jk%mt|f|saz%M*-%2uhw-(A(b0#|DFFt{JQ&_?CO(XH3=E;=!$@^A^U2K#BQprcObrg2 z!UOS_rtm_fu*+J^1vnLO7ILORPNp*E)fdRiHhht$4_>y>{e}jk8uL%QX@l&ZRjseH zAjch)Gju}B$2`_zo(nxqnK?M>@WsDc$30bTM}*1pt6qcLc=`9c-=?rFd#8j1%@D1??D zitTME9+Xhb^FqPDLZL_va${xEShi6fGDw7$kEGEec|?#r>>=S_AtWY6;^l_~QshyC zMriqH##=Ox3!29~H2f=!hE@l;@$%CGXr3@=gqDwH2a9HbpqcNX;a_1iv^vO*m!BCx zv(TUsT0WX4i{?o|v&cikzmm|z%Y$g1GH8UBk7h@U<{3frv_<1A!C%p9C~I+5;zcvR z_Pe!fySe1DgS9_t{Jq>_)?=^%>r>VF6uP4M3;mnZ5gD+$>-BaqbZ~GKTD}K6!vm~o z>?Drh51!+F*XN+MDf29jGE|~s7gRVepdjKFs+vW{C3m<5WIW2gh;ryu7Z`j1e+sjy z=UI+7WTn2P0~AdtsEFfN_NAbrf5#O`y(rqXpdyZU*_VTg&WbCNdQtS-f{HjkW?u;^ zIyP6ASf{HkvW?xlBE(6?lM$nQUPMx5JLMrOS?ryN_wM;PZ2>0($hs=?7C_i)d z6pxTA?*MaC=4~7$S4Qw=Kpt`AIUcyIK+0ofi4YBhcTq^&Ld&;3$=Y5cw!gEsogeU5 zBtc!4*_h_Nt?xJ`LJTKYxRk~pUGUB`CTi7sY5N|91Sqt8fQMOtoo`}r*2PhRgV)XZ zcch!FNu|1FyP=$2kM+|39+ZIPpX5}^3gM36scP&Ij3Zwz7nzn08gkEXx|Nro`onM4 zjqzl|(;P0X_U+DFAl#?DHY}CvLi_MoX!#yrY(3rvddxgIi$6V7`o_M?GOsnf4FUZL z>PQ1aX!$ViwJ`qb!#Fqr2FpAcZ|*FsWovkg?KU7D*jXp{Hv>dy`9L1EK+YnN%)fEW zoQZ=?0~Vm2*jDKO=im&D?~=nlkINr~GThAEyDbnc7@f+UO(wLuFt>DY#_+*qNJ1VU zV(pfX&7YLV=6n-iXJ$~qUIkX?uu2fpTA3E@<@@=V_47QSYs&lw$IQ7nh@TFfm-i7; z`DciN)vzr$w&bF(nC!a^`fJ(nb~SF@>^;-@;9yD$Eg#x43+-9xF)8^x{*0z1%e-6| zvWo=$d*;G}%mwU;lzYwq5n4Wwk1UXP2_*9lj+wV{&=`Hq7m9gGTaph5!@GR=fGub- z2u!ZZ_a1=QQOvyK``#GdBE2^TZOD7>WvF4Cgq9EQH{F?g7tqQt@KA|`Tp#0{h1CuO_@t^RDZ60Okt zHH4OrlsN;(%v2m~ zTYM+AF3W)}dnTxg@r7NNoVJNL{_2}`6%so*`fqZlMFtjs7FA+%9h4^shl)5p>vDUj zm>;BRvA*=tp+N0AwgEdaUh80XD`+H;>!K((jo=VSq3sD|SIEPyE+FC*&k@KSp%>Ft z95d(ga1IY=^KcdpHm==NxQEJIfEq~{0iC-Dr>XRRd30=5MK8p^IW1K#3vuew3aF$_ zhnnn#lmMijATEt#!;6WQ8BBUxMs7CNMH7>FCRZ@7%83j8eP<1mz-EkgY5{K>t51|iJ0*FbNcTYu zBC3|60t%|43N%Aqwk@Dpcm^tqACJP5FD5M|TEwoPiaZ3s5$n|cMmWN_dL?m@>S z=A4NW7~_qjT9Z5y|KMq4`@2m_l~spCi-pOT>ODBDDP-3qUUJYYAQ{X&IJ9YD#Xh(1 zkZlZElCa=5D^-W@SRP{)zSz-(8&ImeIu}X%YDnkKN8@v_5!#-?rWW!D#~=_HYsF2TVLHk*Ulxe5g?tJojCPU*1fYF1Gc4!hI?D%%<|r3Qlo zBn{$Hsq|i*C82mr6sK=QG0=F|-Ht6C($}+08fKJKr*B{ZBpN7jOM=8rzJye#Z#EKJ zQ{wgniCcXMsZQT!Bt}BQxdtZ!z_w$SrPoGFN3nE9v^0lO>{FqdrkIU1qH>8R7^A>#hTq%y@&>LECsSk3V)OQ*AH~ zK45DlEmm4OLva%nx2)UJDR++;4n}t;+PtfDR|?p)q1;(~ajB3kWm>G#cADDk93qf* z-NmzPdX(kvAj(?0q=i=;XeKW+)6;BHCDZ_ZF8Dbxfs)cx29r&WT~Wc9q$MUT>mW?O zB`+NeX$>^1H!4h|aL1fve_FCzF8sekvCF}R*AAC>5d<5W-C1d1>*~>TFtEq(L2Z?3 zJ?*<=OGQg+;(&ar?Uy~%PyqQ!s^$+M5?P*O?0XWmO_@bFW)||W00%qb?FSa;X%w)_ z`h&T%I93Gx`>XyxQsxC=z`TI-mWyQG@@JOQg3AM&otEq*hT#j%M{PU~EK#geZ>Z!z zdk_TDFGDq)3k{_&vP_3ksZPJd0!aK#coSjy{iSx)7i4!Cs3>?pqiVCClPfK}v=8+M zqrh2$V%nykmtq7Ah31eThnn;RRJXupNNiaCPApW~y5O>j<9JBro}y_O{0E3k)dh>B z++nov9O^?s*QuKfMPAMxPR?hOI4|YpPTTUIV8XEeDh;|+n=qQ0R;~&rx#&D4RbR3xdiW*EJo)ng~9*p{iJQlHaY(VyF zDQ4{HFGm6KSBldjWAvU3@kFmrVFd+Uqs4~fR8}O1gI^=I^l0gx7CSB7kQb-1h!GNJ zBtlbI#9>(?B*XIQ)G3J@ObqRBUa+Tan-|6HO2ixMjikuR! zC}*IfUn3aOZxD-10EIhxP4-Q4p}l5Mv!D%1#Dbg?t!a^J=>$3MBZpDtt&p+o+dP#X zi03ePnvK&okm$?+3a^I%$PFOr4^)kJMd;GfIsG2Xq~S(Mb^3i4K!OjKf#f5e7RnTn z^R8MhaiM<<%zjKE!Fv<_Xfq?Ro?Bu@-U3d{3I$YJtVma&x%8)MH00fKmZ^7Ao&JOc z@a|R+=Utpc$Ju2li;uI$vyuna+n^rFO#>V_+8m-*6P6iDZV$_vA!=au+W^lUi99u< z){w`g55e&&xp+YKJK;9Ix$Mz0x=C?bR2fKjLaX+8!)!b8U96D7-neQj?q-Dydj^cH zxQ7+V!`{89YU$n5D=h$8dZL+Tvxp<1I4>jN92RjTl$c5L&!x_`I~(-fN8xpI(!J8s ztEAVtEat+V3^+2#JwTn|8H+cvc|+;EAd_C#Z5XY;4+dHEs$?%OmgOO^6q?68j5gRr;!+T)BHe-V_HU};Y}U>)Anz#|j}PfD!zCXFPEqG8u%{Id&9R&6r3zOL@0v2I zt8`V%;9u7*h)UO5r2@acRwYBVy1ZvDOqdqot%fdCpB5t~*`Klg`+y>I)y3d&iHOda ziRaHaWu%vYNGge9Nu}qhFauppmwUGoJhCTI8(BdsB$m^apjR;6ByifI%)F+V6? z&_ePrQ$83)vkV$U61#N4*Ei@`1>ky?0__)`QojjS42Wb7`^K53C+<&;YqH(IYKO$P zX{aL#LJE=~y#vk!CNHR7sNbbZ!f~mWn7pcGsA3c5x)VY=2;@CV*<1`b8`uB7QIZxV zk_R872v^i~s5Jqj1T5RBSZz25JRpA9T+kT5Pd5%H7H{58-^ujUI z69+q<_eHJK7X>a$TN|h0V}izOWmV!@8H(2qbm-2-w zYqJ}mR3gCGwzH6Rj2o+FCGaiMR@)WAq)AP?0z*ihDj#c@zTm-N{+Gz?b3%}u%9 z0q4>4#SWdFlrl$7nk9MTo+zd zCcBk@6iG8FtcU61O7szQah}K{Xxl8qpG})G;UBB`qC6I_ww}M>{M>_g~jx$3iOxI6D}bacYFbW;l;tl^Lg`%BG#)VH?OR z4L%MUi}wgKP8H2d|BWpsmqcr@U3Ab%8o2oU5*5D7ZZ z(ToeQj?|QykE6XhO_mCmMcC3xrg4792o?LI#-QvXu&d&uAuqeT;#I!tRBjY#nw3B5B!=Hu3Y$_jNi6cmR*IG8R~gFRH`2ej7Ki^`f!3b0wO;Nyg;FqnIe z))5w=?Matu&;sGREL zsd8D!01+N&P4)xwLf-`zo=c2CN28s)$hd~Lj;mAo+Zbl!4637Gb#UPS3JV)G@Lw!@`V;nOd;b7x_sd8TilKz4S zA`$+KWg20rPJhk<=)W8i&Zjt$N*P*RDmHgy_zia~hRo>9R=gs}s{P9)5QH&w6}&RY z=a0&IS%aSGsCQ|yb-|5X>AVq-*gwH3;ar6}L`_fI5w+_f4>i|;NYr?asI7wfrpz}u zX1?a(D;#X-ZUBq(EebFjzH#Dr_(Ot>*)V|R??66CF6+j9Sm@xBoN4?P5%r!3=dL$$ zA^JvH{kT!gy0nD^lhD?T`W|N~mms2LhR-D|>;RFt7*ZRSFT`tYcBsv+p}n+N#Tphp zBs>%F)vUy|M3^L%XWBRfG9d_vmzKLH;^%?xnrMxHlfM}0WynoI6(&QBzjlgxGguO_ zpw(_c9U5PtwP&ch4f0TPD~L2c&(Zil!qukC4>;N;zg-#c0C9dnxy#D<0BbSdNxq-K zBBS1e$oEwK9?6SwX7IK0fdRt`&k_(W#nJ59b@VBl;Jb@@*HSO%Re|xRh`PHWldiN% z%vF=~`xMKh=|)L)x`G7=$33*di%sByLZd)qQFYXZE-ds$J@)u}oNL6Ib!gCglv9f4lDt?7reIWF6{P_;j!aoL0@k*_=LNysEOSDDCu zJ8NQ~-_nG1+wrDP`~*FW*j(bOOzUYo2BG^Q4>c}`v@_3GJ+HV+>_h0}$e zMiPKbep7@-*LkAMr4)Q-B&r8xd*Un=EX(t=iGf;<&L7~;pN$$c3zAqbSe+@0n~Pqg zY0(7m4~m(HD8IHClhk0cn_bU=24f(Epo7dFs6EwU}$TDqpiR14qc5U*qnL0Uk1 ztR#!{*hc{(-Ca$FCUsp|#=xdVNp-p#3jq5uNXR8M;2Vk`M=^Sxq+@$V|M?~wPCwXb z%4~?E?Pm*6Gsm(=#_4 zkgc&A!0;qtghyiPsgSWM428qvQ=%_jO%1NCra)lm3l{sgJT=*YY8G0arqPXY8tr>l zG~t@{jCw*T<4G@U5;1OauK}Yr7c_yIj$O4TTg#fX)XS*17)o-21MgKxr7TD-K{4Kz z5U zLksl31R{R%9Nl*a^fqM%V0 zoTyHVge+XWL77b3$lfI1Q1C^wG;APrC45V~aVZ6$1lxT;b_CAYJSFO)lnng1zr$9R#YbzWjlLV1upFQLxRyd;f+6rhP= zf%XodaS4|dX~_dg_;*n(uo_Sig+*5-4ZT0S)=S1gC2<@`gk`i|nHE^>=}{j*9%|kP zk@V#`nrsy8HD$6mW=8U`4G&x6VEfjGD)$kHvn|TS)iL-(I-{8=-p910DBP7`Q-j~> z{M$APMsC|aRv@EMBSDg!$c@EmD!m<#j;%7w4N~Q@knK&>pf%aw2rnU0jXzuqY8C~% zu`nYX%VFH5_uPfS>IAdy*BKcAMU!?_U6>GfY0)LA@Cmf#a>Rj_655`Y`W#vS?K6oB z{@^)UYJ2Ey%8bL&Hq95PC^+nq(Qg3`dtZ{h&;%&VE?r(1w;SmWq*p*1Ug>E&=I38S z9%{YzUW`L#9Z-Dfj|9Q@B@Bm?lpmBlER~;I=w3k0BsE=c2AJl&6kks^zV$s_rw&Qw785B6P{3+ z;Ou7sjEun#6x#*$kr-H+h)5_5KT@{2eX>76R>p-E%5&W(cmqkL1WsU}GBPtvl`fkL zfAFND(t_+*X*p$$Ra{ISD`_n>R_=%b2K;B>L9Xg)J94$#I@-9-UQmdgUT~Debom!o z=A@Nz@E>+aELp5~G$Bs;DAju`BAk_V_!Yd=I399)6E)xpZO?$w-NOC7z}?4#%fCv4 z8{|xeJFpMn;*i_dz!lmaxIHY~Ndor|9$fy_2HbvK+#pv1RJK9yE|noR`FcIv0A%YN zVUu0T!fe4?;{A-{LfhkbPwV&}#qs?;$N5*=jt9AlI38px;&_lP$#EV14=_FpZI91Y z@EJXFJ#ig>@EpVbpCtl+vJpVV22$a&sEtqzACNtWutK~A0)qE~{3UCzFln}0nrT|A&Q(`d1ZwY3<(t>$#3BmkZNx=+jN)BdRQy^4R`fBSrVNC&! zKnUWR0--9PDZmlclo(90A;H|Jq+psPsF<^b2yHf!+1Cp2YWLx5G>BWP$2WM2RUiV z-_JWvGVx;JQUq()fXhc?Bpoq%M9qZI9Jhvwjs$N&U~+dnO4BFigHR1bwTkE{@QMF= zLwXEOQ|ZY(I=0HZJtb8x3vn%Q2^6#@do+3FUT1UKJr<`fjVsW}y{!bFXeC2_}PE;PKFJE~e*AtZo z>Z8h~nFh0&I4RXN&j&&&77tfvlVZA}egvb7^&*L~tQQS|I;E=2J%o-2O`e!9R2D8I)Q=qx$dYqaZR zPr<1ws|UMFB}hI=F#ST9f3Ef4dOwN$nE!~J_&P$&czPqbX&cGOL$Iy+=%(iBL< z0-6FGfd-Fj3S?aYO#zOgngS_SKvRGts)_3fXu_?vZ6b+i+XgZ81~;ZrK7~hU14d0@ zc%sQ$M5Yom*wZMJ7D;1z8<=)ZMzOe3Z+0&_BJj#MY zaz!sCnkQY;!qCzME{~$!A`W-23}#=)j)Z}MJ}|@wG(%qw`dT`-teX}W<;&2~EaI1; z()^O0+a|z*@ECGdrUhktZh6K+9%_CABHr^HJ@E{LqbV~LN81Uv*NR9dBuAhVPV=JJ z2zEx%+-ffy$BwzC+XXu=keVQ>34Wzr&POz#ZS(T)~WVmq4V zwzN0$Y8OaJZi_<6?PeA+w0iuYIP5)8wGiN7WNP> zSt5l?$7=aaONx!tw}bdcUs>-YDu0={MFCqBlCvH4x4E`II(sR2Rj0%b2m8Za+aEpZ z5>}>#We;8M{4Yw%d~b~+p*73@P%D~Fv`f?NNjEP*u`H=xNE?wQRWDZ3y*>Cc*A<_W z-Sg|&NXcueG#7b5vsXgc*{BGr23(${Ghpk9aYFY4zPAM2r2wv0qb>tQ#)xYd;qNlT zN0G$viCzicK7`BHpZ!;_ym*D1+k)b+Md(vHhk^02{~oFY>BU6KSK7?F_QOm)pVxoB zMaDQjr0~8_g^nk!-JXle{*Z^7{XnGS@f;oR3fODPT#lpdbAMFE1Ek(%O>5($@^WJx zI#%H0sG986sDu*H_b2c>(@`LIVmbkyPcN@Qna<4+7yMjZP^14u&HsojSkJC(z8Ziq z?#Aqm&Yu+>?I9_$GXg*kB#^5JBr+ryQ0y8d?5pP9uhL8mthIxnGK5 zvXyB)ZO6EM804YmP!MTuo+Ev3g!-n;4LD}5=ixdWY$6@5BL7tKFA$g2Hk-6daHBp^t;<;a8;>4(l+C&r2{|XZ)MNJGzH1Wc(FmVb@;AKd50}iw=frh)W z|7Bc4r8XQ#ql8KgxqMUiBGslvxr{ES!m5mhI*83=HO4(*lW{Mvu!7@>=Aqbnnf&Iu zG$qdIe-k+BRppG?S~o2oU@=0%}0%ZG3qr?oF}*|HRA3$5D5*`2P3J> zzEd(wOa|&3%I!LNoK4Z7Tw+$P@ z#hC%ZpYRAAamAsg&ky&Zv zeG^~6pO5-we81yzD3ST-Tm~UJAN6_t`6wB6K1%s32;vSDiIV$DRYJx{jIN}n+pVVi zsi_GElUGk-;wVYVK)5u>k6`xXA@C^xr6OvlTL&MY#!?(4qwnBVkPo%mZhmUcD^(>K zBe<@iyQ5GZxbx%)f%c8u0`-x$XJq`gpOGNV;U+Gf=MNJkXt*{(1Bavp4YkP{u1nCs zQ7l2j=E)kahlWsWC;72`7@A}ez$C!aNC1~X@Y>yFc6w)lETCv4+B0DZqaH(qQBMZt z>g?+{OCI~AM#jFIRFExW1hMY&MnOTT5y4wjkRgR&_DvO$YuT+@#aM9&eyf1Cu4$=} z)y&%<66x!%QC+BK-wu&ba08?EBQRM~Um#;7ly^k+2FB_~sW-Z^z-D6C)mb|)$F6Zb z@Kup12|I)FHQ{?78i`=K6PRQHOTsMizbhePrWM0R{7!Xu)U)w^IzC3vN*O)K7(sUr z(eW-#rVBD#nN4&zQ|CW%2;51$jnj5q)#pGT@|zl&ZSR2M9OLucs870KLiDkxcY!k+ z%mt1lv?eb1T6hBWE)Ar`42;|-*71j%Y>lmtjTX%Qt_XyPOCTPIO6ZL=CDz&-yGOv| z{0|ljqBfJ!0BU=~E^TcUJsLGuj|PtXJjG++!ENjyjwQFv^`1?4IUX^)ND^)J} znc0L1T9bW(ywU`Z6aE66+Bq}z$|L2;ovobzz;?dc-wXVK$I@Q=P>&2m(We!o7okS% zEr5pfGMusf7nY-r@e2iR^ix*pA}W2)D1DMA@0*jSaS|G5G^p0u=$cCbPiWd^T6opu z8R*YFX^bt#NlRz%l-@bS$e%V69>%s}i~!}IUB?Ja{>l+W)56oTE>4$F?LwpWS=N1E zPF}#t|4)Zr3|f8(C)mi^0%7YrY)LvKh4dmdMzHbE4r8Qc=@3QJ!XwXyU#6yxxyR{6 zTCz_%*efW;$Z#Es?K+D#5C>vWJ|O!cWh8fA1-BH2Z?l9!)V&6Vkg~0$3l;2{LA(Bq zAxzknwT9p$H``HPH!#d|DY@H&$8Vq*OICW?jwP$NArCcgfrz&}M_(U-9eMFBK7x?> z2nV}b^$u#CPf_5qw6$@uw=0VId>Z3)@VokV$^TiDpTYJvjl;K)b_MZ0a(@o)Xy|B> zie0MmyE;Rbva67IUxkzJ_XWR8Ehv$p&a~(T+?Chd?|wi_UzBGlGz!>O`B2R?VYsSm)9;qPzktPr z=J^uEvUSFNc~(F!y&9fL2AfYd`7P@=EE7Ycq&mHd1xSRI$pF40 z0DStI+f)E}Hevue4#;j60Pr>BobRB!j4=B7f$^FcE4s=H`33kk!=jLwP#7dwn4p*Ba{l5jq27*yNtxJ89pu`X^SC2kC2j!H=l$djW$e zv&PzNwKfh~`X{hNQ>~>(S{PcogCW%^sH0#5(!4*ox(q;Y2u;fVLD_*Gj0#v$7vhq= zptl*Agj+CmwA@5q*_-u1x{e@C{|wXEAXfoof8m*Q<4&js*SeHt-bhYuV6v$*OV^^b zR0pY{h=Vpuy9g#b*0{7_rE0S^p8H*CURp4&SKaTG7H-+7y&Jjd;0Wld=xto+j?$JM zIdMNNZcD6sSk)3MQHCh=La9WhH~zqRA98g79@jLaO(hw-B3*AiGFO1PV6fts+Mbmz z2LS85fUzSYPB2ZDB9|B}ldZ=cB_B*0KdWfHvY2(#3#e8fH{v^{w)L(Ly?$qL>7NBs zGpZJ6-X+7Obz4`P9mKk{a7aiufFe4BeI#(m>G0k&Eo?145bS>RAO)#k7r#z6KIO%4 zBlVN^tq+2BKz4IFA}(wU9-Fkz@6m1#^1Gt^60R8)x%4G8viBlbX&`0RqF-LcCNMqI z0#HKOpCK%CO^&$6B(Tnenl*e~4vejKE}h^{nL&>_f!5y?(4}W?#y@Zw&JBU74b zOZ6Ca#XCEj9Rz0VxZV|2DVIXXewW;!*kPW$0kN5)2lye`q|05QRk5 zAQrz{`sC7NNed&|A}!kd0ZR1|{r@BHJ>aaU&am-iSzrYO#1<>C;Kfm|VxPUbiUMna z1k|+~jYf?vQ6p+>5mB)ld#|zgnlhS1O`=8 zPtl0fr(!g&^{E)`m-VR_ZQXVAQrB3z2e2AMqXk?P@aT{~(mA<{Uwj-+nsl|RIhvmY zC|kYUhL|?sD{+{xn|kvG(;AQmdJP8+Rn~Dmf4;8g$3b^>1s2Pru#5UN!BV*x4DL*l1S=biqAW?Zxei z@sJ11+VTn~ti!!_z~lQ0D66ZpSdGQ1ELLH$G79r{9Y`c3%$o49?p_QYJCnB-$T)NO z$d&MaGJw}DvNer8V#3L-2|?lea$HPTLP6dMMc!t|ODl@J6N|hpj+bT^c_$Tl`#WCx zS>){mZ>@#~hF8blWX}dbfkW%#pzL8C;avx~oz?Lut81gMP;ThBr{EB+N7Y=ug4~}( zn#+APN1Y@9|9gT>2natCV%ohV-iuG~4Poy!I^KXn?s2^T5rlO~!7X#OX!uQafFTfX z!i7Mzqj_|^VM8>v2yLS|L&H~|dXXGF7& zn*Ak_#u0|&R)lGeT(uXI@^+91%(ggaB(RQIV^^&?Tf&Cw7A!Vru^Ed^S#+VWndAqO zNJz4Yz`Y5=jNwC4KZN4%g9F%7vps|=n}Fb!rl+|yQ5&CMp%3xXpH!RGs6VUGkgP_F zpi1kPS>cv6PVhTGlM;1Xur)=Y5kI66+kmV|GFT)VBig2TN9Qz!p_-mHwZ+>}L+<6H ztx3VHU$yAg@6JxpJcxhbWD+A3FZawLstCtMrrEBRa--F4Vh2Qmm*O8e#TLkTd#~6C zy;p4con4N=W5G-DE>5xaXS{<~Y=qt`&fTLlj|DHqyE?^|R`CzLVk7ikv2Ct%9t&QI zcY|W>F_m%}+Pj0qF7!`;lov?OJ;>P{xoR&)@1Bqc%ujI8uwosfcT0`lUEyza7ZyKa zu``RESnPTg~0UMu+x> zRfvnL_98CRArF{+6b_uQj<}qyxcnGOs(YZY80_n~_j8B+#hZ|!`}yprG*)5%8AJ-R z8Gc6Z6aB>vpU3xbn$RMPl<9Rdm}Zs{!9~=bREqtRlqcK1yVsRjg16cfw#r`bzW3exb=_o9H zW(p-C2cj6yz!9iYaJXxt9GhmkCYW#p8g%93UYC28>mLoUETA2B?&%550!?>n`wY~u z@@xr>%{TG)8TxLDBB80gUaHV=%|WYz6(_@o@UObi7Z2mZ{Ft(3ohGm&ORV$SrPiy{ zIYVTYGE)A0ZuKK3v!GQg^EyN{7^ zI61c77>y~$DLqNLF{63zI!tD$!;XVytvCvuhUoDiCG2u2ca!U(v>IlfK<4JiReLeH zo&1mlVf~oj!}^^4>7<`1I`&^SshvUUFF-BMhqTHv)fBr~)B|Vzd7?UP9Hz%~xbtHqHdT<5d&p;bv)~DzO zL!mBfXtB`o0Y5%6(_)rh&0j_2(`h*2eGWC}?4%v;ru)@oX3FP=2>&AZz0vrsgTqGZ zR?Wo9u>*fUYr^5JO*8gh0;x-M0k6C75Pbb`-F>G_#83){%r(G87898bF2_g2Z=nu4 zdhl8>&~^Xx%%$^yNDP{4uBT;Zf?r%_?+v7$OzKShT!|&%uSh)`RI|)nPk*vK0SD%e zQ*(H=D^YEVE@zoG`PUQGl#m}r8eCg^1$pJbZ9+_F3rq?26Y<-QM_jklG7cD}5<9KW zs_Zkqx?|S=&LNR2L~0!rzw3|?uHO@fx*Fl&j(t`X8!309J?*rF5vBJ&3i=j+)^c`5klO-}}f&$LkP>4N3@LlWnfj%KI-v5#-6}v-<&|&U~K+M4=gfEjM=9p!N^Q>nH8M zr8dwIb||McW}$jRNol_nmgcelcxK2Md{qL8<0c(Bo1cFkpgPJCxOph`(2WP_1|OWr zG^Oc7B=KkG<(U%jVUXsq@BGbn?^7=7j}Ul3O*s@PJCucwfm}JyS(dHikAqsDg*Sn% zDY}7WF$>jHpM^J)SK09d_54>^_@r#A%bAuz@rO=}^gKm9H-nIdJDXf`@pzhybi596 zc+Toyh92xZ|vX+RX3@oc%VBL}sAL|&hT&!sldkZ(N;pQpO|EPR1(Fbidx zvhYQcn1%98S@;r2bC`wxF^=~s7xjM-ctA}#6e&BDg|C8KzngrG)C&=r%0(>BXK?|G zi&^{}MEtSyUEaUzczm0}KQjI_ z4bFQshgSu!agNzN`PY6Pb6F=G7ZtPPw(5=Mhzcqa3 zz|6X`KF4>axj+>56X`3>40oSF?Oz0Dd_iptkeSi#5G~>dnFVO~^}ap>&EPMI&5kfn z<_bH=v=Z#EfZa6=uNZtuXQI%huTz)iCR7Di%!hxcKFkeR!FB`t55buF>ImD5%=WHC zaz*b+G!1YwYVC7*7v@bLH03(Xz?<0+M%xs|}2hugL4y*ny7APZsglt_jG4s4pMHhSQXvzHA_bw*mcZ zX5%ktVxZk^z&Q(a*U(7TDTM~pI$|5JrNg{zpgm@cH4I^cbyE7H@Iyi6;$Hg~9go7u z3_}y*XOa1L8kzZsG>4J#lbj}YKNBho=i2w$e`KJnK<^BfaX6X3-k6eH@5T&wV{eYT zKxU{57NBMeXnKolK~S|@Qb08v7b1zfCFQ7gOAC`Upr$QGq|Jl&Io~1V|AFfx;=Bkg z#$T4!-c&!l;j#hwaV*YkFRaM7#j~vua*NTWKY*ZFz>;xsQttqD4sTv9VS$kbLs^nk z_FUn9;0Vz1zU7@XBcX20FY#ThX_GP%&9H0~rT;AHV8_%(>OG=ncV{a176=d@O~${N zIPU)3iEG0R$Kyi|`1j%3Ey##T<0q#ayoDNa;HT{h9DE+%JqKUn2|4Pu@V%Chqh1UD zGOm;ZE-giu{s@2Z91ose6YQ+zh&o^wjdYiFI`a22BhcKDVa|^SAH#Cx=dfj{+NrSrv z)tY6yItZz>BFKJ)T^Xm*LkOb?{ynxK_^Xu%NYj9BS9A0r2@qbzV@AU48VJ&=!mCRO z-0;xjob!_*{7UYYAhwzbB0cuT58}gJmPS7Aokab8Cbc z|7|an8M!7DbRnr~t%_b6pt|VIn1SheP&`i%!H&?lZzF1-$l>P6nHgC;bL@F?nHlTT4DMhG zubFHAf`R_X)PyUst)be4mp@(I07zJIiRG`wn#RNfgE2B$43)dVpcz|Ru-fCOHbsxJ zOq=|}AT=fA2cQAB#gCC!yRa!V{s~kQ?zZ^E%eXm7>mCQ5{JE#e-vuwG$nR0)Ns3U; zJtV`{O>b}Wo|WEOsXSF=$S&9IwU(&>D#1vYS&b7Xp=xb)CymDs6WgMa@79FsQ>NyW zD_gtS$;~ZW=I(n=D;nf%PMBk%LHX2dU{F4B8X1)B0?G{9s5I2>rTT6{?cStM8PI1N z7d`VY=Ks$^y-Cp^|Mvg?EYw{v2zx(`qDbRI8>`LO1HA5-tH;d#MyCxp9^ zwscx-{Kxaoy%v+L(;_Ts*$P@TX9aJ8AThTFnVarNek>h)fv>3}6Y0tJ)WNV@ zs@wh69nhd%gO)Gt8g?Wv?*r8B21gFEdkH&HY@V9#8AQ5Qpc^$ilRN;Q&1qt!qS*k^ zWehCX#WzK2(kotXvRQ8y?S{tmb)_^J(lG4KW}h_qwA_QJ&CxML>dkwUhd>_29gKsP zS=RA{Ygw4zSzQKYHDa+e3VQ?W=VD1n=UUCCSrcB;A8}>hP#x30Jm^iiR^HQa-{fwu zvM~}1=9GE}Lsz)*4wm>8sY9K1npV_4CdD7qKCV0MD@eOo3fdh+;?YgJ_@#YDW8e8F zM$Wso_LaKRzM`~?rJ&tG6nz)Jv>(>k_v{0;ZSAXcr+sB<7fV6AgDCngercZx?YXXU z{mFSRy+3?7cxua01(H(7-X!HLpdcxal)E@#9ZA^%+|KHnD64C*sIh2g5wlpG#cC{8 zMPb=`lw=c8IaOsVm*Xua0M4I6+2}Z@v>!pu}v_3^BgLDJ=1d@1{c3ns| zMPW2fq^`nU`$m>Fijoh8o(`EkOqZq60gvGGvfRXnboYfl|M{=nJIx62FJMrPdoEC@ zwAKC9rjJo>JAKlB2|dt3`>x1ApX?(XDZ&~@rxdki9~RUTGiKAN;Hj;}PQf_Ru{Y!B z44?q)bR0CfvyO2z3Amlri70K5oT-L{BpW2|_A>YSIkLNBO!CO~4QXGl)!lKf6LL3^ zB@}N!p-7^#=`5($$abUd^|5~UrN=(#HtdChSFW|m(r65A&D82`hPw95m$aQv)7+yR z1M)+ef6z)3)m3N1xLT*G&5@41>4x)wf^Ik$2f55Ty5W1k?W}$mWpxUR$tbKt&IgP7 z$wlSOu?RHV**n>sa{;(gvdeMatFiBz z{TcFr`4bL`1nbDHgQ2gpdJxL$fha7u?nZ0n=O84c+8;|z$7UG6wQ%`8H%v``YvCSp z9swq%R{FK+zmS^$Sp~Lhha_B=pPa((BkSP+s1$y8f$ANbhNxxj{oqHUQNp@^M0_G@ zpvtqq5itMj4+$LvH$z`g{{XpZ{~W4+5d69h`2|%*sp8O}z9Zt30)rl+ibJX5S^dTb zKS6QJShsn^Bbb~?IaeR1;EY}fJ_12>?vW5x*cH3l(X=U=#WHPj+xSRL3Hf18LR)cc zi;p6&g8FxwG85G~4AZ0JKaBiy>GNYU-8w9x_b_F2d@@Z*$wZcgBKwYioI2T+2@OTF zrOXp(sL2=P+mop1E}BGj7wstuQd8n_P4H>*&Qnv!A_3^u*)t^L)>))p*1V-`&>ZkA z8j+v0114xxjEGM`4OC4%$KZS}ryh#rW`#qDhp9)nQu`d#3jPGbpO8&Ge;w-^j$=b{ zPV#1IP6~(mE*R=Jx}m-)$9wS05X5oD=$AusGX%fE(LjuL)%$=Bd7ja1j^t8rX113g z511EmP^z+yw~U;il?Ee}$EJ|nfTfG|5e&;ULbo!;6{Gk4|;*RszcS-YBcpz&!Te6?BtAq9DI+Br8%e;K`utf_sLkh!DB5> z;17Idi8A018v?6Ez)MQ7b~9O{8&&FDQ{o7R>H}eBkBQKth8Nv9im2pQ#8zehgW3kFi$)YgCbIa9ZeaXJ1>;qh@nhTl|Uhg<f8G#SEdpL%g0)|hHM&)$&XqbVIMgh1)BC35b9DTLgRlLHMVt8R(;YB3V&B6WVtHqSovXw2ej|!q<9^sD8>;!v;h#g74Q-eOxJ;^)N1q(;fyezV znqF${qFeeO-`C z!u9R;PcLI%AKjuW`Q9jr{i>z0Uky|YT$k@Ie>reh2RR+M?WjawG0teIp^_iC{oCSy zxlSkrdavSFc7k&dyp__tpFnt&;csA4Fl_nU)3px@2P z2dxgLBs=POdfA~xoV+E)?yD(Ykz$}=b|4CA|E!Hl^tF%Ac!k-Lm{DwPi~r5W(luEv zf?P*}wcn97x{YPAf7DdoKh)EV-|o5HTd^*{{@?2*MJ-Yc6w(QE*yo?PGga4xFoW1mk=H#N#9waD}hBv`wHIMMG} zrupReylM*bDT@yE@VB7;;H}sYVBdNiYO*qtPPs7I`5yFNzjQ_#9rtM%1hoiZ3hn*@ zoXFPy;>iEMZ?-}{eHVVG`7{-ksF~41%QRN{`pQPA?|i`!xpEOtXS0ShF}Rd;h(AF~&L)OQKL_D5!CbSKM{-|cE5HHEpI z?HAkPyC|W3<)+Ti3qbIrYq1e=e`hFywHe*ar%&GDvVGaNxd%)bx;fep7MC#m+{Xa= z70EmJwz*u#$rkla7CWcRr8x-1x3e|}A*gpUl9SqhZb`oy=jc{w#?DLG6DcEqV74B=4;%>v@byqOjGLz5Yg>f-EI97 zK=mBV|48!tyihsKY0BMg#Z626VnOyJ-V_XPuj21{q(jdXwxUgi) z55a+><9QpZQ;XE?LUq5SCdx_^ujO$vd~nOsh#&8Z^7&@^oN!l4kgAy9OVOX82!5G7 zq4@w&%!65B;E05`()ko3cRPJrcH>)@goVcxR1x+LQe`)}TXK(Ep&bzqY3R9H_+F@>$Ad0t8Wj&~Xoy;5$lg@MfEN0} zdR+aW2QFzJ{FEYfw(SFIYTLf3MDuyu_9Oo!sBkN|UhO&^)%@Mt{lP_N{darM1Otcc z0Yn<^96|L!RB<@S9S+8!@&t`9JoKeQB@YJ<0Y9Qd320j5DIB$i%m6)_-+vUbLi+q0#`SO2rWqe1G?{6Vr{!gKd?`ZNp5c2ge_4gR^^|S;hbigl*37xic z2Fjn;uU84fZJhNvb?h8zrVEDQHRBKYarcEWXsnu%G_iWs$3b=NNw6?oPe3JF(C62Q zsN^T-dE4TJ8s?W;lwZG~H*=6*Cz0<#s7~{+JiksRUoH>J^XnAyooE`9NJf&U#F8Vm#^jdbq4t!3GoJ$=HZ#-%jGpcR#-ni&m!O7L%exP`OYR^F8>FX z@|{DzM?<_prF`d+FF#HahRKp_4n|1AZa4n!$Hw_3+GwOnhogeQFnTa35(eGq-4BNg zpe-E^7oid@?1#g}sN{#kJoo|QhQmQE8V42Mg}HwVMvGV;yAaJZa& zb1)pPAYU%c%ZJ0239}ZWOFPFaM!{Hk8<ntIFWN9|)uOb$iLT8-+TKjQ zIY`@E$TtURdn@_oAZ>p|zBx$SUz2YRX7S&UFPGlsY5QC9&A}|5kS{k3%G35X^5up> z`7C}r`7{i2Q*`}QZrh&UQQ$Gme75;W{1&Cz_At$f&#GqILZok6|DM8+Q`pbcSvvcv zzS(BgEWu6lA0W(^ErTyRBs9cN!Bg@r)M71T;>BEQVl#3FO`xxd=V%o^zEHC`c_MLw z?@npM$z2p+giM(UL=sR||B*cTN#a{vyZ%(7?b}H<+OR zZbjo~7gP}CvDBmi>5sYnn(rnBmyP&B1-=wJDf^_!<6dz}d+3COz-BzR6pbp)K;OXEF zU99tTNQdqK@N{^G-c#f0{2k95!U7#H*y(~DuiEKC9dFv{!X0{}jbh*F_}Zw8bj-HX zMLTp;oD7R~=$1H7m*~)qFrF^i@tN_C==hkY98U~Zq)>JBL-koy(T@x;MB>q|2h+P> z?xqah(^Z2co@2CIYF834x{9UVo_!uBZNZzH{l}Gl2QOv8 zU&-~vg1>+1i3NW`(-RB+O1y!U`1AV)E%@8+1}$S6wk*w-{Ew%k&MsG!LWjK0ATLuN zWFJavsSmQXbQ5G_=_bg=(oK+!rJEodOMQ^7r9Q~kQXgb%sSmQXlm*$^%7XlcOZGD` z$lUj^KjKWy)W(|e($s{hkHpsPUXB3XU3a(Gp$-zN!wIv**ln(saUDRr;#jnNO$CiQvX ze-foRa(a3(7k&bHIPozK>Q~k=7jA;jfpk{eVSP1bu{w*@Sgguo6%;l#ehP`onjrYj zw`sz^z;7+}qt;rw8MVgJ&8Rh&Zbq%KbTev=rGC^}OZ}*|mikd^E%l?;TFOSPwUv$9 z&luzm1X+JT5e!@kxddm&*uZ7~WCPbWIG?L;6LurBG+qlQ=N+0P2z99F!A7W(73#l$S|^#!1R58Nog2ApP$!1m*O0=WPkk%UbHNr5_~1(*n}H23Cj zmj*x{ru8=)Sx0EMRcNQc*6L&y8?x8{g~hiOe3hvn6hA&sCW|;G!t^J?Lpl@KKNLsC z*f06E;ZG6qP2DN_{4s2rN2VlHji4t~W}jPZi>ILmLp6~Pbc{4qslKsmON>zbR%d8R zBNI7t>r9;9V%F&KL?8P}&+L&leos=`wd@UYb}@>wYZGsm5xzyc7}nBXMwSh-ZZNFV z-;r)av!XDd^A-Zy^(_W8>{d=6efoA2TNxtjhZJJF>9-i$&_pwirZ!tPr< zAL^qYDf$}9!$7KikA7f4>)4wCJwH$|c!n!JIAI+F`Tz~+&46wrcmXt2wge#|wQR_S zbgmBh@qq29`zfu3r6GqBaJO$ok2Frd14hQpuMS(V0qd(66oEyYt()=I3Wj>qjN3Q| z(?;s5%W0)cTfB9uV9{~~VvvHxdQ_16jcX|w8E=y+SiD?;7^GlHFcfFR(Efpbj?;|c z77c{~9W?@?=y+G{#Uj}TdBBXqLD6O%9e;>Aeml5O-Im4oQCJF$21{iJ5E4?$QXr%U zoyxAj?3bp%7^i!zROY|}q4r&%#M!nq7#Uoj3EQ&)nIHzmF%nWSk~FouOxQJ5uuQoE zF-XC(Jt`>6gxyjF%atn-gA^8MZOm zR#hxgzmh;IKZJ||Esolc2odeXGHvpIfUl;6{5hpNlNV{VvhZ-S3QiJc5|*^7#?O4v z>ps$jsp6B??%W>U90*SDZ*!_!{n2cpw-x3gGK5>XKf}5FL;Q%$hi8hF~2t#Gb(Gto{UL z^~WssKw&e)T41T{4MIX{*$ffVgTc;>2xo}3o$m4OFhQDgn1O8j0np`4oCrqcl#9e( zY`{bz21RRO8VK?J!@N)QgF|Kge-Iq@_z6)mjP5%C9 zYf5MeI1(zyaa8;>l9e#uBj|pp7Mb|=&-Co)%chcVAMjPSNuQG3&ZRu;7fb?#f*^$p zlYm(^O_n8e1hyu`#IY?t7$?rAji`&ZhG;$xc&c#-86&a7(TxR%`v3*NG4an+z)c9q zAmjkC*5NNj@yhU_0u(y{y99`nO(|8F7D8_^Ej0Ev*bTT0Z;hlzpZJgmdUUWEbYQ|z zH%00dCD7&|GlYII6#^{Ug51rKtM+2H*c$SH*$M}BKI@n*X2So@>R~9WGf>z>u?<=) zM}SbwS2A%Z=CAF(FR+9Hc1^d&EL5avTQo-JqvopH5&9@p8$rYQ^kT;@9(SP7(GXH( z)OnR-P)!JAD%q9|nIBT*c=FIYG}&0(5e*m~CxF_N5EE?)!EhWEpGdOo-iZLeKs7O^ zX<4vM+8GQ8>5s^FEcpsxg<-S{`Az~~(Q)eV(;F^Ahy+XWtEk0cS7IDTT?8`6&9mLm ziqSx)=@a>IY>O|ziSuc9$}4bQO%O9YsJ@Vlk=Wtb9)ha}91~xZ0{)nQ^xNzfpdVg? zY8MMo>;U|U2gK=~I5iQs7#vPkwCsfzeNRWS`ZX|_r3c=7vvEL8eHW>#boupDkZVVJ zfPKirr+NG0B>E+(>d*a9t(=T%G5%rq+Eum%e18g^0-;7pa3C2@1p^)T&wEZIKQ&ng z1yP1w2T|lK@)R=jU^E~z&qfoz^n#MTNH82n#pjSLPYwYeaDGml(?Kor7837J@|{aQ zI%1jDKcOg)Ez{EN{|xeh>;Ec+|KSW%ADDa3__5O>YU_ENFv7=54uaeIJU)? z;KaFmII$H|Z*dS#B<-bSjKq$h93i*>kVXM;Ong}icq9QCUkiZ%)1pr#awlo1*L z$AO#0{UWvk1tTWJBxfX2KIh&{y3LHH})V@Oqug2bQ6RU zGoH}>vkUYKzi1W5nlH#HrX`NR5RXH8j8`i{?^YW%tHh zl3ha^aQ9Ril%W?vL+v_}5#ozcQHEZEljtr|WyYm6;}%qlwuEsghWIiH-3p;xw1Rc| zN;3Qk3`|l#MgN-o)MVjcTef+)iXyj>$H&-~*sIZiDf)IaH6_Gk{0WBRsQ7mz%ad!s z2S=|Z&Tl|1@)oA(>&W+e^3f5CdjEu?K(3pjuP6U+(O3)=F|usWO|&;qCh0~d%-@{k zjgUmTF&=c6dU0%v|A-Uk?oGs2OufZHI59>4iHwoh5tN$+7XZ>I0FH_OoC4lLK*rZX zAi#8rzFUA|2jHy&#L2HHRY+rt2)(m`Chx*b9TW*sldX)^WczEtVX{?cN9tRp@^3&+ zQ~9^#;beOoPNI8g7b>@-LW}*JtKk6h@5tPe%5oB_aMt0RD^Ypbp*e@A%^eyWoO3A} zY5Zu;y~8W;R|%%zPAX`QT(uW-?mdu)vb%9m8ncc$_kP&eS-lTs^)D>$MPU=~y-wsW z?r@(w-0u#5b%zIVKzCEh?m6HwvfY4g?{l-#hz@&q{t8Y6DpHI5eFzYhhd|Du@NUt~ z_^RN9o2KUI0Xk4~cP<{0EyW}uvLAKBo5GvA>X4Cfb3+r=A`}1KBeKn0Nxq@Z=MKEBT z(2T&&>CGeK7MCR$nlFK;rU>IbM3FW7ye!emBM=3sU*&4gq1qHZ!!m91H;C1gke~fQ zS4?GF{4533AFt5l=TR;82i@=k20h_n%6sBfV!QzU)a`_brmol%uaW)55|xCg?}^vR z{!%yW#J7QGJ@E#G{z0LcDBSb=FL+0bvm4@}cgRd%LiB>QKG(p?8*Xm`4*fv06!CY^81+xP`(0F_;XQYFABW0YU@dls*-B@N zY4-tz-tIxDzn}ChLLWj1E>V}+NWbu#E(2&=LcFk{$v60C`2VENcfdm-w`#+Sk4SyD z2TO|c*vAxluLq%l+D|oG7nCRBCq#N5NQs3jA#UJCZc6x+>>rdUCPaNAen$2WiEi!e zjOJ|9{skDaEJ+v#Q$0GK$MrbFm0JUcL~7BGg?&X0Z&CwSVsP4~^j~avjSV!{K#7&@ zXul@Ut7w)AlbkJ^qJM(kl&}>t36XFd6@Nssva)HQ(y)&^G~-Zt9gRhi!mhS2`92{Z z#p<;L<-i4Uh(q=1)=L2RvSddNbE@BR>9Q+j)@1Sfb$TL;WQ5g=y$KfYx4?F>;N3-0dYEr za-Tx3c<i&wCImPGbv02wg>8mKHQ0)7Vg2lMpX#z%-@?KaG8d zI=|>aXK}(>ghF5TAY{*aY`$HTLSIpc_cwZ4k!Vt2Hm9xpinJKv{#63!XO8>=M`OE% zTY_+36Rw*M8*DZJig~#th5p@x(2#=A2na!Tq&u|XfbL^l&}&M(w)WxbIZsPymDxTz zo=^EIj@&2OT%rz%)UFgC?VuT>40-`Uds;%yl6g!id*U?$FY=df;GiSf`}QI_rk<&ckJejrGb$UqkPVY(5&%4OiueD zfqq#A4eEyc_!pbT|FU36$NzGK;rL%3C((k$LS=;#43Ni>xiyvLCaJ<*5wDFUO1*tL zv^C;sbB87rUK>+1(xjvP)rv&w?>1i1vw(0H=qr)j;`YvwE;)2@wF<~Zmw>q{xtk*; zPH$e^iXjh})p5|w$vUp2chLJg-$5v<3$s`VgrJ!A^(H&J$W2cgbEhUd02gLih4`!wTM%Yf?M0X;Lmn_2;vnZ) zN0`5-FfR?es$*GHSS*FYVm$?XdVAS@G3aYLO?JMv13N!yO(>VviXIcsJSHsrD~nH( zC+XD*=&LOQPI{|jZ^r&KpupRyauO%3!`rpw?eajcR#_~^Vp$aC?MC8DNT*Bjia3E_ zN+?eFl(iHLZ-s^Q@|Ux1zmVPLMe0eNQg35t2(6SMD|thV@XZ-w8@8MwQYS+;afUEv zGGt|Mh!MUyLu?n9GeqiSNEZyLjiYuXhK{{SjLm_9eArB0;e>T0#snqC>Oilq#$r_# ztDvyN*aCc&8VHp=(>HML##pGV0UCZ@`V9SU_8B7+3Ry<*nPDo`aik_3v(lp4zB&6eS-Yk8Cz8_N;2^h8`bqwc^lrrlBy}BL>%aPsDTA2(& zF+a#umLDN~4i>g=4mP(;rEg{K0s9krh0jCi6A=lW!91x-zjgT4h}woAF(y9-GeYaC zy%>#qK^`!B;-Jv7j?lI%wBLi0>UU9CX!k~IWg`%ZSL|de3vEa*A9};f(&neolTbT+ zO{lNn{WOqh_CDZ)_paIt@Arc|VD`m9-m?zxFO~P3KuL9D6z2W@XiZ2kPn$5Ayf+#T z3J)8pzl@$(IewtqQa-pKSP8(N3#T*l{0%LuDJ#6E>P7!EEW)?DU@L&&mIN@>7T_dF32!7H~&! z#(%hRHXI1vHI<9~T~nv{sWnBJL6q$PP|O=56SQQHa2RENK+VQP)Zotd;b4HjTZ08H z_HgQls5V90vrL=%tcv!@k(v_nqngkh9NXd@$gA!@f+}}JHKAVGMc~0EVmCcfw~mwr z31bbuqHhE$_%=G;3B;zJB%Gr`Oh!358956|6T@DI3YuzL5fxAFgsvxdM}Z5sB@~B9 z9%@ZL8f5$-J!C>jB+oJAZ;k}in`As5@_;!G2U*EFI_Cx@<1R3-`Xd%Qqp*xT0W6i> zK}bmLITcTIDozq|PKJM5obE}H2}*|%@lOEjtT`DnBD(9(-PnNLofs6CQ)$Z{AZz&i zUJ;rxo9Run(YdvwXY^SbVJ9cUj$V6bRPkD#2-dv>V$ZtnRgdRME=K!;jdooKU2xA;d$IUj0eQe& zF0XLHI^0_yzrNa8Jrqi+KWA|Wi-TDl#Nt2}2e9}Vi~U*bhr%LoB~U6eK~Nv*c3R~me>hi%m_I#HA?I{C&rLT>_jhSgq)ZfC3d|NW4I;u3omAb zoR}IVb_2vTK8_=Q6uNzrLrmR1$s-z}GT+IJ`lRtqGd|!hfpJAN-A<2vil&x?-Ha1# zjwX!{uALDn;mL@bohA!Re6rVMgrX+)FEnA=f%1eoBvnkSa#aG9s#}~Y3ub(ZS7n6C z9^pp=nLcyllF+2*R;S0JAD`;=7$L8R$vIaJ2~LWB1x30YtPa$4^=pu7hfyI$wT``+ zv=X3Tg#A{I;DmLI>JE+SbAetxhsD_}&SG&Ui!)f9&f+u_HkNOLtmXr^sqD+yj1bIJ zHx!AL)d-r^h@RH658m02L)KFgnu1Kw$Ej(NozpPHSu-N-%LY7`ncHDy?R=0KHywKu zw?6;{V82(maKbv`_HRx0R{*_wIg86!T*~4S7QbY1F^h{>T*%@A6c)idfKrSg!P2-S zM9pf1&uY|@)u_-SLcMlQ^>$7x{CRPup=}mKnwSMqam|w$*E?Z*?J96Gt~&N6u73gw z!2YOk;)Hd?^&`dgCZJbuWN`zF>segK;#wBhu(%q9Mf1;)RgVPuNQf*(#L8*}&1ytX zYxUVzPf2KsMV1!XISsQ=(!MN|jN9F?vUUr|jGKm%`#)i_OMo}-L0V55(#&)VOq9ezBIHmzLGlMsbQy?`b>7YOa=-Cp+t z%UTFW#4k|FJMkj;E02SaFci2C%nz51Y$N9k{wRD%o-qSo33W{)`??L}j{F8t`VA$R z_7d@)ARgmOv;9@|u>-LqhZ8gQUV@_Q?%QI}3Dq;sSSZ)scgjRWIf(0FK(KLR#O*y5-^lg%wBbRl(*c`tHc_6=wg9Z%i7=ACK=Q^wZKv{hW zg^j%T(VCD->)eP)*j_RW(?Rk9W$Kwyn3VBDFxFlH8XeNHH}lEIK!HOa;UI@theK}w zx3l^>%Ia$<%%M-vT6qhEgj91Q=(;p}J{3;%HrViDrI?SJ7Qe%)^n6C7cTr6nHIkLX z`Gox(oCz&q5XY(VUO))%R@RFoS9U!n>3A!J@8tCSvJfn0l&Mk1y<_9mt) z3{p&&$3ecbj+icZ3uC$f%If?qhO?ND#V`~W;&EWEEDVC?bU(oi;TDUMbWR>}x>;Ng zxhTw@0Qtyi*pp8J|3A<34` z4aZ~k!$10(dHCTSc@JwvRNgT!pk}6<-D?!3_?5zfRF+sKwPsO@p*xc+WSG?*Ay=3n z=#RC~hQX_R>CNDM2J(P;8V3zt)-iZ12zO_7DU{VQEJm|vV=;=wNERbd*f4%pVhP#U z%@o9OM7%yufL9yKBl1~w<@0lph?a59xuLT(X>RDKIf_Vtjn7kJ`4WlcG6^+DRWI>E z-YS~T$P(Oj59fq2@dgevHBxmM`Jw~x?j#|A%L)Rt#Tym?R2RTYjV%ZPCOZK2z&{{T zVW<;Ep3!6l$G#2pTh#luSlm-ezoC%huzi`J?41S}mXNQ2PkRViBo|(FE|kR}4B`}k zqo?JhPm*Dxgd+=!duP-AIF5*Yjeqn_`A+<1nF(C zMJu^#nv(sy`bFbNb1A9jXhjmRpni|XNC=RBM{2NlFDRm9pJq*6BjTwJAMEc^-D<9y zs%yo)rBz6C>eL*qN&?<`oW^4$1jxVFK%EqgiZ^n|V0@p7YOb0p;@5*?(wrhSN9`ow zMa_+QjD!IB4;m;6{2Co^;_$)#A=Rzrs;N4>a2~Bmnp3CdsDlLj;AIz&kq{vNPpQMn zM+9281ZaE)q~>TH2NVfNznLfx^idWCO*yUJQbK$p6~%t?f!mZ|Y37E>GAdS^a{N<3 zB%A^@&3i65=YDA_m!oc3(*DCnk)J60;#W{HK#@tCQE4Q2c>bB}>o$`{$D5bgnd=jA z$lA{Vhy>a~T11AHFT56klldZuXE*seZk)xw*|e4zaHUZ3Df>XX9wUxoZMB{E4=FZuhHmd`sPT>Qg4>c*+7A&|KOnb zvW{hQ8w97bx;4t`RxGweVM}DwV1)PwAcP_2UU6H}T!_^iZASvo`%q%X5{Vr$2{lJQ z^b*aGNT`|12F<{+7^j3rf!^X?Vfelm?F&(CBwV!@mx}!%51aeppop-Ji0lsd&gyO` ztGlw;g~g9p?2N)@oKvvb$3!^X>0C4dfV_x;>_}+kX397Du;O@FE!b?;J z5BSPVuS@4Xo^^B!9kp! z((o1xH8WrY4CtD-YjEu^U}%cMfQg6mjdX z3zq?3bUgSl!qOqd<@i|A6sUGJN5_!>1uH-T`vuD|vSb$+Ho(Wk_ZcQc#?hD~K`0vE z14`fQYJEjQ97Tw7#TKWPz{g&y-B0~dXvNA!D@;*TDPL2|ueR?*kNXMc{o*h@*?%XCh{ByEnM@H+dggQA@3079nv=W{nivPcqi9 zrU#1zChyk*3Es0Sfl!>p9-z{Mo;Gasl7)FPCs@|zulCl-sn>L7>QosKKSUEe_qyOl z@=e5{ax&;?-2OP{|ZH?(U=bSi0X z#=QZ!HB~=M$D%Oi8=?uGPIiay;*h0_b=8>o5z6^q zn(A1m;o!!%&qC`5n^F4WeOYJhMr74sFjnh28#pQJ#$>$^+6;{tPK}o#VWLALA8Mj- zN!%nA_Mw)r2C|Q*6J{kT3U^Uh^SYm>-H#jsc2l-!W@Z6}Y0GA*LO;h#p%#%~%uaO6 zKvCi55bhe*H8fIiyM{p179d5xgpy*0UPPM9P&G#vlK_b=DRFs;#HE>pnxo6S#MZR= zEL2KI*EVcDo2@>Cxv{q`ThC#u@3_QABq5+18+JRxR*qm&+@9j+mWfj%#5HtE1owj= z(vq4Hew(z%#D50?4T!`3sbxOJ*b|cxT(Ky)2ax4_Y7ZBrY@Uz=pbjSA1>_?$^_gCq zXwn(wP_Sn6Lly%+Kk!<>%@6PMJ)*2Vjge1FcL774P?sC$Gob;VGiW)_9|b{40)r2y z!B>Nj_%P-*rLV0YK|X~)j1d5ibV>-}`w%}D`B(L9XHp~=Og(|ET}O+fYgmeh zXGcC2lQ|xH*$hb99TBxEKv)q!#P}0$9LB9<0T=gQY zdb%XIoFr~GA7peQZDahhc0HO9;2Us2j{OGhioZ*(+r<7`mT8kuEj1 zsNc(mKL)7zDc7!1`kAfi#mZkO_@_WHFeja{8;jo$am-^}8aa>AYaH9+$8pk>&;^p| zE{}ueskwrd;Od$lfKgfGv2@Nb8{O*?eLCs5uy$A1KHLp1tp8S`kB%FzH&VEb z?3f#U50vO**O@*a9O-Lh$K2?95c;|>$<&^JlBP&Kz)+{Xkao_KWJvog?HrMP=R8zm zd?O>jiOzYrL|>y$Xk^FS1nZF!eT_P&ksWiR@9*p!e5>v617+ zV`7ng=R8_sd?O>jiOzYfMBld=tj8HFeB!9~jDnTAUZ2U&<}x`AmdHL>Pm~z{Z3gSf z5`Euhu%2SD7VKJ}_MC#1x}Ij1AKz{9^SR7QhrP%?SWlN2-)Ojf6Pfi)iM~d`YGlXU z48vy`tcAN4s=c6KrLL!$l?Lm@TxO-g64?jqxf0_W8Tm~F>-iFW-)690V6YbH`cCa7 z1uJy@#knx$n{fRlZ%QOn*n^RJkcl5D@pW0E`9hyW(=^M~Fw$zM?>PN~AcJe#?M2$h zY47+l$-JGcy`%1~y+RV7Cf-fY^=Eyrf>dFu<*qW_yE}NB?Rw2DjlwOp0~E9a z1<)5;x7R_g?XPNcq+@R$LcR?YfW3u-HleIzTl*$(JF9P?tiI0TH5RY3c!kBwEdGJQ zo&&uDvC7*ZXfHf=);-7jS9IOmjcF4ev)uFgNcWzudo43$^mK zN2rJe$UY+Pk^Y`(Gw%06g)1N8kkC|sxOX49(ftTiY+Y#ctO@7p^&Q6AUh7(CIyRFF z--^yr6h5Yc55b!-1i@RBx%Zd5L2Kq)w%CR173Y@pjpjRB>BOC_d|Lk3_I)Dz zaPq0Cu6zL1csDVSi6o;((4Uj-pR|x>>b7G;-*A@!+jFV~{+ASdmxAnA7-`}A3JnQ6 zmajY}>}CcK_b?Y|!E-9Q^DaGJn;WIrm($XqrljC|iY2hFEW2F(s!xieGp#JpG_O(WxJZACNd#pgNYv+TDpW31tkD+%%3CL)sE-Iul6#0G;r)ZZi!#qeN5Pf8BK9c&^)FqKRLDT*M zAfu=HQdv6Mh?qTqPMEw3b&HD?tXxoHjRb7e5+{2QI5J+$$*Zdt0z#!92zsd+FG*uU zozcb^*%XJEAkTe2>nf77J|LCVrUP83O$%a}rq9C8M5=JK_R~$#g zOOU}P712gIn%@;IQp7Dw%eHvQK+j?jNisuBzZRwh5+mtm@#~Tq3jyw^it&PUsIArN+RXn(ja3EG&AB6&M62)#Nits zZs?3*T7-#UBJQ?G`9h;Cu?dRy=o?~q9A@(&g!xJWc0p1sla`f9uwXe_Fc1cnkL{}X zD(^d2?F$j}(t&6Y%e2YgZBtW1ek5>%$-6BcoJL@ID1aF&xWhQJCNYN$N{(?s2s-Zixgo4nh2J0{+4`jmb-U;w`n{uJ=pfJ2op5 zZ78kq0J%pptDqH~&vrzFX***!7Pm3+NKnus$&{>30k*Je)E0JC$min7iRQJXF(Y2o zTDp|;O$WCnXt8KuJG2fyguv|bb}Tn@I6iZLf@!-NRN&_{)Sr>MMt>W%I?4P6jdq-r zEY>xUF{RE=Kk_qmynyo!vTIOwK~(b`>3CZc?Frj$>GPYNkd(cUe7`qOsw!clO>k^`+rp;5N&5?G36Uod!J_?q-+>{l-UDz(iV8IMXMwI15jHNkD5^B==8$zV;z$8hjszA$9d`oO5Y1-JNSnvT7> zHkk$#7(7)5KK^XSsjhC+J?d|K{j&S8#|^7S`<@da%~w@o1&#zR?;SY(KJ$1 zLL#~#AuNt)?;HQ9wVNOi42TY|C7G#8n&7JPL+HF_L_<|2n4-insf zI~tt+;p5hzV(chPku!kP!8Xo9>p35kk?~5-RB(L1d(+sbnR={ClGM1|mMU9nN|;Eg zpuFA=sv)^mojm9e}Jv1>P3=kmb=bJ2T;nThl$ii3T&0326mmhoknAr==)s)Ero6c|N##g$IQS^Ne$9^T8oRU4qryd?*cE3!YG2ADf0}kh(Sl zp6g|6J`By6`6hs&DOyLR&Xrb2xW-PAC$h}&-TI;?@g6DO%r_bm_9~4EW@#ID`OxH< z+S(^mC(N6~Bd(=Y*Ppx3f;wE+%BaXS4?wmYUY|!;thy{d##t<*BG*idk8@V|a3vmpbo^Zpw61_!Bh|Gg9S@1Z z5Gn>cpNl6zAoHNeo3#{u%cGo_Ln-psr{hU9lgbo)r3>6WnN$jAT>|PUpkfhp`R6?5 zB6u3enEJdfOW?$N(6=rAo(qz?^K>F}nQ>dirMVIJlDc}cjMFu~?v9*636irATIxabQU=DPW4op6orPJU1FFYi>WI)3yq2pVMfIJ=deNspOc#59W(9c zdhL<4Yq~m*q?Vdi)<|oq7Wwl*uB}EJvB>M#n??R2prC&)#6huV9gFLLUv@8X2_$NpK!Seh*c-pD0Sf%O8VC8sI{f+x za679%Mp@m1#qKP2W3elXU0D2x#m+2tVzDEOAF|j1g+=08;8pelAt4U@Pbh|~;8r^c z|CIbXXU+BQa5H812fId&^?X9=Pdzn#ws0G$uzQ~zy>=j~P0`O-rcM5if|?TY(BxFtWh?oV-e*KT*#NR1;>ytO-|7OQ_X3IlNU5FRs>&tv{PZ za}Z?o$=zh1PT+3)M4?RIe!R!|w=cvpziWr1+7uneQiv66@3SiGRH{YdN!S2V_bS`s znS_%2_tMHEP&HAZRgNTu#v48yx=*$xjFrOVn_(xygxQ=12Rn$A&)d|1Z$x}F0G%=S zLqkn&;v!FEEvSD3InAda1+xnQ-kC2vzI(t~YvVYz=9{s4%r_l|Hcl+@F)kG9nFr^> z>vT8y5QJQJ2A$`6({}^=S6>f)7_7RZE2RqbBR#6*jV0VwO{2-o0bs6g9gnWwINxIS zY)Lo;<0QTL`1c+)xlHO_Q;=<(w55qNJ~btrieZ}WVWuzVKH8&Rcb_fO%aPC<41gWMkY>V-l z_!5#hi?*MH6A0FR!6Vj1)zu5HgEQqz2vnYj2^Asb?a9&`J<9p9MJofjHzDWEXpUq~ zZ{qSUP!N}Qa8O)WM_kT@uFmQ?D640)IE%%ZEY4tYI*Zd-oXX-97AK>ysJ#!A%K0E9 zY=_b5QwcmG$DiF(9#njPjF>nJ{%Cv{7}A&iKOoQr1fsTjAX?*qXkj-%|0K|b1o9S@ zXx4l83C#vj`qx7rQSu^6dJ~d*RZfz2hLRsc64zUdqDzJ8!^XrHqvk^W37WYG`(N5P zj}6EuF({)xb@H?tu!%pmBs7Kue?%17N1%*}e@PI37wa<`&W>~+`yIzY9@ygl64#6B z8LoFg=ROQNH^+UngU*uU;<2#$t}W&9I3d5znLpeSV7kCon2E%(hT7F`^7wqNJ@H*6 zbf026_Z~FrLh*PH8YPH$8bzunPriUB{6IwQ5_VJ+cGs75lJk+9lUHJQHFCq$jI(LE zK4xD5E-}9JgaXPrEbZ>SsegHkB3Y!o`x>NTVq%W?H#wUlVEdc$l0QVo1p2 zk1Yu!K!QJdq2|04gFq&KY)R-d3I1qOTWZ&53*sQ!{X1~x!59t7`eRE%=SlEK50--( zOsGGAFJTbs1Qwyd-4tM`7)&~ZV6~gqrkls@W=@r>PBF33jBov9yy^y-3Tm6f%_;xM`#k&bt5o>0{2sZj!=N=x)B&f z0ZyH6wOEC#MUb+7arbGcC5z|))HzMFbFWZzZ>`RKFm>*GLgzjeb?zr6opV0U7I99@ z`9-{Kt}XVHqtJbp>D&ij=f3B3?n9`q(T5xWxF2T$S`EMGtNlu0ZNjpe96PzWZZ( z=|7Gf&*bDP&*rMIcV#fa%%^ko+KZ?*MbEQLoBaJnH6`T7+@8=09NXd-$P2txgqP4S z{)Ce;@_xw>yJt3d>`c7IG;Zebk$MM08>JEPKZ&5wtr{Bc)Z*JjYRA4$Rz=dM?pqz) z31h3RFa3odzE^kmszGwzEjndkRK7ENON2K3K?b81i)2ZLp8Vt#XI0yV=J$h(_z>| zSrMZ484-WtP=z~*xJ>wNqnj}GW!Ad;wr0@{M@XmBL@4&A3)6`BQ>Ux;8IQHMSmGr+ zQT3ADdJxkybs44mL+jI|y0NwasWy^kTaRogt?Bsix8~oan&@qoX_Jq#nruX5L+2gx zDj<`EI9G#bjrSof;VBS~J|`Ap|2>Bk=KbjSi&W86G^e?(WVG}}=ex%z7WRZw2Evcs z9WHn909hz{fIJN-X;_?(P`weU6fy*h*CuRW8g=hr)7T>>oZLE2KZTCBF_~pbvhJmt z>!ozlw~I;(%M4T2)^6J4&(nU_Lk8WSvy93vq&Ed#?L7!F%A27Qed#Nk|1aFz;v05v z%h0{8=-yY}y{)M!e=kIHi{iv}$RgV9)L-Z(Z7#YMC}cy=0{!!e(6c~Gi9mN5;%>3j zXU296(Es1*{e!T-wr79+%lFp~G$+5k{Xeq529|`s+l*+PTY>*sM*Qf1krBIu8L=xW zcqz%|E3Pk<_mLoLVlEevDbc4xs|HV-J2ac|v~Pz-K2KXZlvGnN;}I~Dq@JJcM*RLY zt#*;tF|DGzgWRj-1se7sWJ^uklt_CJZE1c&NE>wFo(&>1Zk4=!ExgGrwkbX{2C@2ap3 zoUs}&-RS@~=$M`lZxx^>YJuPkTX-5wt7syQ{j@aDA4FfP7~SGU3)ml?It4o2_17WL ziQ8G!N>V%wCm<+>Kc_uEft4|GFrCss|CYpJ_P? zlC=fUN^5oOjkU)D1=b!TBXPnytesE8Zv@b*OR`vk#o{a$W3ecUMOb`?#lkEWLSbGV z=TMJ#hZEf4L>wwhgR63J`b(9MjsWf%p87m(R<=ORLFCOGDlZLSFZmX)chMGu==7UIY##5A&Ev@i?4>go0JPPv@>L zTOzS4kQX};jtGIQ=s}E-f;e+S5U~p6mkxwuOCT$G5F=P1OugDAd5M$c(3IrLUeX8_ z7L!!FBrlU>Y98MYa(|l_uR@HpA+y^x_(kP%h^IU*ygej*?n4QwXr?zMWg1(S!~2cM zN&o9_7zJtPU6D6G_|wC9RTl#d*(*ac-QORkdNS2Eom@?B?ls(~sBxuiFp7f}go)cn zi?h!`o%`I?`P_~ePKyAQtW6CVnGa9(v(pcD-uVgqohL_^yg{3P0p}WcplLxt(6n$Z zNgVy^SM~jMAT@HVY{4}f0;k=N-Cxgu+29TO0GnTQR?Q}>8)!mvMT}6VT;i%kkx{QjTvm5u_im27|ef7e+j{| z8d0+v;jRgi9PFBUN1)u=sB|| zo513Y!I(8lVx_KS2HD( z8$I=t8zwM0sR`^J_>wd*zH9bxRgou-Kf%W-K;k(ZymD6gIB@3R#U!w+5}n>4^|NWc8CuJtd(w%Wo>RbLzIx z(*!%GC3a4OnB53F{*0fNWdoHX;%~68whhRPn2x=P*h4@8*nw!wq@~s6c)ROfl@cO6D^yu37gf3pVg=+trdUbnFd&ls56U- zMg&c>Fw;Uir=fOEd+j_A;b;6^z`(FP0zVL4SM9}&{}|)}^QeM~6V?&kw-nv|prpDl zi|H)(VewNId$ZV!#hxsF!s5p)_F%C)i``i4iozoPIFKu=q&ueZypC8oy`Fm#*K-N= zS>PyI2plcp>+8rjyu(hDvKnnOQJQGywA2DggYBGl+d0j*b9!O2bjHrR~KqusD>(&siM8;$RjBu{e;$ z0Vu2&o&ic>&M5W*vCUPA7J7kNEm~A==d{7jX^NfGB7>u0c24{3oMvVb%`0U@pM}-6 zBf!Ln>e!ozz5o<}J+DCGgmpypc184fpjVG$aV(2tSRBpbC>FC=9Erl>_#$LA2Zeh> zVx+S|La?kx)T~DMtVTUP6!lYdJtd(@7G7Fr=QJ?uEk9G72qN8n2^J%IuG)*4;uXjP z=4Ay9C#)lS4=H+QKuPs<7N@Z|mBlG6PG)fui(jCy=)DSAWpc1`5n^tFKyBtYmD)LV zTVBxwJEtXfPJ^<1qh(pxm~XGazS>zJGh#aSCf_~+3c%h|pm4%EBKAw*c2+M&S-ptG zg)A;$aXyRlSe(n^92RGzu&{mX06%euPu<}&94c3V%XVh@Pb5O`=iq?eap`2cE_Vt< zw|Gzq(X=w87*y*|y66V)GSY3x)no>ZKG~ zO&;T^`;3Y7m_hYfBJbes15@ek1H3)%enn(9gb}MNJ*az(QM(q^rs!&xX_J2oLQM(z z=_5N7$F}$y@+xFaLzM-6aH#wW)Z%o@?x(1Sz{|GlOfNCdy`0@llx^u2f9iS0*SrgQ zJpkYYE^V%}vxJI(Q;NkH^(9V6x)^tIF}~TPD>tQQH>PJd*jd8R+F%RMd(zoLowqwG$%gOM#p!9?xH_{kW8M0 zc>*@(j#4VkCVYMf-&UoBp7ymm6_f#MLUV956+Vea$M;Y`9Xt;NtoK^OanU~#lTZhO zDf+FGNq>Zazft#V(lip<)g1kX1a#3LO8l-w;{Jo0rkzA;mw(*<&J0@)wB`{A`Iyffv;r%!P{1kFtkSmzD1GQkmgxE)UY0*_`E(d zCe5dMsQG$?av!j?eoQ#rk(&9xkR0A4ivJ5qKlpO5$IsuRFmG&N^XU$!>&;TXIOGAd7!ER-bu1&tUBjjRA(&o$ki`Qm{>I|3EbeD< zAB(@BuvLBu$X5OiLP9}=F24iJYA@Z9|Ka#0DflR4G8TTXHlYT~6ZeO7mB;G2XiT09 z4viq><7i1};j9S{PD^OHjMB$5aA)g5{dN6Faz25!%6unddBOtGG~)yQAQ9bV&gc({ z2}KEJ1oQCLk>f6(bj!%#O@4iqkoQFK^}^saf>DHjssx@PErn;M&N2LGz$fe?++vb( zykUksr$ZK$gna_T(m#S8QxxLOGzihmhC)jfh5VrQnvyU=oQ0lTYTTu5Pb{TiH0N45 zPlm01H5%)ztP~ZxpJg;FbC8^?Ldd*APOD*S1BFW$75WJ$^eksPQYB&9BDU$<-cb?6 zPdp(=&K`m=t3!}wiXiTj#5tF9F)p)Y*&@i|u9rhga&arOq)HGQ2|4}jexIiHVaVmd zTzdq*a7xm#H&fEjfr1fy2o9Q(SjUuflcuDXfL?u(#S1K+XYm}1XIVUh!e*mGAy#<> zgoHA|%LciJbo{zVoIZU!ekz~79Y2+;^$g0tPI=;ESR_=7W4h}*j2v%}qbCi669Pdt zdvE$gsX9@r4wr}jA9wEoW=B>2kKgQWl1(8bVMCWJo8^*$ECvF2a{&niLW_X7fT4X6 z1-qaG6%brn=v6w3G!YPx4nvX9d+$Yhk&g7H{63%elsRSYoqKPB|L6JVc`~ze&Rah3 zd*0K}%uNZF+Ohl(AmgXLg=c(}Qc{m#DtN|M-ehVbd3v96|2+2Y%G)GFe-(i9&RQ6i z{-SaJ&_tMJZ|wjj-G|X#d8YyCh9{CP%p!dbq_a&esc!8BN`>Wv0njAjmYXh_D2ip_S06aX2r!$PuNki9%HWxR2$ zXm>~s4++_*0-x_;{0Lp3fZB8Ogaru{~y z4urgEzY*jHHopZcawS?%)^hbL@g}ZMK{DD#_1MB%)~Vn}3H%8+X&d>Bw((MF8~+Wf zOzZb&WTZ^+YYW~n*sn8h_sAtxktn2ap*ekZ+B`^9RUwpkIwV%#XHmclnKUY)hMJSbei0YKvwNU8llO(6=;`33J_f;i0}uW0c{lI&gfeJ*S?XwjNoNB zFT-##NUu=LSK?M4gY=XXY;ed3|6>H{jPb8h)G2O$TO!5I(S^hm8>jMU2tc!eV;NrK z0f1M79RSCIK**&{ua3hbKJ(41&C)A)l9iI4$Y==eJ(VufN>#W<;ks7cu8ZIqYZ^s( zJtUMDfq2@5k&@~TZbT{?SM8bA7DK*hzX|Edsssb$ZWf~Q!oqA^S6!01$>O})ENz@* zrKG2EECbw^t}H=X5r2yTld|CGQ9}*ysqd{%-dDfcC|-B6XAd0_6SXg>4Z4+*Sx$z- z*d}Xf4r_hQ<^%7yL0oOhl>XEa(l*%pGW_je8#wcHhbO zfe}s?_atJtIQf1gTPHt&hoqvN{2(4;C-;hzd-9wtS+SERSSLROiC>MAAExB_=j2Bq zt}!Qf_)dNljBv8JClSNN$&Vq~I{9%tBvZAMpTI-x>|tT7*|J2 zFYad#-?oPIj{LKI4Qa#qXU7`S((up0Ye;?I3ttqNNTV<7#Q(x0zTGxi%4&tYvXU%Y zR(kl-Q~A0rtJf%Tih8tz;7&~aS7aL1m!?W~vJw-3;dNTU?#e3&QaXL2?G8rk-t-M{ zwd(3O!3#Hvfr&sD>)$32_WCJ@aL^A7=<)GOKHMs%No3_&dX}Jm~rI?iups_%F~gak_-l< zWQ4=~apgyf`eWSaCXJoCm5%NX*AfzWhA{Z1y zn-G=P7iK%I+?ct^OkQo4Hcqlq($hGW0q#pzzC~IQ-wufaCS}3NxYAIwU_q_-3b9;a zgS|}SjMQ2+!VWMysKVtiMn(h7#vquH=3vNe0Ch@N=MOoDKmyt}@mwN4k+y9plB*kn zi!SfPL-J$&Fbod}uE77BF*n(iSDU5%FImP@ng72{TJisINc@WZKY}X00{@SM+$Q}W zj7ArL1o&S(mxxcq|D%v>{l6d{lAmb*kH$mn|1HG-{dxYEtl0mXTmO%N#IM-@W2xdR z@c%-P+ob=4foc~d!2ja8M0_ItABSY?|Aq08{8amY5j@2H-%9-d-8}zGR_y;-*8ht_ z;#chd#i-&d@c-hF+ob=4G3*kM0RM~U67h-ne@P@;|9=e+$Br|Lw&8+vNFQ zvSR;lYyCeS62D^qcT>ez;Qyr|w+a87UdJEa_CN@VK%AF|TcijkAlVi{FKLF@NA}cZ z_Rk#NO3APbY+K_;bSnRBUqku}{@JmHG+q32@ETH!IJ~96L^>E5;Fa-+;q4COPqybZ z>_#NZ7NZ_T^;Et`TIoiXrNkZ8qc^<$KGUeaG*z;bA20zJCejLajb71^vfl7E0oOeH zd^re#KgH5SY!Ek0A|eg}0AeiqPd&WtBXvhr#%_s>%4B%E0+Oq1(HIPG<=)Ehc11{m zGbZCEe&jPM*e@U#zjT4C8Op9C87Y(CqN%^4V&RyAjO-u>f2DXW>}})A*QCIjwonS< zsh~6h=;uN0ILHZ7hkF{1foK(y)iKx+2AoxhfVm>O6?4A{eu!BEHv!LQnESdcVE+b) z`+m*KZoJIqWmjB`3)WQ3({L;Ag>;E3vlX{CQ-2qxPFM2x@Y1UTcq}D*^IA4pdb}iA zDHGwKlwff0sr;U_f_NS3*$0m)LC%@}N7YB3CRPvwSG1uziZt z&4<{(4z_ zi`g{v>ZeceTh)>;zg7KR1NHo>fp$?Q%@kh2{b+7k8H!f}G{fgfVF$4%NHKBML1%Winl14{Z%u@3xPeBp8SR?Y&M za@8+r&?r2rGwa*)@QT)Azvz(WpcHF0Ecx5RfgcL*NJNR0{4NTEYgljPFBZcuiD89Z5x^s&G7eN{Wba=lvzUh1H&JGjfpL?^py7E8yMdv4Capp&%e|G6 z-0qNqV*4#_63cu>EPo&)x$_{s?_6Ha;pMNqoQ;bK&pkj~z6c2n9`$9>^2Pem{>IT> zB)SBtDOqy{B;Zx=-2lhlB)&8x&YB|E~2}5&Iw&7F^(^SFgZhDY=YSo2ADg zl9iGkNK%@Mdr#$Z(uz;^rJgJCn9>b0R@Bt&-|LJO_aoy~WF$8#q2FyqV?|9R)tS!D zs#Z8w)Rbzh=##o*#r**QUOfP}9PigRM~x!YTCH<#VNNJZ6;6FwY7`mCI*|TJVQA(T zIl*2lP|#u9Uxqn|yjR!fb>qh6J(#@LfH$m|wG<;ly}EY@1zcMoz||fKI1~a9q!$W) z6aUrg@mNZ(_ZL2NfbV12`QD)aeGF@k@3 zQ{xF@Uy_qGV1HU(OgIv<5b{S+P5 zu0)_)^RsGQ!(aSScDxKG@fUGBwaL|&IWgjP$$HToygU)j0S2NjrmX#AO&f%_7Tw&; z7!Prl?7h>N`qhoGbq>l4vmF;n2AEs1gL*3uBZgG7doD{i81Uw^a@*IFnn8*jm$^O4 z%6uwWuCD)u!!Q&dk%;*+x4R&AR#um^vmUX|x{%JAhDT?1;2Myz{{P5XV!k-*5}2Q| z8)RR`dZS;Bb;CCc?)Z(;OGAGBVyw%b1y#&{S;((ni*@-k{a&rgqOL8LdwD2Vza#6) z&2V{gvp~<0dqpUhLhwSKX_(ntz>BISHtV-nhD=leCUyXZIOUiWEp122K_dRJ?*LvE za?>B+W=CSVIVu%yju2h$G~{Lno$2;0cRdOjrP`RT4yEeX-ZUmps_RdYS`+KFkcwtb z_e2tn<13HCAl0s2hisYpnNf|5L{RsIM8f$WAd!{7hsc%4u#p2kuaV1^DJzdD;WApi zp5o0^(oXH>QsRjI;nl}QqGj+*%mzJ`CrIXHW?t16#Uz=FJQ7ZGQNofoK}pu5*BgMU z{veQXS!>|hIA?}H4S6RYc|yY+;G-LGVM&1Gq^%@)`5Bw`E!6 zpHR~GG%ru#VirRl0!evAzLy0wrGXu}v_(ohNl#1$&ZaPu#VR{F%~}Y9@|A9R&j)AG z4wG+`=vS~FhS2J>prti(Z)K6^F-UW`V+ zdtb>7kB{j5tb$7$!fg>H5~68e}-q(e7peyagb`IUS$TBtc5_3 zy+vgILb3`ic?GrxM*DK>+vM@T@>CvWKl=1Twm+=VKrQVLD>lFMg!bpHRcFRYq8^#} z0u=j`cPX7#%dWm^(|$~u#!A(W>6$F!ObjCD$xTHZnzMWKCzq_tk^AtbSoT)S0`E}` zn^iUB|0y+SUyDp%n{kPfL6{$q|4qW=lJ!>x^CPIS7Gz~4ZFb&^p$4}5wwnB+)5jD< zys+O123Yb5a?r?2Y_!tIe*u1o`3yJdviOWf{u*iI2VIF)y~N9x(B1c6UjD<&7rcCq zi)rrvqs06dw{iyQifIh*0%2A*C^n5LG!-f^dWka!FKs znG!6gKz2>9%_U-W#h95UU<7N1_3b2Kho(Z{=ZGUBm#=S&9TJo&ZAP+$7EQMmBBc)) znJTnY(X;~yecA!xC>r(H!f0YB_#tKpZc;RSM$sH2MKc^q`iAk+$;(h)hVU{N7gH*o zO2RO88?J66a4Tp4D9G4LdDdRl0C-8|F(82Xx&atT>7$X95)xePuRBGX7n+JIR3gc# z`!mDs3r#EA7ZI_$fw2HVeA9jaZD$l~c|ipeM+8RMzZS56(Fj*H8;MbnlG3{pIi!V8 zWLlWgKp?gsB3Y26EDa&0f|{hGNy^d_QlhF!ItHZGk)U80$-R{t-UTVJW+B`pjQET& zdP%})Nl5Qof|td4S&WxOd0B*)g?Sl=iwUT4;4P0wLRPA>^+G~phW>a^cT7c@J{52+ zOp!|?C#9k})Bn9`N&uikO~k+nlW3%|JQfw;DIp`bG7)zeA~r2XAw5V4zbiz8=xF(_ z5VcSkt2kSp!VmvQVVkyMaq3tmM+ZHZtAlMSZ{N!pB(D_Yao}1?v?Ft>5G4R6SR);~gt_JOuMoB-I3# zloGdyyF;D2MQ^Bt4RCxV&iAi&Tth`@g!F_$v|DQ;aeZrqObCT&7uH1L`q2pKg%J62 zi?~aMgym2!%MWGlmUZ-9CDv%SIa@Xq!mg+9OadekTRb}%gBU{qTU9?ZWFmo7Dp~wR)@#t=Xq>{ zd^TGZr&9kE>L*B}#HaQI`8qm0Hb2i}^Cfmz{Z;B;nfmFe7WBJpE$Cm3`d6WTmP!ly zUA7kVuR;B*Qa^(L6)Wp-~N?< zo!I){5P6`Hy0R{Xtd4|~Mu5ZIJB)~w*pZP%%M7K0T=^<`D>IR2RIEo8Yak&r?_GQ+ z(a5*QMb;Tmf1~%yaDOyHUl{&Gbq|pYQrCP$haX%>B*3^ zJtEx*r0^f*LPC!JCRDzKyjm3RuGv|_OP8b&|IValQ%L$`gQn<&J}pIVnVx_^O0^7=<2xHj>uF{cnVMXD@L zixx5K+f3p+*AfWwLA1@7#Noz9RF$|vxH-j2N$Ob3BBeAJk)lJh!-mQhU??c0O{t|u zF)E)3g%r}3)E^Ym&_wbD`gb+-M4(I8zm-DZJMr7fiEz}`$YvL!zy7u&Ghq5=V!Dul zXd96s2)4za+td2J8-|YxzEx_@}eJv^B+DcYl zJEZo7`_wRgd#adDCb!ECR1gAHcr<}vDkhC>lD|jE>rk@Wnbwl*(iBPFfs)sy+vf1i?PP;#A~%zDG6DU!S+C9g-xbO{`l(&@O{?q?@btWOG>mPheJQfxp9 z&6^UcE91wYNIBG+GyOfaFV2YUwD0KH_)IB=I&=e@#XCD%|H;sFw0ESm0BkrZq8ZJ- zBPDdnG9AND>VwHVX1btEmTqZmEd30k(9k&597jjK1BFPHiu?0Wmq@Q?xNcm1Q~jq@ z)A)w#M4K5K{)_rxatt?$OcQGj-x;FVfVHV*Hfg|6Yj;61+x2QceUP}G_@(C19|klW zztS9ua7c5yE0g%6cG4V5b2^(zZHZ!PVfpSi;0L^4<0i$zXG{UM1j-qGTj1KaIWA_n z|6AmyOsG+X$&jBl-eb!gDoY+No1Zm)NjY7meED5SC)nMA0yeA17Hs|<_#tLbF%^IC z88&YV@iY3i!L@H|Ubf<87B0s6y%gWxxRt+$bQZIk-)B+C&PRJCUPAE1YIZ{s7>nINi?Gk64wdORy0>Fo~@sD%^)0?j(@`91ar zYft45NLHnO098?pPa?BT^uEWEFcEUNYmNww#13>__zuMOR*th`56l-k8d&&41wttC zED9u^4<^g@f&|XZT0fQp*o@;2amlifNwq5s+2I1U{C`HC+RFVQ0VX^0YP0m#t7N65 zN7<$f1KfKmJCRoE#}OhiWt8wI+zcs!jxvq*NO`Z&ehEZcgYlK)l?;(`B;o%E33-C> zs){F$3n52$PR5T1WG7wAKWUJe3m_pg%J3)x_*o4ZnI*ZZe^JO*L+R1Vce;#Hnm{j8 z9=#kUaIIYCExnZ!K!P8HBO!Xgh*3*08J4j}GwR?;>2YeL;i54}u#8%x?y8QVvvvVb zh(OS_8v~4b^)2ziMvKv^k~_?!@Y-JE56U%ELJKwEp2~?xP=R+WL9mT5YK+<*#uux= z>@SI5<`(@U6XEP1fwDdhoc+W5hb7|0{!Szv&!nNKf)bQ+yyXOipxMA~A7431VU)l= zktlyjlsSSL3hZ4QWUdioClSDIHDqLg%_Y6CT9kiN$i_vykPYrUnM!vr4dls_Q zu=Erv-HY7xH^Z7{^G+nV_k;-ykDjKe$suiK`S(=BvY`Sxig#icML~j6)C{#%1aJP4 zhV4^VpH^&uD18Bl9s|#%GA6kC{sevK%}nb;OJS65c}~VtmPb@3ucxB&bX`qZ6eh1% z<>~h0R49O5e^$5CXx@GxW|eh%I9-aO*YsbfyR=R>r(NsOoL~MQ|Kid*a&>umv}c1>k2KZ3_H1r|(g196&h6xGE#5AqqnziNQ~!hn zH9mE?2+yGkrOd3HLas!3b)o!~Q0JwkLW!P38S~g+ol6mUQ>UN&(F{VoZ08v5+XtBh&36<0Er2KHHWD6SGqUB8EInm4J zE}R7QR8F@-E~AljW(_%6TaqJ(YQGd*j2ATk8k2}{akF3*H(wr^(l()ThDC9OZ;B{w z(3CT+kSilod^s(cBErQK!78R)1vQMAL?T88dMT4Q(36fy26|UBi37cph))K3*D$H0 zD$}1tCN?thx)#YPO90MP)9vlZg4n!{3~h;eY+<@R7yJ-&J#JEQ_>6}CFAzVY?<`!+ z{Q3sTNSTxqEawuA2)Ge+DiRqlbwic@#`%R2k(i}R`zJ`06*Z}Zs745-upYi&*-}l*S-sQ zIiHum;bNS5C+Nx-BOzrf49CvwhST(37FG=HlJ#9Ayo7|50YbxI?s#d;W3=m^ca!r{ zM@2>`n}1qyM~Xgl3PTK$an7(>0-TBa)FV@pwN~UV#LE|4nmdAz~mtK>Djd zZ=iLioNIi3Q1*sRB1eF2wun`{;Q)Ni}2#8Y# zUcAtkGTuO+Y9(!{7GRzFD43)gkQ?P?_Z&ei1~26gQ0 zC&+&-_^EbaA5?&8*xL1kWiDK8ZWb7WMOLRNBPULzXk^E6bBI!HOD3b!Ex0GC{U2KU z&eWU|3w#vto1%D%40CHTa7TKN(xG2`w)CgiFKv(XKexvfpQ8b^`?pU+Tv1`sxd4<| zK>IpUqDFGIJ@n5|R@Rf*g4ePPb4p7fq%GS6eQtEnUguaTKRCYe2{oPeQh;t9j>${tmyLh>impgd5otN8q zxs{h&c)1xD(>lKfDdqc-kTMG%lJYM<5T-!$>k7ad>h`9(y^R|hC(Y~>U8w_m((7D> zT7*v=^7UbCr1Dz552DfQC6Xtec^5LmPgFeuDvTy^{`6t{*F*NN2hCr;LROSG#eie3 z_cuL)qLXvV^hx$55T2iWUs*;~AW8`X_wiF_(594Fm`t2ZuB^-CL^7p#J^*{J-9jjK ze?+?}KV<Wm8wlhDId~AB1%^B#lkNYCu34L*VmjTA*Ei2Q}TtgG*)yn zq=j<>&1n*h8Ahk%3+Euk$r>S?8){CIV9Ya|k}sSc;8c;%@JF=Z7u3`V&LJWbK`|76 z;MS>b!_;j!ZsljeQa;_j8S>DwNP7lp2;v7eNo$9iDTWag@;De$6N+qBxU2Klgvn=5 z-={n8wHf1iN+hRsjZIBJapv%fX@uOGv zXoj8wp#Y{m<)^8~^75NkOkQWB>Z`~oB`@>|!D>NORogCTk-hGjEce8ge*F^9*)_xF z!nd5z8AoTm4UCzf=F9AzLjIyMTbMB3^~B^=1$T=fj^KY6^1FKtc@ew_VZ2u;rhWv! zU&vqNjYSFL1BxLQKYB2ZOz9}3;shv54u7e+K>0(mP<_lo-zXLqmSsT)uo#tnL{4f% zj=6WFl*a^p&xWmwg9qIxxsacQFXwUHl}%K9LG}`$t6euTJ_-9`^=j^h6}?TR5{MpX zSyIs8kFPbTjxeP^#8QullBJ%dz|Eze>c%2n*Aj>w-?Z3aiO5ig4k=BJnsiga;Hq>P ziSz;e9T4AxWOO@EvIz88OnQ&%r${L!AM+}??3DDLx@4tfVaK9JJ3W<8NGn~!1SRwd zBzWVC>K7zQKI65_Tt}#6rA(wyJ;>^*d`?;s+6$ooybNyT{|c{~C-1%g3TtVPBD>7& zFOh9T$trMG*zyzJW;n7ei3h<&#+Z7<6G_}oVv1*E>MqPq>Jw6Qkb*Kvp*tx{u{

Uk22a2T?NUrgr_eUCix+$Z*`SQMD74rDO=N+0Z}+ zxrt<%uEMD5sSG8pIC=$w9EL}W%1}4alMXNBFKUM-i(&OKd_a4Pn_ltp4EhYlZwpgU^i!V=0O;F-S}(_a2ilE7d8pI5n7+(v5Du z$*#p_C1x9Nm3NTj)y@g~}V&6v6@QjJ56gVp|2 zc_Op4sm2E?3(Vgkb3zJTo=$tkS&J?j%vyBu=~>HiWYLipuxM3a(Vn-P9{p6dyrazc zRU@6`2({g?iTKUQ+y@FVUfwHp6r0I`rKow@*ixuhZF6M6En7etZd+346r!rRR=`n_ zf%sjJBUs3Q)SOqb##g?JJkzSqqV$!;BC~bHJ(HAW$sk~{;NFq41erjmGoj7)%3D#y zDoA$Ba7AcQnFuWkB2pHFr-ttL)YyXCnrc=>wq>${4U-jYoUx5^2JM5;TxV>BJmZXQ z6*+CmC-1Io|eZpu|&l6FN$K`o=J=J zFI?T48WI=Q_o(L^NH%iJ-Ps0{T~uu+UV2oDvn`q(AOcZAApqnQ6k@igvMp6gm;ZgL z@@sehV%6=Kp9mF@{y=02`Hm#7AlDyQYBkyT&XmVaq__1abCmW^XG&QB7;L1b#xU!^ zAG(5^t*=l}u!kE9`Vj>ggAr?LKj6nmmGTkGrF?$EB$Q7g<PD-Tsk*j){hYE^^JK}6zNwRTQ98mMRy^Uh?Z zKjlz_nkDavS+bP6bD$}u0+h7OjcJ_un@-bz+j;UX5K2cU;^_Xd@cl2TXC=^@KEpQS zQ9@I*s$W4aDhee7h3R9>9kZ(cLyoE|yAnb?tJ17N@B_SX3i#cW61oWi$G&9Hgv$05 zoKrdCDQ}~+YCJD;b?5zSLY@poHT1BamRCf67Phj&MiyjA7b#zt`V9rGfYg-K^pw7L z823AElSHc)(UB1@sW|a6oX#`%4%5$PlilA^-`8{X=>b5oJ~JlB(YJ(wVj8O5sZYX- zM$$ezX%7=RQsN?sowSDunH_sTZr$+u9%QNT+LI6(4zGn1;gojici@!jB1JC|x0llE zL>$iA?Lb{N60%k_FX9@bRS_q&I^y=G6<);odK!+n-&4^4FyaQN?|&F^`%vFk5OMoL zZrzCczKyv32%(9H6HbY^{lO^_Cq*w2cYxCCL|prX$`8DV%MP35MODQez z4)N^7Y#H(%jckEz#suns1P=NNjU4nnhBW`-!WoYq?K`$x_9jvuMq)ofgK^J#g+C~j ziIBsN<3uPd3B^9QGiGPKl^z z**=o}ualTOxGEc3iELHL{@2L_QU9dKVZ+tuKJUfLx_17IVd#GHO3QwoGi5Y$N|S<~ z5yS7_Bog#T0&R!$|3rz#KklI~mgbnrvWX}C#5@)^5Gd&?oXT~Vri zzvAVWyzIiu&b<7Bm!I?UGhTkm%TI7Ihv3eD6gfzDot&8&*o$REX*@tAr_fT0&7LSf zd!nN3i5d~fGPtK=RDsR$Kc#+DDsGO2KRrWKIx8iv>>!$Kr4g@@=x1y1?gj$7+P4=kzvE?3Tnz3@Kv&)e39^u7roER7cd{?i zODVZgAeH_2B!PAXnfAwHN};q$xH*lND($^wJx~H$hes(RKc5mmw$QV5iQjmeACI2X6_958tSob_Hsp)MZ{@Z-o2 z^&6DSbO5sq+MQxPriKd^NF+zTVs#@S9zcjueWA@nFnjp0lty@!sRWy)AD)dO7*xV9 zCOJQfaFc@7Xx$KA37~gboJ0d@Oc=}9`9n=JBuC7+xmAr4K#sLyy=-8TiB}eq$ zGQac=$@CsqQ?KNR-dpFFUa|D}ni?fXG~Nb{WwzMx&)7EmGxfJKnT{Mx&Xs1^_&^XC$NfO8sf<_7Cuns#>bxKXW zk|TQWn_qe*s{UA0qvVLj`=L=@d6a^a59dk9$gjFct1PcNN)ITnIz9k~oG^Tl$x#?S zMClz>8Hpq^0+C_$!$>v(;dJkaqesZlmPl{k%0TLI@I%aFxJft6XAGoHhbLzAorY`Q zpLsczmp|cR22xLeE@diWM}}Q$$@}*lJ(CT|GJYlZoayg!9EcO?7*Au`q}e2&GK2h? zD;d=mO#r+RE*c>65)A?6t|4}b6(b{-+a+w-8L?_6Ha;pMNqoXyK$a4{A? zrzAX&TlpfSr_AJNoz;gso|kNbv-%fva^#-9e}VKDhxFY4e7t+|*=wDGIkM9ay-4ay zKwaMXLcUsxtbtpWMcP$JgXH78>BHl@Q%Xdx{7f6sP^owqn+I#}#zEyv5QS!h!jLjG z#U0OhEd??#cfhrJKGX2hhU7`0y+ZvLBDuT;^>dIqa5eO&Mu(9Hqxs8!ytUzsH?-pw zG@L^+L+V#4=R|Frn}k zh1sxVr~$QhbrZ6OyRtRAs%UN{fjMtOpET`KXwtO5!=#R?1YRN`C6(x1B**m(BK}Q! z{Ad=imRf17KL9_(ypNmslh0_xZh*WQeRFZ`yPlVS@Nyk5*Ya`=E~XLtP)Ya*xAM(M z4;@8X*1eRRe&~8JXA0qC3c3ZfhM@_8UiA6Z{8MGvO%TkAsH^$ycq}Ei@>(`ox|&N? z%0!T-v<&y2%59_-SA9mHci_EZ@_d1h4#z!Gji}T`A3hp;CC`r#^xw zFAYZ=AC)wM)^vk3U7~Uv37~#Bq#mx*5|OPv*#_n1dqLWSCv)4Db_%+$IYC}SV%#x= zg6^lF-{azpk%$t8%NWR3I#wj*4f$1F0>~bvPfS_24Iitx+wZG0979zJP^n^`jp@o` zcrx)eOcCgyXAxng#a5ZeN!f(|M#>n#3;vW%5yXzKG%w8Q`ArbDA_i9ZB`!A-N2*fSai=O~@_g@lWmg51cA{&9&A^ml<^K@jvW)IYZR6tfa5Jq?8RRQ^eV)C91}XQ}y%M^x86 zUXg1zkA@PdQUb-i1U*L3%e+O^vVAxcX}*@B>wj0~Dera~7Z`Lnw~r<~A2Yfy%Qv&~ zjCI-AJeMt!2tohCaM?n1*|`3$L_9+0CE`5!MpG9v@r|bH6XH*)P1*|!i@gS#fjYkO ztW~{8p6aoQ5Qy|ewe&=!%j9-3Ch>bd(q70*UW+q{-}8|sSeALe#w32vM|v?C2`$B> zj;i#{iS)WM5*m+W7L)#vx{%i{1q!6)6j>fBxXCR%1{md&<-8n?N4czQCiDN*$y&4gJ}cT za(+ZLGH{~OY+#_8v#D<&5eOYuyv!6#y(C9`m5AJw@PV%KreYEMmLu-hkr2)b?*Rx0 zZ>p8ctk57*5X=N-d4)ch-5J`HN;34oJ9bhqKAt^vguzI2hK}g2yrrN<)(uT0N47F2 zL9cuiL+lcRSD;m|%J`7|>6By9S_+L~=y?ii*X!`yIt1?w%r9GOSi@ z$$n@{Xx*1=0r8Lc%zP-F4{BnQ9Klwp1pqZg zpK5G9JU*-mKyn1Y)LH;+e9lAZd{h&FzS`HYtSGk~1Y_bIM@pYZZAE~b%ROR=o2D8E3C;F1w}^-DaKlK=2pHd%TK zDOsXqI#|niAr`MM+HZQuuf3APRCub?oyJ?Ma#0Sy`D#Y}>xk}@B6LJxQ=lDBz;062 z80vE(K~E}~(vz;MaI-H{jn4rb$k0@ynHC32rbei&B}%Jf;HlQX(xH^Yl`|mUkoy>f zMlh@g8uaGkrsTf@k%v3hXL4I2m|H2#&A<;ao8TsX<}(WO7xMFp3jkr?NM1(pGMtxT zymaz1l$RmA493M2^>-kke8%O*QwP#hlrv}go&1^6J2y=!(D;pV&EFJn{-zf5H)Pqw6(`+B20e7eo$i><2QqNdTasS_rMQS+Y2iE!DqnZZ#&QETM|n8mf&S^T#Qe5 z07>~T7U;o@Em9hvk|6+{lAk~CirB+%ysC&;3Tf2+eaM3e>ahhAb^<@d>?p|b2cKcW zzOsSQ10{V+^U{rrG2w?Gk)~2LB!|)jQW_J;z+tW$_X0HLJme3|(uVXRhX{TIsW3!6 zwqVFl!4EM%5&Zar&oJabF=RO?=}UN-$jh?07;An8x^R9+a$^m-LTf0*+}K;8zTxz?kuOB$ro0Ldw)R({G+)|0oX{ zf5X-L*KIOK9hFsabGO`uhNr=~ObT^>w8mQt|r?YdGJZH?~Y^|ltoGhAF zk}Gjt8sd_(Q9iC!TEoS!WcWyHr$o3e3vtP+mXB-ILR`=7(e<{E;<;~Mbzu`J5w6Qa zTynt1$MuauToA$|wZ35#qvYC}Dh63US5$!q387=KHH|N`&jm5ZB-s*VIB> z5K=pKbWNDM)B#WVNS%}j*Hs~|Au+CMBet_W8e;u;#`TCEUQ_l4^{@B0FA z|BRo~z0Hvi`Y9;cn{`Tr>*^2}k6Z@r*Xo71PCMzOCw!fyWE=iIkW&**TkrW7{FKsT zXWm~6*EJ!oVKJ^X3UNJm<}NP>I_DABwIMDZ&I>8gsE$B?Tb?)e_bEqS|G-?Rw1sq9J>#A;|9MR z>!w7w=7zXN#kkfk#5Hi^hk?HkO~?AU>ZU}vZU}KL7~`5=h%5HjwBe6E6yU0t65+Zr z#5Fp`wN4ATPTOUTCw*LXQzBe9g}BDVxYlg}S6mb7rbM`I4snf*am{D}*Sxm(w}iMB zigB&i0KccD8x1Y`|aC9 zTnopzHY~&iAwmB*ul~9t#I;C_YoqysD{gz8xk(gXcZRqYjd9H^#1*%q^Xjj=LR^c* zxV}}03-R?@Q2XX_{B?JTYw;M@#)Y^bWIo5&Jt3|oEG}<(Ae$zIGxmE!2}@cDb|qnx zLdy_+{|Y=_Dg`NVtw%~)s|CC-#Pzip*QSNIay&kdxb6>eEfwSXb|EfUen;T1d5q8p zLR|QyayUcStPt1ypSe63;^J~uFmw4%A+GIr+9_Chnb(%)p%B;78Lp4zXMechHgGsr z)bzOCX;r+sl}&lD#QKj3US8I$N}gJn+sc}Y#JSy3`07D8L50cd6c z!t+`^XjxG>(6%jrh8N%b_1!w7Z`b3Cp*%;UVwSWut z{ZYStbXMQ8dA8|IBV130xF*K9wr>F!#0K+!Abll3diULC>>uHJD#VqjO!T0OAd+m_&ZDwd+mkQ(9?aQ*TkmJbOuLh92B~4I4KdXFG5^7 z8}$Q)xN`gCU_%^=f~hEQ881h;{uAQL*{I*A5nKTZ=!`wsL^=L9#FevAzi%Nfr$n+c znkQUehPZMz>h~+e6_;b|ueeWeTC}Jf`E@&QyqdF7zkeYv7#H;0bw{VBAIhey5w1ZY zuAGhf0}64$UqO5UX*d3vuOa)X!-ISFj8_ujSYt;>y{mKd>0r@W%pN@$zt7 zH=Jo<8dJo1STTsSEau3;grY@^=dI=m29+}_76ZQYaz*YFTm&i4Nig}CCl zkC)P7>`qFAYea}EXZ!!i7I4M!6(e<0B3vUwTshnSM-}2i+^2qhj6GO4CBn5ph%0CN z|L8(oPKoF?AVz`FLohc%+?%5w5w1}ouAJ@vV+wJ_r8cj)77TG^JH|D3$ep&z8z5y9 zDYXslE?#AgwX@gz2Wu`8bGH9ShtQnue^+?c;)dJ*V?qhpo^uW3oPuxIxU6M$j61f# zxUnI$rndiG^RtO{?DwoN9cafDKwBt;*3|ZYqtLRVaG)Ju0Ie&8mb3kTf|b$u_J3T9 z>ZU}sdt8VsXZ!!e)^G*uYfhWoz-(dR5LeFj|4IKJ;94Zam9zbS@_fPNROq-RkIHe; z5LeFj|0ylt!q$GU9@*Tg)nXy8obCTVwty=hQ#zad+FwpeNZ2zBD zhzo5~a9Am~6|L>T$X`o^xN^4tPcOukJ8Fti)L#FHaE%XfW!wMWu%Y(Qq&t+5vr&IW zp=EJzkn8a#EL%Fnm9tTQW+5(&5zPvzuC30fv5}O><2@m+oQ?Xk3US2|nu|2XZc-v# z6M(C_GZb^9Uhd6r)GrHeY}A)=lZ|>lW21fvY}Ee+lFdf_L?oBbK|;z@*{C;v)Z3^} z$aXH-$XmEkzdXoOlGoX&KM&c>Zq&2oY~tPQ$kCHRTsa%{e`^6(JV2;Dz3Zk#xK;>pPr*{Hv;7*}*o3My+ia~Uo} z6XBX1;>y{m|9c@W#7?}h-i!w$Tq}mSayIHOD#XPCX`=RJ{xVzO^I-QBgB=nQGZ1tuK2Ct*n@RbB3zXa zSI$QLm4&!so!ICKk2=&#iEvE~api2(UsZ_9*;1%kALFyePD+HU8sf^?s80)V#lzb8 zC{5jz2-j*MuAGhft6RVYUpyO38tbJ*xKOpS3E|JYeI7yywgHlIUDuY7vh@#{q|ZR zuAGhfxrMlL<9?pvYwZwM&PM$W^95Jj_B!vMMD4`%5LdSMWBctJ3voG%j`Jz**9mcD zYcm$tO@+APD0li8jkLM?xNe9m+fK5$ZZ5<%|Kn>$h%0BK{+2>qD97O745BGm3a^_I z#n*ZvuAGhfTMKc;?P^@IIMQj3SLl*;4ueOy)(>&zY}DUYh$}9~dBwFsh%0BK{`Nv# z+aG!3E&k{sUP`N*68USx5LeDd{T+q4=Kp+XqYzilM*W?IxZsOm_A{^T#LN&^wzpej zFWXu6_7?QAiImzfb{G4y#@gAHy~~=5#GH-#Z-vmDje1vj*5Za6^&5v0vfbet#yJC! zhK!!z3yj+&gx1tXy=#6pv5x(o6{Z92o&so_hR~YYsBaWnRum4jdkdg_JA{_A zQGcJ6(fCGv-M&J%(hg13>TDL`%Gs#DzXe=z+vmJYVn#683T1@rJ0Y%|jrs>#z=i(A ztl()BKpGqnb=rvtSAU2rXQTeX`GPCnigx{zc6YmeyO^I-A72?X-sDHc=SKM07 z>*!?b5LeDd{S%Ggn$M%AZ9-hmM!nks)*hN{8%oI8sDH8%%Ys%nZinlpM3Jyvh%0BK z{;5J-m|d8yZQVaKnG)gpzYtf>M*Y);xZ((%S6tfzSM{$@%#C`vI~(<5PAhHFJ@DVs zCQ}yJY3!1n?aRn_=u4xv8QZ?V1|v%gZqg=i)c+9N*r?wLH`%D?GdAi!`~x=EpMmJJ zr#~wp#+hqQB3;)1xIpc@PjPK~93P2qBZJaLHPkx?mzs{M) zFP|z;e4ZKcBlw>@@?!+k$U>O|B~T~@aJl?M5f#8Uy}sB%13y*;_%gDkeAJKUyu>I; zUf{KCvIeaJJsTyGl`;{JWSQJkd69%Dx1WeG{P9yVzKT>sI0-*200kRPlTHY~#@127 zuD3jH|M}9xoJSC>kH^82&R+LY{LBHb{5gT2L85qxMkp`MK_nUZNEzEHzj<)`;8P@) z-hg%(dr>#b=3*Od6A%;S^OwJlcn01X2cd*XEdr6B3!lkLd6!}u9knaz*u~FE03?1* zNBowEQ{)$uei33H;1BKK#~kK%dM0&A(qw4QJjI=04~y@$^14U!H*sjp+c3t@biRGA zy(;D*2w`OV;FWNrYj*~i>a#3Dv%T_w z6x6*EZTt-$azq+&#udL6ndOfl%&83@Qg-q_uQp592FXfEuWQ4!p2`O#gwEYX82;FU zjGrLY5K5>80lp`QJcI++A_Wog@^j9L1@_?a@qoQgd8^?15>5DyB? zZsReN*=>SyCjXqwpF^3n?^yoG$yllUzk?@GucQPLaj%r{UXjbPdc_Ef!{>imul5E! z9hYs1#HZ8Wjy|oS{&ru;Km_fBn^Yn`qY|}`O9!LS&z^pDFIu;|dv$LM$^(T!a_3C{ zgew=be~Tb`g0uYD9r){m&dK^dCe20b@~mx z{4JmxdP#-K>Qhxf^&+WG?2g*o5TA2uTT{<4Hcs zC%2(@lL?`l5JKfk#+))|$i$~7EPzNxX}mdsV}v&#anAG?CUgzFLXn8>isvC?hkXVQXo6krTmC9m1-G4pr{WSNv1Jjj}o!H>vo1M#b+KmyU+uoQnTP z5R_jZBiW|rTl3F1=ARGq#i&1#e9KWDxvg-|8}jE3`KctocdSQl>)G)pX82RZBK^-G z_h?o1l6W$;=d_R}C+trTX>!B)_cWKgRcGo!I^>$g5*?M9IDRh&m54p!rb;98%``jZcm|b*EnoSAk*G$Px(w{{ zwGvtP>s%Tf|Pj8 zsIu=>OY4B`y(-ug3E1ANPA17ZoAc_c5OGxW$%OJ}BUu=wf!QuT(dsMBB#J=s0*yzy z>HN0gpKX55lzpe~*H-E-kLvQ%;oZ|vugK9gupugz_rj{!LV$w@lZ--$K=F zB|csk`p#O06Wwd1E4hHeHXr2)v+cukBJ5cRdoC14n$Ich2@!U!2)mHN?jGw2v#rN* zs7rIEA6xDk7>CN_IfXR;p|B&$M0TAB`#Xerl62S2C^p_?(&OEe&tB^kOzSXSFm297 zF7H}&QmNVnK30s2aYK8p9-ID6z{`}7OL3Fh#b?y6ySma|$j@o7F9!iSqH-D8SVQ=y z(+9n2`XH9-6{I7PDb5Ech)7ey+r!j{WOT=Jd}2blv3RA+KN=*jbl2clnNks?Mp8Qm z)K+^JxIgTy!L2eUqduE43r64>FN-qZRpDgJQsYwjSz9CE8VIm6IL?OHz0;k>cH6)C z-8;R7pwZp;bzrP6gCv%&+?#JZZv;2IaRY8rx_n0I4jz{#5S&xGHwi(qJk<(~57{?b zo_Z^jNDM7E3orh-1%H(LkXl1RCw%&!^-y4MPN+da2RQ@&c4!(qk;^0~;5R3*fNvFL zDYY<(P?nUUVo9(_obc5v9wI|P6=Vfr78Ba z6rk2+dN}&Sz7_G@HyIbRL~*ZTy$`qYDo7WOxP;yEq0E?~xP0!14qFEv5Qr&N)+(&Z zH;}0edeHpw5dL6GWH7+fm@=vn$xJiCdzeIDu`!Q82Y>555s*@nk0Qx4NQG8PcQdk9 z;)Q|wSV+h=9&H&5hhqiXWIaJcimZJSMAen)Dl`gmZ$5xt0yluYh?@iupAkSq#-&ps zIHyr~SuwnVTX{8*2wfZ$ZrD&#Oi>&*uTsbA)Imi$SjJ9lxAp#C0+!W%;5>}Orr{6P zcA31UWF!wpB3MyEQ+i;xmE)wzYE5Z;WlfNmEE8p_)}Bp>mz=dMZC0L7ZiG3gXGe{V zAu=#2q85>q%xhvS%IftHs6ym{$v`d${0zM}z{NHzE{xnZ>rIeLl#5>^%HKj#wMsW3 z+~nSTxV;B%fcZCWVicbdZbQeVYe8^MxP71)KE$m&9V9{*2a_9aloV4GhucSjC8d^{ z4buk5R1*g`;6`%>;33-{^*S5SJm>|XtAMDyTosPp6;UKE`dDDWX`j#sXcLTmxh>$Q zAgZoSl;HRbHz`DsCWZJpl5A7_Up$m&fY>$Ktzch*;5%M!*s+eUY)EAm6vLQCoxwv) z@|V+f_bOuM;pW{*U5UT?fR>efq zQ-WcTfk^7aP0ZvoDs1PtbS8=`r^1d<3?p$XZ_LmlU0faA3Y$+sgPqvP8TKt8SW;@K zSz*6}%#ugq%n&?mnKvDZ?urNy(?^LqIAcNDhKgu#=T^kgAgX?g+QBgf4^qG)O$vA{ zl59mBM~Rz)*hT7A#DzhCide_g@s)lt)qpZ#QKKRXF==utB7uYz(G{yal~WNF0>d6u zL^s*3h^|dpy*1{zT-|X+6pd0ki-?Ed>qY5HR74jsV@XyJ;=%c1Ah+eTI3A>&M6Q(6 zl1TFWuBV@__}tL3W4W(c4XB1HBATv--H-v>#^WZ|@)^}|*tm2H6jn|(>;Zw~nW{Gt zE(q4+Cn%x4xRt-l;G--l`4=@^Na8{i0dO)95hQd@zn=Z`BkO8P) z$4v^8&nV0hZCm5n%-2=|Rr&vrkTMlJk$Tc|)n?_%S;r%>+QdDZo47_0lGQHmWbAH= z;1H{1pc-F>1xNQBiATVC9uZJuT?sBh zo&?!!Swn0~X~@1~Cs%%sy9&;48td1jH9teTSZ|uCtgcct#z3zgH00U|E6I5&pa#AAY$<5W{#l_QmsOaDG;DHK(sFh~w4#`1xPmpt8iF&(p5Ux(Ji+Tz z@CFNcA-XzTCfm}_m<_k>uty*eu`2NooIU`e4Z!Ge`GJj*KWnjswF+)BZAfjHJF_`p zg~;t5Hv&=hCoC7VL~?JwCE6G=pzm9_Nsq;6v_xH9>8=o*GyK>D1Z=37t&yRjQmb_v zW3_GyDtT#hT*~IC+pj^1A>~ERQMXHQu#!jJtQ1z%N${p~pn)UC2W7?AFQ~?NvcQ*8 zL~&d_!6MpiUJ>~*(ioy3Uh>N>ERDPqZr3^rN4#X zoMP+;L3zW4B-^yOHk{+_=FLIw(S|{cUB9{Adq9^*r6ihGI2%Zo#(QKrB|o>@qsRoY zU>}@-U4@zybabX_kW4Q}b60`;lo-3u?Y3Y=%sSzo)E4v&Dj!`}v+`{TqU!Ft)a2fL zsci)rD6CnyN#)}+N^Oy@bg!(`?&mOIPduB>e``>cPhLo9Owp|mo8_R((Pl6IXtqRT zL!kY)EP=KS7(K465cSlD^xkUqw$z0s0ph9YitRvD-5V4PV7WK%itj-NT(LcF;tD>) z6^nMI0}z}Oz&n7Te9A(S9eE)>0P%g0d$f`5)Z+`vi(4F4!r=i=lJY%?8Jq7-Lr`Ji zzY%dNHai%bVA`)!2k3rs4(bOq5Uw|Za=U;XK~&vGyI$_iyZ)z;0oVToH*r0m;rfTW z(m9#ykK&|de?0f?hl>ftpDWg12nSpKL6yS@MmUW#C&DWqVhoOjR0@EfaIli6z)OQl z6LRQ#z53fZLXilxoejoa@rS1*D^5M_BX)y;UCAMQ!O>Z^^tN(mLma2vhAG$AyMaiC zF=C<&V}3)vgQ3ZC8YOCRh5=!=K#gplBCoOXw?KbOQ>nwBUZ*SvSY&nq_8^o)LMVBb zo6`n+k^_emU0{kH=6i<|Q_6)dTYfyUD^1Gp2+kF-GAw>(SuZKWKzBUDBa1im8jskwn$ad^s6&kVKw$MisAH2T_vY*60g!=uxj$|a{Cq~ee5@-y3W9Z$ zDE0CPJog=ri>a4$6zf5_m5)KXaG2V_kc-2UGGmJ3@H`kgQtAl8lW^ec(R!2W5JGu# ztOukxrAsT}!s*l>K`6k9Vg`FsYaC^lMBWp1M-lN<#|6M&5vGS^&qyI1|Pi ziAKzv`Z~VA6p4$_6xQ2DLHGh%u)-IRZ^a1(R!C@uR+#GFaDn(zS}?^IkZ;O~1*S;d z2u)!t*Jy$G0$Q-b7m#noN%>Z=hHbi_862G)5>1p4Wu56TQj{1Hrmadxn$Ov+>;b7hcZdPK(@Cpv<4n%$oz4KUM_0RdrAXVmGER)>fW_%uHH+01!z;))U_rc-->hct?>KVb3>wuaX))r zNR!vk{tZOcb72DeS-Cgg&t3=_XrwN{P5N0rqn~}FEByxq>wflF&KHw$;%bIT+Yj7xR}28?~qoWiv*EoT4QBz)X-l9VvjCpwK;m%69S5~4LyMx(E*Fo z&})|bhQ5vnr=br;1P%Sg1^AtYzES*6LtjsMJ+Ckb6J5seq*ieVZCe$ zi7!Rl!x}#iQu6J&yucp6#n$$)v1tm4FGbtKW^5j$d^?3Tg5h z{}e>k>tP2Qf4Mi`_}>B?nb>sgoCs}vmx$h2MZs+ATUT($3 zH1xL$XUcT%yjWY$)SdYzTS_+6O}#Z!`VwCu#p_k$E5BfFA~XWwHVCTT17e&8OC(da zLhe9v`CcTa1c4bTygGXjKV>?*)II5pv2Wn)8n0ZAyOXr{k(O4No}qXNkSwzJcNYcR zPXW|OvG^dz^`A}E=`;5{1i!!5>O?}W>vWPg~7v^&I&fzKWz(W4GgN)8oK_{>jx0RCx`KSpxb zUf)w~BODos7M9nVJxiw4Vo$8;Bas7_fAZ2dJ4#D0nbL`2uC{Rel0jiT3l#9r^91ua z!4OdvH4G$LK*d8kQbt66=GczZr5)M9pvnoX7pUloSdpoGRMZwKax*(Ryy$JOrRYT} z!bYueE_S@IA*2rD9L0B^3Bp!)?w6#r-%F8wyjLmcwS}x8A`I#yALDOgSe(|U)_;rh zgXFW>y3Za=C#g^9Fi`(RZBNoa26#<<%urnd7K<!~#8VVOIZU-kz=Dr$ zaZ6E=z6nyana_ca(r^R>9}25Ji^o#(PhM@7{%VqBrKAU?Epe$0J(Xw30UO>Dsrch< zB6%LEhJ#85wOKgA$8TrP4k&U0=N-y=fwI_iv;RveSqG>3gqTP|S?JA|j8X$eel8(i zu2Ub>dY4LGELP&I9@SUk5LzYw7Wb52q8b{+)>Yp-QYvSHzO$?V4b3UZ@n`nk5=2d@ zxAH61kfIP@20{58d~U}1LYijE+A`%ql0w!PidN>jDg7h*hbJPpe^`H~Jw*NSGr~bw|1mDU~ zoopxmNZBN?;!7>DRiV7Z7<|M5ClCjcg#mLxK3#&R2giejpxKjb&WrV&FF;P~sW12a z3*_oJBN8v_=9hS`o?t6TO}5tpHm?NWzhNPInYKt_m6x7>=wAHCC}FhnD(7P)eDr?)C#bmXh~) zwOP8mm8_KXIo<91`mzl*zLD> z)Ws;DEfbD5rPLdxFG{7KP^lfcWH|kvTOG&G=xBECSU?d%uW41Kku`nHV$}F)p+?n1 zak5jOF(a&{adBuw417kNG?g;-y(1+OCg^+C`;#0Q+KSUYzV#vu^?NJ7RZTtQeGY=m zM)n-3=22e@MF&BWOa}UwS<@(EcO@f`z&vqM|L8<0`WI9sqot^^gLuwO=^xdB!`W`Iq-2S^ImR7VVKC0H z<3~rFA6#bqsLMr-!2ovY`ttQSroMa<8Tq=Ht^A%)e%8^=3w}HDoKRnWtN5+_Wgs7c zW(G(y%Bk#Oha+Xlh94&qhdaLsR=(Lf>cw(4L7c>k{qFW=9d_}WI((xWqGq_IBaXP; ztyNf%6j&g`NhQR!z?D+Z0nXC7V?m?b&Z@bqyyUnKCM=h40$rb-hFBg%{R{MutnSHD zOr$KqI|<1$#_cnId_7-U-Z8RTnCdy?t0>Z72V`=A1x}GVW#S5{XMj_puKkU&H&&!8 z7MLJEzubCM4$Z2ick(Ol0UML(eLbqbB!v zw#i*hvLSs9N*|4M&p*LB*1#92& z8i$lbHN?p4wrWVmMG2d%x@PkxqpZ8Fr=^Z_Qqsk%&C)|~$x2BNay$RfD_-Ns0q<@gQt`)z_`~yX-3>&&E%cNgu^24`7R?I1 zX-MNL)B<73qVdiOxZP)6jC#9BFR+`L%ti%vN_!oiEUay(Gb?P^PG5z#lflxcoxXs4 zJ7?zG$qF&io;~~)i24_(O86ua68$3)3mY>TYiZTJ7$u2RN+fTBWa&FMHGga-f0UO5 znG=&s2-jk~+AJNDl9iG^Cngss2lRZ$i0{WAjR%a5Njr$uT4-^+Jl42aT|V5VYP5W0 z6lh~8zkD_?u+1;yu)bxs%|m_jRkUEIFF@PLT`i7#y*^-z0&8XHYCTqHZ7a3TSJ8sC zzJPkxZkcZ_BXMmTO(Pj z<2L4x?eItWYalY4eRc&FLqKm8A=uITo=C_RV)v#Zk-dYF{e8+_in4EG0qdQ$LD(Dg zzF_hLklAUkv7Mk-T*PN7f$yB3`rdHA$G|$zbdO#;~mJP7_Ce~%07_f$B{ki%k_?B;E9{Fc(cLFsmrBLn2GLx-Cjw6BFtj@_xTQm8T8yU38`YRm`` z)!u-}Y^&@6jVSD?)Japhr=jm1DUmQi-?L2)l4lzfc9Y}xNQN}XtKzRrqik|$9=pjw zl1zr(@UnlmAfKbk6ofsEhsy^Mx)#k3lX=wqkw+#@B#~*T@435BMU5Wb~S1UsRzN?)o|^1G1Oys zb~Rjf*8wo$r~(s4qCV>_TUSb>k+49^Ct z7I-Wr{k+;NJv^7Jl=L}k(3_J3fKL*s_~T^!;n`nz&mmm7)LIBEn&W#@l*U!GuyUEZ z9-X^RdrE<|{)%s*wa!$(VQYOAEm-Rd$X|W`V}YI0L)Bc5j!M;;`!{T-uc8GzeF6D) z{;9xD=|mg1(^(8?*iK(X3wHVf>aDw5ZaJ4ku0m}XPH0F#vkQb zAhOE?Y$Aqq1gq(PCD~RXSw~2A4$11hF+vfXehXN6V}!cB6xm}wPw|(D!T=g5=1^))~}`7W*I>(jadq{1v`vp_!Z)EyQ+` zLY7)b5L?_7SxFPQ-isEOTG!>jAYhJ8US=IspY96KHQq6*-pCXdj!U{;cIU#{acVB# zihMmgbLBgwXi7?zX5;c(Xc}`n_Ta$7l?6`pyUWOlwJJfwPOK$gJJFTjk`sOTEjZB^ zkl&A9Rp3OwFK*U}#gS4=eq&B7j&xss3r_R}T2E$U(457h+IG6o>e=Zm9n}`*&b~2l`bWNhEzwnV-R(ENuEZi5VFo0ccQH2+8c}=)1XT}YB5agQvGFb>mk&a+;A#Am1!R%)qxUF)w8n7vq7G#r4Cok9 zxrb^6#l1oehulxS2Zws=elXwxvK&Gd*XFzr20Td0LrH1;MwiKJqO;pOyu=|LZNY@& zAu=BpF^3b5he^h7iGz}cN3W<;ge@|ea1fD~A`_0sDCltNGolDKYlqAp?Bk?6qBb45 z2BC#kKc4vns1av>0KM3*c5IKqV<|a`SDU4$F_M*%9&)UU^p5S(*WnQ`q5_?+fc^BG8D9vidSgN8ZpLevA{G^csOTrn`|>3ox*aqJMg zKKD-$q45w8CgK%oJf1@`KQrK3797v6@tFY=pmtg+G4VX*odCxbOQc6sKkI);;01_4 z0Q`wUj1uKT35D{h$l$X+MEyrRmXecs6&{-};UO%E(4=I{36WFC3OBwedhy3gwBgT4 zP1&AtvX~MKSm{zZfMq9~FO&8(k5;RRX7*q?&LlLY(wuZVwS1Kl&Il#A;~iIm zlWrya3liYmGbw{mI2YCTj+By_pzqn_l;k;+)BBJNX^?jo{t73jn#q}*itQw|lT)$9 zO_9l|$n_?tuK{+-u;PwzR2mWuXu2_N)X>d-_v?jxbQ1Wq5A0U}-T))2i-c7o5hB&) zE#la|7BVlbtkoOCo*xo0unr@)Isflf$z0-f|)0zZI2MB2p^ zNuUf=eeX!Ahza_hMJ~y+$hC(%?nknU+)MCRW`Z2<&^-2V2T3v+_Hf4oN=Dh2kR9$= zAQ6iGk;<=HidvKr$G9mH_kzlc`wwlgaKyngwHa1&Ly|%f5EfJ@F z?Mq*5An4)i1q3VHBjtadu1R6%HXL@>MXGSrf z6}Z`7w}__8b**;i&)Us;ep?50Erl(*xmkrRxY}3WSIsIHh&DoALVP1?TrJ>Of8t1b&~j6mv|+r=a;vJF{|EejBMWAE2UO1 zMMmDk1zGt9WWqOQbUYW2rQ{#H+AKY9lB|^U9C&zYdMekG1Mo(ORQxd#e|WLcKr^0= zpS2biTF&cSb($@ym3EJ_g;vBDkl$D@kZ&8&cCBJQ^*;(k2r+SGBJPn8TTmQSz7_tW z+tDuaTV}V=eaTI{+AQsM$x2C2x9^9$Ez6$D&E$Z$M~hVaF(!l-R7o*UO;=qnsyGi8 z16_hZjMHklRGAn9nC%k2Ak^5L*lENHq-OG9^VocwSsdAXb|Dau0`eVj!;{c8U3 z^vV24^rLw0dxV#Vd3lJJ2XQeAX^RVI%5-lO`u~V~4>+re^L_m8vLFaHToEhFf`>iI zDvFrPjZqLp6cRwe-fI#~)C6nVRTO*gnqmv~s8OS1Ma7atO*65_uCX_;M}E)qOgZJA zySo?j|Nh~#bI#1X{e9=1IdjV8`meqG9-1wO)jX@!aT2|?q8Ry|t(myY(YFHc^*={= zFMf{DkPnx0dRSj+WDOu!o+435za}cOjkw4*L&e2VXhZ^|p)|Doeh{LayxGZ~QT&~4 zs_V9y@H^Z5G3wUp`TP>1Q%Ki`SZib0zzL!xMr(OW1wUdvfV)zPL~TzwVR$}Ogdq9| zqCXAZ(Yg9K9ptS3b12x-(f~9xHjegZrE>YYgUHVS!0VaoUz`2UvY#9{ekF_@{9wKg z`=3LXetUHTdk;tZX)!!t zpPaz!Th@dP*@m?6A)XI|02_D#Mw6}=zsZZgAzP`mgct*C%22kHy&be0D32v7 z_4e`^FNyZWntLx#YItu_D0-x$0u(*cA^9}6zsV+!RM|{H@+}g6p-!mZ<3s%(hPsbK z3TH=y#0)#WhN_{jSz$!g@U5d#^gN|5#Rt4En;Ga*9$34wHq$f!P^!NdXv<&Q~BWH$HM zWIbv*6jShkjr!${N$8h1#9!W+Y$@hO*s$^^f#{ZkfNWdoBzhG+8O1BFNSl{f+FmzY zD1fz7s$rrHDvs0;)>Loelvs2O>7(uk{m}BuBnanY_0Q}JI@8(z8o)CVklR7!WQ!m8NO-tK&}*q5QzH%CmY4yGhEW$@egHOhsC=sS zQR^)tsftXw8iMq?aG||+>bRe2)t0lS(b*H3YKd>(rO7`onGtrEhSuTua zZ^g?jHgjeDDKJX0VgizFi)LARJAbmhPNKH}mJN+Jh4>$qw%0`hy^;wHHgpjhqGL!u z6&l0JZ;&t~+QAF5lTK1@n~nMQb3#erozb0yh8-aNV)ZLDc4hzD0ROt7K^h8;-9WLC z&>&*Bp|N|OXg8tZiFO$pdr_AGya zqqX|J>VTW}!%6fG+Wp|Brb%}Dt|dSKw95+ZPo}MMGNc)Y133v`>N4FjZm>)9MtL$*>*jXKyC7mj|KQ5@SR*5QtuTg@7f$+<%bYccb`YkfC| z*Y}Qs+(hl6o7_Po_;aVT+G|DqC0GPee}#%fl`InVV#(qS7bIcSDWL(90a73qWi0=Ny&{fdfJC_Bo zAokE&Y{#@4?5l{~P9Z62_)Uyxg)=fA;HPxiw5RLx=zw%qs{>ThaM3_0pl z#4{&a9k2qf*N|&RE!R#oaT}>rEw7wT5i|?00u3eQiQU?X>cM+3;}I=-;v~cBIP%Vh&fMg$q0YT@o8E>CZ z-!Kf+CU`or*--v^oyqd)CP;@%jSQvow}5IB-pv%gN69uUTQ&f4y=9Bfaul=fvL%%w zr~35f7A$G}x(k;2_pI7c01cugaZY{wlyjt_EMTA_=e^3t)H>G8 zh3V>c83reJ_>((niwyykAOC*Hx~Q-tHa9KZMdUF=#+H4`#n~ONX)4e&-M6YOE~eMeN2n{9sM(~ti zz40_*sj>y+XC(d^#zi>WYQy3D7_dR)Q5+P`tRtL%sBoSE7M;^sOk?pK7Tcikk^C0` zN3+n7i)7-##37RZO1N#&Xb4Q>yJHB$zY$`)3?;7A0-SLq1H#{lusun-9)AoF{~!c{ zjskZTbd-xCQM;meFcgabv_TO-v!NV>ps5NW6jDWu(%vp)lm;kfl!3?ujMv-+%uGl} zUq24RAYg2@;edG(*dX!*4hk675it9J_@vIgQFiXdVow%(u-Ki&ZY*|Xu?vfxS?t7O zM-)Dso&u?8KQtI3(x3#vF$B`ng!nEYNS_d-l!kbQ5Z@yN84<$K>Sc(Bh89CP*yCvQ zGUUmgz~@;~`94|=1uv#Ty}G9IT#$tV0X7*Xe1mwHan1hNmrG-xGyfe#pd1CruGzR_ z2Kjj)W8LiOJCNp@h89C-Q441Re{AvA^2e6umiF@D0JdI#K@1QFFH%e_!Rg1j6D}Qr zrDx_bhOqG79{{<$ANC8KBQ#2!yA;UDqYp2EjaFJmP=r{5fcwi51DZ1MuwLMVv2=U+ zNCGK3U-5FjN;wZeyN@X!ABE2}M?WB>i!C27g^&>9HIn`z5q!wGpeaO%4kV-xK^H`Y zkRbg!NgqUnTpSi6LB)~zhLom7C&S0Qx-o#;pd$XK_Hro219U$ z3PEtR^FeeRyGV{*BoVqG#z#axo)F|f2uGxsAs!l93Z2r?05M7*y36Fqq6ns0JaudB5~=1(OCvNfHQWa~2tBu{?k<@}s-o``nu32)rui5Rc6_&8JP zyq@f}vMh!yN;V22B^$+@l1-^MlFhNuoykVW#*0GL$~31I9@rlR&T=taZ^X7A3q|Z9#iNo z-iD0a=)o_}Uyhm;t&f*+DV&5K+UrZ+*=bGNu-aLn4qlerZ5cj}o%~Xcp<)G>HsR)N z1|W4wk^s;uT~bH`6jGo`yQGi?D54-A_)UdGxzJ3Uq`AOT$sp(lvns{?7DAO`c>!^< zwD&=Oe=>mf|0RHu#lLoYoEK#u`#KxYml0NUslc&`ZXXx8L@a*8GU*zF5SS9H%Mcz_ z9~nc-7ZVormL+rK`?R0K?tXTi&J8U0L%;pokXCrMv$RFx}=Z>D54+>7K}mK zM=E8&3Dm9K5Qx;A;M4bz1LtVxS#wtfw>voe#2Oa1CKa zH#>RU7`#a=Ze*Es*)gatLwJrsM{{WT_k@KwYmzy}V67%K*UH>=b7Sya&hQkOBhJxI zjY01xjjrGn)ns6u*->{3h!l-F=@Lsyjk+O_Q=?AS)TnDiQ{@`!fl;SpZH!wQ2OB&tHZF#jf=%Y%6F2v@YY5*dMyf+>vrONH>#G{DHfH6!gWTf) z7*VMp{3-z9`xJr^<;_wuq_~641oXi6(zJ2gPXacGY>tC;WgWJEsMRchKrZ8*#Ef?z z>Yewpn9t%K6y7ge04ZX>d}iun9TK@~0}!mAyV2~0ZCIK?uaMXSEM654*6e!PJ^ zd=g3J2t&37?e?yiar|hA?dd2d<2Htbv9(RWWwd^I7y8|pF3@-t1C8%i=pgp zsSKqyA4gwr*|1WnyT=)&Qth=$O_%V~vr1hYl;YX{P^l@31+Q;n9lg3V_U|x5DP!Fb z-PIDhhLrzGh*)rnt*N31Ykiy6nrB0dGbFOySHs=IM?dGoN8ZcIQQFq{PB$oF6Y)VX zt#?`K$ud4tc2?5Vx}{Fk1%T8A?6htKGM-kV!}M-Yf({RLp@Sz|SBJEcsgYBp!wd+d z+3|1kl>7zvY>j3)Y#VGu;P+UD?MUO#IU3`7j=w$e@wg`Qq6^w%{S$M?B53K5e#~?{>BAF4i}6Nyuzm3G zBj{-`N&_|f=xZG}XQ5K@x zq95l+>i&g#=Ra9I&f*^^{NiH|AsKcSeUI+nXt&h&1YqSUR20 zKa}?Swo)}71W5mI`_llgGlH`-B`22J7HeEXMYx0>e&wFPWsz27;Jp zvyb7|%2nIqB&FSRl0Fv*=Ox{TlKw7Z)1!Q@Jc<)M{pr?FjClJHk8|NHxKVTdzKO%| zVhS)yjfdF&paIi;9|wgP>j<%^)w~9RF2w%D5PJpn&X-xd#NtI3FR*wXg%7p^gl^bb z6m0LK-SYVX04uMvieOW-g6)SEpS=Cn!0_;NBrVa@zx+WUav-3&6!+lpAC}_wA?=fB zMv4n0r8`RPOlp6ju_k2S1jN@5S=uBQ2yX?#sX(YRZvGQszfLsLCpjVB2!vBYOvP1H z%JEVrxdGW-M0g5T_H*( zuHVx_BrQ&e0_(mL2&aUgbz@mq!Tlo|6r(;BuGvw~A(k5TO^RDLmcpq2F{rqa(;RCA zH9qPO1r2!k5F9k>S;wd!*=jz62yWCr$x;6a>YX36Sj1u>i;qzF0e_e<4Lgel{1<4q zEDi@?<#SeH6E({wM_7DvsF?@a$9_e4Lm4oNIsB6y0(TAdB_U$LNs}W*54!yXC;ajZ z6>`(o={`4{?v|t2j7=>^l~aF8v}ZDCXL__VnNpmlbcdle!YDH|OQ?z1&p=Gq5C4^v zk`_E(a>$f+Zdj|PHPG7?!X znu8|ix#n0NY&_tO0}W_C7YDhCbp+h#R@3LM5O7a3;95}c?8Ty)MH7n>i^Z^^kGkW9 zZrDjb5E91$hIl$56`qVn!ONh<*cjOC5L|PwfDS9d37}C~id6)pnx*YYXpZ`#S(5ol zD7PofCGC@IXKpbOMVr$nlK=vbiZu{;rx5Lf4BELq@Xn>DJUtGBta2=F6jmo^2@k}-)xG-c&P~>0+xP6#m zyk^tE>D>`>ahxR-R@BQOpz1770y8=^byXHFtPO_{r6EA-f-C^onN2C+jPAsAqbw_C z;2`Zq=*;d2xlx)W6!cxb3w_h-6zc1(-vfQmf|xE5G{;H^jpw&>K?8Ar4i3t1tRufw zTFolZ!cC~pGQX{idgmY(E3s&0u_B9sD13f9Pw0kV2&$SSwi?yNGRp?%MctuL$Sle)yF;OJS(IOOheD%dQGQJnteR4~WLHhJXw9n0 znU0~QSo{sBI72nZGFanIz7#azlJv#c4f=njQKW>K!}4u#5PQLgF^ zg+|GuTul@#QBt~OmnhCk!Ijql!P%ramTek$onm*}kZQSThZVm%h?qVRsYT}XxyMSdECc1!&Z09H0+6@F5){B#$Z=_j%*^b?t7 zEqHf#C=@b_a!+?CR4$7$pC}kVDZ#Si$Eh4#axV~^g3YlMZQLabKm#th9|yUFb+}|k ztJxR=I+wgcmsC*i9Lu82;u|bBLgD@LfG`a^3;Z&6GqmHkzuBALCTuT{XJ;%BN%0_P zRldbWxK5pN-NTjzg>ct<_^96mf(h%7>V`Id#tGj6r3%i)7y2c5=6elXRE+Z1j&^UZ zP(r(zOl`9+djyOE7ZS6NW%#wqLjL~k?52%S@ZRa8fYw#yM2Z|sa5O*W#r}&w`5R6m zYFY42!D^|wBuPoyZlF7RP>*o)`Eioi1SH%(r+XpMI9M$glPyr)^KHp==HCSWCkf)K z5hHYrB)61U+2qEstx0Y! zNW(~a3RGOYHOGp(#z)e#paE|_gM*@xb&RBKTg_IqgWcnQjU#C?>YZD#n8adp6n+pr zCnUqpqCqqr?IlC3f^8XpmhKm(pyh=W3lb&QCeTg?vC(T)hsE!&~qxh;!X zEM~IU28ACM9}Cm4vuIfChW3&nzKiJQq2*oK7OO|hKLLr#j%>teP^S#@Ihv!L(46zQ zBUbG3bZ6e)C~z?tX-N=fNxvVsRjgAF}uXivv)2M=vWHhF}GbE+2|^%WOFSRt{km z?o_kfxdNKGw5J5l`q|wQGRxX-AW`rJLki_MzpOcqyS0=aaitA=iXPAnbx3MdCe*Z3 zu_8%h6sAaLM68z?YE4vaj-_(rqi`^2z*j5dAYZW#Umf3Sehv|wuRf-) zeu{eMPgoqu;s_Rpvp5Wechf3DH-sp1Qx)x&&#C~d{DM`uNzHQ8>S(5$$h^=^WR|t% z8bra<=_!;Gyqiv-n<%(<6QvI5hT?~s9J3~g!7(XfS;x=-HI8xW2FDCZlxvQqWaEx$ z2Msu8C=PNA>u}70t>#3C;2iT79dkVDoyW15%i>rT$FP{g;%F8}q3|vmCPIb~MJ_rO z?Uv(k09H<76)sYv;~4?3 zlQObf)?}n{nU%W(#IIvN+JUcQFX+IYJSafOH-=M45fZ0$EhkzTVUfLx8B#toFkFue z3Dp(D0pX#3JyQ!tA|OWVgFtw!dNiq>lBc#i(El-lij;8n)UZ*nAK&NBVH-Sje4ks} z1g(2l8(N7OHFGE2HLQGAka3K95Of=P@}AcGzR~8H2bGOS_Ym$|&YBjvwiiF&nY=6% z9v1#angw_FyJk_e{~uUbbbc0(oCAw;ngx9c7TL$GGg=U$t`-)(hQ-)43+uhESP-Hv zi^TaEEh=E46}$YTQ1~Xf&KYccc;hjLqtYC za8L?l9Vu|%R&xRPxfJ*gQ{Z{1cb?1Q92RGz@ab+GkeD@z;${?NP5b=N{+J$+8(<>{ zeiu@Jf9)mgL69&rlQj}KBsH>vS!5b=45q22V-paFyfIwX84sZ<7XpV54(iyrbtZxa ztTRDI!3pcI&S|aYQV@35`IOeV81>HIu=q8LU$OWli;GZrJ8dp>L)fBe;kRhFUYG>H z%4Mt~KdD(kIT_8-N7)!0oO^l{bURoXNF@onTT!!| zcO(l0ou`Xrn+-b8ISD!;OTL|njG#*)_ax|cA=+CRw6pz^_G|{7Gnj&ob`POs=zyd~ zPb4+EB&pFiNsUfQYV=l8quWAF!MaW1G7y30w2uv&<+Rrs-rJv2Ppwk;IL|V|>>< zDfciTV!>&~{J!YH9Q#uWObs-KOP!b+Y#KY95#{t#MA0O{--fnHYBW+(qqUM6&Bih4 zMgrI#0Jhd9sQdsGtz;ynjB_BxS^zZTaf5_C9=`{H20oTSD#`f$6Kd8i2a^THZ%Xs* z`1PEV@hfD>_hTYIK>0j6#Ttwm?8Jy?TxZ)a+xwrSnN18l<>%p%F0xPgrQB|upS6VQ z!mt{0hmbIKa#Dn|J2@#23gJ*9JlKfrhY_QCmH&Fi`FOXMzy8#urQ?zY1toA{ZfHq= z?)8A#-IDPLu&;6CpMhc>c_gJnQt^neY;95zxLo%WfV<(?9BWuMo>Yzn4Fv8n5)3D- zBdMG@&^!vU=1q8yZ|!|DtTf3di@6ryALvzh*bfu@ojSySWf}RdrZF(YlvrJcji`$1 z+zAHPtM+%r=jbd6vi9=dNCc7`=S4bRCxsLeydmYsiKmos0uV^QdY!JvF1>Vi{dQbqbm@ zUa~fpm_7rXnup=#sk`0lVNRpqQ|lP{44;@+@Y0+P@XBL!AubnmY&@3F0u7k#OdJ#k ztRt4s8EBpaVHeAvBbGb=g?i^dQTV7n8=!^_T37MaZfzu-gXXX!aV{#+vw#t~Y~Xk= zW;5k^62K6Lu}`izwwK?Nh10GmuSi;XnpIsdiP!eFe=^M7^CHD^vRAf*{*hgL9x0hcaEa+V(dN{dUCjrnoXju6@0xEWX>p|z?OpG=bxz-RfWZ;m17moZQue@>+?>APZ0YE# za-xzD+CHqj?W8GPbo8M6+FnKtY3jpDX(G@*tOO9CeOMVqkcqQchK$H3W|7YTeeCe) z^8s8hm8!GTl8a-OVM0yBf?3dh>~Me{JACTSESs}EqmQ02r?~{)A#QlfDxaFOIF?$p z?!as_M#aZl_)NWU7_JT{TIzf)nYtf4e3z#7i9(|1B$>wa6>um&6jga2&81i_M@U@h z9e$NRxf&-?uYpVAIEA!N>hpc-osS4nPZ+w_ki|jD?v2I<35D#w$g@~f!{S=7(08$< zu4b$2*wj+d2#Pf}H1dCk=E_qv3R19+sT91z#ieO&)vrp^MlZAPz}5TqTB~{kCfCxk zI}hx&%$5U6%S~(ktZ5q#)^!J(4?$zzgb%i`KC&x^=#>>hyS2`|WXhX6;gYplt5-ty zsiWpTc*pSQjUwQY^Crw&s|2FiS#oD$G);+SESq64V8py+=9@d=aWHt!F}QPhv~3YE z7(62e*~tUT88IcOiikZ<~ zEq%U1Dozbqb5_JabgS4~iQ9Xn&;#7uG8IbQPM}YLD{uR0;|{idmT$e2t)HW{3#CfK z13w!-Tr&AHJMF4AeD&zd6$(Hhq`@eeJK^nNtyRNFz>ekH!}J*gq>HzQaVouwf_yF&+>#So2}Z(@dXyRL4d)g|NISlf6S! z{!z5(hw9b3qDjq~hNKy&nDviqnmC4*!=D}u1(qFjX^u&l=yxAs$;Sw{Vja&u6pZ)~j9B1(^5!u3 z?-p1J$XqY!p2$n~X3k$geCEP^|C4TQtP`AEd#A+AVu;u*ZqPWShaTi-xSg9^;?VFX{)u1)v00 z=}SH0J}g6*ySP`EAv_F_VMA-=Q$~AvDH4G%|0PB^c>*VO@KWCL93a%djuvj(fSt|8 zhUpr$k<7dsxR831nk$bNyQ(|VwZZokC}PbhBgE1|PI;QmEfpp4Sov79>oervYhdv- zlvxiJfMi``=yK?XZ*|}SXO5R=N&KK?GnmCI!2*yRaYjdm`12&bG`y6-O`MswoL?Du znt6Al9o}m88rUj6bd2FgJzgNI{&`kOc#_r2BQRPo>6;NIfyj)wfz4p$^dYNeep4B^ zWc4CgVFF$r%qXmzfR|%1#>=owy6gn3E<<>LXQt9*snuRymZ%{AlE~xaWva9ST6;PH zI}X_i_!TSdK+rKH*3~Sm5o!nuLCbA8LeXucW%XLW{pI^P;dbC{ajaj8>88A!nmY{R z!6nUP1I$K=<7|DqoLsA%DM>U$UbWh^f<}gGksGZx1f@1Z>uBTpsZDdOHVNHS0Hw8I z$T2X`meNLn7$`G*pber&+DH;<^BT0lfLGAO^1lZB>uAmdDSu7;aJ;vo~fXN^KGj36>dGO$}E4yPJY;C(<7B#Cc=XnQv!!R~OuKSrcI z?-^t~4{xp|6Nv)`@duK|jiK5FS32u;$>KP-9J5QWwsI6S_z)braY3J0;M$y%cyh)< zAQogJTEpfvh`$Ih?t-s5)`ef{GJg4sySt2UV?z5BG;sI?2br98y9JE|ElVi|n_gvvUsA_&ziy}u&S8kY}HCL?q0 z+M=JtFI_9`a?0yjGgR&U2A;jkh2XKn>j(#K0|)z+Mj)Hy3s`4y4~4P`>3=R%Ae#}Y zv=kyFt+chbx3#|_Z30+5gQl^IP39a|Y@_4+RY;*@GQu|h&!q@PDU>4gW~Asvlcj}q zxjWrtF=;Vc#IH(#jh3F}DQ`>bTfLezN^Uggg+{bxjSJ9iKO zqK5}Y-$Xa|KTnUi!Fq1Qjj|J>*6Kk120`>_K|k&jv{nbP8$10cL`_^~uMA>hgh0|m zx*RqO`(~OLw)R$`w#R%z8f*m}2Qf4f)Lz+?_Km;AGV)#S%2Qp2jfjg3hx7`46QV-0 zRYV>qt5VAo+oInzRVrQ@)l&T8FY2vRip?m>eZ~}!diW@eA>$sNdz_=LZP3qLPO_YDO&Eu9rHCP zucIfi0F|N3OZF3^fO9e;j5yKmb&AT=Yol>dL54cC8W8*nuZP0-iV;mHktRqM4hnHPJ*yV^f zkRv)Lqwd#r>sYAiXi7!bG>Q^`n`Pv?Ty&|+u#wS4(mpGs2k3W*3TZ}qX*zKd%|L4g zB|ShLNk~yNK-aZ$ZVL)2IcJegyba69cR4xLW!OkL$=Q$UqKUb^Jd;Eq@p@k3QIvQ) zv~q{H79X*a-Qo4T{6)Xr4Ot&l45|1lAaeivu;|U+7wPSW?a_rvZhjjR^u29N(DU&l zF_q;D(WpA3&c2pl=tw@q#%5aIJ)w__XZ)r>EmMLqPZwZQsvcmINda~bd6P*2cAodt zQL>DE`-Ah(2CyME>Ez~Eeo_J$&E}ShqBK^(X*_L+=E@XUhGR*`#>djepaI6;#6e?; zb&RFM@Pyf<&fP$}b5|C-u-KW!PAqn0u>%S}xV{B6`!!Geo~!);EuoQ$ZXXsA*`Do* zGsFO3P{%i8sq-d8-5VXrqm=xfL9{shy!^6lfFP=fObtIVvnet6LA#+SKIoIg#0dB| z_uuXvZYVK=0)a8GRSVjCb*pF`N$lG*64bna#CVd}k0fX*T*x!{N=t{IH?J{2C z?^tg}r0?aB`gVgffk^x3ke2TTX(Ew+KqPvzo_K}|@TaPKUa+>J$c?Gf6I0Os+aRe~8B`x7~7fQ>l$038GQeb$WY6>YIg`VJ0z3pWf z05q_zku_19?a!n8CG1op&mppRrv<0`yG8ysk&h*^ccw+A^Sed<4v;ej<#f5Iuc0P( z$jvVGGZf9$`t}=O$jnujN7cKV{;=r0N5`GDDh#@~{{Vk)Wg3_vn<{i-MTD~HbTn7? z08M679UIT4GeHAUwG9r+rmQ1=`MmC=&Qn3V^Ar{*vp9*xi7ZZFaXgFTQ23NO3%J>o zY6zV?%1r{H7M+1wI^vjGx2+{X)&a>-nox_*Dj=~PNj%&;Iw$mD_O>7A_P=#5*0g$R za+L40!P_SKIk+O+-aBLwd9ly25MWc&XqS9aa7DQF_-IzziF%(0r44=3_1r?&*+9(9 zEjyFM`8^}S5GWwA3rJuSf{}xZvhs~M+Q8aX9dPk(Wb&A%N=~bqdb4gd8J9;FfJQz} zb|;a4HbCT}0wQ}zr05cK85)im*X8PqQ7y&4W~qJz!N6ABoj@Ls)n|yMTupn~T>Tq@ zL&H5mH}o@nIITZ7B6=>7cO882-cTm}*5E9aQdDU-_X+B)l3%9Mhw>TO7H;SYSd;$V z8!>uwA9+af^Qbw#dg)Pu**y|`@yl~XEmSu9WJhqd;CFSzMb`907|vEmUf+FP#2 z$v*yMU!6qP0xTa4*9i40mg-LjgZd1ya=~yl!NFiZ&<*{mU|5Z=^YI^jJr`dGUiDn; zMeEYV#X$94{JX%g#>Lkcbrrezh8$qlkFs_wBg&88g&DPZCqHWX`yQGqr-KToKOIxk zU-u7Bw$VEWfd&o-;-Kk|bxeQ9uViip;dv7tTpNSt!Wn+^uKBYjKp(ZVkdC&8Ireaj zJsfKfbM4_cdpMql=D;v|pm!iox3uB8$>+FBc)hMMIZF-4HRe=nktuobj;_J^SSW-% z$+AA#9!{}`Q|;k2dpO-5&aj7bc(6hq3@cEu?33n)XWr(J26HETG#P=H+1vjSkVB^p z_@gJ>&{yyLY=Aj|)BKO~Fs;ZYc8d~E5ZEX9X6IpenUs6u;gCE`Sy{==#xE>h{N5HV z*z>f%Bz9;Xcw!pZEnz+IVR_)mBaXqn>CxB%t1ia%(FQo7CWiyAa*GQ>9fNDfGknsI zsP-@>Zv;tDz5xftBwQs!8hy%{OUw8Qr{Th4~~I~r^MWGd0^o5JlU#rw{{A5r5Qy$CSUw;!FmETVp`qD+YgvTdQ|D1`9i) z(#jcKEif3|AqGSdgL@r=g=8=_i!&1pemMgS{yUi(Tr{J#dc<(6!J>|6MiDR=d@`9D z5Je1rMhs}MhzvT^xO{bMy#5fq+I!aAiGSUY*9qh7klgH$<#k^+?WEly#IIdB*p z8(AlR!yYR3@Xf^KzlY0fM}PGo{MvIi1CZU^3Ae;qCQa3wKtM)hCn?#@Se}Jj<~QeI zs^0~DjqnU=^#I>Y^u8v(=b@s1@Jez$=vhTp9?X!x;? z;Wv4Zc_ugfC=s3yY@)+T)fT4gozYZng2+>*tzaK#C^2L`CNXS$*9}?NXo@9_NKE5( z6Nw2P0xXSZqp@y)5fADbXc?X%xE+;fUn{m8EK?#nk#%fzZqM*1-W>p~JnNjG8S%>xa8f2c&S)T?5R*c>?zLm(fGe&!dSdVa5S-a(X75<4V973z#WJ}Td=E>p z=q*?*<=r=F!1zBhqwjLwRhMC7-n$z^qX)-$U)XmU+RJZ{2vqx{Wn^s7`G~MM@b1}~ zH_pPmaW;m5r!Vhf>vlm0$!-V+cTGa|nT~=GAp|c9e?0>bT0%Y3Q5sf$M@sykv8^MR z&BE@X>Vb#1G$X%5yml*|LhMg65G?g)oJ3z=U_=5qAQGPGU}!z^b*YxISUUrYwV^9u zp*C~{(tH#&6zy8^*MEWrq8vv2Rwf!5^~2=wY=KE>u&N|)VKUm z;PrHuyiz!MULql0&wxaMgow(Em7gwFetI?!WoZLyk)Rd{>bX4BD$3Ek{3-d%pXUKn zdEa?b$HqPR5@^7aFXAARvkp)0Gsr9|_Ts=Z0TXq%A=zSI7qU&J? z*DCcIU@9LwrF3jusW(6a?EZs;lwuu9VJY%iu~KgWfQtimQ?|l2%3B0Nh<6F}Hi2Nh zE`iyjg|pKuT+8vfnZ31^!{8IR2E-zO8}j4euEz!G+7675 ztuPdlSLo$lmaXv(83MyGh*PiZgRQ{D_7h8pDvMByBjg)0ggR;n30#CewS;Iu5$f#- z`3BCv_EH4=)hV>kfL3WDEHbQ)jl1_t(13ftkOVkk9qv7Nkm(P?F2l;b{ZQ}h%VH@O zeNcG!E*6q7yn9oLZ0wo__4{UH} zrRY>dvFdxZL#w`CVra-oIe$nHrNxWV8z+GuEp0`QPFxymVl4Qo2jf-u3_ubSdZj4S zm$+GdEhN~YR}iKmp{Fx%AF8?n&Qruw@LTkwUCu zNeeYbT{`gXjbsQF#2?(x-7#ET8eq?`J!Q{$AK%_YtVotvjAr%&tEIteX5X1h#d4sw zSo^aHTjjCBO9NsVG#Lh_@<1J{!OH1ra#`Tu4iIBnW3P?Mr5ZApOAIQ*fw{oNd^t;q zBSeITIzql7Lnv{9CnRtYTHX@kcoU&^N60tOiq>)9uTG(@0JO>g!Xg{!*myQ*1r1nx zMM;1Y){zai8f4Z2VV4b_W3nHHx*z^40V+(@gVL3i)0I_4%n*|+XR5I==H<8B5G8N5 zjr}G?*A%lF0Hen(PoGc1Y=61m(z+b!;G%gG=ENHT5l%fO=EpY{bbJd{opj=aOsd(h zaO{WY1i3L(@D+|Rz{rk!M(FN@#sdII2B15qFQG90=JcJYt4p+fSlQ6=vftQP8#PFj z{l*4CfL8O34NG36$YeoB?Kd_8$1KByn*YYef(|N;_5~dPUC_ZNZx?j%8yl$}_l=Ec z*TLC#EJhaTQgJ~?YxN_}vf1xtEa-6G%dj>UmxU%j2iPj( z%L=mA+Gs+uPIJ#VjVXpVLc+7a5}S8KhLpzzTdtGWxsXOi2i{+KVy#h^xBqJ`{W7U; zu)vWbD$&*@QKn5F!vz;1>j8#KeGgW6Jus>Z>BcK8D-l(J^VSC_vcIi1yqWn8VCxGl zTY?;(?M0~+Z+Ld}3I~NJ?sgtl(=@zSP1CSme6U0zHXa$YRN0DBLOdNCpPa@*Jm^@K zlsI7>lhd~)>{OJUQ&9LxsiNL^8hILag!M>yI@>_to1W6fIEiMUHKOKsQP}ElI#PIw zS`_$5JDTmP1_r_Rq*pjdZ+gt?3bSd6G4ZvKCFH4hD3?fDE?EopY{834{O=$0`WCEa zXm>8CfHa#q!D1R36J}KF(k$IWnnw?8)C4}*4u6zg390NKwJ_a@i z4ahSQ2Tek(V+>3kWM+bJdV#hz>V7Ot0#vju8ZhBM)3GB?47*vmXkMSgpYGTmHKbx} zYKD$c>exVK9%v$-IIwLy1Vo^Jq+5b``~dUoGgw1xfj#`G%mJ9@z=;KUBdb5tG11YV z+vo77IwYGuy|sn(2||qB3-DIc$zJ6xy)q1|R!wEXXEk@vU2AKYYpXQM>R~Ua$!~B? zLBA#zv6Hi=id`Vg=N;|iL)k~?hL-mZ5`H_)#UdoYYmaMz8E|JGbA(XD#WOYHaU*Tcn7(oRn+n0mnASX{UH2MlJUVR)63enu-XhaN!p zd=p_40NSg!eR@`pAmW0@J{GYJ8SD;;qb*P%(x6ZEwsyOc!>?z+-7^WY2SGfCQ4r*+ zO%Qlb;Db;oN^M15(IIvial*z-{3bRY2;5rzJ{N2*ke^tKEM}3#o@B9S2IqOYVK=d-m z5cl>oKD)5>Ahbru*hdSwyRsi#r-R7H0xCX)=B7``Th!l2&=Cxw=5uF%?_%(t@x%%z(bL+aRrse?l;NgZThBTcEp z3#xp0cGrFp^Y$TWAbV+SXbqtF^~s@W5IY+hS`DF? z%!qtHWw>vavB))&^4o|bP(_#RF$e7)*KoPj&^az4u z`;XprafDCE}#O?=teEWbj+SDH6bt8A(B$i|ykp zN0ZcV(5w-18BPqfO-9His98URj@l8D03{>j(trr`9?V7LT`)o@n??vG^<-clV%Bp0it&4Y9{Mv3xZ;tmW(t|o#RfdQ#9>F|6YGPLGG0K})Q zHXNTP02@S($3gMQI^q*+!fQZ3y>hw=_0B61Xe!tXVXWXY zUJSH_@j?7kh<_6~Vl+})=RS-^mmc=wG)BFH`wR`hkhRXECA{;TpmJME48J*;EQ3!a z-}F;rL2Bz?%61xH3}s6#m9IsWzB(O!aJa2D?C`UI4I*daAcwOKhgS!gTS4DB{4FM= zTTt)38HIQA*#Hd_-Z|;Yxu`@N42tdmH1^Z)@8FZQf0i8|L7LqhcGTYXd4wYneP7bP zrXdG97|(ZyYq0avaLpEu;^g5jAlzCjOLTgVWGCZFNzVj5iS24_v_Hu#Pp+`<1K7`p z`WFJR0LzNSdshAvmrcFKQ`E|BK&Ra<0wRoWs|_3f*T4pmU*RC*vkv1QH^@8y`p)?8 z(D?VG-gzI3ds)n9aSw~TQFw=33iRNR%hHw0)0N+%Lht+us9kwy9^nX-@(vm2t$sxs z&UuGY=HaeP!}Wz*@VX{-&{r)|S5;S~;p`jzhN@#^`D^B@(;!?iJU7D7M0^=5^BxPV zdrcaa`zeoh7+Q@($=aE|;}5V$d-e1U0+f2XBPf&5UWZIUG3+`s%0 zu|)2!VsZiyxqAeFHw-vY%ts}91<26}R%N$HcsERLKjb1I%{zI}G<>=UY3C6=XnQZo zW#2@6xVL@H@;_jb8*$;aQ3^m3v>Hd8za5Ae)WR{{&(W0Yw=auEx8v!ol&w?W{sY~C zeOo&CSOLGr@oEqSb@vU9`zZOFG(=r8x(OmOqx62QeMMAAT36o>5{AJ+qK356Z<4~; z3kbl#(EzT?NB2xDpB#Y)NPsa&0yGwdEc^MyqjB=?Af`Ks~_qw(khpn(uY5uO*rCtuX zjIsVOmEkb{Us>k?1zFW6&%Xd5Oy7SOv_O5nn+dn(U!IY>hm=19Ma$(M zz~hZJ@^EP^yA^_MflST===hOci!8!x7U2Gto^#T(u`^;F0qV!7oIu9jfPlVhK;BarCI`1d%20g;QNl} z`z}tR7PNX`yDXsu7}G7d`{daH>pcJ)%EfDAkHGw>o9u>UJUc$eh#$oOW1b~l{w_Fo z>hN>a?oK#pzYp5DVJvN8i77{Yfac0qU`bo+*!Wmk2pZt<5e~97>#%i)Y&`%%clKwo zG>d*L`m$JxMIRL235zV5k8y~WL%Sh_EJ1h#v$aICAq`XwN#p1qCg2B7?Y;3&EdN$? z8*&DWc0nsEqEd=iU>UKOBczGXpjv*8o}r*NP<}85CpP7Ea4RdpM!j5S@J><=-7A=tlUqM4#Gh}z&e6pGN?}K+yZ6iBoyA) zgV7tZU2=u$6T~);wu1Pa`-ywYsIdHL3w@)I7g| ztGkqjofx_0oroi2tzogYLqjV6Y|H+5CddO02f_x76hex=1zENBrJVQr`wV_2A^ZOXdb>cwIe#Qzv#u5hi&7@;21@uCiEQ3Im6Jps`f!YRD*&Xm%^}={5{V0(0WBvlrKA zF`z;-ZNsbT*V-_>Vs9AXW$!1iorf9@D14yS(<7pNc$;UyOYY*VlSk#s7~j$HmneHe zq}(Nn|H4yPQDVNR_g%7@3-*zDej8@_?e#zA*9m@nSkapT5&0y>zBUQN3)Z6ubO1O< zH{HaDCh-zTHxjmB#G$YLI{z%jR1IV`GpyJ(|dgqyo=zy?-jw9MDRTk zJa6mP>RTdsUm=7DzUK&@x3vgvK!PXL@P7mZ1^x)YgN}4^(dtld&oZh;liIU2%;#+F zsP&3-)a--o3LZsPxXLB94MB}v$(Kx`!%~tOseT7l$D>cxJE&OL+80SZL_y25#!bWX zx5nb~y4;5qnyO=J89kg*;(amt&@;jgMIj@4#51~rj9#f>R0boA-~kR&17=F4KdPm; zAIs3?UV>JaAv`qb)(`FFrAY*)8!JXQso*492CdOgyy*~t_b6VjLjc}G|2q0|BgX#S zGid#95_4H%;yrO6<e@J(+-B$#~P%sV32-H1?v0NkK08Wx6?r^3w*I1WLIsHv9EpH0fG3$ zTJ_rb2%wK_2=u1bw#APC&ag%w0wwA&7bj#FJXBFx6JVuyb(RrPFv|7BF#2Nk8MYEu zV|}9vl~!%$ivttXY$f^El7rmB~T;dj+C*b zqPZy6WTMsVE@+P0t)r5k>D(2q7-%Ch?Ujh$iHEZcT`otnY#9prjc36P*xuU%!{{f?X7bnuPo2w>XNT~ugnX} z@@66T>>XsQrBEYR8YGE-@+4w$!AQp90&J^*>d#1Z9wQ_pLV$;)H~73d3X%%x=RgXR z`7cm`gJkqrHk5;^XoiC}h5pK-c9U}x+Bn{rW$1DaQkNk-9pta&5<|3?zeP02e3X~D ztBJ)Cl3yr52-loC6$ulIwgf+#)bIDpKx`Q#SNO^GJ54v2fRiCpbUF$E-mx|J78c-I z8$XGGt$=Yc>=k{x5JIFT5&(M(Z`-Ya<4EuVg1=}9zAJ*Ch~RIwX|4WP1bt;C?mypY*!{+XLKiSi(MGK0JX)x7F}CX&X1Yo>YW%B9Lh1)K0-RDZUR# zk%y=VcM7%uiK3kX+L2V4$u8ao6Wis}5U5Hp-+DS*U(2_ifmV!ww=(UOH&Mk0*I0%wHv-gU z2oD<+uFl>d8pJqLq;YZLvxnQ`8I!DyiK$nC8Jj{F8-`AzI7;c5XvtMs;W9ea?NB5hqY1q}JsQD|Pi@V0)xcj&>D^{3Q z{CN4e6XRteUnp3pPj+3>HBIJSY*=UFEJHKN@LtMGyQWA(yf{5eF@%Z6GGwzca9P)s zTKR@y*2=9CmlJR1mgwbO6I!X3kbU>FhR_ut6ur+#EB0-6>wS2%kye{{G^jcem)~`e z^w?0^!nElhwob1*qp>|9geUy*OCw!V((U4To8QDY5>RreT}h=rpi+Lbg27@vFAH$r z2jD0Peigux7(WI=5}lPrsFvc7ScWc_7}aG653(8Ys&zuCy}Xcw!0c)UR`s z@^yY~*9)$WK8K8$_ZIezJ_~1`hO z_0mP2PcAnsi2(M}%FrbgfNtnQfW)vx0^CSnb78TBW?;BAjA|7iD!vO~uMK|>IdHwD z0T*kuXga@%&G^121T4i`Z)jC~8>L>1#^~mC><<{dhu7&1^#DCRslxEVst&6Lj_Ri7 zT)-Pp$mE9(rP?F|AUbXb3|^}5?%)n$d&h3_wcx%*t0s|+rqh7?Nw?@qEGjbs^ ze`%q8x9fgVzVRBr4SQKkVqq1Yv2K#$nF&SBpGYEBG6>c~K4XHcf3Zj6Al*GaU00Y3 zC_}$+5B;~0AqdQDkp7->U;uPH8b$*=1a!adw&uM(~sQzeYniBRE8W;6shN6SGxNouXTETxSH zunb+!y6Q57XFOy?$mrc(UWVu}?%xYcl$F+#g9OP$k);0emZT)({R6Z@j8I^kc=CJq z8L@i6i_1`Z=PavH4^Wew)?70}tZ;sW;Q1wFYus~`I!M>DZ!9w@1RjTSNNS3WSTU;X z@IYwRM#Gu8Rnxp@o=ELltLksO0L}t#C*zn_%c{xUcY3d=A<>4iS zSJ9g($ufpt=cpr`CLa8vLweOy1D+(E1ia?)m8bHOt`13G?Z~~rn4XyuvUP-O2@gZ? zW1Gly$N=`S!>7TFc1;p=hC~CDNd?QqT$;7AV?lK>U!KftpgaTCVUUv%K2e+2Duo)v zeKw8bF6h!YNw9doKMxEf;6ZS&B(y1FC638>MV6t4mtX?vt^-5PykO29rt`&u8Q??ftEnC5RzzmuY+}3a(7_3NR{CA8B088pE$q zgoRAGA)U3yIQ|=p99U9bcIZQ-&iapTolhAsu3*oev)Qoysd0yV_vpvo9GH&?Aea?toau{0Ez zG{`nJ4^1VMy#GGc;*-wSGFQd9G@6Whl4!!^7z9XDO{R^St`>MI^%zGQE19Qiu(Hdy zdTBt8NjVDc3Xg$InYnZ<4QKYN$h@(vq8nKsKwmwQqF_;^e~6~6O+#p7EqM7fW=QMD zkBHo22TQD>uX*ibG)Fgas9?XlRJ|rfl?z$O=vI!O5aK($P~pB~W>-GhbLSfIa{wYz zh66hlDZ}Wlcqq%z26s$~L+DS0oH^ zyG$rJ5qh{?nG?rm$re%>0V;;1e14dXsB<4Ah2RVH zoOK^Uc936g>ne?y>}6`tA+2Rin!@KVGMi0H@t4+`s(s046K>%s5)R~+$vR+*NWhlK z+TkqrXBk`8a$!g;O`0Pq`+)H4z`D#O5xB=nVyGQuYB9bYnG8X+)i`Y7>K{IhqA|>3 zu{O*IfyExLkhALaC(q6To>ZZTr*HonJO_|xpOA^Ji!mxG0woKV@`i@Uws;r9#ve^K z3A4baFKm&Z2tw0xnCZ043@{fl*}R)x z^8mi4V?AEaKpaBA{vjvTd26B#P<+huJG48F`ex>?E%wn^Hs&Am1m&T?*`=j=2{Q8( zybEHVm~Hqi!Qr3+V#9FIbjvz22j6rIFLthFVImx&ttlZQgBHJW8@)3!a_+?Ux5Su2 zNsUK%FjyF`RE}3!nGQTM>Oe1~wbh2D?X;4N#6i-s4r!V5Cv|QI7MG@@R`%`IScSN%#x}K*#3MbLAgAFNhGQjX!6^;HJc;3(%Y6KR{qxL@8H3z*6dAjN3VvGMnq zHU~|qU*&tK zmg4_?x%$L#&)&z23crnRtUZ-}-1Qc(@-t-u>%N+YZ}kyzz3tY?6A$Xr{al1W+}HV(6IAS@ZzMzC!7b7_y&9)@^2 zk6Mw!*18{I+dy=^{VLBQ;1yl5f<*y869Bt54V_Zim9EFkp=0AS$9ABDXxSDA#SiO< z@K((nKLPE|BUv25;&2v+u{e~)AuML2@bk*{zzxRVAzj%Km8c3(LwG-jq;{eWiNQ7) zRs6QEAp@E!4W3*b)V$@tla=~dV5P?8F{qZ}qgh72OXIRul!UgGz`p1oQEfwwgJ|eD zw+*|9qHRc(V$w1=wwLGNg!bIo3Unf>DS=L4Z+slf$alF!p)SKl(sL}^%f}NI^mYL~ zLj!UT)q`14xtUBk^@(FgAoL_3GdA=iem+9??}r$=_UPnG0kd@@I(Z_hA|Ye3NA$^t zv6NHv?Fw-!KLZIyo{o)2-X5R<&32ciaKbtwZw*D>nV{Wy28+{KoW|l*7N@W{nZ-#c zeB|v3+z@$tr7L@*5}gN7LwFx~ZAb*}r!ozRIrp|8^2mTLNP{QQp~wRm7C!c;(Dt!X z{}Na!M_+_$DZYSZCwp~ghNVHf?5pS|wER_^*--QsBvw_HX)3Nb*+aENb z&-Y~?oUo2~y8=`vb# zx(yihh8D+4rY{$ZhN*yl$FGR=Na48fpjwV3_fd-CBR8@hA%-u2FlF68Hq&P5!TX1G~!0p4x={%j9lCrnHx+2KwFh#KD zsh`uKZRJWv2v!a{HokH=3p8NfGjY&ZV;w7phd^~w=YuHy%HeEv7&iHpW_G%6>0e&v zem`W-0d(bIiPjRUS^ha6&Cwsx%;kqCRlEG~J+x}|06bO-L!`F6ut2rnFuefeLc+RG z0!DuUb*;bj4XVmxlp%hEW$41n#|bYON0Xl6>bzo=Ic z=~zg59OP;%#`8c-iScg|jh|&1`7S4hx(pjro@y^YM_7n)O-2kSr4z$rrKHk2QNQ(9 z5w}=$B-wRVvR6PjCE3g56TiqZ@?B0cbs08NG6oxt?d6vU3(0=hm1Hhzy`YXrN>FD$ zF^)x2LS7G|e43`R9K$VE(1F(tk{u^E`jg+|BzhI1WI`l8Ri)$We;#|9!NT?LO_C~l z6XK*y`vwgazs@prIn%1k5Iz%o{~;{2yczTimDA;>1EcX;82NVc!oGJIc&l8IX^I+Dy- z$-V^Plw@C!Py89n$agu()MeO6$wK^nPFP5GdsmXB;*WwlA~`{w3B^1XSqXXv2=T;Em+t}&Qte5)2P5Dfs%m=b_h`k8K zD?nI-=tWvAY6|W@{wpYOOV}n!TSV} z63ymQv;OFas5hA=3$2I<*(OllYMgzLiEFFyTZi|8OeU%94)6Ybn4i`eL(6lG9KG55 zqKA&}b8FiGE6aTS?!dh=&-}L5YK3piP#ic#Pf>UgxJXH!i^za@!LuM!M~Tk{D!InJ z4 zzs$>S0MXi|_VS7Vu%!OvY5utul?vO18_}?#(;Cno0dyTU{0SH@074TVCA4qe?~mJf zq!ac-s*B)g-LcWV1#BOzMEbF~K;1{ZXpb#9vu3~fqLc7SgBa;Dedc2jA5+JLcWORpzDTY5=K z>GdRV*1(Dsq|Z*+vk?DME-JJW9a=m8r7 zGe(gr+^*IOgyN-3mryTTj%`4fAMB0JAyg|~gJtBqFk|8VcC0SLMpTVwOWetb?^|&sy*0l|lTjo6YcG2E6IlrFITsV5Tuzq^MEbW}x+OxL^9IRKON37GOI87C z(b6%8r}Fe@9xgmHPvpG|=V8)Q$i*5tN;My#8EIi{Z$vvtV^mA=2$rGC4N`R(!siF+ z#?a`&G2Rt+I%+R>kO+e3L(2$X;q*~RNQ;BW$$f>>(bvGl8%hiGJ1CRG^JV2uQq@5E zh(USGV1C|ni3o#t?lH8PyU$HtTQ z=b!;npWz@SS%;VKp~v+=*!@}rKJ*wKD*VDCl={OM8vsOJKw&?~h^Gee`_YwA6bfXU z00r4>wc)1*TYwEBy>O6htV6a#2bm3vW$SGb`r{CNqn>PIoNNOC1=(!1VcC|mtd_+= zvat@?4jW{~7R$E0MHq}jv~fMzDo(al00r4>wPD#-x2#sfL9($9*^U@wHYt{E4U5o$ zLo~jgY@0gSVn9JQTWwgjk(SjuI7l|uA=@MnpVYZI%Fc-_Ca~BHgBB*m!Yjp$4GBLxCA1Y$NJ6CB&iTM-vQwyqawJ)9U~6E7RwndanU zfQE9CD22xAVO`H9jEYg05B02KK*=8Ig8q{eR4T z2Y4LC8MY)FkSQ*5B_Xja%V!_4!1U$7!A3+t9-I zfY4z>v+2F}-n;1#2m${0eW&c~-k$Ex_VfS0pT|45Ghc5rJ6n``_jE7NQskM%Q|r&b29bTy$Ywl;NA|)udqFVABgYtoTTOGXY3?&vI|C)hBfC&E zQNLes;P(K2lzU`^Jn|!ed)s@DkhbqldE`OR%6h~~(lR3O$W?%oM|Lu#DtqK1K*}SM zTpoFtOv?33d1OcG3FRIkIv!WkY26-q9M~Z87#i7(=kUlrqvBtJV2($gFbFT8DeMZ6 zv5c~F`Mm;^Nv5_;O4Mp1X}zv<%l_|N0A7jAFiiOGezwBlZWE?{8985 zVk4-UodARIqtJuiWV05-%d&Sr^cHqJ5?9ZtUJX6Zj}7>uf*sfDndnSZ@ayAdvnc{H z%aIHviAf7o5Rtf_qo=!A@RpYp!63iUw?9CQaaO=^NfP7QQ{B4u989VW#$tGVf-h)% zG0|QnelZ+EQXN!uO_qH7M;C=dfQ3m<<|`Va10cds^4OOw;Z(KtPiDhG1EgBe$f-Ps zQ-G%Sz6 zX@Bs+H;fM_X7O)47KldwWAVcqp&E+WiPIFhWZ9x`rz_M%b6j*7DLEt(!>#)UeA`(4 zkZ=?vq}OPYT(4Pvf!9ist|$s{oorN;#;U}lL9uiY*}`>d>v!GPKm)?9DD&Y5&*8dd zM#aZ~uyx&j{3D`A;oQ0I>wqd8i;gw;fQb}coxd2#%~H8bjDKX zeFn!=q_^|o2}qkyC)l+4v;}XXo!$26gi|nRrZP_y3Dhu|V-2hGm;vJ-HF{-&GOSgc zil>sb!=?$OPg`^v`wKOwK^)#kz^Adf447dsp}{z6khWe)+=`+-XBoh>)uQFR+O$l- z0xidbfu2^Ei4m4^YEj-&Shm+9!5LnHH8Q46Mgpc2K(q9B8W5qbHVE}$^BOj9?fJ4{ z^EFo3xn-s10TX&I=KYSr+qVo@VbkRshHT!{$~c+~8fd&`oxe>k`k9SRHOzFM#&0^uIJYZ}E9=kGM)**`a z@V-ur?TLXe`Zj&m2yr$sbMK~X5;+Sq2dB7?0QW~2u`eKE8N4HUoCzl zMGQs~0}S3u)Z5IcH`6q;Of%awb4;_PX|^)W)~5NsX|^%Vwx-$6G~2T=w(5WnWhl4x z#Lc+ikEkLH2BHF)Kcc!y7MOdTm4H{x0+;m1dwC&f>K%Tt+)c^Ct)CCKS{81an5Tr_ zsDeCBfz`7#z71YSHLrn}3vqEeZW!fRBMZZuwm0K5w4Lu1xoQ56Ug29a3pE8$@00+A z2S@>BUzyB8nb$SVjwPVXTbgTUp_2C=y;SRDVaygG_v844#1u*%WnpGy%)yVQoyDRY`PHP)20CU4gfS(OPT7*0{2&@HU@BEdBfNdZ$%jUTAmbU8f_DT zUp+b{3-4O^nJt;72#(nkubmD~f%8p7KNThO3c+p zUKYj{0eZn1qgoNzEK4J&2y70R(uFpD)CNg9bY4xXk6EArk!PY&Nbnpna|x(+bzF>N z$G>>E2nV;yo^3#`LYMN(tfa5RX+!aH9t&>BuB0^-vy)YcMA5cIR}dDw=NNiF9ut!b z4TNm@L@x!uQ^cRe;!D94g4bG(3K$1}D=N7*G4n}l6qB|T+7i@jL7&d`bm>y!;RcTI zv51sDMMM}vrus_@s8#U>9t&>B`bI-BJLwzpauI6MRn#^A@cq!%Xg-O6(GHG% z<_njFkw)S)707;y7I1U1fLjU6F~?Ci=p2uawKK0rj=tHsPQw&TX34uTR232k!9<+& zDM}#uW+#Z`?|uJ}@}Z)H8ue3AenfColn}h1it=NCr(lyR;MWa5p*WB@dD)*=-1xaZ*s2Y@=v^>21#1uCL7P1dfo~=RD253igzcHW4z%&IjAP8poZM%+3~G(u z^DKT3%7qCP=$`Mc_KGYoVP54$t}KIG#CIw9;al<0(^P*TkNd!~P@@94-Z;67Ufc_q zF){J{PFIcgo6@`Vq_^<}6CO$9k0Ff;rjc3Pn*@7j5lpBi7Z*dP4Qv=@FEsa|ZZ)Qj zQ>20rsoFflt4-)6S@f`p%a}ird5sxUAM=`gJs_2F`$8DqKYEwJrMT~*d?zKrg-|`% zRoG?}5?vGG70@Y3^wVSe)q^(3?|SzV?J+Pn_B|U*8*MoC6k74!G;Te0`{AaE$?$== z+%v=AeGrK}Sx#gXOTZ0<1O{XC*AqAx1n}xfXh5?~;6Hgn@wBfnHhQ0?(%R$@pyeQG z(Rdw~Q9ZZmbv#OflFM zrHkg)u4QZVf!FeHLIeI`S#^``jYhYkF42#CO#E`3N9ic$p9A1O89Wg3)$r6ra3Yisn8*Z3%b0_SM_D7=LJ{)P1v z>2t~GH*$^vg&buPA&BB0T=;tyI5F@5XW(PAFvglOrR45W#yY8fKHg@nhWEJKQ|H{a z!8a7l9^7$R@)i9z1sDmDW|UWak0GRqx4aC^<3Up|GRVRzH*$?){3Hw(UWV`#ydlW& zFMNXf;UIrEu&M1Z2PT-UKCMsADr2s93%J5^@rde{p40sZ*+g}b>7SxEa8-{R2^*~<_O#e_#Rq_1t-qPK|w zs^=T3H7;l@F)jJhIn4dnw&*{ks_E??pj+!QDWsb6i!l}%sT^QSK@3oyrEpP7$j<)+ zyVAAfj@<*b_3s{B3>vV=zhn{o;5iI_>X`U*5VpGqhpvn*ozHOI@hJ{&H|G+77QR47 z%wD^HtiLzo-*&x}AYT%M*tsB=8HNLH1`vq>$h?Nugr0_C1CIrca`g%)^LDm|Vs_#* zCVjNyqDI0(hs#CMjk7HA$_7`^ZP7r2$X8bwAZqD$9PA~LrR(tQ710!2{P+p5F(i&F zqvfKdJmD)rSWCX?ycbaV9~hvR7X_f(jFJKFlxjr@Eq7jJ5gP+UXmd5X;a}0I-@n%Y z8$|w%Mr!jM{>5^25G1z##d5W)V;P)xERBQn@3jVWIdpM0Cp;}xJ^>I36+hWaLp8!} z0vzXd;l2Zo-7%@~S2P4aj40QEzVA1anY)_fQwe)CVkal2R9rgqTrhm-C3)xpbw>nc z!0SP(!YMs-2)mB{BAUgbe_X=cxz+=gtMN* zYa(48<8j{6#=|%sT6q}D!#8>O1`jLo@O2)(#>0v@IA7l@x-q+W!_eG2Y>lSi+%Ue+ zN$>!E6eglSCPx(X%-6jivQpRgJhrh9O5wF#GfOX16tY-7=aEBh+)OgB0x@;%V#jInJO$<| zN@1j=f00zMXT|7s^@B8YBP_jVRSuFaF+2*T8x7z$p)yu$)iOEv# zcw{!$qs5Z-JNV70<6#h z)Kp-Z8=|<@GoN3kEzRVo;$w5GXT(MChF8`fkz*L1$*mH9!}Q}UjJesFiczCB7u2b4 zV_S9)NO8%?N^1nN4veWBknEprNRc#_E8}F`Q$QYFk> z>*`GEe+f}a5xJoRt6L@bDj*m8wgcVh=0OHZGLcl|K;?aa|E-z_!ySz@{ zp9_g+3i$xyVrSgpa@a4@GWU`~GFt*}MqE*?wj6>a9hy8u##mzVHDD=OTQfLLSab(c zP+V?@f^rtr0ycBoZIJ~v1f8H)wjwrApR$7L12D|RWJc$HUbx;^D)CfPQBhHUf;EE% z6ki67yw7ta7_Or>groa9-{4(&Y@~H{OvAZLt3iT_*_94BBK3B@p+DP04}bn0>Pd|s zZ=J&XcZ$pL(Z+x?43`Bd@p5R~ak+Cg-XXt(4|8F+Xu6K2PNE>}g{qKT4yc9ipgV=1 zuw@(^(8agWyHcX2;vln?zP!8w@@Yb;4CUD|K0k7^%VJDDu2)H zI4eWTBz_g7+$M0}5Ku&sm5J()ffitc$S^dD0iGiUu$kHob;B6g6z47mh6^fYS2_lW zu~r-6^A1ZlX*;*m^E7PpJYoM_%R145RHP1Bsc;?>v8BO=tb(m zR=$6I_WzXq@U>sTew)2J=MvfgLw=Dp4JWf3ia!TrLri!Qk7*MAXp45?0Ju*V9DZy_ z!oNVThqgfwTnu#r2A~@WCnhk~UA$cC>A{v!Tl53re(sz8oPPHzw0FF zE`viF{LaJ8aB$zl55<$Brb2A+a>rfrY(|7Kzi!T6`IT0qZaxsUz)(q!gn?$_WX`g4 z1{EcWzGF5EUD&D!+_A#gXm>B^Yz+f-4t`W%u_cB)i>+`X7NQ{*TeAzF>nqAovg0=Ej(J-`LoZr6Aa-b3u*Aa=wLxjJSAfJ@zW z%nvwFxhm|$VI{u{SMS>&Vo0_YJK6e2j#y0VQYXje#~g8ylRW-M68x0no|L#K&7jUt z(XCY6+5Pw#(OKHc2>)ClUiCkakZ^Z#xW6E-R45D2Ut)+Vl=c#TA%p*~9O|##k6lTF zg)SzcREYnELoCWM<%4CNg`1r2za<0*E7;j(*KUB5K_!h0x(88dHWvb{SgW*#XOml3 z3QyNdpN>nPZje50YhB5`!LcWqGfm_QrO96CLUK|!s%6z{iaAN3qdoc~ei&o_QJ^s0 zJ_g5`!h*I%dwbA70m7s*?Ws!We>mfsOB9vcK}Dg;8v6pZ)M4I+o4kyJcK1=)2>d;kdAmBr^=S?q`NjvgNV!o#0=*q4Vt z@vuJ*ZlUov(TE942d#T7ei-V9VWhzRm^3)Z8rgF$=Fn*fP2a0YEi;u3EQ*foaRlk~ zk`9?8nld*Gj^y}3!ML<>)j4>?2Ty;Z%rxkJ4-4qgM7({e!ok4Bg-+hrvD2$3Zqk?c z=%vtONb67#N{_pIJ(k0BDI-l;My7o-ZyYqN&Lbr|j^KY2HJB|~ESl-`Po$tiIKj;N#>s2W=u3Lae_RVUYe23W z%K zgTvzZR1bHxgNyMa6ETJF_&-Md4j-Gh!Oz&wKyuejcmG_i_;*OHLP%Xhn93n_Erz}C zufvIaFUjTm>(Q0=6xPzGdBtw<=twzr3u`_JF=AvYS@K476^;R-^SW6cyJFxnsM7K{ zA1+)T`(R2fk3+o7@;G+YV_>G*-(+;Qj)*BVle8)3yapePk52anxLL4>z+0#v<27bl zunPH%xD`VsS5LJ?ZLS^rt-HQ+&iyzbsf9?2$oEk z%1Z~50bKYfu&`t@r*&_}JPB+Nc>;};<~f}7$1(9gK;JHzzT%SUJe+r&%R?Uz=kRbg z4sN0J6fg@Hpo81pM7FbK=DAUl!47BoLD8qhH6}KRNARbJ8dgN*?*?VT zi1PDQe#hGhZZDX#Pb9#VFB0dH zEDqzhGR{lHd3Z!jf8ui@TwdAJ4#SE=32#Ar3O&lS?|+n}10sI;sipkj`zS zLkVij+jog`XBMabynWATLM#Rh6~~8###89PvC5A2=u3RjyXDi<(b}c|S4fW3WtW zB`59db>(LSe}Lf5Q+_$~UkqVM=uAav%n#i$L)~cGOMgAz@K6 z29*!JwnzgA_5X=Fetba{9tI$7+OypNeXir61SNJv@aH42r|-Vtu`G+SA47e0-&vf2 z-{B?pm&OjXX>wWIaEsIOD<{W*!Pb<#_;qe8zxcIoQQe}{QqTWzDaK7KbM5P-H)qc6 zN&WWz8tD1Y0om~C&=Jicm|Pt$1@t+C<}{ZYsajDA!n#YNTNPy)_oLbIiM`bB2Rwj% zEbpvjCk})LS^7oM*C(r%B_$=W3of@HUXH*^mlQfhd0bEZDYle(LjZu_beefT;`vAf z!O)2f4ee1A6^WhS*43$087gGRG>if~3Tt_MZ_O4CJ;ouM0PbRJxR8sFW2hk}K(#v3 z7Cj+Y^2x-q1|Y`>C(uYIkkrVDWk)10mfcuCu{_Grj~%f8(Vy=|6HUg*I%*6?@Yg0} zjiS`iqn#@fLDPcc;|=>YV(<}8`9se9I=bM@2eJkl8x8Pjwh~}`1y;9E$CA-gK+Fk+ z$p{6r5JQo~vmXts^T^$_R$@I<1#9Un);MB4M=Z{bT=mgQoHibrz+b%WV;+HvNt?{F zfAF!5B(Q9B1hUJ>drBNVt~>$0Y*>{91qc$$S+GcE*tuClT^x z0A+6Ru8e+cO}>JW9JjYcuW|tR-x3^tOx6#d%X*+X8t8+g!@;d;;K-7xw(e3MWC}(k zN=?<-&F3*Ecg}hP%qFF)H#wEm&&b)*j2#n+p&gUejetJXouuQVrM;+YIBnLX%vuyV zF+|%{qO~}jTRzw3NRHjtVLy47Z6NleSTaRKKrhK@aLKwj(I%1vmvSX`aXUz!(VoXt za(oROeRh}c5`G&nNPj}PU^2JWm+>aqfMh5*@+{aTY$iZaV325<=-|h62c6v|>_>~?OQffKn^^2)8>Gu#6IU~h1FPjxeoj!0Lxur?mV z-j=uvE8zxL4Zh^?fe-V%&343nhqx{{LcYNzP7dz&#C^9CZg}-wF7pn+MGjNr?0P6r zR^@A4G=%nwsbLnDQ)swrFy6pw)wZKpz_vS4&i5#1s9Sc!!CB;ognmB@o!!51&_5#d z2U+Os#)*UeF`+-qLTC439Q4kBhK+au&Ic`q`l$Jt2B6u`4Md(5vzBR#hI#y59R4rx z!&rvqfpL?IKW>y&Gx-1yU?mu^)PR`Apqnhk0ZFX=lH3&I;T2(4P^bN`06k~uoFPTY zJ!de~{k7zd8Lrtt2y#!0IUR5m)<0fr5LFD zTXIush3aMnb?WX0XsIi?rS9(}x3_UfC7UDd(QvQs?m~mQdr$zyru9Xt@CPJZ8s_-3 zA9wCa@+v$1N#^wXJ)otZ1eJb&kf7eEA(f!;$er!c2(RB>LW6#PqyWk$Yy6ac0SOl| zIS%Z{e|wX>%3FVuIsNtlwDgmp((g|a)G>E@j*muqRrVDGRQWS`vGT{9br4VP!uBs1 z@N;bsPQ*hL#A82pt$^uS)j`wq0i^X2X@%vEX=WxPu8H&#u=e6(F3h?9*5aH$conXl z54V0l2n1D855|v}7ZJQxAQdgIM({Cjoq@$O6WuSoBVen7OjHvdlLL4*y{h4HX8X7~ zrmF60qaQAe_mp%tDXMWv@T_$2lV9?f;vre1@b*bdWuw?>tekBnylO^C<5e?C8ah#q z@d4A@>RnB`1TWtxhh~k!k6$c`Q7YkCwzeRbi<`!)W|TB^qFgnjRKl~;*||Z|A<5@v zjl#{RevDEveJbHqGfEn-no-iwWk#u(K9%tDjq*1dh1(78&j6{WG_j_{+*?3qC!b15 z0VnE*|?E^|>T{M3I*an4X@4OSnUqLQmu~R+<9T0Yj}PPtNLW zw&}bj{Z`#6SwOQ(=S|{w>Q2o9PBOCD1alMpX#lf(rcFiNy{iAl;w7K~zg>(*YX+X< z#^O%r@kO4mVdc}YA`fGD7|p{d9Nc}wO95Q?20CK)x*gNW5cWy#Qr@6N2W@Aby-Q!M zWbbTUMq=M2F;e8FoQ0ov;)ze->Ska}aWIqnYxv8F@%3T26@teSFu%rnW;nNhru<6EhQAEk#<9MB{&ej4Y5?v1 z0l;-vffFt}=_W+wdIhxTy;{Ba5#vX39dxqy-#m%z$u%iNW<%51Xk88>0OSZBVDM(m zh^RXnRNc82xYDgK#M%GBvB)`#VeXS|Nhf-jOa!qCE=dC8bvT+fPI`D(GqL)~dh}o=sNoA;e7-?BaCcE6EsWlt(!y6Y(& zy;{3;-|{5ulg?T*ly0&ol`q{5kghZVK#Z69I4PFw$pW6NXHRa#NfLD`v16n4Ian!p zG^pUY3Al9zPX{Ph4IURNfx~hPu!<*@Z-ARAU46l`swY{=Jq#5qOCViN@J#Wf@};|l z($yC{t9g?BNoQs0U%J&jseI{fg>*i6Zo^4&DliyHxAWxN_T&zn_&56Q3~}zl36?D` z{#e@ztZ3__I;oS9_SIBTRnSdUbn<88RK+HLHceH*ax zHo(Cx6CMCaVXF}_`|QJXuR8PYY#*j;*3D4jTRVGbx~|%i0!xHDkY0Eq4^LZ@zYHUt z9|ZGKC%UM!+WK{V1T>)Y!%`JLcn+O+k(R$Zjc_qZrhv788Hz5h!5=5wR8Gs+jK{mw<8bDdMcqKG zP)5s%-tR2h&yaoCj+(>d*NmTGreccmB*mCPam#e$M_=)AL?iA~g!>-g3Zz1Bo6C4T z2u*yz`THMF6L_-_*j%Ox*z#$LEmmS?*~foZ_8AiC8xhl0HXgrp@%U%Nqc_*)0H|ax z3IWL+FLVExYGgZuCjpGngDhbRiTN0GdFMvvEQ*<())z+WSuYd+3^kp=vVLV4Z z|3>+|6=-*C$-^8TX7ex$2ba{Z3OFVNVs*W3(Sp`%j@Ik=QT#DFHKP#GhFE$=As08J zkcFw_E>E{dPldoM5L(ljzpg4!&~%q$7+J;AD`$7z0+3!wSVhb#+ zT=uJz)$OaPLegyD@MqIhMLK^Dm@04a=fJ7r#brO)6h%+V{&#R{3J#_c zQ+VorUFdz#0Oj}4Xe!}3rjlPk_^ys!aCFng2O5akrTNW$@tzm0TAAwY1yKk9~uD;9n7Oj9< zQUqAg@e{zpP?D$qIrqQ729eJsJAUvShWfqc+}$B_$M1O9jfdaz@Eaa>#lczdb78~; z;~I;QXvan;;)gN*{{T_ilc%tkx~1e72GJro0`1XB9`Q>+6!ylc`2&hSYsD$~U{>yH zEf7(^@TYDD7KJ6c4MPBi*U9(6cxJY~81F)l=bO9K0)JI@G9!_5uKDyS7p>uQFtm1I zKY#{bzqR6WC`E-kWf@|!!e?>0RByD3>|diIi3qhQVjWf{T|y;K zx|GhfD$)c+uq(xIf^NZj6e%z^IvL$2PzDGNnh&JrlSjmiGrLZE++7NM-(H%+_k7PQ zOjzl{D0NFXTFxxt7!3L)%Ps}_CL+OXX`JZMXbGYaY9@b*oBj5&Re_AkSr?|I-!%?{ zEU{|fn+nDZAaJwADX5F3+PqbPZs5;6y13oqc(G)exx!rz4x&X4ghkRo&ZpToX_h5; zFAd0&o7Ay1wo=rkp#2a)Xtdn;8W2+q?qQqDof(<8f0iTbgQ~J-Xe?>g%airNBy7KI zZf6YtrHd5^a0q3~yp~>7YiDS)^kg)rg=b)7Eio9}kalzf&81=#(=z^SY;+1vP4W#9 zH1c66g~WAukbL>q;fDe@Q()a2k_Bg8#j; z%HjQ}y*OU^`XXxMB$i<_+Bi*((et!9q91J*$B8RJ8$C54Cu;sx{%QXGhCJwt2oEkEysn!#6B&YFsm3&~QyVg{)=TIR?0urX6RS zO!=qoo_l86nNTa=zxTtpJg>7Z3by5G;%G#iT_*e^#(vauaTKSW9*%Yvf3i#^3(?D`6;@YPV#e(IjufZ4Xr6R;uK1RU$>P`aqj4BxRV*HATvv?$ zyC41`(JK5yQETBZi_4I*`1DMS-ztl{;uPt$y2Y`E!q#fF_0)AWYMiLCWMll=e)#8` zF_(Y7bE?F+3@M9mn2GV*(iYcgb&IQ@*JSk@`q4U6rHa+_K`U$RE6er$@UO$_`Jk2g zE6!z1S-lfhFa49I#yx(u^z`NFA=GdftO@%V}LTHhKsBpbaK709YWHfx*s|UPi-ZxnQK+_Y5(z z!!?Y)X9T#fL~M-yD0UD2QZN3}%e$WJW44-G*=!Pj8eKBCd%JHAdg0F(&|e@t2U!8kmU)4GO?R2+c1zD= zprQCIk3x>=e2Bxh<~^6jwLop7?xKKW^57^1Ow(+Oo+BZ6W=n~KA6rq{7tx!!i=Knc zWmk^uT8&wry3o_@=)y~+ncm8-K+_5ARMRFT{BE9c-dd8zB!`}uqM{uay^kLzioXwt zk}QN*KGm&PKDQBK;dRR4EY6h9SUl-!is?0*F^$Way%cM1`)QBTYvfvdg-20#G6#FV zxH*M4RUv#)z%d2DsaHN>h_88(5WKLhWW|r|@T2esdMmjj!A`j&-R*b=?s$_lE4U*c z*{POx$M%vmCONu;qRJf~;D>R?4uB}hLUWcYs(a3|&}>I)_75zM;h3@&P5&I&-clIOT%eDrY!z15*>fFGZL zN|Hq??PLVEq3J0mf{%|rsZsF%WH?WAoHbBY@J}=7n!z0j4O-zPkA(lR^M@;T-Y;Wg zy2<8&JT>;~e$b6MtmU|o;yn2i((JFUTEb;@m37_KRkuU75Pg+)$gIg#daOeg>!uz% z3UBvA!A6@X*dR_Q==r0cLK)mhP$Ue{r%GXh4}i zpph~>$7HtQ4SZ7bGthP`k3V7{W=C)5!nGMQ%{a6)@)HO6bMJ4jtrybSKW0!0Y)}QT zp@W)Ia9D5Tl55Vuadnbq+oUhOOh=eCls>0DpwZrt7iKZ1bw9w`18flai>!ekJcn7D zZlzfoaqMWo!P(}o81--N?Jv;yE17Cub4+MRX2foa|7ZK#qh&Avq99AyG#tKsFt540 zG=LzwnId3${QyIs{OOAL3ri3QwQy}L)|%5~9Y68M$|FNp(4u>w=oXhEdVxZ7LD;x9 z4$;!;qm-hu7Ks!nfID5dwuyniw%|LMICPgprYJ;F?*(}L6EMFWpV5ngoAU+p&0c}nJdu5DTK~-%3utDsB=mR&N^jzg2*WXmU@3P^vPdN z`BF|@yr z?%%9(cQ{Cy7|T%yc02;(B_l&qQEmOcISw>H>R2?YBRq!@he7+Uj-fa@w;Zp5m|e6~ zx^}dVkA^#Yf!YcE!D=GJcc=`!Qqw%A`~d&{pQBF`nlLS|RH9(Mr(r6HEb9|DB%#l= zlovY`BI36+;>*O$KG=NW+A|8oWHLxZ)Ov>%wS{s5=`pwbwrFQuUV zNhUa$xOKX$wai`4f)WG^+Ry=eG^P})q_-n#4eF&XN^0HSmix3CI2p2QH84Udh2eTi zf8jc2e6(V9pPFbY57kBX>CoyvrAsre&kL<4>-&Z=wfG*_NiOuiCPPVi`2N)XLx1S_ z=c;oKYr2q{aVF<{Vm!IhS(g98_9K=9H0O&eQrgXY=^z8`hkQkZl=r_EQj= zeL+ZSPnela+01OJDKi&EfJ_!ISNf(5CNscbr}uBLWyVHhs~arO61Aog;llU}%`_lu zrU5B4Ek4_faaJg`$~aOP#+lc@ah4t%jkCt#O1MJp&da*2(z)|eCG|2j%<52f;gJcJ zyi#gvSfizoKWq6^8&YbMailVgb4LHh88|i?zv#xv2(K@zEmGzB|HFt&yLvUOD5L0u zpEBp1!E;t9D(bZ5qU6-GWU6bLY&BtMvONB+rU8NS<9UeNH z;7vtyTK6^IxxfaIJ~Udw@*GRpi6Gw9QNXcd0uSvtxW(*w04WsFu}0s9565lX9byf}qNJB0NBKFHVB zUDQxac$_kamuZSA4bIx4)rcXw|Du#ql@{XFAz_2%)?Zs%wLd_rMrA_dgdH2vS{LV% z2!gpfiA!=x1l6KCiA!@y1eK&ZiOX_H1U0cbiOX|I1SO$5i7RqREDg8Vy_4!BuFNH| zOg$v7CJBZFkq}bcdw{QFbmR3AMO;x)qz_3&$i7 z*CZ_HUh5?GJR7xDF{O&KB{3_Cj3l|<5lYf}xQpC$mtyw@f-^szNbVbm^EtqLVYc-! zYnAj6bpb}Oqo_nJDnV7;ZbWy?k^p$7(9l6zPQ^A`bb`N_&3&#(R_U8asi|mA>#ljX z0vqDof<~FlbJV;pZU2?PqGMeiA{<=JyG7AOT#zvbG))Qf%REqPS|6(i8B3R;&fVkhJeAICAYvW30 zZ;iT*d}Wcnd{HC%RPJMR0J6jr07xqyR09xr661Qago3AdtS{KNFb}` z(nSG?!;54(uw*i31LCPJyu|LNqDo)=`?}x7=Nh2nrf8H6JjVpFF((K&BXpy$uo)O) z6BK_#5Q}mgOIuI^pw7T3_?y#uCaBLEfjxK`lZb_@7a-?nf@WXmJG1a9!nw1tD!&Sy zk^;u$Z^W8ldOJ^_&A{XRTJy)r+N0T&2cqBL2ocB-;)U#pp1H`6!j+lPgJ!q_P z+t!lpQ+nyYkWFH#v$yk6xrNqwymbmcC`~V|G;lhO_~?ukLTw<#uz3xexAuJ5u=yG* z?A)?a^MDCG7o(6i4BozFzzUl#-!NqJCK>2sC&XzKV!OmZ|Dh0M)KK`e(QH}_L{QGy z9$h_+0~?Us!t}`_HJ~PSWohM$+Sq@}1G?@}0jSqhNYF-=0OO z!+ie{<$}|8b%Y3H2$_8UKJ)#jnbAjP*?ixU`EGfn^Ie3I?-b54wzjnJCf|Q(4WqVx zOZa@>nj-!X*Y~=gdo5zHMVPKq=F*e`tM85yT%BHq{*?hjw zrffS)wp(c2+kC#Wv$ylHynG*H^ZjR52(|SK@gD><)3&e~h4_VpP^jGOgg{EOJI5~3 zugF_TA3|6+hFy6nkuC%wbYS{aA;^&fNp$w+Oro@f zpNomZF>Ve$SlZ1hrq)X|y|43{#VUhO&xd}$lYTGGM1t+l-K}BN2H{-e zgy75I-4t=p#1fy(geC4mXIKU~?yNv3ojVI<@a35?;WB0LMese(ky?;n5C97NSr*I z?PqM3*1iI8N_&(+;X=6{tDM>;PzJA~l7G!8S+xuj!D(oH9(LvVTudB}adYUw(*9O4 zwO*p>eVs4PT%6V5T~1Fiq3CpFkiS_53Dev8{LJiXu$OY73?A(W5y%iS zW$6N^jNUQRt_JVmMw;c3E`uVBG8i(pwzTl33?66=qc#ZVdduKG6!DCk5YKBl}~N`^7&Hu2g-M--(#83LG?K+U{R zv)+X>yGtip#ngI&Wc?bqL5S1a`PTY$IK_Q)eN>N+ zTBB1aXV!@ofU`~%E}VF>)m7~haAFUYJT;?aRVNa`X=t4ocI7%T1Ta>C6F6K)<&1kF4_R}D z+ERb}`VFOdR#df%Q6<)(Y-c92-B@dY5hq99=xhp>4X_Hp*#HwR0_-fSoZ2N2V5?Bc zb23U+4KN}&4Q+shUAX}k0x-ZXhd<#(2H36Zb(i|AVrsoa2(W8Y0am?Aj9U?VgIhPz z(y;Y?XFK~tKVz@0d|gQh$6_|&c7?vsMuRwsV*w^Ru|+xetpV){Q5d{ zm(H`otM%+4{E3St{CO1qd(}yx#GerK!oSlcWYq3gM6ZHtN#*=nU#o;bM%( z?CkA)ajKwuJKu$jW?Ff#Yf4||#q05=;U1Im1!LR|Xjq-c?wE-DrH6*hvhX6ShuXy` zTDQ!DOqWXVYf2D&L8-=BkvK@ok`w=fE)?05R*x>HVA-No0XSQrUAIOj5~sH_Ue`JCV>n>em6;taaf)nSjyEsm~=5*+Ht@JyHPCTqu zClaT(^UKIN@e?|6zjdSQDQDJ+6@ar&6fT^2oz+$C5^&;`RPu(5l2x5Z1gD{OV%U}I z#1Mc^{De;2Z(TZZzjeDy^Q~fPy+m;0L5tQJU;^H zzaoM{T(b+Z#!A`+xy@Qh?T$_3x)&(~WTL~Ii6U~oJ!2wOpZu&VcV{;z99 z&;HbXO7E@zjEud?!7JJeIE~$fCx)h27+YB@A=TSP^!%D;0*jm53NUQQpo(FE(a5Kp z4mGR%xu&7wqC!hkEB;AzJkdhJu8V&g{3G+IH}}!ZUfLbj_-c26@x3evQ~0Z{rCT~o zuc4*yln)MLm>yL}nC>3pIxk(gG0c96!t^Q^rdQ>JspDB|nBMA`A^aJphbc@Ut_jm& zCQR?LmQuTf!t~$de0Rn~3e#P~k;DKnBUSJ1ykKMefp{CHheQS0%MnVzE86SULu{Ca zI90>692gAp^S_@kB^6qlV%jhbyK=+y9&3EH3R5Qw!W90hD@@ai(^gvgUisjObztA; z)~RtyBu;PV{p(N<7XPO<#+3NbI??@{YV61{E@u77%B|fxHcj-Z^m|8CpocP2#i{r$5PKACCNxyUG z#DCW6MB?CaD(}Rn>BI}BM2}F;tP?8$XPqcqIPqbttJ)>t#M`OlqZuWuI*|xYL+iw_ zE7yr30G;^s#&F^VQ|QDCrgWDcvx=$p62Xb*ES3}Zrhbo0zxUUM6aTYzjhRRs?0cK< zoIu=HCc%mGnxiKvXV!@ofU`~%E}Zy;)m7~haN?d+@~MoHRh>u#r=fLX*p=(V5P(j6 zWfGh?PkUwjSjp2?F|}SIIPv|p7bg>6IR*MXBmMqOC(f_ciNwL;&^z%NX5tlVN6%5t ztP?8$XPqcqIPqDltJ)>t#OJBx^BE@Gx3VGnTc1d-CcUY zDyG&;1SkG`v7C4`^?OnJ9Y`n6t<{Od!Ikh@ZcaS66HZ*PO7t@2%sR0GaMp>!g%e-0 zx~g3QPCSfCzLHV0suPLeG_+0(yK))cEX7ZbeXsSmx-@h#ngI<;KTzL%Zbye z-)qwE{_KPnRQ|X;H(pc3n#vAbyd3roVY%fd^4kD zRVNa`X=t4ocI7%T1fUb2WhUOa7BlhAwYp1hS;f?PiQvTh*IJx%y6|M^_qOyqo=!Zq zRwoh%`~2RC&(Vn=cSP?{&a4wF0B4;jTsU!|)m7~haN_G!^4*M*Rh>u#r=fLX*p=(V z5P(j6j!yizgHHUoqr3E;RZOjy2u?hHv7C4c^?P6Xy|^Zv`1+bPW+HL$49=RaoIXz{ zKD}o2A?3_Eu>x?`iNb{wKd`#0T>?%#o=Sd{QL?HNiQqJ}P7J$pofrbpiO0_&yS}zft_~M$2lZh)*zfYv!JUX$jRwoh%_g1|VU!W6DS~L2Ta%P=a0XXYK z;lhdkvAU{V0!|!3B|pn3S=EU|a2i@ChF!T%3<2oG7wE*3~1^@um&o#4DymUr^4h6Dt5`ohV#5@qboVwM)Q> z3#jCm86~SakqAyh>%_1t*NGtjop{rRaN-rZPP_uwiC0rq)XYCmy$0PJHo1=(m*gdu=s1ap7t; zW+HJ=^H+13_$tfkU8_aQP|j>7RshaAQMhp8(pFcsOTdZGP|4 z!QCr7a+Q8{a~S1<(+1E`Bt#%X$lO60GX_s;|JSjxqsLCM59^P_sN<1-SYL$ku)d>7 z#@3crCUX;Os5Ok*#kdvlB1LRTEO9`s;Y=K789MIJ=?LdfSB*wcuxvP20M3T9a1qYK zt#WFYKsY}`B}ZnItQyWla2i?{gk8De90C}tAe=v4mFx6RSM4s1vWlto5+R(wTy+t` z*}qpciTaI}erGWX&tDZaiTWXu*^TvrBA61r&a%_HYP2FnDTA%k;`Jy{nq{sw5KJKgL=~?PA3CM4IJm8M7#%s=Q@SoIIPYWNen!z5;Mcd%RaA zTqyT-tDM>;5Zi53@*5c?tHw4FoQBrtVOO5d#l+zlH-{c9ebXwY)=PxgK5J28+n4Ie ze}{f!rQc;8i0ykiP^!O$P8Z<(%~DMmytB}eE!E>F7YfoEju3$iAycaF8HG~4a%S|- z4qK}4#As}Jq)W93qg02Ctt~CQDb=mkFlvKvu5r@xSw5U1wk4K`VF_mhc01+in^RXq zmcKeNYB$QG4ulX^%CIZX;kmV~-$w?U{t7bV7oQBrt zVOO5d#l+#1d$3frimCMyP4DZxtYZ;ou#xUz?Q@TTek)7A*Cr!54`7z}q0Ho~6&u2*i8u1a_ z@cTOAHb;+%Cm+M-n{os7{VM9g&&eQI4r=8W*biz=5vQ3y=|IBb>7|NHTL$v|m{h#w z082W(7g+k1^_1EmziKQy!<=hm!j8l>Fkx56nSpEgo4z1Sxi7{=YZ+gZR*^shi#o@v zf~(@ZaOkpnxv-&Uw{O7YmXtoACHu*MGobZHx{3Qyb2my^$SAN~w6hxzWpg%DUodyx)uxFLkCgJD-*9ZY*QgbuV$c~#=2<-pwM<5o_W zNSGehvu05nn5Evi@2@n=)Qnje{nfrBMVz#(DnHQ%#%5{lD*&go$J{4eDEDovoZ2NY z_w7q1r)89^I`OuV7AJE99& zcYYVLu6>LP?)EY8rp9|a55c3>>1~LOC=sT)$%X_$3<)#I74fuWVSH+=uggwx1&qa_ zo}SA@5_O3pIhNLbf;Kg$)0#qU5WqD~E`!|U^35^vcM{#tgzi$@78?#Z8R(BE`N^oc zT|#mFNkOM^8ufw4N%mFJle-#9T~<=H^-Joj%CsG~j?1xE`-8te!-y>&L#Sp@JIPA*HkaS%Lp#zOmbsZHHzB6DD_sw<;KLDWsFiwO(ag9#kMdOOY2?%IHfykqHv+w z=2kVeOQ0q$Jtm%+QL$=8B!bh=`aA5(^S78d9OL59d!<=cEwx^v>3y9?bS*+f9OA0N z!=vNb((c%mQO+)08M*e*=#B?RyQ28uXck3+;K3q2RBeRkvaUVamO`N@K5nQG1XM0s z*{=Lo8Hu8JUux{17z65vo^N3+7WH&d6v;UQkXGfalLFKpZD&}6`8N2Kk}v@?74-WA zEpEl5fK|P;axZEqCIzY~j&0G_gd|Yj6~;rO@m6H&`XV$A9d~6bO6UA$N0s%c{DPt+ zaf)K4^@{YtWDrubp(C-3Dsw0r7I|ueysdFEXmoDBX>`0jNcDA|LbuPO+ix^Jw6QLAv;b z(1FIO;wSOaa-ej~*Ja%NW>fej5~|~mtx?nlMya>(Uo|@ZX~rlFm1>J&;-n>2u0%gG z7E9}10XU^Q3cqln+Rj!rwM(GzUphMec}B&mg`WscKkM(XE6?9z;&64;xJa*+pDExjK==Y=JUr4+EY=R2#_f3&&d-|%+k>1Xe_2I0fnhL>nC)2>#=vNdG zmH2mtCP6^+s7>uOa8x@A?=Gpa!!d?%8PRh%#!_?>c8sU&_K!H_ZU5}0?VmkSoS&M6 z0P&kYp(Zr$X)_UUA8t~aWy@aWn?E5DBcEh5n?Jv_{!trbRE;Isug`xnI{tOykVD~+ zaDC1pXZlc&us>rutMY zlxjCCmD>8H@@0C~=y>-;sxLN4$~3!k#EJGKXO-y?!dOwX98zA|rb|^wAaGBrRHaB7 zASC*Sn{a*p;U=a`OC;2?J*-jG21cp3OwSx0|2|`sTFNwWobrJ>(O$-4Y27OTr*ub| z7A{o#gH=uK5-8I%M#q25s93d36T#_c{T+7Y`CCjJPPz9=dt0^CdWoj@b^d3Q#VOMh zM#uX|yK9OlsgD3u08%JeuxlOUjpzXV~nFdi9! zGCd|W_8`VorXR#uif*RXWOnJrDX&bgq%z%(GJS8VOoy7#xNq^+`Q4K$vos&9PsLac za8RcIWc{Ny$fz32v@d?kj*kDFIOKLZWKgR3anxBqRArDWe(qEIw-p;of3Z@jtzRl% z{2E8c`z2B>fK+ac%I+L-qW#HP#V>@g$q;tsB}2LZgwTP;Y3Gy!q4?oDn<##FPcp?% zBB4V3)fz=@V3c}`U&HA5fQ(UUDSpJsvskaOSX%cAz$x8P{DceD4z#MNT>{1L^HK3Z z85OG*KO#8&tiQvqJb#Oc!!a%ny;nNes-@OTG#y{|DK1X&dw5iQh_pM1h3ahP+C!sU zU~{Cm^A^2=l2juhxbCp{&83Jae)k)i1Od%6T=6@D#qYM%*lDi#oyOvq&rSsb5y*Qhs+ivN~4 zIPX?T%oLdJGEUVOCPL^-Jo@bUZ3PB9Zj(44tb@=vZMn znkVelqcGt?Hh*u8QXOffQd_@NpSsV`UNR~^I+5xyXFr7H3FxLpP!I8?+0yZ3SUi?T zKV&~btD%_ifD}2WMq=Bx=s2OCf+HvQhMqOXA%@A@0f!E<#JtuBzndrF=K0N&@EKVN zQ4~GgNxs-*zedHUf>d9p5?^+bajHB_Mw}e| zqSGlBjGX%5Yz5$KwEQAeZhxcgzLD{n((Z^!2$ScVBN@3I$9^|n8&BV8 zJDU>0S&teL1TiG+jW!nQds1V4liZCq7HUyX?$0M#kqz_v0w|Y0zDYs}tLDQkb5&buzY8Z<(Cxr&P%wLqZM0UpVWWJBfdp3CB{O z6;W;dA`WyS-ZU~kH%~-%=7^Y*;XEsY+WKYiThI$e#^)z8oWu~BZ$iXYXpZIx6VGS( z_*w?0!gL7J%v(TpOT8BE^O(=>-jZ^kDKG`vr?T5sV=lq zsjXkC&)vKckBt8%sT5Mj`;cO%Gf@ya`ckF}=Gf_fZJE+gy4cF0wthMMWyX~w<4Yum ztaGfB12=2fonw~hGIG{sMhIb(FYL-IUg?4zLI;*l73>^2Q0_j~R`|zuD_kO>qF-u_ zqBbx}y_3}yBjd|6MyX}8B2J#gt~3@)>s|pkr8_P&gbUTKu&SwD0+ZFnBjc+wDpsAW zh~V_I{tmnH{4FL9$GAB3Ug>J9mRc{-bld}-v`@d6yZ@+GBZhcyH&Wsr!_n$TaRV6H&P?ZmrC+rMY}7JS1YgD%sY8fZe5k zTmPsHGOETIw8c$NZw!yGO&kK_b#=V%9rF5c@Y1-mQ)2&d(E?-t(sdGLU{U9~olJ@j zBTzrO(O{(Wtpad1--L^WMLBrpX-f(1AA@Z6&sturPsU%2uN;RYj6$)H%-Y1L(^OPj zzh(UsrU=WMpl@HNLS2@9)m!#eS(f9@PN8M*GIlE6%oepq=eQ!c1?L%UMW{b*F=2#k zLU-J4*pxk48p4~vOFda?Oj?O5{N}H=DKFzb<;%49LtcSwDGc4Tm$2}EIYR8%V1JA5 z4I!+1WhLWYW7DRh+WOt=m)*|~kMDtcp?jb6?tM<~<#@S!+oSu8-C4LCNM7Lz#?pmL z)YHpuk%V;|4l9M72?T9)zn6@0&8W71-TmIg6T{>C6Wy;y(NGDui%AYSwF8$5#q}p) zMM=%`Z7P9SV_q}9q4a>2RBio|`c>3z!{dh%NiTGgA}QGIqzR;q9wBF~qCyC3%dpFY zmJChn%EIZ`4xs}Uso2hu1M{%2RSJEHgr&yA)+lNNqtv^Kx^;N`XvQc~qsk>eaq=wo zxUpDT_X@x%-BHEEEW2m2?DhacMG}0xsW?7H8$5R z^1mG(znM|7YLzE~)6e=l?8@`Em^d8c;?R4gx2#%fy+qUdIzK8b zPL==e@c3-12()90x<5A`3w^n9p{;XFj%yWPxo2l~eS%;{t-yy!re|vcRLE;b?ud8FK zcgWP?tnwUpZb|Il9(|P9-+|=WKNw5fU)0l8UL;ZF9ggaYHf~};n=1dI)m?4`BK3vGBsIP7nitA_CBwPOWvcvs_w(D`(@re~xZT+J9 z32DOc_*03RPF+kl>~`J>LM{3)IqR|`gs=rF?8+-p>7pD$2Q1RjS`LJgHeVCcd^;gY zBvkFstWnekMyYo~Y9Ahdo-v97rpkmwoIHztVJw!`y#jDbcT7mag=+t^s;ON96Vlk> z@s}ADt4>HnaQaz)hh2I8788eKTpW6@^p#aht(RzeU*}DWG9e9h3HWwP+;BU$JdR`n z{)5Hmt(Nf0pQG4Q4(6oztrpZIQwJI`%H0RGK^)aMDft@sT1z}2BgU&n4CL3V%TsH?zbfSA7UGSpOz0i#Q_{EmA44fh*LD`7tR01ZC^jJ*tj#yz(npa}tEH5*X z;*|vsd0B9h_q>)(^J2I^%kA_9?bz>I(B2(rX2w$7%E3c^7J)1hf~93}%0N|Hzq9-e z&c|BfM+!R9CAP>8Y`&85!2nvRDeGZ`mjZ^hGM-EiC1?_x(5&qVem_$MW zA7YK7HZV%PbJIO7@vw|hYMGmelV`Ev#$svRD*&f-$J``bsMcatQ=2n4)mSz^ayPc` zZiz=EDjv&dyvvpjgan7E3CbZt!j!{ND0wrw3#hljD9V0PEaSUSZ~pfknJQUZ>7KZ% zB)@BsfY9Lw@{dnGH!&JxEJV!Y)j!Y25j1xI{q2nrW}7CLBFyM_ZJf9yQz^<|X~}@n z?ZC13{C6bUNNaet^~aR|Q!Tf*#49ES_lbr-`Sdz`g60j=ylEQZ3Bd)FO)%1MU3m$X z!ZF&0=~DWdRY$FtXgaIXB3zyN+grbCiN7xG=C&hd&S^(D{nF3EzhnW^cyH%l+v$d+ z>W_=YQ=-`orIjSvz@pA^d+QrG&)nV;A@Bb&{$}2Rss;zPGr%Z@V?+Jl;WM2Fwny!T zP1)_O5Z>6Bvt))zC8}YVQC@ONWpFy@LtcSwDGU`f35!@PM~EF8ls_n(g0SO4@f_L(vbBt{^Y-!W4W*)$N^Sj8`FVRrOZ=@wD!l0D-#cJ;jyO>VIcweyA#7O* zyYk9PI*vo=K;u*#OT4rkC`3L}73LBNliOr#6t#g->YcZ{TjEtRMp0~3xuzseT2fOo zrWlK*b*})N(jBvjaG~0&RyDOb^LC9Y`e~%AC0;F~V%2L(A~^l5zr(IPe~XF3F)j|h zS6bbwrPfO{odseMrjar3f@XM2yoR*vn}8y5+XUoVOPFhgwJ{pEV43mactPStf(djn zMf`%5{_XMlMA@X&U$Q1d&sc>2G`x@5oI=c${Fn^-^f#|J+_OQXcsqK-JtvvP2Bpj4 z>Cu?(lLj`a;S;0>xo@G>h?oka96_l`qwd|M1_Sl8qF@>GHukdCgy5`(YJ(K3aVGFL z8;7*SC7P&H9=ZS?3NQINQnmF<>en$J4vV`INiU<9J{T4zFGur) z{a_d@2rK%JJ5j2QtyF63m&&hW-W(Qhnn>mA2^R9~&Jic-CTFcyIhFaC~`KJSQ=@PqcpbABf-r$|hLYm6u>* z;&6<%VY-yIwCbq!5>4lNVi6XOzKr~4XuOrQ`?3u&bHMoIa){mdo1<-XBIS9V&+I(V z7JZ+BsEmXVR?Dy}Ps?;Fh0pdR@18poL544#wB9V}5TU#5ct>5LojO;oz z-X>#|TFMA<(vljBZD%Z&*1ZC7N_PaeaG~0^RyDObWu(SR>7#m=q4D+^6{}tj5y9za z{T+7Y`CCjJj&X75z0wX=Ewx@EMD>?#ixAa*SM9YS@s85&7)JGlZ77nj4$+j2`SH~u zh-i)D={SYAk(@PZT(mPK!mip6B-y~C&atbu6V5ZcY9iz}yc+$k+IxC==RJLnm|{3K z)W2^WV&c8#=x2sa*{)g$Z)}_@orXzD_<(9yJSi_Zr2;A)f+4RomHnIfCF=c~XPEqw zu&A)*2(e>>Y=puo2xC=aZnJhYHf<`Z4f3ld}zU6?;UB>rV(Q90y9q6e&~ zDmFN@gcAMAN~E@aiTrZ*{vq+Ml1RBRkGXN5$qoD9IY)CsHolK}6H0YD?DQKemD>8H z^7GJbL*m^MsZMk*MY^&(N1SMPa@IT)LfE<#cIDNjbRvY%l@cLG4pcIq>e`l*NGR67 zvqn)H7^TJ{?dPFehs1kij8e-yM4UW}{oYtCt$PLFRN25hBwVPrr&Ueu5}1b;42l1c zQL*YgL^5n=Wj7_IL5`H_ey(NwbXivruTIovncbBe+zb}A@Luj-BsgIsIDGo z3za(YlKD7!Gbu%7Z^7_h2_4as&^8X*)2P za)jWzlL>Ncv@d1CwbmaDO@e^t$L?z5WA6Oyni~7S?fiVeou7Pmv_$rOL2=64`N0km zc7FCA+}rusgmBIaNz=(M@d1Z3nk%zxX)1qTFeGBkA=%8%&!4PA)Yk71{|wNcgX2FZ z4uSEyI`%LQu|=4p&iXdS_ZSQtnThl-Rt&ZEi{ZbeyZhjHzeJ3WD8}ywckJdvV>hxC zh?6CWg!brQN?{^_R4PS6FqV!4QBUtdiKJeBEN7j>W_xsqVGZU7;a5t+1kBi~m!QQ1 zcocBr&7y{4QlOgR*cKf~NCG7nwA{xwG55Q&m~+|@BaAsq72P>OR+2bHvC_;TeXzm` zsady6EThU_DH;|fYU_8q-*^1&;P_CG>g!ZFQ1t!A`}{ZZImh#S{x^zXeC|N;HtGl3$?sKi~YU|hCFMoC#93PhG{yIbc2dT{CsM9=j=nrTY?@nwo zyoODN!>v?m>zB$;6x$AtkCap|vY5UEsZ^cSiC2?yw`OD~`?-XptQ>0Vm%}f^wjLZG zEjbh!FE}}{3}bhWS)#v_vzB2Yg!Nz8l{YP?mm(o_VENQiBu5TRkRw31c`*T z$}!d`Y6GLxyA0cEaC~gWD6)N(T}9&LS?qXYv9#_LfK$3-875q)cAQmBZO$^R#sz}k zRorrLd_tn)^UR7lCMyaE2@X*cgeF45>?*!sb`?=dg3;6}AfAI_nIF0;0DR~q0inYW z;I88SUC}AVLNszxggqbG9?+Smnwrdw#$1ZwBEgAEGL@nXmX-{tN)8+e{~QwjL~D4p z^~aRof0;QrJ~c78Pqcn_6^Y;i$|hLYm6u>*;&6<%VY-w~v+Ahz5>4mKP~ZMbt7<@D z%6!bm^Q73xvk)$4&q5@fj`JB+Gp0}oaVPh6o;<4o6z0vc0oPjOHg-&6n2t%Vak=PB z%3t`iKpJ|Q@M&hw)jhX2G++Y*YeXkXDvyf7%8bFk*!3u#L4ufK)#fBt_1a-AA#KhA zH7a8C=&Ei6W2K9Zh7}zyyLv8$LKFKsubKtBTr`<>xfp+rOn1-Ia9oB~Y=i^HVzdU^@B= z=jg&^7}0QV=cC@ocK5K}euhZXQhd&3kLJz|8{k?zP!N*?e#GR7wmsWH$mtkpC|wFj z)+e>~tL$TYSE_uuRKA8PKh8q^Yo{_ojlU@pVQ|BCRyMY;r67pyDSq z+m@7%?d18>vo~jKpS?L_J7mQ8na989boS=ab%s${Y=`hUv2B=Cq8i3FB_^j-q^4s# zsQ&w_DftyEC8{-&KLP-9rmZn zFQU`cZT_Z6gz4=(zAU!ypdg6t8zs=dqRtW9H{m=J+m=*LY`;8{vHkK)#&*bv@pJAh z#P-WGqdN_wve*vcE5~*S6;KUhn-Y^#DpJ$2U71SeE|7#pY?mX%j*U?`1z}^`+R4PW zv1?ONZT*h+vHc_+eHT>h>wJ%n?xCZfaE>nAgAom*yp_c^(dy{Wk8N^bAd#nHJJXTG z_T7MFY^$wbWgpu|Q{{U>tgrK*RQc|iQ28jQGD3~NDH36NJD=AdL6ycgT#9cmm`5!kN)yhFMvBhwwS^oiIwN5l{|e zoRX7UKQSKiOH;|jxCBOwmm|cE4PqQhryy*MTYLQ<*4_iYs-k%xzk6 zq}UJ}&DbmUx8w~WKopXgLa|~)?7jDfz1P^gqGCsE*u@6+g8l!@?Af_{&e=Vf-}kQ{ za^}u6J2N{wTh5-Qb6m$aDCcAQ8(eby1Zwa%QN@K5+Ni-7QG+iq4LQOQP)$_jcc3iH@%vC^GjtQ%q_x$OqnD9w z-iERzbZ)UOQ%JWJRh8FX+*r{8(NY{D>iiEWeCfA9F|+@qjh(Vmaq){1Z=6(PGdeMljR@MUx5@~!6;{_jpV6ONgXak z@n`Z%(Q#kgn6-df#n;dCopaFWk4PQ1em})==$tO8W#QgQgK@tvZqey6@1(A{>=Rn# zogcE1ACtHVFmjPz00jO$VD$3P+Q6$|?e|N=svBR)uRkkc<>c+i%0r`i%sZLBSsLnK zD?s1fiqK<?NwOLW~jNwaJ0&~k{Ax}aMceQ-xw60eC~rv z;jX&xy`CKp&-euWcsPcQ3p><(;6A?RZL|6_OWIHmBJWcW(4+WhrOxViA%0az9l4PF z9eMc~lr5Za)OM%^eESC{<7g8qgGUo9$uCOtU&mlze`wU`FT&P|yr0}79O*dNS>v+k z7oUffpY-PY|Bs=y->-(X!%fwVJ!+|&DU%=M z{@;fF{~-1MP>1RNOSdrne<{8oPg{fW{?BH(|8um;xstm7C+i1$@&4c9_3U2L|L@iP z-&Pm)f1Bm(|0^j7=>L5DKlJ}*^71DrTR7o%iW+?TXZ@eb;8x=8O#fd+{l9J0=wHIt ziS&PuaJ>I>S@i#(!^-jT|A+oxPnBF1tK@3?KNT=F4Ew*$a`t~)fcpQcG3fto-2dCq z|9=fD#z*l8{r~oM_J1DVWa*zhANBi<>-X1iG~)Rquo4WwG;1TGsZ)~-?&ls(jh3Hg z2aXOFaR(mrJNs8q&cBiCf8cj)=^v_+rGKd``&SL8VQ$rMI<2)0Q5;SjhwNB2d~{YD zN-XcBD4q(~2~bhr-BXvJ^?J=qk>(W%(8j_yp3;Iy`w9V#g2-^lF}{Ep>zs7i9XKyrKex|G|?*QMOH4N?AF zG7`DHeBIGqw4p?9+wzXw)<%3 z1xh5c$+;b4iK>CnTxLd~AP}r8^Jn)7BfRaK(t-5AM@85Y<~a;aqCoh19%*bn^}!3_gSNCp@3nkD@~D;JdS#EKmXs zqBI)P7WtXaJORoV#ZLGWpTs(G}WEB9m=-M<$08 zk}YLvwKJLgB}*xp?AH>@WOf#roGj30%pjBT3HXRan8_R^oyj_;K{+4W-@KB^FZFKQ z5Y@x;A=JD#QuDs3n|J64@EOGTyS`a&n5l>gwS(`@WU@dB^dhCvkhaLrd?pWv6lF3W z+h0}5WPIv;BvdWL=Y3ICeCoWi;$X?-gE^B4Hy;ePGkJ4z0hv6CT`4H%-^k>R@H>{t ztVl9>jx4R@qtVD@+YIGg_=WS)W3-t>Cfo9kOx8wxTJ20Gf9cEBDVc2BvV4n_;H4Ei zi%d=yXftMz$@ofkL?X;&j*`w~9n+wkkL_<>$z*)3ehX9&PtH;E;%oJl71P5^-U@sM z@dDSxm`sJ*!FOjeS)fdwt}{9EGoQ&@LW(k(kL|CjWHP=6y){(Pw^~tEd=0v?Vt{1w z0M2B>&DUS;Os*sskjdMyD+T5J8<{*7zhjxqiX@Zs_v6SHfRV|z8OoOMBhaI_(`FKx zY|A?`IlLdoma??knN0rDXNV(t8C_lYwZz6`b{3hOEYN1mAd~UQQa&MijX%LcXbqOeQys8Opivi@u}xBDHi~jlyN!jBCp~GC5pb*ix2OJCn&@ z`n+dKCi}I-GMSx4CMOHD88gUad_*)N5oR(+NoTT-X;99`_BXF&GQQ5dH>$UA!l{(W z_&RfC#nZZZhwckLgYzdGRZg)bFU;zK3bljp&SbJc3G_6j(U7*t&wM8D11ZX6KDNKA za?KWB+1(GS!c4Zl6U=N^W*tD5`HC$SG!ilm)I!*_ zl`g<@I=h6O>HWi?@Ui_tk?xHT!v2eclK-ac68Wa=lAhE$gyS?g_D$J=qie_obnkz& zD+T5J8xz%k@H^JMS&^fA%Qqy^y=^m8`S2T{qo-&yiSBL7`@6R-Wofm$H~CASvrOsU zel7Xd5ZyhEpf&mc}_q-{<2rb6xDySq18pagn>(r8Fq1sJ1s{^cUm3Opq!8GZ(ixN_ySfds<&{$@6^2b0#jwh$zdkX2A@HEX*99A zq(bfByEBr;pPhn zb|%jw7m&$w*_DEF{*6pN1ixdM%!(wFyT}>;qvk6Z$Yk3Ln9)aRGl@*LpxVP}!a$pUT03^Ey?{fJ0}naokrnXF?Pl=HFu%`2IV zulyX1>MfkWA9BH0W-2ST2s8Ou@EOFJJ%7rDyfD)b6>10HoylZ@GIvF12;tH9d+Raz6mkKXJfB@DDCghEmdUJ0 zGFiVRovtUyJM)prwi(Kn@EZ!FPt|4;nQY5DGC6z|yDepDwKJLgC08PO89n3oYl)4? z>?|@lS)k3BK_=5jA#8~-lQ~K{lXXmkaz3`dc_owat&r1Dy@eCbqk#(F3aPC4L^toy zGr(uiyddAsWGd7SzB`l20wvHVltx3^B0uw)d^)5klll06s4CvreI`^boNy++?;UUK zuB@0GR`qP~8AMhkrXMQQ4!*mpWPz$WSywgkGhfxSAVpQ>WBaQroffZ#JqN1j4Rxq0 zzumM%I&BGeTEfjc?{s?UPJ0QtfKGcZyHZfjztL&W!|zz9Wku3y^A`c-MU&{Xwi)VP z;R}yPU#iU{I;}15=(OQQKwHYvYIj=lm)>@n(rNu#Vx5+qMW;;`XftNeY4K*wh(y?F zIZC?I>X-)Qd~AR7N~gu!eJ?}x7EZXCnip@Et*pp|nS2HK44St}+MSjPwS(`@WU@e+ zoY9#a`I*n;%OORX%*XauRWcc`y15dn7FzGim?iJan8okQAly7>ZD;ZgCX>J9 zN=hdCwZt-+okb=m3$z(C$Yi|DAtDiGGDk^gvW{s`&d2sQuVgabR&*1pho{9TlkvV1 zJP8@T{NNVw88mM)urrwowS(`@WU@e+Jd@IBNL%D*K9g^T6lF3W+f~&8$UfY(OSjRt z-3~1aC%n8BYKc4JD=Tir@6|t(KD4)87LQ@SycIo$y%hJ>^Zo5hace#9ZzpB>2lMYF zhm#NHpKcz^H?BnTshmrRn;ILZAI!gl6e0qAblfev`kU;+NYD+%ZFfQ2!U@l8LG{=I zk+==N|3M^vvdbb8&ul@FcpY~cb0l8JO~!}>Da%LV9&$VxiO<31R}>gmqLJWI;$|cg zcauUyf{%_!tp4GE@DY7(*L$HY%n7vUKe#KH(l|5pt}78mQJc9V<+B ztf1_$Ur(@hmq@vJ$Lg08+_yQ(elw8bInO*}k)dZSblEZYg|+76|MSZUqK`#zCE7Ru z%c)bq>3e)a=T%v4tVhI^&?eys3yV}wVaXh4M?8r4Q}s3YpxZ65XA z@C})7Zj~AHQ0ONg+chMye{$u3pP+dp?;k&#Lbq)r&ct@OHTp5KosiHIT%?emG&nzL z&fs|?+BzN+k=BW*r1t)mZupi5K6rP4T|)Cc8is|B?GKAI8$a^!IERIA*~fzpl@*7@ znvHOC^E&wz-k#q^a;Dj6pb498$rhP0PlW#QvHku@v+;uuPv!mNM+(AbBeuh>(a(@= zZZ=yYY&M&<`ew7Gt(r%hEh%K*r_asCE}_|;4#UF7_J>894bR0q%R%AyY2z7~%8J=t z?4Cww^o7XiX|D`wo82XBu;Q?>PQ=GY7KL8%v0YyAqeJ(E;T}5n3eA^(kD3SSv`{e z#jqxPY*$Sm@kd9MD2ghvIjSMiW&kP#U`Sg?7=Xf^5BbZX zqkL??qmqCX50axB;BUqH_@jL!ihLwCj)U7`jJzAKhHmh&{ccFS<~>Yq9D%ot6*UFMED4?DWBZ*%;%Fz2g1yR$Bk{N52>Nq4 z{^)2D1#@l0repX!+eX4*6a@PZ!vU|>p`a}d{o!M~{E7DKi}Bg$%8Co|m%Tv0CVKva zC)XSOHksgleN`XfqF2g3HkhJXMSg38>z~lAH7e`CeM%LOi|SFd0_Zj z`f@InH^o?ZruZHy#Q6~)|DP7nVHD6tA3)c_3CGawJ7}ZIig)q*A4H)lUlLI`rktYi zQ+XJLpXjw^JGGIjd=x$+rxQ{5ADJF*R%nvfzf`W|7 z%*%AiK-F6UXXa-ORLIbqfF{;9x75{Fx70P%JBu%k%2+xSbd&{U*|LJNTp3(n2FY#b zG&WVus-BUVuQH0gXkoZ86f0DP?|H^{qKI9otXse+CS)DWUuZytpM`X`G1@etXidd`G~*7}x+ znQ;Jgur0+UoFhSorp)HYe7ojE0^k(QRGy83Ar)Wv9N5G^x2TF9VM z2f4Hy%$1~I6-clOC^W}Xj|tFY4o0xRN!XW?U8Q6vD%nuq($s)lmu{u4m!<0HBRYB} ztoKMQxwe$-Pjao3;b_A68mTJ25fv*T=WNFnE(N_z3yjX0*lm(S1g7WnYTgPs+!u+G!v80(S?XJO@R1+B4^aM78=GblW8prFdFbfgg)2B82;u?;)ZQj8|m4HCjfv#<&(I%jHHo0@9tTdJluRnJ6#@(UlV zjF4ZqiOE|NT23-1?+~He6GG=1p}R!r&VLd_@rQ{7lyQ`dqyz*>iG;V-Gx33ZjYp2Ne`m!fV`sBUUx2*&`EQ1^vj-3n2+PpGcZ$~!%*?(ILFfhs2}NqHAUbv1ORNA4Qew(sgK6)sQ`FTUwjy_nrbz1Rr7Yytk2e?(Q?N&W#^{Uqw)kEE?*Kw;ZU%l#) zqPoJZdYD`Fh}Em!R8(&qs*YvIMsd{-nB*EGMMt}fZsskzwG`dbU7;4W==>b>2nF~~%_ zw^qI1>Q(UDr%a=$SSdA+l!8v%RX$O{%(BR9%!P_MB;t%S7ms z)D~9iQooWbM9J)Uqt5D@!48krhOKZk!f5H5!Rfmtae2a!G|W|E=&-n)3vDbyqk5*TN|f3tp=1xXq=HR)W@>ovDcmNco{ivdE~+&4p-F|L#kS z-;$pF3LiGM#t%Ro+$qt!+ZXU3%cC89_4UpYbmu=LTCc6*Ycb< zPK3rLgtjw6SNApzbXD(o1MOji7K%`FFN_RU%InRFYZ68GGDWYGq6<*8eo8I2=&j-O zT7SuF`xwur^od1gVV}6GUl@BgN~s(CLN|-hO@5(gMCj>+5JpiQ)t7QI~@ytQwpYFyK_o$H$It*b`9@Nx^Vof~SZXV`nq2capHx*1RFc~V0m5a%+Ul8Bt(!~(-XoUpO0j&WU;Q1a>K_#K_ot|D1LmpNeSXXLrdobXEI*QB z`C-5Mhf>u)BkG?@QU4?`PsN__TYfy%@(W`5xfIKb{OX@gRsV{pefaOf@204KCsoJCqT|C99UlPmxcGjm`p-oD zrzz?`N!77JbbOg`gEj)@>5=6NpAw}$2jm%9RIn1@p0&-bGcY1q3!<;Vw#K*cq?X1v zjF`RpnQ^*Dzxa5@F6j}iJ3z19-T)nT`+)7WJ5KCw1F>j}SfSV&pl6WX3Xs>O@c)iY9TX zF=5pTMMIk1X1CpzG`mNO-FXo6hT=$o&QQ>8UdOoY9-C(O46%D!LbcSFl%MHVepZ_D zD@6Ha5c5{*(u8H)|W`%dsUj<+r;iI3DuEG-R@R?N1F0SMft-J^H%Digk`Hz zkGbtWo@VzYvAZ~-I#Q{Z-O67{Q~sGK|1>HV-gBzggr5M5Rv2~CBlpLEoQbK_M}Rzi z6vOZevHWF<d1+X>>80FH+#S&3pl%l>cRYxb$ zQJQdrJC)Avjy@$ybpYhaZWVL}=$L`JfbE@u))JTcC#*_8S89zkyKB4c4oI^*ToifzQDtrAwPP;8lIcdXm)xHP-FiQQcw<_*Qp z0G*+rd24sK-96Im{#We&JE2x|!7Tve>CU%OW6HZnoW2WER`y4nz7v?o={o>}AIk&W zr2VX5mT7se;2kmjR*LC2fq5EwDWHT``n>cFu^jU%Z0jY0Tb`Nhd>5dvEk6>cKY)}k zUhf0*c=n!Hc6+u=@Pub*t}n#=XDQ~F1M|e}Q$QZiJ`u}q&psC1<=Hpl*-FUy0m?n;>EaZpi-37rybw^@pq3Ln;Td{KZ!zC9#e5H7 zo|tt9YFJ^0r)BPdk>p*J&^LW-zEW17HD|o^)#B8vbADCi( z05DI?)&}JCjFx0W0QxGvo>(55VtF0EdU#(UIyOkru|6=5_vL=|D%cR9&-+ngc|?lk z;ePe-elyXr3FM+4S|=A9`;_3OB|y5rB-&O5qXEX>l8@`>!;+2a4V4X?CZH zU3d4KD!3ya2LW`%V+PpXc$_SLod_{+6P^Gt8m#b?MyUmW(wgvi!5uE20?^^|sbG6u zzC>KU2x3vMtR}or?7BmFf#43mE(PfD>oTyte!V4rErpmjly3lxIxV4G0w^t%uM6&Q z`E7s>m)`-~>++Z4^5+nXdS!+3GqLLq<#NFtetiYd;nxbVy?*^6e*Fe9Zzz8S7c? zZ>i5Dh(%qt(sfUOUZ?i}nCA5Ef;*hv2cX00eZlrRJxiQ!fta@ungK>@6gC1aGH1K( z&PlU-oY*}kp<04P%ICY4AD^cD98rE2#JrU{Ghx}P)VXfE=cU=bTI^n#P#vk%HE!h# z)0E#W%J1+iSL$|vI)fY;a*x~Yy=iuz5xY-D#UlHHPXKc!h*FOO@_2+b_+nB29OS%h zwaBmkS-*Z2ya>?ICtd>E+b2F0m)?ttMQXeZSkzr)kG?STE+9`Z-T~wf#y4VlWs2n$ ze#>9^Er02rl?;9%oEaIT$c5o`ae_EcM|obYeiBjk}Dm7c`DWckSAA40HsX^#e!R1T`JyFJnIfQ zE7>ESbpz({tScaoXI;c{Y@HBp^Wt3w$t)Mo`iW4-sZ-|c9Q*^ur%;Vy#sp{Vr^>3!AUz)1pebKQj zMaR3qJTAVIs{Uh9|6z*y4^nk}E;^Pc+^`k}pZb(2^$8%)$fANT06K=jFTwT>gR8`) zpA%NuB|W13lxFu=x82{;?5;b&48Q9Ph_{FpiXi|!gX~~H-cYOu&=HDqu)U$!OkCO| zVbu!7#%Xp(yX|hCW_NqBTM4mfa$2F-7N92-69IWcu>(LyD0T$f8;bqJrF{}stx)Wp zW_N$L-2>9>P8YjVA?6K5EkI`|XkV$$ZTG-5yR*e^YeKcumz2+OE1#RD{CH7*9K^hp zIyPZBTu+eQ1#Y`1q}e@J?4F%a9jVlLZsq5vDPJhcuZEbnQdcD`Ta~)jZTGq~yLXG- zI}@rSmAc2R{N6O>i$(eKQL)IH@Ht@73d@>s5g=z`;?^xdo<52-;j3c#=`PILe zs{Tz;|3-@XCBQrtd);sOwN%T?#PT~Smf!ZPe=Ak}N230N6!q@|^Hl6TpJiS;Ef@8l zq^SQmRmWGNp9Ax__*ts@Z$$md6!j}ob^ItgzE8Npol0+3eCJc5)VF{<*{y<~ z06J!%pTYLdKm`NM`XCq>?^Dvx@m3XpUb{Jf4!eb5d+qiVyWJrcZ4oOJ-2i$zdRIVR zmwEwoxYQeLuS@HQOM??utxya~vpdvncil9*n~2?wAm$ClD1gpT(7d&&+wNv*b|;G6 z@d?#ZUsArUTX|)g^1Vd)o)Gg^YLA3vYu?)1ZFiqEyES6BI-xpJsVQ#dwQ0)F66I$^ z#Uk_8>A<2DmU-(mK+ZN)>Qq2!8%C!HZf(ryH+8GvY=H4}H@Br<}Xb#e~I7x#iHJA{vyE>=2dV7Kwn_470<4LlrJz>1M{@z zRe(G(yAn`hQ(4}tezRD&-R`%1n^<)RJ%+nouY3-0pmH}P#1Jiz3 zL9zxOD9>uZ5+RW*76eVDkke!{9OT$L(Mvs>Y|yJ4E$ZN=^ch_imD^!!jt~*8c6x`w0z5pG5?FY8kuQSE3(;?;!N03Ci^1Gd+% zyTz|NA?6L`9RQ+}$SX-*Fo+~IUN zK!?-ogY9*C2XT5kh?CwBKqsFq-n^8MY)4@gr!U6fCS zn72~33CmWc>fCk@OtU*%?6xLUM=CYPt$c2p^3z56sZp`Wj@T){q7_D+^alOOfShfp z6uwp-rk#~mbZwunbDS%d&rY#?mS6pusp>Bl^%th7zW|u0V(0rUpOMu=If3v8+5pq%IIURJn+~C)LyH*Nv-ERfk+ua`$mmWx1l?+wt{xrJ}yX`)b zX7@$0`vSzgp?DskCq;10in zAx^)tV0-=QE`D`|m^YMN07jjb#aL%RX`$>SxWnZh03D(13AWeeA>#5Nh(*1!LOD?E zxIsSE0U|OsI!!rdw$ORuPaDxkO6}Z_2&lPyK z3qD-nLtXGu0w3vu=L>u+V7uN*9pfr+k`y>W7mzRYv=q?$&lk7~oi2q=O;|a_Rp4wX zaHcL`Iw-!Id4{XN`BLCq7ksh67rNjp1inn0lS+-{N?n>LgmY_3oi4ad;Co&0LjphGf}arh zF^2QqntQ<_fuC`~FADrZ3|8uSaQ3Ir=@DFyN=u}`Yq0`s?j3>Oa>4HlyvzlECh(_# zC)G`>x6I?#WiWSbojDnwYma%gLJEHA()+EzU%TK{0{`rSGsDcV_LmDT5;!-EM!lG8 zy#($7*p4T*`dtP3OM!k|AphAd-I@Ek3JsP*0~1yTxC)d@fprrFhPnz2mjV@BK&EH( z{$Z{Hn@fSsT<}%`Z{dP>7I;T(PI~`1?)^I?3aMZh@S?qcS8x)&|39MoU#vRcU`id3 zP>bH*ECmjB!LtQ!b-{-UJl6#uDe&Pg_!xnYa=~|3P;O?k_f?orMBiCKTSrX?p_AaV zI{LgHuV}af?A;TeD=!P^BVlDZRPq7VM4uUJgXkoD{KqO!n=B6+#ZwHZFZ0khdmahh zc!J%?7CtHNJVd2xXErq9>%Y>3^cfpc`KVFJzJ}_wM`eX&MP?ote8Ms%37Nu#OxFabOQKX+OeU)`!(}ws5bM+oyyF4#DB~bi zObyRe?KQJ81Gg|0b;&SDp5db}fVQ2}LSISdvNTgkS=6_8!iWAbANmDrBxL#|WCkZV zgA%3Ij>%+I52;-@`01%#Pk-%tt)_Mr2_J?fI2**g>KCjRlgX-~;^z?dlLDQ!1C80J zU$AkkT)$vcf-^c{ZL^q6R*evA8~UR%ay3=oCShpnn4x~bmN8CNZ6T&N_nAgTD`VyQ z1=}V#6JwmL8ZWxXrUY@1gx|X-IJ+h|yCgU}#W-2DquAdb_Qxl?l2Y4wE1gx}o~AN- z^!pB!8UMZpjSmUVY{Z8vtERTr9?Ws-00w-?g*GI;FnU zD)?K3))4vyu_ssKdrI+LQ8!^8`e{C9Q#%0Hl3mjT>*NW#ToTiC29l-uNdb-nUG=Lz-sJ$vnNFFzhw+ zHpCSOrQT)$pCXLa?k(aczt;I4*sHDE7Z5Vt`BTz^Q9@D%XCuVI_o`zSKPI;Qv0NR^ z&%s`;#qS_wEUqLy_V>!Po)yGSTK$UHNvq$2y;`fkLdaPCiS$J4`6IDxi~8%?KM>ot zsM)K)_F0tAoBs(RWAS&=gU>=rWI3-gXXGXRB8g;%vRr{Br$EQ#$S0O7X1M?>eT{1j%N% z3n@A&+8lJIxv{pE+g+blja6ziv0JK}rqxC}&1S@}X>DrawS~AIo^R<7Gw%!;lP)`u zylZ&go`7WXE434V)z)fv%fzmvDbdmPwj?HzMD!!cdlIX;dS)YiRZ*&;)E>mIo;A&4 za^sy~sXLxzu>6WNu~PGiZI35EOZktF*k-yabrtjGM0j_mDZI~8xR3;0 zd2n}{h94~rKR5)7dxgILYzaO@f-|cTB8jAKi3b^|OHQUgrKw(JseXh6?T)DDhF{Xk z|7Mkck_6}C%8-?DPY`cTl=nEx;Zl($_ZZ7XdA|}bmNgQSKLMI<_&eydPNmcz4pm)D zc-5JCRe!HmRR+>=uS8XWr7D{ySZE36(gcew!J;(5j+S5v==6YeNK@6xQdPQIRb^?a zx>>5atX5UmG*!JURXtX#s%M(2K9;JNC^Z@r-Klq4`F>XUSExL8!lXNPM_wt_H?4es ztNd&3@@u4(Un?x1&8`hfPkRG|8YtADkfNz@iMyU_LL{Efx|8va9_=%R|FB^=1j5wm zve|XS#!#Ww6>7bZBD+i7^&1S4e{6Ss2%FCS7U`?T7n14p-;5yhHsbS%a<5W2Kg?3{ zj;%ymP7kCTq$%0ZQnHMc*x&iqW!O0#$rK$<3Zn7iXS`bd=(=82CNiMo{t4$W|*n^7V1t$c}tZqJt zw!QMZ`1O{;8A*i)B^7F4RM6m7*kUPcN-8|qudvmv@X%0UHhUPTQf#MZvxkG~h-RT7 zVlEY{$09*ut<)UmMOd?m<%%keP^#caf+ttaY(SUHf1I~q9P77~wGg&$56e9RKOmIR|Y@TjBgC}ZR)tL*j3vQIk7ii6Ku zWp7NDeI~8!M`z_D^C9SX6m~QYeqsrJoF=&35`2yXqfuBytk}jaeZO9*Pt&x1ZfRYd z)cS%~>t|_N>&`Ya-$9^s3eNyVDV)vD1clqBIGLw|j>qO)j!hZPQ|k%kdg>0`f}A@T zJUy#6gVMTNKxy5rpp5QD(0<*s2#x8U3!c_}7^tx8fzrB<0A+N~0Ug(U5&NxzLkN@c zF!Y?Nb0h&Vliz}8y3ogj)1E#})-uo1g+!&kAuQIFmYXEn`kcIyVW8=}#2OtoAXeQJ z%$*i$A9D=`@ z`Yf;nk9Pw!uQb#&8Of?#gwluVmU|s!`+URg~R9gA$dHJ{ppyP3G zG=_Rvf;}CAM;XDxEWtw^f(wk`5uso0jC2y1L;=F87?-_{iv!1M*^U^~L-rjjIx zA!8??CWJdWEa+uD1b4RtcS{qTVhPqb1g|$KG}RKUO%puX5pIT5k$Eo?(lP;9i#CB!^({zTp6~#T9vtV?f6>%Bka4mf)5S!NEr3XiIQC5^SE1 zlZ+`0qg{!J?tx)cq+Pxpud_N6fs z5pR+sO)Z*3RoUz;Q088WCT|fHv=Y`_Q>`x|>$Co`Drg}#E+J>bJ;-@`QO@g&<8y$S z1eu+pdag?c66`Rm{2`#z>wBoz0#wbjR2}IRRKZb%#jAtz$6Do&2A%H8F)0>~BWy0O z6T=`v{X$FqHIBl!nRYwis(eWI2OV!e^BVsG9oP7b5meXY z1v8+%f@@lW{T+grtrhw>$`Tyu5WLk0ZfglnbO_#S1h=yUE7Jsb6hT_0??j@GR^KHe zwW~+!2$53iP?E8i=KA{IA;g}Iv%ZGe*0Oy|Eb)~(99UX9k%LE4d8|*J3zOpjnr?P9 z2`23yMQo4#V}Y&C{(LI$vwsOdZJ%7dltdk|yi%l;x{PF;?(pco)Dm4nq6gLD(v~^1 zoA)@kHeQuS(9CAr7ViiLZxUd$X-q;d`_0n3ie#EfC zzavtag>I<;{CwoH9;sYJs?Z}fRHT#|OfoICctU}8%xBcq*W&&bxjZ^nsX-(#*}j2? z>dwKx&(d=biA96IqnUyqu;kiOJ+~!MCWBuL-l-xWF7VVP^6T4 zKh$SAb~mPErQQnx^l^K@-%8FouFp619-wiB#9H2y`MrqiFu$)=a&KqJ{X8Wvu}Ypt zGBph|Vn#0`c7Ax(YoK{N6$Y1j)LtQK$?YpWQtw()lT}ji+*c~eodlHwT-paEt#X~Gz^!mgCH|P zsg;CyhT+*anC><_Jp(;L&?5z%C+N|j zx|6u@x76XrP%D}(1l8c28xxO}ttYQbap7?&hbIE@4x8fI5Dw6;{?A)lGGGb7fHC5cpP`kBbnA*U^!2}++R zp9M;9V4n@jY+#=XI#b^|6NAH)+GwJj!jNXm_;4yJrqsy znI2)ENNk_mDma7SIw~R8RS~U=!R0yxSApUN4Xy^o4H{eniW@YzR?zDNy^IK>_Wmk}}(x3u%JR9Y&3cbsH9o_{SX!T)#?Ru$b&#aeOc zrzznbiJ_sNgT&g@=YrQj>4ttCly2xHptzy4OF`+zdJ_~kR^dB_SNN{*mI?1Y!z=m- z6l*T}7!+$R`UDhfE?y3bH5Y#diZvH~4oa8!0+cTCB`EF73Q)QOuhdkK&3$cnxo-?r z{H;*m8LH#=OrgFVf6zSK3-qHwi+?gy$Da+==@+I@qSGo(@u>7HXjdnEhWL^R;UZ0` zr-|*#pv44Cu5E6Kw5$qVCcZNjUNt4GBsqIs3=F~Z2B``=gOzr#5Y~c+R;*GwwO%A- zDkgO6n$?A@?*-AvR}LjjUm|{EQ!U@C9i}OHz&S{FYvzbj1#gpF#1-25Zcznq5fI5_ z8mD#UcCe_9Wu;|hlG&Wm?^Dq^w4H8ss-h1)mWn<|Sfbux|Lahut#m5uT-F60;!l*| z4w22>Xi~lqR7alZN%dfi^yw(PQlZL1ipHnk$p^=H{Tn--7_WaNwtu|NK(jkB z{-T0SG>;@&Qc)p1SQ2aeFtprcDp$ao!>QC7eew-jT4=IZIAke(Tpq+>45@R4iAzPLhS5t`90D}BEIFw+lm8!UO zRbzF{LG*-^HQcO2646yfI9KVO&V9Lpgd8Ie_s=cenZh4p~*6Hq-?uL7k9oL`yJrw%_*>1fh_PpoL8eMc-i1hb4ys~oC3vl&IO=!qvSxDbp0)EO6P|P{vrT71x>u9mznlYV#jZMRKefG z#^xwrInH-G(_6}l&?Ln$%Y$*y0hDf%j-Ygtl!DUkbpo{(&uyKVLgweX7+$Wc;T3f= zyrS-gSJFeMo`&k!E2OB06oQUK)>OBI0bYNHb!Fda(=gzLORL% zgVHrx6O^veTA;W_g#$owFDM)cO3&MaKm%cH!7ySb@~vP)VmF{8%219Lp*F!k8|(~9C)zHcbfWDFiW4o^UC=!Q-7`eV!nUBb zk5b8r#6o@OMFgdpymJ_Bb|NU&PQi}EOte$5J+UQ(l8-wO+cPfcKC~|+OaS&KX?xHe zV4e{?a}EA<~s>R(=||5;N1^-9&S6m3;c0ku|!s9K?>2~{W5fgweKt_GcEjI@gIYUP3LE{XHcQ3<~){g_sB!H}k z?PT51FoU2e)h+f?Q#+=Dg9)R}AKnG#SxOqRnXqVfHxY|Pd1qXvWvZDfm`&)62ApB$ z0o`X01ELq@M}X2};E_xr#)U^2Ug6Q23bG}~ggmPBA)p=ij?N`E-|T|z))`n?*3pi> zboE&5X#l~=ohm+@it*OJ8TB#7qdDe-uYEiol=g7}Q{>|bhF5r^rg)q_7IeE^fUQ$e zPTM-y=*^xN>dj`)4|!DglR>kEDRp$wF4kr7YIDMCaEUYyl?6d?I)RN%b+f8lYOAWYw}%3J^%4LKD{A8Dq?!gbEYgrSD{)FBJfYL^g9qYAyPATL8NTFa`10ChN@ z0Hu4C#6;_brxg zet5>(r=TfXFnBgl z1y57)+WMM?De#p}W%7_+?PVYy8miMELzN8{YKW$SY}q=7*Kw#&>l(DndWP4f+)&-t7it4T z^&BQtMMzO+`V7&+R&^bkqqd6vG&a=Hgl=`J?@7oA&07XCs{$z)P|;+ zxXg7dH81{U2CCpo;+sCIC!~2ibMfe>aw`d+Jhvs%6FHs2!BG``!>aW)14$fJ^ewT& z<(aT~SA!=)KC|fco2Cs} zHS4%4uW--m`f0V1V!vyxQzq!=i!FP<5rWn8wAxA2>!#Yl;(b`!i^V@x_IIekQd>sb zr=_YigBCS&h2>GHBEDW9+3bMWxLek?rAo8J#U+)Qwt+I3pnu_httux%!om37DeJyegbdC6%r<~G`GTh_Cz7yd`0VG11uIkP4oL1kvuHsMMqrJYRG zuh8(Qh7+3JM>Zr8XCHy3F_xv#Bv@nJ<%F}X&6pQ`OlVW$Ma4EDR#a+ZV)1lhE+l6L zD76uB`6@xUV1Ai$DAl&ZwwhA{QKGH-9jJdG>`n`vijN94(PhlYc=}pGy1(l=k(%hAONQ>VHC2 z3pH7&nvkNJ><^mn*Ob=R*E07b{v0?J#oiSMY^G?q`gKb7T^{959>CypruIV%Mp8vyDR zY!fKmfXyLA%`uY-`@%JYK&NIEG!ll@9Ns*>+tdj-KWu1iYNi)F=^3aiP61i99ma62 z2Dgp`rkD2fKxwy*GF0KwLLDR2u^~lH9}YU+yANYtwBH^|yyn<2aEN9`CFe3TIuOiZ zUQ}*2^Jpg%_fX)h#+tup5rpf3380k#M5-!3@>#`N2+bpsK6)?-(~|PeoU>5ooq$5z zs)Y+d@q(=IT2Q?BD!dL9pO+L~FX#<|-YDp;g5DtX zsN$7EeQl_Y-x#X+TcN%)RLAcPRs4fcKN_mzPeT1H)GvnWv`VO74b|~Cp?)`1r$2=H zQ>ecTmHS($%xz%|Iw+w6LzQKPDlk-soKS^^DlHPK*ifBH4Ar57p~^ZMs!OR*Wriy2 z#1t0XWt~GFb-d%@Yo^hWt$GHZPq1$=IgUWjU~&>+Sdi@A(rgVT7)z~%s|rpesnj9o zWRh?!da)Zp2zIyftDxZ2P+g>7hFdo(IE7HVrlBj`FT;V1PBzaWIlh(36wRH-is^RY znGLgW3Yxc>yPTkA`{n?ZJD+&gz#)3hAYdx)veRo|tUVOn#FiPLau*O3jzA)RCNXhK zX2jy9#MDEe2wq0KW**sucQNszj$O!N_FyN{S1?o)RdJ ziXI{T^wMrxQ`j{vdYBM=KEO^b@?MoJVuWr@*9FF^k|&LtDl-K|@}uM#!doI%D8*ID z(^8OnfyA43Qs$9FQ1UEWYeD1ER!1LX=Dha+6sVG?2#GXj$rHqyMjIp6DN@OE#6_c7 z4nIyT-Dr8qNU$hSCUiQ8=9dm)m%Oy<^aiQ3@8#jzb$XN7cH^l|ONkX}ccZQ=pZw4- z`llCv!!RuB6-vt;%+2YTh=3% zeb?0o2!8%;s%A}(<-*pG)V_`brKj2PhANy8Qe=5c&=@WF+&~O%!Ax4jTI-fES~9}h zTnk2cqlp(?SZzkEXk9iXR^kk66V_*~sjV7@8@SH2c-(C)VlN|c?Owm_u>8sNEHi|g& zU#&38{EwEz*`MY1zqMqP`7bSrCblFG(2`N+{=}?tL{bH{4C(hcnDHm5(M(n%%qh&& zZ!Q()WX-fC5y=K{^%-a@DBZHN43(R0sO%h}=4y)DeJ1GGJs~rQ6>iXGBUc`9nX-|< zaBnL=Z3hPvdvYB;_$*xRUwTolcRCJ-5PMoY9~3Wji;oAz*N=-AfYM9dQ$gu^oMx!p z>4xfX22)sgWzP(Gl#_>o_O7fBA<(n3I+Cz@-uAMcSHaN)L@)RsMXdNW+GB|++tAo8 zk^rb+9%0Grw@27T^yFY&;8DRbjL+olPu==0Dmadq_LPx7BhSye*8LLaL0+HOUI&V! zoxL6upIGE>0HrU;+z3ivkh#go72Ry)if#eLtx|j|sLU*SwyULquH+QmCgQiVIBh=P zA>wzE`1D!0>u{DSaF-OgTMFD`3KZQd=zWahPL!fHLGKsz0YM)W^dUhX7W5H89~Ja5 zK_540@lsG6iQ+dwaU=?tf#SYi_MD9n!EB*;Czv35M zO`zk7UvL=#)3I5^7sw-n>NNymYe|;GL2w1z(E8^+n!$f?>04fE2bU0LkDDsEfLQcW zPP}I|I_O_cNX-mfj4?H|M)Ql<3QjjH-i6GQh*afo^p=79QWBYr9ZRd&`NYHX9Mfy7 z@pOg-S^HVVd`mpt7N7r@r}W7goh12r8p-2%ib~TjeUqJ`I!1J{v?_XzT%9s!BP-yl zXbCfU322rlMbB%&jU$4uX~9h+%onueCK2W$&E#d5=zLihj~ahfGo!^{)J%JEq>7%^ zI-|^&v}DxK>sm76(JNXoTA{^SFj}EEh&dT%q>01WcH}cHItMfV@-fyAB2bjERL4SY zJ#<{XJlYUc5ppvQbD;S04&GW#?%ff_+_n2!YNnuY&an z!>xRccq)!pwbX}4=-W{~LJw0xIZ5!6&?ykfXnn)a7AT=lMz#i}mwMX>HCCu`Aw~7u z9JK5D!D!+;t{-g1^2zH2o3eb8zX|bu0os^APk^>03}=~%xNJp0qHmj>F}) zb7#<*8MRYeCe=-;9gooyw^UeXlKKMHP9#)4WfnaTy{~@mMb0&~#EvB4tIiGtI;*3C z-3Y_>&2Ce7Zm6HOeM8eOwYUYP2A5lCR}23#1FbZ)FBa&%iv3Vtuayq~rQ`4~q5d6G zRMUMx`@GnnFvsR9n-1F@L9d3GHdYHtFU+Tc;)Qv38Yq1lG#!+7rB0{=g*qst$f+vO z`sTo@8MXD(Vo!knS5T`-ex$Ce{zH%_rZt3NikBfx1(S*8sGtg_5R$hY&V6>p4UGUa zLRbf2HYgo{IiPd^=7Q4IK18TP4V61gsKX6abc9exh7<**9<)v-jP%yN%uM0)crBYa zGl=hr#Vo=id)Pq}vFh<@A9{qJvaA4EhCBBTCcZO9Erj3!JS(8h#KPTD)wqqp($Pxn zw2^~vPNFm}=DYBYfxHgraiI8QCOaRLKAAZM6bHHRR8Sn`!V83Vq2U!=0!rTlcPS`t zg5t{z)!}lXt}s-=m7sKqs|>IBYD0CnMyQ2`D!3Mud9wQ`(7J&l?K6+qHMlO&R6VVh zZ-ukc*4#aNtSwX-zqv>Eb(K4jq$16hJDFIf+43!sJD&JF^ynL7@&kv;Eg&q?aJiF+ z6*iou@!7*|qc{KO&Lo64Je=O-<Wo-7};}GCJpqp-J%vSaN4`IVt-3J~3rTf5xptuhd zJOWCeay|-*AA%`(%ycvC)SV%U+t%UJr({^;fQ6!aA?si-M$bIP3b*|>;tt4dHy(AvZwEKzW$h5me zGv95dn-r&2kv3JiHWG6ttfKd zu0nOw6z&P_F1#LwSKJen=@N@jJJ&4ytnj0=@H52s%)+k_hPQxN;|bn=M9dit4F|P0 zCK4xDoCkNt`$OV68N3k1chh&d=f@QlyhIYt>HK9vY+uX@#~ksXJBeTegZsQzp6C|^ zOY=VLMK@$y)(hUW6(p)x@P<{?yi3TQSPGWp1rl}RH3ZH)RpEyuWoBGGv|5Xl!uJWr zBln3xNfo|FP>aiS;WC0ycSaM&RpAG=(F86V5x8c%oFpSdQOTFY;?Hktr$*UPEBPXZ zj*Ot66Pg^xN~T$H7LFLGZ~a#0@r}jOX^xsW+>PXGzRs^NVG5UoUv8Ge+X-yHLYq& zLrv8T*TS!gB(Pz)Egr9_i#*|@f`1d{T=M;kZCd%Ig8x~j;%hs~I8`vkl88@^dgK2< zNa(YSdQiHnH3-!hQq;kwgQkjEA^(bBqBD(vScIk$&l8~;p(2V<%qbNdM4%%8(woe~ z53LY1Dcl@tOt{uWK>AZF2a|}?QzXn$p^Qtdl6Y6xK&JgNM zq0R~^it&-4Gj)zp;RpsC!@}XZM6&-Mrb{G&LkVc6r>tV{$vq?wMDL}V%K*I%Jyv2) z9*CBhO#rWiBK>9-v11R*o2TfGBTV1hM$5n}&=qmx$+5)MH@8{bV^|hd(<4tPdo;^N zxtuooZZz7mH2=))`sO!|Xzfd&z@*egq|DV47c$^zi3@azWWdkYC6d5-1n^ttV{tt< z4@Bd74gtxyo=t3LTv4m*0h(G}OMIw!N z`E_|7h?cmF0QU;$Qi6Q3xD%j>#qA{Mip6aVIAU?DE|IMAExJS!xS0S~3*VFnqBXmb z0C&x9AjnsZ?BhG$6Y=>LO|IfqH+3c5~^rZh4D4O&s3d^aeHwvE;>QJnLF9@+GF!q?I z-4z7!TPeabT7uw8uREzCSbqflK=D=fU=2|E(Zl|r^i}q?Kv5Htdp$t=-Rn*$@4Hro z4=r2ktZoE0;9FlvG3z2!S7PJBk+fhBc&AhsVmoWvn-F{qRyI|;P=TN?v8T+@H{+t=`N`-MD8uXRB4v}@(f z5aQAJXYmHJ97Z^cH;Cn;yn)2ClZ$gj4Peno8m>(&jE(hlo@r&{Sbi0dNuG?lUIz1-~ zS|jL`5TyYA3v_03170jY)4b@`3ef?Cwlp+4p#2Flr%+NP|A+v5oB1r+;Sb}K0Mx$HJj>~q;2g5D|UT?XxVA1Kz`u?-Y!?sz{a zeX{u^C>||xPZ_HCX+w23=Y)D*s27A<%oOh0EPm1OI=&>-%ZBRoicqf# z^_ro&zHX?pB}`#dDSN~4IxjW6&TkrC*S8F>>)VFc{T;*W{;uKmTxNJZ-!r`4?;Bq4 z4?-SwvR2TUxmD;$kpZZM*!I|=2b*SMUdYJ)f%u(uKTO@|k zOBv@7KDSDDc5=j?^k^*N6Ae{#B+1b$zVj0K5s6=9L1UFFI-c##wFOntv0NA%Nm5u9 z9mhOV{m`l^I)T`c=~opk&^meW7Qv&reALb{T$mT1A~&Dq92F$@brtB+c%0$~yj0og zR60MJ7_DVzuvT-jrZO%3Fde_n;}U|J>!w8>GAp}~xO1y&ni`s$`DU(sD9X-fWxNNg z4Ya7Ti?saIy83D~swI3et8c00tPy|CV-=P^s_X)0@pi9hy_9(RJ?Wy7J@2BrTt*l! z=|us0^v(Q(&)rd_p%3;Q}i^2Dt&_3(T8?QA7@^qg-ajg z;!)lMEEj3@(#M#$k>$B6eU!^ac@HxW0m;`;KW|44(*_Xtp;fy?X0osG`0? z^%H6hLv`qHsIoPg!U)-AEyK&LZK&b_hRO~MDH_{8Lyi3l{N;qw8b11z-lv8gUD|&_ z>{+<-*<3xdk!}vNmi-?S79A5mB9=XV>N9~4iH)~;x6a_J*5QfP8gxR2*UNoFs0^g~ z)RFE#omUXx-gnxInYRu^@shdkY)RyjoImhz8+>cS33LUaTxruIgD;6iXDIqsets)m z37?95O^AIxTm>tM6?u+1_=;H7cw-mAujhOI|aWo zf;DTEOh#r{DfrF8l2Zhx237bMiNsH&^oo>Msx+|j9702^D#;;BlHz(vt9zsFg+%l8 zqjDXnNOLPjoP5XSxu!D#_CTbHIuQ#uS>`1}`>L>~(=wLP=+o-}(|vk9P`Xc-gW|rG zT_2S0TNMV)ZOABkMbSu5daW}mq^JiB1|7@HLB!(thuKG&NptYJ1Vo#4D6#Cur?ylD z!-&mqztl}MkCVG#17ahuDTjLKTgiKoZf>CA1Y+)$X6G`6BZ!SteYw!VZH5vE$ELt^ zI5q>N!!a6^9^%FsUT(bbCV=7)6-_i~(Y6LHsuXlPLAMul2ZQEz1jV5&*-5CK4OO&@ zp>n$lwOdG0$TtQZ3;9OGN`_nqb1MQP=~J)`u_7%|ur;ylmQV#-63Y&qD%gTqBO|kI z!REx2W;rS|FEfvtMHP%;=@IsfZ`N632|{>1!7M@} z$s4p1D|&2W0X&)P#J!d zN*eQIVnti)Bw|Io$%(|uzwEkaoxM`1t3ryrxDa$q{{_Tqn0#O} zzVJ|6g*Q&L)YmrSiM)eb>1)>%FLC&M64h&D;hjf3{Rq48&Sg1XBMa{wmW%SvX1Ng& z8)vaxly@faa2;3gyz&KDt#_Wz)-wqAgb3enA~bsP7FEOR0)Z&n$;NJ>57W`X?_0NKTGl|aSlLravO~lg=?FsKj zmg5r&;oZP;QQq||7j2O1ST4%D_Wxt;zvHVazVC53=bqe~geqOJg%m}Q7ObEGiXd1( z#9m^608tu^SccSBg?x+p-TTq14q1A5h7o!uymkn*3pvTwH3CKcY09F(ybYqRiK;bgFDT z1?lIhJ14Rtk$#S{*-_b(BIA=f>!|c%NgNYCD?*H3j^a|0RYhJy(=SpO?GWh~MCJy6 zkX|B*Ii+wcK11Q`Xf98SESAetB8;Tgz33eAv&9M~@W2}pI}H5UDBQ2G~xiq{&H zS_dQ_)ffK?B*&^telu+G??zVqhedyC#3A7=;N)4xn`GIg_$xhfu^{Hlk&*8WYG_t} z73L0)>+tit*nOl@&LG1Uv;)LzCMSK#kuyzrl@!IX+e&!~i0=vSd#$_A58FT9Gr5>y zAabhUL$b2N=00pw%P5XM=RXiT5v_MAGG^^dh0Iw}9|?yKGn^FC?bO}|_bl{}nSDvk z$Wx(kB}Hx@P;+8gnsX+>co394$PmUpN4Or4dF~ehC%15htY;pXrhHD$9g2k%&(0Bt z6#M3psVpH?u5t} zIx=PAK6VGPxN<;lsJ7j;RQB3nsD~KhyG{A;8R7cFdTRY)W4^LB_}6SmC9l?|LiHcUM3NPFJK z-hqs_u?Le$XzW4c{EfXmsociij$-wW6@A6oHcLdCZW|KbrbFd+2dPHVaX{vL=qM)1 z&3iYBeStPIOGNV?A%rK;cFhve6vIjI7lZMc2)=!1D5$Q3`?Pm4oZLEY#XB3Z++A+P z!?YL|EjS&JqXTZYCg=4@kQz(QAI^J7GWA2ZCejdvdx|(GZpTpUkK4USCB`j-5p8n_ zluY0q#00r5av;UNXgDBCME$!zi3I=dXSk?;_ch|Ef5&UF&%gVS^ZFO{nhMg?YcdtR z9jca$w?j=LlhC0ilJj?{38eg|&}vBe0{ieR5p`p=5T3w3EK5XF97-a|C9^>qm&~G~ zznm>%yk!D6PVBQmHXedzLm}4~)kKOP`l=0-*se=sj755<%gq$Co`bawSt44`dLcZX znUN);DW;Q12+3)Ni-zQpMjQ>vBed8Tl6B;g{C_e?==c8#qHL087}ILV~jZJjia^L=Z!h!lDu&aNaKyOsOasWXOi)D&@;#+bkNhu z`8()or2LMbN6I(Ooth=0ZajrVQUxysX)1Uz75%whlr-`--@_JwR5Rhy!7d{N64lF$agvEwb zSooM_AGhp6!-h+NWImmK#-e8}dQKzGj;{m8M`tzhAkNpZGA&6Rx{=NQ)5f) zguts*nCUzd$4cbALNPw9bC+<`gY;!G>KD;%$SCF|GK^)wZ=DNTsPCdgsxwN z)p`8oRB5Q0#4R&6y`8*&LPEU)z}waKXQQmb$C5HS27Dy4sKY-LnSTuUKr(5N^X|G> z<8?cHPRc2@3ii2YNk{yWB!{gT_+2e`sVhi*C6p4|raFh~cWUhm+qLr2sb=^;L)%31 zPfXe5DGb`-53Lub{sfXyJM|ZkjM}Ncfn?N9{cG8RhYTA42^)q$stpS@Vk`ZIGzGJ& zv-3mVoTR+b5(K}Jotnh1BkL=(8HUXNQHNsWY3iB*E@(Qkt|8LqX_5Lp&|aqw!%jfz zsn!`tJ=MAZ$x|)8K9H<5r#AqSmFA-EK$4KmhEZTUY6}`*)0v5?rYd|Kf|W`8#XflNZL751tjg983-gTnb`(N-L$id`j&}GoPsk3ENzLTi zYDr}tAgPX&yIanw)Or+6Xqh}2mwBGZr=k9-&$sbYp8=yPDC|a+=K5xykIdfnRoInc z_bF*tka z*Ko?C(X}&0`J-zTRdS6H4K+9O9qkyqDFfno%V4gDl5VG`&vFPFKr1 zST$x1JTzgazCr33D!DBkq>iR2(q1xloIvqp#0er^E*cyf6rM;~eE!bCBgmXdD*hdB z<_t>XYulN#D2=>Nnn=u?E@omA<;-bfCN4djQoG=%P3ZGq>a031AGrZqYT&vNNIl$d z(ugg3UBrrQv1=*DiCWJ((lv&{%+U_uYW{mQsfNZ{d}q*H+ZbC$x++S_ywm1)r5N?B zB3+RskivZd6T-7@a#@y$rnr$^1S2W^x|S1i=C_{+@m}sc28XhoVSNkM!~TN!L%C zRIR405$-N>(f)rYMQ;BOQuk8SSlisvIHOvwMvBF(qV zD36GkF&r6Z9-|neY+XaOdqyrOd^Af$N2bS(eTjHIV5yO5v7~Wc3pre?VInAbj%0k; zDtVUD_^?&-Jf+@YtK=Cm6C0pPUZfPSZjOh7lBXz~;C?`S2pjC(=DN;G3qPYs3|JP%q96jf6T;UJncJxyGF5O=b;_JQ^T+fuo|wELIgyv_0_S%0$> zvKG4FY?t-bO5$PYj_^wx$1km@nR_pmdghmq%)J*&k;No)?!{7E5xJbIW+=_AWtw6J zrl*!%6>BTWs!djr(*f&AM)6TL)j{PnxjtbrwY@TF>m9M#PLa0W4hiRN0#-fVdjhFR z*A^P_;kpr1*G$6~fcUx*(a>BwMg1g&4WA9Ek-I3_onr5ztZvYk%uF1|w4P4cyvCh4X ziVS;vjbxji+olMl>oS=9oAsr$p-chVgY?$HJ zp5L6xpM1J2Ck?sU%EtkMDo792iFg7ndZ>0cGBd0C%MpAVn zzRaNF%Po6_k+r_kqN@~2h3&33dL6DYY`bd>TJJi8+FftZdN*jqUVR9#oVRgTDAeV8 z2a}S|izM>x7<~}s(sD{P6u%@-k^9!ko;gAEswX$rxE(5$s-axExwCxvI+ic-5$Qy7 z`k19N4N9dBC!vOb+*H*h-FF!i+h}`6xvXafMKh?Do%M68v1l4)**U++ju1UNtryu; z(Q{>LLLIbf5JsM6kxt6arZYZ945Djgmt=~L5*bDxN7f>yqOxNttATGFz2ij|*#;|W z5_@g|gQA&YFDg5MvI)_&b41TApQ>D{)v09Epij5+2qR9V9))4QFxBc5k{tKrEs|<= zvQVf=E_ISnC{&!1Uli0|x(4gbr`qgXxAJ~pxlQ1FDsWs@#k1~FU+v?gb^Y-=I_?6f zs&&R&fmGMLO(S-K8)+&UzAA!{_8yydiB0>ollCsAMZ-siiy*j@Vu^d(N$#LX9zj-g zJ4G^7YZ3d+eH1phBV+0T5eKM077j=&a7u>p_Yl!=ZGDApH;td`_9wO+QLe zFl^>e!)E?6Y;oohZMnDzNGul@1BvA}9e`xjzfDIVS@mzz2?zzp zHT=VYRLtyZ(FldWjIG7=i&Bj# z7v4wByOZs&&r_p*M(w02wR(jNKV}~4UxE*wlk}cF`)5hm#TjJ{r*@yAI5(4}6noYS zIX1j4T=sdz;TQ*I-c({c(rfYi6q{EUy%JE$W4@_3$Vk@FIaul~v6ORS_dSZEyGQR* zB(F=#GK%qf)@o!1mwHE8wNExFpA4~TO(J&6JP1E#0<5U>N7q}L-S2eejUfDheB>b( zenJsX4$Dl2WnwP!`{+UV5y{9}OZXv0?xZ0Imr)dX)P~C`;!{Rj&OT=Jw1T%BuA&kr z7TJ-m_*=0Rm3;ZdBm+-kMhi0b_; zdam7|)jG=JQ~y?LBz07CEoGcLIJx{HvPg5c`a#mVrIBZQ8@z9~~fr64&k}l$h zk`gJBD^shgL7O(B9r1aa)}kGiwWEyrxlRh&v^8Rd@yjaKb8raamg+HEMZ zNLAZyL|M#cg|!*YYZD`nT(cFl>n=82yXwB8pu^^5IBU+9xI;h6qK@lOMOjWebm%F` zBmV5LC1ugCQ#M4>Ph9D zV9cOK;sj&5r1wlPrjdy3QQ1kxk)(1b8Anj;on*j0b3hvR97V;%4-IFLP5#hut{B1; zF+34St(cqyBopxTJRq4^r%yAe_;icTFsSHEi_S8r)!7!EW6`+=m7FJttDp0Ytj+lr zU0~6L7F}e~#Rj#$L=ddBzSPLtU1rhc7F}V{l^Sv4dK|ERtUCK6$5PsaA;YW(g!Od_GA6 zzdAXkHiudyY2;=QC&3dUMIy%EfX`VPW%DC%<`hrc~N6A@$xtCJiTG2v}m6@a&&3r508H z22$PnAE4G)UkJm0fmF8+A2kDQp+@w{@8CT?`Hf=wq`IYf@^+46)YITsNyW1Q6YHl< z!zq=zdaN(nu~Wt*^qIe?=5`Jh{sqWC7JCxvs5k1<9;|srwWVg_$60O2a!o+aK}3d$ z)}#_X&T2(2w&`3VvgoFBvB>-%W)xY@_i6Fgt@Z_3lW; z+*1f0@}*zjN#8Y};wFybMpX2abi)J#LC~E{Y{L2!k92WouEH^0M#bFT)`Q|$Z|f?* zXjCc*lFnGb`j(FMUQ|Z^!3@rE@D`LtW-rQgPpuuDy=*Sp?(BuyQjr0mOk?z;+9dT` zqPo$RZa}>tHINj#Ks~<=w2$PWtWK&*tT)f$;W|q(A!<_Zn4g|(er6u?4SCGp?3lkP z+5D|}%-@p7{BmtR3|9cD5$AItHIeuNh$9Y1mrsBTny1!@ceL-`5Z|@MY+)tY$nb!f z^H&r)yXJET!kci}YRJ_v_cM^n^cNtN=~^H)p9~*U!yL2!9#TBHW>>3gpzs!~%7C5H zA4w&Y42xqZ-8yQ-OZOXvjWv_%T2LkPQf-QuLDmeKFl^@(A`KkRX;4ST4@X1Ptbm@Xtnl`E%nr_DHc0J27R&Cle6BE=?hGY0r5Xh!A5es&1*zmW6PY~JkUje|Ac6RN5Z`v9pzj2EN|u?I~h6k;!OiG>(T_WxFh{h_MH zhJ%0@d367NG?0+>0pt?0wskwqnw_Z4hT$ZQn8Cp`k{t}}*m5Z4v5ZaMtj?yvs}0r* z&GdWjhJ5z0Z8;_!0W}p+(}AQfWoB4ZZ&8CqGc{ttrU2s^jc*|E3%IBEs+Z1!RVclbK{z^X%-kW~vdeLwOP@go}qd zl~jWNPbW9Y4&#v#HAtOljH>UF>~RaL6#KRFyW6SDD4gI^znsjZTn6>I6_lyZ0;$GjU07=?5U4bNR zn++`6-Le}Rwq$@|OR5Z8GSIT)ExWH}_cLtf5W{8;HEiZE!-g|})Z$USLOA);U}ZB6 zDrqz*(_~SzMJ*Q1QYaOc9A#u}W*gLgjzO)Dw&)mxO8#fju@)U?P@CfoYCqSYk`pxI z)9Xcen(aFANM5ncmkBje4Gn@9NaemcKTmNy#Gj*3-E|s&ILM452%gPqINhL%!&UGy zxrE?)ja+?0&CC`o0(l3!*QsF#as8&jX-trMRj6t8P51y7^NfH;b1=`Cd!(>$=xi}t zm!F}FYseEtrny1-1JSLW-hjI-8mHIrN3HF1tUs-#mr*0~+;oeQeoKl{KdrhMADbYx zS%sThAgSLYjeWIhUjKpTer|Eo?^7l6^o?ZjCh1|rs`nXn(5|tU!XW*&q*Y&7R6EUW z96N%@-n#Z1c+oR?vE-*qJelC)cws7%ID5oV+3NYEhZQlLn>* zT7u%QD4kj}ZF03d+0ExTZiUny8BTz#6$_DS;S|o_l=7=uL_j<=TK%dsMVU>es@Yrp zPG-{d=&7q#ziFvka~#YOD{(KiZ5_1!L-Zpa;pQ8TYy2r`lt&^wm&CJMblQLGVPHV> z&qhaU%AE%XtvhD<0lBkUm^zbJ*Us2Msj4H zK^oJWgy-}*CN;V@#v;yoZ8vTS(r1!Reny{8I_VjGwlS@Sxu|LOi3`NI+u3kOR*<<$ z#5jIv2DIiNbG69g-RBxg8=x8M64z56>sHr_Zf>`_PITklRMR#kdTgag3PO%ZMJp1^)qVFsGePnduBRq#k8Rr&K zBRQHL7Xx|5xu-E28aDh9 zNOk|!7X4&UW{p85KN}SOV$oWKaH-uoEBn==-wZ1L-J(AX3jZ`H^Or^(MBW9)K}Pk9 zd(Ix(J4()N6VLA%zO7k2ls)WQWIZdQZ&E%H%a8ob*p58vwfcQ>2_w%(o$=o^~FqJD_UTsie=HWelhlWGx;PSTIbVy@p5RqAQT8W=GK$zt&H#=5OFQ9k7EY z(ZzDf^+T%N_8fer&4IEO`xK-akd9igVZ3423xd)L75#b+R36J8nGoe1WsJ0RFV*Kg=O;u_Vs1vjz-9Hjdz zo!aSj{B?jD{2rh)tf;k*bU(+Ait%ck(sFO$kTvi3TV|sb1|2&%#c+)G;OH$#Ifh65x<05Av; zE;8ir$o3E!%Ie5=qs;wQG)RpWH5AdR!42afG;Y|N3Q;$VrKlmdx?@D1Tiv}xo?G30 zApfuG?#HyT>K-7nXm$6cELyewMJ-mf$q=$?_|Z@xHJr^cD1Ed>9Hu4#;~defT5J|M zWAH?ZoB7*^&D=(E7H21rnIj&z5mQ6i?5ON;(Uam^y=u{m$_^7fDZkY_RP>^$9KnlnW+CY&Lf zu^P-0VNO=lwAjfCo$3@wRpgxqq#|#=LFw}~V&t6!?1{V+DfUL*31nhF`Z$-e*pEIQ zFM84FIZpJVvSURr8a@9Ly{POM$`T@K9=YfXZ0apKyp^ZA4Xu8WFm8Q#F1EgN^t_4yrdDj7{`Ra{8s$p-^ zh|PI1aPoZTBC?)m%7r3FkF-w!^^CYcqvtn)G`G`VuTme2?1`YKZ^$8H$fc}1$=}-aB z9_l-!;+v&!Q`nFjRd0zLqh74Hy|3*zIZWi}=2uWq#aa!dLgOck)@a0{egT|N)Xz!f zZuhRB*xSmVk%`ysQwkfr$G4Vi%5!?_OH#=p!1Vxz>>p55_52e^)$=cl{ittAt$)-M$LtM#*{Jk|Q0RQ_t2pKLCA!c?sTkcq59U|EdD@1o#!V=^9Q z&QYS!WpN$a)F_=YbV~!SaLl0tm(H{3mW0B{Ubt94ImbHxXd}ZAd3aYGqfJ|Ap(8)Y5?@20Njm;_aJUllO zd2VqlMV?#S-jwGn?p9Dx#oZdn6n6lV#mm&6LQk3ci9EMVeMO#Irh$~_E7OipP-Pkh z#4?59&I(~yZ5JyWt`P^}LBKTXaq#w}_$`rl;c+{%@v3f1p=VWU8&UQzcJDwgv0Cn9 zcPDDv6*9dJqQ8aM9h|EB7$8;mu?nH?dt2E!jac{HfRigYl5D(!BPjG#a92_GS8z1B z|5F9`pk_h^4+5tuco>kXV6{T>Y}ub_{SCPvsli9C0RX{Ov;f89>ULqSz? zE|96@|ClVXlE-MHo+0LFQt?X8q0lp4&K7xYWsVYgZe@<6JYQwbgo1jDIR{7u-MJQ> zXVH9%&bR0Sjo8Mg0T)bcXu*$}&8T(0Cdkg6pO9|`=27pc#+nB6TRzTf%Bkdd-maR< z$k~+YW4%)>JE3+;WOAqYlcfZ))7>Xg82z<0^(K8H3As|-94@oVXD1lSDMB5-p$dXC z$auXOq|PRn{fff>Z38FH@jrepb2$?8-H)EUL^4V8!o`;Ld*LD}M$8KrQt0!-WnwM* zA)b1ZL7{E{sp9-5AQc)5EV@}E7WrD>oDjZ-LY%VpeK~Tq;Uev*TIMQp{+aHTn)0N& zLM%4%IGQ@J>3paWn9nq>r&2=u-6*zOnx?u2;`=miT0Ng>sGg{s*^4uJ56M1e1w~9R1{wZMq4%$g4=HSG9oDZvPuVYPbJQAXz0$zYWBOWCOhd9IwZZ{Mr+r z#s=YAWTX4+`ZLgFU{qeqfmB|f0;#+{15zuJKLAP4q<^$%wMNYUU0_}>fYYthnzEaY z>H&ezuHGRp2a~7C#elZ=@^jiCc%O8v8C3Cu)JNp_MOChOy|OC4g9n3f1$A>P$^%Jq zkm6_X=Ap61ljl$6bQ#*W<_klf{NBmElL zjUS5hmJzvWBq&NzLk>I1=ic^^qI`L+ZmAOOAYCH1;4B=qF-Mr1VF*#Mo-gkX33&(U zj%1o}@v&>Bh$omk`x!HxlKn;mdvBbNvx##yHoe*n%$mRRAm=#f*rgH2HRT+dNYCPK!s7*l%y0PAT`fBj$c(Jp1IG)vQttu}CdY{8=}G+?gYt>Lz9Vr*>Y+i0QZG6z1%<;XWN$Ge zq7EsJh$^Il^a$#>m%O5iyF;d`xF?Vrn)U)xRU8APs<@9~)8h@B-dD41t=)hNCQmST z0^1Q;O({o{jkSxaHY+riY`j8yQU z0I9mp0%BcRn`&TAI56FEmX{CHQXH9eq=!;Eh41)yov+5Zd%k&u=4VIc^V8svsE+y; zB&KsPb>b5Q`^Y=UvXKdbH+rH%@yQvYiCy=3hf^;KAH)VSlhVSMdM&D3eD zC)G}CuBpaGmKhw>VW!j+YrHXsn{18imr9+rGJT{?nQOH^nr&{mCs4t<9amStF5=aKr;u|h(Hs<>BxbW7f#_(8kldOL z3QwTODHF72Q-n8gtA*%24>F0~%+){=y_su(BziN~0!dHJ+-lj|EPK0Q!+U|$n0%i` zjQ4YZ@$QVHVX@l>&L)9LcJAKgS(?e+zC4pmZh|u?&ecAh;>55&&9eTmpGQ7l*k3>e zR6rIP)S5u#!|;p9tLr~K>?P6cW33*fF15Tbw&#m&oYc*YNj1p~(pON0FX*|Mr!Nx@ z?;<%Ij|E(3vgR>rJJPXJsfSpQxg${n(exllMiX2A0V>8u=Mnh55t+Nb?_?=p9863_zNI446g)|Kn}mQ>^GME*06=&0m-!{h2Lw$sw@YNS4EYO z51KE@MxGbyc@JuppMs}WgHcb7H9)HG{HzhP{E;bR-ZNRM)g~BOr;RYd+QbA<{KHZF zJ)dImq$ySkNEIuzsL-OcM$Gvi8szEx33G6gsT#kjR4updGJw>RWUjhi^KYY=aEI?- zhWFp&`=_CEesZ}M(Gmm&C{uoyIWMqnpe+6`=?o;{Qql!T!lk4ukP4SgfW!@%O$`c5 zE$U%WnMQO-3Gn~PA;m^9!68M4_d6tG=mdwfCZ8Nbn0&XTMm9B{q1U0}>KaU$uLi{( zsS~|ls)d)t7Iz@g)F@XT=%=q-Z-?&{yOD~#G?@83{*QRv47`f|!9Xg^cCctCi-uS< zR3rMg99S*#PMqxiIN8Ax29;#JwGL9-k>g}omWXv~UG|eIFyyG&x+$!zc%ZnWk<1Kh zyV1nNf)jas6!VpW1{u%x(i&kn21t!QV}Te>Eb<;q6}?qXT}!$<3GGDPS=1eYEJ{$g zH|b_PK(k-JWxA&hfb`VN?1F-VxuYrAZn zP3P64?&X-utK+Gb;MEDng!9N4&bCO^kWoL6E#J*FIU4WDByc~Iwpv<)HwVpDG02() zslz4T=E+#EnU3qBnsCKH^@N(H+U>S>Ovy!lY_#kWRrgdgQbwHA5*38ObO_{~GBX=U z&3)zowJyNWojDpvjRD62DHk5E5gm5~a8BKH6H48JI%=3mOLpy4s&OWvhE4d$**uvd zHtO)Dee}vwwK+14Y(lFvy1By>anIJ1=k;m&8X)zRG`oLGkZLfb<7F=Tsu_m*Z;(EU zT8K?MQILkPh>KRYT2gVP{TF?t>l9Za{L0-WEiCsX6U-Fgz$lH7VC$!3I= z+9q<&f}da*@6B@agpKa3sK+ucPagFRx$bdz4}>D&iFz!6j5oh{)Jf9eXaswt5k(>cas{JsOa#-+D1U0#>oLXB)8?IcDGgg28-^5g=NPRZ#>>0;R- zOShitzqeCA!B_X2VmSRvjjDHgaxrnNDvmYEyK|KsL+s0N%p*`Tj(Ly?%tXZL5D!qU zCm@daVTu!q{x~_jdveU#NR8&B@jO6=&w?=-K20sNL~FgQmUfnq)4#c`?t@T%8;bL= zq&($ZOnGiOpQISqisOo|un;j+&?5*IQN|XgM|6XTYlCOVB-H9fa^70K3C7gwHEMA- zoU@4}pQ{G1x_o3yNb#>oF1)cXTeiJqV)F)>SlRXlBNLDnAl2U4PeAHvwMHQKi9TzT#CX9~%`Fb}<7V88)YJRq7APW6iV)zj@s} zrvZ}}J@)^)<_~w*i(L@h3%Fwl(GQYi6pP z*m7${QS=_}5{mGFk`ofe6h&9;izv#zxHuILf(*I1Pt>G3NVO;Fc}mb*oyoZ?+4R;1 z6uNKs@YE>Cl&AIrQl1(Eq&zhiNIaDpZ`jPfhRy6}*usN>B-Dxy(TLs~3Cvb?y5)qf ze6Efl5g9OsL(WCm-G#yXw>dzgpMI@5Y^3(kY;-M&9P7NdVx6cJ1{EJi21}ofb$F>C zSmneDSN^dgP98r(!_6TZM!fwA4yp#HMx&CajDuPMDF?L%5(lL_7&hHeSZpe$J6U!k z%WiDhO$-}W7&fdFmc4f~!=`&1Hoc{=wA{zAnf}6txL;v_ut=M!GHkfDu>29qZ44W3 zYuOzvyQ5`yvh3Hwa!cnM%YJLv^v}X_OXnBErq>!aOfR9Ym^K5Xd{qRbeAPx+rfqB3 zbUVX_orGoD&V~)U7`AvLVUf0YW5X72V%V^UuuNNK*s$EN>4CyB->nRr-rBI49f2f> z(>qx-)S{gYD&EDS;RdC5H7Fcm(MW^RyBU-jWl(ywMY|hRvWG$GJvCxCI+W2_(~M18 zrz1Vcpht)K7cMVoYH7rvim#Aoa^W4X@>u-9ks`HsaUL}|5#`;vFu|FO-Y`3I3-+oq zDm2$O<8n5cOgaY&>=f)XW26B$Ro70^zgys#x>`(q=~1iZxb7~X1gVuqO^W1ENK*l8 z4AodKsIFmB(s=s{9u;r0S-fWK`s* zZ9)a^)mR(!YxO$rXjZ(c@A#1$~vG&g&lo0=T-Eg&`z zzVNG!@y(4&ylz{N(9M%mx1J_dZqZHNeT|Ag?;taf3eL}wMFwTu6T+>1IDb21Ctkqq z4dE#R(hVWa@<-BvSY^^h2(;#EAi)$;?LpyBq#ClnspfXR!tad1+=2v!-;?yU zBM&$P>2;*l>s_QccwqfOiocPl!sa@RtGL4HcS_?w?V9;bbg?BH(f!jg&YNa{$Tb}lb|abO zQ~0$gRkQ(BrngLMu4|Y!N6$DGHFDYxYc`%%e^9qu)P>YK#E zK9WUk6R#J^Zjfqni%1SNS}9_`r?szk{p=pAHc?4l4~$OdS3}cgBy-!x`NG2*$` zB5JE!k~ifsySkd|Mb5fqlBt?gY7a=rY@qa)y*xm~T&drhXeMRS$x39Bng$ zRqi-JIw|XI_PC)zW{|^SRH~uxGu72o{ z0Yiq2nmz(=^27M3A6eVHvw9I5QQx>v^Mvt@Ewy~X96I#CVPkjRS7~aEQDcSa0B zTkTslbQqsxc>2#>gDrq@ECDh+P-hs12LW-4!)e9-WUVuum$CgwWSc_0kPHoieJPi~ zn^-?%a-F+f(S+QBV7yUao%MT+T8r36OnRp+(z@WQcubuF+{K6U)}U}`2!v8qXO-easdO?no_ zgCI458gj%~&#`QiKPm4mldJ{*9E?N85!8tebrjco#CVRwU&n$`{yGsz`RgPg<*$>0 z#9xK;3|n}bVGB>!EaTu9V7{MEuW3Be?00&8oBZgg8fSn7C-Th}9jTxp2+&p$qOZ#>6h&W`n<+|as<|XN-<0=hr=4US0q#6S6fgowK6-k~ z>Dn2FklZu@FJB0`^73Us%FCAnDKB3Eq`Z8!VGFM@Y~i(04_kUc`Vp#o=loesMBVdHQ%6K!22xS? z3XqDrSAitzir+JA@%x4?US`>kEc>x#Ke6m*mR(`l&n^3vWxuxUH%^@}y77IaPPs?s$*mQ3oDQ$X7g;HT*A1!0a)(1{3SrC?zjy}nQ!g2}| zf~rDs-U#YJ&JB2Oph$!u;CtofB#ZO?A*UNy*nZS;*ZZ+HqBbFlQUkyZQKuPX{)tKF z$Z2yLrjEnKezi@*YbV#>EorDTD;+v??_s-+-FYNun|tp(a_54RGX)vUHXp*wwhG4h zEyvbQ=3C{-e4D(Pk8G^1J@UV@ZiTELM%LTvtOq$+Z=WaY!FjXZy}q%wX2yTz-4S^| zg1mRoc@J^&-YHMsL-Xdn%T&DdHPw!2nKtde3a|+Z@F)r}Oc!9JEdS|-EPcnjFIQg216I<|-T+>`Pt5$z~;w%iR2@AG8c1hB8tZv(l zR(GZ*H;*xmo>VLMee-FmEvYZ3_MnctRwzfT#zLxk^}#@9c0Y!?34y&oxFM6_#OlQ8 z)}G#{4yT0bCfC(Y+NFN_^!mhRA3JR1Fh={_UYPO2^9$km1CR^f;Fy`$U6UK@r&sr% zz16P$`+NG=|6>XE-g$)dx4Ea`GY6F536x-*D#1Q1fw=bn-_>0o87)FamhUr`FW{SI+HF`z5G-lg@dTlXFX+oR7+z^L}-;%{*q7 z98RX@Wyt?&If2__w437g+!|3rqtqZvCb`p?@_oIQ6F9VokSZ5$qZ^Qo+CVKGd z2l>Q_jUN=AKwj>O&Ax5mlZUw?HnY9!Fq*e;9)QN02S#y7cq4oONcrzUAmzV@ zfKQ4fxQZEKlrG5%XN*z9H+2<_#yk%Ee_B+ddZ`mJ#SmQ9W+Mw_!i`H25vq9-!3<}p8 zlv!s`;jbF87d#Fek0#Z~sniGLCe=5?rF1MO1PrC?P^G!gV-QKDQeRMIviVJ4M=hh& zI90~J?Q(5N3}t_Gaqhc_=v3-Gvb7kv8=7#9wqwN2D@Z*-HE(cZcawp=gbI;Y5eQ$% z5n|AJk;0rl!cEe`S4cI~OsREuadqEOs~WFS1IJX<{xRc7y~@trkRNz+2}GYyLa$OE zl;Gv_b0(6tdMCjT>`nHK4yz_8?+;XrR01{-Xn#Sj7D)=0nm`MHRG_7RRQD(ZQo)ke zh|T;vtzwjwA9iw9;C@qbeE`KF{v;6_WmH@QslUmIi)=dO0h~Yn$8shwO|fnvN@RU& z$4=uURI(KmRBvkU6uyYbX4N&-@w61K0FhPLl>8iShSbE!8Nm{Yyd`H5T9b{pLu)o% zA@c78RylcnAT!FW$29!-z?{{z?*kplB;=*Omk@(I;nH6l#K{$lsx)E?l>;XnoGc?X z3;UnWwnY!hTB5R2(ZlAYqqnK(MP-{%#{E=BZ)3{1o9f6m61`~J4Mi_1>rPp=H@OEk zHxSDAu?GpS=Ymupa#*ZlVN~=C4N|=+j5nP0IO#w^dUGn+lc&}7SZJ!lPw-`p$o`sI zcnperQkz2!-}c-cI{7s`gu-@EP$!{w0^*PVhT#xFDS55jng;koA!^MEyPUDm+=>d= zIgAA7KnkhrI%!)96MQjZ;hDUD5j5Qw>w1%+3iIxPj>r)SA)WSKzWnhw_kNo~^& z7R@xMxY42}gVN0wwHQ=9%c7$!nr%>ejzPso8x$TRNQK=Yz)AOY9ZW9qzOI7|8>@a0 z97x7)e=E-n4T8fYL3HMBLS!Pjqj1L9Tn(llfimY$O(2UMgc(O>Zxyp0c@jza!T7}V zwN$B_(Ns67wwg-r?{na1eVpmJbT2lb7Kj#_LV_ zY2?-K4AFgVzJ*6fTJti%*^#`eV5Ct;kkri_+50)TJ;IX{YO{ohe_34>il@M;iu!Ya zR4AScq@w;JAQg%i8&rIWMVA`X`Z9ykms@m&MOPYBe3eC48+bruzzlJjc1NI;u`J}A6^s(CuaeBmR39~7QPp>*$f z4|PIZbpZapD#Jdvqo~e+j$jIdhurNjtj6X?fYejxQH2nMk7*f$@D||M^XFy}#jfF7 zK%ws%zMDwoM9htpCS5KN1hU^EIar@5D6?5~+7g6J-auwU$m?w}|>^RcfE zYP5J3I`T+PzX>GI$n;x4GFoKbH?qt!BMVoGj1Rakt?X|g<=B5L`q!YMf@d^a6c`ky z1o5RkG_rJ|LB(l{G6toKEGo9B#Gv9<2DNT&P;ncB(rqnjXHao_K`24%^^B}t2a7sd z)XAdG7Io2xLGv`~8NDzwHlJHUg@n=PDRPP9+G5N4$F(OVYrOu-p=Iasyh!dZTO@QW zcAuco7rP5dVIse2|P#{+`Y=TyP1Gu16K zn(J^z2~&LY8mNBoIrS|8`YXXWT=>P1q~-tvZM#|E$<^&G{~PPBp|-lU{|Y0zYg zSJvgESnk@{4LCH8gKx@xv9iA+dGY7M+}8y?s=h{22JM7l_X{dGUd$PGgVd)~VG-k3 zhpDS^J|mrUvlxC0(WFlDz8Om8{}^C{%-c*Ng^qq=B9me@OW{DxVHk%w-lcYvZ@!m) zkJKDR*?~*uH+l#U3Rh9Z_beG26n-U~2?d!z1%=;G=pFU4Go|dDD*6cFgM}P5MLQ_^ zQHogQ4y;8#h)mvj&Fr-3JId61u$6r;GB>T7!3C{WlTmNsM!VI|l+ALrgI2##CY3?w zzymiMeXV{H^++LFtr4@X3H@8-?b`Bp$&>!u8c)fMFr=wzVq94MB+mYmTzlnCbbTTw{iH#WE_?_`WLKRPw^1V0;AW`L3{>^aLMM zAqjoV#$<5f%tW~E`kPRUiW>1y)4>>ed^rct7NNI>iSgJ_K9s@)4-6rfG;YiHqoW-2 zBdN{H`kZ<02+HD4-<86IEQgaz&N4{tK?OW4@Lra!bdcJM;tA35d9+r|UbAhwNor3~ zcL!HrAU%EEy_DtZqBQqemRNJZ}?i)t;JY|#{prfNjr?+2XYhI%1g$R>DjoES|ETgC_KdL*<|U8e!5Y1ed(Sl&8X z5&!63#f=ENdM3**3UF4zYx9@6KFW#?(43X`6%Ef1)UTMp9aSuS2f zv8>K>>SYSV?d?!kPng9(DsG>$Xo*EnTeMUVq9=UDqGv67P9sLtt-$_>x`j+UCT^xs zehuE4G^?OkKnkaJBj3O)>Lyb8;^i(X@C*CuechEO{YHPMWyg8gyDdB1!`@-pJ#yGc z6YGxd%HaApkX&4!`2FBYvesMR`y+WutUjz2s@BJ#pZjaQ%9PXPYGo=x~mW#Fd+@ben zORL}fb{=*wk%~vjixjFGzS+NHbBq@>t1s4zvCorDjuqQJ=z1Sfb&k7p7o^{#4CSew zFa@)@?5r>SW|lx_wFGD7pNXAp{~yY;tDlR|oe>5_D@5k>^`SB?#hKNw$+(Z!wz%5s z8xgwdLCGr0CSvQg+WxSa8jzZUl5a)d%@V7Wt>v#x+qRg5@{f}2ztm3UpGasXJipUO z-3)x7>GV+bNk8H_eAYYy(?DuvKLe!pG>d>#oEB@uXbOPwdz>?H9VZ>9f(G-*0?N(( z07^PHdm$G_OEqSO$hHks)swfKHXMfSHDVU6Xv&jC3FZHp1v2OeMKwfr(q{2>w?UaM z7IihKxSK`m85Hv#CX;2DR&9QJF#Om21RmuLsPXXS-$_ zaUWN!)jOg7;dvqZB*AH=-}a(<-JKYIi0jDNc9q# z(?22Gg0f-5_tqBl>X= za6vV{`IyelQq`mIQX2%@lZnSe5Nt=W`smt;6*`!H+)>y_R;fD`s zLeGID+_EqCYG`3t>Fp7?X)MyIp+(+(#_4~C;XXk03v2W+zv1<6*YC}2W6NAK&~9pG z4g33A`$2Fs&7get&@NsH64N8?0Z!WeJ&Lm>BPbrC6~pjQAXDmtJxL;EtJcX_#lsSn zVZTNzhT#MtV}Ej@R}S|W8|->zk~YYk_sjLl#KiO{%oHc>WRK#m#w$l^#W0)(WJ-O6 zCrP$!(sgFog!N9s>3I{PU^8_xR;nRU8H!C>F$|l5Ou;_ng$dpuYxEdf!TS^B^$iAR zX@ku9C7Ou_SxaJiq@ClWo$XOvEg3=aSgnYIoj|74|MMitmQCC_*Csr{NqBtTgvjqC zos5+_F;N+cr)b46JQc_k?2JTrp6oGpyX(%=v_a;4bgnz+C8kGV&UDhA;Zc0lxbs}C z7>4tK)cAZpkeaDn0L1Z`MK}jIKE{~x2H}Nd-D89(#Kn-Qr{pC-#v>Qyu_NmTm+558 z^wLCS*uO$6hT)Y!#{T7=Bn_K5VS2SrM*CMKD#QM@j^YkC=EUuP8)_d z0-3U1pO}P?5hPonld)_!B`QPl7Dw@BkKzWVAh$V+w|W%++?cL`#XB6u+dYaO8^yaE z#htwY5 zWTGc=N!dnJ&OIrDimLE6razh_>!aeqDQf< zvG|Ik_;NnQ*R*07z7Ax3@Tw=tvJIU!d{ZZ*58g;rM%CWdiedN;kg@-kC&^8&{r7Y- z+J84u8TOZH#W4H;$k>11lVqlA|0A7@_CHKihW$^pVi+z5GWI|ABpKw||4b*N{ZA8> zVgGZj7=~W}8T%_dNz$(UFLg57Uzw;3`(JBCTvrBU?0@A+@_KiteOKvZwEu0QGVFh^ z6~picAY=bKPm)Vq`>S;_+W#?88TQv`MO<+SWbFUsNixB;zg8!s{a+H5VgFaH7>2(A z8T;!zNlIP&f9Pbi|9he`?Ej?|@f%)1#{Qq4B;Rb{`2Sy>jQ0OYREGWFIWs9p0U7%R z!0|EuV%L75PDcA-qB87fv|<<*0U7&gPm-_JcgkO)lhJ;0qB88a){0@+2FTcNQqMEWt-%V%U|HT|Qq#?B!p)t8m3b4Q0$b>0tZC0gWhnO6ieb1Vkg4f{ z3s6(smSC5?X3DNoFOQ`uZZ-RgHSTI`t*znONyqN>w98nWh)+Ey)-_{i)LBaClW0Cj z^&`iWX01^#knqPi>^cfpjkbfLS`G<*1BJdk#ozPR1(jou~}O@meuV?*}Ar zt?B)N)cWfIKx$R-ARrby3=h_brr+uo=@y&vXB~n!yZPH;A0&)FnYzf224y2QNFPY8 z*z511keMJ}(kw!!%0A<#U>;su`M>)CY<6V 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 |7}hg^gP&Q7eIp+X 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
  • ygl>iJ9$Qb?&_>T@)#oVHX9^8TdbI-Uxxo3V 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

    u8-~c~58~&s9ehJBHH=r@Cwqebk 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

    T7~2HfMB6mm zblXDP5?H`&x9za)vhB9*we7bZv>mb?wjHq@vmLjcu${D>vYoM=wVk(Jv|WOQ&J|ed zl-jP_ZrEqwQntW9{SYTOYF<+%k3-dEA6Z7tL+Kut8||CyTkKoy z+w9xzJM25{yX<@H`(R0S(0<5%*nY%*)PCH4!hX_z%6{5@#(vg*(SF%pV!vhY?da?1 z=jiVk;27u_>=^18?ik@1=@{)8>lp8t;F#!`?3m)1>X`1B;h5!^?U?JB=UCua>{#kp z=2-4n=~(Sp<5=rh@7Unj)qh$2liBCpsrNCp)J)r#YuPXF6v&XFKOQ=Q$TR z7de+WmpYd@S2$NXS3B1_*E=^jH##>tw>Y;tw>h^vcRF`F_c-@D_c`}F4>}Jy4?B-I zk2#M!PdHCGPdm>#&pR(VFFCI`uR5f_nh~g51bF3Pn=Jk#je(_ zHm-KA_O6buPOi?dFVX`>+0_s;2P)}YC=7 z?waA6>6+!5{{wt=33!e>00Gl<67%l=UVUD;M(ZgDuku>)Pi!;5z6!>^kB)<~rdz`!Sef# z>mDq@AG#j79=o2pp1F$Mt=(0@4D}~@4FwkAG#m8AG@ErpSz3m+vK;+Z+WhtT8}c{hZ^_@5zde6v{_gxe`Fr#CGyhip?fg6Wck}P%KgfTW|0w@){*(Nt`K=4u7IZA= zRxqVtYQeOE=>@Y3<`yh0SXOYP;Ap|Ig5w1z3QiWBDmYzmrr>PBxq|Zr7YZ>q?L+ zaHZgC!L@>tg3^K~1y2i}6+AB}_O$V|^|bS}_jK@d^mOuc_H^-d^>p)e_w?}e^z`!d z_Vn@e^9=9|@(l3|^$hon@Qn0~@{I9}^Gxte^i1+h@l5l~@XYee@yzoq@GSBy_AK=* z_pI=&^sMr%_N?)&^Q`x5^lbKQ^=$X-@a**L^6d8P@$B{N^X&H=@Er6U@*MFT^Bnh_ z@SOCV_MGvY^_=ru@Lcj-@m%widTw}bdBzrwFPvC7xo~RX^un2ivkT`I&M#b8xVUg> zA#Ta6DO^{$p>R{-mcnghduC7JzQO~AhYF7r9xFUic&hMB;km*Kg_p>-O=;n+!aIfc z3Lg|cEPPb>r0{9s^TO6O+tzGXvvWly3Lw2 zPiXZ0>OaiN^XIVP<7ca1uXa&FQc`bKDP}1@HEW#Eh`!c*@Tl5B?m!h?W+RwjRy{fF?hq~#1CJWZl>^Mb8j{3np`M8dmU-v3}3{vXa< B14sY> literal 0 HcmV?d00001 diff --git a/lib/SDL2.lib b/lib/SDL2.lib new file mode 100644 index 0000000000000000000000000000000000000000..57ec031835d39cdbb45301a482f672fd39867525 GIT binary patch literal 20154942 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 z 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Π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

    I`ck*JR=Ck@vi>+JY^4Pl7Oe<_SzY6VZPxw7< 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 ?AOFxa?uebejvZvNaMXYIXX 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%0A~*w)T$vg57ycCBwOa{G0VkN1jO89JYk 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 z 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≤_bIRa0rMqiGkvH0Qat{VFOs(BS6+5+%7ZJ%t$X{IiiD{jC)_*f(bTTP zp2~zg6?gmge>nBL10R2s(|TLFcJ zxbAuEK3CVtKQHOzKH=l*-770|Q*YUm`TV}No{^BHABnq{`?mf3>Ra!+=9YJF&Uoys z^LKslcJQ1V27jIT^6F7%ZcY2~6SQCG5-HK!f4)C!Zu`@HyT5L8tx`9NyDh!lRLk@=7L*XuYRy^TlVmwRnG=$ zUPXNockev@#f;*YlJf7mW6Oc}FPZ+!-j&}j-hST)JL(o(ao^a@c@II34`aOLA0$p# zxNvk##iXzE9vS{wRc~M7`p3rAe7*IKeldG5``y!sSKQ5=eL|0_J8o`OyYR(hC!f0D zhOdX;{EsAW(gU}?_Sl+5y{CVv)E05q>CK5T9j4tdLqlq|zx?K&L1*?j?(UlVKmX%vr%WIC@lU7z{P*@5?u)B_-(IQJ;_i&^{xp2= zh7U{5O}O~MyN_L>?z#EPz~Be|)8WMjZu#`bUv6BcRNM&0t2X#wT<~CO-yOSNJHBvd zVZjGamd!l%+W2pOdFq{i)!Y-kL#YeJ-MaG@|6Ce-%_l2k{4ZaT`R_A7oBzeRy}P}! z`HqV!x_`fU#~6&K#oYrd-~adGnScMbYR-2ZmalyKEF7*52?u6y;We>NWaofqg-~8&pX=j~(%meYCzTwU4eD~$O ze^;OJSJai*QH=N4&MVFy;JNgUcE64tFzwejKbx>@^@R^#FmFb}IUhg!WXboCK|d&b z({}=XMxL38Gd;6#Z%hid3+7d%^qe#3^iwj;KEagnxa=acf4|IeB{@Zb+&rLt`}G|# z0Gm$x_R9?9l>0M_aXz~=r*A$(;#Rzh%n1dV&gCT)nX?M~nb?4rSzrR-W;|}T(;gZ` zota*cQ(jt8I@6yrwV)!9U6eA(AIL2z&BS*M2W0wq>ZGh3_b6sg9hu2ZK$-E*^G&{S*05*iQ0XmchC2~~7 zOR-aiL)fUSEfJK{!Yll^EG|&i+#pf;u>Uu=pt<2_;p)%V;WQyy!`i*`MV<;r;GOYwEvaxX z+5S?TzBwu{<&~vnrp7mst|lA5bPCPnyD3D9mb{sbgw=x5^~&O6Y@5e5LybgpG$O+! z8G#)#)xRM)o-@|fuDNo^q%SN$=}vMQ>%5wm(5yhH)S9S7;WZUUqqB>eSpaNUc{u@I z<}f3>0%ymXD;^EUa^*O;@U59Cbc!JNimZbIZGus3ZPe0GP34lVW~KssDxFbSkXuA9 zH8U(HNB;8cqJmkb2^}UYxi}P9Rv_VlylsIk;YCMrk&VT8hr@WT=S*gg2QSxfJrSybJfj<6S%k-poQr z1Ya%Keza*wFWhPaqFtLP|1Motk9!-w(i2&K%d>|$PY z%W)9WMv_p`adFI1w-4OrfNzL2Kl;*a^ia(V#_3f`N)9iO z!zE0GAIG4Z%R&=*d07tC>t;85PN^VWjSpLorf5Uy%C5jY)|$mlNU)F$q43pHVz!TM zW&z18yqTjpii9*eKi7gu$*P2gbciXs|AlBgY}UgoCoV$GttdULmr${B+8|;wUn>|# z5k@4(XJ@sX&X4q!6g8&nv>>Z1oLPV)s_2oqm1$t;IOQ#%AM!>F&bc=}IBCHwLw;k@ zq8yig%srCahgY%70|m{M;6}>egLx%+MTeT>Xu;fGfeY+s9=XO(QN~g@yb2Z07knd% z*V{K&(iCUr@>-w9Yrt<1<(zNvR~%l=56_C9S4uZCBTn~C zD+(IRU<-6}$z9UDQ)06_`Ma8AfT@Pe^lKa>FrDgbJ(k$ky`6Z{B-dy=AX)D2}A)F*N!RPR9 zQf|j?W+ohMM4DR5EkVup7l$?8Ci2sG7k&lm&(W!+`B;u?wx}r1EGn46ks@vcb;{y5 z*IdKdqi8>RGP#j~CpY3Wmbn(}N(!1-cW=RHDw~MrsHA#vW&odbtSmW1m2JT!m$Y1x ziz~2F*GPkH!PHi?TxxSli*vG@t6PQiz5i{#{VkVoG{6AV@c(UkiwbbjqY z7OZl44Wns7*oSvsg{A0@@qLO$*nBjCAXLBXbWL+5HdJ?vO&Up83-WBvZ{k^KS+YSM zTQFS>lhq)WqbU_=G_pMg`^0f+dGq^HgctA^aFd?ZMVpm2Y~IZ|RHu40`82gprjq75 zJN25AvNFBLppnY=82XxQsIP+E}Byy z&aLXrPu9$W88`~lBBD;u9UWC6K@hdXlnX`y&EXKb+M3s$zN{Y6Z<-;6}or@H2Xq{^B-Z))}yv`7UvDQj*^32%HT$nq9ktm0yL3rtgDVYMjx zik7KkD9XzNdF69kVE)ZtmQ#^mZWaR@bSN#TTxYkOcI|AfM>R&L>c{cQmgu7OluC0e zVfZGfwB`o}Io<+t*T~As7SbCWwNxg{Tc+1HLFSb-ckRz)RSV4=RFCEc2yq@-6=*40 ztWV~IO16oPJ$zJA#xKn@Hg9q?ov`7M86OR7q>i>=tA`GhU4E3OKIc|c8b#~~*`ha? z>5Lqq7pV0G*^TMrEt_}D0~}SduoIJ?ojfW(hdSfdf;mApntvz_4T(FbbIb5KVzi_G zZN1Ye?$@`Vq`4bHk!%R37E)1)Gv$oWA@YATtys1}w#*^WaJ@-uu8ow0+J&-wyD*+CfG#MOU5cw|S)cbn7(T=>ntZE9K~=bDFU4f6F{s))^_4az1n z?R1A}P2Xgr@1_~aGqSuUCv8CHM0_+9GbM6r)-+E&(bN~SM9ry6I@b+~qgk1DLb7>o ziK5X}4mGd&O(!BKBvUub0sn(^9vnC*Em+NT%561kPBn-KDwIxJV<`}SW6d~h;D}C_ z%fNmuP{f+Ur#TJT27X%0<)yz3z4=TJg=M+k|9_IyMuNAz>3@0)a{i2iS$~G*y~0(C z3fBZHx0;Z2EAAA=RcmUAOW_Nv&l}96-UW7>&^|DjNBsxb?Lzz2U>Xv zqVLd{NA&_WUub;|=2162hVR`8?N)<%)CqsZ9hXAu0qif5s$PcXQGE;zaU26H72L4k zGgV(-zu;#z?SlG1{OY<^KW(bs?yBApwPpoEQEQ^`vkZJ&V$Rq8$9{A zy^RmuvLujHHAIb00R(I&(`uzAB>2+fYunIa&8k5A3{yRHB@wdt zmzdW3HuZzM^}gM7zTPK+uJ;|#ro9BUQ})-Uzqj7EN7I-YRqNZa-p9A?? zQq>^kKQBWl!P972y*4J{g;g2#VyJ&#Vz2eph55;#pYhsHgzH-0fnELcV^Dz?*KGK2 zeZ3QmWT()z*modfv9B(p&{~VdV&5i{@0sAi$<@32Ee>pYk;NH2@WUe#vn0c$VW8%B z*7{hcmyIQDm6QN0KSha~-}*6FPhfWmtv|3U@FpwVDyeQ28t!Qxi9B~i^0TUH(l zAGex;UkVzxD#q_T!7A{pZRY~hwpRnYSHi0XMuFs3FX5L$z^yjn_bt51>T~>73dWo~ ziq|a-Tl-)!J|Llxf7(X}VA{utz_h!wEH(nzl@iJ&z&;Z!4_K{WR|8{HOIFpu9>VKZ zi}3q|(C!4Lc}1@Mh&L6l^E?JyR&|yEpJn3}Kdf!V3#HSUYK(2$bVEO=)gs_WbtQ$* z0-pDoh#MX%a13{NSy|RZ-|z|eQ1jVI@o?-?oX5f!iH9e3f@56ciKp7tM#ZXpS7!(u zUlMBwlc*mTGBGMC4u-Y}A^_-875=$J6j<6V?ewGFG7EIeZ>YOe{!6?_M}Mp7iS3G(nLr6xhnE79We?-!GryIp ziUzC!>WFz%(Aatv?zI+o9`%@| zJ!NU{S{l=<{nlGrG~&{>wF>&; z1x{bn3MOivZd78F#aS%G&I(O3Q$U#=G zrWL#PXs-0d_-*VY(ko-Jaj>1S8ybYyd6?g&c$v&Tc=>$k*3IlIKrhT+1Ck$gfDH5v zyt=v*)771rN8M*^z3M@OdDKQr+hl3|Pw558dG4Z*Y?wD3-hcyUWTBtp1@k;bt{I#+`FN@ZaNx3HPu66IqkBxJy(CG!3r}&VZaSUKLEQxPIX>SRF@L@` zs`ZFl#JuJZ6+7o)9+%=}=o9erc^QJ0t#CCU`}Vbf#{#|%*ah${z>$C(0jB`I14tfi z28;*%J6>HwiRl_j%%fg0wqEs`!90q6nRfSIOKS~|X<8eDc~q*U^|Z9Y27`*YpSE;a zHEa!&ejS{+B~u$=N|pu|StX8vP52Wzbfk_vI%4SP_(_J{1-435P0B9~6y=V|!=@43 ztDxo7NZv?we#!76|LB3px~>HebUvIw(dER79A5a0cPU=x&8gO>VyFkB>I=y9{LT#h zz5%Y;PfW9)m`AO^ucoaum?Pt>SA8>d7ibCBQzRrTuL7>>Q)>uTxImh|W(DO>@Hz$OJJi5kRf z&`twZ8Q8fsSfIUEX%MA}?9$g=jj!CTo#S$6%9Pbnp*&gb+?LZ?eWI9X`7Jf1eesSor8wK_Q}U|=-BDl&Rx15 zcYL>$?kAj>8fJMI^rS}Ydz{=;sHad{9fVSHEA-N8uwWDLd$wR1_&rmw$@m>2*oFAz z_|mO1@k_nWtuDha6>GQ3#V<8LHwI@)arEg{Mfe>lSQ&mt3FgPIPp~=orB3UXX|*we zRpEE6U<>g(PB4y3&lT(j{EipwX8fKb*b@9Q-EPHEYr0_f;`cnkmg4t(!5+phbLCc# zr{mw9%hjVnb>)~#0JcdB5k@HZrH=1byYYLOV0-YJE!bZC z<_Z>ra{Cc)DqiQ=0o|1k?f670nAbyC4vdiB^g|g+IObIGhMxsf$LG!Umrlyb#*X^j zJQ=J~zPS|7&06iyiOA6o*=IJb9kx;N>_D9-!kD099oy6i=M6j^3Uvd*X_171k%Y8J z!hlFZ|42f=2twN6NW!25VO^ZxvT4YMoB2zjbGNl6|Q#v3r zr2`^UIv_Ho10qv8ATp%`B2zjbGNl6|Q`$c=rTrsQ+CMU-_%d?C((fOc(*BVt?H`%a z{*fu|ADPnr{V*L6UdIMUmrRZu*I}jwg$GprGQjL zHyV1i(rV{Iz!N~nH{xVU`wPHRU|s~+7m#M^Mi>-Soo38u0Nw!eS;l-e;EgbkG-e;* z%`ijj7ylCgZ-w~+W2XLc8_Y}(!-oRRrGu(0W6lP=3+9=|OhxA&n5oUsJ@pt2zpAJl z(M;X(0l<02JRk5un6EWvV22ISsx$so=oH73u@GmgGWX#n6o`-q0F|Pq!4)X?MeiIPdV%0mwycrOF ztKK)}Er1B4>SJU66cEaN)ed9+3UC$7)G5giYMqFq>U(3}3-~(BRQ_rI3*dS{h+HvK zPkRGqDr2;#ZuS-+wLqE^0pA8Z#+W+-Zi2b1F&_{3F3cwy^GSgJgt?b7_W}F>=KjW< z2DlaGLB>pd;3JsX?=n92_MZT<52tx7;AepBt7(qc`7nAnC`Rul=8<`5OTWQP>I;m$uvZN*m`5}Y_R(I^YKVD6r(h566|I4oM?z(v?^SvD zCFW7(_@zeRl?6;<9+`WmzTlO`L1G@6Mxr+16@7-7M?Hey3x)QC!8~d?Flr)R^^(Cn zYCSOODPHxK!91dMP>b;@Y8}KpGTTNS$E&`KeQ8zr>=8qA|S(OTE_s$342vHgJH23 z7+a24^)r}94Fxt#Xu}QWQRe|;OY^FU2J@&(ft@Y183yyH5@17xR&Fqlx*FJ7Lc7*r z9(5xy>hWIn2ZMRk{lLx?+Cv8Os13lrKx^@;jRp&ihqqPlkFGq?83Jd(6~=}WHQ>Ao zOzb?Sui?ON@i?FjA8K}#DsGwZ8z>lir_%%*2JCdfMgcoRuoz%J;!VZtJYx+)J3f&* zF6HZ45jrmYAUle1^r`rfCql;^?aY*NJtqJcEv@S|)H7OAkC4Re|?GoH`!>iHF7 zdVYnNURu|*+l)KNDPXJzkW&Wph;(O}dlmarVjc;VHNvadcM|i+bSCSISM39hm`AZ^ zWNq>)x53cPfa!Sq8BFT&q^Z*iRiU%W9T(hE*ip~R{y}gqOA_U?smi z39en!rcSb6Iu%BRIT8ElhW0U$_E8P(VWQ8^2^+vSL%zv`a0mz|v5d#$BzY-EV16SlTO=#-{fp-i3Ib zXR|?Q$A`_*4M;Oz7BwHo{_n7lGNxG2-w@l7eJ39qV4P4H4l4~G$A1Ovoki&Hfc+iC zJS?KwGfnhMl`TEg?5B-8FKc9eUe4^{yk=Q8xR}kBGR$2&g)z$_2q&P)+5vc}-8u`& zP9o^gS#;(aN|Lz40C|!hlb)Db8J^S{BsL+X?nEhhA^N;f@x9nk;5GIxC0T*89tRga z@s7otkGH)ML`uo&lhH-lvnnvU7@m}j;P~Rxw18(Pos&qsqB6T|M8NOI_2A;FBWS6# zP){PNi<8KTbC1IdRz$v$gLbxR^HjC7BN(#AFlKO42VB&>9q>uO$$(D*<^lc*uo&>qfPTPd0BZoB1zZgH7r-Te&jCIH_*cL`0WJr89`FUg z*8!o9iR!x(cq^G+Cg$bPKoRrE9xP2`8`88`)Lu=aTCZsoT$)DVrfC_LMzu}TYAmhR z(vU0T7x^&m+))nAV=#~6a;uJm%dI-R9+uY2(oVOuGc9ejrJZYOQ!VXcODnT9zolUr zby9G8+|*zoegP#z+>lFqCM=`^+CVC@`ZT>j*YLf6!3^?|qx z>fjw~v5D1dJMCK&`BrCauMrtoq{j7QEPuiQlh;R${S57JJfS^rzkNS7S_-#yDou z81+z%anz-;82E_nDlUgDA4kTptDvB#TfVa+?AcYs7{O0>Gb8NTRXB@;U4U`S!p8|e zva9$B_Gd?Q6-*PuE(M%$s(8oG0^3zg%&wGJja-+GqO62 z(VS6ZUTlBV4g_WDkFv9Fdo)dcS?)`LvEJ+u3N{@CD*y)qRsxOyoCApPxsAB$62N(YOvrq|s{pSCya})hkX^_Ez-Ixg0apMn z1f&qW4sa9T^?=_1LY!Ca1^hi=E2Q%VKri58z@C6N0rm&H8Ia@AKLB#vd@Eo9;BA1# zfOi0rTXlGKmqbi=NyI$TLN$%EPnyP#NYmOF%%hIAwBsy|BTemYn5D6s(lmBcIy`X4 z(7+EvLy8UUc1wHJ($-komzK8E(yoE<({WTA%%kqKw0kWLT}}1;MCCu>_vxLges%>~ zEsI{{>$Iyw)z8rh%U7ej#^Ua%*GP)~y{{8D@Fu?^#N`{tz57+d@-d@o_V~M1&yQ1q z#QHN5p4+f!%qYgo-LL|&FLm&Vfq1&`cdpqN=u;o)ROqS?bge(bxJ%5s6nlX8VLu3L z)Il~=5Ezx~WHlYXUkWxKzgq;m!(yzHl%=_No#!Eguo?0R9}RQFcDYa$lu7;Mj3H!5 zdNsXNu#o+q#6C`_-{E&M_!y~HGfs{sm*Qm;)=x-QPRq!~m%qcrB^tTbQC(_AWymt4 z9Jg-eabMw~w{kkt$;daY0y`dbG8uhHAaYwI)nP<6DNG-Byfh{OBg8KSDA~mUE{D() z!vrX0jDB>C$uJ}!#uUKTYKAD^*Z?{*32c)`$9Eh@sWzYVq#qp!BWp~KYpysY=VX%O z^$rlUEWsxTA6S*j8iuA-SQ;e0p#?4Nc}rVi zX&WtVlcoK~(tfqH_fY+G99&`2@#>w6(7NM?jO^*ZDr_Po2*r1QFg!VCzvKo$GjZL;#p~bGT7;8S|;6l94!|4q^EH^%sgH*%lmaqmdAIF|Lr6UJf z=jPFf$FUFBDU(3QjF>!*eWXtLICwuiLZ@V!821f$#~+EDtPokkrs7gsPRcl*@w@So zM^rJX8?qiNoMmw28uO_iEmPR?BjlQ+oqELGwbpA$NQ9*5!Q#k?81n~srdZz&Lmcr$ zW;#Oqpm__n+HUl(W;b(2f}(~AC$kKzjz}qVWKTX5VIG##QoLjg+c6gD?h>>4aH;7s8wm$WavZuBz(*F@_PD0{u&5$=9H1-HVvky@+|#Ui@m> zeuH^b3~H06#Tm?_I$2s*OXCWGb_ba#m`7G|G!631(4dJLchEfz?G{Ueo@i)Pe6-)! zEDgu13~hqJ%!)t?cDS~34kh^phMDxX*E(c}N|HW{L&NknZSeaTUbiUR8tV=-#k-!n zyc}4vqUxe)tk`Vqsd$}dut6yF`GhMy-@)7gi9a)s&y}19t9uIe?g64j_ipk;c}`tp?)G!$p6=yizl?yB93& zZ`K`$NIJZCEbUWE`@+(=bgSJBFc_92Ep3FQaYx4-pN_G zxOeL8`AB`!b@tdWsU4Ai%#B;+vtcSJ*V(HuHIkN4MIPj&8<2clikAYT4_-c)$`mQy z6OiKM6hQJB6Pr>|cLUcIm6)!m#Bk;Wznb=d!922zplR<~+JCIOUoCABN?E(Zh+Qx( zF{i{;|L2;@MAWWDiR+-;Qm=zdT=1XzR%lBn1k>Y#udS|gSABj?YPa}RRc}@;a*2~g z7r55pu&cPNhs(akWqfKv{PsmI>*<_zSU--hqQ~Km&nWFHQB@8yzS_m_(SG7n;UNYd z;5rnB@gHSkj@GNWWNM@oeibx6PVI@T>^+dZ$jVMXtn4r2Wp&Yymcq8OrwuTbod=Dz zHpD%MWu-h_*BJ^B=l``Jei7>>9WiX~q#i_*Y^n`J)Mu(Q6lrZG1ztI{*A93OG2e#P z=!KFKlGRQooq8V+cTLyz29QP=L1ZJIUVpAz)JwJCQx-5U`N0_ zz)pad1Jd7IK!!gL@L0fVK&%|d^i~(Z+hIN)@L52*e-V)G{|1->$a1Hd?4uafjgOda ze8fEJ560H37@ns6#nP5r+Ez>Z*wS`d+BcRKi<+q8;G~ug4+@*16tbf?=ae|~{pM`SzE_1|O0BQ7~7O_hR^A2V6ol)j@zBBTd4 zCZ$eQCnG}L*g~G1fr(j6WE$yQx4kYHJ}`}>xsYBy$Dz5mN5#-5M*fR2NYibPt&Axq zBZLjoWqc1x8G|zqdAk&^7jG_JKG>NgJqG5zsu;pFQ&}$rOo90#K&BJRTe2g9^uaJ^ z0S*DY3~(smC4ek5npxSu#j7hjFs3n(=24GZ+S8V{$#aaXU68(I%nmHnz#c4GFFzlWaYShrA{ z_0|e5h`koCuuv!-;VtV@>F$I)6<2O>kBD}wokAM~6)|a|xI^%Vf8rt^S0v#m%~8=u z>7jAwF*t$}i{w9pH(AC+dx7aaBkbqhQZ4@>wlCrL5uv?-Url2{Y1%IqV{sf1cX7b} zD_A_ReS#$d`$@25U{ssjGNh${x8jg?zhEiAeikeh7?rBfS=xm#InV2`<-^9shr$$9 z(Y{OxAICm?!lygvZ;EZmK77JwF6=Ihu#cSZc>{yt$ZHOmCZ>UKazkN_(-bpGv&(aN zL>E^N=0GN%Ehp`9&A~_>u%N&T$<1$2DsO^z=z$^yuhxys^algr=;SI%_!Kn~jB^5r zGnon3UKjwxBN|hYOv#I8)e(eLar~g`UKNWC)ZDHWnr3pi=>(Jrx7_$LgbIk_CrTwV zeNAS@NKn_IpNPd^Iu^6Lu~64yG4~UzPQu#r z-@yAZ-tX|XLr1_)ksU!VOndW<><~gJRaNZ}!I7Uj`M=~;0WU^ix%u&Gu5!+c*8yFwj>(P{qgxN-&hjn-<4BhauW%J2HXU6(H z3y@_~2$%v`0yqK?J3Xpc@H{|2Up67Y^yf{-T-(D;1a+)0iOiC8*nw?1Awms-UP_* z>3+a1hW-&?5a!*+ya#YL%>Y4oRQ-h_I_aODX_iYVA!$_jQt3eP(-ccJnu zTm;fC_u_kK6>P&_j1Ia6eS7YjNNpjoyFO4?AJ}2;0oYuEk)Fs;7|q}+=H3d zs#iV(>Ixi}zZ9_k1KHMEo{&$f-O(CX^~#sV6_XTlMQX^EgpK63{%Kf0F4F}@SH1Fu z`0HGFNyrmPAx~AWP``5pIu~Y!oRAc9BH_vp)H2?cMQxmo+KrtnvX=r_cVN{*8-d>? zF4|59#+hrk==5_1yB0K!-3)92Ubng%zofh6BCpqgCCg^h#X|cIzgnf~h!8Z^4cKaN zM=e;>xN4`dN?>g4$#QO${zId^g)lh}*Yvu=K!M4J3QB80np@$$D#E@SB&M?=HV*dO zFA?s)5cbZ7ScWqv!hSvM9d(AOS{B8#o(=C|Vw&g|J5SWb4HcA(KyjH*zP&E03CDoA zsz}CwjuzqMgf`BuS1z}+he9WiSD96e1^sM%-dsj})FqO{>J{`)dbaW zw0uz9M2jCPFr3}t$WbdaE;UTdi&ZvyaqdIX!_AqcIe`j2{uQ5$=|p6Ub0%7sa>-H% z2fb}Dy+bYKCkYzcb1P(fuCt`|jzsVrRK>HCJ`=7KSIm+e?g+b&sT&HzQ8u=B4&hVb zV;bHrP8Q`prlRZ$e^zC7c^NW`TdbVvCe5l=sL+$-einVt(yT0@3SrQEr!m(V^Ggx_w;Qvw<<~6*0{)orc>;xxW4<)ZOg-d#*s;@e9@f{TFd#Y7 z*^r)$MF!@h10a=8B(mMh0c)*E(tdNrc`vFb{ z90fQ9P&T>(V)am62#6hJYC0fxj;YH4**<3ivW%a@tCbI8TKOQR&%9~czl}S+Lrc@R zLrc3GYA}6Alcr&BgxGrJG?%7Lx3p~QmnERXutm&A0;5gS)!z+-9h6uokaO=CmAodlj*05o1gVHKI3MU z;6nzZ+2xKbLgx)e9L?oD6zlz*U;!E5QoJkzr+TAnsDhCP7ps^K2rUtRUjo-fK};6~ zF^}9LtZ8JRrcIqz2OQe32K%w;a#V2n&EOlbGlTWP8y|)>boA8fxnq^T_4?ss>3&yy zaDDIL6NavU@>$+`s(6O}99;f1UGEEQ$huVSPjjLHaiBRUY9{)T zqMTBO$(1~mU)jh&c|~dY=+bhdc32@0(jD|JBdsqa!JcN9nG|be*56U3I!kdnx2*g;|?V%dWeUUM4bz*1q?wG=m}bA3TPrmX50xGIR&ISC4oSsgrq~2 zkn|7vwG?j~yneiV{^aJ21C9a#k^{>CnbhY1Sv8*rOac5WAk(-UuovJ9fUM>#0M7t? z5pXczOMoa^@y9Y>1v4e&9=v*gAu+wbkQgqYHnv{%p}{<|Gfunvm!-8r4bU{N!90rN z7)|S9X{TA*U`v~9X%|{ruBGK$+A>Rf-qM_*GB){53%>F&(i0pLQ|mh*4JU2ekaY=5 z)|gTB8$)~t5|*qUvNd5L_gW80k58z17D&w-2@AP>$vNMnhu8KP=DRPk9V|ZgzcVrB z^wjJNzLqd*b=;UyIDYvqN$qO($&~$zbY`q#v{g*i`J2kW&=bSxw}jEF3>~}5!?u*mXt_|W zAH(v~WB>3h`8{@!t@o*i<`TfaUWJK^D>Ffw>TGU_#~ebkVL@SHp>m{PJR(5&$_&pj zaxjBqR(*DYZgoC>nO--R%$<{_tATCCs|VZv6l^Pg@5Aes%DhxC7ZU#}uw<14>;u6% z1EXr4tWtn!0oxPUGNDoIEe3{*nSs40v`Z|;O|_cF0rtyc%LxOWmV1Hev^)Wf%`BNG z{L~AA{S6q00B$)=N^y`Z*CsqDw69=WAvD&xAMq~4>pZ`}mdc1Dbf~7Wk<%@Q`+Fkn zIoyvm!k&Kq9bwPmevAo?;p~jCj~wnlg3k1`h|Yj%qTinY&$FF@sDZjOkRIKx;aath z(wu^h<-(J<98Y%y#;FXu8 z+*O3RV@w0Y-Aq?^oJePU?1lD%nJiL<|IJCnbEG@XDCLyKh@{;}!z7a7=g`Nd$j)qW zwHdz7PHMxfD80pnb1Qoh3N`30Y;TI+IhVjWpubZRkfY8+7sy0%GU8;6Afhx z1EfOoIp7|^F911HzXLE9dHE8s6JQ-6r$r#gs!{$0gT!&-G`q~~H2lJ(A;DT|7{2N+#gL&0SmNv%H##`FemUgYBO-C=Hk?933CmYy1bqi4)%O$M)oT;s zZb`^pRQ(6Rzya%YQvKSOj zH?+yf-Lp&+(=ZB8aimUFC|nJ4&P9epsyX2WqggHyprbuf)rFeEAn}B`7WC}lnu?=2WEp!$bNP!g zJDS3W5$2yF%t2)GfDlOb;d&I0^9U=iRZK(hZIfWHTP5Abfle*(S*_&(qdfFA(1LHt_)PX^oy z$a?xQAX)q!Ufu5!)BP?neE>?+_8WKl0F$APV)hK9|bhK8LohK4;QhKAiQ zhBnXAu#?5mf|hoNrQKs`k6GGNmbS{$)>@jLps5}ThO#?)1;1E^m^v-3zGl_cr%cP3 zW;Qu+_9BRhjU9!`4E=HcN^p;!``C37ECNZ+P6Oj$R~x1_h!MS;kR0_nfR>|Y!QB!h~Ec+-6q&FU<<_dCH!717-cv|_qlkT zhkXafMp}OBMHsd!y6uQ}Io@#l;?W?O-k=jOHvMq>6=JVLW9?z>h}=!cI2p%#crR=y z?WbiI_+_zvG8UIh0~{M3`6>>@tRG?GWRLN!*UNdVoX%d-k{;avA3orSy%TT3yIX_ATFK<_HR zr-&*7MLde62mX3`Jqd%VHbP?>&XE9yAT1|JSHv_p@gK#S`wbFImxG4HPVvLKshw|9FhJ9@H)W%0dw~cu-U~8D)GiEaVuXy!zIx#(+PRzq=aK+XuZAsJqV`;w{%%j>tCTPDr zL8{$hJ<8CASz3mrO|~>jCGGbbOMBeXp0>1=mbS{$Hd)$xmWJ`G39psGJSxZ1*stjH zVUMM8$9_fAsx6KEil*_hRGmKdE1LF4OJl#HY0p{O3zoLV($-tryO#EWrE$4k$FaxK z&=W1#y#y@g)rsuN0CD;1aF7_?Un7Q7!EUL>o z-(T=q!so#fRU24QJAajU#2mMtnhtIOT06b2W?SIcdXW(M2cxOU88KbP4f5svS>G2DGu7}5j>nD2HO%}C6ud(`<1wY>lV&%yR%NHDN^N7(mshnbah*YZ~8`>lsg?nbZf8C9(^2V)U%}Yl-*{;rfx(&s0r4 z#$+Myal2kkTQ&0_;*%JyIWffTy4N06h>@;w*Ny8(vO20=*IHLGTqp^ds^{T?^_t6| zRxkFg$Z%NWTY*)Ypl@ZZZ}(!~9;{~I>xw#>#lDR&J{>Y{fpJ5~codF5!atpjExeJba^bZEx~#4{B?D8q(!d%Ewa@ z7BY?Dx$w`@t3L?u{X$o8fBpM|=Whz`2~OD`d?(@j^i8$r#s&XAIIsu!p4xNcd&6=) zn#5hbUkh$XTebOTRI2k<2h;c04o~bI*b`ibMngMz4_ViaNZu7qlJDtg-=^9Tor1oN z(Y`&^*k@WhqN{&G(6>S8DJTHYYe%G}t=c&r-`7L9;8yK$9CzMRJ3JmU0*Hp|UBi=w zj(|YNW>&a?XW;aiM4uxEX||8u83kkYyn!kh9UL~O)`xQY29xmB^Ugx$`vRCLB{sSD zU<|8^oaBP+*2M6qH623mFQr4;^47^5*BtrnhIS`1&Z70 zg*mvsx(CT8dRuoq&hovR(R_0Hu$XI9To zb_F_^J;KMZc1t7Q`6w(M6~5;7a6_$xpt+{qUMZ9Y?DZdO^CA&P+tehY9LK=}nnCrP z43yNJZ7?7l#%>MsQC3S{;F1xLq3`?l1Mj^`(LxiX5h1fy|(Wc7+W$Ya&# zpbG79gd;0tKRWX5sP(-UM6gbL?>Th_2i+E@zgNGEvgv}1U=@R|hp_8Zy}xzB^*{WK zT&319I$=Yi&0-?AvzZlChe_eKV1E;~RBmjh4hp$#leQf4AKGtHleP&>+9oz>i~cke zZ*_f)zjbx}l_Savfj6)C*0SjAK+R%`cc?b&$$p4bE)HMaCAb=tuSEO znpL2t2&~S?$1E=n=9#7X>X%7`r`e7tjCH$f@w`7OVc}$ubp<}@TEuqNwFwJ{gS4;a zD$relW9tJq)CU%Ev}?;Pd1opLu6q6=#bNCYNE!}HD?PoM&+RMqA0)hRAN@Ps(9^*+ zsZr1mXs+IVUIwO8_uyL67dfFREj7Wnn#2vOce#H^=(X;rcWcu(0(s+yge2c?{G@N# zx5ni^cbjj~*69bf`VM>yMFnTTf8Ofb{mGkK-;nHV^=;TXefKus4e0jZYRmisThjH( zcoCv?R5()RU%4y)<1N9F`MpP87OcqaU6F~dar6G@k(Xrz z*BLZ3TB6f}=RpL(Ef>T7D9C=-)r0hr3lv}du0DG224bt;pK{IdHYS=9p}IDx7GP2k z8pr&^+KMvt$+aVk5?=6CVIznm;^KFH^&`LFPOc?f&#{5t?XqAszwBQ9b8N!(ufsuo z>SCq^3Zq^}D8vW3<8+N(8(+2JbJ)53t*hi*tSfLj#8379p@IJ50(uN~Y2YtR+QLED zsa8n&97H0gbN$~pv^W`DWdhbB3a!EeMHGq| zt>*}`y#0du`fbphy)$d)^@G)ySnf@DVSK-r>d{aaFTl1fHFL;omE+<3BRC%k=bys) z5DH;)=NO_#-0`FsKEyyht{vHL=bZ=)9#H!N9^L0%2a0$#E}7~GpF3yJ*Uz}x0L6f% zPZR^k6N?x8``7yVp$EX9ry<>H>-0FZR$ttLpFPN1pzV4ebE+so;&#OoB(C?xiA!A4jE|(oZOu%L z+3HK&+BG#Sk;ywh{+^MXvbvsduli{VU^avyv06r{-X5|b5uj$d(a`EPeU)!Iw;OyIit0BlYWkQ!8bkO z$%a~=wkx%I#SJ8{mlFrXU>)@0gjk{S#}wA@iYioEwW(gKB?1!_2;0epYDI5oT#LR# zo~Xbjf|GM#sGbuKtOQuX3+thZFOI2Ny*=7Cqu>U(#?oP7&)~4c3*pJdux4n&h{$^AMx^#F?+lP;W1V^0_m(MJaB^jadQz9Z+#0D9RIit64iLQ{Sgj;GC->5SZqr_1>!t?jrT35Y09`#k%SyWgI zwoyR+@CNjNZmTc8dTpvizIPY&$h{20>)2|)7$&e=w_;X+wK3>Eg2UqL zH)UO#w#w+f(8`akK2|xJurz7uEg<#Z=jgFE{c*65vlcZ@VZdfstuH=$m5xk~5Y`5; zIP5>4(_FW?Vr`j{FJr0{sr*PngL|f$2BF>IJ_vBecB+t&x*8$AxFNpB z6Rw>H$!?oajEN^KKgeis>_8@W@xNKs@qM|4)xf6KZ-x-XJOKi#O^?_06{>@tEr?0m zx2uh5w9v@#eUD&t+8e>mwdpHrr>v|^2N%}v8`duoxeRnh{t(Lr$mfCJuzrivS6qPk zfhjA4=__zcJ#2cXuj)NzZS>Tb=(g2!CaBsekNdmRkMMTd1sI`16Y%XuulhJx3^i;M z{Y9I32s10eIHyRQfi4IWv0%Z4H_s32hj=B%wLwIbzM?l0*tT|ROvCXN1lsCv6FIqq z7LFAb3V;dVMJz>mbnV|3qBPbI>x5qnf7TD{s*(D#uJvV|3f)dE!T`_?3Z%Ro3(k(T z$7TA#jJV*~_}+=V$Hwfu7h!}=#5}H9i-{PHOAelh!3Ye(5t6ai_ff5HJ0=D)I@M0u z5ggkUiLFhqV|x83Xs#7rHfg{D=z2_$F6 zE_?uPxpOnUx9H=Fif%7YOe}yKZ>#okLTHU&k6=yxc;l^Y8;czQ(w1%#65A&o+HJc= zKHAh`d5>-IxEh%LzcWNdJ5LOdm?Pn9tFXsKJSvRP@@Vvt1{u?c!&uPVm|a)v@FwF5 z5BU@zu&Kbl6&m*taNnL=l>p;JiCZqhT_LtykmfkjtzO437U_Ut5EFBn%#?h)J1foZ>cE#|^d=oYb! z!s0QtK^$}kc9&o$1LN@2tCohZ(vsDJZ{j0&?`EdX|hU^fEO;k^J% z=i^mi^TqZZU{rV04j3C1abs|DK+O#5x+b~xDv*h{cYR$YN<{#^)cmCzmqwiK9~ zJ6BB3u@b4c{lKm2f$8vY9N1tuz-zFJEQXs)4ed6IJ!i4a7W>v>?c?;yXtFvE*gqvL zBY~|JY$mYBB~^2Py)Lu`!2T`R&A=9l?F+y@5ZXV1>3T4twR~L&sm}n$y)?!J zL%-N9eun^iSFk)_y95hZ+7rM|kW?)L#$7^g^&+r;iMw^cbZLD9>>AMADzS}IG9!WM z)-xHH&Tlp_?c)mTZV9ljCA{Z>JtJ}a3~Z~=+F}lt!&SFR1E%G{L|{9`wgT8GVtXa9 zUV_~PY>n7H3QWiL0Z=pJ1DSEfs7RFrCsLfN39T2~L`a0MoRwz}|JsodE1Z@$nom%Hw3{clrj(WYr_dp^XD}x!7K8 zvFm|-D&Z{$RwlNaEbT*J0io3ayIErU2H35FeGhDo*d74(j$l#koH*KAtTQkjM_*u@ z#N8lZ+kxR45MU1rRs-x0f_(w(D#32T+N`dV4*`1yv}E--u=Rqy1x)+>5}5XTEIK&t z_k3VlqE`Y7N_bBLyH2pb0J~nWRls-<4|`C7#R#?mSgc?hfu#zz2^jav;q&mo5(L`< ztgT=l0donq9oTV#?En@pSRF9#iNojNfwdNF4=|5ldx3GUt6S{{mMGW(VBAUw(Rd7Q ziV`daShQeqz*-3w4=hTsWx)Ci_B^m;!Bzk}MzEE@xIe| zWB=_|n}Br@>^)#z1=|9wn_wRSOA%~4u&b|>?ENb z0M{T!1@Z-71#j5Qh@anEESjz zF9s$5Bi@C0o##W?E`b3}N1pJrU=XJ28I(x4{jKLBG_zX_;!pi4!v0g(J6FFzh^eO{ z?9U$0XlSE%5q@~m!B@X9O>{vxd6Ahf|%~d7s z-c{S%N2%}Im&w_>0Br3C9h`td9$l&z0&?mK1Nt_)PQBBnmD<*(m%1|HzpmGk3e@B6 z?oyfU&vqSjZ6CM8LCUF{(Y~Qzxm&C2-A*K-K=t7~)SJi+-WS6=$(i)6uI~6KTEXI2 zw>sACR)4{}3Gcu0#zR5tg?B98nRplCeF$$b?oo9NJ}r47-Y@Zf)6T8VX^-ofa8Ju< z=_dFoQ^NJyy^|t6RwA&H>RpZ>zVx$E#NHoz?sCJym*} zscKf+%he|d->BmDx8g=1eN`c}lss&0FOfS2MahE*clb zWxM_reX{Bh(?^Yo$y3k9RK}j_NmiphK6SIFgL=wyvGRDkslMKSMs<*IT(Th_$D-PI zRu!?g$96-Xes6u}WM&yM(_1q0Ovkfa#ZlXkk@VP9b#v@M_2>8=s<_<~ zvK4dmiF70%B9m>1Oy@o+@z$tGdc*za63zfzJ<=K3)}LF`v`^aiP=&E~#ZGl!9e-x4 zPDsb~7t^u7JUeH$Z1I=9pZJpBh@=%rQA1y^MLiJLT6Ok(?7BMse05?QZ`8#&)^}Ut ziO?UNyPD=;v+0PWEr;-%)w-*CymdGAcIzIhoo7hYp~IOgXXY=kP_PG$i7YXel(7Fk22Cnp)EVM^K>uG3x zaDx`_N`DB9`MuDv0f`@nc6CEP*+c9e4YPZJ`;(0w8MyHv20jr*2L31RZB(xNTXTD^ zK3-d%S6u4P%gW8GnC&kuv-SNOVM%OQX69JCZR`ahso55o`D-MBUSvHQcRh`eW1yq=+JA^^eg%V^Z7?w#8eO)2m>BA@teoI(%bQ=)2DM)}Dd>E00C8mhV(mC3x zBsMC|b_VyHct64QS2bLs=O*KSN)*u|?}xz+RyvDHv;8`KRWSY}p4^hX-3P^27`+~i zj&V}H4}*IXz(t3s&2ytKZrxq2Z{5dwl7z-omd=<_6uNKhCP`LnB-3g7yp!xATM!i{ z+0IepIDHN`d`ow}aiYIuqLqjlhSo4xomtAdtHnMZRqE`d3#1cDAAVuhMBjwrlgCZ< zWu>1#dEEKu*+dL9p|Ru-ZnvwW=e5q4TsC&%nsV&DgV?EMU_&|fH#Fq6YF^vtlp_zB z`tWntl&3t7+_2_3@|1$$VE>KDvY#+O!(K({Y4ydpy#F7{sP3@Nr;4XWpkZ`Wr@)aT z^5zLWN@^tA&X;tiwzWSIox$y~FT^bO)W`8l9`+VHxlmYtY1-Kne};r{9=?Z=78$+c zWVtvw36bk7_jvfriJB#FaMUXHKF`S*+5Gj8(K8DaQp+Ul<0Pw;$T|!AJkjb_&wZW? zBuN)wfQ7z{9~BwUB*TkcH+oyEyS-_ya0$$s8Wu#;WtQfe?Va)4y%)P4^!91sJyhX~ z3re!`rTc3rDYMk~QTIpP6&qe{LS1l}|Li$gTKbc5u~B3SrE;uS;H_ZU@?=exZ3QA^{+WdVaMS?>Crf&P9nVdy9TsKDQH~G|2Xw?wv-Ej#DwH3Al zr`~@HP4r77onK&ZXw)zN9_3`)>3l-j+Uj!bLM)kUS#o;>OW2Ww{NBXt#)cc5@x)_j1?E`#*@Xx86uRz zuGu)a{rnpBWAr_)LpAA8Iq9m`P#heoUoA=+Hv1#>+n6@r&~H=a8A^X++I+)sBGqAb zN4hTL7F3iKWzWsRy?}WkJ#V+LxU;aFh5QOvJ8j4XCY&^?sr0A+&a%QyRcGpB(k#cCk;CFj!q474r>9 z)qDx#am0I%(4Ll7t;3KGNY^+_y@_?KIOl*|2l1dd=Qo+4b{81^ndP}(oF`#m>I@h4 z-IG}}i?V0w5@o$UN#5us7R6Gbe@nWTGJY0Wdt%rl#8Y3%9fuHQVvY$L zFjdOT5c|zgLl}lC(ztFBYRLJR=87ENkGB4r5(drwHOEE{bcYB$!&G z(|S2vWTnyO{T=k|MXWlZ)lhG7yYa41+V4S|cWz5U!20$drZJ>$JKnm$+hCWT!U!LG zzv*&<@*=1`$0I&fo`Z&~)Axm>FVU64nDA!ey%O)8c$edS5AXMQo!K5ItxX>PxOQf|x zy*!XtJ~zwAsLCvG&F~!yVB$Dl%tZew<_@-5)QkB{j2tGD>*-G z3MWteB}mfAoAqM8Ql%gyHd(fd;Sx@iB#ceAMBIFK_a4H(?*n*W#=8ygin!RQ4GEK6XJ9R1T2dR;wVg+GZ{J1@Z0~d3p3JEZ#^H$5 zXsIS)t5QMzi z&w1wqKN&N5HGrEsW0@Q8i!cXZcHWg(&f%wX3PB^zmzTxO!OQS?i5wv>iz5tw>F;vT z>4)JtZo}O)hA)O&-psNc=_y8fCc?~%>bfBuzQ2dr!AYM0^H|d0_5whL>D<2W&>eFI z?EAu=ACx2{FBli&a4y7i%=`}bMgNDn_l|F~yxPYf$Id_wkg%aZLl_OCA$APW`=w?GZc!M^&zQ{pJ#^rQy+4xKIB$? zC|va+J#`_ex{wd+LSdgCa(#M8YI?}^+K^kdA%Jy?Fzf#Sb*h z3Ifvuz|0vzpe6tyM1G~UL04+)gB(GR)rNG`21SC-*5HghuIFIe%~fxCDw6kgu#|G} zz;!?K#1?;hUfp6n&h}Hky2Z;axjM)dL$zMG4G<0~xpo&^xf>6=mtn`Q-Ws$E)iOE8 zUq^_CXh-+-(4|^djku1)RV1?GOp-^K<1Hmj&$4IG2w}YdL5Mv*3(d#qbi5w6gU!)P z2E6%-J>Kx8o$REuZ|uLcbAQx)GK*_&@f;ao@7S%!E=4ql@jP1e?L+ z+#`inOQ1Q+$X`5pSv~P5MqDQSh?p4Vtm86?N25^2_*7_op%fY)EEDxcJSstainf3v z19&G97z7T|83gMhvr;3zN-J|3e;wgVbmbf4{xYPGx)+s6VTVf$A=Ag762>3mo;MCH zz+Q&+5igtRgZuovvZK0u=5Ok!^C|Kd?YVc5pG%N&`MYtH`hA)Hji*oLbGiO~ss8GC8#Vu)GDm~O3jOm4uTg*&@&l@^@&eXpT*Zgnj-zGl44*W)+ zSU$%7V`fQwPSWzX$Z{1{j&*!Lpnscd?Vi%VjsJcq(^uGKsMGf+`nQRXyY+9AJ}>Ft zM*hvf??ZK0bk&?Z2M{em@oXT`!{`++?Tu57EC(epKT{-0ZFGPt^7%|NdJ4 zHu?1<{re@&|3%>UR2eB?cc=F6qx!ee|Bn7`^zX2lif^NDkHGIX{o9m}mHPK<+WnvD z-z=Z*BL*vUDpEK1bX^X5I!f+hjbEehyS)K)XV~F6FnI<1X3!e^#yvmfA}DV8DK7-Q z9drrkouI2h?*=^%^l8vbK%WPF6clgrm0t$E61O&e3VIbNMqAGHpxl>;$9Kxy!-p69 z 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

    u~K<$(T9af%ymWH;E+R4 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

    B~_-GDg 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�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

      mIcj6*%) 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

      )9{$2%r8jE+GVV&4Z5GQV^#I_;saTjCP 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%0DS1{K=W+CeDnL*39DeqhXXePW6c0x> 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 z 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%0D?n^a#eu8KS>toSdoI=?yxsoLRXS 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�x?V?44`W0o$X!{(g}2BCU;k|E$jf9JZEOzq8!x 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 {rlm~ z!<$0}*w-BSx%11YCcGcYc-Vy6AA4j=!8Q!cHXjnQQZVw`VQy!9AMq$Z;Oa z?5v(zzRgZ;xa`_}*wBX;9j`adc&z(!Nd4Km*@ti(8N+K5v}VkkmR-yKsnMsg zp6)f;)Z6nZb?~R#dCQhpfj(3RJSdYKC|_yN;CI}@ zS$EXi2fyPL8HP6?wc-uG##;O{ry^{~moQ=Qzjx!SFuM zc{bthA1jAE`g?ZGRpqDdv`N=`FtA0|vNjeoedhjR7S6GAPoTGZwRd;zl4lw;O$ zHyMYQ?&JdY^sD-(;*9z5IUQ1xu*U-)lu14~{rTXpQTC}!@MS(#%@2gTTRPRVPTJt(k~V%;zM4_RVdGQ2s7 zI|u)FzAtNV#Zt3C41LT#`_!$uh}P^?af!7aQ512{dwEs5luI1&q~sptyTN? zN1Z0W$+!4`amnz`1gE^qzVLkDr+Oc6r#Gx_X!eU$?VD0Z_Z=HgjWF!h0^_%m1(oZX z+`LW0EsjTyo0j|2*|1kktLTd>y7!vdx^+s}>lvHyaGncicH_kjZYSOy+bF0Re+2)2d=4I_X-gl9A3wt`FmEQZcm2FSe3SRtS-GRXq zO{#7lw;QtR4a4)Fcf3!|^b7qfbj%(ZFTZ&HUX6ZF8~xfbYL8as$)CC;K@N4RL-mU= z)AnD!+;)ill$;ekOq{Iy-R<#VXa6x5N30z7gyoo3%}se3HAvy6MC6V zoilh{Pg%t~k+!~n?>cE>H3DPfIm6pxzQJqfa@U0^u_IrPoA=l+{jTW?lSqBnh4ud0 zIax;!^M?y$uT0YJ^$e?u#F@$@{4L+f|yZG3Y3538v*cr}sX`P`|x;k1wYiT!6n?rv;v zx20p#PqQ6=84!J;bJ@3Nw!T+zoI^b-SO41Q>?c_-8&rvD{^xPu>C>_b7TmVdzkGeb zp19*j^`~IoqVpGIl978NrMm{^Jk9L;D(A}Te3Q33-g|BHxRr5K;g?}>7Gi_D$nY#b zBy?PQ+c+;Kqvu@N!X2Imj(tcm>T=C!ZoqFAX3nd?e=X}%e!A7&_r^4L7&Jd5VCtz$ zxA%THf4BLo{MepaXLk3WJA4M#3yBPG>?hN{xi(wQv>bK&t?8}RQ8CB!dZze48(+5f z(&oY5&XDzc7@p&V{CD;G)x6U6j#-bPb`P%JPjxrnK4Ip(Nj_6&nbz^@gD+w+Mr4w4 zdn!Mf75sQisIQSvv}KbKi?gGX-_6e+HMjAQS??sr=VG2_crmAkkLP~3tKWEoe3a3U z=vSMs_B__F?iIO(-_lLqZqJO-&uDY|hWJr8@%)44Y~y1i;*-L$sa>)u+8@cSi2Zfm ztnF9KRg=x%RAxrLh}GYe%oO%W!#c89%QR>fH#Pxg*i&KJ`M2@F54^UQqQPQPzf#PPurEw9!{l@t-Xr^O znIics_0?dv$p1IR^!?uy^OaJ5kj5DIas@r(mPeIdQe)$hkp}FgCxqZE(6Gn^ zJToq>d2vA$M}(tVnaLW;EjcA784qi1zbV>Pr3{@DQo?xpL82w&Ybu;}lbV#A1hJJV z67D-i9eWmE`dUCdDC8vx%^z$Hz5z^0DrxHZ!F*C^2J59M=0ocum9_dxztX%-(+3+z ziQ(}Y=~fgBK2@^)H%gDnOhlVmCHUYs8ItN;ELB)iI`|@19Bf}HRh6Mp)#z9aFhO)| zgj|vGqnwO4V^X8>%1r5d9V$>MGZBOg_y(f6w%nk=p>OqMbwuc8K^=x^-7D4ijqf{zGC~ZiEDx5-}gD1z@l|D0YIw^&v%_vfl8iMv|M4l;i zJGK{4I3bost_fMn6VprCP=Vpm_mGm2phRgiOrxHQOoCRd={L5k!!$6_V_P7eM51P7IZ=SU{LgpSH=0I0Tx1_!Gb(XWSzB85lUJ}cqp8QB zn@i?%4UThp-^k=r?|u;>`QwpFV0;Z$HX*?-3btBGDCCDnzBpdPDMwVhuPP^$c)$Vk%Eem04?5;tTtNYj2ATEhxN;MMbzYyB@qNJ_FilBYpQ z3Qy@WWK3M@y?>$IDisY&`vTQ|q`H_%lv@I{94>hx_>l~SdPXVmCA5Oowv+=!+3=|J zFwJM0stAvd?N!n;<44+zPK1KNR7UJr2)$FwbICz9t2LJ zJT;@#GBhECo?Jj9Eq#Xr&;Dn8RzBm}fD4hZd z;u72SOG?y)0AeZ=JsvG>t%~Sgks8QRU_D_g&7p+)X_7LjQQ?YGZzo`jGqP_975%}9 zFD@yf^dpzpgzb9M4sN`>S9l~n)+_mWoMt-`8&G^7e5ckOg9I9oczC9oDo-f(7Ds7z ztaw6bK(?f0CgO+@O-bY4sR_y#8Y}{BWES#>WLYbCvB@&JZz^jb>%jnk6M(--;cpxe z+e*g$+k`TUCU!z8jabH-%L!RGWm!AO{`0I+7CH`nW7|ZvFl$A4fIM6g8Kc^tMY@kV zSLnX)MJ~C^ejqj9D^34RMa4cxFv;QbRvAO7BfsQZnDluMbhs6{x<7rkLcSDaq zzSV%cErg_;1PJ(i7zaP-2_Y$Gg%Cd3#bqsoq+BP2@Hs7DorRE;>yHpVVE}Bf5R!6p z5wc~l1wu&5b%`^K(|Q0PH}=J_9R2LKX$F4mc36(i*aJQG=^`c=S7l~7C5DAy&~mK1 ze)jIvvZLMgLmvXhh3><5q3qnt${eD*j7>vUsg^;X@p&Dxe&;wyKdtO%4;{PRVLd|k zb>YFI2k9U5(9r@ynB8uG%OezpOBZKE@vYQVW)@`k8CBEe@dAWgFFN+nPm?0ou?K@y zvK_uV)p&FdeF6&EBkx^QOz_x)gojVtgmM}qL_H^#gG$%pb9eO6Ppdx6L+5i^`7Q@N z&|k2{#Tvt^+T)-*1M#iLx57e(cpIOQOc&>1ayT%Hvc}glTrXUeIkwp*OH4|YC1oVa zqht}8vecN^6#QT>np$4mQMF5Q+5(WeU6<3rFFv|Jh-yXE)Mf3$M{)?^a|axXLm|4y z2NDS3ReIQkrjQK3U_gW@rV$I($1grE0IW-#$pZu!cj%yZD#V-we+mR728rWXyudD0 zk?y!E<4hKO+<}YFHip3pIirG*Ll~kKqs4Om?p2;jkl%^4_i-VqUJT|V%jH)RNMzoZ(kQ08RS*Q(u z(^;q;eluCf8^0uHbYXQAUjnfZ5s~DKF6%iyma4^%mOf%^e}rl?ywUjO>qos8imNg= zRfG{^yumdbm(tBs1_b{pu^}Ack}MccH!7}c1G=GDd~b-0ctF)nXYu+B8wh7z!Pr#am{b5Av14Fs+FsbOfKiHWkRkMUkTct8#7G z0YQ|!49jCC23jUYGksfG==e6W`>cv6#nG5G9e}{9)VGetZUQoWuT1xy)b5Fw$SLFJ z@V6Wtv!pcl+E;*)NB!l8i%O2iMeZFwCnEnnd>XSK;1gXx!6ykX(c-eGColzMHHWVY z-vhoLd~^a=7Jg6oQux{ME5fIGz|K$>l@p6gk4(6;kO3KOXCW!~ScE+nVdX(>N?}0x z2zdS?tcwWC5@Ewd*d!4)O@u8FVM|2VIuW)>gzXk#IU?+$2)io6h_7jcC@F&=JNTY_ zrK1so1RUX#Pa|B_nKCj{EYIN!;5%?0A|Df+<~&Mkjcc?p;y@5}4rd3BwKn!7Lhut8 zW*FX1F-ZfON2($pB?n&v|6ReQ&WU_oSOS3)Y4#=88#yaEi8x2;sD5;hX-4derKlj) zc?Eppq?PcgQS0E>fWHNPZTK7EQy0)Zafk&j-ViW_ctgMxl2Q&V)_|D`=V2sqdAuh= z2rWgiJPcgQLQ+l#vFenP0jBEIDMhM)s#B*F$vQ_hO347DR@cHc+zLO;6{8d#Mn@)~ zTdRO9wZugZKBJ5?e9}c+;8%i= zZv?Z<;Jd@8wqsl~iVzM@5eo4Xp^%hYg#uTPoz)4 z#hX~B5N~3cLQ-zB5Nkljvl*V0J14>}i7=u7pOz@Vr=>=!^S_e6l^sAmPGRL`f-pH{ z{1rwK{_Z8x*a*%a}7@Bo&E81vwh?qYNLhVg#yC%NdE3j@m-hDub)30Njo|DgPbt4dCx&W#G&i z_|)dz@F{E3)A=z&A%4tINXo4iVhudm+N81od7gz9FZqzxp`AXy=-JWt@z) zV#)EN*6UvqZ$u@2kU*vVig;5OY06^YV^DlSq>(%#S18hm3Jwg$|0u@^wYQ-F&q0<% zl>_jl@Q=W!YUaWxYETn-YEX!$28E>DXd%{st@?NvttoiCg+fTm-4bEP?~9*@Qf zpH@ksD8wn9qY$7ta_V!G9S`P|@v3ta)m}OKD&y-=QEbPBmxNg7zyf7aNl0Z9KCN#? zFnk2mDNJIpa0cVoeITjo3}%CMp7vMCTp3fKIc3h#o>G{wr$o8X+)JxYj+3F!CB^1A zk|=^xV+f%ts&m|u>imN7XCXy&fO42JeKAIv6MSkrjZ-PE5M1OsffJ}dI>RR(>jt0d zhW&;t!B6i+lEF4W^@3Lyh-t`L$E@3B||?zjje z?x7S09B~hYq+A8?3=hM)Qh;?5VPtQd#|sx>auG(Bm-)0=B8->PR5u!&|6WS3L27j! zm3orK7x^`R!VhyyUZ@^^|9?wRGYS3u9xq>n5wE?$<%Ub?>IwmhBS&&T4?f+KPb*4t%6L^d@Dgz1B6VGr z@}#sDxW-xGhq>aE`L-}O{^}?vF_FshR>)J+!{bFUL5xP*yk#IJ)Fr;MAwWu{G)esS495RZ8)-ZfU$^8z+(~3f9C-#lX+l@vSAc&3er@=d;ZvUwoW?{W zT)ZwzAzqiI5Usf`NjlNjI}5unmb6^;N)JgRvGL?NU(m9Vm>Kp zwyBB~m4VBTAX^lz!_l0h&X9cTS+;5nsWRhG=aEy+I7C8nWX(inl|`~&>8Rg`Lx}^& z3BWjxpK+4l6Ne_lCtlCOKNXPzpX!?mpJtpi_;uh9h7VFRyoT^I5Tsc=6TXuWkKGLx zPorc2g5ClgvmAp{JE;fxT}le^yOeydJ{4jO*gA@bl>;~Mc(i8YVa-IClL(6uVPs^H z$6F)9){C&6B5aQcquoco4BCC<)AF+x^&5@uvdq`P?;BhexRj3Pg+gvt*K$__QGHLH z(kN%G)k-nL>p&{zFaGaLS|sCal#PQ=b@jtV^;NdJo)$0TEa6k1)Q3-$jmO2$SQO%C zEDA~4+Kz`!6Y!+mSs`S=T@+zYMA!=vR#LAkhXTcsQ}6X1fT{2EQW|PSC0ygJ@WULN zkyLyA+Y{3NV0H05Yl|BgQq-QC@QF%y;S)36hi?dcJAv%f7yPQ0{@ft?(mzU@Fqu0F@-Cl-3sfEvL3V=qZ57qxSjXB56aCo7^x^ zliEB2K4m!uJ|0mK4cWS2Jbda3jH@i_mr3wRD$~7#a8KMo$}z8JP>9zvD8%a-JZznS zCuKWjJnWDNqn$DyhTT*al5%xK7-WF}a~5Hwaqwl(!<3@twgn4dYSv!@ps&g~1(%55 zcsvzsf~PW32*slo{$DU4^d&-r^eSgWl;?hV z^uw`_TQ)a#o%b&DL|i}_o$2Q@-8(zZtp7Q?;`9skYxY&%S9`%wC#v6GuS+&>>4-P17OUeLYe17`J}8sk-c?~9cWYdndpcu;$$ zvfDW4NLX66j*Z$gKu7EIXA$~WaF(V{rYZShuvbNr((+_1qwKB`$a%GC8 zA_YgHMQS;fHD=YAy@jb}078yliz!+bE$$>*B&I0Uz_ptpp{P`HD|rtBM?DoO@e(bi zAg`Mh8CjTWw~$JoPo-iDnFOLltCkS|{HNPTmAwpG%L0^ev^iCa>Qa`9gd&Be+wWKf zPjIAGl4CeU`jCXIM5{6V;#&99hv|hitSzK6DAq3G8VT7~VZE__U;hP#sc1n%&ahaj za)1`ntCF5i+rm^GgjD5@&2j6@|lNUQlw&!hCo-L>;EgoT4(k4ogL2fn1#Xc}Qbr<<|?T2&ZT&l8qSelmt%q;C5MIDv2;v6Hd`o z^#CbM^=!vo=)=mg8Vjiir)aABEESDJa&vFKK&_Oif`wFsgH-H;D+`)3IZIp;tq=+p zan_MBy;ES@jvVzBFCp2j_%jB%hL!w2T-X<_%%OKt+TX%p7gIn2h@&)LJr)x+Jhql+`!i)~|%*Mr;Gv-gAB*hgfx zv8Sgw^h>V@I~VH+u>jRdV@+SY&Prfmm6ebpHC6&uE3Aa6ypSk@*pUPL-VG}=QXLSj zkjqu#ai$2J0OIfN;>B08ojkQYK6i1&H#zd~L?MFSdJGG5r?X?*;vlhD!rD2IhLxPS7Bw) zini>KpVUA`DbFZp8)e>z^G=FNi(YY??J|CX?AUbFhO4*Hh}HWyzU3R*1420&P=}ZK|s_0+E0ppesZwJ!u7{ zBn?o4t_ERy8hF7ycnImJ&Rhjo)zurtkQ`QbS)9#oRsD_PWw<^dub;x`j+f`M3VuD+ z@kp<13>-HBPYd@Y;gPiW0ZxX1N7DksQ(5Bx#B`JS0uJ4ibFN_HtU8YpjON27CE=;) zp@c`}{sp}I>gB58(bkSpPi*jpQz~AwFR6Y+idzB>L&Q%>^~180d+;52KLf9Ngfb`I zFDXBBM71mlPrV($>jAtJ0T<0Gv7c=K9|)W^0v@g2oH_KfT7IO(*NFs;agh`A<7aY_ z|437H1WxBD9*5T13B z6WgJNN2`$`{WxxOe;$ukttFMK3-|}%Xbs@;zSQ2zh%f+7t${qA*bcRFoq?ALoNa^D z@YLiB$&E^bc^u_$N#l*y!i~NIkJhnmzXOlT4fzf{$}hbnJifh5a|Q}~d1j(I9?5$Z z?V0fCLHA=dJlfL01VkeEC9a9MI&oUY@V;~F7t?+5?cXqbT8yIxqQWB6t&<|+@W_ws zcGG&i5@*is0S%SDcWk60DJ3a7RaW2MQs$eC5A|dF;rtR=TkLb<6l1V0)r(&FtikCq zTise5sTh8qUERF`yZO0?dHT4yceNFxwM&X_Dn?66igv)KHGJkeYSDf!Z9BTVIe^Fc z_%bEN!&H$HLAOK%eB7ffK~D|A#oynhTW1GWLFy&Gd9I#;-Y$N={%-F6VNLCt@Xe!W zzIm$AwoUB#=8>s!p>tTR`P5zg+qtsLDO%_pm1x9v6{CgDQHgd@O)YeeN;G0!#MDCH zs6=;lZRamW3q7L}jo8Ang?>?qc2P~O&v%*v`jT%p)ms_K*IOl0 znK4@6%cWfaHskb+o2j?J)3?M1*bBHt8la9F5QxgVc=@8oy7+o^_IAhX z4txi zx%>EfyL%&BePjAYHaR+x2A|444Ob0O^ihKlC2rOrZ++uP3=J>OfIu)spno?!-_SQE zB|Qy0V|Go#QXxi)Bv#$k!9!Mk#_wSzu{&C$Z`=gAi?RTth;pM(%Y>?^Zu_vJsr7^( zflWC~viioIk%508+N1UY10IU-6;-5Qrw#Qq!F?GsF=rA50XX^&FRE5WOxdC_LE*8f zc)X%-+z0BZU+18JK!5C6=(C~owSmL4DD@FNRRd483-d$L3ILb`&{>513GUiZ>qhnINYK?=-CF0&zqXYkzH&nSsM>6lg!yp%c~< z?LB>nT?6suic>of$8_P8SUhV4?WoU*RIH0+=pxr{f$oeS_$D)c zpzc#rnT;-$A*8a2$$Hjbwd2F++dP37-o9>~A!+IUXOzPj1Wz4^^@w2tJiEJx1+r*} zJ`U5Bmv7sSY?P3GMIGr!N8x+G5>R-mdm>~6aTd+`{&JWIf~~B!Ns9JS3ZJwDnt|Np z(Kyg8g|(9McVo1t(hNaMFTb|L=tK^hhQXUO1(!IxQiX%iC=VBZKY!o0tis0BZ2|3l z{R7#+_eK^aasv}9R63-Bpp`K0TqLxJF*oCC5@OUwb_5++^I=1t=Ef2Q3JviBJOC1e z2QT7iphG3rH+B>`tT;E5D54G~22^%3Nf$MN;i`az%*gPRRFPn;13@t2Dk^|+aPj=9 zyJTpwtFNz@yNeI&V$wOjIQ*e+5GT?zGQTdq(8wqU+C)KDBqm`vQ*0mH2Qk@D3wJ6c zE2igQO5hvFhM2O2lqYd;dyI|FUV)5=m2gk2k2X;eqSRtTfhs^vV6uqT0E_`~7_dCb zD?F2i53v$W51rZcz=nl(;b0TQIU@-bPNNA-$A(i~+><)<4P}P0776_lg$0`|JkLg2 zu?8whAm+kW{)hWBlI==5U2_t-hlVtA`ev`!?~Yf-j$`9JjD+UeEx ztQ`EtvSCK%)fvYg9hdCgf)}6|-nZ?X7cjhU+f5I^R_gcILto7BzHPT!54<9ieA{li zFT?w`-Sl}3@7s3M?=rk^+f8qb*MDS^Z`)1p%kaK!H$8{pecNt&c}NJE0eVPd6ys9_}YxSr&fkKTs>Z4SVC79j%&m4YWGk$?M!dCxw6Nc^zOa8Y=1a% z=>_?zpAL+gH2kEznI1Mt(-_`<`#MIq=N}8`HZkzwrWJt!d0U@0+h*iy^^;Mx+lK~6 zr(^4z;eFd)`zMB%QQaeIb>He+4(aqcT6Mr}ul22>!oyP&8#`FP{HN#3UeEEaH}=qF zl5g8}AIR|b*AH7&`$kgl<^{bzZJRi9{>7usTo1g|?>p(AzRvSbyzj_y8yMcsrFy4) zt(~=7HTBxo_UNTCuM!?C8Qj7sY;~-+tWF=(m)Jwnr*gk-|J{e-ecPV=e10GZ_5cIPKCyn^Y! zjt-CwnU%YJ!1D`N4!6pgzvxh9>yXbiS2eoPGy76F$L(WybuSwAs<6cK!i)AN@8|^U z?yJ<$?fI;Gzj|E0lJIWCo8_N4?k&SRoE~zZe~8iMK{q$p7;QS`YWKUjGxykV;;ZYO zIPK=Xi*X7UZL>?hZO48P!yBh~JjgQi`JBT;UfLc~>_0KdsZROa5xO1Ebo@fXE9Ubm+Tn3V4vlxY6lva2UUBUk<=Odf@eZ9$@H_etDE^G z=huEkz+Y zn|JKT*J=!J((G%VvL%tfJh=Er%tOv;#LauBY+Ej-p^cx`G8diKxh%x@Sk*~+id+e8f*Yt%+q`vFIdVlSltfQBR*IgOjwN3Aq zY+AOlobStSjxKMeWcG|t-*TzzV=tR02d^%uF&|^x-H6I<+SU2fke~9lZo6h*yWZ*O zIqMy|N-Jj`8FgN_oWro|vu|_UYKGVD^$e?u#OW4?ZBN$One$O{^pO3+D~*y5=h`HeebCaDBNv|@TxeGQ)w~T2*Eh9l!EuKep3j}C8&3PUpV)sUt%x~G0p!x?mK;2R>6YXR{EE( z57-lT{HXqvQ_y@F-pD{{o@Vxam2+ivzRBAi@4dEp+{!qr@XIhb>k8dv4Z}OO zAgbFDhZqy?c#oOMEu#axQkP3s${U>B(V(f`HTS0;c)1fAx=a$cO0lPZ;@Y2#nsK3i zzbw~soSQi_-m2pD30CGhrhi;sk9mRN)m*XYwpG%rnQJn2!VM2rsDEU|dWGZcpt&og z70dl(`UE&P8J^FE-V>hQ{l{-ly!{>Rg?URA?cQuCNX_$biQT%ku3;0%zIIR+WfGZz z=icY1dmmh3J@20u!v`FwxS{!tHwP_i%%4=lansVf)*QEr;f?)d+Ber`%bAv=Zof6X zwK^*1cwWyG|7YXN_FmdN*xMOPfC7g1Io70Z$_>-NLBFlA3QAg0P1`(qc6R>o8@aDj z%+{ZMj(NehGL`E%A^%;yel@Rjy<^s6sNI9B_fy@?w@;WkZ<5c{S*CTo`fyx7hBr(5 z#dS}sHNN9~CbzMTPZ?3I{??ra?Poi@D9GCqyIVF9e8up_?Wz1^R`BC7p}s~w(Uwg{ zEY6Njem6gR)ZE5HX1$Xfhtm0$;l-RDKA!vCu72YU@=-=ZqF-&k+Vfbyx>w{DeoHrb zyFCNV+^SIhCbrkL`t5?=u5pnUKeUeR^4hj`|NA!c99H`~c3Ru%XcG&Lo5JuO4!@;4 zT#lH#oFzW?rc2f;!m`I##Sa zA!S6LWA}4y7gpM`=9AM5zErtm)}D3C%0kuNGBSF>1%Lw9!j8cQ{-l z=g2Vk<{USH;dLz6Vvob4RpSp|bKbSS?3;omM^7JFJLSBS*IVg?s~^fcp@n$jvMx8`?r&xFCesIw9ak{aHh&WMkKxsu$W z_Qv^Xvg94(?WOePK`{L-EkhoDzI?=_ zbHzm)O*SRhTUR@1)07IXHqQ^${;;S8p3_6d$RsmwH}_!nqy{Pxfo(r$0BA?UP!*+lI@H;z!&XP=4OY2G8d1sGX9u)1vMg zj{A+_&7OHwf1r!v-EEzP*RCc?t^a;FPZ7U6bM~VpzC$)*dr&; zjdOA(Z~XQD*f*&Dj7;p;GCYrMUF`pUnffWg(YCi@zDM~#wAbx4T-A}Q{^?LzKifV1 z(Ju_|VBFTFk)};ruUkLwS;xz#_WvEazGb8Q+2)foq6;ntx52uiJa|wh8PG;Pf9A%Q zsbg$Ao_Eph+Da>Gs$HJToamn$_(pAf7YrSzE5ke4r^5ZeXU=~1_p=KF!@BymzGw96 zc-I}K&ApSWn3`<*EeiSp!!y+PXtSgH&&x+x2gUx{*ydX0W34tVDJ!}2afPE*(6mOs zLw{y?!%Xy|Gd?UzzccOWzS%4H)Y>`cfZ3umy|;|LntQtElZP1`*BUyEOfu#~-oeFA z-raB2Y160I`v&C|;~$N9*JSkZhv$an1Xl}&zA=j7T{gDq;1}92`SOvYzuj2W;KA7| zC)`q^hmM}RymQTUt?r!SxTg%yZRby$P43%lH^_6(@6gVE#IO2)pX;zS#BykIhJMA5 zpR=&ul2N(i(<_DLYdIe{-=XZOl$-UEo^Ok5v`w!?_YFyP4BOegpM~!`8Qz!!7glaB z2zKhx_4VRph4ZB?m&Y&B>$_ue(2;QqPU!E!8uUEF%g(LzG`aqCgA4BmOnyIh`p{sH z{H;42;+{6Pikp-Bm-8^3NK~83t(oFgqi&u1)t3bJOZ1KEH)?#Acf*1=&z!Ok*;aS0 zG500p2E+5HIH^%$v|;()pT|FqUJ<)=q+#%hF|7+EZNE`t#d!jtL9X0|9;weJNMm)u&gz6-_;?rUnWg? zJxxD-qJ?Si{Tr+3-fM;P92s7%nhq!Wt$ODA=PSuy&kW{XcQkLyMY-)f{j^<|1p7eO zci8)3con9`*y_9=Fm6VjKdsXouP&-*esx?IlVigpMm}^OF>_S`&fxu-%6(X4;4^RY zBf}@yR#>t>tjW#E;}6N(O>H|m?#b*e0na)?2TNgici(Bhs=wsU+RGdCr+GhY+0p6l zN&m;SmNlB#^RnL0`=4IKvBwP0Y}3hpwI}4X%(UNRyFT3Gqfsl%vn@_dd1=|LOpS<~ z@j=knFbB&ddGCJ>Yg^qlvd*<#9TI$gww&;Ej=t`5&!_RfteN-Zez~D|Rh8kLSbjSq zVY_k6tQi+So(~TFkiX;k_`G=+?mQThKCk^L`67;6#_$vuDtHYa?xB+sa9_UEd1l|gG{Z(Gzh~psIGd8;-46-5Vd0#7?fCXXQ_7vqoxZPC`P!d89J27(-Q3gf z;qZ~zIj=+Y%j|7lH*3Zuz0t$BRS#@5WZZq1NvDksjOS0?yKLX62BCNH;S$43`0dr? zc0r+I-SYH}FPUvwUNxr7vqv{Pk1ZW>shNJh&tKpJhG%lbU#Du&P)NMl+T3FwCytiiD!?@TBE0d!e4K;lJVbzI8 z*>fa!aGnvvdzCkNxLNCh#wLUBOBTF|$h{YMWazzdO`FYJmv~_CoCS^?x0T_gd5)}_ zp;u|izQu7PJ%*cj*D>!aUoqkFgvbp8SFc^<-U)g;!|QeK!&|34b^C|r}*BOqTJ!lt!_35H@IetGnwmCx$@kTu?0=-t1o+^J2Q7}_aw=v zmupQ7ewj10&!h%3TdspV7{u_*x9F~0Qa0k3dJT@;`)J?Nx5|9O8;1?TOlS9L(D<|8 z<~AI6kl|G~-P*c|w8xB!1?`&z6&$(gwQf(>C7t?57`3^!er4h-%v)B_Ib@R1@RM6o zd|nJ|XrtSndvNlnHWg3LvpBSVr{2aVxBsx3Y6HEF;aPr2=(zN@ab8SD&$+UNJ3J2@ z`;cPP<(kplfZr_4oL7Z_{}|pl`+1E%kM<5sYJL24!L-O5ONMs*eBjW*n#U$Sdtp83 zcgT!ZSnHwOyvvi0WQAC6t=sJ6o^n=$D$E;vYFXWGLym4)W4!hFL(q)Qx0FfN`RlwL z;$5TvfMu4OYPd`}c_+jCWyJ3FXUyME+cn*9Z6x}c;ptX)-y751VbJ`LfT^c0-QN4* z{N3iS@?(2yo!Q-g?(i9qS5^%uzcWi8?E3J2m2_xlP-R4rk~CzaM1l28G3 zx+cs4Ds$7Q#X`^$k3PR{V^EW(ku+re3-;6gpB=-D6j{gE)RYign-I^$$oRAwO18Bm;s_=ODliC0L3gcerNf3$t5)!Z@-k%lA9p2&;g)Hba+B+ zd}b+gq&8{PuA}BmP8K$n3^|AQl53>Fg}H(sOKmYy$Snd!c~h0fEWd*#BILbd6Y)Aj zlwc$AJCa1kC#A@LEQ#>S1QJ=Xw5sw${W*)bVB5SjQ#`d#6Q|tsmq7oJW_ER8ob1FdupbmDo!&VvbQ4 zDwsyN1o@=m6VGpRsmg;p;S+SW-7FrFQu^9N$41B%DH@qmu$ff)`k-mCiP1?KsSpkX zOj2ZOB&%4ekw!F+Xq-%gyrLCJ_+m{%b5gIg*e~o^{NRWYDpy)E(&U@KPHQY7Ck;xS zgao^&#H5T83i+XStLh40to9G(h-aO6PKHAyHNt$zq)(b$k*R@wW#!{^upSAaaC}T$ zk`nxbjYU?%*0)`0X~E1&o4o*<7(j!o9gcm`QD zBxn;t*b5b!sFtb_%n%r_v>iuz@=6$=(|0Pxii{-9tgj-4opD|fC~a#JLZFz&)8?;c z7+$raQZ zAtdE`B7{%X0FM$vu+NSVK7j{pybzLd>k(?oU~~!wg{0g`gzOpYtPqlNUE*}&v>pJ+ zjeRjJM?d>*nt>m?9hRdr_CSw)K;(Mjs?5wMMX?aG=tID`(0xYu z4KEU%Ryl^E*pHBn<9%%gpK9cC{9@&4U|VU(&aO(5HL1WKl@5rmEw&E4&4_t zcA#PQ=d`NDBf}8eW!Ul0!`^*1a(^+b6~3wFw9*C*8?2+17R|Tav7LTea2(eqDBxf_ z9Yk{n+v$_X$7b(NtHXy{Z326w>HVdJxW|=PQ4a`@Nb};cw%uDKr#K#abUS?zjEXOU z$sj07%)F6m=7uculG2TR!BX126(WhgJh7-nX1H|OJx?rrS%O1535M^8gxF>X@v-=J zn+*b8c3L*RWCR|*$777F%MC{;fx%|r7vHiVb}oMTv>OoOQ|v*gK8rmd#$G^(SYMY+ zj|#cGN64DN@a>(D3xA-RAHBgAC1W?lK``ec;~xpik`&4ip24Ky#Kd%Yd?xqBg9+9zmDcqsGVV zfKk5q{1YL$FW=4(3qRU9soP}igbzmV2{5rA_b+Z!-5n=I(7EQYsydS#nf6a&E{%0-x?*;#!TXCD+avp6DnI;gIkDlM>AA;kL!#7Z07| zt*(@Ved~|F(&8mUMb6!rWQwvtiqPfUjP(IiH*T%W8h%zq9F=CkuqZPoWXf}nbc7#s zbnqRSvVMg-8v#Zh)v+%ws;>nuauv0B`?okGKa0{=f=@jahl{s+OCjFwErq1qWFgjo z`$Y)xR)~2#eB{Z}O1UQ@-U|^%C8+m0K6ztKS$p+f&qb`dC38wct-$AjTz@P4Fjqpa z<5be}VxRLTrI8I=A|detaa<*wrTsNRe9eX}%Yy#_Q7Whqg)fV!LOe~5j`&kj#g7NE zUup|ch2~l}24VME)INxsEGhi{@JVnDfnO8;AowJ-vhYuRKyacOmBmwyLOj(dBxQEX zdDtWYPs%M3LI&J&5tc8)-ia_nEk0)hu7VJf3S){GwRB@@1#)ow%9tvTFXeeBQkOsZ z_5a3zLPfr3Ou;NBqn?p4rpgOrDi-N^>QIQM4uz!L1pM-_DMCofof2W^L>P@J9*@Qp zpO(hWkB+IsNYkA2C?d%$0aK2te#OU>(Chyn98jn?QRQ1>Djs8m+J`Bbjj1H~G^Wzv z)0k4gr!kcZpT-oyX-v`V#8ZtzJk=-!?Nx|{_9}#=+(HqyRD``0VMHfBEsZHYKN?d! zjGw1yUj4o?MYSWRE-@{TW9zSssX5ea=EN~YXC@1$=>G7)A_2P?tfa;9x{6Yml5pT1 zKdVu74SMGlzoc<~R;RmNb61|iS)q}4^IY1~QDh*|+&X070uu>A+AX@22 z(yGso)r7GOYu#Bi(oBT09FH*16%^vRftwDTO?2mk8S@!XAjQCnC%Xl;hL- z2_Y#LCBkAvm~zYyM@pq5^Hbyud5>`g%_)RSK5-m5WqfVYG+8XK4LqY;IAwfq7S9vW z74Q=*wlMwxi|4V4!y9Uoc2rcRP@Sl3XcgRm;xa{*>mrNK)O9ga(`X>Nz*wwSHBikS z*Ct#Ca6Q4rX?@)Sy^+YAf>n8QWNL!!XozERg41v%+;m*aaUI8X3)gpZuxSxp;v6#5 z#fnvr>ket6%tYCrs@!deT0zdhDdcp7wu^B!gr_mcK(xvTT8TE64E9`4gi?{KDc7BB z;Bs%l)9RP{SSc)#RK?<2iLuIH5qhPB(bApO1}4(5cB0WkBZC~Bd`|a6`CBo5o!b35 z;hv64Cj1*J@ygMM(Ih(J6)Ho9OUbL??=0dUNZPFO@W;Tf4SzR$3;5&U)3OWlH>-^R zCtjV7`#|`!;LG7JgirNd1b-s@#qg=Om%s-u2U(p(@_HG3T%-?Wt$@DZ$w+-&$Kh5OU+H{qVzxf%Ww_*>x9*r0T8;qQk34*pj7QnZ)usjYv)hnB$b zXsj?e@XT@P5jG1Ma65#MlzS$^Xzn9CDQAk56f)py3Lz=iR)n<^VZB9Ik_ek5!pJNc zpWiwWwn>DY7hzJUh_K}%Y?BDvD#CI_ z*hvw_&!HG3oGz|D%qI!>1{ZOR((y8dW9v_Xsn4Nz0c-x1Ih0O%;$4wB^go?E)yKKA z2JkV?i!BL@&xxv&AQ?@dVTi=UK{hIxQQy!=ByCCAXE4r}Mfc#WEb7l1@JY_}#>LNr z6yoPW3h^rr9yUq9lQK@`VZ_Ni9vPA6Va7s8%GDQP4MkW# z0Hc;v!ZpweKg<=SA||6BSgQYs0;F6`(rj32dNTT{Q;+&YoqGGgA=Ks^_|)$G@QHf1 zxOnPOh^HQfq$FustN~k_@GwX-0k&NTNjVwl!>1*!lgC?#SS~1gw^8<51R(pc#4A%7 zziE|8>EWX3`K~VsLPGTFQ0;DGam0(gqpJ0Rrsa!y4*VaM&PPUGn1NB z91e)m?N$Z^e_%sO&1;F|v(8h&d4PDO4oMOO^KcPYw-MdyGngxW-C3ycCym8Zz4;xs z;=CbIs-a;c0g>ttm)D0|+VVMdV7_aIP$Kwo1+-pG-A($4o zlfmeoU%V)n4HR#TI2nsKgt?2>%<>9k6i$bb$HS@sp%6Fo?3RUWyBpKsT7q<=aFwaR z!7fz*vrBcJ8mOCG@@_2bL{MH8fs%!bnpqp^$jS<()7KR~RgWUe)S{uSs$5%ELrPGF zexN=41Wl(RgA?!K+lV>ZwL2&~F$X+A8HL@sjkU|b_uY|&v;UW$usnik|Imq)YsvpKn7R?$V z@QH)LeOb`7xSsH--Qn=5E+`tDM!8VPfEyr$q--yihpiT2Pei;IBJ6V=sw=gn53Z7* zXiyEwDO*MQk@B8;dL=F=H7!?}hWtS^_?Tn*k%|eJLV^3=Ja`;mCkPunr;K#xzsZRGaCg|P}K81P8P>81t zh4`IS9yVUU<9Akh*isSpP6!!rA4OPil&`=puN*sRb})lz%|#&;kNA>pQhw1)R>_k# zY!iL)$tg#a?!r~661rmH<#)YveWoN1$@hO=Jt7P6?|XYCC^pfqNr=B3ABv>N=>^3m z*2z&3-0N2_rE3N*8)$uQ?*1|hJ&(PLbwifS9lum#z@wV|uU<8_{Pm#y?0vV=?`RJX zbGzU;&ETJM$oSUYehDtLpn2+j_hydvIRMmz(Ap?6Ha8S~EGT+<_{aRwY@zTIC*CFx+5Q zOpi-{jtdUz)_Zrabi1va>uh-YXTh`PPKz&;X*qe!`zI@BUiYi(FtRK43*4XlKXu0bVhktT8BU{khD@D@qP6yptlI%n2i~bLL-vJlZ5%qhQMZiS` z6l0HzVpjwa#mdq}X#!#cm#U&PVX+r1*syEtJsNxLC5c9jz1PHEV(-1i!uy|@d+#nR z8WYL)d++_efxBn!nKNhFnKSjyWKVqX*MQKigNOW;^t8p8hH1BdS+;ENlh$W?uTQxD z!@bA~SxqZEh%LU)WV)1Hf+iMML^~wJ?d)%=$jPCxpr&(tw9diNaiXBe6fr$h5*?D_ zm|o!+hdBDe5m%wYke*j6NYZl~!;9)kBPkUZ(JYWI&uvIbBx52t#H6Q7Z^Tons4l(c zf|4p`G|a^rzr;(Aq28NCE=)JPQC;IS4hC1oGoK1I+$gRKe;DwPrwlJb7X84OqODU3 zhQ0~`t5i_!r(9^%yS$U$mz2kajC_%vRw`=XmqImP>VHk|Yb7vb%(yRu%ht_-RVpY% zGVTkl(BY!El3}AtK%zk&8u()AS4aZ|le^b8>V1(;Cqp#wWsn<%f%#MnrP;{BM(H9g zhulC`kY;iiHsO1Hx~Tt024iH(LxUL7h)t=WJR!5^*PQ+O7&aDt5l!xNu~JkZyP5f> z@UK<$zCuJ_M3dVW>0hOyGWR45sq_YgAm!m0(HGI=_C?xSsi-9S+CC?Fh~C#e(HGI= z&O_?==w;)`==l@%xnUv(Y9*-iYM zj4(+?m@FgAd?U=JTo^-Xu|W)!3MzfdjD1(qM{}E@2B2Y`Qh|9hfn15r%@UK`kSS#pRvBQGiW^Wm)L$o~G75`os6Jg+8*ZIo92V(3rJ|id{**Nei~4;^ z1+AA!`D|qrRs}}01HY8Q=kLQW8;3=`bEU%CAkGzx!lKkD74;Do=^ZkrMq#Oe<+U4R z!sFQ^VvNJGV>Gq~aaJ3JRf*AP3}^~58lZ(!xg?V?H;gdPjWDK28#hu-DP@GIW`t>G zgb5Qd6$FV-f{0Pem_Z`OR>n*bF*Y)0rHCmjW44Q!QZnY8h@p7%1U)vwSQ<2_oQ4gJ z#I$luGtfvnBeyoL3_7LUUUc*RW2zJqZc`LF6HRUnY0rF7og%X^rVm0-6>I_G0kU7F@M7XT?_Fb4^-lKXD;E z$LD)Xt@abMX4C=ylpAK$SOg3v1~GDCD8sRN|kJcHa@w$!j3l*9J&(D>m}_+Vd;0EA6DLET&!1rHRPLET*VZcsOulr-37pPpWt zz~JCuzgFI@G@l&LAO(JSTDrMlXQ-@!^;<8EoLKDg#Y%f%ayiDb&)NBm2TNh+ zwD@>~SMdYB5N~&Xo{rFXoi`n$YCx0s-QWs$11d400dx_#0op*E^??{>iXLl_Be{|K z?8uF0d0~u_GJ?BM>1nmT@j8FppUje?aTK&N){~u0rVC@AKl{byatla_%SeoG5uF^D z7~fV?-@q5XJBoFW!?-FvUE`WpQlevZ*vKqaJ||SZ0N(%~ckfm$G;a3p?%nApo_^Bk zCs}??B%3q+)T1A_`t%z|Kg>m6F+6-V9zKD7{vQ5;ntbO4B%Vb zQ&xK7RvLd_cTaa;KhICsH$8PrO-pZ&mO(9jT7H7sGgKqgb*f+AQLQ&l4H~*Obgkd8 zk&7NjHYZ2N1`Qgh)u48CVop&ie}#iku90Ne3z{E4>gITX zW_lv0qpo9q{HWa=m?Q`%@sRlxzXwR~U!b{_!s)2{oF6~x0CY{|G}3Q=@f!wyV?k$= z#;HEVZxNg)gQj6Rr=x*Me*EZ?;`^YP)sxfFASb{0{R+HyFUU=APDjJO{P@w9jTxW` z=*Q_k#Sf!;;WcPp_UCleWyz1Wa0CCLZbf4l!1B>ql=EDL;gj8X8I^jN9C4Z{3stBFraOShs>waYYzu^(8OnRItn*Ge(u1p z0L=rD4%I5(_|c-5Y7FYpSkBM#6Z}}Yj}wH}c*r1G`SN=Kd^~8{k0&ZVWXmspmEkrI zG{1>-pGt2O91eq~_C&^x4cYVKw+_xTLE}G((|xKuqL2}jK=bT7PDg|I{P;Bmem4ds z!Zc3zsr(~-`YmXlP3Ls7KEPzAE=E*haH9Ou&EPchZ&~R3eCT@SM`ti$N&eT!O!Ssa zL9@ef%8Ohm-o5ki(^xxd^3qZL?e_(AH2C^1KRScq3`p3QTPyO?QM+X@q#?Rg1?1T=KU_e4_ zT1t9KXPvrwNDXyRDo&qB=!@^I)t;EZ#ur>^JWiTo0@nY{ZCt@dA<*#4JtV}veNc#( zcZfE`*F$zR&Fkpl8-m8#+@_xFGuYj;mA98ae76bHI%BWHx1zHN^P9`LK8)z+kl%@s4*G1 z&&{-SxG@>HFS4jL1OcZba78h|E2|K!+QVfr@h@G1H(FOa#xM5N)`3 zNT^>>pfl&SbJ?C37$U_OQKTdPvsXFj)Z$* z0n^;3G0QhEztCV*OwXV|A3tAhsHc0NKc)nU7H> z4{eY~OK;CGZJ>9UHiR-19Ku3^{I%YJ?jHW$SRm!ZCc@{41KitbJ=_Dm+WL8gwGirv zeoQ~>$1Bt`SR3Z{M~&+g_`iuAa4r%g7Qs(i%6R*0eNX5OMzbQ z{z1sG@F4#-0p8eV#)HU}hP>XOB|N>gZ36wmwC(;Nv@3c)G8;?wBRj)3Ui2}v1ASj0ECaf4)V>GN^-5B0{%0mq5rAJWDf zt%SMF7;xZZ-hn{@-T_RVIgE33rhF6#0;?oJJ40#TdiArM;|;vlMXnSeEDZCqIdskP+U;Nce*;2zA| zx%$rac=E`ZC(qE?sh%@Wo}=uW$C~@5R)8@lXTzpWZbaM3&W0@=cP7m$I~z81vTt|U z*|41x!-kHOoekSL?hIFb*oMuV7`CBr3xifr_U(=>Pd$+=z4@=-tpp49jaLSam~pPB z)nU7d1=EPy{1hU#n^-V;Cy9;0iE>z?v9M91#}(Q>RLiH7`0No9VqrsrC-7}hAAIRO z1Mm3ey>C3;i{iZpJO;OE8yXgZscZ|T20y3QxVk9=%I)CH8Xq=^6`Yokl9r(B!(vw) zVL)~GYJ!(j;s1DPuj7Ul%i#`pASn@F6PkBno4fX5btqp^6vatC^ z;^80a6|IZLr%4v9hedpY=>%pUTi{()Xcxep%N9_0!$)X5d1~S-Cg!}?Yts^%mlJxa^aA=F5kT7UV z9%s;sJq=cB3lR@u%4W{dTd=UHhM`7k=VU^PQ)K$UPDkl2BrS{sS6xl36t{9zj9W<6vngVGj-u5?yt0MR3U}NH&#b z54^W!qD48w$^zW@2m)RRNnR+3(A0!ve;gFgLZKo>M=G?9e;CUksyU&o>d3DoBZwuj zu+tZ+H_nXiBNqx21SW4ZOrTJLaY$2qoPTs59GAsdQ3~6z%8q@{C_K>pO>c$CBB^TP z=aHbpakxQgxGO-<4&52nAXwPc0$J`t@=lHui->fG(hTWD>+bJukm00zQgu}Ss1(bI z;>70dSv8@$U@F!haeANOiJDpQ&cp9Y<-aRcXx(`Pa`BV|jkD%pMnZlv06}20smCBHUV8M`ZR6)wL+9WaMEyNTt zX=SknTY*;!raUFZ0D96(sc>bI^#T?(<~J1tl{dSmKVG?R`TF)T-%eXve#qu4Jzlo` zarc;2s~dg1IxBs`9>jssO{rsZ9+yZku$qxpUWRuiKBEV1C9EJ17`GpP#~AUO&}+ zNNVKNJ#C&(vCSrHwiQ{?N+|PTf8k)KotPq|Z{yU;6{Qu&QmZv7+`ZUl^Himg4uOrtst@C1LrHQ>de>~gK z%^g$EjIO_1{JiPwpXx?Cwfe)|tX(rj++^pg?z1{qt`!uw{!Pasf^e469q(a%`}Oph zk6u4IGeFxesQE3cXGhy@E!!|4wPe}S8-9qx>Zu9EuZV?@+tv=1mkxJmn=rSo<0ac8 z%{DA5ti17lS)-b5r_}ioAHp!Yp{30`_j#vM%^s%e^zHc1R;aU~99$ntnDwa0(-taf|MjgHT`_SDTOLa`fekRPVsFmk! z99srQ_Dwy1@X!xe7S_6R`ob}<^v**@&0gB(+cnK@oWM5@jLvIYxs9c7JN|5W)%!(D zUzg!?EnffLa!W*wA*sDAioegv#O^9aH@0U9?F)rw?;kA-pGg0+TFT>}y4Cr~yh(?3 zDOHO2I={t~iX{X}tsK4g%<`W|Ti+*_h)>8S&<$9x>(^kM?O!eMk-hf6$6tv=QA%-jAG z-)2u8($VL|maVSc9@eedZPwvmHA697%;+2(sZN#c; z1GcO_cu!q>vmmrAMDeq}q8Mt?FR5=C*M(be_g&omSG8ZgIUQTqm}vE^cGmXg&G1bQ zqkE_8Gof(#G0A~vHyqng>_p(IQyIP`8<=~~opbqh`M8HUm?C6!-=_Ols9NQAnMGlJ zlY`>=jvSjAQ2XP{M~$=gJC*UMF#9RKFM>`|D}9PjsFU2eNU`oYV;^>2mauq4k&efX zt{q+eH`CrvyH1P4RAM_uH*jKOXU(I@&h3}XJ+^0Q`u+y*W@XK3Q|0x57H8+4T=*^) z-=i|Retk`@ZrgPwrbfl-yDko%`7~wH^C=cR$J>|fzGr<&vs*~VJ4RRWTi0WKS3L6g z<(cx=N0zfMH>%_*#CdHy`Or5!$tBF=4PVAVzD(}wWcs%Mm}ymhamZ+NabdMe7srH` zJ~Aw3#9i;<(^p_#emdqZ)ylgS20RL=ba2=>C+kIfwDta+ICg)$?_|$W-5$)`6#A$& zRM0&}ck_+Ov+9d(tUkZaVoJc>rmY&^JRWkt;*vV!qt2UG-t+J*&OossemAEyUzb(Y zb@7ow;YUx79`RK9XEBZGaNR~_R?_qlZ#JQxCosD58;f*tUYOnbBQ+J6G#j#v``MrR^<~0xQ=T_i&bl*<-(liQlc7^Wb*T zAsCWiPFt-!w)A>T($6+sXG}Z${*R84?_O+uJof6GGdJ!G?m4H$iTH(>Qf72%XRQ5) z4f8Qg54|0~*!|DUTHe$GscPo53Ff1Q{ZuBb&fqb( z-6x#1v9y^t`L`vzM%IeFiKQM!_xf3f@3w|KY;xHA4PDr z-?W`LbZdjzs&Q@F+g^ys=w;qk7Jhy0yjbc>t5^Q&obF@92|RzE-LRP}QBV9Tdt_P77ONouWq z#n118vM-Fec(qd4uls560(*xW_ka7g+ud#nXO^dSt}~>_<992L-OHM#yn(59M)&OM z#9`%|f2>=2&~4@XmobNLg&iDnYfSwH)7K>L9W-lxBYaoQ==Qi&vARC*NND@qs1J2u^Ey|au$5> zFH@(esT24)LPx8WU4DP}s`1XM{UUeo-dm{Q?`aFiH13j^v42#F3x}(EDbtXD(-_^f z3T4cF8Xam-qSXfTo`>oV?jL&Sc%&{n#AkflGWC8r>?a5}8QtE%v2Rlf4Z6J5RJW~X z#G}T44!GX3R>cD+rnOJEdv@Z6FP2F#$F5fPD&rHkvUizH`%QZs`lkPN|FzBHqN8=m zbzL2v{uTAK%VR-^W^^M57ELhI?w|g#-OT9iZXbK9vS+64UU+y|!t*o@kY|Wy=G2d0Ib@0}Em!?4_=M}kf zz*1XwW{+BRbAmUzp})!KwkNKtR#}@V4emwZ6|C*ic7PamdW94>f?egSjO$4E=6@@!qcP(sG)RgZ> z1}0>DuwU=z>eE^i|6)MZ&R0T@-1FXY5B)ku_i^gnQK9O=GYGf{ep|KTB z4$rX~-7Njc{G9FUkuNJ4-N#~TOLf-VzXJS&k3Fey`CZwL`^xOz_&#~VL7&FSmE%JM zfrc;$*JVzfoKXQ`Db0_b{5U1{%Az5ya`x`u_wAAKkDfRT{Lv0OtZazxo#he#y{pwn zFE+bqvhC8DyAhW=U5(He!{`bh#Fg}HaNbsXw8Ava|WGQQnmfyLz`CFY&m+j zDt6Xl(4bbjRUG)}ual{hM)>WYSyMgb@UG`0YpgxHbK0w;x}o<@R);=_VRUOkOkWKS zsL-$fk{TN-xKBEMqgSP;F+0|ts`Pfs_Nl?E(QX}QbeA@~S+rrv`l3Nk+c$E5IjK)n zV$V(I+THhee6a80{0j5Xc9cWMR;~PIz}bdRkrPZuROHhWx<6ysRs@_ zCKtZb)JYJAFuEi2Ng!6tb(~=RG<7K#?Y?8SOKxnI&A`k&Jw^f& z*3}O#TbtHsX4~1zRK<&yEBgRxn8xUCM?_q)*Q8!L`t$xtMNc1|x~o|+yASX7+xzTj z=ofr<*a$35Gdi`U-*1mkcHg(mVa{JohV|cDd|ksUFZb1`FmFPIMjIC2bP$A~k`(UZ zqQzbwyPFi-(*4oQX}a0AJ>uWQCti6N`LfAx{-ZAxhpfzIbg_FYFRk{}WP5AH%muGD zd#yS>^hoE2_PtH+Hi_KYt?w1Y?=hn@E#$IxW>nQc?X77Q`>$=f-Tv27D;_N$eZ=lY zP~?D*V=Li2Jgk|imCKG<{5s5h!BlH^``=exa~!7*^gUIj){&Ygi(1(=9M&ubU*Ivi zyCLoeyToLD{O!bw9&he#pR)SO;f(B{(|f94PUtwKUHeV=f{xMot*t(NL#<<>H{ZO= zxOJgyq}#i`^BM&PUvX}Ibx1(VY!957iLr%RS>f)HiqF^HIJ&HVymr9Ks8R_h?hGhD zd421rNp7tlluWoI2*Vg%x1W37`{hB*!1EUtuc+Y|Ft_fD`*Rk=e;B;1a70!`O$Pkr;pWk6RV`KCCmhRoqU6?Zgk^DUgG$jBc>SN4LT=q7*?5POLlc(P8M2yJs6+ zuHWmv+0((*XPRa0$J8t)G}Ov^ZC8zc*|c5ZUjrgbJ+%6e?dM&=t=i5HxK-GjBanS5(5Xl$r|$7A^4+iLQvcE;5wD&^{yPawDB)hN4~oABbKolU4LEiE5UU) z-D^~2>X`#?3N2h{6E*9*Egv@M3Ta-CI=A~Mb{{jkoLP^?-Q2u<@V(bFzgDpB^~-yYkTEb;?oveEeH@dxT#t8#k`k^;0i<9ay|g2;JHDn_tpSRT?&{ zWqOJr^kH=G8vppXUaLsqsH)qarA#jF+IcztFO~Jd@9^R7E^wlaiv7#`?DT}S6SD7E4G#}x*NTtd)92#dSTbuqi6IPU3Oqs z=QinAn`R9RYn`^{yFL4B;FIq16u()?+Xii3U-$OC?oDr}^soAGO6MWv?W5oINbURE zwJC|_5vU)GuE7V>pBpYert#n6kn_{`!|QJ}nUP{XQ(^bxz19<7zOa9XEl!N?j@Q1l zM33~O*IwT1V_RQTT$^?H(SWx1)Z=@-D!b^nwG(jwX$1<`BekJh?M;mi9xYq+7fq2a zU7K}2yR1W(>CKy`YoAZsfC+RVozb1@nEoc~%;Nzcs=dG7vv!#x<-eV4MH>vj7a898B1;_oZQ7W&BxednUzQn+^` zUOuemJoT0$v+AR+lM@$h&7Qxj#)?vVYgKAn>Q%3lHrOt}=vr>fYO1ZLsJ=J+^p8QQ@~1YjU=qda}INsHcOQIJvrysyK9~ zE;Kr<^<&I_VI#d-8B^XQWa(0;!7h__FY8pgu|waRo!)KhH~Q@G)dNQMcpnff2;&*u z;`w8I--gGx*FK!q%>3RY%xZKq(KV5RM zt9G*UthKJ~RJMH%j{L){sO!+nGp`H64~)+D`LvqFZLTj~S#Rz5AIlC2STo|{fITrM zLhc@3F{{R)AD`fRcSg7N*K>He@8Ne@1D=zZ|)!+i_N7kf5mUG25?Yc|2x z$dxGEz#HGJI~nMGY|p8Po9kORZ)#Ql!^}qC_3wP9P2pFkw!BRfg!zol;!;l5gUqM3 zN_K7d%h8~zQ!+o!zh2Yg{N?^TyB$4bG3kUL++lPhcE+l<57_;%Pw!{DFRXk~`qkFA z{y+I#>vbqCxR>Q=4?z$#m03QoNZZ*jd38Cf20~=;cS{wGX7`z%ShM)$aWyNMmfd`Q zEw)NAy1;ea$349HSMbh6mm4Mvt}agVeYx(V?y8S_!j{!li_{}IwI_aNWxRju+R%02 zyok`rC(d2}?cEo&udR&hdh}{k zddQ=(g}X0q*fBtZIys5aH5&KgO|`z?UTAlte5WDKcP`%6c~|;*-1IpU0w>QXTgATz zTeVE%>CMMfXrlpgqG zXl+Nc7Q&t5<=l#&oMXR#?KboE53X;nIoT20F&SNrcS)@lU$?p1wO7<^^@6Q_dyl+J zw+g>xH9PbN`|_F<5!hx_jl#9)Pdez_J5@sckx}Z#)9xWqg#6Ql~BHS ztH$R(Zt#yj*S+1I^v=7}ht^)Y?q1~8cD**F3W8mA3b)#XzzKz2b+d~vI&s^5_3v?I zMz>w)Yrpf-sl-!`mF%w|4M~iyMOPP_7a8i*497oiMV+#GyRvCan{z$)uQ9zgw$#QZ z!P9Ya2BW)tZBVu1Ki#gqWVEJ5{q#`fiS8Hd_AhUIY2}g&2P<{FzR(8&W zYW;Tg^eR`a_po0~n_O$P81s&dE+?UM)$}W6!v_AatY+JkWu;6irOwQHG3?6W=jr9w zo_>sR-cCkW`untQ%Tiak)|_W%I{2#nyOAN|BPX7C(Q!~k|2sbp9I_1hfYHq`d2-pW z=Bl7EffL=F64Qs5s=j5LWs8}vPd;AVl(0jM`cV}+ORapd#e3(C72lk=@Nr2<{~A9R zUX|Idli8C)Tf*wiakgvo+a!$R8Qoz2em*q^tQi&fdzZxfDZ`ge+xC8m$%>;3%1`TE zdt|$)xtOnGblV(?T^l%g#-NF(CIl~O8g&26k!-gyjc!M5+v(N#ob$`en1887;hwGa zVr5L)jt%iQPnYgnt?Zs%ttTqBpLum5+Pzuk+KjC2IGdBvIffNmAGy5GzQu>87n*vX{`dZDMp5+h*5@xSMnSVCgo+7p^b8A+_2XyS5u9S$jA> z-f#DAA@rYVZ3=h#^@i%V55`|UYq4U=Q=2W$k(LWTRPtH8YDMD}wXe2Op2K`Lqf^iA z^Wm5Eg?s3VwO@C>PU7%u{fo^xUhC29t#;`t+w7~Z!k1&vZTFn;^Oct){}(qee&*s2 zgR3NI?SZcyImCW#D)Qdf_?Z|a;7YuVIQBuiHZdi?OJV-Wg&}lb*#F+|_z!cefUX^* z>s3B^QDOn!Zu7tQJN~n~c&JQG8d-1>5TKsh~_=!CdCr1ZIhkErK9RVXUNJD(# zonex0!cG&M3>Yomeg1_7{GVQP`I$ISq~rP|<9a%#SGo0XFOJK%|M>Ol`2U(qHH~sa zo6-|aPD0#2yQW>d0g~k``o>&s=9^6g*iZU@{#H&yy@zJCbHd+WWJvP(`HMV1Qw0pe z!=^-CXY5w|+B*l?MTm5z=+`s)^zEPjLia-=QPn#~CnY5I$tP+BD2AW9PxRkKni{O= zF7bvD|AG>Yq0O7PcqdN0K>Q25#3rVs$Nw`g)F0(?sue4IJ~{hOlFhHtOpogho%5Bf z#3moS;tbe*K|WBT=wOMoue|_OjKQbwQY}DMHwoKLj=qm0wv8~g8Xfi)P|{SQU_zYQi`>dXE6EcwjExCK~{&_Wod zr^P47_9=ik8x*7VGnc>@VElVVL)O2x$&^Mp|MBI)|5_Hr_)$}lZ^iy6DnjJN2bBfJ zE-UaGuemJW|Rhbp@zw(&KgAaPDi@ zuU+&&MNaQo03C;9+zFhHer^FsGw(oteeaR;Nsia``sz#AlOkvUjgtQQ4A)P!ekCtS z6DLdkzR$?0;UJNHFZPvTi&>lawHg+D;_%HLj)Eu{xnW0T$d&eM8##VOMgb~5R5mvC z|CPBfmOQl`y7aiOWQHQpi)6igm=&PXN=QOmj}|mP&0m1Q^!lF(CiyeL{F7D@B|sIR zZ%T5(R02p@a(-Qu0?gs`f=W8;rR(rf;(sf6x&n=F3eHYX(`kFf{`V12Eue^tDkGII zp1A(ExgB3Xkw(QxitU|GT>oM1>Xs7o^=$&xQuZxdar>k&|HB+Z>yv?r*L=#b0L2y4ozZFeZM!PiFd*Om zZ91ZJ*Smk+VTE#H>$d#VrRpm(EMJHa= zU#R=&`jmWR;~!R*RGb-%^MZ|Z-xo$g-1*2R0lv^nDxCr$X51HgF&MIZsgLBigy{S_ z`TsC`pi9!?|Kn=@KQSQTVK_P@B#YZBzNVt%e4O-@0?1rGM_N!-97Tm;I*I}Glu>aaO*wtt3Tn*X%n^fc#=)*2r1pZox;=h_##{PW1{rM`Ydw zmyUwxBu6rL2K)mF<7M@4*bay|m2gPJse}`-O=PaW%XH^NoJzPL)BOn>K6wR~n=;*95vLOF%XCj+ zo51K^!q$)3-ikPt@J__31Vv$dU&&nQbQDfkSj4FWOA)6MY+xJ5=t{zdkFXGfG9peT zloN3(!49@8=2``|Zp>Cg#HoZ@B2Fc=$$roc&N&&jIT_YD8AWn3Ebf3<7`nT3ykz4&YgWx!~k0>&u>p?RL`Ovw+?l*98QKEdOLU-!gFj8!M zkL^weddc+U&JCxhv=M7MVN4-lvOiiTm6A;k#F{coy4EubUp0RITF;__r42=n5{IPG zEuR!NC4nWt76=M~BC3xjkx@7l9TpksGEhe#B|~`}jEC}BDzCW;ei`U|K+5|?fD~RI zJp9s6vhhnl$);kJfaAUs=~Tj2(Pk;^kZ})W+!GmB3MJ3|mJ@9%3Q@!@m2nWh@NP}J zDMX30$bQmI$aWD4*?Zk&{t+luzw!Z`)Bmj@jPU;iG)2i&RCjcJwKc)6<^4>b<_o-ix47 zOIS|YvfC@#;muZ{@6GVdC2a2a#n;%dwZ<=ZZ3|ln!wtYMzU77M7#T+jh`XZv*oC!T zfRdRnT5zfXGgP05PI_jFc*%WC9YT;RSBn!(a0*_Y`ZgbKM1ijZ1rkbbjOtt41YK7g zKN;ISl+NyCx6J(8nkQY^?#hBHDpwZ^DR8m6ko5hBHL(;bEgdMSpwkKs&ykdF<)v!G z4X?hGt0m!y4mf0<^yeB%UZjkdYCPp<5qQxtK56lE1}eV>cre3QiSG*WvKJFn^X4{- zncCxHU!1(iFT^g+JdD9%nW)itYT{ySlD^p>ri-yF;~|e^r-Q2F(DV_cC$FO662TZ| z7KipK5Jgi4Y$*NWA)SUfS_)2-72?s5`h4TJL<`U0wgZo3=ED+m^7fV}|mHMW3D2s2#(I|8}^;?l-Ue4#5u0tNwg0;IaB1?&VE z1sDxT{$l~V0S*I91{?{9+XgZx0QLZ!0hk6j3$Q03)gAIj5=(yhMd4)Q7lo5eCHx|~ zTC&SfIqsT_yCvFG!Ydi~myD~b;G8Xmnxai5w3cy5I}2AO43}}EW!z6PZkvp|BIB;h zxW_W?xs0=h#^C9&6>Tcvg^YV6y@rnH`Q40_oD{9 z50-Rik<8|T&Ne&XeP$yeqe#}t{uYBwp{z}^-#`iTZbsYO{S0lV?30-h)3wjz?pc>y zxW;-4TLN;TNgmBgVNw`Tc#3{nvwod2l{62J3PM7(rEbh8x+Ro*+~|8Sf2$0kMRIwf zjQksADCM;jC918YC^c3EhFg{eTC4+J+dfs7`D+4bETQk&$T=%@{|2A?Ykz(ODv zJ);xh%hQJGO}In#!9eRV9E2Ihhy9jheKk7$8HcDP$EC8odXJt%ai~)zkZZuh5rrl7 z&$tLMzhZGSd*gP#Rl3QFc^;t zPlSjY28~4W2c3{fnsfvp*3)#;Y{ivj0J2Ah{IJgy#U7pQf_?*7zH>3kYpwX zkGU{iv{?$XMVm@ED&tPdxVJLygN(CBQ4kkPp}J^O3GHPZG&6Hm33Smhr<)+-w#c}x zGVY>`yDH=8;$rUCOtfLRC*#V>xCb)siHxJ(W_E@Jw3biXZi=x3i*ys(GIcg|H+q4( zqLKzP)uQVsxtI=pqtKNc`bMd<9{R>4!?K$oky#KK|mFD;^!d zu6+E(wU*RdQ3zshrMTEzAzdv9tpt1YR3sH8r9#pNq_Rkb(1D~lvWN}qu>X{fIG1`! z&g6mv%lW&4i8w{?8`M@}X9us{QQNBmZa~e=+tHyQM1vY@gUUo0>L!Wt<<;pKkW>ni zp*+Z2n@*q>P>?49EdkE}ssVA-a3)T-5N-fcZMp#101&d7sR6tUNacVQH^#%mMDQElS5TcXWUxF_REqVzaj8PTQ^s>rw+GH#fR8!6*R(%WVau*mkM zrnhi#wy$;0aWvV0ZJC8cmy-JuPaGb}P}hnKxsf4}qz07U>A_)4%t-Del2SuTbdp3# z?s-LWH)!e$K9VM9yeLfaTNzIb*X^(|k@UgMp5AF`9vPkU4#K4tgNs1f&r0Fv#fEe+ zagh~yF`*GV*&8^4jw+{jsePw+5-JiY4H1Zj(m*0b>8LN_P`sJ+{yU%*;2(h03Y-O` zw4MVbQR$C|iwfDesE|!1>=9itQzhC|V&A?H}@MLx64%s0xBGQh%Pxzj&7-|>KMdQ3f+i6!W%!C{lqGX;HkPVz5 ziIuZ+8ae99W@|8f&vQ`mgKq-maRDuqdY zspPbB?aHJt%zWdqoiibpE|SG<2<-BRVo=!pE~R*O?Eoo!s;ph`2!adhzXcn^R$}j> zmX*e^q&IO0s?ZFP9)gE@aW0RdNwvJRm)zVP7depRf5PadDK6aikwzVmi*kiS3T) z1i?Gia3;PY0p%mr@UnO=in!jW!IZas0I5mr2S}MP5D?RPLMHyzfP(?60}cVCBn<_m zwt5&K)srm1hJeEXy#Pl5`U1`Zq$H09q+t+bEVC^jBr!7vZ~|Z|;6y-52)!c?bTeV* zD8QM3B$vd8B!3bhXqo#w(S4!lUIdVMaZN-vu8GLT8!e85R%3K3cKQ;>y_RtmAb}ib zC)!kkw~X_XaWtgmbksp4n@U^zL6SS{LA!hV_VuuR7qH&!%URb;~Oh|&d)IvJ#sY%v^?=vu?ZT_a>$G;H+PvLQ3)H%P{P2U|Plx){G9 z%(e!0)JRB@WAV#EsiX$A3(Opc~+3Ku^G*0DS;|0qhF63$QyN_-7^qE&Y2{&aN)mKhe1X9TTT8lOn8@_TJ^`bZ(^_V!$U&djwP{d`(xEnI=j*NrG z8v4LuDC=Gc8Ih8u73Gwy8YFDReN+&THPMN`5{mb}^7T~s4iV5aTDW1?i_Oyw{g|WE zKwYJd^?nnK$-3b1a7G>8Eytj*)y+0Mr_FovU=P}|!NCS@7#}kqY@V*0tuzGA_I}SI z6E5mfpCZ}bZ$|l8Gg_=4VhM#}WPzAX#$$#N8efCueYS}V_bq;@$7PG#xFkA9*e2mI z6B^;S8y;JMq>baKMdbVfVdGpvVdFhI(u~|S4mN5HZCU%maU_Ezm$r--`Lbnm^W1el z-V+%PaxHQpY2!GmE1cgc*uwDG3K#I(ACH-E4Zobr6WF*9Q`ktWdf}1GM_4FFBx5*L znFJ(hW<&RRPDDwZ_#zLcYj6#vFJ+}{h^HBzzwq>}A)!UBsS^iKq>8ju@98?L7>uZ- z!91l&5C&mt&XkR^D38!(OH9!(XK=|a%f|C`&l%>&4R1N48A(3N)|_4LgcVH;-1xOg zM@zAk1RDJ56Gp>As5NHD zi^0?#tGuEUl}#`nBu985;;tb6R9+7OsWEs2SOxGgpabAjKv%$LfXx7(15$qw{xe$u zLZ&hU0MYNtB&mN37z>E{dmvJaBF^qkMB)QrG4#K`dByyQ}c7cTL$uMKJYXaWP5Q2oGDmb3u$UoI{ zdpwdUD_KNHV?8oNi}IzG7TPWMOo-&C4BV(5a3hY@bXcF&CB%xgIq%3uA_hd&u!D@B zBreR*Sg%VWJ|amJPwvCkNyuXn8@iw@e-bXukUxRsP%;!hl4VMRm>gk0&nw{&pbB`D zT_%Nm6p&HUb3_~8U_g1wHyDsjC0xZX_j^OMv0W>?V{V!) zMDF6FM+r+&Hz`dRZL#uNBi7Zm zfL6f&D86@wotGQgc)5{H#abwin}~OgTP)fvg=I31v>>N56>SFPRw!FzAGynUhkhE; z9v&rALbQCUur|Ow@6dt#P{JtBQ%T!0le@42u{G$6ipvsd|9o-%t0JNbMG9Op6lW?R zGdxX2SqyqX0kkUx+RKeo#@PZ;6FDSC9m~!GcQjHu(Ef&YE zkZ~_$+#4B(E^BCZq(yk!oOJu_bjR#|weP@Xv5>;MltXvh zVq&jmH)S`4grJp`GTEN?Y#y5Nz%V#evS>SXjNC=JkdDU|LoTTbQ*)TaaP{!pk=Z753=+Xjin4E@WNSB=&t-R0xl&Z5iBai*8Cb2#nCn#Cs)+IfcQUXZZ6Hi?Atzc^tr@U4Un8-CrKfD}#&9&=%fXtQK{-3X@= zZppZNqD{rR+T?0Uoh#;-ug-8Bt2Dn# z{W2mYR5FwqWLSv<=55(XS!(jMY~+WO48c^=Cd@D)r1=%rvPqXNbA?F~LzgmRYm{^u z^Ov+{-5@oeSCu8i^%r6;vzFFaP~T)jaV4RkcuVR36@^FdI{+#D+r`49g5^q)Y+Nal zjrTe@j(Qy&M+%VR-pDwvqO#9sUC=qVbTe$;gXsF8wVPFMI(9O^h_IY&) z!Hb<*2-1{><`Q!!Jw{>kscZHk{?ul4GP}$u1sM<^k%3bcveB zhpp2wUGfZwt|F2E#h-*mg(m_JnJ_`fq%^e!q^Pw6B-R}ONu!{($@~@&^lVs0cn7>g z+q3EVC_pNU7(ntz?G)D>WaFBHY$_VyF;`30#pJlc2%6Jjn8j==!B@t$l5tTojwVXE z-);()wmV>p6*UXZE|UE$JZ7v>BDI#kj*zQ3D9Gd;jSL3PHBZq?eyrg}BX(}&qGzLQ zUh-1cm99Vjd}XJ>H{B-A4Gm0a+@27J&K51YuvHgF$r+Gv!FUYoydAO~C|WPhBv$rf zF?55S*Lkw>I!`uiJ;pEPk|oVQGMkFcd~&+|z;QY#T$Z)j`!SDi!v`3uCW>BW*wBxbR#UypJIFwkm?1YZc~$W-;9T-#Gx?$9Az5rP1OSGqV$?9K&G9^@?YJ3mPzcB^ zsyvi6yoidR@_5^n#JdzOkfRqpPPBp7L9$utm<3&m~73<}3 z+(?m5#r7_7+-w>5n`pBX_R2V#=;d^nxL`ImFyVWHGD>y@A=e>y$cB1`%@Uz}nLPVV zR*udhyJC~)J-gpGalSBgujyFRmz3?n5&`W^&&enz?@iZsg!fSmn_Nz}8|!OP>-kvI zvt#{)eVX^ge5}S|pN1M8Vdx`8#y!r17O8gV(1r}%p98Z)s%2nW@J%x>SujZ{K6ekLQ4IY{r zThswy{Q)5pB4dK8ro`~a3~n84sDJqi z5hMjbOJKC%L~U?hWuQ+JO)}+C2G;1u5dq~M&%2VqP_ikH401?rr?0|IGE~07ct|Up z7Lm>Z@6=%_G}98ehJe&ALz**5j*t_qr{4q+wAf9+m(kHSvmK8bzyRRg0jUOf07e3m zf3)SKoid{Vy#eFJ_f$Y1y!Qq41*Dwy1Dp)l5|AdX$p0)6KNk?Ai_FDK^*;XeUk4uyc9feo#HH4cjCv5zU3v)Iyflk11?=g zI%~FzgNo`RiMphSq{tg87pXto74`5_!)<+_R3GyhZWF2qf}&W6aWLp;MNuq7LwQ2= zj|N%jA2YK{98_U!%Ie=9K*}yi58Gk94^WNw1Ax^4AxoK#fQJDoZ;t{}=w0#fWdO4A zWdO3Nu>Q?mEty{DxE(TXw`fxdcV*l|8TUcPDNx4TuTHdC3cY2VZ&ICb^i_hR(=hpm zyCKxos-#y_C#0(rlA)&HLcP$i7Wn4LOB)*I?%7Hk>es=W2}rn5vSj441?S&%KO8tI zdGL#n$7NzN5iG77`^-ra;R)#((TScBZ4;86>qUgbV~mu}uG*^SkQx^wJb(67wQ9hU z0S>>v??c`*xvA4z)S;$F_2nZ#}wwWpQA+#C6tz z3rhYKn|(gqTwV3&X}&L4WIXqI8U1qCYtyb-e+7@7m!>RVdh;(IvLcR@+L_tJXst0|)U4pkD>gnG*Hzi&u8ZqQ``RxCxSv?Ou+fRD z*Ai}w9bUY(P-@ek#lQPC^H^Yo-hRI(-m_h*tNXI=_c0UV%B4K)Fet)iQ;!e7CyjKU zKKpX*GxI$ker&j@WzF=sp;`TZc-|`UxqrRbx7!BJv)S6j&m{JBNkyyIcDpupI$+(! zv&S##u4lfx-|b{imt&)2RwrGGvCdePy(QJL!MpRrHvS&$QhD?7ZKE$1eOGiy-$@m! ze8@TU;J#Jcut7U!#+#gbvbc@5%a4(b{qJnsKO(@d5sHABwNL+iJl~`G$Pdj|_BvAf zr|j$XI;{WpqWiE44`Pe&Gnp=t37XgxoHd#dx3j;gA}5Es+nUbt(K-i5$BBX>Q^fR4 zNpwh}fe6;g7>z?59g@J?U*xbe;E?m>ym#(at~nl&hJ zsSPM<#K(%!{EA<)l~!~|>qRAJSYFnQW`hAADf>QAjzf=}8&5NUdk(Up}RH=Ax zz{kdjPYFg-7Qd9w`%XXGY0QUO7o`GguuL}af^H$ni=q6KWHdxcv1n(13;H^5d}uJC zRA>zNlr-W)5}{O3tjPS(2q-Kv<&5}H4OJ@K=@(Dy55w~*uWuO*P1lmt zlBrsnksf=F)Cq%R)b3RBoNeP+CMtrD-qAchakCScx*2a9QG8#iYR)z5ann^D~ zK~S@t(TAnSkbiC@8dnJ+`|>rykPLAn`5GW0WMAWqF!PNt>y0qGj4)@7FprHeN|XmT zQhZ7oVX$P8hsMnaLpx@Y_sJ6Sw7~WoJL4%GAGmJ(s^i@5VFNYs1E#$49p)W=wIK-r< zb1r;-LaA6Iz2<^@#2D5f&VmD9aAXu1x*&$4vrwedG#^2%?b!PyqKU>Nm#tvXG*Cwp=J+;XgJOl7((*U$t?)4)MwFSqJW`ZgB~*)7;3lmn4f^5bn7t>fU(bo zDT-!vX)a7dU{=Z)!?f21R;i#il+1x!?+-~a#zF%%$1p^LwDUe>7-8z*Q7R(Hn#(xE zcI}?t07@Um0gqCVs$ee$Kf}OPOM@AHA1oihGDK{2BED=eKuFu$*g+4Bgzan7zhc@s zC@lf^H$^7~u&aH2GLmC;3Akp{fD11D#rd%Y2uy;-NvlDOD-b%IHfunFnL6xXN=Y+7 z<$ZV8r6eW9`r}g!10s%WlT2S|7@?M40PEI zuoRcPI3AU}Sni*%pBgYQMCWtV28#}Tg~Qfe^_x@}KKC}G+@yZu<|Bqhit}5zWo~)r zH5k(PgHML0bv=W{9SN5^^FWk4hx4umGH>uB?pI^4`uz=}tI_vIx$u-A@w+634{aZ+ zHOxsa?SutoMk-HyE@bZf&^zg~Lyt4e4Lz1hC2t(^#>+5He$v53VoG!^@BzDlB!FM8 zeSD0};4?=z{hFA@&B=|uQr7AVM5Ae>X(YJ0X+1Ss$9mqro-JGW1$k%^;xrP{qm?Ge zC)lHvUqG-%p7wBaadUOE_w-2za7jqV!>2zqJgr^CZ^00jmVblAVrGCA+@vq0G;Z~H z#H3F$^qC|^juK(G<4{gYp5%XmoUW<)8!!5}h?xY=T+~FKM*D#c85&W>vn|n|B;lFu z;j3vG;MuB`U!bpsQfM@3q!Cngo$5Deq}Cg!1`S;sy4G*l$VHDMo0Fqsg9Z%%om`z8 zGN&k&zoNKMu90<|4cZ~t!)Wq$9y*O+?O`|w zB--J4+|bY8Blh*F;Z$1(M;Q)qiOvhWN}@GuPop^)8enUzjrqj^e*rXZ;+(^$`0YUR zH6AoUG-87(j3+;SOMqVnnqV5W!BDvQ#gD%CKM9&&X~YFXL(=^CQ8N3hv27R+8EQrI z;}-^pS!!&_wj-)f$FB?A{3>Bx3J)1GJo)kK4}K3o)0KJ@Fy?sjiywMO!jGVNA<~)R zJwJXEz^{B2bUvzr07lL~gYFmMsi$E^y+8w_v3ArLc2&rUx?7g{(HV43h>p4@Rr1o2 zTp4swh;9O&!FlK~;VVGYDM?T9jKLEqu)*;c&Zwf&8PBR}asE1vZjEzDiRp$Z{iZb7 zMlqDY2DY93Nf0;;NQg~KNl)plQ&$hEp$7V!QNEA_L9M*= zO-k_lla|qgzp0aV)i3lfvDLZ8m@9 zY+lvRw&TkhwR`osIPJ*2qsrel@vkw}%AKX#9j_`3zxhM?Cp+r6INyJe6u7rU)6!E1 zWRLkc#OVdf_ZP;`!J%5~jvsyOU0zmFSGu|S;;_Y5h22K1x;9|T>Vx;xwKub`2oS$_ zx;_&MmmiZHcy`0F4aH6bt~!4yZCPsI2O7nGDRb3Y!85Dl>(5~dhw|B(4=j)b-!A9i=cvaryrTOKy}$;zW< zIjd6F_Ydma6W_Wqx?W{`;#T%9vuVF+k3-+|zwW=bSzL6qF1fC&!_&W_o_4{60v*Vt zR_>{;U14`6rF+AVT|WFYe#E@9hZ=b7eQMEr!e6~LbB?`jg^>%|2DNhAV)GM04jPkY z_5FYHJalgKv!pwV1~swLu1p9}SLspqDfZGcy79VeVWXm^d_OWUA>)JndOug6)|&Vi z1FCku5_;sG_m+EtaDvf&oH}<@sCw{>!$0?beCEP|X1nJt+;8g;k@M|}I#;5y&P8MN zg$k`!Ry}Lg#d?w7nI|od-!ScHwyQ*Kug5cP&Gk8dA?eNVmrFlj`IgZg=ozuMUxd}h zfq$-ZwAygO!}-Tb8sUDC@y{-|7EBrjeUEQ%7~Pn(`vYr4KAv@8@KdM#X?u=MXk4Y( z;o)Yjes8IGW$HTixFBp}bW=~;l_?*X`oivx>s7-H6MbE=NSPe7r=RTC-+G8_Wa#$mpI=8}a(!$I~wgZz_L&-1|RFx*iW# zZ+$eRQBjYV!{68QqcjaqSPfb}cO&?KC~LY3ERX z-BRW9_*$p8)~auQ$@`%Xmdn9Yt^9V`!s|6to=soX$27XgKI`fSm#s}}G_&pOWvb#u z%awhAZp3m%cRM2DioGWF($SyyPbzx)@YG$+irIa5x8L4pM?=5hyTeA{D2yy2$9`o6-ZH46W^G)*yqsI{lXL9%uia+8 z{=xOlH77d?!W%|c<6Tm##n)}FcI_24TfJbb-`*qd(yhWTS_aM`_thmc1h8?t_2x2J-^Sa*&60@G@F0mQTU7( zDpzX6(Ok!;VV>lRJQ!VV|3$uZY+fKDAMuf{v;UiT8U?FOp$h>M*K_K!;8rOwXo?q{_pkXU9dMo?So!$`aikhLd?MezTUh5ufX}g z;ZAZ=X}Ip^>#qmSAWovb%|}1}7uojT29y6K*#(#mXsiEkF690~1H4}MbY+^d}F&z2%Pd)GZu;y(GSBDhSK1M zZL0Oee3eHUuKSCPPS?rvU9{8wJ!Z5N0-FbuPeR8i5@rC~t)C=({v&K#@X#^(Rl*&)nyvlI3$79R3ee;^bPM z1X5~1fqmwms08fWJxHl+C|zV|pCzQ7nP_kzZn1zgbpjez3o-!Jc<%;S4X`_4J-{Tu z=77n7-he59!GMtTOj_$Ae{BGJ0BS`%){@;K zr-68&AvHn+Erfv;&^TEdv`qSHV44#M@|?ijVc-KaI!pD-n<7dSuLccdTT9q@g$Rd@ zq|%lNs6Dgwl3k&;#Aa*~Y@EwX*f<>(^-DY`X4xzeZB#sD@>Zb*9L+ZDkkzmX+2MU? z9(TjWi>lai6q9?N#)-nDxGcugh7!Y!+&HoA0J!8cCF9f0ll1wOIrBP~)ide)4PwoW z{^JknNK=KtSA!&43yBmBpLCMH{@c!^bZl7W#}GDSgcYzkxe##t`%Wp(sMRFTsJ~bl zlG;FAK*Ep8=O2d#G6uBw*IaHAqZ!T<-LaO(WsyJ#W*f zPf7k-LHZ!>_~wTjhh5Cu`IRBZ(T#cC@GwIC=_(fq&Pb7tn=Jh_*k(zn0= z`{}@wGxs}Z=9%rB+2^6+QLMmWT%T5Kvcpz6?0ScN$6-Hk7&mIF-|ogHr@C+*VEpI5 zGF5?)G4Yvl77&fC2NdKWezTws;CUC1|3)SHAy0EW6B7%fYw37Br*;rIQSM}b!K?Xt z!e&o9QxEv7v<(>)4V}GBlaY`p)UVO3!mPmE<9ynDVLCe){2vIAzuyC8+V_C6!qA@{ zaHdTUIMb$=_bB!~!>6B^QS2#)aUZ*4xBx|LA#dWm9J~M{9dqC9aQQXQt4On!p>~{; zj{6$R&-3tsEqd5IRC2d8RDNwH4vpb1pO)_U9{N}t%{3QjnQ*t`M)IDHCkJIC$MIo9 zR>?(QuQVz2aIcm_mHuLNM~B90>xJK)1mnObS8U8ie|;GWjK*fM zzb8>3t}*xco&*)tW<2NmdI}7a;UOQTNI_tvr%=R0-ixoSQ(^prSPnH?!b4;6cJ5J? zmi@}bS!ieZtVL}~bnA&t9)d&-O49qL5}G3~)ju|GSam6NG#4TO1~vwiqBB+k#GnI| zaytQ((up2lBo7qzC(;8H^+#IMOF)?~XgNiBQKq#H(WZ5Xwh*uF6^YMai!HVg+hT(; z-<6LlOa1bMvtpuY-L}Pgr!|>?fA_h}t>3%r%QNS#OnIvP?iU^{9jPcOI{bX`)2}>ubMV!3F6q7FqEr9!T=3TPU;p%r ztdH6ayY;HSbSb*>*+Dycx73Ht{dFvUfR^zt`vSfk*ZWL?+8%?rvizRSlI8T=3 zHmV;^8hr+;Q6bQw5R>fO;xFLJcWo|Q+Pi)@d_yq6je*T26joNeuFg3)z9AT3i;dTL zf2zFmJN3h%2;ppFTzrz9Tf7{cjQvyD1qs5*lyJBaP_+X^#vdQ1CK#abGBLKgv zA+Od${$3CHvL2F+^waQMjHZ;zgeG(@z%}Bz6X;)F81_OT1NxccLwiZ1zV?X-(`xzy&|t^SS~z{l9PA;9+aYf}Bys}A zp?Vy%LB^ZGd+Y!U9EulXwmF6*=}f+8GKUsO`?HFxoI=lOuIvh%!8&+fYMJeNDq(`4s)TWCsFMVdrA&r?lx zRSx`3u=D&u=()x|zC=6ES#2M+Erkg%(N5^dxm9)a5b`zrI8!#@~y##-|Mpb z!Yl51Vn#t#hr93Vkly3jO;;{^;9G-c-=2QnJ9^i1Zm{7U!t7|~1{>a4d#ms@ytDRY z;cIxuEbbx4dmG*{J6QM{-Z8sE_!{0ZiwjQh-iCL~o{q))8g{!*ebd#L1j6P??5%0zBJKMg5&!R z?2P{p?XJ^pX}#ljrG3rab#+6+jyK(fc06|1H4wDhZr7uyO~(P#4d9Nq(Pznyw{h6= zmKoiIj~eDgr)1-@@+Q#<>1$pA)*OG+FY8r}4=hwP$0mx>7V9cQtGAS9os(YHXmE7X z-ar99GE}y=GNq#V>gv+JV2XEAY2WB)m1)tJ@Vj~C>FcUS1kTx3+PX5Zy1MKjf{*48 ztH{UI*JV4VUKV{C0pmj2O^xwcA@dX6Et#ZW&Hjopc6NfZUo^i*pNBIjyfmerfXxt(BXN1g6xV42wxSWmavP18{> zH&B%#PIjSRafTY(C6I{#xCVq9`0@Q7dj+)Sbt4IpizzxvUIdzk^{QqrM4LZ0M8pJ1 z&?xcDCzD6NobBYYNGp>(j+D88#I;3zr%i59{P3%YSU7;mM|pOyxBeA-FIO+@ow3YS z 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�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%0D#BLg$%L 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%0AdQWTmQl<} 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�KM!wWY}s~;kI7$-cS0B9j}#vB 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
      Qh+>rJI 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 z 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%0AA{_)zko|Cl7l=+uptK84<`V1 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

    1. cl6sT!5vlZ2gp{+$v|*C4g-oQgA-1Sw_Iq?(dC||Br6$t|f^O}FOp&K9fb zwp`v~HQk=eTdbyM5g39Vl_QGm$z6=&&lO2R?~BHdGpm&Rs6hM-h3@o-t%*L zi}mV)Jl-wEdUfwy-eSGFFqb!9ugGIaBUbYsMhq7-vy@m93Py;@Y!M5G%yvR%^9d70 zgg7)q*pA%_dNJFL+Fp4%0f5SU#M$2HW5(=rCY&eWw0eQ8#LX5G z<$xpv&NdeiXdRe{<}f1SoN)nBwC~u!Bx=sh7Enif%TuQ<#^|{B)M<+`I?_FL+F*>1 zZBLyx7NeutQ*%nOpqA0`>!}Y->2h?$dg{Yc)X_1@Ry4Ku;VJ64RpQByNR!8VlWcTC zKQc`o?@lE@Doq~mPbEJ(O&;%1B|j!j9`8{lzeAcl-la-@Y??gYr%HZYnmpdAN`A*Q zdAwKYbmYD#VQ8=4cIp)$gNuOg71DJ#@-Okt$))B}x3}gy^!OBTe7R?G0sg=V0kAq) zDEVQp16PRHB_92RG^vbuG@?z>Ogw zf;A|ySAU9`zQePY0`p}wOi`0_5y9;f!bwY$e-9m?bxm)kXU7lB^agr1J}?zMy=jhHL0*{j zMtMto{3v>QbG#+4#dk+z$WZA%Js57ZufTh8@YNt{l)ZKRe2ZN-UNf zD#;*EicO^AsEU%}9tsUiq7nyH4wV4j&5?>Rlta4IpCWsZAjKxirAtaFwo#OLOJhol z7MmzaRUghZebHhK<h^9J<`+U$LFvq?>2IC}cxQmf=_nK#4n(*X^NVtzH$BpaKU3!*P>Og)xVZZ-7 zUlOTT?d@7x8!Yhg~u=?OhNZ*42425ip zD7%Yca4iCpg_KW`>B9KHVn$YMR}<&NlEqET4+tQoJ%2T3Sj7K6@V zMUWf56YIsaCQ6?m{1g)>E`iHQp#a<%1xOU>{^3q{xe^z80hXtuBTo{kIBg0QnEPQg z%LiQ|!NpO8L<__KblTC)YI2Tnvoa=8x>_Lx^~MzBx_OMiWVs1WKZ+A$o#ks(!ZnC; zsd|NzO`^85e34NgZhLE)&UPnKeKax!tPAVIO0k-TfSKZOg!$o7W*4rO;Gv^$;dw-q zM|w5JX~W`?QO>kVCy+=dA+eSIs3?XUhtAiQT6hvMA-9$O=qP8pbl2Gl3>%b>iDD$W zI@Sa&-+1d$fV2=XK-Ur!y(#^$-*aMXOd3j#d+3D_O4$>%4M*e((*9ATaH8jIM0hTK zfQxXnT8$)UIr1vdONufBn@S!K#gl&JOYGqWxoN1J~hWj6PT+K=`dG3FDY=)QXslCx!eXic4BO*-<8Mccpx0h7|;YG$& z!p9%YX3CFWh0fNtSSdtMO*N%w1Rqxf#7m@z@z9YxGV zNX&OZmzz<#-!ZW+M<^G+E{nX8lG$p6tvZ@3H3n?%+4YaHF_5mQccmoc;zqN1a4iZI zXAP=kU3WCIg%xs(-F*=CDR{%5@1nXylK=@ya8KCuLtk@)@J#+Y;KY;fFmraC`} z;`n+SUr={SQzN~0;U%#-H!a0djWQG9?Hp`2w}d)qV$`BQ!K46R+sGvlbop|ECI8qD zm1zvgcY|=L+A1POT#mnBDKTkw>=&z6VhZ8-matzyquysJ$XMj580>poM!g*Oq9RH(j|uvb4DWeN?Cph>_ogw|}AxiVOY=Mg_$TiyWJtTn53Z zV{On~YSF_PgY8?*tTC|V17g~gu9O4gq-!(V32ldgnU(#d&y5NUCgD#e)G$1`wI+;-m>QghQhR?-xTT5EcfP5SofI4=yzBHThdk|^RpqCdZI>2Q_7zp-SV5K z#K2^h)_P_4X4Xz${CKI6Rf8FdFkg443@>+4bbruJW=MT03aF+s&ZXe=rBi$s_AzYqJ!cnm19Pi|l zqZO4;as~2>j3VIT>&kS_u+t*1i8}P@7Dxk`voeZo6Tu5_Ei+)<6pvviZc?(*utXzJ z9|7or8DqFtKD3Oy{U#Yh*k>gNuS_oit|`J*QQV+u%}&vAC}@2BLE7@cMHu0F?^`c3!f?37(g)fex znE-r*6fUagdqG|jWsOt&)-$1 zAKldC{QNHHz&g{K?4-xV;Nt8oiD}d?qmnq*c-TW?sxyuHRTRn1**Qo_Q^BPAbrj1r z#CS-qpLt)V-W%0(A4x$jP+Ftrk;a(Pn<_Oim;)zKQnVJ`yZJakjC9|^G-eT89 zWv~%jNG~dlIMs=t8O&r^i=w!GOfZK7+BT+_MEMhpe9?ohu0vWbDfUV=L zj{Zu0B!=Y_#g7W!bE0@y2zB$zqep>UtVIix=iSMnSPtD!Yr|0Bm>eB1#cyv*q)n zaH&)65YwEnFNm^cMx4LsFGGLU=4=(ug^oZx(N2!wqULacBKSZ)q~3fDKBRiPhG4T@ zzVV;*!I=7`rJzS-0D?YlW&BICFL~7EB48*qg?PwqHK2p!O8BW>tFcOGNp@- z_PTS!{s3{zfn8-jk}Ll?hC~_X)R-i7geK7~EGhh|d=|5i!C{Wp2j_FR@rNlfhxh7y zUf}?%1Ib8wO_X;IPXHuKGY{3ZQ4ZayCPcJ>cwLmq3B^r0%Mm`(eAh>*1v*1~!x&<& zM|c)}W0Y7MhmX-+0X7@m6y*_VwA!;Ajs8N644sYUM?)k>U*^m9eAi#9_VXQO7E=ss z83UBgz)$gk9lGjO?H6%CwH$PNGN2$LcSO}dW{3oSaKL&rfTwGmI zjC&n>W;gyaE>kMNDJ4XD9W%rIu%DFLFn4$h;P-j#rtp&oh0IX}Trk>7q5|r54t&># zPhMuwO=c<{5ye~WwRnf;57}rN)QVIj(4ZruNV+eBi_g6s6KRdm{;)d*OQ2Vo)4PR!7SI1^yeKOPwpGh?+eW?@`Lu)oIvD_r2^%K5fRwCFupQ!pNKw& zZ&3R}<^B+TM%WNCrs&9&i$eT6hkp7|CRc*!gG+cF_$q(*?=Oywq(*aYxPS?nkL%&d zZl~QPxMn=?_;NFd@Ll3t-wtxChrh`9o`Ji#S6lN0a+@X~m~{jvxrUPaGejU0y1k{% zsWqrA<(dnTgv~_(VqUf6T1uiA1mbHMC-J3~)K`&HNls3akZuZzcBxzkA(TbrF-hs? zDV|><;oN81jZqckvIp_nPEajE)nU2eK{RwFXo&E-#Tv2z`Rtxd32lOWYHSaUYDq{~LCqR}=J4x~e z5SjNfX<$6xPN9yJ`~U)#rJ~CuL?svfi3;yC(qVs=lv4c=soc~jQuwI)xN#MsHFw7| zPm3A({h{+M)Rt>=cvOzU&quR7gsBPMgksn%;v1c97{6js%hTK#ca15!2Sj9SCdJ7X zdU%VEFQO13TM2Q(IeMQ;0eN|h({UbC-Vt7)0wOV8Vn;~FHgCe^lM^V>Qew^$N08(% zN__B>8RjEy0n!vIz*&GOfQA=>GW)R2b=jkh4-q-z2SjclF)?SLM9eIoWlXQT$k9X_gpH#oxS1GIn&8PA5*QcQm~eh3HAKH?$9NOPqd8L=Jlan*;ZQl+Pgt&ND>Sj; z7_q^+L|>iNNql-)Nv1RU=nPMM6xM)5(VgK4l3-Hd-8}(l?<+t^Ll-89#+hBNkjx~& z!-MFY0p{qkGXT4LiO|_&5vk?jN1h(BSe)tvQ0>92k4W)4Zja)a6w2mn%Z+u;S?Y?Z z&m{&PnH;yHSm{q}bF@44gLEf8Xm8RaN*vOgoa$Izo*MYfEl4!dub?5v(69%usDv5Q zy)jyC8@^<^q8jABA}fvMMA(ygj{tg^G9tmHxi@(p~ zu&a#&=UQXbY`_~vQU1W969aPg5w+-6ni_)Pq1TXJ+f()g0X_DW8F2E65V&j-Qp8zo zl|^<90XaK#8pzm>z@R{OI`1KP*+*pQAv`^(Yn9ce6I-1b@K*3z9ak=Tt$Lrk<_uhj z-7wW};7E_QEPR;F4Ljp|PHcH*Cvy(_X$n{HJtrnTf38Cpedl}ljWPJG{_|e3&pUVm zrP^M|rW?bH3J2j#Z@n>gnCiBs@uY@=MDgDFU8chC6sNrE(hSayT4H z3eowaX*3#+f-o08ry_`X``qf_(mjkGdaD#|O#tUX2+?u`pCYhZa+7Y|GAmk6pG8Z< z&oi@IL`ye&ZqW+i-ql-}3t}FZ{}9tf=_q#8;*6W!OcaGJKZm+Vd#X0eN~O6W!)FRo z8VcLxKf56ld`3>tIse(|a_|{nYyPv-*x>Un91{4?t~Z0v_-bXlz6?IsLhk*ftAo$@ zTH_^ghi^vie_t>EQREIj5-<(WS#+?hm%S#gZFe;1C&Ik^cUd#T@BI#ar|zHiB})go z(9JDQMd@?c;_mZS{3q-vURK-$JULldIaL@S4 z$qF5^i(^(R7j~)gZ{OzGW#JClmoVAO;!ABSYj^nFZO>J{P$wMz4*bUhm;hvP4*@7z zq173p5ZZ%N3x|s1FlJ{q)Bgq2;ihQhPyFt^hh)ufLaAF(>Xc1A&dIB( zVrh~iis|)@2OV*=UjZEzjc!(ekgS&_gNmlf4m~nU1~k@(0PWCzmJDc2MqAGd(XL{< z_K>a}a~{oUnwniJK_(m#>gdQ4LQA3MN~fbFLr0HSf=&xob_QK#<*mz5^lDY6S%Z8;lwDc)TW1IP-zihRB{RtYPL%fsPv8} zhtv>lwr3Kw@N~OJJ4f{7Xjr``WCVd6QoU_X5SepQsdgsP zYy&z{-ZirR5m~lH92u)J?KFrg+ZK)rs?0fwNA*<>d?Mm(-7>_WrWsgtc5P*5Hm%z9 zTR_rU8?K~D=(m7mZMc?2!EaNmC`ioO-~BLV4W;LCJ;E4?n|KuLPW+)H8>Ci);o8bt zT0HtK6mMm1m?i7%}q`##(P!8C>!h` zOp4@Oi*T`%!|Ao4d*ch+MEeLOO1MsVv3VyIwr(=j zmxm+QgY1xIi%5yI(g6|nPjVP`_Zk3@keE7Y`R6MnSr{J6q&?rm7}XIFoF3HLtF<)=Zhb-M zj4$JVpQ5%CF6Vm>x$@oZoDfd}6wpLBG|Cz?8Gn?ql89+EG3mlPH^&YE~o({~+x@*M%| zBco9a-m1|ALg(K6T@H!Jxl9-7Nw81U2FvYG+YO%qvD5xM5cmr-I8Q>C`g1VNrccJ z3KE_6K!i@ZimX&3WbZB-IZD{(O1}97te(72xwjrKQb9R80o9? zT=}omL3GMM-^8(CuweJ!#8ne~8;VP>abluG%2*+`3jx#lArSI3;af@&f zMwQS2(nX>S1T{)%L2GHa#A;7O;^s)fK^vHed?9ln3K~nC{xbThE$MS0xcf{q0F6%i z8VKyZ+6bqU2BHZ>H3ZVwVLzA;6fuxFKolKOL~*Zhy`qRht%%}C390d#vzw_DG3eV2 zqERd2{-%76nrM7ke+%^k4=5{RX=gT&kduAyI_NZ$-FNKp{t1gfdtW z50u z-RfA+_pA?2uyQfX#ea#EzQadZ_Nx=@DNYeO%U<)PUz1=LdIlLu(P^!Knn+_^=pnAn zgAjzYns@{g;<`M9v=B}WJcJ2xeI7(gh%|x;aYG(LN(j{~FN6)k8xs({nb}=V3$q$_ zQg0;lM^AJ)(WHgMtnKI8jA_cL1Zf5(! z%=RAgviLsWEr^gmGC}TX!4Z(tttcUXRDztSzyjg6XF7?a&V}jGF(%?kcMD?aw4let zc#;LVW(*2ik1-_*QXVVlu`!-RLE6~C?0?u-IAlLuT7tF6Gni@|o@C(Zo+r`dZKcwOd)XJg{`B!>|hn1O}`H-THD&&y0CRFHD!_2CDbRS zsOLc4%cXV~a$Fg~7XQhzl@ zy*&^6Ygy_Y`Pg5NQRiZRBSyU=DT&Pt-^^0aY)*?}SV?y5H!(8=;@QEua2-ar)ULJ{|a7&4%>vzRQPmdeaFmRNPo&_cHA{IVw*G|2sw) zL~N1$DU`pDQThNO|1u<}DHD$WiE;R#wAB_;CdsSRR>=RxSo-x=zfTSU;~+y+3i-bn zhjT1TZd%Qlg-}BTgz>Z|tbd5HigOhwOmIPU_<2{8?vMElVFWV=rb!V~-;4Bv6d``Q z=BT^Ot~a6IkWW8HuhsS`B+N@jx1EJ=V~kH7r6CJ#=7nXiaV!vuoUlUqhNtk+NK%>f zBm`bN=e5@MqFseBzA?rqwV!L%`pQ6_M`3t#jKOpa4t|7<`RbFG?!HIq?sFB9Zg}K& zp6)^*7zd|+C%Nxa8|duEeP8P0hA(2DYIAdlXCTMUcTU!*Cn2GeLqzKG9bSI$L|kOA z;DPnRX}%!o5?J9<2JR73hywY?pGp+$)^usEG?;f%&?$k@JoU^jH7izdQ z$O7aJ4P&*>m7;U?YYFW_NaSoM7b!#<-09C_IwB_@wLUH8M2uIP*T;~Pzl+F8Z;5<* zot#x!hNV_RhD&|1*IlZ)D*%1w?FPI&1Ege=AZO&*Xu<9Mplw$)B_YfYqCv$DGPi z#h}jP(UvL;OO!mBPQ)~#9zyh59)13h%pNnYL1pzA;oT^w-5nTVmeNA~4sjlSJ;1RPatI<(jS<=AD%NiX$T!n)V z2?*HiVqJNKUo@Y1LyC^X;fZ5>up_m zXiA}Sl!0lFC0NujE9T4hjvXZC>IY81P{Mt$8G=lgj>|QD5TuUi^ zBj8%Td(wwbB?wc_43)Cq#aigmXyyH$O6(^=m*0%~goHcK5%DDDi8|d;V@RWqEd5$% zjpyMY4VQA$F~M7?)u*8lG9S6nWn2J*O-4#Xnocx4k`gq1lt8y0Av1+Ovk^fNjfm1< zPO_DWa}#NKf^!xx;_-DAwtELH9C;+l;&GASkd&nePC=pod3}L;$T(@tb4@m+%Ys3M z(=`kziC>{Ak)g-L8`H$9E-Vc#d5?ws$yLbLSC=fh%|ez0@2CKv^APtBEhL1I?4Jk* z-3D?%+B@XlAYNWXeBXLrp7dbc@q>ZNL(>`Y@H&yl1NBI;HOq?0*LU1~E{wwZ&eawy zXf2&4nCEDV%?(>^^mA~(E3ot^AK$7zNTBRwrVu+fRta|29$Cy3g8GagxXs2wU@($_ zFc0Sp8@yHv#o#t9jUj|82N|y<2d}1MF{m9h!ChLO2s+}2N5U~X;7Ilh5iX4v7_lY6ZkZFqEY&Wef6ek;kV{Dz8pYwPhx=D-lh#od z5lpXxhDKD1C`SX5?M17ig7AEi0*P3hT2~5dQq~J2LY8hc8gB~3eV>wHQ0pT~h3~zy z#?w|W{AX{`os z*%K5I=(4K>&ga3FI1>FJ=8iOiD0Kl=Nj6Ekn!`##XT&OzH}sgdi!N$XrjF47_WN*Q5g82<1=6xgToMdoTz<|+mM1)Nm%~jy z4C0nJ9pi>Y*5+ug96s$$3EwfkmA=jp?H01h!c{@r87hJAM)D1IS1Y84#=2Z!NGlO8Re1{Wo0ivI+Lv76%OX*EfXV|DrH zYraTnf~ZZlEl5QktUn2)^Pagqrc=m+}j7ld=+b za(>jNYT*^LL46U!R}6_MvI2;lS3i?gq@-7H5$I}b3@K0eLNUur?n;J8EJvj9OLx*)KqdAa?F<4tMsyRae$dzpYk#BKnUOYrD)*5p9c|nCq{?v zza*>I&%bY+Q98EqG0P}CnmtyP*X5EEFdr$G)XXbSN#Z(kgA+QH6qU!BK0rF zZ;!|fBst^I^B3CS`|+gbCbC**ZjcD4tAxsSj4PNunVhAf*;~OV-t7uc4w=adSAkQ- zUy5Qro~fh6z;fgwyD-YuFa>@z!2gIwothe~^_QE7(rzPf17FprpEu~wFr=E)>2$4v zK5WzvOK>RB8tuRArC*4Jat&}IGvb-nFECLTP{{EPYj6KMLcK8eF%vmKzM%6_a4f_3 zzun~MQqR=p*^b5X$14i$j&6)_QkqbAg(H`r(b4aGZSvIs;ax4dlpGrLf|Ofo#Y<0w zq~AoyN)Qn88ZFi`kx^K~yFkV>J{GbiWLyjF7k0hyRehrFgZhJ@=Jgwse&+S70yP%p zNOiS>@+vz4Xmo50ouo2XRF^bI=V=Zfp#iXPVAgOC`@mU)H@(>(!f#YVTezRTjI=dk zfAaM%QU**t2yI`$|1Qfzn>?EnA*bp?47vGgJ)xWf@Vxd_P-?inn~W$}AFC>iXF5XU z$nQmO_|9Zpv-C~l{Ut?#_e!#BmcDBwy?i&F_%j|~HgVc%s9P@n3~%E}CfUgaJQ;k+nN75^mkVff@n=20Z0G`> z4E`1<@4koM75E4V7YB!2WF#|)e#S~HKjU69&&Tv5R#f?sg19xg7D=NUGfw_I;Nna5PKhd5=8xmNc+UM5E6!|ew&?1LL!_#_>_c17=7X! zK~jQW66L_D&Tz@u8+{&d=OR?$Y&KPJ$*)uAcdKg4cwz#x2(4=L{hZ|Y`5FJ^+|-v@ z|K+^Y7s+-@Xy>QCZ1p@Bq`qwPU+$gyvfY2VF!kju|D~4tA_;#;g1OWe=|%cdPklk= z2OMPjbtbxaO0e5H->nxImCi4tOC+g0I~+oYH82vIGcZF-fspL$C{qvHC>FVJvmy?Pt_Yj#``4U7j^<6gyg zQpPj5>zceRC4ymwfIZa9?KNNRl`IL}$YH-VL9AxJFXPbBv+v4$##R(r56FPO_hCGH zLB#o58=Xtj13|83cxHGPNc3)l(L)|dCBGy?KI^|-n)$ZHf4fiS+gAVWzL{^^{I~mM zzDZIl5`C2Uc9!S6f9Bf`|LwBOx3m4X2V}l&_C0)g<{NI6wQw1Y_E03y?j!-y4f44p z9SZ9}dtj0T86?m@blH*kAC&wE72@>5;gKI z$xk?Dts}>;SAbiSpXpsE|Lq~kZ^+y}^i$nKli!d@h91b#VRKvRDbUlOGWZ+4c2*MDiP|;n^OU`h@3Se0h&be!~_gsQ#mqACZMn?pjjIJtp~WiJFaK z5$W4{^4ki%H$-#2EdInL$11f_Y8pIB$Q5Ju=}=KZoO$Y(naKn zL{y4&+889Esb7EHEr6V1H{nONQSBscgPz-DT=_(#Tbl$?;L0Z&-QHwq;L6wLeo?Zi zYHchOa7%lAesS_U-m!%H(SLnO@+;YO$o!_0+)Gnmd7adcFH3%ey@Jc>@p5j>Q|>I;P$inz9#t* zS@DC9Z%uxLUPBe>A}>|wZIO?gdCN>+-=6$BSVRmjHsDB8h3r3g^SQ?abLsRqL zK9Kn~=fC}3=3Cu=`(Wmq&8Q#Bd^1@-ocT8I)#f9aZ@ZujI@Ph9A#RkcZ3o5AY{aog=XpqhmpU-^9(=%${ zeIfI)xr>}y-hljKh5)Di9NF$$_DeAmIOTDc;9oz7iwR+z8a5UyTu94zSD^ zMD?{8mEYFr2>*JF%I%Jn<{KFr+S+hJ0^j)G%+N@sbh`Og{5v$eCof@;$luNo;T##q ze7=OlPD5`sr@cH{@n#w18>*ub8OPDONN?G+(_Cv?RVOh*VXu$Dc+ z-Vp){Veka|LLZ)Bed%cv8tU?ttVsjCBNH^7^l{ z+JPww4vYzQmIo!j*YHFpd>8daR@qK*L5ECE}*!6Ht9!7Y@$Au)9Y; zACmb@Xnx=vn)!^l&Q;3$MQ1rA1&**{QXrg{UTN@R9F_s%uG9f~c;++WA8~@P=qJ%5 zG8A~EZ0Ay~x3ljD@sUZIIW{=x)lJ^D=(KfI9u@XJIxQWYq@lxhC{`cW`dkOlv~*08 zXy;r55mdvaL3d#R!EajJ9pY3hl2-rNI1L2SMe4XDMU&rh)sJ^fe(dA;(RRScCqKf& zG2=D(gv>W{Qr;=`jRtV9N%zjY347-V2}P``j;N}in564>=LhWJ)2U!n_IuJjcv6yp zS5DR7lat@zlH|`@pr36&VQof;TEEY+BABEWy1g}eUPfI#IH|<0*#)i2QwwLa;MeQ zxED&4omScucR|@{9X9Ue5@n}VI>nt+w)S*dvyHpEgf^E@GYQ}EElzQ!)L$BMtE0kr z`-qVmq`2s=HF0V9ZNNnr%MlyLk&wXz$nFbb(Gc8##f>J!S`HRlGUpMchTuji$%lbZ zmu7E<=SZU07~Jvnvz}ffamUkd@$?#sJDz^4r{`x65xP5`ew(M~XAleNw|jbi6|s>1 zEKkqRB^J`}@bnU!Q6&G_oI`-xpI=oh#K+Ml-H9g#e!ZobVa7A?do9Hbvz~!pa4BZk z;u-j{#$tx8o`GLqEN0lo!46buev~nffj7wrjz>0IS_>$Qmw5P{#w3p_mAn#3BMxrO z?z~)e;TQafk>77jGU8fW6RR#lk_;tq!KyuZHLfqR4 zzlj~#2{m#u;H4(FctinoT01EV5Ue3s?;`S3)EUWt@>pJ5f5w8`B?lxu9Y;ZQQ930D zMDCsT`tf?uZsFq``A3x`GYhF0>HGyt@vvUgaB;-juy#JP}!ia0G>L}E3KDvWmdK4A&ib7&!4f{u-QWJ?I_ zjPYH5`dHqAE~otiHTJ%tl!?ZsiwW?@Ant_Mej?s4B<6dZZAAGk1eB@>_so&4lp^Sm zyH^g#_#UQx0tvf+C~VOFfwX74em)~xP>-!W-WHARH>#< zW)`0Wiev?Pt@ zS6Gwl0ZYQss4g;ej6ga>4-N~{m}M)i=IYJwxkgG$TC&lqpYI^}vDYL7)<2Dh#0D-t zMra2}t#U{xDEExUQJb`C4D(~L$)d1jh1YBan`0Waqb0aEc=*y21O$I*2+yO3u88|ZRSa_wwDE;Z`T&&@n}LmGDJr80IcG6VM6^FmcUCX|PK9P_PaBReiBY?;XK5RyxaP!a?V9~5Vc>dd(X@(epx z6~4yjm*?{;aFW#_dZ7(`Y$zelSfqh<*c}&sB|S&yQ*EIKxK!Np*6;ZhWWZAx65%g` z&syl{7Vf8}r{D6GD?qO89+vY2ML4^XzQ7C0;w;UgqB@y+qJ1F-`~tAK?*#&u*4p368A1iM9Firj3R+r_1%)6WtaNH)-XpgV z+VUYeBf`binbN6NkWIllo=y)7b6O976Go_0!fv$^QcHx&xm*p!)-rV^+%qBPmgNz$ zw=}RcYXKJ*7ocM^xiIU-^VRvZ_ z-Wrj4gG(grKqiWr1VzU7(Vdj{Ukyu(V{4FCXsXhdkaT%C*KYNZ>BTG)ZQ0e*;sgt-cIvKT=E#bvtHIV#L>E>-cX&-m%GpEn z;#zSze)ZJ-+nPe!Hiaavi_p8-q z)ugcHkTyhAfE>hI0iv47_ra!--L?)td3BUSJ))D~0Hc$ob{Aq7dJRNTP`+m}k8Q_x@2Jq*{UUlrX`y3_=MEfO$-2(?3hLtbz|tbv!l@F}q7v-j%>_xY4`Z7I6d;HcTy@rSjzv)^ z9#laJU4qF0Nu@~Ggq4CmJ=<4PMV*U^dbXd-t}HD;u;@}07fB$Y7bbzb%uJ~ZuuntM zeexBj$6GxrQO%FXM)dm}2N+SI60u>0as+}YQ%bn&{XxONe%K-;bvm88yFRFXvR z>-!mu-->l3Nv`UX$?)J}A-u_;MbAfzZg}s&)y0_U<)6I9B(=n!q}#8x1kZ`)c*I6L z)0Ec~l(;2o2WWj3qV;L|rj!U56N(~8VgG1~S}rMUxhLYLr&mS#3XKzVPgz^lu*ZjByR znm1T^wY?r*%p6(RbQAlCVs5`8>4x)>#XRX1r|Cx1qw-jj5v`nWDx8?yUh)D5^XLjN zPNCU}eWBxjOm%)IfldqS)e!=Pn{#qJwmOOimiSY)KdXQ-=;F1B&YDE2!TIIHcw7Yt z*PMYOYTy2O1(b+JYV6A6^I*cTg**k(hJ8W>khBq?1M7*UF+vqn6@5}wZl_>cgC|$z z57bN5{3%s2ymINf_0-Y`Db>tt1 zR^?8q#IvgMM^xh3RWULu@to2KIV$no(g67?@x0O)5tY!B!rzqhJiP=?Xf z9)ZC)14k5}uAVO}!|ZCFTJ~O4j+H{}aKwqgGsmwLesMW|z8HvHVgtX%yrcpnHy&}b zAK8b#y|fGjj)j&f6SrsgCkQ&9ysQk2Ydw#`5lT&8o0nI?a1uEPod{l00Rq=77doT^ z{D2PaDQ+*r?O$N&H?d~pa=vfMSC(NPb`Xz+3#rfo=@AIQ-c`SSeN`D4GXA^(YU{qb z3@5sd;xV26`-rdCl;QOzr-oO&Hjhgp>D^{09IL7@uPeo=8pA30=GNe#qo*x(Eq{G= z49+5}?e&*={Q7!AM1Hl+-cXV^UIVoR-Z%*g*Wn^(BfhB|0==s#`I6BY^ejTyCj*D| z<_WRlbzF9+Z~0T8a-AvfVjcH~H%#rs-TF~mZtd%@8|BxY{Hmq@)t;4(^mmvcdM$+g zth)OA^@NDh@X`r%ovhIuBHta37b&wQRqH}mEzVT1XEnN=xs~V zjK7@_4Dqgm#o9`fv>E-@pVIF7z=VJ_XTeY>&1yGyA)Tnm_jeP*xyEy2*;`y{e}6C! zmS0AS7y){d<3nW_pYI9y11^8%10D2CO z0o1+pv5Ek^ucxP>u@6CtbJgRISA@Ylxs3SNTALQQ<-sB$dc*MV%Yvo0!fMujqAb5R zh!>oOelm|UbY~=bgg@{r$4eNJ{2(t4#ZOHJG(W^!EIOP&T^WND-%|>Fcj<{9(Lv%M zT}wZ+$AFhOL>2L~dyGiW7C=OuaXz=lfZT*SU4OnZ9HjxuwxHJc3ww&E4X6TsaZdqV z`?Z|{e`!zgxcPK{^X2krsiCNQw6By$@Pko#znaGz+%VMHxmV{Oy)Wr&<#}<0F%V|; zC4Id-Gc!Vebw2(^c~(4v&D^#2@?s6U2U#P(SsuU(E(p4<{#JPeC%y3N9Qf_>{NdSw z&4JpC-zfokUAA0V8oPc}9bANvV z?o~c;-;Ac3V(uAw#{l;@aaqKr85*<@-m%%QsXwSv2%W=r8@wi~t@Oi6{Iy-ULe=jg z@ER9}>6Du!-7rql8Bexx92ugbor?UZia=zE)_Rbr!}FWYFh8z>fuJiiiVrIMNhRLe zF5=ab>7SP3O^pq`l=`z$%zkvJrTX(cHhv7H+tb^}6r;qhYX04OcYjfp9Y(vm38)87 zzbp-5-Va6be*RyT2JtPRw#BcrtYOY6+=<3Bp15d*T#LxFy0A9#e}re|ctt|ysDIi6 zI8D5!iuli2EKWy~%xK~|M(%U@W9EO!@`lw)LUiZnaYq|9>*Ad&T-@^g`}MEJP-!O0o*N=>0a!8CC%|*L+eIIeSqZ^|Qghl}E@lfzBxZUKwMEmpQQ= zg%ePx$^Xd32(rWI9Np(f)3q6ODf-VW1oNh|OeC992ibpRxm{C6L6SYGbH(q*gXnrX z@_&dTXe0c0E_;yqWqc$2J`2IT;1BfuIpOJAezd_nCv(m`TOTWtn>jP zzPPyh=>&Gbc!;zXCgsox?7;CLUT^##$qDSBT=s>s)i`)OM7e4lG9JWB@Bff$sF`_a zE_=UAc}vLvfCeX|-DFUj_f#A^5z<_Dmk-!DZX$#!byVE3B74{} zLpjUXj_LTg$5C3&SO)rE9s5m&M`b!WP{h%MTn$~`lVTiVn$P*_pbve{zp zY>#ZoWx}QUF+H-iBwr|~E(F_3@+Ny^dl6T>N6so@8`~p0#&H++$l1l**&aD3mkHM! z$Mnd#CHZ1Ka$ZT^WRIL*#1-$63yRpr_Q<`*aToT;g~i;~BWmB)vP?+zi9=9&Pi5e4 zag5yDj}0hnT#CfOElQau=W_TtYqS{U7vs(%9w?B+VG$^uA?jHuI4kk+6e0v*;Zoc} zG8G1AT~zKy32ryR1lMfTXV5Ic9ql?bg66XT$Y3<;x6lx<#&O{n_tNQZU9-K0hi&@< zpBjJ@l#to65Qp%ow~?w7;j_9xEyk&bOARFV#MzH;H_y?EbL`CLxG2uylNwkVYRK)3 zb4V6KX$3fQDSmo{ozF4_vW~j*BhJm{SG9H=1i4ATw=|*ed*J1#)fT z-gPH44XODC$o41G)k-e23lu}{=biLmj)v+{mLf)(@8U^Yzjs|Ni$l9}gyZ1-3Dn24 z?<&jgqchoL)VXf0EW4J@!AaVHmz3qkQ>qxGI1R+J+Ka9MFD=X5p?7I0Dga5zkRogq z??{n}-uEuj`{W`8!^?T6d_SsXf8X)U;awwD0d)@EZ#=8IrP3wqN-?U&PDgFX*M&C^ z)%w2wcmU_f@-@~&vdaqCcrsLf1AB+l6@S2Z1o0?qZc(Jha%sl&&cx*f?EGerwwlDv z@?#io}EXT%AobvS@nSxcvG8Q9e59_0Aa$b09TIZUZB$iy4~TA zqOB8jTEA*Mg!aGN&5mf+Fc59T2agBAtjl5Btb&velx|t+Lk)p4r)U)_8h+?`w8GT~+6X z@$90xnZkAO-8h~*+3dL}H;qT}+T*mpO(|#mMQ*gj7#p>B@d< zNvvRFlEBf3=!cBQ>32u|;Dptc?q-pV>0G<&?t5q}sDr zDwiFh>d3N{im%IVCDlTDbTuI8jy{p(W^KQ>eoQr_Im#IiQ$y;3Y`HUW zKV$2tdTf?YlE#J>7E)`s=*^T-qqTq>lE_Y`)-%$1irxKZc{s_-nwg7^W1w|Wd0ZCS zZPQZ6{ozr&?(zOS%N%)^&UH3fNIvfB@mWq+EcP4Z_?2Y$eLRSO7U7V(Aaj8B%M)@@ zxL?#5^v0Olzfa8aMfxSN`l~DTNm*7N=yI4;%PhijjA3}0Rn=A(&8OyZTDW3l{HUGt7kS)#)eZ9|^Rn*&S(Aq}cKl7Rrxo$C zX9pW!dJ=V1!;?{%865~hx^^wrhS)qc{Ppsu7vTjf?PwK`t#XodMf72(&nSY4G=~n9 zXBP2x=&9;DLQ$wLsq>I$6*6m1dsWeAM>xo{IHvK{+Ida^>-e_P9n*8OC>WZmIl-AZ zB~xs)$gc^*l}?8BnCf|11W{RjjwWF~sK!1&%VOxl))?|@l=?FS@ec>QAj=&V=(892 zpq&?vXQ<8LhG&=FaHTq~v`ANBwiW*YCVvR+dwa0`y4d#UUHA7R>bY&+0&-_LT!MY-wBP>OG~dDkEE@I%k1Qdtz)wXpwLQ2+7tZL@hjh} zaseYj%Yh?6B93)*zPbvE6H?s7x~#k=i;!IdIT{DS&TD9GUxU|XIm5p3jqA29JY(55 z`d-ead0iHzO*5w?0z+=iC1lx@`w!%wetizPoR)KLTO#|*95R2F>?z+co^rO~Dc?Ar za!bR{cyG#~%r5qR&U$kWOFGoiGrT2-Asyc6J^O!^!yr3$5sjaXqW1gi9O9&*$=Pm+ z{H;0U!R293`?eg~z!v7D{Dk}V99n15@yp*t_l_JoGs*n<%{y~Q!*-MP>kOx%@5|eP0fp3`$?{`*XjM5^8n) z3DWesW>8H8GIL~e`)qyvxKGP{Z{V+VOs{Wnc~=u$GO1)*8O(Skt<}b!X*5`cmlruf z8h-CSy}mIYE7ks^#_k(#xpMBR%Wke;bJ?{wgj;wZ>Q-!eeXo2(r&eOaLm<2HX9<@E z+CvxE>Gge!S;+}Y$r=4!g@Ap(7`w#DYsp!5-MCG!?;m3qUGWPDdZO0r;poF34Nk8g zP>ye94y}$u!nqM;bM@BR^!kD2_}zLjnrZkbyXp0VO7Qw!YO=@lit+UN!6iV*#X@rP zNpB4UjgKeD_UsOObvsU)UOyy;7TJUQu1NU2`ra!!y?$s(By>uH9_3&woF2W9q3vzz z>Gi{6ND<=(9v3}qVE=6}Ru7LsI3pwFm+&>CJv7H4PhIRL#_9DV#^A6-{;)v(-J@FL zB6xs0cseZDCk5?v;H7h+&V4*xCA0SQ`cW|?3QyL47O$bIBBHLyq=$cq zvRS(mc|9DNUO&1Jjb>VSR_HYg#0$}JBHh;y^!u195bV+PAnJ;oUcW;W1cU=g`sUv# z_pWgl)Dj4CY(9pq?6h+5|VGNd=j`;$&+`|6n!RpN+Y>8+)`xTO>@yU5;J34}(GPlJ zQ$C)G$7V%1CnqLS?~0#ZKdBVfsIiK59h+^$HR!>Grh}PYKe+_PQomLsw*)*+a5-j{ zh`yg@?ot8_ICM_Q7azue>dDje`YHLK$q`C5#0dbr#~4vD;{pFHd@~EnrvRl+SfsKL9zk1PIMrIJUqI z76w`AwvlMBKcxxdrq@p^0n*sD(9&qY-j0PGb31A~=%mRFYD^&T$_3`yJz|(J6cb}G zZ7izqb9(*s7`tu?Rr#oFKdbvUFsIk=8Dq9SNLlQ96>oa|UNJse!bWmBkYY4b|BM); z%&bZ6>^JF!Xm~DVA>ohSYd^hyW?7u2p40BYhS^+-*}n{)s*FaMPOs18b4jFT+%_0I*$|03c*<5#X~b#POoo|;iPsRX2t(MZ%+Xi#rE|O0v3p3 zqat=8C1TT|l%xUT0t+m)>jt5s7^sLC&+d3)cXun;-Q8kfp<=;z&Y9U^;ql({$^Jin zu6O3nnS0MY_w>CpgHfEblOO*bFxrO;J}>P?#pLqPA!9o#y z514hK`G~kggh~c)TVC6$4soeR>AYb1371rq&()S#mM-PBgYR7oMJn<3mVJns+fM`0 zC%3zUzPDTwL3S;#u`-l|RS}rkpioO3F6>F+mvpq#y8Zp_r5KxwfJ?C$|Na;4wC?3K zQ%(p3YS+)#)gcsQRYhUz2K|t@VRC7nkHTIat>lCPT!|; z?gtX#$Af4Qh&O!ym?lLPMA?Hj+Y0Wygxz>9;79pWf)abLMAyKr1u26$g^$9sA0DQR z2drO#k%oaHe^UAoZ_%M!V5=%DOMAdxV{S(#>nixehBvgL#@q;W2^az=dl&GY!Op?l z`P0`Bu_-+kGms}}#=#q2_K6#c-@p}y36P4w@jz|p54#f_;EA&UP|L8^Lmw7G82!>P z;0pV~hbldtc>sgb0B+teNZR;`l))BimIfFA17_;OwMw;=7|=ZdUhF59Yjc-0=r+3K z1mB>m!&PgRRJ;2GTJ!Zm>rgp-eM-*|=g9-@r6=|3 z2B}B(TRUumQy)MO6S&375^gbq^JZO?Fv_H*G1R&?W$_IXB}9mm{GtUCp^rc+h?fyv zrgCG3(a2Kb2^D}RR4i;HuCkqTcUrM`B4tdtA=q-1>Elc-Il{|weAzw1O#$kTwX%Iy_p;wT zRZ1z%pMN8UQ6Zcsas`s4CQoW*W)((=B)L`^XHP%Ew?14+1S+~CllUbGB#zMnQ34IL z5nPJkCZV@DMJ5-8$NGqqgi;S-qA-qF0a-AJWrdaieUa~?R8+({{5UxlpuzMEPxA!w z706(6L_>vAKe<3Iw4jcW`njEz6acD%{)AUhqmly+qi490?*^z3-zzVnKJwc6I>4T| zl?$ROe`iLCUUpys$^&P1c^fKAxIG`VQ}6quFeJR%$p;*y7wDM;c-siDHS&)>#QioZY_ zC6ot>gh~9Z$9NEqZ6IZj`u-4K?<!9KA&>`>b+Qzaw`AZvk8*w6y4g-LLU6AR?l{j5p)^mwBRi6%ex0WEa@ zL0O~aTuozej~7GcNcQU|f8}P)QI&v>C=HAP6!!G`~w!(E{fv zz@F6#)nO2>G(tPErx5L-z=h-c+h`P((%wr2#UaAkP6Py)$@UvJBS}ry=cY0sDo567lg1 zVAJrVi!ymqvKzukd849yPTi4A`ANW?>Eq^044Mn3Q&oAfG)871uiYEBu)#DT5i+R> zKUT@xM?^@$Ng#!b=p1HM8Ya4N?-2+i_L{+?!>TBBc(Hy0M=}eGz6zlDIi_)viX|+!AS+a6^?ZP@2ZfQ< zpvr_}He1q!yExIcKs~48$RZBycpS=_HS!5CRt|+g9Hhz@Kw(+wS>tyOGl$Y8G5Kxt@QY}QorKVjp0V6Vj)Nu99Lxk_&Adv@k}c~ zn72{5f(WXRcoMOh2I3eB9|UnC1Bj{^^@P7z5gyIe86uN&q=EzjVcmjnQt1a$gJ@gO zlV{(s$-DB%xJ~&xfC~``2myG(2q`rl6hawwGZAz!8wcY9@V?&c8V3nk6Ks#{4y}-} zZJ`khf)ERbP&Uj$VmIQEV0WIu@(rq8G#VgROj3BXKng|!N&Hkvd^WjE&z~cU^@ZWV zGA^5ZB}ikwQ5YGF3N>QgZH)#UIiI;>I$LJL<>Htb~(uPj&zU z1gSVq<_?an1if3Z`mD=KkmLoF@hmV%fr|_-Q;~0&N1)2c!BG$%T{dPwg)7I|2Zd{8 zNouJf3``l0lRJ%~NIl=>#Y1JY4ZU9&m6j8GmCf%UZPUPk_ixYh;>Z;-FYAvA6Orlh)=*&N3+)0aVpSd_C<1QKqrIA^VA085EitJR5Lkhs-K$bOTS7 zkWl)gEHY)?Gz?sa5L}5U_zAgyv<&~F*i_>&;@+jC^h8E+N&-?#VPb(af>q}zP|uaJ zio4-LX*(RDZ$V0N1b1Iwg@_9(QNFA2qv9eD*a?baV*)aO-)p1sjRwO^N~Tnr0itFf zdk1*z2VOMpM>Fif$wSHBIowh2>J3|9QLb42CszwOX*^MbJTct1AOX+QK^QGa6oIRa zHfyA^SMZD2rF|Tv4o??$23fBWiGy7LbCT#<*wA#Ra$^Pu-%Y@c+6=&svt4r;1oA{m zvLt0D10}Tyv`c=YuP|IrvR8?x8*JEnNh6)KexdpEl*m#2os&ru}fH_}=5quz| zFVihjNQ3XBlt0IdjM7ZG0O`P)bD~M``O75u;dA&(Klu~5(MoMb$wk)nVsAn-pkn4x z@%YwJQS^}FMWz|5bkw{Ra`1b2B{hwPg$g>E&;PvV-F9}qFknIj^_IuONgNMZJC)E3 zbtTysur>i6tgkhcn@LY_^gszXh?8m7s2enQKX{r0E2swZtzELc%^TXl9632scbsha3&`+4R^966-1vU$TdB?Rt z8gCz7`>CoAA{{a=x@`2Im_LKgXEHZj&gelVLp8EM0qp>D;DP=MIvd@U6T({pnx`#1 zQSh@t?8{@Y^`yVF?k7x;iKVP6L2_Di4DVBtV0TVX#FHYt#*=_s;bL_p#)Ecno3Bt3 z2Tr}rQ7m!6OKz9^qxs0S^ET8+} zl%$hDE+BR|&gXnsCzvjvpLc{G46r>i0>qMJO0e^4;0Sp5IAY9+tTT|9uv{ZY1b1q} zY9CTj-V&iyfVQ0QzK1S_Y66pY$w(Wb?elZPvV1%yDxAU^xecvOUjH%G3bJ1@^bBWH89cDmn(|=rQ$2DTBX8 zz4E`vh-$2joG2?bZDrIq8Za5xM1V}li5AZGDklS-Qc*&rm~vCKI5H3zG9YYrqZ?I%Eh*`TA&Try|a zatte&$UK%DKKza@_F+qQzOl*sL<2|glH&y)=+-JlekNTYuC!#{%3W$!nJ87ZiDnR)atO!D!r9-g64JcKarENMPKl2`k}zQv z5eR5WI750fhPw^dZIo$5G{*yYY&ZjC$u7!Lo(ir}T9?aHIdYB(n?OX8n*b$Xr-FyG zy%!}yE|)bL&R&7;u;Yp@Msp}o>VtJGS?rN2wtvNgj7B7P6ZqK<0@xcMO=0grp(+M3 zgn|0^_k+*b5^=1d6*dvWp^EASm5(KV0gNVZ9`Gt^g_|tt*mWmvWn9UpU}Gu3H|G%y zNDxb51xy&h+7q5N(2j+vpsSLwMaJM(zbq`uTmQo0ROe)$%^;&$J^Uf6&sb_pELsCST=o;qQstb_&lB^l}3yYo>0kZp)C*e=A3*Zo>C>-z=?S+;9Y`x zhI6SSrNZZz4$9H_NRFD&GaC}9xAnJ{3d{<>fnoLhFyXFNG!+F-^(x6#kS&1wQGSN;NJGzB& ziDZ9xDx+E*Tr&0c$s!rcrr5m;OMZB|pu|8pd3)j`WtfhdUy7oXY$}JEm<)JaP85#2 zr{D{<&ahjSoIo@!64*RZD%(x5V_cb9*!2Wk6R2|^p)?Y=x&!$ZgHT6$#w0N?sgl0Ugzeha@Wc zZ>XitQk(X2Ipo#iVb$6XQdmN72`TJ3(5kAI;JJbwb(p3%1eTrTo#np zaNONOsnycy6k`4-;Q0Hvz;wcwQY=E*{em#Jfw1A9bR2HSQl`IgTNtFhEs10CtHtPJ zK>8*gR?$#D!?+nYz#m_SgRE#)hE}YJBJyLLG^*6pDKihM41fteZJtO0@Ocr~Y6lzE zxK&$vN`d$gd&{Bb*u|f6oY-~7EWRac+89|-=AmRw>KkCpY7jR?oT{6RtQG=v#1Z=i zg@OaGWJt`q>8cRPRVa6WtyHW~v8x2AZdU*Z-pmRrN^oe21UtZj0($}HYYRqcG+(7( z)I$aC}_UkL+}pRq>9nyVu>{!QPLJX4Vts$P+6= zI1JEHHIY(6RfnM$t;mpPii!{oGR^jFmQ{g^*s!|^UBZ+J5*>v4kkm4^DghPIbby-}c zVueJhEszm#kr@{!Ay&2nc909;6=)E8^8Pg+V4%cdCK3X0 ze%1F8KL?=cK%=1vLtWk#s0Z6$ec*X7(1I@RuDHDK1?&6ph(F2{1`asAc0dIe4{v*a zc&HnEa2kZ8SdxOi2jp&u5d79CR4_`vI)`N}Ff?9JOSD2SPZ1`8WN0~NiMk8nY?4w2X&z(gPN$RvLA)rO4O!9acU5j= zQSLKB)Pw}f#)NJ{fkdhENQs~4WE9?_=E`nc;rSE70N_uYsIJfga1i7%QC>c=w?L## zo*UZDv!y*Z1})+Vo+9NqmBjV~OLUTImH-*@2tQM$1BQ}$!U-Rt0>!<0tz_FEY9Lfd zDB7;DivTu`ffYw_>(BLzN|lydSZ#I7wEUq(lm}z#@S;f!Q3$^fd+pyJIYcHEVr|` z#0x@RTgUgpZL3y^)5&+d%!&mrWRhH<46NaAqRk7irp+$>vMhxYvyx{xE~=x6LBBAU zzXEzyB{z?xe{8MPHmu-S5D{1Ly@5W4EEMWvgf>%JGtB1EM4?d2K{i+sM~TNkiRD4! z=%X+gA9vW{3R|;4`@!3f*qzFV@)AIdoKj`XOg|qhy#VXSho@DbaE6WU#UB|*CAPV*oKH5=kEFjd7nk$Ksl-XkR znb=Sina^BFAF}qWdPc^wVEC{?84nmg@eAAQs12o&5K99j5s+l|7s7^3EOFy7l5Q@fU{C|7JexVuW^yCfn+1hPxt2k|Z5iFN~> z99bW+e3N0n)a zltegRN!zB#x?-fphG{6Qr<9Jhax(*A+*>(UxLqzNS}5c^c;xyze49i>Zd((1$0)QmK7Qb2F(_v~pr1EOmEze|kcZHBYRTR3|s?GANJuf z-U!%ork36Pi;`f$Bg={#nP&-b24%6ZztgDoAOeE51wUtQGbFlWq3let8}30MN&*{X zF5C;};e+de7?Jnj#_c4Ad6$;bXXv7yWQT-gCi9Fo{k}5kL^Du2NFg`dO&J_Rpa5?v zf>(o(PiM}O0fJA6BmVOBc+yf+pgUYf0iT&EfT6wv+o%DhiPrk4tqr-7aNXSGx2QGC*C2c zMOmP64iMbhdK%{?t-4i?)!(W6*-E#iyV1Z;ZQ3WL+?jp$8u*|&9AP1WIox%%k^@Lc4ymOs&3G<^Vl9?4AVmk@yqkIKNS_0UUcN*+98E656;+l z|BNEj`^xdw_e29n_v;VsO(r<^&8_EbYj@u7Y2kOpv)c_qdVL?dxQmz1eXG6?Mtk@#WsvVIywc&R*Nb+;dUKf>#Td3V)7TT{$?tiQNF8T@R206Rjgpr$s$Y zNL}*m*5}|pGsh+0cd=iz_U2Ok@x8MDoHDA3lwrmaT%)|RO+IdZa&Gl-VQA{Q!F5F! zU!)pO-`e+me6PN*Yl~hm%vFM0@Fnlz$?d_zJ2f6(JYde_upPy>`x;wSUb~4be}6&cI7_deO^*r_qjknlT0aH&IfKInV$ zxY@Z`ho4V*K6mdAt>;@zPG`KBFl_iz{rAg(CdRth@73YEcW72mNxZRp|DhA7k6(Nn zef6Z%lDU`id$nkI!Eyx5SvbLMx!3EUe~|0QBNM)5n%W;6(r;#9VDo`Fdsn*eR9tM) zZ5+eQB)EEiN@G?_*4nmRtfM{ZLG$kue5Zs=yI3%AWD}1U8%B&?%`mwH_oLtGNsE>p zo<79XVAl1mqa7>NK4m|G>HomG`?<5)dpkNYjG-RlSFp?Z@RPN5F5WI$={vm5p33Xf z`VG=~cY2q<a()D_p9q?GkZ`>{K*p$1V*9b2C={J{EafOH9wCHJE?d_#;i-vbzyry+MBeP!jKkhKp z7Bb8(g43z*d?dQF?TE#}e$y}Be0=2lwWpmw6o>|ETs|~x!PwcLPhS$;jdlg=!lZ|` z37=l6H?&oQ<45~W(>Qqj^KF5BkF?E-^n>82R6+dKxX#XsS$kokboiG=e}tTxxO=Cz zt!Ge|`Wb!!3EJzYfLLnbKupm-{YNH7(8Bl*028* z|GaIh{rw*7dSkQOz@cqJgSwA%M@A+>E|1`Be`;--@xijw%7^QkTTEH&dLg9fl5>kY zw_M%&n%TLX9uE4C;7;h*8Zojkee@SIpCb8G?;x2^2h+vL&Ae81-P>})=NB6o<{H5z z)pvuKHWzM+{$KDdblH+lc@D$;^Qt!mlM80Jtpq;&(=c3n}e88qj^DEXXSDZPV(b(`p+t?myPkb5XHNoB2 zGP^#r-B?50pw^z_p4$wpJ?Z$!nFE3=r9B-n>%{$m%NVAMKH@iAUh}?B#~m-bRGW4E zWMQRc%M1t4pSkPjHhCqxFBvzFonx3W1XnyifAZ6vYev2NGOzJk{ptJ76E$9>c1v5? ztN9$S1v8BWpsxtd#ly|nA@D(ih{;KhFMmopnZ2L!J3O?`Ug>4ivGaS�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�Q#V*zi@%^#?j!@;1rPM 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�ta1jO>IHa5{S~6M9@Y9=wLV4LXP1xa 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
        AmOvzi~Jk_nl3>&9$OklQ+)4UY)^WNvy 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 jfc-}-Z|m*;pDJ43t=Aw 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%0A9nFJRfQuWQRQT}5me;wD(Z&t6rl#!Xd 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

        sjpN*O?}i()6~ETA%d3Mt8-0jcH+vZ}d$v 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

        kl08p6axJ&j;u$@sh)!^D>H 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%0DJTxLpHrH9_0A16WltCf?mw{3SU%78{xH}v5 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

        ;8pz-rE)#2BUUju#Od3g%JmReVGIuQ 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%0AnT0Xgdi10Fdju>uglaZfm$z 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

        r^Y-I+

        P$N;)+M=AcP~Z~-0+kuH#9dFS;(0z7{0<`BNHdj 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

          ZAONmHO10Bk2g#Ycz3SR*Bvh@r^ht6% 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

          Fv!i-r~Af9LSR!f_&!+U90V8u48UMl?IP z79~sr%Dy@8|F?1E4{K~`+G+mDg~-52SGv8W zcGn2?Gh6V5QH*E&bEnam%W_J3=ET<8_WGTYC~cOgYFcqQs~zs}&&n2&(pt+-<1{C< zj=lHuA5l8^`rJPviPsw$B+V=GhRi4{89L5bTkFV+HsacxGk;u|*H~x%u>4`{o8O1! zkL#F>mpj#uo8Cx;(@@*o*fjHhO(R`3tDS^57%8p0P;)1yCpEU<<&^)x?#9>n{38mv zuTfMr$UD{`|Cwjdi=H^+|J(Fa>)JcV8Q&-MKQ#H&W-7pr`YG^o8&&^{4RLdGVSP*M zbel;2iPN#1*Wta;umE0{N8hORKh((G7$&GUSz#Bvjr@QvMz(hvDcD6yM`t}M{r@o0 z%nZJw=l@@frbBcp|5p*9?&Dr;d%C4==KpzI z(`r$||EztX7jFF{hispY*X;e@7X2CjUxP3))ci-ep_jAnl(3V5tZ`j>r&`Q?H`{Od zM~q3>r-CbWwzoFnp7=kacCa0>e?*~rxARCeyG-qv`2VPT5BREz^nLu?BqZS`kN^Rx z5-=bNVh903leC)xX{68uLm&wRfy5MwA_M~pL=<~jd#`IpbS*u}E;t}BYGpr}|D z{?9Y*-h0js;4XfDpZ_H1zVCV8clyjbGw;kfr?jg4&o#cY@DT=?uD`1H;dS-%7S#Ny zywAbMOB!nb++3`lACUP|vB>q%pYpPxx}omK$?~fd$Er(rl2SFK9OWn^cNYKJs;ctu z^?y~1Sp0tz&BFhiXzKi=%px0p?9y$5GG#L2FG!~|a8oQJh984sktLjX%tJydWy?7h z1@50nN6@B>j$uRjD}wT-^H|iJEMAjNXW*d7f}SWG&dft!L# zI2KLQU%#8!jz!SUoXE&ftH-=Ly@jF!H(5D`#bi{b7zh8$0ZA5u3Cg7Nm}uW429D@t zy?C|nK5P|YTNBR`+#E9(i;zM^ zZgF-I81r<3z?ho;0*k@#Ac1wo@2LXgc4~saV(~jnU~%{@64(Iz;y?+)qrcMx7LVT) zf#Jx4l`b&KWD0ByescwujNbx*QD&0BvhX`qU~OW9MfTmXczDJY!`f)e!tB)x2PWY3 zJx+yLd*~z93bL0Mj%_(yn4(m(vXsLyE8(`sbuU(^s8!@+C1;{6JF|?)W+~}aF%Ufn_#a+?d z3*lj&i$Pn>?=)=-U;TbV`vP&>v@K+4%jq+=PMX|&Zur{KQIBVauPx20T$>gG)D0L) zSU|e;ur@7Rc#L{{0$4>M6ARa-#cWUODnsX8oZ=UOUl&q1X>Hm7K_M0|u%fkTi30iM zoq1M|mZnes)6^2YHZ5}Uj?82nah3Jov@Nmp45W+=_Dx(dIG>KAw*t$-FV4Gw#)ga+ z)B>A_-yZ~4k6#|Wh_TMc?|y-?N#mpxXxHHPH-SBd-){xhwDZtbobN$dHG9G*HP>W` z)Xhs?pOLd8V=V@(-w>Eb*#M}WO{A!^p|3Y*WsRH|A9cl+^)Xkl z4K;6R+UaUq8fQhNZxOwqIXArN+sNjWtfnP#R{i*Op6E56-`06z)_8tj=jpn}^T&G6 z{&{T+ChqX;hZby8xx<6PRk24l9cWwMVJ?Ezl#u2xXKWqX!e4JLdB@hmaXbd^jI*rq zxI(Q7_oPik%mpWL*3iq*V4E9#<0P*u$t z(~Azto;DBteZ8k;UUI>qMY8`k?`_%^v-;<#izY#`X+^jdwb9d3U(>YPRiDA1eoecB zqE>eUbM^aCt9ZhG5&|fgT%?L3`fHXudF)Ph-lvN9E@0Ea=&18v3n26qnJovK4jjLD zY1GC>+*ya>RueRyyE(R@VxBcwMHaqiif;^iGFQJ}pW#Ot21=qI<%Fgck-_J-n-}a2 zq!Waqe1)2}MMKKfFsylU^!mt4n+}H5p1jV}GAd*}yK2Mn>pYu*a|+bZaWY1w^{KA4 znbA5?^DJlvlnL71p&D2;o=U#aREwFQhVl2K$TlV9Pz!+nU^(HyELalf3+gV^A;J1swKEdyC z0{a5LY^R~tZv1u?*tdozb@`#1EYWMlkE*{&IgOC2lge7EPX5YaTaE;q&VWv?9O(&f z=(q_pVWN=@VL~CZ=g-(mmCZg7hf6z+hbzJ^4Bs5zDNC)u9FDd!SV+dv4`uq|I*UKT ztxPkUm|10YY1Q+qYdNjzXq_gW1aw)jUY1waVk;3ePlwL%#7Lxbp-|F0FcF=Md`)e2 zdBf~_Uk^H!tY&)PP}|e$$UYFrHFiW%MTlVgfbUH}XHe;vRG(;qtbAsagK{!1?Q|J& zHk_!4m!R*n3@!!a?B+7SSar`L;XPwuSYdbtqr@Vt=?ZgOR~XtghPK_%UNE$Hv=D|8 zVI?Ze&4FtMM@>BSjBhsKim_Oh_R4Jw8l5gSd*!l4jj~lP{V-#MwXIZcL0LJz`d#`A`CbLcO66QlRw^-Bsl?pY<%%0Y zKSIuJJ!fdo8(I=_CH-SqxB?<(~V_&n_}m0I6Qr55oRpL$I8FYmOvVz2&x zQ?d7`ioH)&?7gaD*@0xm5|b56%q^-@(yqh3q_H|B?PWt_bxK;Y!bER0jSxk8wYh%Fnl_>T>e! zsee-ydOaY^;!ahe`+>^}B_=DBnA^G*zmj%?!ra!2hW4tVQRzxK_F3tdLv?QWCR#u$ zN2Y`{L_e7kB&&B~sHoo7M%#V}mX6g=XIIF72hCo^^uw&4fNN=>D$c8@D6h+_m{Sci z1x*yNn4H#O`Nh*NBHFe4j+{}?BIL&x@)h-QijctQx|c7>MuF7oDsc9Ilwh8$Vvxs1>+?{LW%Lr@$p?Wz>QVxzMw zp8FBqWZT$6KTPW!T$g#9l71zE@7HQl=QmW~6W{f7OS8%rVrrOLR*%Ozma6wrbU-_6 zLE~^)`ryN1+myfh(rX1a1nIm}e>UJ>FdVon@pV)!%DVOyWu_@w59qS^76TK%E)O!e zpkNPc57AgaD0lHvk&fsWtc|vU)*Y}t`pUEpEa!7#{V#jl7hdEK+I}b1_E{LFD5zDL zVy#u#L6|INOk|4$ri;lJiT7EiG=ip`u45`P%F^`=k&3q$Ak%+5U<6<+Am#c3b_9$E zj0KDXj0YS9$Sy>B8sJHQ>`J_!1lS+&bal_fbIC3hH!-QWiMhp=kfc4TdI|i%TC#<0wqbEjE25ZMvcDHFEn64NAYLc}64@e>AOx>oVFWrA@0}9OpuR zEYJpQH61vyzEjhI5mBpGgStNJo1ra987J)NGPLChPPvjYI_+@-=kzQoqeIjcEy4RR zyasO%wbq3ur6tuDszgQUY=oMkk2WN4+B^8rbZvArw5DzGYtoX0y}b`2{1R7;*j$s? zcta~S82g0eUSP1h4Yt`}|1{VhgK;>Qen%SYdV@V^ux$o=$6#6?uR>_r@q43mTK`ZV zvma5G7fnTUn!hrJ>jHA*`ru<5|3&aa)XIV3yl3P0?@XWMNVCogj5rf*`krZ`1dUT0 z{-nNdsIRYHScheZL(_Bm*%hHiF>32=msZj;FQj>GKmMAZK9MaoANkby^c@L0TB$;L zG91eq?CRnQ5vo2G!K+b$!EorL+Ow>)O)#=BNOM7Wg9IxGh!3Z6{R{5 zuY+oXiM0E$qey2p;K0BntR;BTu^ew=Vo+4Lvqey+A#-6E7Q)ml-DQ0#=xy+-o72Sm z6t(v{JmgeUQ&BDgU|K4K;7LeH5Q;qr#`|d^3uUpE^}k&95zJdm94Y?P2*ye{%n0@a za={6ecDhfn>Gf3fIl*$uHy4nVSOwS*a2_Bh*JlFe0nP`U4Y&Ys3E)D&ivZ68yb`b$ zkPG)Zzy|>v0G|U~1o$4{VnC+nY{1_E&jG|@#aaf~74TfZ?tsey2LqlDI1_LKAgl5U zKz`ftdcbV)z()Wt1l$OC86YNujW+{60r)83lYlz`{{i>`AYMGv z$R_bDAZvnK`eD{4g+*9TDak?f7YywcL;IJZvF>G>J3}+cIJzm!ZJlChLkw+_p-nTiSWH)? z-#CSd>A7fHLQWji@Q=-QHF1dZp8|kt#!fQ<=qg4-_6{{t8H_zd(%45N#$F<^^#;4$U~FNM zyUSo-7!3VdtT0vqYPVM*dc?AiXy4fQ_7RP-(P{to5$zMf_44f_+RJD`MYa)*X=1PW z4%fwfRRGq?qguhp5e?r#JmQ%4p&18QF47&{nD&+N={u(BjSbuC#(y09%y{)GXc;LB z&^CVQF;|zZ9&tyEWVz=8_5jQS zJP9x#a4cW}U?Jc{K(1s90qM60@Df10Dy)&Sz!Jb`0jB_R=|2_lEx>7joCi(^WKr{s zl+?h)qy{GDw!-l%X&gBujpLZ4#Tr_wp=B7_Btx5KXgta${jM~$OAPG_Lwm~5S`3Zf zy_bIL6{ZXokvo!^5=`o8vQS#3jn^81y+#`7WZ&2QJPs7?1}H?gCA%fz9E4tC>xc9M zg)9!qUHa$xVJ05qtoZ+@9YODLl*Kx2Vkivl{_L#k2)%~0m?RxGpsp|0_!~co~}_Boe2+4&bqXA zI4hBqF*Rz{g%HFteCYF8YjY0_{dsNfA590s7U!vx8_&SIwI^ACwGDsl8NS2whajDz zkSD}lZ=9+jBJVn=yFKB`-+_tq)RKA9ya<`LLk)k-Yp>A*^V&%i>(!{o)7n0PnYvXu zaPu>VRse4PB=m_EAW@IERF2*pmA<`To}LUmo))2Hg$QMR#FX9O8LJVeH?~&>r@6p1 zW(`3J78GUF5R^88qGmCb!F6F#k0VBN>?CVbGBP^S6BCu{iNRTs$flN@B6(T_)&oo~ zcNwjqGsg_wF2$ja3C@}I&&CP;AEw_r)J@x!`ue5MaMd*NK$*MB+q zk|WphSkpK(F4M#`5MJ`)rLxwW?FVXqW=#05c}M+gW6Qw=}xrorx%ruHqPr{6<1K*8inq(?ysW z{y22#&@>@f>54Xsd?D0OW6EN(kf?I4v~~*9z;Vd!JA&2$GTJmCe9f<@Nbz>5IC0lWfm58$5;}?+2v+jerLLp9TCC@CCr%0ND=z1Na5tK|tC|V0LQ^L7syFsWU?W`vQgm4g_oq zI2_Oom|!aYOrup?zd%pBdWEhW4AG z^$ODA^--AH;)wzo$9O}VYiRQgZJD7p8rn^UcAKGXGqjzCmVld}U6 zU9Tgq?|GzkLW5Gxq--aLcGYI{L$sb{KqN!fHqQl4Fu%c`V>G0 zHVKzp9}tu417dFLM#YV=ZdI6D9MzR_uN&GJ)T*QxkO>_A0r5VD5pisdLT z?)TyTUR)kqEiwn%U1e&qF_6`#G^4hnB3;(lpQ=K;6-37eh_SDe)j=FOWj%D!H6eCw zS?U9PgmqfcB{7~#7mrdVHbj;7RN%6-iOJF?=C-KGCG94KxyAD#lD5~-SbFx7)g`K1 zoV{dSsF!?O$!b4Lb>k6A7AH<*!4}LfTUt?@Ep|WtR2j#hPt_wP7rrV|SC8+HRQzv8 zfdke`S5y_7G$ZQb7m?2{yKg`7ErU3CqQl74NO%<>%jRl82AY6N)*LZebHv=%9f})a zanzMGj;m7c14BzkEl3(iODV?`*lV*tXmq+Z?b@y@d>7hklYW?5=HdcVn}M|*YE$dF zw6dDASyl7#P#jJG|EUW7lX_3@2Fk-`G=FwPN+WPlLm$2e{#i|!EJBq(x-8q^Hc`swl1N9qxe>65Ot^`e&4ZQFNjwAskDD67IZP-gT`*u?dSTNZny5%*8+haSOl z=RE1E>q+-gW+@#rZr*zUSr-|A%r5n{Yfx{i?7C@qml; z8;202+yI4PR%U3M42`WZ7dE?Sv)6|0tYADm2(wnsPM#%Mn;TO zd7oY=>nYI9840bmz6nNwlv4A|y`^!7)Cw_**N#W~5hHU5RczsCw zwb&7{cur|y^XZ9ATccKOLFhcjRU|FA*fB|K&i!LmxPyFfYjf^_0QBbEy@Gm>XFv<0 zHf}92A))qhIBlJUGfb7u8KK(LyTcPndvGO;y-(6Y41?_xH1SrB#-m&z&0F?#gq^sd zUDLTS$2WvEF7IMR2tUoo^j20LW17&I{%%1H*BY_P=!yU1X-8f>G% zg3vx?C^rIo8==Qo9~;`w25S$MtYR}5)$|v_$4dr-T}RPiiBTAAD++@(L}4cY`={{B z_RH~m6)x?PK;)3-JASisP!`I>I@!j515*`!dW?Ig{cL;>jJf*s7{iIR@oxcN+xJ*o znc(Nx<_Am@{U!ol*q8EjfoGF)esBasGbenUVwH%1J`C1lJHl74^$CNt2)7e*Cx&bd zsx<3yY6$7%sW0zLAurfwSk@cv9fW+}5S;+87Z-x{Jvf#WvOTE5KGEood@zV@XjE8- zfEU&GJ6@za#4 z9rnU3d>Uym-gOKLw?^Wc8FW1wvRq!lz$?x=B$Upoq9IvMv%f*pW&`Vj5NNU!sm>y9roKRg zw%ZksLwBd*I>OPq;X?d=Jf7MCPcaNqS<;cWbwobYFY+J}xy(2%>X{<6eb`p$ihb4N zT0fYl>p5F^I2)A_guQ?Ss}@J}Xz1q(69?1O6Lu^S*6M3Qy3#ruhIpD_X2<#);LHAt z`}ydHc7L-FPM}L0^1UricXW$R7&GJp8-5m~)()*xa|Ax}#}yeXlkHQrPGb?t5``cl zw5UhuGH{Ji^oxV!ocA(7>bENa69BIP%m=&6dEt@E$;()wmDvbin%o%K`rmNNe>2fad@{ z2)GLHVZb{99|3$Ca3kP$z^4IU1bhZ?7hntE8-SYu-vZnM_&y+PwT&MFJ_kt4@pi!7 zfFA*V1Nc1P_kb?|{-o$bQC65KHL~>|1Y{RH1jzR5!Wv-;-~rs93-}x03c&9H9|epA zpUfH*a7fmz>a`#0CocW954nDeyz@c;8|S&PXRm*kX^e6U?yNszzV=#fH=Wv z^#(i#urJ^$K%CBNyb7=%;Ddnu0UrY#0EitDYarljfP(?C<6*@E?gdN$#Lk122#B2l zTCE#7){O+@xHAfn+L^NexjR5i?hX)hi?xiT@vMQQ@qv9w>t<-94Q-sE6&V`m5z_B$ zLz`o0=Na1hhQ_@M8OODTc88(eV`$GC+RKLarJ;RoXulfTe+(@aH6!DQQ<&TG7#h`* zO!HzxJIBy2Ftlbvd(6ljcrHLJ~p(^4Q)4ChV=Wb!t`0FrX_gsM#Q{eJvj}Zv6Xs| z3t{gQdvUnauA4%%wzL~gnot?Jwuuq_AT45hdwpLW(vc=c4Ry!Dbiz@Fa}PPcXdiGE zigI}Or=dJi;?rgo9zCSDW&ys#tbS+x~Ktly&-$%5EM4LgdycLr8LF?@(2R9 zy@V1$K`4U?F=or6B#L&JlG;VQ8zuY{Neuo>{C_@voMchSL zI}Hs+7Odeq<8h|wsMXiOcjJmq77Z@--RHGmpH@(?J~Ko&yl?ci2p%dk4qSAae@_?QkxPrdcxi*c zHGjY0((z~gYuN7biG7Ru*0j$+Zn_&NK* zBH46UnH|!OwCIsd{c=2xJk9u)nf3Z+<^n8sxZ0BD^;?ZsSq@&WEX6-zNo{@No6Ing z#_pK-wgDDs(rQ;2-ozZki76Gv4@kforbju}FC7=lG)K^tV6sF#eg+_Q>Ks6BidF#* z0c->u2G|5R7H}0{GT>^!V!-nO=K^A=6-PGK0A7XrwScz+V&H9Ld%6&i89j(gPGX43 zNenT!*s_;2ZmdgMFNH-|eGDzl&@v5;(^u)Y)X+F#ku*+NWO$sgNE##ioaXb90lfvrBjA_w z7Ebf+j|@;3+c%GyCdxmHYsC?IHorCB+U7AwUiPO!xNro|^e3H`Kpk0bbn!SGGeTnu zmKxYh4l;-IuS3IoA6@WTq^uCj#j^lwaq-n3e6Pz=T%obfk=DQC1lSxiqo!{8j9b?a zSM;}$09TEzP38fIEgL%n)&WxG;FwG!BDWd<`vKzNCUFcOhPKARxX1EHJg~J4Fa`JL z0u})-2b==f2)Gb%CEyZ3w8_SGfS6G=vL4Yg8?Oi40C*$drGTs>#>3p5ic9tuVzRdo zbBi|)O4=Vv&Mgj~NE#0-NjV-$mNbsXlEwp~lJ=mXG4~v!;&5rlkC3Jrby$Fn9npH6hdp%M)Mq*$XP_kM z6M8|^U>P7wma=kViI|)R5p#=&&m^q{_mUQ+IGj}N#`9$Ih@JYU@XL^m`qO%*OF?;WlAXeMQ`@q`lU5q zQL?0yp>mKs+$)sGmrlyFyC3$wXB3c5dZ1?E(Ao!(FIKCq<9lCpCdrjfO83M~H)Vn1 zVG6vOf#3ZoUD&W-Rzq@Z-t zBU?uxk9a>@ef8|>`6fo)jI;_J1doUB0s#~rU#h@rW5tVV*RNe*^@_^no8wsSEMxyS z$FY1#^?7q#M+me0q_C`x9-zg7R*%b3=-t6&3HUQ*3H1Vxne^wG0wkMx_Gg=75~^Ih zF)kiL+UY*%+v8!v5;K}JRZpL zq#R9ZGQ4Sq2JNG0YYgo|LwnZHwi+4@Uot!zLu7b3j-hA?3UhOwrf6px+6EMZ^n1C& zyvNVdkz(zxRfyIF)Ldbph2SE*#KyP3p=StEmTA-b43mDZ#&up_6+kN+CHXZK3-!61 z|M{#9rzD(Ij23YgoBpITr~6YR_|CI8T$RxFiqjwPDF>kev6yb41I@rx#NGp0M9MXG zge6`Yk&otNB7AW^zCn8j)b$Vre3hc#s9Nt$fK1pefaKo`m<0HDz|#O904xB+2;Mjy z@L|ANfR6yq1$+#!8t`$z20$EYXj}pK55P+Sp9W-IJp;(1Vc7C5Ld4`-gowGVXB0QW z+M+PGc(<{X`?sO7Pe_^z?L+!KL17W%aTiIu+|aHzax7N+?1Q?3PFJLTd<}tb`%zc= zp)TO4ea;bDVIe-JTZcg-3tCLR<6#^YK6twrKD#;#8%?GqdFx!NbS8+0zJkGUSq=C^ zs^5Ehbb5UoUVAjHAb4Yw3e>E?(hki^+l-hVlNx>Gm9d&Q^(=@bs~yXLj>)DrpesZz zvs{V*Iqxk7WEqvH+Q+mDwLb;F#H4N{=C*D&G_K|(?KMMt)6mjU8`5ulKikRt!F3BWXdQ1b9PKphnUQZK@BF=(6TlFD|XDtvIWJUtukkFAX;_ zvA0Smnamb6cBFKK%f79n1pC~3W2k{e-B>q#1C0@5#M0+L1>grw01A!$z; zT8p90g~E_>d@MrBv6oO!`u3m#QoL9o5ak%0D&W7ns;`1UEE>>cORmHaZ{(}U)sP_$#c(sAa& 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

          `;;m4;Rf@My@!nCqFBI=<#rsq7&M6*;7a4B@ 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 z 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≦!Pai1w3dl$*$Q>Vm5D_(EK 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

          P zNkIX=+X{i4Q5+|LSEJkCLh#t^%B<5GO*!XXjotl~W8?GWY$=oVNnwuj%r^#B3Vmg9 zOj?X+>^RAL4f^n`{#l^eZ)YE#+x<79?&m{&F8IHJvcNO@8Oo6+7t^0-zaN%qOgTN> zxcz|WaGygVJ{v-F@IAr$+iofru~T; zfaU2gP$pv?DBVX)irxBGg9h^_=ry322@x}l4MF4ZyAfy_Xfx0pP=8P+PylElD2}{T zm4LPcodMb!l;a1?x{2|_6`;%T8|U`KSzH_FPW-+K^efO{(4Rr+57rT#L4VhOGjH>0 zDDE$$PTpTgomHGGle|OtEqN^2lE=7^JU`S!l82r9IuCpDbzX198>4u6iZ@U3IEN+}7I= zaw=k}+r&q{#@waN*;~_DWP1i66`|Enle^)V$7J}02m9yuER-T#fwtB zB*o)cUb?$W@jg~O+#o1E8G$cGh>rkdRnKg%;Ud8%_+$e>T1E2-Uh-oQ*vWv;MUYoL zGeE28x(~B)nl@x#`(OhhIo$C8p2aZL#JHayUz5TYA3DPj0~;hFmaA31*guLPzTk0} znB-+CUOsf&h13UcR#J2D7;3Vv@zW`b8}-EUnW*y(IVa+bjtqGPZgNh<866o8PGqxb zaIizTCFL@gv!fG>5X8B4bm%AA&5D^Vom3u+v%Ppc3te6kzN%~P<*;bbKWstxnGBe6nY=$y!#D!5t85(mLW%r5=AzEd0uSRliTl>g{BMkcEseH=6i>n4CuPIVo;sSM@Rby9N^4JxZxJ1QE zRlG9Ao1%E^s7te0{?pAel+5YDcnmc_*N6-Xy?ev*Jxse#zt9XTtsC%sV8cr&k2%rk zaVOei%^8t>L)O`{NeREy(=W_?Hdt>#&oxhFQ%7cU%(fVvPm4CLEI;3|RXRWfj4#LR z3cJZR!5Qm(ue}j}29zblHTN4mVc9~3{)-ba#w9iMCWFqdCjH0XGJx!#(ud@TV5kOb zJUE6j@&<=PtU0NEK<;MR9|L7begyRg{Rxyc+wY*9b~y#w0rVHpt3gkLvMc%U^mMh8Ysd${6mb@{F$L^uz z-L80dC?1b~QrcL%R@XVYX?frqYOt;`G8sz~t67#jQrbaf$epjWXEVxmCSui_ci0G@z4}&7rd0Ppi zQSsC&7+0EM+^deoId2f-2vK$}jd(Ch6$_-fRIyEA9_97Mf#~ZwPj9|$Gf(t5{B$wx z33q|eecs+?_}ge>oJ)<72b@a{F3u692G^TZk&mO7RkW)+C`(HODAPX_v=e9#(C(l( zf?E{|itP2iWKiI#k*JW0#Gib*&tmf_LWy3PvvJlS2%sv6W{Dy5xDjUe4^pYLV-ezk98W~ zhHJtPwXjB6iYExW$I!+I-Sv2H6gp->_jZhRN-7>Bd$Qy)`|>wS&Ubj+dsH+-OfNj| z*zgj{TyioBb0-$%N29v0C@HBJ@2MfHe=Ou-T4e=>{ms$$VLi(Eid{DB9mB)<35LOg zs`9wr$ZDLHsc8mLjhn71XE>=C*8W0=S|9ZWl9+lQ=fHPQHJV|}(bp?&cnM`r zwantO{|^@NJblQ+@FOVF@!}Tod>8zFeaG{D12FV3XUKH5d|?>X^|Yi^|P87Fktg7z2rk}r6YJYVo=r!&t7 zJi2RyoRiJ`FrP6Egi)I~EuEcPQd!KKOl5z>BAkB=lRUUF6`ONQFbHKVaaT2G;kaS9 zDYChd6ihZ&amKv7X$Dwl)=kper&ET~W@sU0iNs?kwyY z=EYu`=_(*@SB*nc!eDR<%TW{y-fXkgCMO9tgYx$~pbhc(;PJ&X7tgB*zXg=PDP!}q zSaT>x=Zn>r+sSUXpRNbJd$`|O6B>fxxL()kVfzf5Gv)$jaFM-DmW$ z8fbsexuB7tPl85+z5p5n`Vwdo=xd-Upznd=8jGqeptSE#&@51I_-!<3L(pu{)}T3{ z9YBjfLqR8ja@=1G8VQQ4606ccCxea##kCjWqMLkBZl1w~7~&!u{^rPq_HbIe67)V$ zTtrv(GAJ&|sQMXnI_PDHFI-Dk#nN{xD91Fnf%XBN1IoJkcF-Z9^FWyqlJLmc4C>@; z26b{vkmNC(lE*DUlE*DUlE;N`$?K?ioY#;%hE?J?uOWFEidUj|<%;*9;w@6V7Zi_S zmiE1?c<(FT9>x1q@wfq2y2}l)((Ip#ht147uNh)R;+pF^tJYERIxAi;#p|nh+zKnr zCMzE1m2@8Sv2^zV#lr-!&cmiJ9k*QZwksaCHR!l66z`DYVf3w=J)?L&sFbB&{B#|{ zp?Fxb(e1-nM91|~yg`bWtau|8?Nhd_Mbtf%(tI7=3h5uJnS(}@%af`@ugWGW6nB2e$(3VL0tL!D)@aVo*=BnVjGLl zu@z#e3({)weo^QU5Hae>12xpc(6CmcjEcQ3_Cff&A)W<3P!GX-$F+>iMSsRXKSUZuU93P+CA^T`*%BpzvgJwv4FOFB?G1|Bx9UdF4A5B6p`e36 zhk*_O9S%AibOdNN=t$5UP@G&67cgUseN{DnXM@fMMcq?%pZ=S9Ydan}hd`a2L!izo z`Z|)gU&mRspLJbh?H9%4(Fcj+(FbXEiQ+9&JS+zdt*Z>eCsvG4!Qj^&_9kHZ&G$V5 z`|!=D*7&$AqeT`4HqGzg2@+ZPSLhf8hU%(oWamw0duDm#VUeOTNV4J&gpI?U>R$D+VBt`qqgH zEP}F!XM-OMJo-$|`%x}ejx~X$QaR?ZX_y@rZl5Y1hgk~4XGSDYM4vIk8#81q5Gybe zbKeTZh|pCP*HY#ACx)6~<}DTU0)9G$%-9#f5XkU~5=7_dFWpyaqB#OQLmBBwXRpS(*^C~Ed(d(d0o0Xt+d@~;TRZ8mQS1GBpit1AGUeR$@jTu?;zEnIPU$mSC?C-jCozDkNOh1-{|#?AVk;@iJaQ{ zQ0N$L=J8-WhLYWWM;>O?j+Rp+mU;L#xO<~p9;O*$XwQ2#yo8#a9-Ek*njS9q^l?XX z43-DSVPU|-MrCHXKo}DZ0V31LMRZmw$Fwg8qyO+~9J(Z-B}I9-1M31`1a{aw9^O@+ zIA2!wxk8S3+_SRbZBXPRWAeot;Zd8VIqqPVQuneDMYqUM{w0c;nM~m;$7GvxUN+K= z5oYA&xu|-XE;XRE;to)z(Vd`lcqbk?O+%fWrlHQN-KR?%YY*um|QPvSToCwU=?w?XkXD;}%t+R7$#f1B1}b*F@TgKIzh{kv{kcOUiMy6&jg z0-qglMC-Qh_r2aHj(LUsR-5GKziQ4DGUrEmQ45Qp#b^HJOhJbeS|3#JJ)!G>$5)F~ zy1`1v2xB3L#bc;UUE`-y76RgoC&f+fUeR-;(a)`r&`z39$HUHmRI}6bD-!eb%HvAP zoIhL2K1J&;tU8V6UQP&LU?-iaSBp`tvxmmR;zk)WLTS|0%o^_5 z+2IVcvvD$&UNk(&O(`^4fyZT2N(+2GqCJ38;m#y10b#a=U%Ng9-WXj#V#GTus|=lw zELKI=4}r4N_7y1mEnkB&qkjY19rQcU{-EE34g@^{%D6rXN`Gy^BP(v|WW`OLyo*Qj zUe|F}ZN08*tZh;}`c~q8Q#@a!wB%WJot2lTiu~4?*QN@c6*D>pZoa}Hvk&3bH%%7U z>o`1^U`d^zZM4@twV-`(_#WNpI@6=8H_pcqrwG3ACOYj6~jC-kLJTkA(!DFbKpdsH+XE3if)p-p-jeKj!KW|Aa zO~|>qR8VL0!L1n25>0#J+~i`S7`+)PHYm>^KCX8wEA$i1j>NOYhL=#YhvF{kg6Z6b z$%@(rSDmgWYz+)6PtM00Ia~UYJV)W6QRY#n4Xtc+8WDxPMTSu$xQ0=B*jTSe9WFMD zvRi{*Id14OCgbFeN~1CBAncTf`{@RE*W+RhxFLOSOgAz_G{ZW&y};avWOLXluW%%a zvyMm~jTxMcr5B>w=u{b7Pg!&w0ha?h0oPb`*_<$Jj6E^gWwb(!6S0Yu%k~VF4GbAh z)p=rC8;WT})eujt(BTL;)(L%~$E>(mr9TSFNcaJiW%W2H%jgMErtL{kM(l1pa+ZfW zIm<(xRXc>Y*^^2%PxJEM5qKqh%t>N=}-z2b3;rnHYUIugej9m$)ec-4x>Tq$wS zDc%;v+o5=|Xl5iXUe{USCo0VaDv(rLsMB4bH^(6Lw4qwdmZP74>hm)bwc~)X! zR%}TwZi2vJvaE516g z>vOku|77t_?b=1Jw!Q9jd7~Bk=J)INX~m?@v9~2W6Z_1Kv%Y_${I7z?x{e=s>Zu8r z8^4#{+j4x)r^y*Vt_)gt$18u`{Q1taYp$C+?D0i2I-LFNs*q_%uRCe`baJ$p{b=Sd z-yE5}@zo^j!MnfM^{02+%NH(tdP8B?Jv$D*5<73!>;c}s!KVsNU;AvYq-VWvc>PF| zakuv0KH=cxlWC>DG=JvwYw;Bme|_Vf20xZ|jv9Z<$l@`K=*YA6I^VZ@%8(-Uc{kAIxcHZ>$kVjq&Tzd7= zp0k_99-9}swfz;tUq2dn_ruG|KfdCw+kEGC{jO-jjGuPA|NO>nPe0)`KE}GL$L|%t zU6-0X^UnDTn$(SYs<89MM(RS&y z5&IsU^>o?iZBlP;H}CJnJ4ZJD^QWgKHM4delild6_sb6lC!I(*vGKvtr(=S1!yg}f z<=ZDC6IS(W*nGu(?WeCg@x!D;ug^*QeP;T?l=r4x`{HMP%g!9F+?#&I50!ttIKpzz zM@Q^iDl;eVzuMaUx|sEmextw78PF_p^)x%NaqiAVx7_#b(E;-_FY9*y z#Kb>GMQ<&*uS-$?KE!p@@WN%DXxHL7uZ#G z&&wZMIWCyp17XtJvM^1yW)56;Q9H`tw87hwh<9^5_op|0S@QX2Nu(miOY2^dKdmBo zQZYG{cw5fm%{syBfrv2aBmBTZl2ksL4JMsUvCZ|iur*_tzWC(+XC0m(vK8 zpUH=8V7+lija1tk{?yswL-wGkh;j8HW6s+$Oz_e94Q&zPaO)(vR92H)>?e9#YZE1x42?J)x_i$`zhY|sD@PDrRx?s!ZkuS zMGV5_lwQq*DSzG6d;SaH7So$*nQn?0*VrK5o72}qWv*z0DA2*$R$b$-+1zpzdqpxf z2)TO2CXAR2QzvyzfXP&#FtrnJrgy)6Tn#cz;c6410;MUZaIt)NTdtI1ZAI>$dmZ8G zt(zjoHC*h{cw0D}C8X!19k9S~t57%9Lb~NtzL=N1as86Smi6!1(_sojU7> zWgV=Y(>27n#swQ!3%u6odf%+KUJ3J%?r9Ot@)d#AlE zT<>9cX0>g2++p)x-R3r?u(LFHTdw9C&t-3~{n}v)cUcS7)?|wHgQM>49^DN&!6Lz8 zjfL8FCR6mcw`DQjtgWu@ds&n;QPWaDkALMWJTsM@1O#9FFTtr@Y!xVECcK>!CXr z(qfD`TvrLq8dP}`p`+?(aw`~IZ%aHp93>E}k=*^$Nnj4+O$n8s$v>!kVb800GoF{_ zRq8c~a~z5kx0E8D<(_-2YMb2ZBJ9EHuV$2atI4gd0>dk+Sd#?jjK(+!k>!$J*9goJ z04766)z#!yH*mcz55qr3Jo5~pt3B-hdRw?>&`2+SiO3amoxm)FJ*?xXT9`21!A0Hx zhIKbpkO{+-M6HFeGe=VSm@sIrfMI=UxW&W%@Q+j82o)HHn`tqv(cvG=@zXXs8 z7$YqjnlP;My)7r;&4JKS@rzNe@xx&=(j9L^wf4s=pRYFiNBGu~h;Xsiqv~U_rysc9 z7Uo94w839)c;0MJe}Um%QX`M`Gud;4z_0|-o(I35nP9f(Mu9nt_%ZCc!DJ6x6K{N5 z3~xNk-`xAB*`7#&IqYQ50FymY0>kk*{qxFb|1oBJq6OxD0NDOfMG1ST3um+nWfL}F zSDcBHZsO#cIM^fNX3ty`=Rp(ac@u{hKuKlzXPb$$-^4j<;#|&*B$Q!Kh=~(v;tVx$ z_<=%Kd+srD_z6%~%w`kk8xuzqcwx-&VLMg(08LRZXw z6XzEbM|{Ul7&H7FW>f*1!AUZ4CYU&Pn>f#!I2%oz13IT4++wN0T$0Wipg0ZL%s_Qj zoa=N>d&SAnIeiqTLg(~UoCkGIsN$^FIX5WI9-Y%saemV|QHo>HtG~{IgYQiDVh#H+ zye~!^8aVj48uoUfbduvs4!*yJIeHfk+X<}3J7L%=jB(+x4Vd7a6WVQQ3aiWpZ@aW1B=Or8F@ z!&JF$iWpZ@16@q*KG^z*!&I$qiWpZ@@h+ySwtxP#!_+gnDPmkrCAgUSHe|z4hpGSQ zrigJhHOR%(%#J4yI81${n5)L<7=8`_UUb~WPgm~M&~S5t{Dra~V~Ug9u?ZM9ozWXSi`M$x+!8@O(naSx_i#y-yNpHbW_B*no1F-jHYzx>;~vq8Ey^M zO%VfAaDZu@5$PETF@p``a4*t> zgYJhp47l=Sw&NRXhD-Ly=W6? zgNL0yvTOJ!C30X~?BK*``=H1H!7*_I!h1{`(C1=xk(zE@YGm@@=+xN3@sWtK0X<_% ziYv-+v37o$r+^L2_i)97ISvs*c?!aL3ET{Gx$4mfU23E~#*U1W>M63h{UkdrGbuXJ z?#X+uw@rD7O;>=rj>_yc1k^Zk9OL|zSThn~HIO`nDk!y`Id$}1NaZ!fNLCI>dPSdyEa zW{*mg6-dt5a;IOpWw~KJoPJNrpH!Y-;mXJ@o$kaauPDQAF=s|`X&Lqb6*#d9TpdBg z+sn%E9W941+ZuUJM%R5_LbRdy>+EXkdS-B%*=Qc=qywGFqU^71lDDs#t|=F}^f8OyWjX@%t; z1<{oi75D_0Cl}A_+dKkha7|7H zzS0((Ujbk6b8XH|F*A&;0$tchojl2oD$dI+Mj@P7k6g<(?_Vf ziWwDET3R$c24A-vi_aY}B>Y^Z87Au| zCuSr*cRfntf(0&et@CU#C8P2Dj_!5_HBg*bvIV4$amTd=|8`&=*KzE83!Kv$6d0B?(P6C6u5Ib76WUK z@z)&u*j&7vlqdUG9}N8mIIfM30IovEGQB<7Hw65}!2GD=yz0Tx`<6W1ZH0$QrLSB3 zwS?>e9V38vd5S;!=LI*MC;xc^_wql$4Fv90;LhmS`oh6{&?Fyg%y_6Qcs#jFTnAvT zy#S8>>!o9$6{0BWF#`5CHf6RYlb&N!M z#xcAVo^Vbp<1{}W5jz#QFULvSIAIkT!1l-0~^cXMYB! zniT^S+jmd-J_{M?l~=IV&4m=G>+y*2y4i;dceSrpVgL180w#6^d9tqw?DP5$Hn^{q zxDJMWZuy=cB^tgChv7CzTwp!8L*U=^0S=07lsH)LF+I+}zEWVuZbrR3rc!p>e=A?gkkO0dm=EDTpm@UgGEzB-059?ksc7oPd z>o2VI#onZj+PWFsqav)`>@{ zng*6#O`lPDSThRKx?K>GF}|=YFEyvEVmhkBhJmfRFuP66wx_0trHL86ggh}3j>^}w z)R;uN9P;i6ltuU?HDS0tF=IrkJv$*e);>HG>&{Z_IgYiW9T+Q4XGImLS9h(Jj(q{Ee1j~pj)l(T6)a-77FMk&*J z+&GDcM-NO>Vm)S@#E?4N*5k!V9OZ1ouf>bhxWwIXy#_ho#RZGLoCyia_2}hol>4Pe-Ce2&2^olYQmy(tgm66SCAp+tIOEbd| zRqinV7G@Z16Tx<}%|G1?gKcgwpVqBfdGebGrNcI#)m^8aRStKOonuW2T%ac+v)9u-? zB03stmb9WDAbms;z`9~`OiHXhJ0>bMJuxL_FlG~_ysxV~E>ubSxk-8`Nq;v^^M}{=UO@iERh+^GEp-N&2A_7+!Y`3p=3EGSsx`EYm$Yiq{}tQQtfF8DX}W) z@?8PgLXwye6P1yW;>eK&u8`D}VTgG4te9@&T!qLR_92;3iRr2+jCTdZg@!3np}Qzt zi6*#%+-O^7dy~KOS*KMJ1wQi*jnD7P-pPN2I6Ohp0q+)K$uUh&@q7++sJWsMn3A@iA8++Se30 zFkqg0+*O!n&&W(m?xD*46RzTPdumi#R0hl&<>N_L0DAB$QJ!)Wp-NJb{cYLzPt;bO-C z34)&NRl2v{G+{)~LV^s7R+~VyC^{`F#;z=S%Y+dYNstklZ<|0FQPHZ;@gI{k8Y9Sb zjP@LL+8PrkO68w-OtNStd)Fk3QL^_;GDk(R)+BTIWt~YDr?SoaCfRTl0;7UhZ<5N^ z)2L!LnC14g7<6q^zvu%KBGI0nu8PY>lXxJuVzFmrr0FITA}R?5j=5Lmv&|+Xn zW>jZeOt7KoE~C4U7>(ZI)p}0bYC^#>XP^-|+f2ZiltlD9IA_G%zuhE{k4leMal6AL zmO03%Cq6XEqcT+WwbLZD5062RRljJL36Nw@N=F4}S24TW6C}-!=txx7?D2$g?OlK5 z2@(|>t6GtdJpoV$WT0GTDAXsOP^uelW`b&{4!g?IT%7#YP3Y?6cWzQ=C%<=- z(Me-CYY~$fYNjFy(-kTyyj*2bnXwoF*oQj`jJF3sYMOnhvcbm#0OciB0UCG!q+)hV z0en3GM2C&jYOD|%x&o5yu?grWiB7B0>+o}h3>!8~1;3H2C@Ctzk&&#fG8EyM%tX0O@v1g!Y66J)1f#NRW)ibaR5{(>B*u*4u&A_H zWq*JPA!6SsDuE_(nmsPfj{4Ln_RUR*=#-SfNl|Ho(^YY5;fjeCO@A^PB+)H4YznFm zh0e86L9}$m#3rOOFQgAk$UvMK4Nfap(BSCUghX`GGg1Z)Omx)4mw84BFB!pa?HL0P z8FfG#SA=~K$3lj%t*bCS(QbDPvD&!`F@$!^J+wE;9MfBuyUAGQ((IgU#4$XXNPHuAUg?TUPl?MAb3?``-DZ}%PAqkB1&B7x$eJBpWthwo;vo1j2Bp%X4MtUx zohU0QgX<-^X_DJQ$42T{QQH~JDjh1A&2^+^k+!mOQ#>!hOLO7*NE|CVh4Yg*@>=Qk zc~xmuf-9#81(qL^(nN(B#~wN^CukT*o<;C7(lX@?R~`cCBUtLZl<37_UN{XC!K`|! zu~$W!O1CGcr=(>^#c&kH+;ZC$V@WmdLQyCJNsNZ4GZYA)FC+ zaD|Z$c*2Yj#ftWLxw|Cn5otYKflS_UfJTTB4{eemc6TiURt>bLiOkg%p(C<^M>ln( z%w~*;gPwvJotcr5lAIkSqKXJpAaz8vLYRW6BZe!4DSSFYMiX5z1(NV%lu6z{ryA|fTUn+|PsK1(q| zO~g7SuECY|TI&Hzdkr)z9{RU&J?K~-qC%}{gsaKqct&QAl6+n>;qHMMquF?4Kvo&8wTEqWj0y7?a7$BPZCQQWXjafOis^C#bRy- z%5XDniU899)rEiiiR&|Q;s(d7D&U-7;Lli_wv17Qc@f zZVtrp8=Pe_Ty3Mv=&GBD_EzfFr~vhcJ;WNvXmDwUU*J7(jZB^c%FCZphz*`J%xaVD zu{e1p7})m5Hqb1 zB_akGWsH(c!N8^{8D;#5Gq;S7uZ{RHY|&k90vSRhOhyRjSd9xmh)*|m7~+@CkhJrj7-N7Q2n@9X8_i_yKJ2IibEdBFH0ycC=t123bu35 zBA2)kL19Rl8L*e39V}e#mLyR)b0%yFfN&FpV{yzYFTV(e>P7?9mS5Kgvijql%xyU;0VW3X;h;jZXESurNWqvr!;1~F`Zr!9xuy7TSpD1E< zAfLzoM5#L=7;<%Es>FC)@ z7s)paI625Vhx>M%_w0y7;f@&*N~XGqFD4aBvy0zFNV)w)VEM(bJQ-3JJnr5gKdP)O zXS!t5{{yf$k!P8wV@`HKsI1Ijvs*!TT+^NqbhrEh zSzgTXEUML>daf}dOoU%Mjr5JgJ~Ruc&AZK)+Y$>-Jo)yRWivx>U%a}(JZt)sdffEaj=M(Pv8rWQgQB`a<+Z-|9L5&u zDFSzw*XHN;KRB{(;nK3TKeWH)^^pzx-gxKp1<&}kf9%np(u(JCa+&Uq{MqZJtWOps zeGoD2@OvTSQx?9P@kOWFTjy_Ema}ip(!vk0T~FX%Y;D6Pvx+@VBsrofCpa z{o3`~snfrBXvYs9dcTjYtU(Bf&3owj=&w$0$lG(@uIhEmd;8wHKXLwugY){oy}H?) zt+fwz$ixb|z%6|^JoJI4!*3rmv~yuh*4G0+`uwZC?|nRZ(u30<2)<$48f1Qc%*y7S z_SlD$H$3>+Edhh)&MV5_`{{R=-~8isj}OjUX9>FJ@1Z5AF!l>v-L`onPB%N<^s<-c zuePN5pZmc2=iJ|?{O5G{sF<)ZVQ>D5E$i4~XY=k^*W=^Ki`#$j;^5g2+Pin2y3=xJ z%F}OcT(bP8@7|g|?t5&qixRliZ>{^q^5}DqS=wj(aer&yjtA!Xu9=z_e9wujmA^H! z#)RWaW`XYA9TrnvBQ@o6MLT<_xD?O&wFC;wqDU2Px?(;_~*39$9DcP7~hQ$ zxObK|+?~=r((8us#J6I$?YraDq$5ja_4ChusW8dbX>!|>*kUPgcUOF!Q8VWLXXYmt zR{kCQdO}3pkjVVgw{|Z0GJVGn_SM+3i4Us5f9D>2ye8c?`;qN$&-nSX{abF>@Wj)b zgSuzcUGd^|Uyhl(FGqa%47kpF{l^6?N%-tU{I0`3qkPx5xHk6ZN4|SJ?(_YV&fNa% zvcK_(V`1NxDOnqD$?|_==2x$U_^;d@9rkj^NbOjYyH6b)qIvaBc?R1+1@6wWV>7#s z{`t`@vrmR@F8g5T!oHoFZNJ@j@F#;TzxhNg*o6xg8_<8@HQTQJZr4W-jd;LsTVmSg zn9IJN-L~-ep{Hjo89!l+&k>Z5Y=L|5;|^`wCzqb?a3tie6I1_se%pd8y|zE*f5#2w zJD#k2?{&n>%L4c9{Wrcgw{yhO9kYghxaW>}C%wOF7U^?)#T(vpCp|px%&J?k-CN+! zHM2Fg&3*jOq{P&nCoVtuSKCpW+H82^Z1Kviaea%g%1=W%@}>WdX8ro()nN~QXQ}G^ z)A;*}maM6La(&kqFWcCybfZ=6Kfmkjr(WZC4YjTL z>9#&iqi3h~dSlH8@Sng9dSh_*+Scy#t}MC} z$1obw-2qq5{OQjTTS2oq& zk6%&u-bW{1m|AmkcE8YwsG2LQ*HxtFWDG(6;}uah?*l8(ELr*7>rGQmj_4Eh>%G&* z6ir#RZ}_pqkmH-ac=GZmfZ?U*Ht&Ut4kXx?bu<`DLc=08t}z! zqm!TM{XVvi3tX#PkM_9c<1hZ~`(Ws%DDr&!_fZSGr|;NO7Yh{X=ndM&M=# zXS8|Y?6a%pFFrN9JU49cLr-5(cCKpoV}<1hAKqMD@FVI2>>ajwH@p0kgV)~tbl16a zRp;&ASMMo!^wo&r)}ZNI=YQ(kG@|<8qHnPE zp4)o8uXz6HZ>}jh_3-lPJ~>S`1$5c^{HtYs77bhcytR4Lc5RP0$1yK~d-dIYOYiu0 z=5?XR<~%a#__>kOw(k9L(^Ku6oqFuGYhMk&rXS)DZHUd=);Qt)pZ84M^nCZn{_Hnr z#>VEa_5SkLOmrkjkJ8% zBDCYuxE2rJa8-ZFK4b%Pf5sPk*@Rn&t=Zx~8K~+c!T);}Ot= z?k;+6S?1`3gC8H8)$Z~GiyuCbK54*;_+d!y88_T@`nBs9qrMlo?MJl7#MYWa#Z4`4J&Kr+?e?2<$o`X?ESKJ z&|AkRuDky8gI}SX9~C&;QA=!xvt4F~y?NjB9cu6V{;m7wEnjQP?R4rRubl7dniXNI zJoe_>yk8jj(1Hms?z*FF#_x~cJ9_IKZ@uXgkuwURDSzqT~@!-IDS#YiF1cm6|S|Re!fHC{H8|~@A$awo?j>RZrGk>+<^Dxdej>fouIt z*@WjyUyQis316Sthl2l_pLX}?dv>25HS5a6BQMXq?RgwW6u8r??duM|*lPFwbI+yC z==ye}-b>qeoNd`OA>h=R9a|gU+&f|C z^Y1?P%d;<>Y%pxrnm6ybyFHEx3*4J`eV#hMdz-P}+PA#(SJ}vjqgUtdetXo)DXo3m z-}}bw7AtX7L*NEHeQ;~&#uG`}^1vet#*TV)-?QI@wpcoDXTtiK{?{K1s>AVGfxBbp zp-s>9O&a-irva14{n4#i*@7Q#KhvY;!=s;6Zy0sisA6pA7r4&@Lk6XezPa@Ct=pdc z^673zKHk4Gw!GlBn#Id9uUK)z;oaD)AINaTzSHiF*58M`-T09G^q_$~Z-3nH_fH0` z&gyzw=~TbwXX~nP^jzR_Iz2aJ(OZ87x1Y4)>r;R9i)fer%7o25K1%(z#Y@wN?B^}k z9}C>1XHVTTaMwL@T4I4H#=>19A(|7hAS5&#Vrp5m4onyVrfSV+6qjPqxDo;L9eQk(uymn+)y8+Gj zJQlq9)pr`ce*Bv^uemP-=_YVp|C%&-={JFg#!nry*!I+#gpE7?D)%3Hz<+W2v%&2n zU(CW$4Gb5MZpA2qeK&tga$W&*QD!Q5zs^OOm{fvW zKQ3s3`GT%{m#kpxGA*K4R~|va6jixxa3MZ+5*m_~pqIqZknSPfd+<(_?jc#_<8#XL z^RlKEGWZ2KlM0KbUosncJy*`Sd}muT>;DXk5g%jo#}yXid*gW*PHDqPE-%WuI3vs; zGS;&ZcE;2H80^YPjKuQ1iO2vKO#Aa!aYp5ro%=ufNl#pOD(|29%ZO0Mj+_jupmpg1TUL<;59j3<{JS15zLXx$ zEx}i2%Kq(^={!EZgn4XAZdqk9TjmSqF{7;+k33oKvAkYFZ&m!?gudKpGF@`;B@9RD z|4lehz2{bzmE{-bPXE_~l>dJdq$xS56fUl7QC?YAkdv$DE%XS{Eun^11!3c#t)-b_=k~#YaCIPT+lh^W>>7Z{ku&? z&VLt)=FywHy7i)hHwE44l8Z7?%GIumjKku*!W_L%@o$w9=YGq->qbcT!r}{$dz|yo z#Qf=FOLEHcE-Id3=%V`RqD<*)`WJM_r8HKSkIgR3ySOBknNPao65SUwJ`$a=N#bH% z4>n!GMsd=lu)N}usU94;Xz%J>v215=|HImcUkbcn$~fnnvZ*Ddda}60@g<#24-U4b`sR&A$vllPIXvubCtGinfiamg7gf7r>>So497Jgerb z^Q>AE=w^V|SPOuzp}+;{Jge49=UKJ(&|#|ua5m_C1uj_US+&kO4-4y15MC0+tDG;x z!zHLz_1K7gf#UOSSb7y#Fk>kXJ5r^(RQ|xSIO7pp-{fbFrR}b7!+oX|Qw7^EkY>^h z%~MW0JSqAYOP_jb%JimrDlFB(9@z!?EGI~7= zmyBB4d0b#Q-csjO^bN&4Y4XqP_)*v~K}4(Jb-(rA${j!Gj@9Q5-6*KF2fdZpK+_8P zt*dOldb}5OeeA6(JFI5e8@>Lm+)h#!@YYp8g{>{J5H#_g6NT30A$qCv0u@O{16|6B;bApQ#C}xy3KFZc1v+P4S!TXHG|ZBeBoQ zD3}nqz`im zO@sqOH^oIV34}8fw4u6l0lNR&Lxf00j=2i&qj-Wuk@`;P^6~yz=g>u76}A3Dm|f8}d6pS6A5hy%C%KRT2E)S4C_g(+Yb0uNL&w zko)0`u^B+C-dx9gR-5EkJ0yPYo(lh3d%%#I=pa2-eMYZui2!&ZAVJK~wRXRu!)i<8 zg}C3DiDhUy(^`;(|5}jAYr|G_VV?``QOj zungNYZw~Z6cyu?Lh{BP5)9Ce0z+^s?b%U%Wdf@j-!HdAVD?H|_y#*08z|;q(Np#*Xr_c0y!oUAZhy zwP&g~1kJ6RIesCMW$u=Wfz@>lE1L}iD0S!%Vdz*p|5f(2)kiFq-KuU~S69)=Sy;Ux zpn7J2RvC~kut*m~5^4#b3EG56TH@?Zz}&i7k4$d{57mW8JZgsDKU??nm9?An5_MD9 zT2V8g$E2OW6QnT>&Inxw-aaC8uyJ8GDoCq>PR8yc=p=3hbbsS9GEr@0{H92zIV!>T zQ88J@Q!o6R>d+!2B3W3bWg{LyiTxsx~qe zq&*@aY3+~+-bTF@P<_U)(!c7~_d8cM64}ntFtIg1hbKsU98y*Ra75LitU=dSHZ^QQ z4LW)~Yw4Phnz;DYlMpz)q7rp>o7KCwvht6!RyGp>H0musM-}FWEbj*wWmUy;C-Wm4 z!E8LfqIV*zmf`pxRD8!d~#@k}X7Zw%alTZ0MlSHvbyq>?ris(k`;aVz1G&l;S zYdK^dkmb;0@$kqDTkE+jc?5f8%Cu!M5~V069!19gt_AQ5^6gMZNvb{LR*+7xApJHo zer{bwx9W2($^wRp{Ewzog#B2H>T}I216`TObf$s=djjVEHfy!1pnSUSrz^8-H_E0{ zFDD)0FIi5)p>vcI4jzKELhv{|2ol2zDP>!9p3=c`!p1WgkD;3D8s-<}lL816237wrLCP?1%y40$D ztZ;i3F9L}xas73jRYZ_`3et5dBl1#%9KV@@ui_c(mV$;EBA40trm8wm3Oaou@1m0L z{OQp`3smXR%199z`6Bii+lHc_`P&N*D{`uL5!9IZ+dKv4~$yle(sy&Uj`asnZ%s#tcq}TDdqR(#^fhFdp2?Oof+L1-4cR%J`WA zN-M|Wk*PYK=zs%H^qU?$ccS}*D%y_}I zCvA8Mb%7Ker0>3U`Eut)CF&)u|2(E>OFczd1GaLl1Km^8D1)TIdJH_Qr{*J|jGIMz zYEFh;rY3bVHL0^|ui!0tuj@LQnv%!Vl(<-=g5)t>B@a#b5H#QcVjPQs!yVoWQrgxe zosF(%e1_KC8c=gTGeD)-U?0x_mGXldcn0X{`?fFQ3W-;f*(9v4 zb{=CCo%-wiS2bz9njw6crd`9ACVgL<*#sTkXc(;CkUr{JkU;Ctt2#re5 zbOzb4!g z&`&f=y2M5#)%p6(rjL7uMtJTJM+II6tEBUry`J>)Q_a2%5*>2%shgmq@VDrI=T=O^ zlzCKOYsh6(EmS6DV5Q0CTC`~O`3sZLUdy!|2+ECtHdv2tJU@)u9M&Kb^*Gw@wbZMj zvPyc4MlIk)2O6n@&;5A4pzRV?RR}4MyDMW3nDjfXZvj{36+?Nrg(JJHaNPI`VJF>K zjt8H&@p{IRhv2vXD@%cr0ew=S!o5D%`dVb*E!xenWp97oIOrbU(&q zjlFqChB7i79MrU`=19dR^q`^qwFbt|;KXFywc*C->COmuXN0*kdbl$}-5DW>Cue8- zAO+-@&t-tuOds{J6tE2V<2Q2~^Rvj!WH7ri2}GW>A#j0RjIfOrU!TqvX)4pF97&Er zBYRA{L>`b(mUWuyjc0?-e+fM#)!A6dD?z7&z5%)r z6t!m6V$gR%Ujuy)bR#Hg&Z_;O>p)L{t_S55!3Us?K{tXn1x0OI#rk&(C~MlSpsZa{ zw^m&Nx&zb(x)YRB&)>=slpVL6?KJ z0cFu-Ts9O_`f^=%jn1=bjUbUc#xHeNt%KrqQoMnRH(2pTDPFeXO;o%R#k))K?p3^J z74HSbTcvn!E8YRc`%3Yw2$}SAGhJuZLKH7t@nRJ(Uh&2&UXkM6sdx(&?=8i9NAZxm zba!_v9#U54Ar1BTJEwSFXiH_BE`*M~n8w=uy3VRS3LX0ajkPCq9mb2$v6q0=dtGPM z-hqy}ys@@U*IBg>p<@rDv9?FoS+y^rW2tDYeWUBF+6m~`J87())^%3Rf~tajm&RHH zU1!yrL&uWUSZk&0tQu!<*%xZ8P1bc*?SANF+&`@Atej*0|KZ4{B2ORksQ&%`I+|H~ z#28uWBZBG;{qGp;6_L{3f6iTqC;wGj!q!%Qv(ZjC&S9^iRh{-aS(bI&6V$Ec^CL5*Y7Q_rBrG3u#jP~#Z&_#cbzb$q zjC!7i&2kL0O6j&K-65qTM&j6>wZ-GBmEtXV)0J+H(%r3e95kPX`5O zX@8{~t#oD3&45{74YMLT4z032{@DdxJJ{qaMgr}H4sEG+xzK$99a~{v?GSWV3LRQb zjUn*WjzA|`7PgLBN5MlCVjBOTZNzxR=+w)3eU3fIW8VXP0T;RZ_=moAHt#*b5?as6uw=Ntbtuox!mAO942wYJPW z|M=&K*Ltr8$`kdEe|CAbuvA~N@ekWP^vf(6mh+8&*t+r7soDRJz4ri*s_Mc<&tyUf z6CeqM4mv<+3Ybs>BBV`1AdM7iFoYyPAk7phQi1_#qF`4*R6xPoWFXX9E3i^u`T~9%CQO6vH^jKBeMa zj(x^s?88BDj{WaH<6*a^=YJjl^z|I7{96N}e{}%F@y{Wl13+L{);a#+%+~uly*2vN ztb;BGCrL0j~gj9`H)Qw*k8X zeht_S@GM{$pg;WX0~iVz0muy>{Q$27yc#eJZ~$OWz-s_G&KU&A@l7P)KtSwX662fU zfLvcl089rQ0?6^rP{7fExVKDgw4S%4z}7Xpp~WI4pA zkgGNVjs@HXcrD<5z-&PFWfU^NHR@IgO?gP9TkTn|Dz2ta^Sb*3YNKB50 zB#rffq_NeKG>(TPEnd+$9+EVUhol_GLz2c+lQfQpB#q-CN#l4((l{QHG>(TPjpHFn z<9JBYn2M6d@sOl(JS1rx4@p{>qA@)sjpHFH$MKM)aXchxtimLX;~_~~rf3+!>oksx zq#Q=!I*lVENyA83r*UK?X@4jhM@Evi46Q7CHF7*eOpb@xFOcIQVsbph^q1oyVsbph zK7||)5tHK~_BiBth?pD?u|FcmL&W5Gh`kj#9wH{kL+s1Q@enaN9%4^Nj)#cZv|@A{ z*f$E$%5+SQhZv&(jpHF1Hz1-{6ANgV@j5~tjq7fOws;>TsIq55)Gvg;Qu-vY-|={^ zh0{$Wqc#rDeRli^Q(LdZxz|p#RBl@tIG@N?C{(yIK=lBO5PO@3l~Yhg3o82x?a<2A z#jN7!VA@=XruASD_7P#ke;9Yx&h)cTk~H*UQ6V5b z00RM0V^ndnay%ew>s-Lg0IvgNn&$(uFFz5m3*Z#MIKU#n3_#R0RpS6DPk*xT)YTXY zVgW)Ih}pE46zvrqvuW=t+J}mEM$yhHS{AfNx;IY8ys!MWf(=*Wxt2d0%po50_J$p- zk81bW4coP?{3et;igR!%I}fvwql0~5Wi>4GseM0$%qF&>VTLz=^q;xJT#O|XR8cgM3_WOHL=j4RxQTCl3`e$=|??0 z89Ff@H4Mx6P(a2p5wIg*5+GMMk^z}F!vW&~M*|K890kaFf$vPyQFvqxMNHOE#N^I6 zN!y^y*|e=X7NEVTXkRPZ5k(8MNS6b|oUC+jkfL#QLefeVjXiKlyI;{BQnU{gjk7;e zE&vrdu>f%sv!t;%C~52sO4=+%o2zJR6>YtuZBn!?ipJ$N>0XGAIcw=W_-z=bFpa+i zqLwBOOGsVZ(W=u8K6^qIy(dK401y5w@D0~a0^>L+$)lF1pS0`1v&xPiVQQ=8Q%duT zjV(~-3f`y;7-nf?EkZxMY5k;de5d{|&1K0Ls*UIRW1(1MKK}P-1 z*^XulMclJdcDh(YcdF)1qinm!;V}%;tTP_hk_7z_J*?S)3{n*!o0A&>8M$gemaLlq zy8$i$>;=I7js=LbUZmN?jpxJy#Ehe)v4lt(=W!&hy`ptev;;-t z+MSf!q-dNKl{DrW=TSrP7)BWkIx| z*NCJNeSS~n)P)JqcwNknzP8xtN8cEsrrsme4k8SI6!9K#m$5_`L=D4y?2N~?mwF2{ zmHb-)nZFnb3(cJZT($wkWE()trag>bNqbbsY}yBkc0kdBkUUZ@M8|9z=VT-;Rnh!W zvr1Zh9dp*F7o)iw;Npl{GQ&YEKUW9huu50HVx^~{FYiBW%OKK-Eshz}Z+JEpX zX;15zP5VsI4l5e#S}Di6R@#kLv^YgOu4pF|?eEm9OJF;_7VUhXK+1{(H*Eik7}H#7&J52kUxR0Y+09 zGS#0BlL;<<1MurvH$J3m-x^)}&_fh;<5b8>?IR|&kC;tkjVNiF| z77dpGPtV5yU*Df6*A9&cQ-EVj=KtSlj%z+L!Fr62O8s#QgG)U|%`ptqmG5ZG5EN;q z>zaf)e4#;HGm#oZOllA@d5%KTHsW2| zpz+j}9k5+nAMimtZPEONwis1aB0e?uPadh@YOx)`v1qv8xz;XULnS$}EI;2lnZqoW z#@WSVg=PoQqKz-CbWTGVsb;7gN80~PZ!k#LJqDtw9yQtdlN1>R)^H4iq=}%qXl58V zhVfR%VHK&0{QCjf|68qVDD_=xC^4y_#AN?Z(pcL`8vB2e#@bHO&MTS~`Xp&r>R5nw zm7)z-G_K4^IbReW=^lHBIt}jCG@3E00Z&b)+oNk~b=TP8s4y3($!LJfOUl&T@jt25 z#_nh|zWPkH(WDx&H8haQ`_E`#h^~R$&W$Ej4~JAQ&pB{!+J&{rDkd*xRD^bI(6ws@ zXi~d~N$nzL6K5eM?OD7_+94ea5Tj;EYlxhca@@@)X{`SwjrE_T8TH>hxM3K!&5?M> zqv8BHXJq(JxCT!o9)q9H;-$Y~Qcj#=h*T8p4i=m1;;I0SGl;Ap^gfZ2eL02TpKei7i4fJ*?M0=yUS z89?gaCcsAk?*XJv@SPEygGa9D6O$|Y#E{R>DoOLzF`L+7D`{Nqm2#bxTvtWoct^@{ zSGbg8Z7gZmDjN6WN!lz$dq&ZoQ?#x=h8)-DrF+ym&-%L&Xf%cfx~>+pq#VZ+>rsEx z4*OWF_3pCcM;KE{`TymKcF#JMaiu0QzM&$Xs9{it^1U4()1bXxr=|jzbt*AgrxL?{ z1N=(bY8|s_dll_1MWa4QxiB5`J`+RVX^eWrv(=^EMtS6#VTbnaw)2<9)aqvc+o#x> z;!I(~Fr0jc+N$1rN2D-bacW7H!F1pbI_h-1eysl2_&UB@&!b%z2h0NL3RBA3Yh+8 zraER3U&k2*b!3G^BMRySetaFbD5yjD6qZrYkKiNxftyo&YC0Ki+`9xBYmG80;R0(E zQO7t^EH%pLnX)w!>9{nerE%c!NEs5N#=bCB~LU zVrvw(MPY9$>>GuhQCM@hD($kxml)R+PeUR^o1m~86nB}z)+>z4EA4&>OxpGHF|aNQ z!|nr}n+NQO@S_4)J=pTorUBy|sGl|ySb)H)fYle+JYeFyp0*Ge$9#SocWrX^-j8cl z8cUg<#&&>VnTN+PSThjxAf3RzWdq=pWi4Ca!S_60!O&9Hu`4M$T!m zIWmTK7ICK57$nMuYJyK&?L#$4lr-9xw&{bI5reZX=gFIcEK_KnPnOG}b{QaP-Tgdy zg-=&_a}lcrUeA*oC%(JV3vH5*F3J?fogF`m{WhJ1 zT#?ta<4h>_#oG#*a-WIXam#27Pn+O9$9`eYc*ybblsD)G{9jKo{GAin?kBP%FvfR1 zq21Txy^qIx?@M)pTdmA+uf1VdRyyOQJD!<3eW2behyuiHfEEuJ0f<^moKL_gwrUXG z69HoZu}?zmcuEFLz@j*(*V-}M*&U*90!Q8Z`DM=F@S}DS%AfW7ztNZ0%G5L z6<26-0A~V@2SjTq>@NhIg!kou1%Mn0Oa|nrs1R@)U=iScz+%9ofF*!Fh+7#TYq@g3 z)_~XnCC)um0&=g%^?-1T->t8j12_%v4nT~{s~!iO0r(0aM(0(Z0L}*d77()H96}W! zchS!UYzufJU^l>OK%T?KDZ8p+fHwga11UGS<(=wtB3(z|0 zm`&>itbvfjnHPZ}EWp_Q1!#kH%%)`kW9t~evnT?y@f3+@I|H;yI%d-{bor*NEgR(m{1X{Cs!SVQ9p2Va-$bmG{kY=S3Pbj zn(S*hn%vmCfbJ5Ukq3rNE@;Yyy53z-kxBOVF5shFsOMckPb23|OhG*lE~$ocX!=b| zVKsGv)1=c&GK1tzOhMJJ`d0smo0vG%xS_sQF&PoN0?N{5!j8lK69UBbR7dDC=-ol@ z=A<7Ods=p#!RmV85SUlGGS5inWb0DL=>vySah)gX+7SoF8h1Q}dUnKz8y#`u_9r$i zvKu=pIjD{O^mPbh4!!VUxb6*fY&KY=kPLcDgVaZQKl zX&PN(cBy#)g+0x>czEoI&4s~FM%UE1vWd$>zkBfS1>d-`iSC^C;QtD~bWt8`I1c_` zk1jRCM7ykd@32#zrlv0SUv#I9B?$KQcx#Eb6%%eV@CVm>R~qy1Fn{`twFG-TrtEsg z!S3uz8~a}y3hTcrkC~d%$fX)1WwGhr=OVk%6~Y}acN}#`s%qME`W;8S_sAj+vGbD? zMmM{ckoiEY;!B4-&ixJ$0u8WAD9-@&5%14K3Bxg`JRS-)Ft{>=9^pQ1ETLwLt?f*W z)98Dbp)cJEyd3-Af5yXZP0wxM8PB7@jXt(Bc?~twXvD6~f9X!5rr7S!Bw*sWCJp<- zKQk;SwT7Xtv%czv2VFy97Nd*CvbPkFi<7qib_Ki@FcJ_$_o__5<$#j`aTHT@Rc{Bp z1MlcQRy_`QC*Ui9SVXPj;=sLt2LaLL5?2+i0Av?$C16XyRe)Ck-Vf*iL_Hlms8!7ad;}0~YU=^P(>4G;4~Xtt)h@ut01pD98(Z}q;1hsn0sjN&4`q51 zunpiwKu#{a21q5_14!k29WWB`Ex?h0Zv*B6z5`eUxErt%@O?mR>()L3ybJJSz^4EY z0KNtI3E&aH&j4Acd=5x8se`b{E-*3K1tw+__c==%>v>7z_8dv$_8dv;t7um%T8g4! z2%^iOlds#Ip=iiuore6?F?J7m< zsc3@~Ek@CBkXp1k0a}`l*?0(94>J$JNt$+x^tNa{|@kt;(ihswa#<7ieaMNaKHt2Ai|himD&!Pw$$fl zWSwodj6yp3!w1ldr{cpC zw7^*zq#{gfOBU+jC-EG{!zN>YC(>2*dj@rn(UR!ry66HU&v|ru+!)yqil)E;$cBn% zyr|$jen+bw=exGR#U7~8+2R+&9ph;1O?G+KE2Om(ZU^pqWR`kh80NihP$7FcGRyUR z2A?q!@gae}n~zQ%GF$>=-m(_uu8j9}dX*-RPC+llL5_uhiQp{;90s@)FdOg|z+Avv z0Sf__0hR#11Xu~U0`M-thX5Z3Tm!ffa4q1=fDZ${0!aBifR6!w4hY$*F9DwbJPG(D z;Aue0ak*#{AW~i149KKMf3u2u{~{o3VanBqTsu6nmLeu=DPr;}ZAs%qu%v~+rld93 zF&i!%F=zu7ZHl6mC>rW#-R@J0hB{cMy{TxN)|Gy6T9=sjMKfp51|l$?%b%s7MSAr8 z3_I-qRon3+jCs+_dDz$3CUs#4ecAqo>8=vcKWYxDGZYAEh9KpMikMB?h+j!Vt_sY1ibR1+Lmz28H%H*o2~%&Fb{INNe$BJvM;I^l)?Xj)t*we; zssFbQ^F{^NLnPS6VaF#BHI5N7Bm0dh>JUh={lfqEfUoN@WOcsONIgTXjMVFj zRI7cZw}vX1_0Io!$8epS97iI4hGF?)!ujJ#)QJTs@ho%bU5m+ROcYm91+N2a4_E|v zwf=q$U@6{NKFMd=U5-cA6vSjrLCmJD*0}*}M}(Z*xFhA>QZ)9cB<*)aYiluR>_18O z`YGBqiZ)r%iWLoG0Np+G_I11HPwTYz6s-`&YPp&Y&*otaF7G7iY{w)JD#-_0p`!uZvvfOMu3^Ju z&4*~^CXR6;UE~kbtTP@~))|t-ucwKUaSV{X!5;uwY5xSs?&&GOFu-2{`v78#Q`IEE z^MFiy)Z(Iq^aU!9(Gru#Xo=ahPw*>g>_tf$M;emGiEv44p=fOsjY|?zE=JKdDcTlA zqo%Qhh2k*`JJ>Wv5_-1HXTkH_xJWxtbz~3br|kF<#;jFo`4bDuaeKsITslxL7JUaH z1F>R@FSC!&$(^D!g8`GqxxmYPwN@}JT4i~DndlW86}}NxS4A@VLu1>R)x&Tc5dClC zjxvTtg~U)0`l$RfW-geshGE>P9gKgdPK<=Re2)TTnnVLqxv3$tJ|rgVLt-{X49r*)8SsKq=JPg|okGg?&j9A=kr!5*Ux%d}H zpgE9Y8SoSKTm5CG@^b78{KC@zOGl!O2~p>Xeomvxv<*h?$ph1i?0=mO`E>mhFhZwp_%p8d8%fPF#={N+LENC+8*c}#8PHj!RB5wqt)Td|N<#XR!^q_(1t zsiIEV^!NV2rS=k&+DlAs4wbZ(c$c)tbxeN5SkewE+80WW>ju(pOC7UmX^J*n(WWWd zOhpStn=9>h)-ms;fi*OZQ5rl)V5{Mx=dlIDjt%yf+G(4{JOXpS5a9nFtJXhlR>L;Q zzkjUSbHvL0@vL_nKvS7Z4FQ>Nfx70hZz?sHnABWiHqKs%4>vhZ~KCmt2K2kKc zypqP2SK5tGG}g+Jc1Y2_Ry1tE#5Z*P7av*tM&Qdkx}66D-~K!3@INrt|A52))86n! zlla(I+XC+h3Fpo)*J`~RMPYm;Fjec1f$llsM?0+6uf%hk9Y4aDtMzoWefd$jx%q{d z3L7Y<$#C~nj_UzI!&}zZ?#FAInz~?yM}TN!gHU1l0}aL_-BdebB3vXHR%R+a>Z;Q* zxh$$Dbn&a0>6pf;Vq7rQEUGC~UwY;elbK7*rrixGNn4>~Hti8bV_HeM8+t@%tJdMJ2n`0iq3r}z&N~j222OU!gtjOz$*Zm-+ZqR z*Z_~Leuzm8C1%qez^|mO)iIm)wxYeKXzX-LIg~ts*);gB)8LOzJE3T&70sI_Uk3MR z7&;oy?%}Pl?Rg@Dc36*KURzsi$B!`HH2Ff#(zBDuP88FXb6ZANo}rb-+4H~nZwvm7 zv-Rda9EC{v!w>H4+AX1X4eZa$CC25>MQ!!SQs(wKq+ zbmFI|Y?()&0W#?5W>rydz5-+k`4*7*_Z=WZ&jC(NY!djG~=YG;i9= zs)eSe`j<;psUAHE+Ogtc7izg3Kf-vee+}*Z|LmE5&-pqdHh>q=?l;owOP=93pWt`x zS2FEbS28cU;-TpdjbVCXnp7-r^#o+v_R=*e0l3s8Vp5Zc$v&i{J%)El`%uRM#KfJX zac8QO<8E3>9ma@LPB+@|BaB%?GKoc@kbu5 zLe1wo&u<*|X(Yn23HKD#L66pSB`-5LLIzc^J+^1?Zdot4FBnH$VuZ~e*k|G+`g4uY zm%c^N*uRrOr21e77*_K~2Qzbw8yar6%RQKj059<^4Q%Z;;xP>KhQVN+wN@u$y0(hJ z`4W)%_8lM-;|O4Tz#jl30Z#%#!?j-k69In%90`a`QR1!!3(k4x;@t{Z09Y5W5|H*E z0c?i%4S+2Gp992~hN`v$;#`6F${#jdiOn5+XWNy8M{dd>CO2gevx!Z&lJs` zBn@X^gQ5!Aq9$M)5W~t-T z$?a3mm+7ZPt9J%nyX2d(ug-!a4e&VkD#y}Y-7EqO#bXqBRwz^sz7x*I6a}7^Vk(_s7G6 zM6(NyGL3cvGJ>xIlJ_292H^XEqX9nzECc))km-2>>!_ zp2jNX%{07=_#+Rc`XXMs`VzBos~_VE+LJnF)40?lXtm0?l32~+V9lw#p(N|3o(_#n^qlPC;LcMyX$SSSnE$!St~;R3 z#enK>E2l}>jLNYl&Gf2VMkJV2R4yu;Q6nz!qF6@I0lg>|RfsOy-BpN=da97QyUjGB z5;2{O^u7V!@Et8!6_sfwAU&`kjb(S6nCxy7vuR6oZUA?l3OSqj%&nB$rfAGp4_JQ}6jjOKQzu>_ecC8sW=euXi|D2FBdi36j z^Oxrt?|08{e9seoV;BFhDP+guC;yz0Tyf18yPtphXioKlHy%9Oaq`g5e8Y!My?6ZP zg16ty+4oF`R`+!r(Z9(X6DLe)dS>`75ACwHY_n|rLpux3t*;Y!EWh2E;f^17eX_cz z_1dF#ZjO4r;qmKErj?#*wC416k*CJ~INtu8@&3iws|#Pa<-TQ|*E|sx{O9iEt3jvqg{adySJ+nP+u`7k+Sy7kt3C;Zaoo$?o-era|OAD>+Z zo@_gA#o(6={|)(%8stVExcS9dhCc=zx;ymLQ}66OZM=KJPHV>mzu4nxKTrQ-mZr>I z@rv&wJL*6F_0#uPE&cP%Fk9g@kA8nD_4ZBULu3COy7cSs3N|0=)w*Te>hr^!_MJ2O zp1m_3ncd(&OGf+8KimG>`2D}dKUS2m`Srn*Y^Q(ee<(R;Prntte!REnt7hw>9<-cZ zQ=HT7@QC4!yUv=MTJ_8DpDv&I)!Y@~Z~as{d2-r|gI*r{@qlO6#yym{<8Wem+WGIh z?7O+umW{2}Ju_?L{-=iwjQw)Xt9SLeYQg$0&3aw+LO{sTx*>k8PbGzYdf$o@b0;M1 z`L*@Qt%VKlpPaw4yWgFy+xBQZ?eyq6D~@h{eBzSMo%3!P-+9jDLo;UFH=xBIO}=X4 zS6cepgSS6x_N-@`B>4JAM?6A|p&>Zb?yT_kz3~ zGkq=Rv7O1PMNU9--90R9xn`--Dc6@2b}!1qI14+TgiQCmGF<6=eLkH)QN_X=YYBJL zJuiQJ<;2i*Qfbp_*)+u2rI51S#oCR;>4Me5X*kwC?cZ^HBI*2P$)}+V-NL8J@GQh5 zDcvjbr&WX&6_Z0*tAz_cb?~Hb8-S*SVWjCV0c7m3>1vCzR!ejI()~|AxZ`1`t!&*^ z9cfE$RuVKn{7PGVeeI<`w;SP;m&uVz86P*l>Vi^}U!w5^zpg2SY*(yY6B8k<|H6b+ zX9(W}mB!x`LecVBME?!^H|qY_(HTP4yfl~Y5*8J?5mz=gpr3sL>T+)#3iPd7Xn!|b?8}AGucaG3d1|f8@#qpFggrCei zy2WX$P`5=HcU$ZrJ8iXTwEj1zt@XMs%DCHNY^)ak(tKC%+(@UbuXS7Gx~Cy?%4#t* zH*;ePboX^(4%CGS((E337%XgY*hJZFQ#NdL+LGrVIc4l=iyb_xGyrxE1V(3XFP>zF8m@|07@bt8SXVn3sNjBku2wr?_bs3>CU6NJ1tBxWqoGF zL0oCZEE|2=Y3p^}R!fsD^blc7XKUS~ue{A^>!?m{WwOPTv07-C+WFrp|6Sy?<)R$G&;cEVOXei^QjO<&A$ z#;XCN3e(PHt39YS>2n|5R(q4J&{}Ne=(a*lwmJw~M!c3@{`^nQ5ZR__P+MuQo z?$K>^G}-D@i>*_-txhIeVzg01P0~)UDmn{Wa9$e;%KP+3e{gaa6wZE0ife1$g))}^ z;Fr!ETs_^T?)_PJxr-@0DDbf5y$rTuVTQTFWa~;$Ybt{d-PV=TmP?PQtFXm!4qIQE zD?|x#?KO1+74;ZobZ4;Xi;3wfgUSUm(_GxKn`EvMGMrB`{OTZOT-xq1A@e?z*$(XX zD|bC4wZ+x1a3Pb2^t%QaO_<4@9-vw+C*V$7VDC1Yy36cNPa#v`;!Y1!n0pDC_Yr2c zG&Gl)WYF-?FZ}8%hItsz^ywpHN>PqkU(mEM$@B%)Y6(G@*<+w-XOf8k)oS656^2ZE zlT1G$gUNIy6KaxS57cToi+CCCbTY|YEo8R4#J#OaW`L04Z3jlbq@ziOxn#BMadD@! zNoJssc?0ekEngRt%pf6?1$PYnX=##)6f!K0hOV|U$wUbm&Tty;1es)_g$#RehD;MF zQU@ET{vupC-oS4y+-4*dt(z_{zv7?al7Q37PtEr!6oV zhbheQpjs{X)V5g6rwl(S>0V9;3zzux+NXnPi55>aMGeOfo}- zjB6U!G0BL&izN?f7)*~~8k=O2K*fjyGKQ{(NEw&BNER~P@QW@iUen<#&pC{2ukqY6)F6D7h#8D*l(Fj4L_QJyhT-Y`+VGf{k)*uoeo*3?7^ zH&N0}lnN7Nv5B(QMA>1Yd~2foSEr0b8lv)n39<>GjaHQQI%T+`#ORb{MH#14ViaYe zPH`y8<2ofwQ9jivJp?5*F*%%Vb_KLJ2GFX3!iHY#6d=Wq6pDzmjOn$11+|0D@r)~J>&2=DeUDGyHVJund(aE!QROxgi!RF7#`s=PTB~H2%&Jffg6P` zb2BAvNg29qccZXx)X9xPzp%N<#TJuefE$I$!DSZZau3S9gAmdOk%l5Xtb<9BzB4@B zZ0w{E<4lc{!tn5Z1t*2!pDqrC4^DSARIA?_X zKOY<jT{`6 z9FrQCni`4p9Mn6eq`0E2q_8l*%v-Fze#O8XacoSMU&TokUyMsA&dZ)iv$or^WF3*dM z>=)V3OQN`al*k;xn8K2B=VyV!WuZx8b?_fE{}8u)$`q` zY2(UDiV}*;D{_i+^AloSEEoa^m`nTMA`n%M4G*fuE>A2$#hNG6B^5mpT*q%Xfhb57 z^Uj@CQ0|oxEoxn_ELZ0y735`4Ekmv25;oFM^WBC^%1fL`URIw(1(C|?yzBf@B&i?Kk>CQ)%=p5{USYj+dxbfTqW8#+AXU4nSC5`O>`oKjr*A~x zh+chr_jA&Sg@=Xp>C?w<@723UzrKPs&X#EDt^F1el=sB_nmESBe!1(O1ioAGWU0|O zDKNGmqxa8AAYrBr*0gNMeUvKS+0BpCf}&mbCXmA!vty9yJB)9r4wTRb>doU6+K6~E0II|!L?|3dB&xOW0FcV_~D!Lp6lcrZWS(`6_} z<1HSP`_P-5%jy{Ia=qaIwU zdz|;LSA^Nv>!ci4X1uxA8txU9V_*MtDc9R@&%@s>h{uW>umftAl%rmFi|-N8cR*&t zY$?a`>rHMO!gmldci$-GSbuqwI}U%BS7XoUd@0wU207-(dB~J3ka8-WJ>qc)1@?8w zY*;MiIJfQ1U#?ROT7nOPV}_lkCVx-B-~Eu;ack{zTpx%*rSRKwDOXeaajhZ$Hry(6 zhm@-+eB0q(`#Yfrch&A5(`DG*2;V(YuBLR^0)JcGi!z6KE}F)8M7p@_qadC2>GGAt zoJQ1FUgYk)K)HJ_P;S))$~}02a_hXwNqy04F+Yko`H~o-l?X(>; znRyZ>737wcl$T7Xuy;=DVoxbW_qkw3LGeU;47O<&V7f_!t4RkgQ8x%K>%@@Jm}Vgp z;TO(g)D8X=9-h{3*ZDH!A_n4Fm;rKF8? zte)2m?vB7)gk);MNJnDEs8mOGLUOEQWVmAccw_fcY^yhR1eSB9SKGgLPh)PR~8kHF#0?53P(Th&VNQz2LNsC32_3GI}MvrV6 zJy&*kkDfAmVam1)wX{7lEk0T}PPU#nB2tnK?nuSf6UT)epK2Dqe~y!|lQ}9PXiP$`nhC z8kLfnk=;|zF0x%yOlS9k5!p$;Ym({w@ZQ*%NQENbHO+KB*fKxKcTF^d-^Xd)HPLi- z1dP^JciuJCbbgQUF#c&BAkvE=sPd`bs0oXyC^K;>X-QET*;ES=5m&J^vlx=fQ!KEt zSq!d;XuG%;m~Iw>YaU|0&6_s$7B&$}r)$2=hnvOVnx~k(k4cOwY!ZtziBXkJV%M9* zsFWtLn@nPmlCDt?#)cThdITz~lo8o+nTd(%F=-A*vdBpCH49Tg=O?9PraQ9XM07M} z{^-Qj5a}n1Kza<815#og*)dV6>4_;ZLow`={QmCzxNya}+Jnt;D&CQqsv?!-&UGX^^(EPzMT=0rWKk_LyeaPdw1oJ<&Jd-#GZP(gPTnwg zo^aGq!ZddtLfTG`W4b#B?K@L1CeaaI1?{I@p4SOeu_8V#0yhdmuupsI?@tSVpZ1Vy9-36 zrY0uDL}etTI5l#DyGUxv2qZjvR?N4F?o8;0V_0TXV!A2{liUU3!h0%KfhVh%VommB z^;WDYo~%BKRp`m;t5`*ztO&&__GCG$v=R?i4`-ED>dA6eY1etOdMLljJXy}vDEDN^ z{v#8)!ky(9>4?e9a3}?+bY~BCB&I6f_3peRM{=gB{ieF}(jAG87-xMl&4ZhflBz1H z>F&I!_^5d@_W+oa}75^LDd5DIxHq(QZk~&KHH_M%u8kO!6{n_r!IJD-<(K+tC zBqp0tr&PJ~hNmQECb1GX+LpQA_@Y`hT$t}J0p*WLNlJ>sfi+n;ZZh#@;fPAdOt=ci zz3x&`iKy73TpFqS-1+IF($gHnR3@%)=dvH-NK^^8(t|7Nb)#uq<<3O=nj!}V)VcfJ znQ4xU%(Ubls@$)3XQw+-qtc=>VBcu+A8;2y4_;-;gB~nYNh;AFa_5PLNUE0+>NOq` zY0z60-?i>c$4FP^Mt3H%3%Ou)1)lQ43=;!krpD9m+>F8K3q~c!raR-^QP1;d+$Ccj zF$qbi4^{dY4eus*xtPqfG)HpGsLbSq3^7Qcug`jyNzaTHVun+j-Ng_ub_|dq=*hO% zgY}$AM)WMCkm1l4lMo$>PK%0hD2KM1WQ0Rf$VklRO+pz_(W=k!f{7cA5o9_>d(Jv- zn@J{0>CcNMUbN!9Wa7mr-peMQv!d8;;yJ^z!^DeIYV(STHxh-ws32Z7ab@diR53fv zd`DUgx;Cm`^qNT`(UG36ipwq&J045S>=_w(y4xfXm4pIE?NxfV$0QRQo#+%ZsUUsnxx>EtDuoM`%Ho{DT(NJ7+u0QO#H!7>4R0;zG-4h4KnJ9 zw@mz~3{`!-ZDKk`#vsb7U-XViAjy%Gjtb79Qg**Lku(RABT+f?t~VL?-t~LlM51D2 zRV(toHv!ZE87P+-O6mh|QmPwnXv2rzr1ajrA@h+*hF$R_(Ooz4?qidTjFeH`9PrME zW~Yr(ned58C^{iI3Ic{N2TcMgF&WtFVHBTFO?=P<`#rOLOz`8xN+tm*0ADUA_FygGVoo z;jBeWW~iBpBurPRtnhK?MP&#%VRyEOp%lu){3@{Up(8HF_QX?jj>bj8M_9=gvxsN^mNY&7FrL9Fv(Sx-*6< z26#xMB&DJ+=^O{ucjrgNWT#^Y9Wz+fW(`aNVm`sB>>8TbY!j8H2b$QJF&q(<7OUJ3 zGD(QkH;PKIiJj(%OLL$;HHv*BlSFh%%Fv{!w4v#$I5l>ci55+NG8!b&EjC;VsYwc* zYomf_;w}@LkWO7lACZuOG&35UrtU&Rqhk{i(MiupiH}co*2B%bONk&E(Qocu1_3ha zfEMl&jv*Wi8O)aM%=AQu!#Tui<<7(q+Bx^o+Qf5CZ?*B@vCO48IN6BryGV_{%!^1I z20upT8`^ofyIguoT!xq%GDhikGv9q;sja(!Xu}NEZ0F9yWR_ruAdE36l@@I%s*>zP zSxFgGA4yG<)W*7Oq%JFJJA+uIiwa^RT~f11S6R6!nvbBRxzT*394k5{=P%_*YpT2F zQ>9f2s+=MevbV0aAI1FM83wERk`HivUVqy+oF=9M(YcB!oSyA z8ew*kj2fAcE`|mpm5dCuHcp47gXJQ6lVg$ydbAQz!#Y#XHi3 z!gfIxP_j;Kl2Ub9v?=Q6RWvDzr6ViC~lpT?%HY)mhKwTtnL_!fEuJ@Q=?+DQCA!Bs$ZL& zsP_%Y2DM2ljicWUYm<~3#|rCatldd{awKCtAW5u?kSH@ZGdVpo6)VIUSRrbt`3F}( z7@LKA_Q-DiPt{8;13CHbwYR_5Eu}LqAHS)y+HD@DYiJbBrjk1#xy3;2m;(1L4l5wS6UdhzB!kmfa z=-K)Uy(XQB={zN*Z>8=Cfmc0!&M2wOorEljgO22vB@|C65n6IRHg3=%x3m#aVN9tE z*znK_4nEE#NThdv zJ%e&8N{R|{p*n5g#7R9MGKILYB%2Y#ja#@N)Iazk-MykpkZ@{~;E+UX{t z)RQq}gHC_kvy&p2SoRNQ889cEs49EwieRLTh(9vyG@cXK#$^GtTRR;4;hFP$W>#I* zzw3w3FIxU&@X5w^#tc9D)W#3upM87KAZ*8T2)W0aTi!11balNc4WFy~YtOnJ6GF!P z(xvOv>7U;H=J#(|U)d}#(6n3qr$-dO`F_iHe<|wQsB^QtdSwf@y;-?v?XyE(Z?ki6 zwF7%QKNaqEyZiU>E~k!xTJoiZ2 z%r4K@d!lOOwSFh|ZOQ1ds%P8GSFruCLddrHO4~j<10@;KE7=Gru=W-Z$6__%hz5Vw%qdaN53A-iMpohsml2; z!(VJKv|E4sdGwvz(tf!5jk@pNU$HEy;jF7ZyZf8{kB*J_^sS)kqLER!%1g+#y|%3X zi`U0L8xptT`q5K{KYw(=x{vbrx7xLE*}Ql1`_#o&%k@Go$Im}!1B{?$P|+oBEB$w{C>oYrQ)Jezp3|^ij8F9Nn}bBmK~pANp(!jJ~2( zV6(6G%$aaKu5rP3ROH9bebX+xZO6m64sLqpk(WQNJ8j6-jk|5?Ul9Mcqo8`i+jeZF z6mnBr#N|Cct;Oa&zSr$*I`gZ@D%$*Cy5Dx&+zKgOM$_!F+K5OV8Ux0`F(Jvr#- zGjHwxu#d*)|h<<7XMsyWbK@*1G675NV0dh zuH{Khi^OI_yY<$JFEbX6yJOA5|FiOo{;WY=P!G#+ZW^JAIQO0Ss~Z)?G5DRY zeaHB{+PG`%PxpR%f7~Yri_YBi%liLn+F2p@`t@16ZpaFJcJ|??!vZ($kM8-Oc9Gh# z`nUf4`7q6=Z^{~MgRaByEq?pZ?lt|BMt|91&~+1kzp`Q3((i9N(__(FM?a|EIi}ed zoR^;~e=Ssg*_i|$Z>i| zeD9m?_y6sKAzQM#+*mr*ztP$ARk-qv?c095v0sDexv71g-S!%;BM@?fE}#A5AMcjl zwjg28eOK7;c;nSm3%fk^@s7KHeXFAS`*%Cz%*c&G?&&q{J2a_(`?$e{qpQA2s@j&F z^U(_(wq4aZwCSAHuRXXw0@vFLxz9G8S-a_xXBwoO9Mv!Cm)oX~E4+U5fsw}&!;bI% z^no_KMx!x~s@SbfXC3Wv#rvQB(f_XScRIYd^Q?8>p56~0>{j~v8)3!ujtmIbG+t<7 zx4!v6-l)A1lbUO9U3*XIfC=e|73-~!=3n{#wkvzp{mk)09JX`|xyv>@^wkw5Ki~7j zbl;r%yMsFK-SAXdzxzh4++b_epjFG`jWjJD`;hHcdqBb~KfOC;_lEAP{>+z@g_}sRLBi_=<~hdyG|r&PXr%XI)2QG0}p={-gw=_ zw-a8S9eCBTkn^aAgxtE~4nM!we|N9SZCRK9p53``^_+2!mkfUGrD<()ZaAx>AZBIxfu`LoD*T-D18?3iVU2(5RV#i>D~7*a>oXps zfAV=e>w~39uSHDz`sJ`mDa&5U__V{4Sqt~A&p9w}T>7=X<<=-OARlJvMaiU5@S@r@n2u zIpv|PyVgE&?YCQ}Py7z;)_X#3%hnyIEGr&aWoe!9`yI{w+I_abZ`;(o(B&txHvQVr z7Sjv$2F^>_tw*zd`Jq$KyS}wlb^LMC?S*T%EqUP8E{`?ab!EE|&3>I)l8Fm+gxrv4 z=MTufYTz9oEC`RfCGEOpZ~gM){&$ndmA#&}xBG(23vY(MLT=j9MwJb;R|ao9|MGh$ z9-X@AQ( z;PB4^SEfH4+B)*FEVMJh^!KTk4y;@J&FpUB$L8Hzbo|`tX?s8ZVfTZr8~(iN>8?-p zy5ef=QxI~ezP{?n`kb_#ecqo_eDat44{mnM8nb(}<=e*L?e2fJ^|Uuo-wV0PkCpAX zq4>#Gfqk^Gsduio^jkUop28~{eSXUo?R;B4_sLV(&xyLtZoTi3^_gQ6K7aq%oK|f< zTY1lk^rAr<2aiBCJoB1cPCtFsN*q%Wa>-9mx#fp%{z%)zre>YDycjU}zK9d&4s9;jZioK$7jk|r9Is638!>xz zR{HJx4}A5?pC5kH_vh0E<1FuOzhULPyCHW9{mu=|@KgIih4Ql8tjYR^sk7v{1m1)0 zc0?ifFWe|7&MmCW6ZfZQ7nV%yK8f(L|2fx%;0X;}fTU>_cnm4Vp-SV#vN-m800{D=4J*)z-VB&VndL$I=fV(CpSm%JM` z7@g}2^72bA%0?*%QRNq91*d%ra`bThQ_**g`#^q$M}4uy>vo(WeWKAYoFf+&;7bA3+EY%SzBoY@qWh3rPr~fh9mAPdVSw-S*ivQK6B4$T<-W2Gp7pE>^wOUlvGq1R0suxc# zMukMob4&0s09@d3Nm4*pN+dy^ODbG|?l4z##Elp-P8VpUydn=p_);VTT*}Lz@Ry$d zMFT9aNxBr_(X+*iQylq%=DN96)5 zjPlB|2|2m{aABVIw}Lhv-=fUJ^7=m?gp7|1PT16x$Ro%Elz<4E+er2(yRg zk1w@f15i+E=X)>vmG)}|0dx}NOSycB0QVZZu-LsUCp|x>EO(NtZ8u>$r3?QZU+keh zdg?*yCPE>+{hwS4?_>YpokE%+St2gEODewMJ^lr^;ae{ekxP;$GNUd@z&)HoIAwzW z6X7&Fu95}5UMf}TbLn(NIfZb_gz9_gl%*EORkHL|B?wdXC-Gp(09#rUgJ;|Eu`u9R z7RA2EjXH)!NEmF{xMT*)K=6;gV&M%Kf3ai%42u%j@J0-qsIaq)SabYhu@+cs{Dun5 zj^9oK<9oEgI^!3MN094^-);g6!*5T4VR=mJBQPv<;|2}N4ZtrSKP?i!g9H|fUx&a3 z>-2tBt~&kFJnykq;=SMfGEa|ufpx%dTReVR zZ~V>`v}^Etqrjqya%Pki+qsJmcS;#!L9Kev`B$+>h+r*o_zz!FI#_xZX?VB9Q6H(k zJ2H|=vOBUfHdAQ3tLEXCX~L`KGz14r%^Gi|3lVx$Auu>ueZ2mb7QXm)FCsOeU!1M7 zFz~sgpe@JZBbNPkSb*J*(^h2Tm3t@bcKmT(+ke!$cbDVru^mV2ElfHC;gH`BPp)_6 z-ldMyWTk>Wd|}e>B8&)D^_hAVjV8f2Lp^-2UGmM?S9@+3V6v|+C#hKwn=e9EfM4pU zpZMGZwiF@UjFC)6d4YMS3Ok0rd3HH1XP1|kYfdMHN=OS#yCnaf?+$;7apmo7+Jt`B z*{%(AyfXGxuQo26C=xL;eaTq=>KjICOJW8ua`*?{aud8*5|cH2#Q89pUD}c}OC8%M zN2Z=Hm)f-CMD@;)`M=JNnt#3`6s+oVwu%PBQ&E~m2ph-hPqsPVpi`5z$&rwAb0BE` zuXA3W-Vi>W4@=k6(*L&)cl>yH_L5!Kj*&?%Ksy9z8lDi1CB8~v8TiHa0?@|emq88@ zAET}k*b@9!3k=$af25rD3!YFshM|Vh_)DOzV?l$VENf6c4v(+V8+O3brrY^TQ)TR> z6(4GlJ6YW>dgn*IQ&6{wZ_{%dv++@H`X!D0PB+664B_qAzi82ni3%ld1eHvF)|-{A z=QrYY_Xw&QVfSsY_(nW^Z_2O4)AuGI(kgvv>hwi?173c>yR(ZcMx1>>V{J|IkVUH^ zTmwj#Si8y(cN3Ez?j~l_R_fdU?ExLLY5NrIZAI&avM%jL=$Nh6Tr*P6GuPI`#pqgc zZH65J!g$Fwmy5wKD$D*x9x$)2g8m`X<{;^iP<#V*(ln!0Bx0y z*+j)9<&G;FQ_iz27^&$G9*t+Jo&zn>BUKGM)Q=)NeuVLos<>&~{5^_`O5YF^30C_S z?8KK>nq#i_QkRP6da0mCP2D__1%tW8dfhOt@ekFBV^HXbqBW>ux{L*6`5<5B8Znt` z#BACcog1J%qGLAg14TQaXptxt(r&DdIm<^ZqzuzWM~s{-M6JfYpD!Ll_G)Mh{=1^q zBUjdVzX7IrWK{_*Ax99A^o&1a97* zI=K!S-Xoy12P^s}1AHqd1a6MAOxcsSWo}hf)o(|w`*-|NcgfxzM=!VTt!&&AEwQrV zFRWDm9x|t?=x~`>=wJRG7r1(R^>!Z~@?L zq;5L0RlHrk+i`}7d<)j!j`{2M&J3GeUv@syCkII6eC6564Gr|nyUS)8=(N31&0$Cc=-6Roa9Kb=_5l~`BglTDJUcMe`07Z?!} zSTWG)u%8kS+C;~@y@fqe(ELW2&xj^FyH0>8=Mr0y0y_@-2kc>DO2*v7=TT_p9>wuk?Lg~LNkoB1!t8KQa%Xz$ z86CJenWHCo5+JR?X;{%yI$)1<8WcUnbx)X=MqVJ@uh`+tRi_tqq~dIegwphLgak%A zLQ;ntz4WfxV?>>?1pAq5H&=pv1D+7^K{VEhAz~yau{-fDu|vREQTSeA(A3JX(MjKUIuv3>T_(ttf7ura_M6c|5G zKMz=lwhGunfo%XbLtrlglXl+(ChdL%Oxpbkn6&#FFlpBcjgWSm0h4w+0h4yafl0dw zz@%NCMv->M0+V*H119ax1t#q-0VeIP0VeG}229$04w$t28Zc@1ZD7*w=fKvA_?`mx zsKESv4Obcfldf=>DqXn(m~^EtFzHGHu(iVOC}7f+DZu85wBiSqr7JUmNmrHus}$S^ zfZZ>>MU+ko9CFd(8QJP*(?+d=fl z3nwIK*ni@j5M>D&8dv@eO+XY}O?wX5mq;5|{w~2M1uY$(&pi0;o07x+i0ps0hWlwA z{V#@zeiKf$QlA)Io6@$vn{>aY6L@JTn$ zfoXm8!hh<-UU+WBG)P7Thd}0eA@_y#GE9~k!&(_#GMwYo2C!|1vls*C;K*n@SZ@Y_ z2EzI?z8#TbLjoQfM29^pxDm*lK*Dz_a3I|u(}3B^ z2_rj=5HaKpbtjO?;<#u--HlY?h81Jyf#MzqP0PbE+U&A|iIaE;Iy(65`Sa&L6hhxy zgWQEGOI5;rEF_LtXKO>OjohUQ^Cw7`&cLO2h1`#xGT1;^EZkzW-VidUt&_AuD`Ork z-uc}+Opiv%Gs>twpgIi2DH_2RsAlXNeJsMyvjsu*xjtYlz70LiF)R zBOzmg+1IBD7W4_2iyMa-meIj>&~or|gUiGBzx$lH9EXTu|3YCM;}8}p z7N|hHQ%&tibx}k}pq^6Ag_0X{1`#5wWfZrIJkpTmIBTQR@xfRzMyU(f8uWUAJprc! z_65Y}W2>$P3~Uj6{3pf&R5?~Hs0pQbslL21XmoC6lSKFdv0opblv*Bti$qmo~bj+q*u4qh4+O>%f z^%4tU8tOE}MqmLN(@x6GQ?!MO_PC;LRJ8XL?IT6|NzqOz8hdHd-&Q(i(*`J7q@rD` zXyX;_CPiDUXpbt|e-w?qH0j5FMe|20OIm#$v*DDDK?_y1Pk^x>8=$ebM9ijr1C0HR z0PU!b*|cAQu{RQ+{h?z>d*l%NDoA@BvuVwN-7RSB7Z9^)U4XHl6QFg|F`L#O*qwql zP{(ZAP+)fmT8fU@v@Bq^3)(mxvx)wYj2r6`Vm2<=4C5%CODh=32Q7}bM8sGE=dA@- zA8l&GkKhGE`*@2QZd#nQ?MHlcK_6G5F^;yn5{+?mJy)VJ2DUkg7&vb~Vhn?Qo%HQT zX-GjiS-DAL{-Cux7yA9A1NV`pdNxN-<>0t&Y?e+#H?G6H_hZ&f(do3_& zcQP<(w-lJPTl-AFdS!Q$vbzUZrAW1pfh`8+r+o^H^U!|UAz(KP>}z041$G1&wZcz3 z4(wKeodCujqMvpe7^_b|%@@DyCqQ3?rsK0q_@Yd zuUYG=aVi7<|4{cHfK?RhALyQ(kc1OjARtu^2uRTw2qhFH?IZ-!OrZ&ekOIMwgcOPj zhKnc!Q0xr_1qH0AsHmtQCb)qafQVcRyx(tTXHMCZ2>0Uuy*J68Z}uxw zzxk%_u5^Dj@0OX`Vef96tEDB5@^#L;Ip^b~UzYG8`zDV`zf6!6Z;pAcss%hvZ;wJW zK67q0+jq0cSW)J6&z;E}Wn&y~1=Kxvjuaf*1LhhR2h=rp<}4gD2Dlx*JbLcT*&j## zhOs+fl93!x$K092&;N4nTnMeeOaOD|Sg*PBM1fDm+&KxYaBLX&lJcDY+jX|{WW}fE z%WkDoN{7T4e>q?7-Pd;}8|91eol*Dpol)cCJx#nO;RAi{qkZlNoX^R!aU9uPCn{Iu zShQjKqHwJ;@lT>8Xj`5F)V^{Plp31HJ&b z3GgMr?SPnH)o_&vy1>lW~AIT ztigm}gTbTpWfh*s$VivYdl)PE%PYzX zs`INn1vt+26ljeb4rx^c6_v$h+`@5%u?k3)P6po|H*LUO1;}%4c<%`x%*w?(QzzmL zph}Ev(n&EVZd&^h%P+xO3bYitq?1zArFMR#Dyt`Y3zAVfDM;1uCy3&xD$B?FcU3x- z4yn?<1cLQ90Y3(cJ07eyR=lWowI{;r6_p!q?uoFB-Bs8USe7rbUKJG@#`2TQvO3y< z)d?Jn-BRdnL1YPd6J-f?0F9aSrs)DCnR)gm>tgbIzD%`0&(;pRDQs_|*~(#`g$<=; zkgc6Q+1lxI7%T8AajQ(9JYg$w?`zyi&G(zeb+akio~F;i-3v23j*w&=^EGav#&O+6 z#<5A`j%(aWjq3%gDETfkeGa2Q<2c@tad4y}`8ZOMxIm=z7hDOrlpAV#lqq1Z9}FCM z3H$rdeS3Z8G{MKJF-*!{j;qXxAL0C1we<4BQgy`f+zgtZ4R{U{(5IuF&^dKmQaMv? zNi+$xUhWjiVS*Z9u-E2nMs+^jofsOR@%XkpmW}CZ{0-nHO6+di9dRx-AFKuW-h| zM#IOwCL!WdT&hNyNa?&4fF}yh@gd}YXScOINQ9R3wSf`K@)Tq4(+J4mGntl zNgw9zCKdB`($~hT0;07#&sHZgT|GkHOTO)OrLv> z-UTrz$C999MbP=qzE&W_G@n+bWE|k1=A;yzpC?N)y;@Z^PH5pv2bKSGzpNTvh>RG& zvMI3C`6x;!f#D&pvuQjnwS+i9<}0EKMnyt}RJK~R1)%&nVXM#n`7S=-!q}MnRygzK zPJSCuR6}TGcqNm1PA!l0NPwyzPy4lT++VNC+$0Z4&zai8fvUH zeGX%<#_iX*AZUn`b(lVfF;L@pen*CPP~*PQIGRo09$lqg6}+!Tay4*xJsMf%M4-a? z(MWtsp+H%AS5Xn(ul2WTBd5MLWW+pFsT7w5FP+eq?sttlqj8)mNm)mJQ`O?DaVe1Y-E~wllq+@em(H)o z{og-bN0TOX3GWP@RfuJj(gJ*>Md_5vr_w3vnD2~4WJmtgWyb1$AdmKnfl9scN`taj z-8~{uWr>c;oNF1z1XFwROs(MvMQROwQfugwPv}Y9YTQfQKGPS<-4zqZK2-AYY@+1j zEJNZr%aAyK8lv<&9HG(qY6wpV`Hnr646SXYlTvj4HAI=D6j#FEYLB>>?L;bU23`SM zuRiebwd9;sQCR3+CS$cqCruYigr>_0Xfr0_XuA$p6_!#nPCNddp0k;$Z%hRGN0BvY zxgTG_=!K4@wq<~%j5&*i384uoH7C4EvW>2ru@d?oH- z+)Lap(-+D;K@)dU<2W;xe4U|9QkGUt;!-v4N{u_EaXgqN`RdbN)$V<@mtkL7Pmfyd zMAC$-UwhHH;%$L?#oe;)qU;aTD4o-&mZWm0J!754AZ zx^PqL_`S1MIvsN2Vc9wGr&X&>ty*Jh6~s$8?3~hy z{}D9h`gu;4Ifvd`H}>%sg$zVALk>F&3#|xm<46Zgco$?b0V}mp-{tEOD!F zFL7KSmbec!E(Y}{aS5i+J-53NT*^Vej2K+1z4@-hF7u(^&SaY07sAKcZH&g?*(gDm zdeIU1Sw8eZTp=+>QCxegLF#;0a+#)JTq|+SbmB)if0|N`A!uRUTT}AsCK_WN)xI6c zRu({ImllAJ11Ux3Q)BulYqGd7It4&OmJ$K#sel;_vz4~Cy3vKY{na~rlg7FoC%!?>9o zF??6O+r26XK$brp&EjI=!%Bw@&oRJ18;}KxQx;+;a~@zf+~e7Rnpi-Lmc+g>EJ;l& z?(YH|3wS$Vk;(TDK%B^^p&l*+ydCf%K58Pi-b%0(|`+>X6^f zi07;Pqxy`?EG#L^!}l`qPTf8cZ9MmjS1KE>`((l3 zULUQz;)Z{}Q2Be&;d@`+_S4s^8mjw8Z*Ms{@1wNrAJ&I&u6^eBYm1w&ZFR+ip|LAY z1~mL&#j)2MSI_I-tAED_>}@+NUGvD+;um)wIdW{>oT@(}CVVyNkj5pEZJS^6bj%$?I#sMX`eyg>d#Z*9JLLrmkaz|za|o}N6sRj=26ZRd)4E-dh0w}+(v^4klCa__!Bby|<=OO{3P@t+urY3TspYh$5avFV)D!Ivf$!^&DRIo z&Y;t@8!<(Nc~udSk+&JP8WS_UtR!M;fdPdwBqpMOFa4g5jT)LSNZHtjc)N&#!im+B zx?~YcNxN<4FzIviMFL3jVR1JB3{7q9c!Y3L64rw>2RV zZb4MgGw!&!*Fo3Nl0sStyDbU7%yUl5QT^OfCxM}JSW?KbqTMDsQ}}Xb?|90c!f+d9 zXeE79NK0zBsrt-W*9Kj%$t=DmNvTGb6gC!8O2;DNdcj~TsbbU9*doPpu-iC>q;7or z#yglGDXH5`PZNt2H&5)grTAqkKfWj#oJ#6h)6-N+d1w@SD!UDxqHsUkJ3|i{E1f(T zEPFHW`eK)Ex3QEMaK(^*9wpCb4(P&UTpk+5_F=bm5LClhaq&QS&4d}fO{wMJb?0l3Db>m%MGbV@ zA8*|_W=dUPkzy;ZORBl4XsxA`haIEEu-nGj&E?zFllA{Z@ z@LU9}-L?_wQ8v1vg{O<)IfA%o9q4dI9KW7z!znJZtL!mo)#9KUV>+nM>s7lJRHS& z=RL^6bE)9r>mX?z=voOL`XW*K(m72_7Hh#|S}^$*%ybLpCJSb@1@oo_!}G!3>EZLQ z-k1w$vV~J=j97`=%6vfO^g9d zfWdbTu*L01ZbdsKMl|K2sDEODh>2#l6Fo5liOKN9;5iEM9JyNxk6IYU1TUUG!0-tG z9dhp|V0iZ5jp+*vceperijl2A-h@SBdU`X>-{2xfq!3?($HS{$7-r)aFATGB+6%*w zxl*LV>BC$!^1?6|d}iOx!(4EdB{8@$M(R>!&+IuGi~!X=CLu35q?=$$k;hx=GGN?N zEvhRpfKpQBrWAR+rI>cN)c%uOA9PFAm{R2NmSX$hhG#smZD7!|@-(PrLYg(Q=Hx(0rHr z{6y$Jovk8s#iS*rx{?x7()~r|H=bn6L1uq3xt|75Q4NcUj~$*kA}KvRM!p?+Xg|Ih zc4$BM`;q;|=l6A)exl6s_gYOqd|pQu{m{J+Q5Y)usWEB8N2DdEq$kG6cNPzgt{U2p zZ!I3$PacIC+D{(k@tX_pQ1#IaKk?V~(nvq7$g<~7mR}Cb{<~i;9gfeQf*c&n^vD?C$ImY5kzYQ`1A&aYDk^YZ-7VyMuL>ry zqHJoi`Igk=1P_5&@fAD8R+&)n4q^nmET1Nuk0arE_$jOpHDtG z^~v|)^Os-h)vag2HwS#TgRj|Wc;Gk+@)zC&;N!sah{?y1jz7Mwz&{C|@-gthaUsuN zIkVn2nLOm9^H(mM4*q!-d>4SPJNH67oIicx4)-r5x~vhxoSM` zH`M3a47hldqywa;c@^KMD@cHQd zb{L9(gXfuI$u|JNUp_cd+jk8nb>)(e(>QF%9;2hU6PmM|g}kX%-ev*ihiu zPW|Qse7$eLLx}SPn|P?uAKwv>Til4v23&M(Z~plBC~)ujI6}NounD{AkB=|+8eEIb z%f*tfu5zwIy)|BfqxZK+K6E91)`_4!b^x&E1D2UtQs`Tt+R& z%L7(OzPieV51@B_7!T;Ilzci~A3YUIWve8Q`t_%$HHfzt_?~!Fa_RK>gf|f6Hjm*E zVqA1chF`tMRjXccwC03>(?hdwucko z3422F)fHX{65b9x7d<8Ubou%8gMlEwZ1PA>>VdUiCEsiQ_&g@=l;^a4vo9aVO&*hX z@^Nvq!_)M6I0wqc>10&LaNUV(q+tsq!`ba2W4dnLN6wXB)y)-Og{_`g7*RHHiZRF- zBEk*AYGr3*^YvV{lrXh8zoM+Ntf@FXnLwz#ul zbTb-xV8VjKA`qKRe77khd9*7fdrXEaH#sfAHM+MZ2lylR z)nvOrax@NA$iM@A$QiNmBU}m5SXPtt27c*SM^g+zei@?r=oo^17-BOsW5?t~iv+ST zW%lBdvr}U;(lZlWnYn$V`pE2&EVJiH?%gL!W-n4p%T!D0(V0ncB5;z;!V#I0WKc(I zvRODDvv54fpvG!xvur%bqvMh?HQ6i~4>G9kxXp6$Ajf)2hsa{{AcGo<{v|jp zTIXAorOuZo%5-}WRlt3;q%5(N*fHrj*|||>b&>2@VkWsSoTyIHJ&Vkw_wI*HLn;*M zo@HjzL6-GNx@Vy&dVjaLXQ7$oXgH&j8N6qyne;xrBl(9Rd~jG_rl2OEQS+8;SE9`% zre~(cX6I5ZL`FQ>GOcVVDqpsyEv#$^O=R06w5C~BHiYKG7TCH~D}QMdxpapX*m|Uu z4Waq6Is04KsKOSuL<<{L*}^v6!bYXEu-#-~1D6bqdN3ZdLfNcG!C0k_%1z8kNy&=O zbh*+*MUrmVSPCXRH9aTGm5U(a;&8B=K@0}VK+y!U;$zd|(-T~|@v#|MDe3VeFejGu zLEiMl-kLJlhtfw=hWJpTH05$1N?%R6!iUmNQ-=Cb`fEyz4`qO+#QIR8H6_l6G7wvj zGNC)JK#)i#E}ll#!X7mTgv$(~L98n+4SLloV0^v_TAHm^Vj8 zEGiMF@gyE86rt zlNkX0)iZ6UkT zvR#?Fs>WF8y)|vDh1N&YuCmagG;N%P)>qTUTWI|>?P?3Hzoz9{Xah8Df`t~XX?Ygf zKuw!yp+)Md%eT-nT$#z~3A*YEy%}ONGE$P`W3!Xf-5Ocs&61Hm3I)%R73*!1Hxatw zx-us=B}+Gj$=(c!*d&$WZj(06m()i~Rrr$JrBUfilH*4fa+Np9HQE)QlkL(9Q0+|~=1R%XwCUco zR99M#wth3bX<4omSG?Pv%=DpVr)Ov*HOre8n-rUzrlY*po0x;nRpxBKPZ7v;mv>% zysngoeMm4#y3il-riqS7s+UUjN*|6)=&jE0DsQ4|v?p<$Hxbo^T2MoQXZ;W(@v<&y z=AQGWW)H(yFg7hA%bo9TCg=0soC&V@N<-`d#71WE~Y{(Y}2B;8>WG^z4^^%20j4ULR3TT6ci2=oB#>TsJKrdT(L_m^B z73M1zrtH`_J?41TLXE==G7Gakw@uq<;fdAy^O}Vgr)jTSXz`l%hK1%f6q_tGcUm@E zXo*^F-n7t0qY)?rvBg4_y{9rUTdj0gW;}*AdR+9Dg(Jn4m8F}@+ZJ*XHmx}_Qgyn` z!V#N_21o7HdbZudlMt8UW>exF=&{+_e7$cWx<TbV-ySn}7Pyl5&!DNA-<2 zEz>K?Z+(c~QU1$^>KWy~eQ1nQO=oRlF+;CZq++>3S4Ds~EjA|sGXU3UcZ0F}VaUjI zjnp9o`e8tO$*g z9eikPbD1tKHe&ZhYW#(MSQ0V$QI)T>v!gd(R(fK#SQ}Eabf=Z>y|C2Dn?dwpN;Nxs z)3BH&$oSevSUg&#%@_ewlA9upl)?r`Y^KDvFnME4USaJNvc_Z;$mS-eVUwZKxM^H~ zz-4;j0wo^}o#qRXe8jaf!waav``wvNxkM;<`KZ4k3}zxn=y-xCSbT!eCUDuAIWD1z z1;`{G3FS(#J}xVUak)8ZBht8bM*~H!Kq2VEG%7h0%f)OPZ?#qN#iyeq#7ZUhkzz+D zXNmFpXw4(z_s26vv>%2OAfoc+5tTYxGui8A8Y8AQ3`r*1H>7L?mE_74TGYc#djr40 znVeFe*xndukYCo+*wMnGeE|+jCgXClv(wXZ<1~jQizdft(PLz{K!+e=Nl8z_vU|2G zDLr!x_8noDvELaSwivrCvUXi*Sh-CVE7(NJ4Cka} z5Dy9asVmMSq~?{EV|#Q2-nawtkg#JwisP2arRCLCCKb;%NeVT@i_q8%H%kPJ;{_pM z7a>j6xb5E;@et9;MD*?t1QX&k5z)ABi~GYWPVTwl)0isOHYSa+`j8lIwHb`g&=7

          amN=4C9OM%Ci`W+||G2<3jF0BHCj%nq-v=n0aQp<=G<3{vY z{rag@YAP*-7{1hUB1M}X(fW*}cUGx&v=n0aQY&~;-fcs!Tcs}2Qi$P8tt3)Rxpa}w zepscx(o%@wORXYO%p^TyVGme7GPO~K9^#1MORXkSjDzyH{*NP8DLe^)4`TRIYk(pV zLq{ji`mEz}tCWtGLJVJOEl{j`f8D3JM_Hvt(^81xORXbP-tZHjEBA^%TctM8Qi$P8 ztp^GffkCM+9+w|mr5@2zh~Z0ZAW}>nR`qAc-7>YIlD3jr@=_m#Nz!Cvv8vK`{aIN|uK!w;cg5U}5xW0hV0w2+#H6wgOyNga}H)3!AOZL{D8+%fY}aIi8va5GJ47gFc8YI!8i#pI|(L; zqo;}hvrB-fD!}X}m@tl>Y68q2fu8CD40Jolb6bv{8UoCp0zGhH7tpx%493?+Pb~pv zzd%oI0pV33DT-3z#JwRfB4C?X?+3ah(M300CSXJxOLb-fH@|> zcnL7a2}TM(nfx>qU`_}y-U7@?g5l=JM}Rpc!1xLixaQjbl0p@~0PYVI&BEfLW?kB)p5@1>iFqZ`we=f!h zY;rG?MBEvF>NI62wj!Q_JFNSA|_JJFmi7UtuP%@BaT^O8%cP!F$I4 z6K(V6u*IN}nN@nD)`E8flj~VUd>Z#VGp0Mv~k5$pxT(ujbF2&~@j zne^4mQfX^xYkOUTyb5Zk%TRAs+hJH=leWVo?>*b0^WS5(1EAmfw8P=QYHSBUzdLM) zV|^Rg4wL(OuN^k^#;zTP30}dqLuTHpwZpP`QPvKE|LUt9fW3EF?ZE84o=U;~#~Y_S zfW22p?Igs!6KaPArM35(C%!Ff|HVxK$M#iB0l@a%N&$fTvZR11c>7U+VBcpHaM(8# z?Q+OFhgRz%hp`72Ux+MtEk{;zW@b(b^^p!jfR{q~gmkzFgu~BD%R!nK2xY@toq2G(i4C1pKXVxuz8h<;MijGt=$1{(<^!KBow{2jR0%u|+FatlLHnFQ?M$4D}u6;3$!2%Z|Wy-DjOOoBfSuQ=EFc!XQ$_I zb7`dSL8IzVms60D4sX!o>*|1F>o6{xxi3wKv*sW&EgfFgPR;3$1>q)Q6(=_$$*iSg zk|%WK0GU-8RjZUf!eHw=63t^yA;m%g`ck9Jw7i7uR7{(+0)2&*8ordC0k;tiOoMqU zB?m4`Dikr-TgBzVD{^+|rk;HZpcvU437l1+@uI=X@_IjX{l2-88A`BobQgpQ=F}X` zr}J!uXyEoaYhmqZfxGG8imbGJ&TybnkPSu;4T?-FNY2QF0mcpzE0okM;PYjizG-Ds zny6;TD}>6+P0K4Nq{b?5?SM0ats@LGf-Q-$_cnA}dvC)=<8Fs!!4Eo%Eb4r!t@G(V ztj~)A(*$Mbh-9brCrg}E>OM=WUqDjEIfdacJ(<4w&my>vmYRJSIEu24y~w(Zvhcrh z!C^2LuyMdLicyIEoCFKwoKQO;bSNUjxU{$Gr!RBBSl( zUj&DA>rHTMs&ESk?88t4Uo&EDotc;j7F=JMtI9) zJ@H2d{z%0i5kc&)nfP0#los@tM@kiPy;f<6mPv(mZG~y1dS#4CsaGpmn6Ub}aGgdM zBUi>ovv6UHSm9Apold1P#AxI!oYzQJq)e*Rsbl3)>PQM{Z8t7P6&b6Fm1|>JZFEyw zF;UWJxzZ4$i=y>_(c`r)7pYSybg}wKt2SQ4T9Hsz&={+a)l%sS`Tz^nNewb(q$*lX zkZiAD`Es>1I!dk8#74)k#kA=tR;)^@h*c?LU`&w)gc{*?9V;$Y8Wky5t7DWg+%d<$ zT98EtDdpN2LzF=d-ANGz_YJa~FoRyMQEFl2!ssT}pJnN#I=x({H^f9r{Re=YDk3Oo zKtup_Ga(0Mh>2EcpnYsmj0B4ef^dOKsfGH)Ou$u!EJq`a)yNGxg<3APdVnmqwN9^w zCrT@|dVNfXS42q_Ds7}JMjvhEMg-XLz#@XptVX#~s)<&p^sz9|psNTRK32O@8l}@} zV-yCcWU!PG!F11y2&QgIj0mQTHMuI0Rj*J>4Ut;8E>aWyD=|7%ygiW>(?}Ki7)_L3 z24!L|Qe?OR@>r=hN~@CLAjCo68-JwXk39U5&HhPDLM!|;5P#S)7WCu>>)sw2DU@mN znUR{Dn*mX{bn13k+Omi0_0dt$v9WR~eQP6=9sgiuRE%0H)5J>Q9><8*VJsssGFB0* zR_h|Ml~wsH-5}M-Vx#qPrBX^?_!tpP&6-kC*_J^;p&_2uCmNjMfbqltJ3N@KJ$<<6lMa~PG!De<>ch8B`U2(> z2IJvzg@5++l>>S+2*!tCKpvi7>B|I$6fhewC=buC^kFdF34-z+F)$C$uj+3&=vxXH z&npz}SNg<&8wi*|S1DY1_>aB%bA*ch7cl?9o;yAelDAu49neqTfYTH=5%uf#xCrS6 z1E$O^3iqq_#e6RS%nBL@Vs`Vl5Ey>|Cgu*M59{4tdsGAZZor(Ualg{n4H!276Lyc% z_pAEL1ojNTl+rjy_}gCnMMHn~y$_!(eMss1Re5_ux{i<_0j4_s0uPQW zd+jkB=xV^+qjA5gKYVk+`89kF^DS!ob^pWij(;Z-&4PdU{HnaUz*r0zxAzq8SM7`X zdIBb&#{EiPH((3_%$=cRyY`-#H+Du1YNHeepmxL@hJ z5Bh!r=H6#YAC}8rdmvr=1x^6MKYV^wUQb|j2h7N?6z*63r5mtM0jBXc3iqr0nW24E zfSLb;!g;`d?B&l3=#ixqhWTl4e4u?!2i%dL6pF1s&S^^IV1KiHhKu|UanFq)zcT!* zLu$i{mR9ta+TyAKyXF4@=M6aJ{{e?~BIEyn^8ws|{{yZC;1=1#QD;TWz$Opw)Sj`$ z;e5{7uSFof(ddhl2=^%~5_x)hwv1G&WN{j^MlEmS)wgd(svj)gynaQ-hA4r5)8U^< zB*ymtKVDo23uocwg_Z#sc(HiTHkbPJ0_pFw2Rs;e@apsSPKT<;ZL} zVJt^(!)Xm)w4+L@u;B#wv#dy4RshRV+Oh&g4QPcbKFeTK>&zyFQK{64JZVT29|Byx zMnmeqHjRkpBMh=QlM+TSm1Q-bsn)^%o*6!2M{#5L+-L|3u#&NS9$t7JXJ8AZ<#Uy~ zNVdP|_$(BR)FM@3t6WZ*M3N|lw@fzKmKnNDcr^B|{QbaEy>2X3y# z+EZwhG9$bxMrFy&$HW>ek?MGLq>^o@H~~Nl<6UjgB(cSg7eds!I1{`{PNk6`;2Si+ zW=2_}fUU$U?AfMD67U09UPl2hkmYp}@LI9F&H`Q#%j+WG1+%=a0$vEqvj}*hEU%k@ z7sm3E1-#ZQue*Tf&o*6(fM-w|)%r-b>C*TBnZcl;Z}Mk*WI7*W&?i8}Gkv26p9y_K z*&$A*F|k9TCm*1K51lavBg2*z#IoSawOp&J3J7Ldy=_?`EDOG~z?TYTSy{HMFqV~V z%d(oZ92*vFpD~%wwPjHztv$>w5|JUNe_9^iwX01Ykdf6li?yf#vn%^R#fVfi-Xa`8<#~o6&q~B(!*`~jJ+Jf=fM#VPVtBGnJNgXuu6yV zd0MPC#@r0&^QiMXU^SU(XM{aIvAB$eB0d7f1)M6;%HVqsl)W1x;8Wv9W(tCjmM~i8 z@lkN0I@~MHnZM@q`KBb3QQ3iQ#07jVx+qEwTX73*xWwc$wYrGUgsB%UGiPk|Vm{NT zG{+frfvibb!e^V5aHxu0hRzI~rF?*%)6&1&u)tcemA;J6BXbnhy_j4tw?P=8-?HUh z!DlKHxy;RcCNvkc0^=oYvBUI-+drw6+{)*gqxEqnnJ&^~Ew?X?+{Q;nDis+2v*MUJ zc{?Ach%>^WBSjJ%lQP3w;8dzR>|;!Easp#i?c~FtT<9}EgMbg!kXE%zfFVu?1!5HK z7JyKZ+z8*0VHNEWV2C0L#8l>90mv+qv+l^B0(Fo>9;eN@1uCRWD8924@DMg@31>@YkoKxp7o z5bSU{Az(+r$r5y$m^M8rK*+Q(;IQ|y{p^$g6DikNVT?IDEr7*?CygJHkb@)Hi0)}; z1Sn9(1u~U$RsdA!HSjqs#sZxa@T1`aK5X3<3)oZ-V(i3u0bgcj&DRA1Q<_Lo5s16OQ=CVBu-|@a;4d6D2>8w)UYG`feq6Xt>!Gq9@=nW_GazPBO4x^ zYG)^^fA~BjFUiL?On#D2Y`EMcpW5&+Nyem##XQGZ3y}=ADIEAbSzIK1=1ZAq9WW9* z0E1B(&uVbA1Ay^jU;$<90N^l;wL3W30T73c2^Bc=0eGw${3PPEGG2!ZACi!ez!u+? z&(g}&){az`&x0YXh=Vi!97|r#1_57`0bkO(L@Lkc%M=z9tgaQ&tTn430FY1vW9-}n zY@8F>p6)JS!}|vbGGipGzoGy^YM+^DJOpf`Qe{+vJ!OV{B>_UNhh2S{G1kNmr^Xn2?BD%xJ3eD-<}_jDe`i$G{nW>ygKHs%S&Pp!X_QLq600_!39D;sSfY-AXN`Q-wc+8I zGb$5s`NBAp_3S`Yu=rsbpD~p6`8bnaWhP-GW&!UhH987YS9Kv9hpwK9#B(pX~c7~*gmN{E$cq)1F@MdQZO90<+Gqd8JI zG;}P^g~B1N8m-S^xM(<`Qqe=W^wHVlK_z_2E8c8T2eN-l$lpPtiZtH^|CXD~Mz}Pb zl5j-|_E#BpRS%k47O6_35ljY_3ssj#QoPKlmVrOV5Gx=tP8X}ga3GV3ibzxkuzyz} ze}|C*p(bzq8$1g=jCU*$$v6~xlGRw^HaV=cKt99VYn)Gqt4-|F>*@RZ>%0+V0=0MTX zqSCTlXq*Z4$rRDbNCgI1(1s$Y92aB)g#d#nL!8n?d6+1RF81iXk5gCDR4sDspj920n_Z z4-YPiXp1wj9ROVoR8@%!qWDbnGmy$$2&Bf*!X#CN3xTm>*24;it~uggVp3JPAP52I zvF_o5Un(QjxLg=KpTr{*dI8a9NbxNi{WD$wE ztHVVSO9p{0G9q+lHLP#h?pBuzRMUpl+J$g}M1A$RFv={TxnT`QeJVoWH~}ctXzCeb=FJCF+Tsl0mP1@BlC5S$N7QpwHNUAh!^ECP; z&`3E>jK;>l1VSBZ4QAr$VA4%~351X(c&UutX!=VWn%^iRtnJv^ZpOvZl^6|fFFTzy z=K)$7@N<@t(7Tz|Xu;*fTa#qwqMMCv4L`c_{J3C@u&5zOtusSNm^2KFXOy?(;`z!= z7BKv<1B3T-Q7z-o1ru|LgAMjU;fv7}B7lbwj6}w|LPb;fKrWtickl|p2UqK~YLk}u zHjFW7#f2K;`KLNmrC zgoi>m$7o>&rd20{4&|ZY%c&~(a;jjOV#aeA7abBLSHmy^X9kB3aey$FJPgctX13$B z=1PMMaltH9NFOEJ*yRVX^5J&*fh@nRU4AQ;-_9;Sh~>Ap%MWJx5q9|@EMIDuAIkD& zcKKl}Uv8J*n&m6(@?|VP(k@@l@|AY^3YM?3%cu6|v3;WK@~wVmv|YZ6wJd78d^ih% z3oc9`#y%i`1;pA1P#Y|$L1Q1#iq)XC4+tW$$APdgD??&ITIkW>ip%whV2L!~b8BUZ z#F2jtiNL8FHE#5qVlApT2wP&P2CF>Y!I{FyfP7t zor#4=2t=;|TWSkoQgEcSfOUXu=~OVmnc?^`m3kS%GaKVfuzn&g5B=GB*1H8W0LB=m zUNokdDJLQV8>29tYE&>)Mxphk{6mWw92eYwLe~eu&IBB%Gs#r&aeKW*CdUtCzBxU_FdbZF)0tl3xQyB#O(+Kr;c>-JAqsCioUPPNPOOX%)n{@iA}?#R#Si)=t|(<7gW)GAD}*G}P*xq>b^(D`^gIv+OGA4o_+qn61M5M|(@9cc zIy^3AOBRa=86tPE9c?B{R75*aWbhe{YB_Gy;(8t#5{hBQWh+Kxkmg9y6u8)eHiuOn z>>QxChs-i`0^ln`-eJba7y1=SvV=#z6PHhlj#Oug3hj&C9(osK92Wj@ly0U>E_A}M z(TkbKB{2%SQshXz0zL~3bS9r=`E;tOu`i%dIUA-5zSd5pv8P@F036NKYOtQLhgg^j z!(bIVCHz7}SYMIM>1mGYfKtO)MyBa};J4;e@NF z&M_gKS#eWRXaO)5LM^0`&n&hHpRNyP;YY0%5XCIF2?`cej3-IV5dxT%wiQ4I1A0hg zOd*C@W>Z;#D#dsZGMF_rVW?ruqQ{O5W)V#oDvd14f-Q??QZFYlQS{*u$gHEO%=F2u1#KC_A@d?tbdp|xmYFcHBlq6xwX_89sr=^ac) zm<2QesA2zH4PUlr{atkUPz|$?CMX!=iAff=uP_*9^~}MrJqDNksE1iM6AZMf(g;S< z1V)YugCT@jJQE0$TQu*~b)oPIA-pgx%gxQCUkWGovOY2IYIrN3c~P3!kh7pqEP`!% zNCK9?dL3@Jsyk9Gj7$fbsWPe|2my!j(DEPy4k!^RFpe-mfgQvV#V{RdCS9MD&BDHc zl4WQnYZ%b>A;XDgz!{Thy^&1!NOq>lqz^+)m|$V4gwsk8OGHbD5En)z1{w&22H;3T zfGZ8arnjhIZO9q`!hhi=? z6Goj0+($FmVd?-iGF@pV^c^ZXNel#X%33*eL{te5DQ+XWag5=T<53liF(A7v z%Vx@Bfe;yl#S-b>!6sOaMG~hJ<6TUjB(?>k8>q27i(@t7Msx?r=(+YMCE3AI*c1>p3S9M(f} zqdtKwyU;`+q6&*3K^zjLLwZ$~&U6X7>T&A__H-aNPnK?ottP-~lucj9UfngoMx zY@=3Z!LS9YP+FiVz`FwfgxWYFgBq3AU~%9;V@0zas3yx{vSwClz#Lh7EK|5zEK&uF zL2G}n&C*H03RVel6ad8`o@pX8N;xu@n`6;&!kfg%jDkd1T@fM#1JMh`i2=#52S>=T zj~WMCDQIYs467_chBqRVMirip!xX!8MH0y+4e)NgsQ~WW083uMqaVJ@!~&={ZZhH8 z73hM_9?zlXA#?zHkFcSjA;m)yL<|%btw{l097aA_*0E%ohBbjSh#UY^#z1j;MlwVT zpj(@%jc05hBtn=#VNn@yKO7gVq~?(hu>b%kVOkneR3yTh9~2uB_&I~MKB3aNKp*c8 zfFUfRM@Lc)$4e~a43!z;#t<5&n(PXJsBoyotBqzj2~Xx3B!gK;vH>hV!@|}?78rD7 zfeXiQ&;dXWm~t{~AttX@kk&6IDZt*b1wswfwg36>13#!f@ZOHaA4hA?wg5e}}6nR+-Hcw#!HbNK*m!)JFX0%K}$ELwQNTngq!ODXgCoG&LktMOR(33&~M*JA$Ia+yY zExv!DhMOkgR*4w0>Fi9(jkcZIVMB3@ycxi!2eX_+rpKe82422bM`}%K+TbyP8O#B) zVX44pD-&2zSSj#$U|cn7Em`ZLD6AKF>`0>w&bi@`KrSp8cw8`gOt>5!JcPiqfd_%@ zcj_D~GGXb!W8(OLyrKJ#Y*<3@*q~gmB7K``ceF+-JVs6I4AR6Tx(S_=iW7YVB_a`w zdJDKaa8nu%3#0*zqQTu|c%}ns4ul4SfmDqjbRJ3>S^Seo3$%kWF@R-*0Hkljre4oL zX^A~H6%0qVqYWGO^kA1GjJSfxr{c6$?Gzu%fW9IEoa`!q0--O60B0M3%xIJ)#f6dl z<9m=)@nDYwykasOEJ3XTsp27z z^0{?J^MOsZC-S+K#_&U|;@nE3*(LaBpSwY9`uMj~YtVN(wdz`%AM zfxCFTg{u;jTDU$6-tdowYcv7w;!y%ba#J5!-q2i#1Gsp+295z-e=`J?Ts-qDIkr{buDR6-s z+NJ5AKVG0>`(&vbcEMrAv-WdAOMXObP^Ru_dV}3|VNB z)B0H75=SgXydLTsi##2wpRN2@$SG8;E?%jDJ!Deqx^$^2Rk(peO{U<$x_BI6a>&UY z_AbmY>0AgZrZq54iY@qv$uVS;3dCb2J^>`Oz1<2PL`%?2JTwS9rc^~OWU|3&daU^M zq&Sp>HUDG`B$8go>``M=tl}lWfiqQ(V~7lg%7AV}RCCh9s;%URRSPC9iuCNMFl9t1 zK#0WxmchlNK9w754PvK_gQ0|dBbrBi&~=EI#Ny~#ksWeXC!=j3D(0$i;|^;{gCXk@VS z;CjVOu8F2DX(oLYcZXn%GFwB$Qefk6BZbC9=8703OrtJ{s^hZB=NiaZ#|qg2nSuUg zZCko4qXHaMa98rcG%!opFdym4l;B5{r9uF~R++s!MWxyUBM2B3+7K{b$pDB(SLZoS+x-ZtMXHm*^Nr zhdzk59&ad$V{vHfF+>75Iz~d~n{X&AJM7qzh4YOkoy{=P$d~Clq52VJ{OSV=Po-F3 z#~j*Jt$+qqXXh8d)%)=FvVQ=XwsNtWz#+ny6kN#pBQ~daoSszpsQPrTNXyR8$s-*I zbAa}Vd;)>Y4s{_1SWVP$A)N#xG8inzFcJi0NJepMa3V1%s9u7D$X<1mqKv2O7jlO;_(0goh4@jNE+z13h;vpCfOzKviPlqrE!R}F^oI& zqs@>o8k)V35#9`qlPWVf$qc#?5Zs|H8<3GtDh2!4Nnmz|21!lJEJ!Auz{u@&Fm>RF z!Kni$Mr$230O}8GcTvO1YsMj=e4hkxXk9$;m>s4~Ul1?P8KB6?q(>L3n95c!gu4_< z$}%!tK7ou1VyV!AfT=>2xO;)-h(s%42}AEA!kJq$F^On#OmG0ef@hDwBtq7E(UXj& zXMen~nlu?!5sx2T+9j|)=A4({sIjTk~^#N2O1ZTcA<&3JyJhDUvA0qn&JETOzUqj* zCN`}wD<_o{4$=_8zK{v7!GhqKiw6er8Rc+uu^iT$lnY1A)M)kqLEH-H1=tw4*#xUP&r1cb49(y!?8w|v3KvU*-$DwFHHYyctT{FyM4FdzsF^&Fl^51Kv!;V6 zEcVkV(($McM645T3xGQCy-EK^j0A2q2JP^=6Wv&~X&XpBen6&oEH-BJ7x~0-j{AF{ z7X>X7|kbbiDsL1(r^^Pd;popvf#j^GDg}2w@>(+ClFVH zT@kdf?BqfgO_%^KOnCK5ir*Ew1}00bJIDya@H)u}=~Yz2pyQ6gZ=}oe@{$WFGIqk( zkPD{o(*rAj=qZE*X?xSNKW%X^Yh_3iFs>L{^cdR2uZ6!F}LXu406sfW~dA!HJZPZbGwzAYIAX<1|hU`!U; zI!dFLL*UH-?*m7}`@hf@CNiv{;zZPZh_<{kv?B5Tpm$+?;QlFgXtH@qI&=NnR8o{P zPKS7K%-~5}fa1|$h=5T?igA|9g#^ed06};ljVx>M5Fovib~%4)@!W+yBC zeN-b7JteqFhpW7r*XiYiE_!!edXvC0%Zt);KQAd7x3J}id7mZc7s4g$4p@#F%kz4z z&0QbXbcvJWi2L5(#u=w}nSSX*r(yLq&;A%Xa;->|N^lnzHhAvr|6$_b{_j^bKT#pK zl49cLEgnCA|DmbbqJm>UYxu-8!BxB`9_2D9YhcZ=W&55ET-p18r#f&^rw&b~yT5N< zbZ}iek?1@2b`(Fh(4<*6;z4810 zYUkh;u@n8>|H}80eHI-&u_|xvWZxGp`^~Eo+fj&Qx;HE}9HC=Vx`QW6K8{gVz#Qz)6V9-BIcuvs zc;(J7`Y`(5xqtKPY`OXtZd9H~aEEIoUi1}>dAzF5yF)F4TfKahr8`l%ZH?JOCQd3H z8Sr76NOXGgQi?a?dUT_eVBd^lwHrZX=*o5Pomo0P%)U241A zJ$J9`_U#MKuD<;B!<_RDRj!>sdZW&Xy6;k+O&aYBmwppm{89OXl4GftXI>n2cw?y3 zkXxE@Nq5J#-Miau^qGls8pMf2zZ2ZIg2HL8btYx&Zfw7>-R+WY8jtyE=7{+K?+PtOJXUU}!nA8kfzMWR5M*E}Ud zr?+V(eKWIF((1(*j<3l-74mIC(V{q?|As{0SbTZew-mVSnc)6=-|@G7#@FHJoG&jf zn5K0b((=xn$CuW13A=s1;;5`dnMkya;2LzzYqP&!)Q&2u1^qhqj^F!y?8@tDmujCF zH*NIAv=Ha1kUxTZ`?7yK?a_q`W=+s6nqU2KTza1as~lD>+VI$LtnR9DC*j88V7Oh{ zQxaPt{BYQd^^;HEksjRQ`muDy*~@1(&A8S^^Qr8V+uz*Uh(tvMx90vQQJn#?ZElus z*CgNUop?My{aF5}=4-aT=yE@?|8_8mmk927u#fwrCB>$sspjX~*P2cDcfStV<1TMn z+r9duQ^V5x!5KOiOt;ZA-89#*f`yecTmB`yP| zeH|cObm0s1)5>tGwWs9n!(ojo?RnaK^#o~jP`*iWsrRi0r`EN(vtjkEGhXS+CL&QX z!R=q^d`a&ob!Zo)*`qjnbHe+qXDfz3oKd;W3YvDL*Dj>gX0d*ShGXty5(r*vL<|JaARHP=+Asu&efYtghugO2u#tlen9 z=sz99AI7c}i8|m#(2}VI56$Dd&00QAm(ll!_cnEys)ID`!w}!}d#2(S%H438{Az;h zoBHNcm!B?gD_i_cRi4gYdUo7|!nL9y=DrQ(r-yW13jOK>!KGC`US%z@_PMi@B$yboS!$CeIP`&g~ui_WG^U?T#&3cB+bB z=b!b~x474>=w>pEH-Z~bFY(FFmoBw_l#|Z+{MQLl$aU35_0g4@n?7+5V}>7qi|Ka} z+z8DeRnsAx$Ls#;k@+%b%$hm-zpr*!fByG6a|SdYm)LDFT(C}XS*zYpk4oq=G4j5P z$IUuB*Hr6S=FN+H>f)7SZicvg(81Tg17Pm*l(-)pYieF5JUv6Y%GB+B^wdthw>}Z4 z_ysO4S+jJ&jUUDEVFrQ=dGWemY1-4fLvS$qbrdMFYd zCOChy+qN$23Qw*)JGaa%|9jDHV|J)_&2@-sJbBHs;kEA6g@d$U%RMD7`xiFp{QT$N zXKKV%TDGmm_S{CB8zgL>QBm&y_Edv!%fewfMsU72+qYZ1s2Feo5Zy4=<_cW%;S^?{*M5gzA@z zM8^rP?S`Vml~3%R$a<1`{AWpxp94)_08|cNp6B2CphDx^L>uZzCNg8Y|+@vv>Vr+)E)S` z#p2l1!{RE_f5hj2AF+?%Cgr^x+N8_d1*b=p1f0q{eqmZ0AGdR3oMQiq5r1+Fn|u+D zH@IWEo{I~A{JG7wPk~#~*1ub1j(IrPZPCSMZx-%rke{>P+jk=b7YJ_l)dn@|=yE?a zc;-LlUH@-u&rYuIaBh+Ngm(GGOMf2R2IFWs!Iipsmh&uH{8g(lTzFUa?zdWTr}G7)UR-Xhfsd~c+^iPmhQAzABl~&q_h(L;;^G%=)Y}%ElYBI~>^eHM@ti`D zs42|po{~G;Kd;!ndRqm3Nm6Us#~Fp)GW+eknfOxU|LWxJrFEBp&FxEY)rLF|Y5Qg6lecc%3)ZxAa{;=Un_xmqO=JSHIsn^;gTMe-cC#Q|*Zl{;#Cq zM^@{A-g!$@Zo3>d?=QbTR#fxHDOW?lVelh-U?t%x*}doRzv2a}7m4ebzs#!P`L#Q6K|ip-0ju#{xJVSVAfOeG-O4e??XSA9yxz|M#FP&I&S~3V`*ho#CK&gPhR0XVBhqFGn1BHa5)S<-8+K&^!e|2-S<1UQ(SLJR+aSp zv+5RU_kDlN`|U)@&1K~ue}Z|{yE^7?>)nWh=7gwWN5*}f=p{SYC-JxVc<)Xp|6Hx! z)%TK5_!x*g5?s-_%CB=9&n|cU%i!r>Ce9w&N%dj(zOY`eTQ=>r;M@V}DERmf!9DHV z`JT5l_s;pfr)E^RdT#d7c5V%Rd^_c>IuxolJRdz47DqKO-Fo?&y1qV7YpyU4%+{w4 z95;Emwt4BtH*Jbe1=N(+U04F^9)eR!XH_ELX<$a_ti3-XT6=_qCIq>&1+fTLM;zME419&_IX# z`;Xr1-lYEAqqj%QFUgtl?<|*oQ@v~TKEAE0(-T-%w5o~ut6wkd!oc-!!hU;du89Zr@&!2vMTi;&R$m{l`_!`BdyN`XY z95Z)4e8l4-!8O@>!1QkSlTAY>UOL>XXM{tUmU#iC6DyrCU0mWiCbUdrIQ;@U4W5$c zb%(ssdYu_PC7|Mpw%E^-dBTGuR3>ld_9kgO?$T+{*O^4$|SgZ62I%eH5=^_me5!` z=4nW$s*{cn`>kW=GQ%Gaoqgh7r)4719)i37WwAw3Q=Z~;=U_~hu3?iYuNSyDy;Z-? z{B7f+S5GU9g!v8D-ky?VpVb}a@A>9kCu{S=_g})pYMVCoIu&@u@VN4Z!Vb5@_2703 zf*U*{Yq9f6pe;&N@Ze9QJB_qNE!ery?k2+jnN;Y?R3m;4& zxEg1Sj@1&TkJ=Zqu^@Bg?=2w*JD4q6LzF zM50=rsPFy#>7(nkFKt<4*i*^UkKNBbF`pUvWKvMb+|Ai1hAmjy8a`4*aCdjl_!wV! z;LhL=Inhtst^CiaaopCQh|`~L1dcY+%$vU8(Dn?7ikT<#9|FXstv%YmCKCp;e7 zBH-odd0DSYI}SK=$tsNw6*z`pr+xlu5F0v-j5rq3V&g~?>e;S?&=!z%rV0T zx>oqPZQ;H?#*>Ew8<)a|r3fzV+{KL2px~OTUpdV^x2a=}WL(Ln8s&alFtX3IW^>za zo+lEWAULm`PMcS_cK@wWvolY=2e;K%T~hwu>2j7@^ZPVw`O~l?0^U~i#&mnF&pSLQ zdsA)q5K$MyZ)?P@7Z%RVY+C8=l%`&ewRZiz1wPhCa5Zb~ZXZ~->zqoZ(SZr2XC7!a zA5L7+VNiGXh&x->Wxt1V+$1>N*4|TIKmKYsoEiL&!|(T3=0$znT3T>lCCk{o$+vtU ztZ5^BFx^%)cAs?WUGw^-0lR0s@LpeS;`Zc?I{DY6%+f{fPhB&V;3pDX+vK2EOpO(+oBpZ)~TpgBO@-gkNNy;Ie zPIeSOsT|<7ct@Q9=R~5v32y%CHE~_kcdx!2R=e(&DTvLZG|CxE*;xZRWwTU#!K z^@lI!??|2dlV|mJDba^rajdZ*WMOFQvQsxSe*9>6`_#8bEna()tv)6=6r(R^vKNeP|b^7Yd<)J+m6Wr_8kFzV@aI8=x zYssrd3pPINGrqIptoM+O@OuB^A+aOC{yiqRK90>FOz(1T%=-CZkB#wDGd9(n7vW#C zvD)*;@}PfL$#bA4JtafRxxH5=B9x@y|gGHUPpGTIdJaF;VBOP1Gd0ppzDK3D8^d1&1Q-O|s! zQ-5h*?u*0CVK=nh4}2di@miGfc>hrt=glzPl@;7RUU;6B5+i#ve@?-|Dt*#Er)A!I z-Q{EW5zT~KmB1hBOmHbD8m?(n;&8Boc>eF7c13QyI;uGRwf6vr=iy!U^%{tq5t|5Z zh^yt|{#<#dgfcb%?R{rxoh=W%r|Qba9Gc(j$K2ObqT@xPhXi*xDd}ZO)6MUPG&>vK zGrzcT{{Fwxr)5YN&CLEX^Y)g*E+Ua%bIjko8l%Ps1f6o=`6r7i}i6~0GAiFc=YRQE+ZcvV&1XnU3r^j!nwhbNnafBuK z#Npd@!>YzO{(W{unfG5CANo)6)J0wKX;$3y zas~GWp`+V%2mhJiz6}_1CF?(*4u&0$q3Hw04U-+ecxz+D?>^4T_Jdx?U5CTR_XzH} zQFf+B_oC7xm)7_B{NmuOP4~|Aov6Qhyz$+PP9qbOc7k65Ya~yJdQ0QE+nZf5J^uWy z?~_}#x zTlaZ!{eQRobAIjMG|P|;-Ku9?dN!oa%xxV?vLZUXs+#c(J{C%Fz4rF|f6ToLe9q|=6z3tw1bMMf7-`gCyRP@^^}1fy>2Xr-CfxK5OnvSoAXzqDg9JI?#8!Ye(s*X z2F#t=p-o($9}nFB%xLYWM_>{ zg6^HDhTq?G*Zs4XeYQ0H>49lKfBEsE!HfGH%6?}198yYcX)q9vpxabi1!T`NG(;^{ev_e%@-vRjoH~ zykS|udtd&sH^+2+)vC&Q@4>$-=;nm}Gq~RUV*=88fBNd4xDj)2KC-*tH$A8R9DHKV z)ei*E+p1}21l`KzJ)`ewFl_#q%+3Yz+21F9w&%Ou?|nYG=-%n~bi97sI?RLD#jt#D zq{@EP%_q@|n-aZ*+ijNr+v*whhJuB#zzj4jxGjYrAZFAYtQyX6W(X_hHUqO+M z6Dy0~IoIIl$wwcwc%XF>~jb9KmAPextg{~&_y-te`MU{f4;J--#0mLjccwlqSrO>;*nD0(g{@L~MOERJgyUq=I`1SDCRVTOIbmP|2y|;Ba za^KNsf7Y~-g6@NcO>dh0=e(OwN2UK$u{15KJiTj&N2Xnw`b__~J1_X-@JsL~3c8%& z(AXJ0mwsd&Y5Mc{Yju~6Z1l*R-v)p9^{IcJ%iprP-w6C*t)QC}VLCb4WZkl9^}<^Q zSy!|@w=}lTOJPIS9-XwI+n#S=YirGWvwX{+AN|^1N7nQ?@m&*Mj(l?Eiyex)40`H` z%16KZ=&yEV)&ub03%cf0&aH0vYNu~c^<22O+ZR!$EpK-`@nicRp3S~)_K>m`cf)R4 zA?RjSH2F5Y+Z#XitAFp8AO2bQ@y8>^thndRbE_-r#-3jI)utVoF9qHC6~}KsxaPSz zKb?Nyisu{N^-lLG0f%P|sCs&E$K|OH-qR)r{RUkW8JK8IHpgY|Z=HAh)B~TLn)=~N z{K(6O87ew)D~6PpU|tY(u}!aiCM|i-%JElq$e1&5?Kgk@mNx#2Y0uQ}_2SWp z`#MZTJzf-ap_{f%yW-9bPu-E+;?Jkw+Z{4($bhC@SNAVS+G#GBJ8mb|GT#Zh$Rhy> z?ay94CuYrE&$eH*_|V$BZhdimWG*&I>*V}+zG0!Jwe8FD9nYUtwPwNbm!=$Rkb76u z?iX_&*4i$<_N|eBl+K+U^7U)0am-23ov;=?xZuZ%v(}u(1AA;Pb*yRf>I+XVJATdB z!=p{keote~xJJ;O>HpF%J%*0bc7#p*u4SEl8#jED|94p9kDgl{GwHt1UOagh_T!<8 zFrT;SFehNk#Kyn<`SC~LGx}I|KKt%Nzd!ZdiMm;{*R8qj4y?I*3%Vbs*K-U{30CP8=G&iz}S=$|s;`%Z%=kN@l1hGk2B zn*V2yg*%RXF?Z9*mLrSduM>36%+fzYOMCrNxqf=Rn`3|Ow*KIC>&N8$@8!Uhklwg@KDLj&d2T^cXOMLIcFx9&UpX(y9-0Iv0ojucs<4dmC(dpv!N+jCLlymI{ypTa*W=n~$!{Pk9cy1x~^-+XdNQm^?Bho1go$eY<+ zZZ4e~+T`qc%)d!kt3(ENNnAFp$&AXEZ{5{!!nuK451(mLZr*?7*{OFvlhbMQTlV*{ zz7%x5&jr2J=eeD+);FWhuYF>E&)4hRUlQ^_K>L?|x?$O=lO50C$9@If;e;(^g>mIY zrxVPt<=(I_;QJNZkI%~bDe{h~f3$w`{Z-2#&jXq7sGLvUC{O)$?seURleNR2Tt2wT zu7^5qUG+}LYex^Px#lj+MRy9ixY9m@uY054M>|?KcssWK_zBmK+x_f_@yiDdDtG>V z-)g)BtnC+cpN%a4bKaM~%sO|~*#lFqyR3ejd#-8!U06T!y4OCPUw{07CYsh2zBttP zOwrJl2O{=Qm^$Xc$j8=MKKS@dd85p)8$D=$s$-kj=g}X_1YJeP7Y5D$WYWD`-;CYA zV!=!64zvmiZrkbGCkHj^p_Pt*9yZfnL1zwm&+=$cpZfb-j^F;sXJ_Z_IM8kS#|xIe zQuxL5OX{vofL(X>Am)3vYQj=W_v7cYT26d=%#H7+EWNdCw*86cdsbGNx8E4~N(b2E zf-Z91hLOt$T-j;)%r{eaN6)?M+wOOsc&_g7MRm&hZY^j$?^*2Y3c5$u{qOjaaXWsg zns%ba8=D@hoU-!$rvsn7@sGog)E$4{h^pK01Mh-vY@0f^XP$|k)9cPn&yH@@KWfIo z(P!Sd@wVObU!JvK@>#rpuU&>UFviiNiJ z)#CNV>o3=|F@kPw>*o%Zy$2tiQv!a^2)c=l zkNlcGa$!-gqUA;7+uXHc_A6r|oBWU)op$=YPg-3wzn!L?5Oh0UX>fGvL%-+0z31ka zHZJemHuI@F!Zuwub8WqwC!XFmywyCkUo6Y_Mu%6e?>rOtSb4#%zb}61=kzHDTmRZB zH#F|CtKNNQSx^YZJH{@`WC&?s%#7%_*@IVvt8={`fj6_hpy=OYSX3<>h}4f?D56@#}`&^UD$N*_Ra}`W$)q#=t0{g z34h}IXY*GU%d@Qo*$E}NII3J+QJy`%pduRwv9im{aF_3hn-za-2QkwXi>F}i!Ur8u{+GA|#|sP0icdf;?uRQK%4 zqU>_K#gkuDQBsQ2-Q%a{lomuy_?Kc8=$u#KJzsGdf6> z|6in3h(cLeN!dlvyZ3}T-v6(S>z-&le}Y>G>3_N;gXWn&M?d^tH>@bE5SP#HEv3>$}Pd$zhxCp zyvtKoQCa%06}kvLd5Lm~Urx_2tD%flvMNP66%%U8r-<6W64OLY8M(Kut6&!~v~kcr zzpOZ?@S=JmZ+bCgSLk^et!c4~vhlO`1$l*IbIS8;&P&v#u!Qdu)O@UBTp5f>reWAn!s6g&B5UCsM0ue_wPxTcl|WB@H(mjCbe zr27CVn_8lV)PL?@F&~YCm7*IJ|D6%UxE5?Mv;7UdU}l)1ca|G5jms(|ffxD0B-X&l^$;5DwS1n(`^RM+dmL4(1+ zKB&dsF~*;#>%gNeYBM{0tan^3m;icv*L>WR6z12;L;&$F%$Y(NsCk*dWO8MG*>v5$ zxyYdm!=M~rq>$NPWEx0XX-zdRl}|oKctHgQWhq8`MGih2;!gu#iavLrft*uIYsXW@ z#U#EPAcks8&HD*fRP8ueUzR&X}IEWEa^w6X2w)sb1Cdrwx@?)A8%# zm6w}e(+LqOrWjv(%quM@b!pg(Y#4qOv*vxwHYqQtg?eCs*4o@PA*UEW5aoZ$sl_=P z%Lxb<+y#D`u@%dFGJrjY}Ls)p)mSv5v*HSx2?!BMsvJ+s-NXEcgY+UNt*Q z(2#Wg$h~>BwUl0iO?ZA;kL$+T(c&KaJo!brrPH0dHoZVqm4k;qE^LqF6#6rzYEgPB zE~yhJ9v+7v^28T{r}+_-OB!CV2nuti3&*a1)pIG_Jf}R};QjAn!EVIrzgR!2;K8UC zJEF8^9ifi}KOIqvWz6?1qeoL*N)KV~tt=}nQVWZk@TtDumsp?)81?>TuNE6{+65Z0 z7PHBpmRsu2K&iznJS%dM3N5#=pmc0WPMN-YbCId&nZKl2x4g1!9KJkxNomFw<`?I2 z&-Rj1m6l9ZtI~_COb#9Xmy`!|Pf0CV&QpbVz82P(x{9rsf)4@8%G78KmrU*5v)Vbg z7KPT`F~zN_nim}#2l#~TCH1HH7HQ3MuEeLYr`D3Mpr}Y5KdgDFppM7q)q=Z9lnA@@ zH7`+KURlo6OX{H9QhX?WoWJS*5~mbwl2+Hx z>!lj<(Hlm(y^Q+QWKt=W$6actT;-+txl;aWX{5O^#3l(ojD2Zy$ar|J=oK$3DJ=9W z;I*h=ay(7Fn)HeC=~FBEx3w=t!|F2Q-jp~PbP;30eT`i%KKffbQj#Zr@WSjQ>&Ut0E}7TVU*{DE~%BE%L{V+)vFd|-Q6d7 zk)21+Yqi!>trx9(R6%hqY*=8@D4%j^i>k?$1+`%6>)y3X>iF^bHJvWKjfp(G zD{x80sNj!c)Nqhux|Cl3n)Bi2MLCQtmm@Msg=CQ|M2uY$qEKF-i-Zi~VHt|awSTZVZ4cTS@Hit{U` z*4Pj)%I4{KRJ!JJ>)I{<*G6{lR(EUl;w9mtj+Ocdf|7#T7!9>26KZP)rc+ss6_IW` zO)XaE#4fT;aYk1B;#bY(07JW2y&3o4MVy1BNccJB(0mS?}z zM$6Y;ojfY=U&IJ)Asbq8ay5>7+x*|KHsmF`hkIrh+Y!D+z3|6c$!nAi0TOeTX>#;Dc556b0NWcc@u`n%T(b3FB zm7!TnZt9qI7&vY2rl5K2D~C<&A)d}pX(Pf#iIH^9&>XrjF>;AHG`-OqiOti`Hzy~RR`F%>XPhzXM~~Xr0O%at&F~wpnl?$quEgJb z5yPk1w22~?g}u;#>Hd>#}jNF&qYGmP3P+Gl*&nS+F2u8efV@;ce`!*EWhL5GcfRL~@8b1f?x?Fi^RZYMxT;$4M z8)QkFsb}Qso@c*^44nmk!?%u>#)kO~cd3iBrurltusj`pm!?&*n)f1Pk?%vuro*S@ zs;)x#0K#a5D-b3id=Q}p;X??m2p>i`65(SACnH>m5TBpa@JTH+C%A}MIMaz(nD(Io z``CbeZNR=WV8;yD2?N#~y-v>I+GTnyOq*xG78FKwkB&X>w@Hg{7q3=cNq7~IX!i}?LS5$l4#<3)_kMzLqJs0(9UT*UFB*fXx~ zt^(?kEQ-B)Vm0vvLv5gz#EgxLJefWkx7kyy_1}1wLLJYy#PP$LgChQhbOh+X_Xr{N z73N?qL5Nio2xlPJUI`IgjZ7Ed_7+H06_7z7BXj{|7IKad(ne8>#jP&Y4s`**R|UoO z7Z{M)-v~Ln&LHf7@GL^s?Hodi&Q#nX+B7{DuFceAVcKg3Y>feHh7M+maIKXd3)7C^ z84ZB1!{TnHF;jL_N8IXS!FZ|R#*X4e+7q}>;!g1D2$hCm;srV)0h=*pCDZlaioB!_ zA@OA>XMm>vNT=#ORZgPVdu*sM^d4(zLRq|f4PbTo?=^NLnJ_m!FRBf8Wr6aqC@fWS#>4kO-uCZN|h!IxKyJnt2kA7j4AwpuY!c;QRU1W@{< zDtQm#05ADdJng{6UqJpW#RU~;>_HJ!l(dSJsbUh(jUfOd_!IBiBM^o=o8ou79+g7po{Sl@kydL2V2!RvoWHRDX|1&1_KVxCqv-m4v zFY2){jb?&`oiJdLkTePFsKhOgRMhXg{1!wS-Le`_i>ekN4k7$*Vi2tCiJG(`=5DG_o7*n!?Ro1P&7-lL zIbkt~g`_U}mFD~(m5mgA(CCqi4vyL=C?;xBoEyEdF*bby5^77#>nFxaQbbjn$c4d~ z$XX5+ivHH~lFOF)EGlZMEqIt^6A}~A}TS&1GK!U^i~(-VQiTqnjv|FU~yEdLdibB{R3__ zU#priq36;eARrscvjN!hw_Y%&`NP#5)?`QRq-otStmTSiws@{YR&}*3+>$OpgDr(C z5YK7_f-ewOo5lFD_*T|(@NlF(zGfrq!JNEA{>gaJ3=c$DmgxOE%xB;s)VABm)vpOn|R(dQl?Yn>~sUl+0Cx-Go0F^XqW4i4y$>GizwUH*rBHY0ce5IS%r=__4 z8-1z3@B(jfQG*2P&nFOGff^-yX#l1n4J1ah{hJ1`;d3Wb@~c+@9EnZ9h$4wO-0#3w z%PiMmFD=WTA_g%hNI9HL-nyWPt_v`ut6T^_{`BjEiMg9#-w4%m^3UUjN&9=tMpj7_PPP1zL0eL4A^M{cE*5(LlPuiBRv+T zjWJ+(1`HBC>IhPywegv6-2MfR77s60f|s}8T?dA-UV_IoY($2GFCciS`BVST7mbv~ zrk8VC;(oOuwyHWrP;4;+7(zDWUxmz%SHREuvJvJ6@@4iSbG6{?4xqYJ`?9?{>cCK} zM)-`btm1%&A{0VIQ$-39V^WA13!@uL7&75v2`XWm4A@pZ7A6c0nf7-BR)`*yuu?rH ztj9&>`iez6)F$G@j;`T~}PY zsItDAyP7S!cQG)xi5aZ_ZDUY~iZ*fJ)$~{dI!8U^5mGYd*MeXP?Ct1 zbTo~4sr1hPubxgImWdWg^3q$(lX>Lgw)~4UCgKxZLrQQ;zaV##uVkv(QkEjnP&=}G zV6UqkmW~$pdQ5%+n%ZqQ$W`GLISZ!*TNgJqdrDFpR+k~dN@j0^1TQ~K13PKJbE2cc zI9RI#nh_Co@bm{n&!6DCvaZGrN^_XyVbP6(`=4mpuDskQ+QX1?j(n_Vh4ddsNWIAC z-Uu;SR}DZ26H_?g|3GNPGnPui?EMwtNIVlh9wDDuoGG}a*~yqRI~kK^r-ae$lrZEf zV&P)*K*G4yBI(-eu`n&cfF&ES2?mTBRHof+!1ft1jJUZ+JKAp>RX=8ZX4XRU*(K() z*snU1C6~|G1)G?>C9yF@V@o1bKZE)V&_pm3w_>m@Obwd%VP#{rG7fUerS77{&?Q0Z zH|!5gpQzm+s3%@6g1MU-FHCHOF&lY)igYVZ1XCe=IzCiqG4X1(sOL7prurYmHsglD zf?>^N?y0R7n%WRGt&LWBt>Simirhh%z!G{guCFuB61XMieG?;Pv5^K(fCgxC)vq#` zyD4&^sg=m16@JG{ZAn~2UXAsVib>N!usWamI`N-h?N-FIf%&> z{2ho%x+f5mbZ;V-hr5}!6MrQg*F-Y553##(2aBGPO6^ZPb21Lr0?~y|#Nd`gY@UE| z7v~lMi$RQH+e{mPnB*64#3*DBh!hUQBxm*>*IP`lu1Ual#6zeKpptBeIB7$0kMY8v z!6G9>V5vv2M)blbCbD}ZH}c^s%ANlcz$;UbO7uAJ$zHpXEECg?M@YpYFJHd{r*tY& zIvFfNP5JB`T%mgfItU(d0Wq*ur{La+dq6;4Lrt=}@{-0JD?ny{G-Y)vr5A(DNXWGp z`ZvIecDMugVcd=YmnTEDrMu4cxA94<@hqGRO_9+8T1J{YQk069Fwp%85&M7~0xioq z-QDZJI6V%^3-Kff_{^Kym|lsOaC39Y9Zv5AJ40R6cKTK2ccV&~q-+Mg5xAeqLUR|_ zwV&D?P?na}aH|A87nkWdD9?p-uL~`uW7yxkuE2d(#PDlHnpQ>mdmbT0;6;S&#Mcl~ zgs`fq8iMc*gbsvz5spB(79l5#bqHya!lY{7YLIOLI+f3BV>AZ!+hK!8np#u;Vi$1g>lnQhn+WI?T}K^U8%>yG>&))vl=i? zD-uS-oUt%%N*x88p~u3sr3UP719r)~Noowad;3oy%a?F_@6bv+LJp-QV~G3iCZ*>< z?0k(QWs9pU)kx#WQ?~ej+!k`#AKk%BU8=maH`EA93DByDPen+TkcN<5IS02~V=*SJ zZpOm2yL4>0Q1B8)A(C__^;npu``jxU9R^6-QkQ>uZA9njULR&yjJuiE*nqJ$sNYoq z5!KY_W1N?F=S%|3dr76zv;r>n0-bXMUfwgB`>v+{wxwz;YhuAyT`Diuv8Mv+4GW)U z6%F+|2ss~MJ`^V|>LO%APs1%6nlahXjD=}0=-6=W6+I>vq;_#&Xwj_tFclU#6XtFl zs7!@LNkQBnzzLy2i)J;Rd;WYyZ!B#F&O2YxSMt{|EqHP6W_yvA_fp)v6rKy5x&k9zHj5?Nz;l5U zq|e>tGtUbjXeK~%JpsRW9@N@l3g z@^mzp$bN^1 zy^0khOwMVH$vKU&FzvLC4HvVUgmC~#x{i7*OzUpIc-}$MaUmt?IO9p!WCKPIy@bs( zU_9j{Vb2?|mkn5FC{@Yt8a)=K#Tu{#19r*tp%OW7l?!?EIVi*K;6=3_XAB$P`OuzU zVXCaak8$za@s~DqDD4$sj{|%z4r(G*WmVG6?yKQM+EPDX!8}{I=gE2CHvqfiR+p;3 z`}~UTts>rnknJ)=7b^m#+Gk9vea7VB83}s?&l0v>kA>4T(_yjb0b;|&s+_S}JUnw8 z>;`$cg;e!ejg$*_ZxUYIxwMX@J4bfxc&7b7?9vF2E)}_5yt#z6DO;LNF1pjKcjs)t zWOp(qyOXgn?H>G18`n6}=4Z8Big5|WNuLZ*ewhiWW08j~p}uv7Dm2ASNf~L5O)y%n5*~YbYW?`b`)oW-3_17{=;xKJ#iO z63Zt}tS51Mix7D-Z4&O}cK9PM--*?ZAB{2<7G9bNU1)Wx+o5kaGp}IWiWUwBFqb4s6 z)=3F}}-$a-Mxi!QnuaXCpbCMPMz z?tVN{>jn42Ry1cyEZ}C9APtrJrOoX z7>lq4LMy^n2t~Elo$_(6cuZ%IdSH_s!E0eHqbhld@~JcB5@D$E8l9z*A6GY{%V!au7#Q#nUlO+ zyAqeU*X!+YPz(|J7rg2>Wxe&MY9H2Dwc7!(s$SXTlYVjqNg?YtS zRYd0EWBe8Qkvf%p9Vb$JJ68iU3C0PwPI>>5MDB68h{j=?JW}mpM-~)E>a6p`k=V$> zg7ONDy_u;sZ$9eT$M*a=X?yCO#dA*Dez|Nc^~S}$e(Lk;X^*JVys_Hvznv)k^VIV8 zvpTQ;(ac3Tws&?0zipm;!dCiwlP6BTwEVrN|FKS7F>c2C{P~ZD4aj}?6X))bB$Je_gd~eYd6= zL*EVDeCVnxR+d~jsn45-y8bw~)t)<+$Gy;F!{O_LMm>7+>8GAPI`_lF`%YfAyKLl+ zK40t_ukwGp@w=UOhG!l*{9^Ffb-|6D`Lk%BBQ!@U#10A>5wTUg;7O$S{)>jkf=QV zHp~=G@0fv+Dj=Fsk1HyVU#IEFDPN=v3`l=ZuAE$CQ5E^qDmoSw6T(p%7%&BYLvU|> zw9y2~+no<3HZY(u3epHMUV&l_>dvPwq1aa?PSd_$HuWc8KAd3!17J&uyzl@nOy|yr zr3l21tW5pV%1xbo`A`!F25{R<&d}uN&4-x40NNOAsj`8+dinC9brTrCc|`H4=fj5_ zP-gsP$-eri5>aw=Zy(NpfdN%+e8PSBaFaYR09zTtj%vT-j%R)O&}s+_2torkM~qhk zA3p4Xz<^Z##r@5fH^uq#pfpotygbVU5uj_)BSP-t1kFdh=l}fdR>G za@gF554C7u0JoA!-S7R_t9|)!F%}rG91W=2r=<^{%LL7Z<)^ivi9}wM4PKY|@VOk& zzyQGwu^YRUz;o_huQr0_DE_i_d0pDMc|=f3@@B)BYm(bPzP|{odY(&y|8^DF5PKw&MG9zV+%TXefuOJUrR$ zDTkc|&4u}N7Bu_8hxO;x$%oHXfc{(iK%_w9-tSlW@aZCG#_%uhb(>rI8DG~38VCA| zqmfq^A3oOt8W_NqceXVAEuzR$SYFJ2QJyrGzDS%deT5ydO_3z z!AH13xkSHB;tpQ2VAS{jfj9l~~*|0%RsGKw{M^8nXIv%OI0V3y9rYh{R7fM}kaE-4} z@*<6ADtdha13D6ktMk3X{&1ywOHV}_&s4M?0|V3?*ycJUGV=OePemHfR6Rs0>RVnr z|MwY+r%KpLpTJ1tnMzoO0c<5+6}F;&u2eVZsYruV(t@SQC60nXvoY#%MdePIRNlL% zfKgWk20RnsL4bz^;OgYkP<}(wX)~Lw5-_eTKi};UKSzfTcDVuY5rVwRQg=XcDSpwV zVw@YuR8dk?kc)j-9~j~kzm9->yk~b`)7{A))1J%Ep z;7y#BQ&8cU0N#0STv51W)FckSCYqm9?1^yT0D8F_C?Ov|o96bMl~c~Qs&z<~CDm!g zM@99;vK4Jh5R2#mWDnSf+nsnZRQfseH^W5N5Fy_e^Tm0*TPj}X7D+t7Uay>1L*Vg7 znlFubCBz-<$2a4SmPJ*kP8G2fEsxU4?~3>)6$hq#!LFB>d~qI*P+zp`7>zHEJAt|f z)fegc#SLG)_h%e@DInltui7uh?T~^mULNZ6g{zGLUyRz+6c{;dq=Z{|4x%`xP9O&a)S;;+lPHkk%_8?agD5^RHg!mPYGP8N`C_FQLjYlrRohAxJ$JgLq%JVh2S3&XMUZP;JTDP9PqN5{SS9I?_ef#w7*{4?z z7mTs!?%jL$?j4B__Vw%6PoTzxSp#}$zxHjMxAre_)K{o@cP|J5oT0Mm5^%r58moE4 zuD}ak$M*q1*Zf@x;i^4WYaHi3(-T9u_f@5JU+?avAfEXy0k3y;ew+g%8>f$PU-^=5 z8fK=7k}AFz)T^u{PPjCwUa#A3yplMuKL``;v}pB7giifwtcW zZz*nGoY4L8TMB*;fu`$bK_=E%{`g_S)@}vOdYvw?8h*RM?;Fs(u|@K0fWRNW_JH@@ zs%gV<^Qx}>o&>)l&_sMB>9}_D$B!L78#KFgI(nP@)tCLza2pOkZjKT@;vc#e6S2Ruj=}j?Y9;*(f^Zl)%6Eg(vN`V1D&qA{-x!% z2Q)YDzA(S`K>rGwh_57Fb^PcT>;#%Qdn8?T?e{d$dqH#aUP;G#_>&j#z(L3uvdVaS9Sbe0KbW#X>mZ(Ro5TwfxZPa zD|Nc+_$>#&wV=7-;J@>G4>bFAy6X6`KTd)s{gC8WU4O8A&w*x}PFEejN5St~(9Aya z@8vrNnub3~y6X6`d>ue@)6f52zTKetOQ)-j-#+kba8%Qd9FzR2>)$>=Pdct?kK^Wr zWPat3<$D1%p}z{UYV|=H&|^WfN~a5~hTmE6+Xn-Dk2G*6g-Y#xvlY8n=*=%lTU`^Oj2#M%x z)LXQrQ7;22%k73#jC&XA`5EOqJ_V*iCVh21+~ibB?C8a zvdG>(WE5c^vP2&;in0&c6dy7Qr4QMBA2Lu$ZVk~3-!-8eWjdUe9ymHBp995nPrTnI zpF{Z^XLs0e#7#o#5t3lBr<)w{$=FJf&@e*HHd~qvN>qaC6O?JPSxl)81K5DT3@n$^ zvQmvq8xv@WHlCY_=e{@zCOLKFv&|fjA%uNK39D13RSBrwY|F$El;(h+M};t147aD7 zv!s{Av=mS%dOvDj4s+m%taM~rLWjPZwtX6xx&1_B;Lxy-Qfbyo}Q_?c*W+yr; zE)I3$6cdXfQ%6G+I5W*QyCp5vnPM8krylt5Qb@#RWFMf#fxF#da%9+@iHKTKlWb;t zT81s&ECxP_>bMidr=_Nv;~k(A69w^s?s%Iy!Gd-d1QdD_1i2H$nUh3?QmtvGganhr zWE7^ZI~l4hD3Fl{QLsCaIWASI|S+Ri#{BX?TS zhW6p9D8AWdazK`h0ycK1LmfP+RC`3YQweSv>4pGs3ScepH9=SLBwlsDB5CSQg52D= zsH~c~lVG?x(&E#sdduOZ2$@xLcOo2oiYLHNo1><{4#eeTL)!guF0m<1gqJG&k4!mwRWe&fOJ5fsb16U7Iuxv z;ef0e@_o5GHTv5Dooj|c=1>*VuG0CoailQpF` zuBn!e>KAiPg4t;8Yu#z}MohMu6OHNQIuC-FbZ4>|>1{@Dbaltu(W;!e^lmeHBTDbO zD0gD$CcDMX(cnX`y1JV?y(e?*fLX0+S?EJ0THW1=g}UTmv!z)zm3_1ah0jP-+7-t} zq@?w5rx)T5!y?^kvZSV1>@a3AY*pXHxRa)5#91x&WawT)^(#T^=}t#20OOgahl^58 zCB57!?RIO%FlVYMGY(1$3qwP>^!A{lrDSuef$8F@R8b!f>QqZ&qB#L}l-D$+#&chH z>fSxE_H)u6;?NN`6qSYt4H!8L!RhCo8fkY;naendrjP&t-@g@VG;1?ff;LU#V z@diH8FFwJ*C;7#@?961p_(VgqSp4F#KBP;74KTz%L9{_I)IUKFgTU&aAjTj_@lPOy zU;u3LeqwcR$Ha-r-Rz7vrQ12cgm@F*-xHr0ZD0m?VR{&tfnJyx19QC>rl)}!pxCu863yNs{DA0&JQUN*(Rb1s5rjJt@*nSTzZ&kVuOs5~h#Y=DWzr#@*yJ>< z?`YUDu*F zxSj@Xln<_#fgA0E>uuniKDa&xZj2AEuYt?)!Syq6V|{Q^L$cj+eQ>auENKZw*X4T> zn9|c>1PjqKoxnT`WmQWZqg<^~?v0YJarR<` zC(1m`9G`*JnG*g=Pjs@`nr`5xc;ZsbsTqb2o9c&{ z&>9J6cp@|4%`)nLqbCm4Fp|ymLeX)eL~xcTE*(~)tNJ&2BI(sKn9laZrLftQPO0+5 zWu{p(QmDk$+%m@>UZ_>YVV)-igdd)v6q9h3u;1qU;N{>j*?V@EW-O`h_oOm$!ESP! zq#p3Zd(aCj^tx)*hdhy(U*VdiBax+g*b`|pJ2Gsk(r_aB z5l^(;oNj`j2ieW8(mc!^ z`HCkJ-GyFI6Z$GY$nIiw&+5MFiFG8y`3ffuJOHZRT*i^|HBU}tlNvufBh}&%t_SjZ-9L>zBTkShR&RKcphC!ed#6};ioIRC_+2o5i!xIlzl^TYdeJHG4 zJSzqt_@J@4hSSMrH1-xB3R4RGCXil3&bIo{B*fv2qavd}fim==4;g#~4wwtpI9Q8x zZ;|RFA1W|&Csd8I&4&+64v&$cir*-|AKN9Se7_-Rd{s^E0;P%9Htvcrm ze^iDUu15I({88!FyrTKihlZwjiZItz+05Mm9Kp$lFh^5eH2RBm^Jo$Qd#32Hmfnhzw<)clPzwmuJ66D zn7s{sbHEFilwmQl{J|4v^T_g`7t%A!AHA^dSswDjF-xUV1H|s3;i*W0yTa&-I-WRF zMgp9$+ykYng`+yq4*^`@nFc|S9|DY*bc3L-9|HO=4T4}l1j1lb%ghi@f)wmL!cG!K ztFk&mJxQ{%vW)82^F*a!OU)3ZFi#wYaD0YUm@`Tg!@VfrR);O=S_jql#GB%=<6yGE zy{oiY10Mq6Pf+NFK4{K~Mgbf7pm7)?%Y@Bt#h|edg=l>>QAGHl;i896HQ7*SO?)Wg zuyvARvJJHx!>Oq!O`MqeQ!yb4vsfvRX4O%_xK;|HxhIY8$F^r#=n_{tt%WDi(6|JP z6-K%vEh!0mp(?wU{;5QfRP|f=r$K?#ba9y{h1_6K$kv`nJI)8VmROg2BC&*a`5xN% z;9Tylwq7`nIh&cg`(jUkqwWenB#Bu3sLof?+0K*Bo|fnkz9BVwBYp9nj-~dV1Y!g2JM+3B>P`pm7ROvi0LuefdwMi&X z#}FE;(~7x40jqRU0p#fyQfdK`E2jbjR!6{W9WV>WL0waM_{=IyW>Vqgk3T9)YNpAG<323Y7SUj-+!gQ!2WSF}xeE>% zhd6;m>N*mP{d}7xj;;#!5fOnB;oyu+okUoWgvIk93?vpOa9}%AArM(t&j9=QC_7ZW znX5~)5JTdF-SML8goa2c`j>+iV*>@pxvmV!Th%F4&ls)_7M?Q0#PuXNAuS$m6u?zE z!#v@#t0@ai6z+vgw3(7bYL2r{K>*ipik0mo4$P_s<8)7KfCpAIk4jj_14X|K3q_sA zgn=Gdqs;V|6CLD|vHxSB*Sapy}U^(E#cwe}EL>;yEFO|$ zOAxD$PRX<;c{2xJEEuy~ zz!ISjI0;0e)s*C9&r->!#ff7VG*3vV&N#{J9X3fP&gWp9aww8Y9dZ&>!xC&x=o6fX z6Q&*U>V%WP(`eyAAe@{`77CLT>VT7=uwgcVyb9@11yP5a1c3z}B#X(4(|!7pMA}JY zqYgOnLL$&JR47@Fbaqs}x58uY5!1|^B3i25l;>ODZH zaC?5)l>9PNX=!0WZcar(NwLtE?F7z}SD0^~P+5V4_{Hdw1`*$Pq88xgI{avNs+W8d z$_l_rD4T7_7(YN{f5vU`eMKO~>VRGmx zWRQ;38(u0m3K3J*)scn}nNCzgQVO^Cf#u!;N*1_0QlzU1X6huTQCaT5tgo_QYfQz{ST zSdv&^iX4-L>PQSvJFH{}6t+B2Kx91~3E7cHOob*PCd`G=kF}a%chlp-;Z2Hg7llj< zWrRb*>FKb|Ij54QzI*0^N|?1oHE<;tLq#5UCZ?eq1{Sf9cfuRFGfRd&on{-JD2#g1 z@?U}k`~2`&X4ud*LcNMw(Jp7#kRZSype5*p4Up*)CKA*!2q@N0ae9&rC~U+BdgARo zwM0DCC-FfBUO!rmbulb3VfEO>T8vb6T~sjX<8fXvJtIBEl!}>6m=;uTqzg9a;&6~N z6Xv5_KNA;X;ILlefnH|{O-y-Y)yOH-pyIf(rr>ZVM90aEd9kSF)J<;n3_7K_;^@`o zK{2Ak4793`6AnY1ZNw)L#Gz*+!*GLASg$;^sAN*;7Vd43V||0p;K*4dnnngqvIEw(nyj2^M&hDVoQhUV8ygA4vW(NVBTb*Q z>3Cqq5e7|0Dx5SX9Q9-!pyS|fQ8_m;h?2~B7Xhji`bo^FLg_+hi_<>x z1LyIbakjK9vAU#+AVo8SLY%}CM=c3&ZorjD=uOX4kT{r+O(wBIC2b2ITB|w9ghQ)b z)S^qcNH#jPr9ljDLA=?Cu7DW^Lq?wd7lWEiTN!k)wAs*x09|HaRM8w}E7XxoVpZi@ z8G`!HM`@>BWhL`lTEm=2OL9bd|}%iB#9hHnHHM^ z$3Da)LNIhT!Rb)z3dQ~)3fh_|*k=mE*_{~ZX)z{oYT6Qy$*@5Le|cA4wEf&Z{6S_P zi|q0CkQ3erq0+d*Wm6FopbR0Ah~UPnp(3r^2IPvx=ETXj`^A)vc%s z@o+2Xct{XVnwzDYhbXufbd+#3>60iia4xtKVLgUKTwZ*OG6YqLe#E;yj$u+EQ{N8j z+Z&5`VSmvIh;T0$JW+R}3#JhL?Q*>O;{v z39#S9NJ4MR{ZzsOGy~2K=Ywc%;_A3?=qiEY#7b143q|9LI!~BB#09xWFNXBkPc zxbVP1A6qRcVjaz-SYmjf6Kp2zB5|M*i#3J^7J5=0lcqF~1S<^>5^R1*cLtGIZFnF# z>QFYW7>LHI!vhWGX^CP`oB|d-4%G|O2k!!Npb!?IV0fRD@A(l{N5C*V#L@9Xf(o6G zWQ~L6&DStEV_~{ab4U}+>`a7f$|_oDr^rXz+(IBQ8(~8=4$F;5uqPS{Q<&sZCBw>d zz^)P$tOhBdKV1}dvx8m^IoA*imFa<1OEPIIvKdJQ4eFwTPXhj3t1uLageG+%b)OyW za#ciVR2N=G6S0j1k*5zi4&x+18Z7niCFBJ(uHUb zhUZo)xI~`G5tB7x5O>TkP~uYU4?^8AU`wXvm+^a4DLK;$iYkl5)Up^T$-$h8^S~*v zi9;if!H7x6OzFS^D^&b)T?QW-;o(Y9SK|9_y?Z(#Tn2!uhb1*JEelN+8u1ID=9HY$QhXg@D88@&dnh#GKFsW_G*nT# z{ytD!fS&-ZZ}~DS#ukcpV0A=Y*eGly?5$Wui&dc)t?BVud=2?>Am0Nc@=t&!#0y<1 zSf$Al5jh8$yXPW5fY&z*24HB!aZ$4P1iS-?Z9ds2Z1zfI$8L4veKU;r(1>sJD$q8? zsdNlXI+F0qNr)(i|{c{0=V)*LEZDmBw=#a;>~;LwN@0Eus&iH_0ROVp*U zUKh!iE=~**ygUSv4vlzU71yn(lrclZNc6GJLG>Ox>wqdg%8at26s-aMk)`m{Y{cED zr_kG!i%3{pveh0`#c=CT%I5Rnr`Wm5FGj*JAz*43hyC)DM+R=>s{J{V#Gs&DT_sq% z<;Qkz62x|f)=3gVdQ~OMp%L5+a{Ai~63w|uXF{PBiyyt0SpI=1jQg+^V~W~{z_IuqqyXT%X#yYy zBIT2AQj9v~BNb|aef*lJ8~MxLYzY`;irhRzig|N$nFxDsPH}EYUcL~eBWNse=6V5U zUZ#L?*#j6YCQi&^>~i3_7aTH81wze;{t;@4d9+1ROGfdeVt8`J2&N3ZjuJt>Tz#vH zG8u4$m6aFF$cF}E$DGm|&ut*Gi>d!IL`I^EC!@#HGsM8Z8dy$}7n+0RY)3v+&E(U& zr|2qbQ8E6!)F{UaeUGrA$HV(5hmhzRG?zw66B>bJbbW)0h9(_IkU?tv4$Q}(qsHe7 z0d)EjL5%(ZsH++$YAur`CYMOPn0|;B)aUav>G@#pNYsLb5o$Eklz!jftQwN7YQ30q|_c2ACCS-_xJ2iJgP8mdi zZFd7S8CGLb(}*d66k-F5T__|`=mgP-fmp*h^$&h#T5u#)?1@seI6b7tODW;N@Ymd; zDhu`YMd|n|7glYd!qjmSDIc>#*iTo0kamM`Q^|E5cM|B9!4iW`htP-=4^0zaS&mQE ziq4_dl1htYJLMRWk|xJT7Th|a5gWZl)KOBIJE1fuFA-B~ewn3sT#0Chv3eyuIZz!B z^(;XNrKGq*bl3|<$GFrZn{FF2EugJ{F5w8ac(AbMkE^g1jGrLw6v}Gca9GT&27AM& zGuUggGsKAHBlU(|j%TWkw~(L5BZuoorMdVug$~f$r|c`@IgKz^EVW*r#%GFC7XDMVnYMy&QAVBb#llt0|V zY|N;QFm9Ep!`7z}&8p<{JIrGG;q1?u)ID!?^g=Z1cW6X71cV=u0+EDgPV8c;=D2Vd z2tUJuEok*H$1xDU$=HZ?NJlafE*X>X7Pk>rkGJLiuprVjMU0IbgnG6 z)YyhqC}kxQOlZTJO{t;*`H2{aiu`trDA)#FQa$ZhC6a8-&d5aiYn=J=m%BN~(A@=2 zXfrWyQ;*XIl_qFMJe}|@8>SPw!ZH5~yOmbgEU;0NxabI~T=ZLU2}FiWC*wIw%qx`j z2$a@SwJQnA5;|d<$Q0V&ef|nVLe4SVgy#t0#t{dM*wsrDeg%=3r+L&I$8$)S+xS9C zXha?4>d&4RRtFn{XPPJ=L-VH>mE?(fAP)`BOgmmw6a$++BE=lvSdPQAm7G(I&1gA= zQc;0I%=hSUwmUtfD5c9qYK$^5+l!K|szx$}x}uWghqT0~&dHsWpJ&aPUQ#KSUt+l- zr#32XZk!`Cw>@()J#$u|f9_wrb3$?dOi5y1N%(~`Od4v5!J!fBF*NWMSDNQTO!{$B(YmF+rDurFxD54$N8Fb&UGYtQXkQik=t3<+xVOOff9Nb%!@+5Fq zGAVQ${as)O$CwyBqzT057r`ALWf{XyHDU#=tER92QVU4kjj$50A2iu55GE%;1F zhPslPFjZGmELvUB^2*xcG%!ThOU9B(8j5{IrP*)#3V~Xi!^@)@O7jc3V6Uk$Yt+1j zdqKqH%88FAg$E{{h;XCBx_n6oL%Yo!dWuDXoi-z z3w3~I(&UuMIio51OxSr4A=aMz0hC&?86YIK9e$pOS;%71y`)#qLtKK6?H zo@sOQnr|nc%6e(j;ul};_s{+n(5%Oc9AFFOAI;NZB~RSg@@U)SL2ub+IV z@vGM#oIGI9l5%`WcA21i|KPIm2a9Jt`s1EIvWMO?f7-W+riY*Z>am8m4qo}h9dp{1 zX&S#R92t0b*YK*JXSFIm((CNuVC%;p|J2{|+KTOgr);5XHr{mgebe#nOcXFO@cC8& zJ4>$`P;XMhH6ee*gmktv8+oeBbyKJByYJ(lb_Blv20n}`=nnmTvgPleeEaRW8|Do7 zcx1<;2lvjqK6b%(+gh}Fb@p|en%#zvDGR#9wVAz6pQt!j)GvBc*&~S!*VK9Co%+uY z)h;`?wO)Gkh8s2Qkf1w~ed^d%G57u$P}TYPgu4o#T({`aja{B^`N6dvvReKzwIl=Y z^VebdMlY*sbG+rM$|vsIo_RiWddS?*&+gs&MYlt5SLAH}yY~b0H0?n_w`Jm+D|1`- z81%}jhmH^3^XcZ(qgD;8~tg06mO;^1{7u6$;GR93;m-MW9>?BnZKKUpvEhqKT2yC&=It}kiY4na5M z^?3uG-3HzL#jVk%+ijDV?l^V)(_N`!%09Gx6m@I6!o`}_3nCmDIJZ^ExT$9zpYp@q z$2LCj+=h1VtoWeKW6{3tyT%+nG8G^16?D^MpIzP3a@nS0OS-D@Ts(fZH-?#EBNr|mr3Y4EMB& ztj$08RGVMdckLDP^UZ2i~qSf`s7kg`$y0%nbOpGG9dPY{|%}4Y58|o zmHe`HV%N1H14g`B(y4w@%wP9oqJr9w47}}wFQ0qspOO7X5BvRz(z4jE-q^F`$&hL5 zmSugk_|cuA8&HRP1YOTzvFGMozW>d&U-xQ%)vj?XR`neg)@=Gm3;q|}pzqvo9yp+B zX9ZnU)Kxc({3o$vuTvc&I~;s@-z_T})f;^4i{HbactfZY zez-p}@Jz+@rS;k@E>7LOdgtnfpQgU}S!Gi5-XZ3PANuBWo4jM^HSG&QH}Uzh4L26Q ze0ihZ+Nktx>wO+Gl6+XrT-4Pjh)3W|CvB&R<8UFOcJ2yX5 zzP0z674sg-=yZBk^6rOsJ$@!v(-sT5PY1r)sPwIRt5>hs_Vlj5Pu{nqPP6~**tomR z2W@}NJ-qmq&iLrOpu3{n+O~72Lzg}2m{FXTH)Fw)s+8;gId#1Mysgof#kGC#gr>FQ zhlc|bn=I{GJg$DjN#~aw8~1F%%3JG?+__`bZEfBUns#EseR+3a@)C5ZuTHxC*ulTk zHx%~zq0VFbSC%E6di9@*{fVZ6H(%~tzX$5NL(ttgqt5HyhXC+Z@W{Y+SM=REzGdvKN6hn=KmQMY^gz&+ zEO~bCgvZj7Zn`j4<&Tm&g`NPY5UJboF<;cLH{SSU( z`?=lIUGEsPC*;b_$DqWYl5}?udUamszAHbTow;MzZMU8X{H|ea(EN(m1LqYjzxB^I zpijRNbZu6DGNb+Nn+8trwK{rLPU6`{*LV4Rz^8Yf=rX)++p(LLWNF$}`1*BZ;QqfJ zcE(>8m)q&<_l6XuUfJdLV=F>~f3X}ZyywM-jvi`oGd5KO-PkJo4VDispP0GoM7?)= zx9j+M&!?Z-zG2}N5uaQ$>H4Z4Y?`(~(0v;i_2oU+-V)I_>*|#GhkB1}zIgNOdq!l} ztvYzqy&rr#@^KtUYRG(dK67Af(OVG{?!RyM+5e3kb>`%{UzY5D=*u4t&zbU2@~8Qr z8zJb*zHDs0<(9;ta{HnDm8S2it~EE_^0Z~%p|9@i9&~a{w-@kHcR@FEPT$po>fG9K z|G8!ZzJD;KM_q}Q7zu9z}nQs!GnZe96h{->9JuwdyepXB!rfjmDV=vsYb z3u=+IZ0@?=4~E^IF}&H{?8>PjBkvmCa_|T1%)>LrXxa%um$@w+?*k&4#ypwCKL}mUxOZJxW|{LjI7r7O_NH) zZd%WO+UwvA{r=ByOz>$oV|B{zVYBDAz}hw}EEnqmm4o6|xy=i_~JnE^fBT+>#x2zvW*;u6AfxbKkM)T{B!CAG_9G5RNh2u6ohST`#5f zYyPJ9>y4AXn0MwtGymO>>~kjnm*Y40$cv6xnnxSESkHX4d|j_P*M!iLufGoV+44)N z31jMS~Af#dhd)kk+Wj9wtJK9Fn(70&hHP7Y~J9nhB1y8JYiok+?GXl$HLtG ztlIc!HU=E{bKK+PTMLJ^DjmHdF~p^I|0<6Jp#dyp7wh+8A=_uqKcv~^hdc_l9GbBwMstAE2L zZ^M7a7gIJf+@#Da`msH~S}-OwG3&M4TD5ObC%^b7L+T`4(jB^^+HeQk;!$Sw^N68A zt?uYA7a!VZLq&~#+UQ|}ikE!5cFyMh+CAI7>Orr4%5asdY-sD{&|`YpH^E+A-t7NN zvwC~v!cL#{D&6kFPs>ssW8B)paEoU6cz#_na&*tmbrJ)juCzaK_OCNrPxep#X5iOu zZ4PY4^x;0kz4_+bu{xLGGY@VW{NVJteQkEm`+l#pd(_(+%Nt+nIqJ_C=;!j3zqbdz z==!A8laduzjM<>jmVUF#;lEM;X8-!cT^Zor)BBgF@a!{O)3;tH`_HMiYk9}v->BT{ z3^<~g5cd7X-3wRtxUq3y@0;jvUoc#qGo^c%S*Sk!F!<;-n{Ku{$~6jnF!RQ@L1)h; zKOg;c2|l&CiQ)ETNA3PBs`Sr8|61cwdfhR9?;mUV33p3OdVH~yVAVWqfgn6(xC!ZZ zht}`@VD`S@k39FL?>aKMW$jW2N85Hh)j{#h#&_aTLGXk3)5ZFmldhGkg{D1mz2))c z!vQas9++6u>fqec=W#nENdxBrD`!jC+xe(`0MZhI>4{P|VN zy8S^dQ$C5;3c~LUw_F?aPxJGiZjb7>eu$UP)d{|-m;ZB~xM@{_T{Yij-?V;#_N_?w zed%~evwM}x;qz_ITWz^;`gYXC9v7pcIy_kHlGdO>R>UCKrwsSc^e_J1|K{YA;_IuO z{qofxR(+0kcG-OY^A;ujhle-&dGjtoSjTV^n$B(fc5H|~we8{KZ@!AXwD9weZ+GwA zQ{&L2`w!iR{^*JiGc#PfnnUmZcRX$C7wWyU8n}FQaK}Gm>i=|R`}AjrGe_JxUQdIG zbS27P_seG|@6U~@zoAaEquWb17+PlTuw#qsbRB+R{Ys||hi}7<_=e%^2l}QQI$7oT z)8yu5>s5>^o<3&tp{%hBf9|la`p*3$RLuq9HN#z4_k7{H#cNB3J?h#*`E=^Qo=Ms3 z|BSq=@wm6={QTuZLbC=&;Qr*8_%P)x9ognePD0X@6I(&+jr0-rTDGZ=;zhpWp}Z5cW!w* zq3ZM1$6H*q`RmA8y*~QK=L1|TdT*QKsF=0OXEN*;hC4JruIql^K9z*SJ!Yh}PS9yG zmsl^0Z+LQZLm#^fs=tHqk_U!+8|Y}$YJ+Y>kA5d^DDSs=?X zEW||JTK%?R*S{7BgCh^Xj%BzLi*9Xw`C{2}zcIawxz<;!re*9a(JC#gYi?cJ#H-s< zAO}tH4PO`Q#?xPT*8k^T_Z2HwtVn4&eB#R7z$!aEJKuFrZ}~Q^)r5tD(3|0IMnzq6 z^GmyMc+=jgB~KpwW=ES+uCHJ2bqm_oTpfOU7co`p(VUPFK2G-LLX&f-gCei}0X9~xn}(Z_rW z7NqxGnzr1x!8}`=;g{WBj?qr)KIPbxZo_J7Zv8m)^QD4ti{Y-8Jyx%$`07Kt!s6p4pohF_Q2w55P;I}qyuz__Zx(9@*WXlpWo~2-+lL1> z=)LB8yGHyz6+T{u`@6;Ulrm>*N>)mqcdzd3l~?+YjS4v6He@B9`T2H8$KlZ9D;REz zd#Ni!r_CHT<;3Lh#jV5co<20b-Gml5qqb}hZ2716(~Ec%1Z#^f)}KDGS`l?>V#qGv zoNHS>`h-pXO@F@j_#tBsEQ$GZbJXXPA^ znJ1q88L?QTRSOc zefR8_z?COQ97_1xEywD1tL~fo4kCBWWQIG_@X3l^>D$)DUq4xCP~9rKc66Ge*n0Ze zxfo@e+@G>WZN*1v818wQp2vq)pWQRz;6wF`MvgD6{v38Dq}Ok+23yyf8+(1r4tW0| zt1i|y#hU&!t7o0i=o`~(4*se2R=3|OF2BEQ+#%O%VcmzknOI8@zGS%VUAx|mZLs?B zkcJ0Z^~pF?FJsH8gvp71bEl=en0EfB?U;X@Ww@D@MvV3J*?aG|zR$h8Kg_B6a=;v? zJ{`S#UwrCZu9tE{0zOHKG+nHh9b~XuHSR5ry{?s;-sDYVj0;;B?zUFBzjv=u zZ+<_vy#Mn%TfbU$>0s9Qu#>y$T}5Pk=8T*UIrU?>mpMaDB>!8xQ~1v|%@cCQ3{&npdTwQzSGDa_Z9lu? zUp!Y3#xk7xr+PEiH9Vrb{`_UujdNAHw|hBgUW?H1OWvI>e;(3dyuTp)#c%+?!@&Goo3asByM9WQPD#M-%Ov!4=fY^pg;5bD*Y`_6nl z{6&y5{AptBj$cdYlQggf(E2*MDC8`A%m%boV^azFgd_M4M# z&iwV2_02Ud2gcqS^V#6 z;D<}!H@tQ7+>yYHgwMy$SrSoWb(?F);D2Pez%5mOu5{C5ljCL8lMd~hj{esE-%}kn zMAiR1ZGe5*S8vh2L3JsA!|mU+D?YQQBCOf5HD~=l9r5|?Gc7Lq47h9iXn4I@wxjl< ze=ywoxaxPl_x4=a%I4tTRZq{~b7PTv@a>uPN=&#_;oraCUdJ5tG{enU-(c5E|0&;8 zt9zco?anV0ol(OY@$-DjUeFwX^9^Kcg%gS+2TSpfEEu?$Jze~R!uU1uW zS9kmC%weyuUS7PU{0MwZkl~(um9U^v)`<=&QC9yb&Qu+g^Ehf_`+xqpai@QSwVl^B z`ce?KG2HG_<%SM>KI-#--NWBxP7dpm5#G4gyqr%$m$dw~&X{Mne#HE|KHc|-GXB-J zfQb?ANsUL?eEYLwmE0!>hJLm;?cBKfx2NA*dKZ2gh8vt&_ELD0^>q@Pued(#s*mF%zxhwbl>h|b{>$Rm(jfQndukh6z$SK3UZ298@ua4c}73up|MXU2W zwqK0@&!NozW$V2AO+T^n3FLkc!#&a@&lz(g^OYv1Olz-QY5HHvu352o%KZktZuL+` zw^)oZrgB5NZ{ZsORW88;VUSW&LL6rE)Fr&c5Hd_L{Dn@nTknyOtA^ z-JoNq@B7RdH*?^)Dnt8tM`T=XJ!+`FQ~K(!ckM-4r!ibi?ZusDZG7ogEqV2o$1hs> zR@JTQyVvVP`1Nut26j59z*Qr6zF<<1?f6KI|O8{~!I>IY4UEITM`)fdN0^?BWT z@2!_*GgOyvFC8#-Nlfisn{>b9nJkQPF4oOn+iYsS?1-OcgZtZ!3r73=Y&A30ZkEFJ z$2*;-JbmK!5{u^ycPnsDdXj%e^1p$qwXvPfE3V8wcz;NjJ1&z3Jgc(s_n)Q+!eWN= zPix+;(fStq4_7Jqt6z!UecB|PS^8=38ExBUME^5=9X5&!PZ{n+w~XhbPCpp(y6&s1 z*^MffsP=UO*S{QEs5Y-XHo8RbRv0h+-6?;WZY$c3KHBe_y&L>4&mQyR=Bt%#Y^&G4 zw6JYyFCne>a+Gxf!>R1Hs^{A@FLAkI?}PJByc%`*YLkJ7#!OzFbZYs;VjBbP;YVV) zUe&C$OO|*JZ#s47(jJvsx(~YEpm#+@0xYRH)Wukc`iP^SsqchUR_?O$|`?;8F0 z^fq=cRylhftJ!VA%hkJwO{!Gk=Ly?jOC~eiKi8VvS`wq(+3e)7lt)kFPfbt_>9*%n z#f@^FwZ8qiTFya1_>SS`ZT{o_#Dv2Sa&sP4SikeTtn5XfkPzJ`8U2<&!l{(2sgE+{P-)uCBQ`&gJf$pyc4MXCLn3{%GvR z6{oaierVS2-tbhEcNN2}ueC-PUlZ&23h>Y^21KTZ0v%I6`gzc@c+SFdB*+Xt7=u0QO@hwwi$T1gg=S;Wl>rCR!v{E? z#BeG2cv1c?-9OnS=IJkcm+d*=Ga&3${Sps9J*)H!|G#*Hv;3 zdaOUudd$^lRj#av>vQ;W&kXJTiN*UZYThlxubLp7WVjYzK6zeuP>pku*Q)jS-22w~ zo0+Owo4%YecXH^onN@0Q`ePpDP4}I!-TB_kZg8-+&*zOAGpEV$ zna`~cQ+qI6pW`DZ3O{<+YqBPOOzGhXkAFVj^U$C==i=SM7p)5kyzd0No#7@0+cx;& zwB6PTv1eYkP3-)Sr|V}oJ?8qZ(6;Ebs?!0oHLNja!XG>GitX^%ZEm*ytHbKKS#!IE zt+M|2kG?rQ8-KrIs?VB`Cuk3b^DEbINm%gNMZN3RiWuH{_iW~%qb?%h{8B)Pu+ zWbTNs!xE02n-kbD;poLnu$!7vIc6;HvG$z4%fR6QjRRM?EL^m*R!aT0KPW=<({a=nN%3d?xKVx3-;KZR7`I*FJmq!g)G~rl6}kxX_?V;XGeRGZXyjoVEZjO; zwO!fcbKUm-w8d`iy{o@8n1;SFjN$Ib56S&y%>5s;|1KFj&Hc>Em~VyZ6B=&n_AG70 zFuMzD*I_(jxcV=XJ1)BFbh*!fo^xEj+pOMw=w(Lf&KFA0(f#07&2KsMeM8LoU99^# zDWCLLYWD10H+E!O&Ft#0C;K)3(V@e}d;PXIIeQUvR-q5Wbu8IxyYHRl6Zc*4+xk=S zr*9S>IKF??)IVBko;iGZ{$;6_g0O+%mRx=&RLkku^3ONxG%0P&^!y4+R-y1uG6-20blOI^oLxVdrK7b~~9#G=uyVs5-Gl?3~l;U3%_ z&?aQZoY`NE)6AV!@p?o;|KEPF`eE*h>)|`A|1f3`boc~@t2;S#a&h0xIb|0fyQy4t zDz5UlF5kCz+kW9h(g}}RZkJ%Iong2yt@bWH_syqoCof9hcBk5BYd^JX*>=Lxga!81 z=FYyaP5A=$By3a{>)<|3ot|X5q-A;haiiyn(l1uD?iKN8_TJStS0+~cxmEZKL5N|v zSBBLsyYXhD#pC>f zeKK^`$NHUf-Mg&ig%yj>?XQ)f!g&4{!@W(cR43z775&g3mNw{;y0oHIt+ZLAo{YS7 z@SluoKb?Hg5zpbGu3fBEc8f0Wd{Vvgl9J^EMzpIkcXHj&c4P-ut(!CQSDRK>Ixa%H zG2Be6hZofiR)$Roozl)TDPwfSdK3|u-hEp{_6?-7yR7u&V-dKZV19a zh8wQ=EU3Yd)nh|X^-j8*I(o_UEw2_^EkFESwdpyH#zgk~7V94j7h`MhH^^u5eoZ&! z^ZRRyP3cy8-iAxI`z}0vvn+nkx)z@b!ZU`;sS$Z&{ayPiuO0oSKR>lwXm&birFzFA z&7ZX+u5`%#?H)dQ(VFsSzw~cD^D%W^j%f$9aREZ-Jj$rPa z&Tyr-exYkrtW`py-w(Q;kAo+5>$m2HBG%n&{-Y)HbI!az1iuQydFV^6?Y?Z_o<#>{ z6#L5KQgEr!KdXP4Vb#9g#3kS7R=EJ*hIJcu-z{_MN8NsVc7LUavfr<*v@WggYS%97 zrk3&dc(B*?<@YEkJaZq#hk)^-Q{pW{ekBW5}w)vNFld9p} z%naA;&fnQ@;%}bUeV*;yV)MLOKlD}{tvy-sRjZd*qiYZP;R@za3^(IybC(zQCS5#Z zzx=C5P8+l~&UDup#oHY8%;8JssHoQM)vuj4`7PmSp z1>qlzh12}-C!l3iczSB@^q6FqAbeLe!=+x1Z?pRJ^-}s)sY}Pi%#0{ck0^CYY*JQS zJfiL%?p|Kl8|Us3m6aTokk~6eJtHP9(Y?=mzKxoZ9vj7XxI~E`LXD!GD8?T}jV)|` zQezV1l6YPUQ>?_~Susg2y3DM&#MCG+4==AM6=fkUJuxFbs&hb;9?yzoM1|-O_4IM~ z#(&Qi-riAC@ljRSN0^?NQphalRX|L}z?9fRriKbgj!#ZaA85J!A1LLCRE-(&nT5|( z0{R%zN=Q$|{=>9FrYBZeZ+yr&EMq|K~QD z@3_qe$#QIZW>i{wDmLapgiTUZ zEs`uL#!R+9J9@40o{z!Vgh<$y;ETXMR;JjAfc5Kr+P`7rECnTdGD^SxJ4rJ3bC zIu&nCO;3!AF9IVoJw7IhvQjjP#iUMR(*{P1c`RV9K=URf7SUv1R4|rI-Vf=qA?k;UJL7xlX`k4UVfGFzn`gO$EIhc z&{$^dF(_b(Gcw~KZbeh)nb~*{ypTz;VF#JA?0Wp50SxLfbwD$pe24fV)EzNJHC;5Y zBrH^95$4!XYVwRpBhCN6xEn9jJ7kka;J)IUM5N)(a7jnvS@cR2VU9BjZ>c9op=;qC zH1935p}xl}3gFlJ-?lweH#~XiaI_ATi}{`=F*Azd*!%c$EM)XU`zU5IaqnN~GpwU* z%mGphduM~57CiuS%zT{JMJQ6)F;Hrjn)U;0EDNtE8<3w1>;uzEPKK)#uLbxZ8BL?N z`4mAx*v(^8KkVl5c+E$QB~$PNOCA@O9y7p#5EWsA8?Io!qkkESb_RPxh=pu@VChnO z_5I&l9!ZJGSjaDAW<_f$Ej5ki424XLSr3wTVt}EW~G- z36lMZ%@!8dZ$Cto@-iil6h<}qacRLZSTtqi{@lVBlU&2h8B{dc%1Dck<-#ZSjso`n zK9Huu_9qktqgh(vSNz1LHz*4x7tL8sxO<99^yApanpomR zBpjLPF-eKN3p<2K%@da$U36K5@WAEAyyP&;M|GwvduxG;A3b^rLkx_YG!b7j`T`I-;ArD2s@ZIW8%&S7DRn zOJEtW8;U@Sprm|Br|`LgE35E+EaV5KanWcx1g#ZY1a8{CslAGzvd{(CHaObTl@#AQCYE;67s(cQX z3%iL5Lw>#$TeNwFukXV|NZi;i$&G~u`#{?gIfze(Qw1+^FMOv(#bsqC8tv45k3>ra zVavPHiPRfDdiX>>u=oM@XFls6A6iG)R}oA0#)o-wdt+}d=C_&YG|pM-TOX1QQCBnT zcwpLxWh8w-s&vIiSE;c@;`v^wHT1#p@xJh~n#NaX&Bo++$e3X^iei$&W&_DdUPaPZ zP#*Hp7mbi|fiHX|V<!;0+}Kd@J7OnMQ_+2YtP%?}bT+&phX-A9Wzn~5aA zcqsz62lf?bSlp=iA^jbK##fI%!UDpymwgev-jYe8Fww@}4Kt`4i9qG`P`o z@7`Wf+ITzxg{Pls97h)DNqEs-MgL{la8HlXF;}5sUW{%{8N;n9O9chHxOsVtg=);o z!LI(868{fVLef4glfEtnnf&M?nkOeb!fOfeDkgk(SmV?Q?=rfLcOI?4xufv67;_Nz z;C&`|jR9x}#F&F{9q;HU&STKExg`YZHV~`*LcuDoL>+6-MnF>U`IFqFNZAI|gsUQ;*s=>}mHM-rKtGumhhm zV2jV4@LSm8i@JE36@GXZk9>HFG2+p&5-)AAMo8yW`0MyJ6M`ra`JihEgBlRppi=lT zJeYk|(tjYnbEC#eY7V}c)0Ta=P9em_XD7zS<7pNmmlBlhD`&Rsx`z0ql**|*;!+mq zOC7dCpcB=5NhHBPjm|zpLYGoj9NDFAEGZ|zDJS%i-f9B9;L_reTNYm(ab$^R0$`LQ zDaRSLdq4L zmq552KRY2(j5!KXV$4C9B-5tJv;{J4u}s@9(+__d(sz~Vz><<$uKNju2W9)E}B6E5%phmhYwrPmrnVYmt+8(bO*tf668vkeG!L!V!o^>#Z()DP#@i_>`3TH zETn_VL_$Z>uMvql2oaT2kC5a$0wMJn2oZheScpbg7hxBKBz#1tIw3j<-zfaJ@KKBl zAH^JmsUp`=_(qI52nS`_QJLlpQR3HD5@SrLI*-q?A2GC&kQw+k+vXO~!uX&{BX-*C z31ZE-Cx}WRRo?T4SUK%MVf7W2j52`mxTrAYL@I*R2j15BPCZva_>{gmDA1PyRWY?MVAmmbd_YjhDcz}?k>Ip&*gy^BUO%Xmr zh=EP`7h!9JFA;V?_zEG_%Nv9wWjXlSvA+~^Bo)cd9N37-X{%-0HZkTX?38Jwx;Tzh z7saHJ4}w;r^LS;YP9#gFqGbOzJ1|d_0&y9M5-F&K_&MX_RRR-qXI2II3lJ$NI_!DC z1c(}sDv3g>6gninsQ}RjoRlU4L}}8sRDl=r6QDpmu9KcRQ2Yj#nIK83h7XukQ6j5% z3KJzz*^MMo{QMXVnLTL31v^{bnMhyAH*V3nIn1 zAX3ahSSNBFg$-hit2>T6D$^kPEEPxLg-k1s*5$a8V$4Cvm1!eo8aLG-t4vgjj}5W! zejAAha>N-Yi}2%uNrS#K6EV6e>PtRc#hBDerX!*wZW&-AZgdT`9)*9_5EBqg^c6n( z$VE+;8IzfnVXnE11+KhM0we#sMoTk+lfY8e4F#+e1k4IK3x#l1!Ov91Nts5NYf;7J zCtRi@Db<0gXnh6|q52t&ur$IU2+JZIjj-Ey;1=V$4Cf1+Fk^TTYM^Y14T;X=7p3v&@FD z_(u$_CS;Za8tUEJZHHO91_{&W@(t#wPf%r)W%o3x+ryV~fELCPJBQ9Qq$oRzN zbBnJL`kDx^lqL-<7i9s?H6C!)DT$d(YX7NCX>nU#9&alXO=yabG4e6BSWW(}eGNie z{7eOoXNX+{SuoI3xs1mDP`>KnM+0RhCn4`bE=5t!TrvaOGKs~vFcG@oJQ!gegs4R} zpkmO>^}=~agj6?#14al#NXAJxLc|4B6B}6RoP;h7Kd#Rx#`PJ+9N4Ua)2Nj=?YS6p zqybu_F(L5YH)>mEWj0+Lu^|ejw#qEc=Z(ry+p_MFgpA+LgoFxXdAisT9K*w~$;pPA zkDsXxC0)}1yes)NX$bAQlr418Kqfsz79pe=M{S`NhO|=Rq>?_>Z8)2xL6-EVY3njF z|0A~UW1K}AkSTxEwD$OEMEU|$Jw=xyEQ4?vLXsSADvT^ zk%(|TK{2i;DCQuH6S@Xccc7bZz0qGjjkW}hF-N!rrDzu99Ke&@p)2TKh|onV$pD8g96dvN^@n6bM!pe zt6lo~^%X<~9%4UYX9<`PZ?npDCNrXwvB^9BIoPA#4lHYK_>SKbjkKsU^u^B^AI!yz zzgf&3f0I}YdWUsXXCV|ZR0eR-_}h=gsKQ9o$KfX(8DfMgi4N1L72SajiEn5bQzHa3 zZXW+ORGef-liHYt$}*kY(>*CK{qZ}UuOP+`c%RkW6xZXW*BA~y&}t^_Lsm0M3cltB z_fcK~_KZeCMv%ILR3{RY1da?Q>gEuZ_>8QiOn|wj>&S@3ai?Oq zuhOX!&h?B|4IhX8)QP457m&g^{A}@ShYnL7KTC7PygU}%kRl%iWsu6jO2K>AV~}RB zZ16wSHq@>Joxn*#eV9npUX2ktBW!|@vhRV=6`?1>+6dbrq-(tqdLe9zFbH8YgjD?I z2tyG1BGe*miLe{ORtOUiwnj+u))pbj2Bk-JJP1EKmP?8`3Ufr7gK$)gISMCb+AW!O zPo|Ly;@6fJV-8d*k%n@yn1i5~X^}DwhNOst$tdEc$h5CzS~Zxy{2nf1j8AbR>`Sk= z%F_rNSXG8=GaV?S(DwG-cjUz!L0XQVGh_na$zw69(y=TibznD~Nr$HxAs!v3Bf(A3 zOh*E`hO}i9{7&ZA0mIVbQ!Gy)%Hc8+SA3uVI=z_OAEYcu{lOjxli@+?4W-%T)nQE1 z<$PXBLqtdX9PxYiP?4W^goHVqrOf|OIjQzYX$EoKJ?kp%@=QDCQuH7rBni;mc{TGT0T4!eTMzAnccEhh-Z1MR

          !zTbWVnZa|JQI`664GQ-j8p*~nT4o)g1?jr%acti3?0-ObeIZA8QeI~ z#8#(kNI)n&_bvem!YgJwh>z!65|;e^|4vYp+fW9DAZ_(vs*;+7%T`sK=S@zf+)J`W zwIa1MG~Y){G@~Gfdq+ip%IA}ARtsnml2jn_!mObiq{d6 zK}qLSbypF(igXe%I;Y%c_4#I9R=E%f|<1WgyD>9CznfzMP zWgJ%^zr_+H!TlEBuo!h_G8WwMlMX5d9a2X(6{YRqna&aD8mcA=Pvj>`;W0Evc#nJR z{oV>mAlgG1s(*|?7+9Q!%};qZZT@)}oTyy$5t26h4j~EeB826{a}tLIILDC7=;Uvp zb87z2@#D=;G2Z+Xb6~?Rr%e`d4$R%jY1B>}XQSXTM}cfpP7^%|UEoS+H!;qQoc7FF z)o?@(eEGFUY;)_Y5G~Q5N_~a5Y1~uKeEVhg_)&(1@!5UgUf4Ch4V{d7n^_kQh=oiH z#=m{reEcu8l5~rBUD#iYVB_E5f@|!I{fXXFjQDg|iuKq*6}K8cTZ|y^0^;W^c;jy> zi;<1MC#s2v^C} z?8Q#FkQQyrL3h&1fV4Isub`4qYe#gUE7PVGQI?+UJP3DoHb^%mJ|~mep>#2Ib>j9Y*`$6oVeH~(I#Tm0UuntAqbPS{LKU5F(@FVkkFeeER=3J_G z2ZTsnfD1GisSEJPvgvmzgw1hY8eyP_>xi%%&U+%n;uW(UD%Dz z*ux@jj7*y#(+Z@ezsF6vmY&RFl4!f(Ogdb}2o;kKQ!O2WTbfSE=o;#j6dsdB)5JHR z%}ROSl*|^_W8NYZsb87IJqyXQ)!p=%%tSmW2wCN}g;Yw(Fd*TP#(_XcP(=$eN_i9y z$fyNt(t;zpyf}ZNjG(_s+4z7F0|PP}F(MGsh|w7#jTrb6BO5X3oD?vo9&E%QI*k}~ zPNgKV<|78h_=rI<2l8?-uA}gk7;_Mo$g~wQ?UYRWQ>NKM8hCo>dMt+YWZG9Utw7>Q zJ)4W?*DUrf@st#Wsd&;{&2+8J6{$($c{V@s)Wv5ivoi7G9@@rScw>U3E)(}v2r+r7 zN>V3fUXnU$A4%%`N#Z_6>PW;WA-b!O^IKKGHX{%)#tYVgmBiX+!#%I+WN3&{*NsGVl zSxX~@&Bcl2+Vb?q6&yOG7BLm4x8SuhncmPfk~kfChd8yzJM9ZENHhiJg4CPRD~Je% zKzyoxj0lmJM-m}+H+cY#q)HMGDt|rvsLnJZ?F)zk)d_|sCOTsgl6IPikVJ>hNp!{| zB+(%{i4L999dq&HqC+t*Iuzp`R!*CWb55g{<+Noo?U+m>Jw;px!A~LK0>xMXMTe5* zqC@ifZqcy;f(}#B*#X+SMCWq8qJwSe%A};ii;kpHf*}hvKSmx3-2A_w8L9a71JXSA^93M5pGbb87yP`0?ha7;k=x@#g0=YJN_m=I1nOCr-0L19KWp zXE?1ugU$jZ!JB#ti`n4sQ~ccUlMYuglAo5KQLybhw8YVOHTD0AQ6!0m5@J#5V?@J( zjl)Np$Ed6KX^Wm{b`qBugd{G#5R$kgAS7|2a}t+0gd{FRCvl;35*M1padDv-7Z-{- z2-Jq0MkWNOEtP32W!fJy?W{}-Ml14bY2BS)TObjl8*mYVTkwCREw1J#LJ=uxMeF_u zgE-Xq7?CKjwpfm4q~>3NkeYubLTdh>5K{BgIW_+(gw*^*r{D05kk*+=MFR%-#JR1;_ zIBZ7fif}u^1_*Z}Y=rQ4gr4HLH^N;wr#c`$YXQW$cw`~Q#e-s8JUDGS&N+?5gVR>Y zv{y0>Q$-QSG*OAp!#B$9-kh)JjE}G%znYqUynm(A>;0TtJRFG>5?J3E8zJu} z%!_+(!=isl+=7ckOT^~j=PU%_?>H8dG*}?cq$5m>Pz}>TB0`Qq!cs_A(;@KU$lAGK*U2-CYn$buABz}h)AxGhUU4LK|h zBfYqsj8q~?p;04Cwo+Rtvl12*n$(d1g)mw02fcHlD2L^Q|DignhacTFiIZs8Jrh;9 z6Pd<3im)+w#}RrVJb};`;c0{|#B(&4a0=(trbJhX=N%9p!#TA9(dj+|@Z+1vD8@ID zQOrSDD{>u$U&NS$a6qOVk!jCl+J7>wEF^%ZS3!(92&CaSjWis;$9K3wV0+6}A!1o! z@wOr$KTP+QMS*PUESIjKm4r*Ow8_r$(5z%GWEl{mcRd;;jWZtNy(yrysg+29xZy_! zX6U&TqI>7kJ+XAgYPUb)TtQHbD+r1?uztvC^Ks5;Oy6Tad$7%@eVN5dulKxbJ>u|N z>h)u2*<{r5O#89pD0bI&Y)M=tjAwsaZ4WOUxc@DSbNVe}(pIqD=>LroC*^0$7D@P` zMmwDI8YkJ{G?I>f_~lJ^192uDoyCaMLrir-hzZ|RCq$#oO?3jLNjiblvL|{LKV-kL z79Rx47PW!dqdIBn@!9B_N+;3?mD!a|A(5=u#(uxTFNjmrCU`)BvQ3 zI+1OIZ8@3QF-ZXPEkKk2ZML?8Fi3mVXnEuPj|tK3Nf9+?DU>x6!@LrZQZal)h!tG& z)R;dr)Q2U=|4{wb!_NUf>Lqmaf@G59#v-hMFb?4-2;&jfN0@-HAws0XhQ7WCNw1_L z?1V54A+;AImPz<%#JT>U7}p;ZbD%ws^q3oHKZ`L3_ACvj?UQNuWZXlUMuQ>8*@!W| z<%ZK5%d~znE>)&&lW99;8dYa!p?vx7OTRn&yx+mlsVT#sXdhJWRS|T2Uiux+{Yy{Y znmu*v<(?MTOZeyUqqOHwXSfcjvu)Uyk$p9jI+NODhrWl^#%WWB&T2lk*{cS-23PF) zNte>gMy$Hu`jqq41-DMO{^8pZkE*phvi^1Y1m&26I-4m@om{7cTl=?+F8$50kw-@T zwq$;drOWOuaD6(j;SA5JUkuqBaP8HUpt?14NA(=g_W17){`&pVz72bP&y;Tyld{m^ z@{qw#?Jvd6+m&2t^n$R!($$8I8S2<)>mM6x`>e@aIDN*-qbpZ=D%LFGv%U&uNlotIeJcK4xx=jEmIW2O9Cclx)7mvlZa zYS{L{hu_NgU#S|iW<#&9c z*~6Wt*PnOVb*hca8E$MH+gm^rr@8K~;P~?h~?9?RpTBG?6FqlAfs$FU{?{%FdbWlp%H*|-TLt_em75tw6e7#3F*+tL5D5&S{bK9 zS6eGc7f{aX3%a@H>Cn~I3R)48(y=#7hqRNmf^-a(`HeE``ioaAphZ8>e+dLhr6>G&pq(dpvQNk>pQlMHZs4=Og=Fi&)Q_D0zr5T3mnQDrT zQfBGUfMKm5T}oH0R~)Zmo{kg4_yQo+PZ_gxXqd28&|gZYp>Ik9^K{BFjGsX|WzEuY zW*8DeD%bdkBe;lCG_2?H46_auNGa0cY?cm<8e9&ky|RvJMwzEWdX>weRL>R6(y7ES zb@7+lt7g+uUz?{x1G}|i39>1rQ^_nHR4Xv9Vmg-Fy(+^*8Prb|vvg=$VXat9`ai9V)f80**Afeq7Ab zsa1eC|Qz!+LfzOQ%i&(jlp^R?IiZPaU&#$g+7~J=ZtOPd&4A z(4F3!4)tPd#d+jMYOe-n=`>;(GUxyk2D*)0Xf8jE8OE@F8kwcz&M;y07r*iYqr%P8 zX~HnC4D#b{mW~I*P+zC~C_6PiYMu^_W!8#=_)Ahuhlg1@UZ7el$d)8bKf6|=%+v8^ zn0n|Jq|xZ`l2atT!w(nM)9HyF>5wQs5BBhK>xhhf`$&}Y3rIJj+b|H4S%aj%(#a^a_ij-IUqPWW&Xb5@1H@W=2UjqkL&bS!qVuXGXbU zMzJLW$S8;P%qae5lwM|(L1vV%%qTyaQFfV8ZkSPCn^CG!XEw@nJ2OfbGfIjXWt+a;jB*1Msz$nk zU-c3cW(CU>JINdb1=c&C7wB;!kcP8XNV9OF@WVZ}Prr<2T>mu%iCa4omxsSnPc=pmm8!%+#|N>lzU0 zy(!#f#vZa|xgnZ?Crzet9D5efgvOoErk&Y&06%VPsA= z*vDqV1%Ujh6O(z;{~ci!z1)&Vq-)Oi5b`{9x03dJ@f1G zL`J+Wzh*W{*0PisK@5b!h@K}8Mr0F_Fyfg@g%R6CFpPMnvSGxuARb11ixOglFcK0| zj;Wj&@eM@9h;Ae;MjRu7iL~7IMr2EEZv@C|dy$-9+nZfwt|5#d25oOd&ue=lvPs(; z@yy%ah;7pLMm*EDH)2|7dn3NZwl_i;wY@3FwC#=f25oOdH)?w$j@d?TjF1l!`{Q}u%u%KEnf=D#3X!@`hbLG8GD>@}BnbR^10U3fr6Q8C&&0X>i&t}bi zoBR4SZ|aptqnM|MN3&+lTwGfCHgDn0SUnvyifG}XZ<)9dtV$>q;y`TR=pzbEjqZ^z z$nbC|BMs_0iQH%po)dsKK>Y`&(6q}>DC2MFaw878GU}h9Sl;1MCcLMi`-M1h$d5m8 zKm5sYEeJn4$o*w0y%jL1W6!~1ago88W5-f@RdC-!z}&pVapdN) zl%5UJ+i@As=3L=8a$H$Tk6cNvSMk6Jesth6i|Ga9z8!#>dX2%DBg|5I@k+$boqRm=d=+j!Z;L`Fn`; z8URz}F2~V?*;09%fxZ)%|3qAV_4fqnmAZ%ez5nj?@LaU80+>4wIF4LUmhzW`jJrI- z^V?52j$B@r^4A0D{rD8+{g>m=1uUj#1DpAKV19VXai8RqUN6vXFsDus=he8(VtPKP zh%bTp{Vh+A?rSN3Q$UXt6vA!%=pf77QhA>vy(S8UP}hdzNX{&!7YBODVhW)@estuQ zzhI;{6PUkfZx0S~q*_X^GjQ|l6~a?`asmgrF)iiK1yiLLjtZeNJ=%byK7N+cTLt=B zth@KZLrrwh49ik_HfZ0kfSExn^EjxVT1t;xRedWegz5Ovf$UmLFAePFz*McwaryNR zn%s;9<~I?SU;fA${t%dYRe5^(>6g|>?{i>&6LI}J94Z!txJb9|jAcAjzA@C@vkjg2y)Zbhg7&BC&UgoQ~vaNkqRg9)6}c7cg%Y07uJCc3t0} z9@T5j0^n%;Zd3rAJ8*3ZfO7$^UjcFB3xFg2xx4^4__Bm`1;Et>Zc_np&cOXu036BN z(*ocqy|Q?!(eSV&2h<*Q3V@^j+PnZbTF&cG033~PeF}i1WyZM$z>z-PSOA<0a5oBo zqk6XO_Wt^#{_#lxajgn~qk7gA07vtUgaY7PfE!!@9Hlp>066OBYYKp)a%?Ri?sx%k zB+u6^;S8L{fUu2QFHCVXzcg?h6OQcI2wGV*JfQSlTwIz2s)Cde8ofsC-?CN~eQgTg z*Q%8tnG9Rl|Lj>BouHupRKPt_a8Xs3h`R8uNoZWlk#-j+e}7ZNl-EIc-chJ~F4R38$&dX=lP|CUg8u zIL&2_(uCtHbNo#>E#O+QJ3ZtH)f3b2}JwgTq4duIy;c3s<&R zMTEX)V;&}vq(=cPcR^2{0FGu0VOpPiikJrhV#}budC9zPW;}117iGrtk$K(Ccui$q z4>MjfnHO!wYcBJ8n(=&PUW^&9h0N<^#`BPyF4l|}uF|T*0_CQQHwGxf!!_yvrCuGD zCy@!pknpfBsCY>>dK)t#8>&tbN{vqL3VnNJCMPjDD_Oo*f77eH zWLCNB`Tyj=dzjCm-AeA!?VR#S z&-;y1=i}ia=VPWZN~wX)QyPq4vyAyz(9o(n$&EPMm`f&#N+Va?91|{6`O+vf*O-Z+ zH%u$b+_%O|tx6xE4fT>$!aQTPP8F`yD)qQtG8E<;1Huei`a2UAw3S@x-y8GT7{$d) z%Jl*hgcfoumv^BtQx$2*Ty4xmbD(7=kx(I&;lag9*3`4odWK8K%Gdeg(N@#-_h!XPGDg#tWtxcHp3`o-WD^Szs&p1j29sDwwm$s6vZ|(US3|doAH8VvH9JM7l}?FDTp0rTt2W$ zDrToSU!@Iz)gyPqU1kW4N~e>%%WgAvd+gL9qe*JhJ!S}H2s#`|uPkSK%`k!fnmm}K z&i0wXI>VBNC86<$Az4?HwEbo%BxVSdD(8S1Fd$3=lSHx>51R3VmAYWLZV#EUxdcgi z;;rkxn@JuJ1_;-xI?E~8SOB2Egv)?p769QIWu7?L zS^zMEO>!0383RI8foj-E%xIOY4trxrmo8o8;ukk&g(%f|g5+S#Ll+K+&@gjG5=BQ7 zL|6#+of%A#N*ME%0ns|lt^!?$Ap*8as#l21xOGkKT_jM z(pl3Orwa?xGq;g6fp;0E6;W$!sGR~gkh*m*N&ng$M_@{hw z?;)P0vvc|j54>3ko%PXbFZtY>o%>)(kn`>7++U~H;wd#wDNYoUS0#z6lSp+Ss!FSc z@kiyNq)QN~vr?;8!k&|eC5adj+A);efl?;Q5K-+ZpW~Z_IQL}*qLkd|9F|2G`a2bf zWgG=!RCqHxs{*md!p`X}uz1wHt1es>5FMb=sROYT%*hIg9HfTuLa~$AknmO#BSamd z(svD4$sB8mLzjdq;TNTQ(=|2{CtMrW9yg(GLiA!X9l8rXPj(TBksll;Rs!-L4MR|e zp(Q#**@4cym_pcvYZU?p|3IBysgKY_(;QwM3R6}W76E&h83Y8fG6V&Lg@&S&0>{P} z;#(W?wHO~zX$(L!DgxLT0{m6&aUV2RVQ_K)1A#fujkgXvIy+Xn5w2`@G?ZGblk!uObJ5_jAb3xzXK%wo6?lZFezl`+Jj48|y_KAa3uEVYPmSpdk? zprpzgf;eAlehE^}5Q4iIq$1tQ*${%hq7TCiN31z!U(&708-m~h2&1~kmlAnKDj0In zdDKB_RiJsblAnSSt7r)4cj96Mhd-|@nxYf3k|7cXF~6-;<&_P&R6EEM-8C4~Mh(oK zMq(;e3~}g?ddM^B#xR|l+{;S69yX4&q`6KvPC`4OHnx zD?LCbUW<62TuBd3<)?S8qCho8bV1uheL)5wuX4^>0z}pZS9^tQ1>w=+s zWz{b!A0I=UXwj1ikcX5sbyGv6PN#{8j1EfA%#*H}mmVqnp8)p{~OWAd*QV3=-1Ig44qAYFxuiuxRemrz=}p z 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%0Do+U3f@LtgpX+V03h>Z)m9E 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

          i_XA!uPG9@E3NXeE}nmDrZ3#9>M$ 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

          V{S%co^|k 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�igDzK^ws+#EXjmk7#D_>UCKvfs>`f<_q zuvY%8s)MQ_)TXA@e6$+Gss*u2%C|)dW?Gl(l+KBzW0ItG%phfvPRK zTHmTvU8_s1YJ>6?Dv^)NDXm_x@&;8$s4XA9j?gM$P8)4?K>3Jy`K6k2ORLjfR&_!73N<@p>A6~UV&w~}o=|S9-bHFPf>k|G^@ZwRWKt`w*0QP(s)0~# z`vpAL>I$m{F-rd>bz4JHuE}gR>%Wa)`~UWh6=lTVQg0->N7S$8?Q#ymlzm@eaQ z#5X3Dk)OX&<^_FY&QJRTd05#q>TkpwstGCel0e(Y31gOP)tr?*BmW+KQ&QITa7ycA zYVE0qXdA++sRLaPjjm>-QgN<$SKDme6~@Y*kt1wQY7nc}4{oXZjX3;o$647kQnes8 zk8@3nbef{oA6E8^R4qxV6PUKJe2oWd<)Q8s?VCNLlz*Q-G5>C}wIY?!`d9JK09KTt zuPjxM#8tnGdBps$A+@IG$*R6)pI;vDC8PCTJ<8A1+Tq_# zTcOtMNaCT@Usi2F`3aRW(cM6;TyooJ^8@8CRQ1INe`{5Nl|QINZotlEKU zFI4gL#T#ffidB119fX>=_K`Y`)I+o_VbuXtN1^`n9H!Q@r4F*{2&$7%zpmGvsMT{; zoj`RKYJJ5*j#{P3Lj$#S2GvEVG=F~9)T%J6E}*&!Ri(?k6IwN7)fH4Xp<21MSEsCc zh_(T&x`FC0RN~$7KWVj^Rd-N5gxVVa(r&Fzu<8M-r%+F)Z7r$QGgdu8^%Ckx|G@>d zN|x6~TQ5)nLd|-cORRBDp<2yn)dy6N7-78Wd)2j6Jw)4KRzaZp3bntG{l6J!sn@Lfg6b#Kt34?mYLzZu zOlLn(!9ty{f9R)H9;|{vg^;rLVb-m?!?bF|Dg;!2p;jjA^-8Outonl*AV%2tP5Lcb ztz|U;)Ig!SuZvQHRS(e?$!Z{|K|+-+KQ2_OSF8qs8Z6Yv5p6DL<(NOFb1}i4Fxrfl(XuwzgFIE^E+ItdaQRgEm$F=&&YBZ=ZVuU`Sf$CtZhiJ=MAm*QA9R9sa8B5CAhrL>z zch{;YtFfTQiLQnd`YhC{C983u#)~eGGvNod>dk6As0pHLpYK?87o;AdZ3e3epe71+ zyvTCHU@5!56x!eM>;f6?j)t4W|HlS-mSWMA{XvuvBRdd6xps41jeSk>IPJXk9S z^;%}%ra1h2yrzn-;K3KSX_b-HR8Z4MS$D7tSNIxt4kcMl12vtLwKi5S+VM_z)nYXr z)C@7N*(1Bg*QzV48K7p0u53BluGDH6tC^r?k+Syu#UmO2Xcfk47O2^xtA*QZAFU3u znhk1>P=ik7Y^c>OR&zkj6{_CHzf-k($7(L9c|sMaSMfisk`%JhHV@Q%Qr6x`J8xoD ztz22n2em+S#qVJMG+RAHTLo4NKrIyNSpP5Tl5eRNtQLY=B-DeBSt@8XoYf*wi-kIH zyLKb3ma$q4YKc%gKMdKd)d5yZK!pjF!e>piR+m_Xfm$lm%R2dPYZb+6DX3*aHNADF zuU3iNY_u%{wOptRE1w8|mtR)bnYDw8ed+Iw(qz(=jtuv!CZt>~JXamzZb_Oee$t!}bf2Wq`gPQ^`JJ05uTiUC6`uzSZx5ckyK7w%-#qXF!!!j z*$S(N)wa>$-`A8)q^#rB>_CayS`}lp2~@b4SFWz3+iTT;RXC{4qAPj6Cdahu$Z9jF zEu>P|V&+xk;r!-Wjb*h3)K*f~-pDwA*cq*sv)T$OLUeWP_x+kydssz)+D6J+hu-5C z_t7en)izMuMOVeer7mjql+|`nJ49F0{_AFG^_SHSP&H5`LNmpYA-44-ln>1R2{84u-Xf1 zpXmCL{oyFB2C&)(YQIp=#@4H;)ihT7K^-7v?Tx0nH{8%_4XXp74hnUD?I?9~sUD(j z537Tq4v7(N$yUs`)3e{(+qXjw|6TzO3w5gY`W?FKIjh5Rs z5r==fj*6~CVNWMℜq|P{)MI(=MBFepO|44AgOUAG^jH|&Hnc5j_yiV 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 t}a~HT^T?A6ri0*{qlZW8pHWa#k(Gp2FJsD$+ zX#0duo&rVX#t_N$p|jwnBh}%o>qFr#EO1K2MOQRp8w!t>mtZUL;Wr2AaIFunyum&R zC2HOR$-2vQ8;+7ES>2-GiU^#LNG*ZVu&`98fE5)ubja8>U_wjOU=XC3fGE+o#;=Kt zDK0P(F}P7j>3mp}R>LAIk!5cZT0%H5BNMVFGsehs6|M>59{UJPY*dKFtnI7|r8uA< zg>;k@pGyi*IIhj4sucATYxP*Ai#nUC2f65x&!vQe7;SK{F4PiiGR9F)o|OK}Mc0&F=t5MU+0R}%DK z%Dotm(WPW?9vK~D#vN=PKGzTe^wEux;f7#T;M9eth$Gh+V|Yo{S;8>V;vL??Xalga zWiqgufRzqZUsPS_Sp7wO7s1EfKPD~0%c4pwSHZ&I${ZtCdc@HP4!cK{98qP=ZuL=E zCSAB_dZ>aYrtplI5giSY|Lw+B%A6id9CZg-1*W40#taXm(N{rs>%xltcBl&%3F$*| zVY!@;$^~&${}3BpAX~OBPB=vm$cBeZW6(#k-aI))Kgfn1YSM#56HGH#IShlc`JlHG`Ur$Z5E(Y8N zatxb3&_%^YvfM>P7l{*1=!fH0KN3M?SD7qdTt^iFk#Q{}6TzyFFkHjT`oP3-lR2nE z(RhSJuu78{g=9vEF$6tQGg=5P%3Y>o@S?R+J!C2_BSs}pcW2%}p+VIdVhIV=g&0@> ziG(SO5KAQPUe;n9!NT|L&UqlwdpuzLRh^P#iWWQnGWvMEC&aVYe}agm5aEh6AF z>qkUaM#M3QQ8Y!0{+uxux8Aef5`mOSZU#c77)47S^6;Ga%H%cUo6zG!gUJAN zt2F_X8E6Iw)?t2988Fg}DjS#)OqpnAFa-gRY(UCdxqq}G5EVn6OQRW+^TsHwVj^ip{;s4(BfT-DZqh~L{$eFUY;A(%R#qcJ z3}!t#fKj~1gh_u)Pb%51iW;bojp`VMSt)B4qB&lYS5*z;)dE#FY+jG})zo~GHckYH z=7H&kO~C1U&?CYqBs zYyg4L@{+4ajYeud=D%r9OJ19^rbc5qZ5yk>sGH1~VMfwA;FY9qqQ=__H(M}(F~%Vc zm8|8b2DAE`76(k2s8zi8w?R0RM5T6>loljFjc3^%i+Rxote8aV&5>+ysMNoKYG`z9 zut9H*K;0{X`a;Xr`3%+)|Bh-ZU69G{}*B28o7t4%uGt({fs1PQl=fNM0M-iQ8a zzMl{gwuopg)}2_#k(hd0CVEFYQw(}!+-V0}ZiG?ZDMKzh+VY~YY#1BOrkvWBpnOBe zzK3ZI@Qdd5h~~m*SgGJ^8zdysRtWmrtoRWt%9cg)sdX07GTQR7Pb9(`@Mv46L5FF7 zB~qPic}ytP*5s+lmWK#YT~8ddEe8{;q~s8EEcnVVVPb4C9iy?J*IAFw1a_YR)W{Vfye7wQfra}k7iemp(5#0 zYysF}fc`We4Jie!r!6EJoiA(N=w-`9-q3Zz?66r>1HEklVg7-Fm1@swDp-B&S5D;TQiziZ2+i8LYfJzHKRsZFVThS~Bu8x7c8hB}l6AXLbPJL9wZSCKH< z7J*WN$tdjAqCP)K7~{a_rATXT>gUIncJ{DNODOhPvE?f)saV4|!`8Ky<_^%W5y>~x zmXAdsldcnsIZ1Vqgj8CSp%>wDmaR+b3+edE54m);y2R=Xb4W=`ERB^#BNCc=6KOQt zPAF?@lmwh(%S6`zyYfiUB-PC-RUb(el|BX)7B-HE0`QrwbCV7mmZEsak@WnzE!(Wa zenKtwI*DvI*A`$@WxIKHEL5Z-2h6wSvF4NKbtPU4>=4-e$TtpCuol`fb@6KEN?RuK z4zdKzRFTV7PMCgdc7wRz*m7ecjIm~{6PvB^reQ20SKA^n=cSLNPL84l|Z_4Q4P!)H+)j;zivVc!*vgO%jr*^$r-;AL1ZI&;|z(2?{pR z;;tg-TL%mi#6gNOzjFX#laS~seeb{x)`oP%S~0v)YP5|G7_H!Ka^M9E-VYAE5W(B* zz_Zp`TO4@SuxxeUg^6sl&4Cw>LZH-E+a0*P%~$HX9gch*Rw6J}r}XB2bU+wr`-vi8 zrvn?43uq%vLfN|<5ZXwZH==!WG`&fgW48k)G}vH;DRt`}2N;pu$E*Wa$sU77NRVA zbB7%O_=tiwbMj5LB;$xP2&PYITY%D^Kk5u)J0>{h41$FM(WL$441hWSTfNYCP!i{7 zXDBgvP)hhO&QS6gM8O<)z|a69k_|Ex<)3iC@JK1O#7XCTQ-pwtOFuK7mwLnRw;{i^nxwQ5E6qg83|5v z_d$_bQ%AnLm9j}GTTC!(`tdo3nf1{XNu^(eLQh|*Aj;Tcoh8SZwHaUtGuAFle3z8E3^3E{`kkVXKuto3%CWTqimT5NVbk^}+C0i!?(bgH0 z$__m1++7tr9+f$hjyB}8^(xYLRVNVIkESHPk~^!};>^ad7&fD&lwMy)zU_2abz1;y z!<4L9!w5c}=E6S`{Bp!C` zffuF2{D%cy1GeIYP5Nf+QlP?45bV?ggnc++4^e!;u04{1wI2)uqrxzXiNSdq+&MPy zfyXvIlXEO+^SKxrF7gc#Sma?}p0af~@)7&`-~=Om6kS6Ymfpf?ZB72XhQ6esF$}c| z1jc?pfMcWBwtIZcrVYjdGn)Y>F82LV$gndUVo;1?SZ2Ki4yO3BQ)v+heK344s|_|| z42(Gqe1*j-Lc$cY#jr2_*mq@=oCGLt3y7eP`Dk#+bWebiwgB2Y&IV?MunCigfVojt zW@&dMv9Pxrfn%)DC^H)^6B(Px6|z3Mb5lXb7IGE6Iok^vf?Vq&bwuN0G4N)KHYyU; zl~YZeO4|{M8YE*``==0x$xue5J&J^sT)0$f?gY)1(eQPsisr^~)bt6QC&v+u@+}L` zFliX0@)>bf>D*+K(D?F#ayV7MNGTLb`m#C7Xu>#-b(sl;-LKA2%IDX`;K{E@2yCp3 zvFHPkr2JjO-kajP4gT&)@4@)?hAEF+6ebE)hiq|_X2yx?MO5r#Fq+s#P9hZ{5@rkZ zS_~IRb3`mkL?u}jPfHL{?=J#Tn!UGV+95}^=w06QOWGltE40I?eASWdwS5jc=CHe% zF%5w=Pi&W9TYia*t;3v5E5Oump!srQVDm6%h`kO92O6|GVcDDfCO6nW%sI4HDt`w_ zbZj4%=|~yO_A^IRUtGc#cT_2C9m=A`m^OyKPZGP_sUjnYvQ*_{nW`Jhw$wk8KZv5L zOkPMKABg||@b(=5O)x}~)>-#f+}8E~ocji0=(iUBzXxyRoX_3oo_p?j_r1q4Jt*))-~dn> zu@b-+&%Usle1;ry99%*ag`1Z|lZiABch>BLvtl%?Lq?lq(ko4*?SK6)&)KmTy$X6Y zM4=CcIfHRJ|-X%F&d$4q!;QN~2!(>$>zl-Q1~rUsb$4|H-kqtViD z&`3j(%ME3=bEe8t3(w`yZ_0m~IbpB~*)NCR)Ls-1Yg34|o$~;^i9s6{L4Bnver^N6 zsL>0fhYBx!Qg(}gzsAnl7Zut?<10Q~N00A7iL)_+)-o9BA!J%*ZpR+5G$IwPJ`7VS zT4hcZz_O;nqw#nMnZb5~0u;Y;kRF<6Ijn~qhhe_TTP;3REYx zOkI>S3m2RWov18q ztfRIFC!I@cjNlYgva*(^`k?w|@wY*1E7 zI?L>%Rw&P`NW$X{^!qbJ#+ufP7CYFn$M;B1#3!YM$2YM;#lX@dQPAVLYa`A5?3_JO z5~^e^ePbjbB`ql`U74Jb1l!ln*#|tGDK!z_W;gq#qy@#Mg=Qp~(h_3)O>y|pjhPjd z;`3)UN~Li`jjFYNB>0rM2oxYdfv3bZAIAlp}LxG*C*7SHF+km^Qyy}2B z3eC*oJInVpTEhxsnAa6WstQV+h6ao|?6DE*D;0#I>hK*k7F#`}r`GbB7ps!}LRC_J zTo|9V6tP`UQrJh-J6NY8HIIts^*qb*5uSoXneHHcC8silYasO$MLMEjA47nA5_bT8 zN3eclk6+Y7=ye37$msE0YDV_#w1z!)hXKrvnLc7yB#Q=JkVb4?aIln1k7uS>UdU{q zh7C3i!e{Vcs@kz<*u=1S8KN)xRZvti9=YK=GSxXfxW%5=QkybOi7Z7@UWGavRSz@> zM>3AuA_YYYERf;66&6g^sl`}xQE??T#8^}rRG%yrccF2#_-L*vRvk4cB_o|R0x8=t zHdwIEPtOn`6^qA*n2r}K6EiX>A*v7RSCB;3u^QrcJ0u{?+{ge|1v2jfoG9RrRIf; zR0oNVq+jWA8zf2hc37I!LiD7J)YqkIqh{cZfQh$jDoe|QENOCD(0lQa)g zbW};MVgjrY`AVWXrKd3{VMSV6)F7TrvP{;$D35|HyGd;>jIXTYB8QX)OQ#kB-sB4h zg0Di2&S6vr!Ma4g_>l&wal9HKL6Gr+Aoalt)FTDCrD9y-BZG~I8@H_Qo!}|-5*;{F z`Pm9pa4O({gj{P}UIkQiCE-ND>%zOB`Q?!i!eFU$2gIlR`qK5>U1sa`dAcxCnHh_fNlzrGnN zueTuP`nFvhN3U*ok^klF+C|%IaOz(N4}EuOakE>e&mHqO$Bmjee|cE#wH>dWz&ZkC z&_(XQt;Ua4Z@T{Ma9R1ZOJM79U)#O-y~~!!CZkfb?8?7+pN(`G?nbVap<>l5TlT;@$HST(Y9DVt(%8K1_qgc^J`27`e)Yxqbvy0w zl0=64s_N*8Zl3$^{o3!PN3TZ%YrM{y?;IcO(f8uBiWQ<2TjDrw8^cA}*!c|hoPJQ< zQ}Ob_hEg+nI(@U{lFfk&&)$7++PAT74~~1xaFbgvXz_kxh#{rZ(Ub3H##~x5D){~0 z{rhSknfBmO%i%xN<+zS`gPM!HNx+P5f4=j(X+f1=F574OGS*> zx_Qzxyxey+!>z0;JC@q0ed+#XH`_kD~P!P20ziS1k;y#A(zs&o_QbrZ5Ut_j}A=px_rL;2WXo{Pc)LCo=AxIqBcBHrFiYi!o=~c7`xRnYze- zyFR1u_2gj-Z~XNxHQufE$Y{BFy%cJE``PhP@*v&Kc<_xIP&+wE*Pq}T4 z^d%ShlWVPREsxUe_BuTxIro|A_sPm(J@@sH-KgMJ@9Q6H4m^w{4-9u(r#RR*dhEO3 zPOKd8^3L{|Yc3tm$kCkM)A(XS&r#jFLtaiY+}vf$!+NPMp1wPxMy(6;=RDFUbzU13 zQAU$HwByvL>s!r->j`f*bdjspHJ-Dv*)jd~m#;H!oU7ie^XtLiv<=l>^5}YbR7jT` zUykd;aC0^_-SgUa#;lsv?mgSN{)S>>n^)E@hTNse+uoMBJK)|T+|OpXem`g4`Q={p z@W0M2UD?DnBzBle0o3!+0)DQwyr(?eUCX;qc^=j*R`fc>6P=J_K#ls*HM(?DZ_pBcI2x7 zh4xuO%&uS7eE;RE_M?Z^tLfY3#?`Nu_vY?=(-y-q-ZbkXKc+Cf+2J=OtYu=0(bix8 z=ukcT>7n66_NShk)a3T;dn@kZ<*y8vy4txR*WQrcVatgHt~aJ^I{zm4()Q2f6GBi^}FMfzJ4W;p+BIYqu>k@W+Y)^D=w%5C8f0_@!q|Cu;1S zFn!E%lb7u@y!4ada@9%mC)`MXqmC-q!F^AvVRQNQtCr1p&@}p1Z-ue#vf5bwjyFEK z$oI5v;B@tyBl_;s47WF~Fz7FDx$pIplW)@+PF1e%9}$;{$ri(9RSSq+HL%*I{ni5x zRUUd(y{=}0rGJ}uec%2xZTvT94|)0S&9xgi z{hxt83y!@C=D3Rtw{5BI2~A5MtB#)PpZpH}Iq7lIttBJcI~i9cgt#;qP(7F9T+34a zrlnsoOzboB+XUBWmOEJZ!*C<*-gPehRUetg>%{uM ze0z)@b^C1Fi=J6`ZE{C8o@+C9KgS(qxOcO@o~U;j`PJc{hdw-W?m)-g-z?r=v1R1@ z+ACXJ>NEDwDA*BBl&*Wk>PgQ!bSwR9NUtjQo!;iCl(jlH+W9tp#M`Tvmo2X}8fHAh zH9YIox7-rdnMXm#uUYrB*;S#r|HH3td>!!Dxulolo-Kci7p5}Yfy~IgLn57i9RBxu zSEr39d_8`s=fmA~oc8!)SI(-9=39(g47ayzh2bM!jve))rS@I=bWMa=+oIk#13wF0 z-tL!%6Q1At0nRY!R2TW=w7bKb^m;h&z{p&;{b_rSO>ftr?BQ`X!M}HrJ-7CravWwE z!wpR@e@WYF)19`Cv(6lNS!(fO=RWhk-12r~dMTe56aU-G~xYrE#WcK(M2j883T6$B>zox$V!z%uGxXacD zquQ479jW#DaqAwu=oVv*i@bB4;Sc^fnfm#7)&99nU1lEM^<+Ymb!T_ZettB4^qrH9 z)fo2~?!v~GOExas07cuqt>W3|gZd<9Zu+y^UA61Iedia}`UYbHS@kaRYXhS)n+A7X z96x{3SA!;1A0F=!X1?5E>~KTZw6$OE+1~`uKw`4xBCkB`wtLgl=l^Lp%k6lBZM)yd z5AAQg=v<4`1BYFcOW*3?24@(<%}d@kV)KSpH}CZCa5H6S!}~MiM%Anz^?E?+;NPyy zOti(@P`5MOk%h6{4|>N}<&O5AliDFpuTEbs|K8N>^wwscwilH51CS=>t}gOh{`=Ar zea%TP{FNJGx}KL^nRocXu!uV@)3TmdU-H|!8LSDU6hp0j$8b(G`2a*YqJ zSeMpzZp8c*_T|gesD2M+y})o@Z>@iB^ZhX&^_G_JfBJTu=Z{ujrP$7u)&1d4*BQ^A z)_=`$jVe*Pr+S)Sjy>~m*xN>Lu4Xo`=2-K~rgi_eZ>!w8;lwz{zU>iTI>Wg*sD68R zvj4snEf@ULe$3Fl<=3~l^lV>~THj2s)pq03>n%C%EW`Pxw&~n_Q`>__tC#u3$FXmG z$GEdAdi0&ssgv3GWcEgQU%7^rDP6BS_cPy_Zl2eV%Bo@hj>nl6nV7hE(``1^E z4F-RA1)pzXxRfa?&c!d%1P&kNP^$FF8oA1!hc)oN95ThWc9-$KMz`-^H!+;jcDrh! zbsNXaRr((O=G2?9N3XUTbY#NxwTZv4oKos1e~i)Ac;m2(yk4yZY1>v+3{9NdG|#JwR=ZQ zt6KTT$vZHgnagmx1xE+$o^@tOx!|$m6HRCTxKV5H{T5#b$L^F>obfh11%2`z!$sG$ z(k)-^HnR2SyI1tC+OFl`>%CuZ8#3waxHZEj40wa3gIqA)1neU3SMK&BZO@5Gt&`>? z^{x5Eyb){rxRk#ZRaDh)|H!bgcb?GYib<=*RJ}PAG`18Z|M4!;zKD=^XlMz2W!sppA z7k80|UaP$RWT^7ko>P(6Hw1ZX3ifB)y$fi{chpargnc_9J;gL(L;8hpWwKi3^#sfjQ#duyYCMg_;~lZRZpuv-}*}Z zQ^1w1LuuM9htn_*xN3M)yNldZ;h@diRc)>YMP98t;&H|0X4|c%z%M5c`1Z%(JCj$h zx`CHGGu-8{;Q{UM7%rC{9>1lE+VI7=5ra#YdB0)))&aVGJKY;&lDC54a^6-Sc-VE* zsSXpaKCgadRc!px%YDqc2UAM-U)rW;h!5rgZy2ua)Tb{S4X%Bz+qIg#M|s>je=}WK z@8_v=7EBNQ;;ZTn)B`w9i8h8F-&yhAS3U1e>ZNfCjcejQ?%T0(sV~17J7IpSkzc)( zABBA|jo}{N&FUDkYyP~Mlhh05R=FM)H{jRrtiD^Y>biD!t?wr6Yr%2n7%u+gm?_*3 z9*tYAH%)LF8Ta_d^L>sCZg|dAU%PZ;i2nm;%qx&bjH^L5O}{&1yM1!Z+1H&C!k@U+ z9dgrkf%ht1+pcT69&)b_*Du4}9&^QJl-w_;+Q(L2-iQHHJ$IqoIHO`m%~<+3E^%UfqR$KU4Kjr;q?30KXrHw`+UAJr@L z+cv+!uK-)eMP9bn?-!d7Ufg8tn6;H2N4l)DsiAzLf9J3@#JX48v#n#Aa@<~qYj(Y7 zuZDvz_o}|I!Pr~D7|VD-Jq1;SZZK-lH$hy$ZXD;nw~7=h8{nhqrLMJLapTd+&M-Jb3p0zC|_5 zK3=fC`8v<0?V(Q@uHVYEokNn>)Nu0RdTGC0E^9k~(454kiz5gXm=*I zzGk)P^3t@xXY1dkUk*?tY+2LL(H;8g3Bv`KX}{C^&dMnVF8FL;SNhqzC5KKPT=V%K z?bOfhr=EXZwjG=_bt&EDm!ESr2L`wM^W8>u)Svyk?J>vgHji$;eEpqXm%C+cOof~> z+~>Jf-)6_2d*8FmHYa7u-pRAmw#Urw+G$iw_Z_EZEp7Y;A6Q_xM$<#5m-bGdUw+An zn~F8R$5xvZu{f~)&I_j!Pr25sf2kq-7WF9I7w1RMZagXZ-CzHVAHAwfHM=^4U!Cq6 z_548di_yz#9lHX(k->05@vWVoX1Jtgxc+gY&nc%@t2#u7{h7Ict@V{DReo%*odY># zxQkatG%Eko&F0G{`2=~I_3{(_&(+=keY*>*mYq9TFHVVZnp|-%@~8&Oy3YOSb^V%2 zYp*&PK+ohLxKdn`5d6`OnqdQk$Ful=`U77wh z8Vwxti*@@e!Am)A7Q=nn;!y1g&l`nk?tK4CP+RAuGQ%eg(5t%+TQK#{rUBL?fV;wQ zH~)EB<;n3&m)>?A+5Sk+`uDD%8{5%m!rzA~*IYlM`RBory2!t>dUR3MbhT!3 z=#0*8iRN)t8gJR=5H#2O(Ywo=5_Y&updg8=7TEhGQORCIQ+fcAluQW-<;e3 zd#jtjq(>e8$7}9bj$6xcBh^C!nhsk#G4%JoiFZ@REuX#Z%`&T%M;FzcJ+S$NZhgK+ ze`C0tUP}hN8UFI!Z%5C6{@LLNJvP4R@vcHZ!iF_nUiZE}DoMd{J`E^;u7KO3ie=6jXNHkE+dctO6TPS-v>C`UUje2@GeqZGMx;+wcE6ST(Ht;tf?drZ!qz zH)7-G<$PTq?yviLG5W_J3^(U$8<$u2rd>R1w{m8#^A?X@4vXK`3s|~(WxJKlFNewh z#F81vjEmgm>p^dS*-&~wdfD#l|7wvq?#j@z3ywE?Fn?=ZbIP{*4Oipk`V4oyzxm;+ z_1|yk9$kC(@|vSIUmEZ%;)mUnSFdUN?(#hI^gSH6iQ#6paLB$ptZMS@)^BdvsE-`E z(@wQv-eLJOo!#bL!yC^Y1iO>rR`=adz5R@%+ow5ww|3_+L+1&%pAFu<>`0ki!C(D+ z?D~DQhq4jnFC+HB^Iq@m9#$~A>MP!yyYSG2NrP5!!weap`5qY7dm-xYbA}7}DZKTI z-1N6eZQc5(eG^c2v(?&djw^$?YH#OjLBz)b<^+LrX z9XBp1Ex-0=McbwkGh1N3(5x|~8=bB1s@hwlU--J*(!YAusejsY*>{I`POR;GylMZA z+1GT?_Y8MQ-tx?s&Bi!;M>Gx@chjq9rOA6neAy$iRQC1Zv-V!Q(&I~hl({#Gw^!RAEt<~Fvq*kh4 zb>nxj7=QWrMtX1TWHrA2<+l~vUzzW7v1hpU+siM_;c-o~&aJN6w>R&D&dZ@u~isa?T$<+2`KvERJgro$n%_l3Bs{ROYkyk1nN8nE!5+ z^6;mAEq=0X-(!7B1IIv*S6^}5c!ry__ssV{zw6nqcef|srl$G)x#_PdOKb;joe^Y5wlngLY&0 zyH)e8H9r^a(VWr^C_lYLa-3t?{_m&Uk6V$jbi8BFV@KCbs`;Dsz})!Rv5?bl3^!!3 z)#YuwE=4z~GiTTNk#loXK7TUPE^}J_>izd@sAO}aBgd^|xH`4Hj}2b=!1tHO@?Re~ z%)i*So*x(MzwPAx!0@Ej2H%$)_k!WdeG%_w{c7ms*$sYanbG$A;zsq(PY$noWK8t< z+sbisR=&dx9M~`}^4qnBJqW3HaLiP<6 z%q?8xH8&m~TzBg34ue{6bXyk{@W!cQlhf@_ ze4g8+d#PH{yQf6pBOeU+bc=H5wUw1moO`!SH?+ymrB`Qn>uvMs&=!OH0*|_3zkQDU zF3{K*CN_pjS#yW!r|%}u{>h273@+gg^rGW?6LM$9-h zUAwG<=I)szIh`lBy&1V}r+>RYJ)T{J9&bhYyZq{FqhB@OmYlH z+eLo1+0#|gX*)KWuAiAn1e%`rrV=rJX6K9y2Du+N{56TB`UvyP2}wzGbSh zH~*aNYW=iNt5rzXjnW;|zh1-a+0$(&j`^vYp~c9_Hx<)QIy*Rj^Tlt=c1>v3>pJ{l z4EN2}KORhpJNhttU~c72yBB3-F8ytpe94gKx4tRWcXp3#jDt%VuIfRZb>)Z|qqlm^ zx1So;z2dpZj4a!pUv#h1dGA(b_pm;YKZbjJdB&KUo!+&oI^w2$;j`$&Hw*_y-I(m@ zHD_(|-VyT_w#EF&o$|-+PycD;qWUeb-Tke0zuWy1&U~L5*J708!`Ca1-5EPiehnYQ zVz|AbQ(mQ%8gX%}b^5l<$OrBI9(J`$vpNS(%~2{y+4bKZ5E z8@0XjyG;9>xoNu>A0E@D>EF$w94;Vlbv-EE*|nvO^+1$gxob%9lo45YQXenb2_YrzS_cY z^)}h8T~a#w%SO!(-gwixgQn6qj+YKN7^}}6(5%&a?T?+|=klaV4LVR$lHyVPCCcxQeGu%b#04ZmTwgJs(kicK91z&xWh#yMA@*`Ja9VUu$jgVP1xt zbnNoJZ`+0RxYD5WfWEJql}(#+XWUEoiAQh$K6-c0Dm{~7pK|y}nl}!9?IQ6hz`kiw zNiG2ii6*m44F-1gFf|*T9@`z1N z$tog|PswdYOj>$mObR}3mzHi!!a}ALA=_bQeC9Dyoe=4t5`&d4$!Mj%3F(ozbuCpF z-NrT#GN+r8_)L5xh&e5Wr4lK8Mu*}til5YpDb%K)QUXCnP~YaL#A4P)UR<#;f~pSS^Ap>MW;li#gBr4MJ2?RP_Ir+NlnFKoZ{xmQekHO2XRZwN=YrDF@_YV zDUL7DztmHi39+W4nxzCg4Qk^Vr(jz^2Vkm;6?6CPD&<1b8M!uKCJ)BntndD6xZ*0c9oPFN@jU`3!JKWLiu-ALFOy z!7+es6ykSk`fXJl~{~4&`0$(l}N0R z6AVD+%zr;IiZ=C4NH&&?4V@g7WHO^TdAjN&f+1S*F^MT=lSKypMG)$uyevrbvchxi zPa0fUwLvC}*{DMG$M!F&sFF?TS;e*jlOn0NLAMpZbf|SR*~=w07MWxF$CgBGiTyJ< z`QJ-ENl}y;t^>g|`ImwReGbtrZdH;sgP0_f_`h2l7Isl_GsSvAa$->ye+k;$(ge8p z*^P}#H_=qOXn8EbJeQcera$ZoQ{sn=uM*5LdMa$kG*fcSpyFp9dX0S}yXboU6iq91 zR5I_<%|&^jO0WttqtLyI66XJqVT`KKp(!OWK*aQ=&w&?vyn^1!OifG4EPhORI=#3~ z8B`L~T2xGWLMHn{RPpnM7?X>dIhLT5KoI*Sr4~P{q=yElB!55`eTvBOW;WeNC~mGS z#s*_nObNs&bl+5SJXx*Y#m!$*WKzt);z!aiCA#>U2|6x4KFt&rn~EDRiKf0$F@q3k z(eB_+YEAe%qx%)#Gl=|Uq$MV$6xUUSc=#J3=_#oxa1B!_OR5Qqt3X)ZlJOvTNo0wy z^%C${3qs#NJ&E1hD}H6cb(NTc!6~iyaz!_5W9Z&UaVHaeuHc}k?aTqU!8dUT16Mr@tY2kQ7!j1yt~Q{F0P z?SFl^0tHMm4@@d{Jz3rm;Z2?5>iGgO#-t817FT1Su$T%Z3OBY(z=EPYVg{NlET;X4 z_WS6w55>D@nO_eUWt@DHXt9Y|Y)V!MRCYW>9V1NKj~LTBb$m*}_1VjxP0038^kb?9G0d`5&Gx&G3^WdVN!L zswIwCJQnmq0lkYC(51e+2aD9*+uNlDOXojlqKLRa^5mm$>t15fds@cyZ>v_yT)xo% zrLLuz++ACjT%jx?%d0fk)?SunEmm&bJYD}k#3kj`%~PsaJTjPz9j~~+s|?l7Gb-TS zn?Ce@eY}H->x-*6cGX{?*>gz(&7L#kY6RnE;i@;g8Y0l_xnTm$o*Rv;Y>wg^FVGyg z9D!!fO%Z7JK;+-Ta_)`1S5t;pDd)5%PDDR>KNsvW>{k7_e%$*%bXtCoCs@wQoX1nf zUVHcceLqfni$XYURyvN}?dY^Q#BSo)dtk)nD9eRM#7$Jb6o8*;_puNZe&Uo{fV{_> zlkgnuS!0bIFV6PPx!!A+BYx|!+i;z5RAaBm4a5cr&c^n?-%*W3KpKl|+wH&QDt}_=vQA!)7NrW-jhoBYtZKTQ^ z!9V&L4sTmRO0p&`5F<0Zzj)tlC-zQq8J86j)h{JY0O0lCO6N)lO_}948H(xeOd?_# zCLy_S7{c%yABHNRdR{tutoTWYF=?^zf+Z=XB~}!@n3mEihj3*Oj@|%`hk4DJ35-l_ zTMgtNLAK*!vl9JMFuh1eu|lHE{Slj=b5#m}4bKx}3t_Y>xT4bFSz2sbG(it%v<_#3 zWNLEd%TZH^TV4sc?DBXyy#p(EU9j`l5^*TkJjb#wYJx-gXPiPMb^@1*K_z45D$BKH z%|IF02qOJ%KtHgFznkzsrQeyt@1KFU;xx{W@mnj<=tQ#c2s<7i#uu~sZ41X`lkEMB zGhTwg?Znv^=iNB#ao&S7N%TIP$KbplXDVP4c3W^691xOhb(^$dG`?BZs5O|;Ie=kns0 zi{G=cdvSsJdaf7-ue9N=mB)c?+4w$&(Jw`n4Ee^RAA?P((@snnIW9g8Vxn-SSa`Kr zoyoBfvfv4FOhQH3rR_UG$XEe|-y}pFNl_3XgpKk=Qbc9%Ake}f6?BPFfk{(eoGBae zIM=`#ZIw;sFylMBI8z!_<5Y^8*l9yw&!+Q0p+@`Qny*p1;%k(y?75jZ(v<`2t#oD2t-_J69JsZ@ zl|6@XwO_gS8IJEW>~4X`VT62fw#E)0exwTlr6OmIV?o)*tJ>IRC!A?iljEAOB-mFsE^Hy;%AOiAy2C+T>bxR!Q)8P^CK;oSY!**ha;$A ze)^XU$m2@70V&qJ2Bcqn1OA)V>mamVN1^pP39T28`r!K-UGc3)SN8aTHq&{aO%kr` zxgR9jdWlvJZN`VCcI3lic#-w9xdjY$y=KSb5-HBMcF7ZcSWeGYeH3-K;x^5uK22=E553D8dVif zBcr9ns%ikDReVIM`hB3P@Jg8UsQ=H^by%n_C@UseCxz;YL7w^QqAR|-=*pg>O5$l- zge#^(N8`O**fKtgr|EA$);k45@LOW+D@8|iTkdYDMRYlKM>-9fTHaXfwaa5iuU&+p zNw5w2FZwgPq5%Si5@>aB%w|^&aO82W5{;&l2FA6;Z}|1x_&81zIbdUAR`$MIHV-ADHeS zZ>3Tj5M}D%5zK zy>Xs^voFq*arVaT#EJ*IdpeY+ zgB=}g=wM3+YdVy|fsthN%Zd(iElXj_*n#lD#Aj2&EH$3MUyt6c_0b9hhGqu_8@;<+ z&dVvvH(HFXTm(%5v-xfsk@H9ZSdV?4(RPaRr8YcV@F=n1?=#-K|6}Zqj7mAmm!o%B z@hRoJ9KG9m?E4H4;#NXtxPMbEMpiGBL$hYC~L!ikwC?qN5-7JEZa0nm&R^`@0;-^XGMJUmE%IO zSLE8_n2Mcuf|=QsAC6tISL7Drh`s>sIvlmwD{|X#)Ud0gIPxJ*;fjytEUx&lxwz_% z-G+OGV=(rLTp7r04@N7Gt7+`25w5y0E{tn7rL^IEamD9Piz`0nFkJDe(FZs9GzQ>` zk7XpTy0Q3jaK)!K6IXmJi*d!rvJ6*zEUR$E$FfJlosw{8CENuGcO6%J%+GMe$1I0L z@-f@tijTPruK1WqS(z#p#{_Xa>;ZHI? z9~;&A1cdKgV2r0UDemex(?=QkO&C8?`e&pn=v{CACi3Ei(vU$;I{Mz3FoINvSArZQ zyu<3gtR70$PS%Q>EbH{q(S@Sn=YO<54NyLsGA#YO7*`rf!Nuwj2Paa$P6$q)I>h$? zOzD|XiBbgDPzU62al%&xDGmCJ8EQX0Eeozp1shBLCJN^z8;K96p2ALXoy6DzKY|Hw zTT6pn`a6?OqVV*&P?+)HF!CFa9YL-~R1UA7VbqtPhQh^I9yFTsCS#AszRnqg1nP>e z=~JT@u!}tUEnbUfOB#)=)R^LyR}18(6h~HS2{y74fhvaTl+~y+2vi6vnNY4u7-i|h zZTyy;k(kJk6qL$EMP&so3j!613Q0vIU(!P%)IosgcQsbe_-u&q8`EL7oe+KxEWjUO z!51BvkAyhsL~=;KNfTWo0=BnM=_H%>n4C4l*#T$jWu7>bo^itYN1QRy%KjT?I3TmB zPhk|zCM&KA&ek~Bz_}LA@cL%g!MQHZt~l4j8F6u+;f#qOS0CpXoGJdkI79zr55~DM z&SPbe-Vz_C=NUCV5KYG z!Ae*5+;M^Hz?~MZ>{+ewxTg{gB@=Gbpls~Qo+Imk$9YIJvIKZqq(mDc(Wp)MbcZ5$ zG!i&)*}@g39Ju1cZWONUxg8R1w?sQG(N0UW%M$IHM0+IBo=P-3xtNBdaK-HOoDjR5 zFvlF(M5`QyT{D@_L|?lch4n;V>l}q+GleyNJNDW|9h+LaK6Y_yEL@14rJx1<2K<8V z4hnSY@p`-E}(}46bNkaWcEkZ+Ul7 zDD){7+8moGg{H)));Y`?L?4)#b4z9SaU;7tdMkyZ+=+Q38c7!=K(S*?JSQhi{g%_ep1hchf~&L8KRI4g0cx(dLV(n!G0Tf%h3Tf%f@&&DF2Hd(;g zvzrM#ZJ|WlD_l8n2PN8H678ZygVTnk=D_&~SG=@@*^zmhV>Qtx$0|tfYd0~#F2~n; zVt_S{`0Y3`z_E9py!azNace4Eh_z1gLf#o_Lps+jz}I>afp1|NQHzo%ij%@p-DVe% zC&&%tiM}XH5<%{Knbbby-zPXPPxU2<_>erED<)uJFizrW& zJ5hE-d7?B$87oSjsO$yh2{(h7JaxgjEcn4VQ%==5*TNaMh_b1!LUAT}>WAHy-EO5T z2X3f9v*(rzR}Rd{OFH{B!JV&%hS_ud6{#@vH8tlep@mgm{?$1ic?C(Yt7 z{#FqZX7WU5_dFK6np;5HZi8CzRuaWYVLh-9lBA7!{&beNlISMtI33cJC;M&T zb!5#Uu&AsgUG~@`1=mLRUdS5qf%RL1^vdqf?4oZml%cwXD}Vu zCP+`dTU|9E5OfoZ+R~E2Bq;x_N&Alq2%iL>PI>k@W{Ng{q=JY*0kKWIdB*#peFQ3< zDE}l8rLcQqr)?EllFn;zrtxbn&J@!+oT-Q#ai*4z#?Fshbj6QbbY;(O+43|<4a4y| zg{P5D;c?XQcp6!mJPjTfe%7zeyV+*PI}P;+Xaia2g*Q({ST-UlM%u(~RM3D~51xC0 zDIA5N0lO0R!!!k98#7?^rgSB}0fxJDL-aN z5)q~18`I-J+{DRBV#no-WhZpb+D@DI$BlkfCcT`~<^ZeFd#!Tz$HA*~?`|oN9dQ$F zrZAx3(h?kN0*!TZcDRN7a5-UiIWNbaqz=kO{6t45|D#UI$6YN3qX>o^y}R+~{qK1f zQ4`?8vD+}4i1#@R!|zl^8-=5pUBRO%_#D2#)gVUu3dc-#1^vfHSQ~C7u6kmx$UHi{ zH-n^uZ0uO<;sE%|4?NVbSejmP?7K7NBX#6g7EaEr1>CqLv(Sdt8o|^LHj;qFbr;7%v9ufnVi8V-qd! zA|CI441+Altlv|&&lZSuqIP_Qo%C`#cG|oFp|EDy$QCzQ+GPdCU{24zJP_%}UdWb?b$97$DTx?RB8AJy5ECBs@x#i(zA0%5 zCUfMF2CnYiEcX`TkB?l45b-<=-qR@L)r49noe|Des?=-6qQ74DKOFjb^2n#Uht;A{ zVEUrLM;-~_KUCpIAHnc&kJOp)C?-BoftM$`w@i(V=AJyxO?~-nPTgS*ceER%2pdv$ zhFzOLyZ0{!Ecm@O?4iKb!u`ZEoymnW;Z_@i0uCn$%(M;#-NoHjB;uE;XlB zKYcB~DzjhzGE-eY`pTnu?Piuz?tXn>UzJ%$Lz}OBbo;eu51aT-^ID#0nlt9|n$lk@ z?tMM+A2-9hu9Z?JHqhh@8PQ+av$gW8pPTNkm!xlL-C$AR;2IN#Zdtz6%2+AuYySb( z*JdC088&Tx!UoyrLu?uk9lQDYth$v`jvNisRncDEvH!d9bGMpsbJ{$O49l6E?CCK7 z{f5DFIz(yRs>Ix^j3!{)HC^K7EnB`G`h3;S(!n7KsqTxFem2%w9lCt$fBD?<-2*bO zWq0k=Jol+Fti~AsKNeC4W}6S5zD{kK5W91zwe0RW5U5u~{BkvbX-#Cu@s^l*_<+Ah0K51>*teK^1 z8IKL9a#?*Gsg&KOE}U679`Yv0WiE)G^dxOIh2kN_ESFJil#4A6*Y6jOhsGwkjC35u zNSj@ucxVKd%c|o@@%%DkE$X^pxhNNM8T>(l_lk5VmDRFbq;daOJTwZ(Wj+@1I2MYB z%w;)!bDHI1=?`^b)D+AQapkhhI8rWXD_bZYYTvwg!iH`~0~U>o}FxM>NDPJg_iVPEkBelizhrTg|;~^thE~9aPazXl*`C_ z-Vj%P7F6n8I3AKdx$GqbwHB^ut6V4^vKr*F#*7PJVsIx&dBJjFR0n1Z$kcMQRV@?` zNse6BlyR}7c>N&^#|7i5!7xiK;;CLJo|+8fi6iw3qjP9f;drPta@j_Ucxo1kr#8b- zZBsmp*M9$b;dsbDkY5gK7mCM)VW=i4o)hWn7lq@g%P{qkAJGbQDHKmVhS`ZD^|W11 zuFz`;kWX)X#xVPlkf=B6v3Nk{^7Nex%L%iCh=EO{bmf0qP@)S_(2aym3^hh1Nb!7G zh_bv8WxGV-YX&#D3Q?XEqTo)Bv{8MsdoKkjbVo+qcubE%l$1i0@r5XKhnL^PlF~gJ z+Ujv4<)}b$ktpW{N=1qCOrY3E6k9%9(4t~IH3UjciPA!#)Rrg;fl^+g^cE;(B}$e+ zDJM~;3zW(dWu-u|mnd5Wilan1EKsUS6dH|at1eOQ2^6C8m)6h};>J^I3KVOE!Z>I# zdeX=xmx=N&3qQ7BjD_Rc2%!jLl`m8S7K%nI+HQQk)GjZSUI;~){Gmw0$z@{ZuK5q# znincjAQL8ks75T549C1pEb?d}6k+m*B26fliQ{Bqydx|ZG1M#}6k!l5+AMXZCM*;R zQ^dAK2*ogre+?9CT=5jkS|$A{myu4U?bctem-12L%zrhHCzZqnEatyuuuaj2sWF`y+-7PS}24fO#V3j!7v6d)wyvw6wsaTb^adKZQ8i7kO_OhB|oJgJ45SH5STeB8V^BhL*qrK_XN zyr<8{)q;v=WMdSuu$j$fA8(OPOYYPO(P>d>gOmd!eB9hcMgTrJ5tSaoyAmRN+@%mm zJt1z8@U)l;?ep}p==6~niQxwF(FQ0=xParHSL^+TILdv<& zwt4G#J9jqv`50ZjLw)_bs6zu3K5!{?ZcEMuA5P%4Rt9!ag(%d)JkMKVxT`}#0t5XN zU3@xwbZ#w?UHw9}p}vYBKOc$Y<*(|ZRjM?hKAr3P1(@>=KuC*2Ejn$X^{jlC1y)?3 z`Y*t&WNyAHAC8hsMP^MzN#+%;9JU|ga}gksJm#jfdQc!AKvlO*}ahG1tjK$5ktAP z^;d-k_^K7btO%i$DVAqe1d|VE->Nk|SDd%GdA0Fw>(?GTSdQkudom2>SH;^igX6BIAn9KJ1l3Q#G(xJLR@Qw_-Kf6DW~mI z5Jxkcv%usEI2uNZ!Zio|H871<;{qFvu0`SEKyMGsA^}HLR1}WpnYjW6mu&kG?)ksK z{f!u219$!hJ}w)aJ``WoH9ST<7KIB#MbrW=Z7q+Yk(=Qxd@RJNiHiLLn8zD=99c9z z<D96pflBj7xaV8z-o9_RD{9IgBM2^i-SJWi^Y0`2hz>o~WD&N8#Iqb9%uBiANQQkj*xpIfW@T^AB zOcST)(&P3g>Ua*K9m&8)~dI}%YwLeTn84T4LV3YZs$;XsEI%4ebcutJy5K>lRJ^$}4f&va$(6Ju+17bic~WLtm4Ap{Wz-uKhA_QR>8~=tqslXF3NUrb zaFsFwH(GhNZ2`7cr_lu9hOw>lGsFx9++9!BJf>A5O(xPj+;O9q$5}C2h{6xIc5R(+ zBBYG-(}V=7eT~X)eoCzYrnJ#t6RI&7gA}3uYNatiVZaoYGI@-p;|F@6GFTPrZ&djE zhbTjQl{(HvU?Z|Tw!c!XG$;iG6@wzMvP9^WhEPR_QjY~3JXc#y+(3sHumwvaDY zjTDEqB`Q!Es?;HewS_23Su$0j;R-dZbc0gLqKze=&uxH0rB?d0I=aisXwu;oglIu$ z#7PtxXYz|mP0vW9hZlH~6=zZ;CNhK*=}sW{kHo>lZtF}W1PaMuuQS6|HF5*%&dKhWW}lR%22f_ z)07CQv~?z$oC`AHTQ2eVB9B=jT60WT8I_fikfj(BJ_w0o!v*0>n?$K6#AeHd;rrJq zS;_th__BOdq81;H!)q#2GWy2j1__^{9jDj&s{*7jr8xo2KlYJe#R%r~^s38`( zSMAA_ac)xQbU)Hu-zYr|;Dp;Z-p(>>k zN=mI!7~qk1bbc+BFqRc8A=a3P2aLG};JHXGmuyji#u!$E#?18SL{^QBJ_du_*gChv zm|(^EtMpp6qPw3aG(Z(-)cYwy)v8dXQKR!$>QteDMpdXmsZ%TbpjxQ2{LO?r++b9> zOTXnD{q|&Ckob1=+gESUF)c!r(nO(@6b8Q_rVWUSRmKLRQm51CSSKfvBay-tI+Y^S zAQ8(DF)TDVR1*;@C0dS%DmUqOMfTg9=@p8pKK+K12nE4yJ|W}TTsEWXmAY^gs1oS! zfyHBE-St|fA205>+r*P)A~^sZRN2kI)F0ukL`H}zL`h98apWS0g3zeI(xx!hA_qz! z5Kb%_O^IGgqAUD@6&MF7&}U%o0aM2LVu%vP*#KOkMXNV<>bD zaCn%4k3??C*I~3K*BJpC2motKfUhzT>7b?|jQ%9lQf5k7!bAk($p^xdiFr9zhWd** z25KfGXln_|mmo%QttJ#>r5@dp&%T`{SQU!OP(wlkEs#wFWNAyJMcNinv108lp<#N8 zPvIA&^!L+fyR$)nD%Qagq(_8+>6Bf=lzIaj>j~p%iSbh_^w5`za16x?Unq64hRax@ zM4`!pH5Cd_))K}tB#KcUwxNJ^vc$4F)OQa>_F+aaGlPr~%3wK59LkU%CDwPZ|*Fwlh zWlL^2^i+UK>0h{7MG2~63FlMd#YnC3<135oI!d;xCDI?tgC#3gc{NKe)eiDRsq!|a zjv1pAOLa>eI-~*eOv+EAS5ea_3W z^@vb|imXFX+-g|@Rf6Ws6CpA(DWA11VZ2(P&MPU7I+lE$B0|a#SymK*izNU}*{!=j zY-L`#kTFe|x|SG)A6e%*vc2_EGW9GGei}`%N@+xIGvFQ_AH`?+0U=t2pTVfrs8xR5 zNy95uq|3#!*Ut~;V++%2p*Hn^i89fkC>Shsr8LlpwchZ9NWL^u^ECP(P^avIT9JT_ zKL|t}hG-2~!onB4$p?XIr9vOXiF%{y2XUl+19b|2rBvI^EU`i*V!d#HG@LZg2k_7u zgOmublUk#NC0~zPrOB4iY*K5q6iU$25)9p>SHT_*H59^&P2I{8pFeWF5sF_Efi@IH z%heLh)FpK`okoq7oqPql)UQiX=7^f2wvZN;|nu!L&E zeAOy_5OlAk`b9zWw8RO<7LDacFcP(`>elvFSZO*38UPhR;@WXI@? zV#myjQ$)APhYnR?BH|A#r@$~J_GfQPw3nx^3f&CW3UwW3;ZXYdFo?(?2~Jzf&GVSGy36G5HqVY9qd`Tf2LzS2!kj@wMh7r~`nQiXqYXr9X zC^$sX&FBmFQiRIi5X5W~3S<4zF#dW!tSyS~gR<4h;j(r%Fq+#b9GVm|6{U%GR0aaLa)%r0K5=h0O=+g6F{@ z2VST$0@@H7k&Q{pZWwIz5(Hj3Ks0KMWd$K(3UJ9$EYQv*5dknT47jz+rvQ%}cm`dV z9urh%a`Lt#kiwJ&Y8Znd%v2i8D8q2lA&9aYnKSADm@0uZ`tkO;(E!6y6J}r*FM(|t zI4o4J2!LxyV^sLU1Y}y5xORNbl+fNfrLRU~V3U;l;NXQ@X$g{N3BmMeOEP10D%L9q zQ#L;)462!xQUW;T2Lx$QNH(vfnxPoV=LhtF(BS5ht#c{nHKZJ{FybVgCf3A~v0#kl zAF5|9Ok}G(vPv87DbeNm=w2*^P7q@`r%lN+rO|^9AyESpk}{GQOU@Ga562kI+Z4>w zX0!TztY$(r{z^D7STB;uGLDhq)+L`To9q+XiYLQ3*QtC_fy|LW3^~s*kOP1w?L@QY zX?`@TMdQNag=3e@YGRfW5`a-|AOkf(slyCL$($j?x3T22i6l{Nc`C+R>QfLSWE?J( zFg|XoP(s-W32Q=F=E<=^*haaM* zdSc!zvBId?i7U&;Wz{1Fw93aq2Vv2Y_niXD^Kqp-lW&>W*7?~6f7V3ADV2|-Rk333 zWLe>z4$NW2o2zALs3^JuM+REAin6;V0@uI#2Gd}DI=8V*I+2jTt$kMRyvIZlJ=+EG@f+{7?8ZkuY1!K^XE}Co+L-bZK290}0YFW~U{E*GM3jsxk z1)sb@$K%*!8~v2JBB4Z&1w(c7*TJo+f_qDn4bfe}_@b){PRbyr87T(QTfq>xS!IB{ zGU*_zodBYzf&o+*6;%qgQJPqgWlbp2W5G~trfigCMZ}113JZ)RF*MFmJfeewVbH2d zomQvPL&@a*Uj2Ep+Fj&yNm8|y@-%8+<6=T!{7-=GC3Yix&VM#9HiceSxR7H{KQ-`h*?5Jw~^==SD+k}QgpUrbc#@# zII99F!z6MP%uZmU*XhabhaL`=;w&vNAv?Sqm?;PfW}n9qT+d2ao(3K7BqoGI9)b@G z9b*hpXtl6TX{aQOqh;a@B_&-ZFF5Ne{0##NRMvt6n~=#n(VZ+K3xY+d(RB}CW-Y7v zGl1X`Yb9>Y;~t|h(V;ZSGNled0GR|JOU{U)J)C!hk}wg#N&=8r^LNoH0+BDz&)1V@ zf%v2qDZI7B$K8A=R+vFBW?)alP|`CW3ZY8np!^fwUIkY$Tj7 zoUP$1jgG(BPCQ$QhZzIS-i#r^WDYa8vXqjYgra_<#?k@Qhtf#C6;k_bM5fqEOE^(+ z(F~7y4T)_pvBmOWK4O6Xv6~HbW+QC5bMIgrE+{Q;C~rxCz4MXoRg?2&+~GD&SbA zX&st`W|C5)R*}H`Bp6Kr>k9S>e}|5BYKpX~go6Q16)g!+HHjl;&7f418$xU{X5LX8 z)g@#AW_@|`UPGcY&md+A+AtOzj$=L3IDaBE=Fpg)BWF;)Se`?LAp4qFm_{2&N9A!y zO%Vr^X!u01XeN(EgU4GwK8+T)_qCW4W3>-0&LJ}50vWf&uyjR)A{NjPO@1<_-yo|| zqXyhBVY#6gFy#grE=DM89pjL3+>-e@*xh|HiP`)ElBewE#*AYMi21lhd{|GxG9d=W z3L#n=kUy{|(|;5gGxPkZ77Q;hD!eyS6BHhkb%aOH4#V8upwJog5h@ssq#Y^i)&)Z2 zh6P->-Yj|ImnxEvMNc$ZQT&+hOYze^I~KdhEN#K0u@%+81JQ|r0p$YMb!x zsI6#S8Wshit>A3NsL7Tc7(G4Q-B?`{n{P@>wwt?$Cu6%xq4^r-LwC~!`bum;5Lg57 zY;e0tY@wYk*b2+gLPJ`x!Bt41g?6-Hck>O@No=7lEZE@Yr7g6C1zTYm8cUK$ge}5tt4^rReQTRE1mBq;!4 zRSt;-D+t{w6k)o;FjQ4Rm{WzqFvP}+Z4sN3zAy~26@Xb+tz5aNys=W|#b#YKyf6&0 z6@#(_LfYlxx?{c>k>9tSqt zG_d8D%FwV7Hg*sZD{dH3Shqt%3X!qihLJ-w{$X&>(?~{SEVf}}wnQlaOO%)rO${4;d z29y0o89l`y0c6gFt8@k$-bw!x8B+%$YcabJS=1iH!lZ#%a1)3enq(3O(*CoM;x-M04HOEh*pe<0SWgUNysiSAl58jFbRyfCXYBt4TWR&hK;*un>{w^BmgKXTJGFJnKB3Xsn`2F<)V;*yt-} z{E|9;$qohAqh6`bG5zSy#A+9!LG$EW;x3e%azJdfRem;BxRXQ@4<506JWL|gst{(j z5*vQ8d~AQ6BEY}~H{!xEmXFJ%n!o?L?y0Fx)zwwiVY;b=5?RpQGcenQb)wWI!A>RUVM?S_44JDr zax?^>P5#`mE{VpA7)A|*pan{lMaJY*KEx`C1>(wglr|MnCIr>b&jj_s!uG%cYMIl+ zI1op{Mlu-X(-<&BM~jYOJFyZv5?UT{SxvSDjD25%uZ_E~nj{Fak_Rk>*oXtj@Id`j zf#Ssy+u5SX#v;HM`UWxqNn@Ed7W#W?E#(&1!V|SB@%Y>0Ln4MvLN}l=nafflSx(Zu ze{?i`OJQI(7+L9#;TUcKqpcF#&`>{Bia5?sRAcNl2>ArrF^KEUN_(|D!)uQjWz+=K zI&maI%1lWxYN~)y_k(?8K87HzwViqso?v%m0cuVUqezd%UFQlMKX(|!c*@-MD12z;MfP!E! zob)!#JxZ=QM}w`$NMw&kl-^5XO{!_EpXd-k@|R*6j|@-^ux||TsY?)p(yR=kCaH{& zG)zjkjifBJcX#t*%cDtJ5V!lvaT0Tq$$`+K&4ErfZ$v}|8c{G{OAP`rrHORi+D8YY z4d5uUh=>3i8=EE!o%Y7`V)aVt9@5SYeZa+VrXc71;|8i#GB0S1j!Y+57qAHp%+7!x zFwXDYfu_{ExpaV;MU=b=uv`MFHw`#i`dq_JqmE>4_9$UF(x@QK7%&hK6Xp7bo+5o& zg_5NDodx4HR7=8_S;+zzB{-A@Cz+yhqTxMOStPU)gF*viMM+~Pg?DwQ2|@!iSKjpa zrz3eEtT2Y8_w)q?DznhWNz8EqnPUa$$kHQT0i)1X5bXK3^xD^rHG9eroBbsjP!Gsx z)g4(&+aqDJDHf_=V$b%D#GAwuDQMU3UYPx5GLc#sLA=^?#%FcP=mZPcOB7?QPN~Eo zI*MzDF!VK-$R?r_hD}$b?*s#5!iZsPP6jScbTgIGu5WK2Z-slPN_X7Gxg^#RiBO%MjI6AfZ!F z%<2&NISm-A5J{RK0tkDO>#zoa`#r%bOMPm9m>7{-A0;3)XjXw1c+ct=h9NZy5@UFl z*^g4CdSp1LN~#EwxS9eYw>+={e7|iwRIwLOLYZ?}nQKe&F^NYh(5XU{D#=bNHeo;} zlR%``H9-<4FR=d))dLM3lN@7xVsuT!i6E>_?Z)U#t%!?sIYtsWKA6-Epl^@Bd!h{U z3LC7B;GafO<6tE4;6#<0H{)wZ1ZRv}6M-EN*jtT{<$~04?W1Em2FH5R*JWWr_=F7~ zT*a}Prv#l@Qy_UkAH9*x#209hVL@oDl>uCiVrY{Q3w(UsXlWkl%v;3$+FDTVKN5jx zUnnmh%niv|H1>%ALo0*S8JoI$u?9oTN1aaUa&o0e875X^Tp=+Q zt0XWMRTGIXvA7tNbZ)|U<&IbrKGfNwB?7#|$gE5a0+5wMO2Py&OO_bRBbf-ukR+|B z-tJ4;c4K_b*s2TGRl6{rQ6V;8ro$+wRH^RmVPH{C=@qpH7dEY6z@{>&u+q#2U-d*q zrthurhJWmZVF&}W*+|sgOJojAvvk8ChzD!QB#?lsC6lOeBx&o6_R$d$*ma1XCn?${ zd5lNqIxiwKjHrk{XdUie>=QzgfJ)+2zb+^S=~vQZvM}Ikj7XP^Xe3*S6_@C$j*X3q zMpL0!2I0B8tlgDFX=i+|8mI{hWulG}z9Z3=+cCuRL?K78J*inz{F0&-dey=1fl1Nv8dfJ%Wsn{$Q8JCm-oq$8QH~b!AW^L~JhBl_ zN)e_4Yvi?oO5b=A3uB}l?V->wJXww%kOKeww2-!L$M}<$3?fy`+Ipg{S&CE|GIPL4 zZcNUQF-YW)bSgzgN)9lYwHZ&*#10kPDNGX?7}F(|zEh{#?ES5RVU<8dzRn{N_vcav zi;BJqUeN>-r71V}yl>!$^{E>p_F?Ss_>7pD8_WO33Tnbkr+fb`kR4+U`o^E~C2u8= zSCtTpY&Qd*9T#Wp!R#6loya63jn@#l#337EWiB?jG$$cst=%N@3|A)5#)^bxJ&^Y3 z2J{DGv4(vagpefzt8{AiJXR7kN^AzghsD6#L^<9QXRJi#52-wDeMhjlfT24i8Q&}z zNi~R65^KaCln9e}RK3&`sM=ZX#LuoN9vT5cq2)m!YFgCa_|{}1(LhFbdq-|;(R?Rs zJ7lRahNSi?>Kzc6Vxf)))k0q1gNjCZMCKo{lT7JI z;)rFAN?!{CARr(TRY*@{^SgLQN2oD8X<+t%7N=S?xu?gG~A-zGv-$ZCO_RU%i?St^|nwmY=5=19j=Zk1);W0+h zxay`FqdpRPM6{%fxGDx|Go42nBZG$wd3<_Xn5kmRBnvH(V;y{2EGTyIsf^S)<~@31 zL>gg5@-%iPYi;U;G8S?dgtti79{VjT;Hs1vEv6prU+zQm_Fv6BR$d&jEzXCNX)h4Cw{rTw87(x*Uvb|g^U_Ef2D8L4Q=nA!{{;+Rw-_voZG$yGgDG|Sc7ak7QgmU1nYoHyvYaw!h6 zXL!S>w6b$}InA!;iiKwmt&BU`{PVo@1-`XDBzL^B@ch!xLD)PbwDgO1g*KU4xU#a@TO&5$fx1x5>ktepUGuwXpNo{OUucZ8K@Ya1l(xb}I zVJqrwsp2^G?ESG{H3^3dC1^5{yRGS_23Og$Cy z!fLS2lh%E9g%6D&_30^$&e^nljU};`4X=Ha&FQ(&Ce@s$2H*sNG*mJsb3V z3G5SwxAoUD!QF3n%(a`4FeWhD_EGG|W-}jERBX6dKVpaZJd8mK^BG>`FK?!F=-wy8 zIScyLa_h?Sp(S2Ez3p~t`RJ?74c>ZUgSpcT&-|i#<$IksE#15Mz8_I$mS2u{@7n9; z+swJ}{%ZTphwEd=)nMTF>wXT>AXJ)xO$8 z`y4!YxI~Lfu}dek8W0hGbX?i%Cu=(^W0Ak|NL!^`b;jV2H2ozrO&zT+t-EV8QRUg; zLahd;>Yp!VQoTi5+x{@L8D6jGzizlZ?Xl&2*9Cu799d`L@Y&wCPq(OJXFavyRl`}Q zPYS{whIeV$j;%VSk`k`$*uD4gi9_dJgO)J317C9 z-c;-MyQbr=H@;-;c;t7h?1$Cwukvp=qEl@7>GL6H8Qv3b$KwO~r+?jlZq1;NPxnk; zfBR&7Mwg3+>fQ?LJ*r1f@ZS=Km+c-of9yj|j(ebK8{0!M-L{q4w06amm-YKU?&}!P zas_tV`itSYZLB+cOM^2$4?cd5e|Wu8pLU;zENbcLb=$6M)+moo8BRDP20MqTl;JxQ zp8o#4|L|+qm#?X3RJULbEuZ{OluNtNfNM75o zLfE;-$(GYLcg>D$*Y$b1u*XQ3;m!Z>q>8pJev6~8yhaFoNd#(N($+}khk&r!LF zs~R`A9X4AK`Z2uZLEEyr9y?@xdgi`IlOE0aJxBRylj_8{$76>MTT(iE8QSCqhF86B zY^&V~9ey)+otMySpx@3XW0qf5pR0U$?Bukw>gM{Buvr&Kig9r~rs z(Z`?5#JOZWS(P|-WnisCJAL-!jI)xIzeCMxncQ1+%BSa~ZcnzX>gJQR{YCQ~CQkJ$ zn^d@WbVNu32F@8?Vnx^BwSy~eJ*qqCMEPO&+&8uj4h+;pHMY0T{<~lH0Bl&doZ)>o zKIMLRz3TLhwl{Qk-@N?9|5o2y{{Ed_tx(0(uOII_1WPNiGbGZj8?dJO?dX9mz7F`Z zW73#KS57o{I-G4Vc=F$a9TuGV)ENdP!`r=F|6CVq2c5P}-FLJsq&Ep_qa%mZypSO4<)sFmy97H(co(#BvbbL`BgQrdQ3H~w9l9)^E- z^r`T|z)` zK3IEw)lBZvJ*i^QBIT_qz6(XCeO>UYY%8BR5o;yR4?p)HQF?){l91V0N2(YoF*jPBu%~IQHTz zENp~HsZtKpl)3HIc8FbhjCXAp2ip=!^@rba^iz+ zt4BWlFt_TO($jX^Bq$yyw@z8n&T6*j{27+0w|NZD)xD#OlV4V);E9R%F1$-TwtTnX zvu{ZG-(xS-NSoIwE*kQH;my2Qy`rUO%-iaZZ6>}>{JiQ!W;LCY3rxnhjXSkCchBZ* zd|eNnsZxG!_3JC!&V7W_M&WlV=-fE4@0R*+Bh%xnx7ZDwbz$9G$d?p`_qDXjSe3r; zZx45`Gq0=M`dq2^k%|X@%Zb`@+_hCyO|>@;fn#`o%^LIJ_}7bX4Yyieo0#*bPUu-b z)vlMLT9$Ge>DBzVU56kK7+$+-!(aY=K4$6|x1)3GtEQhk@YmRS8?Wq}_5QRb_38P# z?%3WP2E9sobIZqNTUKl?)g`-UOUHLpllny@Y`xm!nY+#NBR3XTSp;1)l;PbU9GFnQ zbJwMz^T*Fg8eeI6sGV5ss2ru7p~Z3nBhHkJ`x+@ z6c_oy*=2K3*Bgqv^G?1@?*3FYDe--!W&1ZyK|3l(=~i8}^j`hwH?!9z=?0cOVp{k3 zs*SNN=XRgJ%BW1K%9Wmjb~6}W^DnwPTdY3g;J)2DcgN48oBpOVCt825qWZ5-yH0uc z*6K4hZ)JEFddGcCzx*osOP!p12@NZjw471D`W>T|F1t3L8(nfhYsA+OHor=#GIrbl z>iobXtE?CN-8ya9;WC?A+-%`hW<;o@_n@v5qs;@;W z>md*Ne%?KF{FTw`lgAFq!SWfQCPvYq_f4O?_Ub(@vRUNp$N`qq=8f3UPgUlAP?Ihn z_MEk-Kf0PAL@>OqH8#2LUg@+XE^N$S6Ba!4N_bG|wMCGD(~>%W?4F{lA0-HXFuV?b z&8lCAa`QnL`)+ zA8hVux3zQAFLPVY7#4Eb*YN#??Vn{mpOH3)P{5t1$*;dcyz4WWKspl??&M~}$LwAp&0&DeYIE8Sfi9C|vdU!3>L zOv8c8TlDsDu*3%74DZ#m#I_y>=Fgix-hIK`3J-ik2L17i&MynrKJYqN<(IKX8lj)b z@LEoM`?1cDs@Hqmx9mI0?(vOB8kZV7C(d3l*>l>QO10bv;ebf+f=W4IpZW7Sy`PQm z)5XLyq@L~QpVLEPJ}ychJHPSBIUkj$VNZ@>ckV zxZ+f)1D)sWJoDhiBpm3&@Zy7CzVDN3@TzQpjgR@Gxr+hKmbmj9;VSax#sXp|P%>w(i-YvVX?|Q=4 z3U&$l=qlxtw7YsEzqEbS=1!*#3*r~_?y_F_;m`2F{TeM@JGJR14|L{dFg!!IfH7;l ze?IJg@45B7n%73_pPcyo_ql`KyHB1Hbg~JVMbg%F}G1?dQ8f|!d&MXsOO4#3VL++jnuU99I%O2UfiM`{vYN`7)K7rl3LSJHnAMs6|d(%y| zENI5#E89Y!2(3ond3esI%bA>7?QV?fbP*t)g`6Jv|Il3q>5n^?F`pPWdeEsyCz~uOyLH`{R--%wp)bRG^!M8e zf1SO3`%Bl6txxr~dj8;gdRvFFcTSYI+%%%$L37v}YZ+eC9u8kdR?gbK<7Tt!bFq*ckuwtdoAZ21)v<7jv#3z0~;8@0!4qe>b0-j*ZS4-o`(! zE+7A3c%vrI(&j`y|JrNt@hdNmEU_&8X2GV08=KZ|4STl+r5nB`cHhvb^_5MU3w^w1 ztW>m|pENt7ewkYn>(|h&wC&nP=v9X2xoP0U7Z3jS+85F6zRr@Y<*^;!ZThOoa&-*b zzP@%zTgdS{46k#k*8A+AuE{)h(_zm>!*^eooj8Ad{nS5OxxY7>c;j>FRya7ICZ)SF z>%Cw(xO1zkU$?jiULDxuP+Z8txYUL#H$Cl>)gy6Bj36X4ygHLTCmY&p=9gJ^?vdmA zOTiV#cVF7UYTwNZ5f^M~SlzCTO~)Bt$IxbGZ{t-l@iu=x?03QB)7m!ueXk}Q-Jp9n zv%+t!y+FSTXd^1+t-B-Yl-cp9;fnDN9h=7aD9;VNUj69mRyWtKxPH7whzslkHNy+6 zwW90X9iOc%BRAZA^QpCcWuNuoM{O^7Jt(_2sq1wGczGtnbJ1U(b?|MKiYrT%YoFS# z(t^o#h8{?8u3Tqu+V8rp?{;2}LsuDI#jXomywi*Sa{ScBq)g|m8Lh$>A8r3|uzF(F zxwVh|e#yk^RMY@H5u zGgmH6sdN*vpe<;vQX1@@U(f$Z?zQ6ooH%He(+vkm`fUd`%a(-ps*+&8YO z+1dI7+os(27KAW{cUx(Fc}9aYGyCp!Jw`uj-n-m{LnCJN@-LC{VED|#w|g%Ygsluu zwJ_<+@0$$=X-fCpbgfau=)1#8FF4!a<@{aMdhV_Mms&e?2&1 z-TIbav*yK3K7`}x8Q%0p#wpK|Eux+@%XzHle(KcIR&JZ;om9T_HrRGxc->h^IKYA7 zW$#(~WozJv%@$+Je%i9w?~29w@EOz1e6!om8?vTcV(lh4hyuK-Qo8Q&YxW^q^Chxn zlYy~|TuX1$*|59hn$AMSFGmf%n(P~jqo5gHNdwn*yL#1JIoi5=*uus(H_cDA-LlM3 zc|T`W%lh4?H$uN>FT*<$zI}O6CEK4iY+UfN^R;t_KJ?kxrqSEEHKrtne7(}U9r(`} zvJ!M@r(QIBbGBxDlg@uS>h)-=2%ct_%}FF(Az zoE*@j%TEtY-kk2St5OS(m~xdYw)_%|{yD=-wa^bq{Jb>b{`40I=C0mXZTGyxmP;=T z+?sLY5o|C>!ur;c)oRPKM{=?$n8XwIjUI4*k}>HbvJe*}?A996=bx@Wvm$yn5%?-mUuf z`0MAGScj`yuVpUNAG~Wy_u~^5pE1~{D+s3;oZojsa@+)#bw=wM0E)sGBz{Cqv6+gFI%M_ZBo&x%KU6WxXkce%S>(*6;iVF zz}(CiA*;fck15&v%;}BeE%)mV&JLXwjCQVSMClG4qLa1z!0rC^s?9!dW8~cI=&65A zH%ORdRcYX%&E@nSwgn$BylPeL&kR}f(&_g%%0FHj&%f2OMtdRHdH4Aj9sDAjb#wZN zel5c@ofg_e_tUTmvugcr9pCcC(mFM6Oz^WfmDYdE6PMAm*MQEZ=nKH!sFM8BqsH;H ziA_wG9SX3$GbQt=y2G^gUoCF*+UGxTYqD+AdlT%Vv;H>E+_^qP-_m~d%r>6{ z;VZ+l_&GLwRm>Xu`it~*M`l@l9_u}+&y;g-dylB*{`lA7qgFxBG^YGnZaF)o`ox26 zlA3L4vN6y#$E0n&i>=R1&92w8M3w#rGrJ4I2!{7|yUV`&Ys#Oy{&j`-uzEWU*QNC6 ztM~fE_HMQd?5g|jpDGBO7+#;ivs>dlU#B*-(d#HYK3ln6nez**j&9tozxnySZS|+w zV4M}VO1ay*^xfgp=8TwfVY1hXHeH@wK9$jKLd!?~yZ1S_x@!0CmLLpacv+to2DGo} z6jbZxo=%aTHS0}$G0#BnmD`Jm8S552e^hD|4pU%w^*%>-UVhIkD>Sj+eASX&Zii2O zjx+JQX)@pE7b{DLHU8+oK_;k_R~o!s+dp>i7WIRR7DMV(I&`4x6vdv)@2>|swoTa> zpS}n7AHzGd@?QVQoo1nPW?jkovv;4*Z+E@Q%vx~y{^OAe3p$=tLr&gdc(IpF-P6)s zb>n;dSr!L`lG9}Y;@oDYrGce+EThn18dYynKfB|T-uI`-5QOY@W^rU zc{5|PMbq}LI54(Bp9eT}p5a*>_tq`neM;)C=JSmv`t~%x?jN71-+Nlm3hfT>a_Q;Y z59MWeZ?dMOS^o63vBii-%Ej;cpM2Qu_^5{ynl_)kA?ommd5c@(;2Aqg_vxc2W_Nq) zysY#-ZDr3UwU&1*9ns3><>y6>+zjiPZ5#`^5z6p{qnaHfmsnZff40AB_>=Ik%d2BT z8jULX>hqd2Pt)fq@8jTHhIiOA^HX$*5w~{fYIZ01zif3U`Cg|6)sCH;)ibX8n{)R& zU>>X~rR)6XUCZ)1O}%{`sy(T5#b;K2q{(s~QQ`T4z^kDY^ z9BtW*@~1v|HtcKDW))XF*PDHEeXnTc*zENd#xv%P8Z^1V>^2)9{{}L=2D2_t)|@I; z!LVY@iXATctZ&?5=bI89L5dWEz#So{*K#2U_V3ls+7557PaGUSL!zWmsRz`rEYIC;y7G+<5U7#%*00-si!|7a~8@>gx5IZi|q?V@Eh1I(vPcX-+MDm!F0{ zbuvuBVKNMFpGA+ewT00SezAPLw^1{@XU`)&50`CYF*7-1!q-tv-cA;TYYcDvnXDr} zxAN$9w^qAB13on<9h>=d^heuqr=MI(J=nWK?Ny;V{L1T#YEON{_&Cin9>f6*F;-~ z7A>NnSdBlvpHRcaaf5-en)sMPqV&%@C4(QRuJX~u2Zu%b+uGRL`nyDF)Ui0i5C^OK zwfFCawfAxU9zO6kX=-hUUz3)0cK%^vIU*zNf^ifGoU4QVH3?Y9Rm7;k z=84gX&6{FrHjc9>B(h@U%Y>lV_$VCyq83lx{6{v>CR{}HfI@QjpBNfN#i=vFVMUK8 zHYO-4uBh>dwHOl}6NBYbMa`6UYfZ%YrzmMLM;VN>g^C&_6RNg6mLIf#?TU|0jE;#b zhIIRf_YaIy7cnBS&PXh&Ly8y|nqE+JBxMSXuaLNkvE>bkjKs=L@I)cW{Ff#q79Wun z7X`4!GCqio3kqgu)yk*t7BQowy@SGnBZ?XgwW>HxF>t;}xj1~T#T#dlSz5cngN0&) zM78=qTRa7`$mDcTVOrsTU>dEW2gDao^NCXj#m9zea9+{(+R*=y&*0cF>|MxmTSV@W z2pXIaQ2dc28a#%2cncrDP}#91sN4sACCj65{oKH&_MBhK`1Sbho+JR z;6D^3I4KIKtUTOXJT;W4!S|_RgZ!^K2#5x^#D)d`i}2c7EhsuFB&;wEU5rv++uqXZ zcKo1(+BwAcRhkeSI#x_14x^e235*PjNGi4%$!@}D*V?iEpm5X@0$G=e+CyAY9D68Y zX2^aHi;7DK;_>_-d5O0D)i@O_APAo~{9_QQ?b1P+gW}ckMYUeywRJ`!K4!rObVb%f zk^WJEk!pMk6qIMj{0lM!(K+`2jtmmzsM>hD2_W+WUHGC`US!nPMU}Dx$E~{r^Hc7CpO= z&uSXiD4ZXQG0$;Dw%WJ?dxy6`cv{cyWvFfNG=-XltwCoJ!!s+}!w0r6} zXySqk;ecW!K|&y!S7FTjKV%sC0WvhY7&J|u2o;B8imDn0W>6;V;)k%bMM{}(Dk zn^8L*f-`@M&O_XqA|+c0|NN(1Y01uj#Gqn`QEcTgaiL@)+ZQ!|k^YfEgNq(Xcy#|_ zpgO8B6dQ2hs9gFoen4PQ5+aqyuK%U>)H415Wr)aljk*|UfNlr2tIIM_!8#EPR~47-_F5zTCn9i$`Crc-lQpBVtsxu-J;R^fAR(dXk{n`=sdI zMNuk%0D+__3L$4P5RvMZhjoKEg1xd{shG`+K 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�YLu@XqL1FuMIy)mEO2ZC4r1Dra=Q8 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%0At$FS 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

          w`4Q#<39s3`nF%Wai-H&|99Y*(73So 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

          czdpY7dL);ZCKkJ5U!f9AKJPEUzmH}IjJ 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℞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 z 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

          py9;~U@j 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 literal 0 HcmV?d00001 diff --git a/lib/libdvdcss.lib b/lib/libdvdcss.lib new file mode 100644 index 0000000000000000000000000000000000000000..d61b7c042fbf77011630f9f60a215db2eee68247 GIT binary patch literal 288634 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%0D~E^KLEtGi%O<3sAvU6TOI-nX{|zJ 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

          X7bQ2(1T{R2NiQR4y%xpp=17e_By63v(CIt%{)i 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 literal 0 HcmV?d00001 diff --git a/libdvdcss/.gitignore b/libdvdcss/.gitignore new file mode 100644 index 0000000..842c29d --- /dev/null +++ b/libdvdcss/.gitignore @@ -0,0 +1,36 @@ +/.libs +/ChangeLog +/Makefile +/Makefile.in +/aclocal.m4 +/autom4te.cache +/compile +/config.* +/configure +/depcomp +/install-sh +/libdvdcss.la +/libdvdcss.spec +/libdvdcss*.tar.* +/libtool +/ltmain.sh +/missing +/stamp-* +/doc/doxygen.cfg +/doc/doxygen_sqlite3.db +/doc/html +/m4/libtool.m4 +/m4/lt*.m4 +/src/*.lo +/src/*.o +/src/.deps +/src/.dirstamp +/src/.libs +/src/libdvdcss.pc +/test/*.exe +/test/*.o +/test/.deps +/test/.dirstamp +/test/.libs +/test/csstest +/test/dvd_region diff --git a/libdvdcss/.gitlab-ci.yml b/libdvdcss/.gitlab-ci.yml new file mode 100644 index 0000000..47905bb --- /dev/null +++ b/libdvdcss/.gitlab-ci.yml @@ -0,0 +1,74 @@ +stages: + - build + +variables: + GIT_SUBMODULE_STRATEGY: normal + +.build-common: + stage: build + except: + - schedules + +.build-docker: + extends: .build-common + tags: + - docker + - amd64 + +build-debian: + extends: .build-docker + image: registry.videolan.org/vlc-debian-unstable:20210315112333 + script: + - autoreconf -fisv + - mkdir build + - cd build + - ../configure + - make -j $(getconf _NPROCESSORS_ONLN) + +build-macos: + extends: .build-common + tags: + - catalina + - amd64 + script: + - autoreconf -fisv + - mkdir build + - cd build + - ../configure + - make -j $(getconf _NPROCESSORS_ONLN) + +build-win64: + extends: .build-docker + image: registry.videolan.org/vlc-debian-win64:20201106143728 + script: + - autoreconf -fisv + - mkdir build + - cd build + - ../configure --host=x86_64-w64-mingw32 + - make -j $(getconf _NPROCESSORS_ONLN) + +build-win32: + extends: .build-docker + image: registry.videolan.org/vlc-debian-win32:20201106141924 + script: + - autoreconf -fisv + - mkdir build + - cd build + - ../configure --host=i686-w64-mingw32 + - make -j $(getconf _NPROCESSORS_ONLN) + +pages: + extends: .build-docker + image: + name: registry.videolan.org/vlc-debian-unstable:20210315112333 + script: + - autoreconf -fisv + - ./configure + - make apidoc + - mv doc/html public + artifacts: + paths: + - public + only: + - schedules + except: diff --git a/libdvdcss/AUTHORS b/libdvdcss/AUTHORS new file mode 100644 index 0000000..7d3920a --- /dev/null +++ b/libdvdcss/AUTHORS @@ -0,0 +1,88 @@ +# The format of this file was inspired by the Linux kernel CREDITS file. +# +# Authors and contributors are listed alphabetically. +# +# The fields are: name (N), email (E), web address (W), +# PGP key ID and fingerprint (P), description (D) + +N: Billy Biggs +E: vektor@dumbterm.net +D: libdvdcss enhancements + +N: Diego Biurrun +E: diego@biurrun.de +D: misc build and portability fixes, cleanup + +N: Stéphane Borel +E: stef@via.ecp.fr +D: original CSS decryption code from VLC + +N: Sven Heithecker +E: sven.heithecker@web.de +D: cache bug fix for discs with identical content but different keys + +N: Håkan Hjort +E: d95hjort@dtek.chalmers.se +D: Solaris port of the DVD ioctls +D: libdvdcss enhancements + +N: Samuel Hocevar +E: sam@zoy.org +D: original CSS decryption code from VLC + +N: Eugenio Jarosiewicz +E: ej0@cise.ufl.edu +D: Mac OS X DVD ioctls + +N: Jon Lech Johansen +E: jon-vl@nanocrew.net +D: Win32 port +D: Fixes to the Darwin port + +N: KO Myung-Hun +E: komh@chollian.net +D: OS/2 port + +N: Jean-Baptiste Kempf +E: jb@videolan.org +D: maintainer + +N: Markus Kuespert +E: ltlBeBoy@beosmail.com +D: BeOS port of the DVD ioctls + +N: Pascal Levesque +E: Pascal.Levesque@mindready.com +D: QNX port + +N: Steve Lhomme +E: steve.lhomme@free.fr +D: Windows improvements + +N: Christophe Massiot +E: massiot@via.ecp.fr +D: former maintainer + +N: Diego Elio Pettenò +E: flameeyes@flameeyes.eu +D: build system rewrite + +N: Steven M. Schultz +E: sms@TO.GD-ES.COM +D: BSD/OS port + +N: David Siebörger +E: drs-videolan@rucus.ru.ac.za +D: HP-UX port of the DVD ioctls + +N: Alex Strelnikov +E: lelik@os2.ru +D: OS/2 port + +N: German Tischler +E: tanis@gaspode.franken.de +D: FreeBSD DVD input + +N: Gildas Bazin +E: gbazin@netcourrier.com +D: various fixes to the Windows port diff --git a/libdvdcss/COPYING b/libdvdcss/COPYING new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/libdvdcss/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/libdvdcss/INSTALL b/libdvdcss/INSTALL new file mode 100644 index 0000000..fb78a2d --- /dev/null +++ b/libdvdcss/INSTALL @@ -0,0 +1,67 @@ +INSTALL file for libdvdcss, a DVD access library + + +Configuring libdvdcss +===================== + +A typical way to configure libdvdcss is: + + ./configure --prefix=/usr + +See `./configure --help' for more information. + + +If you got libdvdcss from its version control system, please bootstrap first: + + autoreconf -i + + +Building libdvdcss +================== + +Once configured, run `make' to build libdvdcss. + +If you have player keys, you need to put them in the file csskeys.h, before +configuring libdvdcss to enable the "key" method (the one from libcss). + + +Installing libdvdcss +==================== + +You can install libdvdcss by typing: + + make install + + +Building libdvdcss for Windows +============================== + +There are two alternative ways to build libdvdcss for Windows. + +- on a host with the mingw-w64 cross-compilers: + + Tell configure about the compiler to use. If you run, for example, Debian, + Ubuntu, or Cygwin under Windows with the necessary mingw64 packages + installed, it would be: + + for a 32-bit target platform: + ./configure --host=i686-w64-mingw32 + make + + or for a 64-bit target platform: + ./configure --host=x86_64-w64-mingw32 + make + +- natively on Windows with MSYS + MinGW (www.mingw.org): + + (MSYS is a minimal build environment to compile Unixish projects under + Windows. It provides all the common Unix tools like sh, GNU Make...) + + You will need to download and install the latest MSYS and MinGW. + + To build libdvdcss you just have to run the following commands: + + ./configure + make + + More about MSYS on our wiki: http://wiki.videolan.org/Win32CompileMSYS diff --git a/libdvdcss/Makefile.am b/libdvdcss/Makefile.am new file mode 100644 index 0000000..8dba910 --- /dev/null +++ b/libdvdcss/Makefile.am @@ -0,0 +1,83 @@ +ACLOCAL_AMFLAGS = -I m4 +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src/dvdcss + +EXTRA_DIST = msvc libdvdcss.spec INSTALL + +dist_doc_DATA = AUTHORS COPYING NEWS README.md ChangeLog + +MAINTAINERCLEANFILES = ChangeLog + +ChangeLog: $(wildcard $(srcdir)/.git/logs/HEAD) +if GIT + -cd $(srcdir) && git log > $(abs_builddir)/$(@)-tmp + test -s $(@)-tmp && mv $(@)-tmp $(@) + -rm -f $(@)-tmp +endif + test -e $(@) || touch $(@) + +lib_LTLIBRARIES = libdvdcss.la +EXTRA_PROGRAMS = test/csstest test/dvd_region + +libdvdcss_la_SOURCES = \ + src/libdvdcss.c \ + src/libdvdcss.h \ + src/device.c \ + src/device.h \ + src/css.c \ + src/css.h \ + src/csstables.h \ + src/ioctl.c \ + src/ioctl.h \ + src/error.c \ + src/common.h + +libdvdcss_la_LDFLAGS = -version-info $(DVDCSS_LTVERSION) $(DVDCSS_LDFLAGS) +libdvdcss_la_LIBADD = + +if !SYS_MSVC +libdvdcss_la_LDFLAGS += -no-undefined +endif + +test_csstest_SOURCES = test/csstest.c +test_csstest_LDADD = libdvdcss.la +test_csstest_CFLAGS = -I $(top_srcdir)/src + +test_dvd_region_SOURCES = test/dvd_region.c +test_dvd_region_LDADD = libdvdcss.la +test_dvd_region_CFLAGS = -I $(top_srcdir)/src + +pkgincludedir = $(includedir)/dvdcss +pkginclude_HEADERS = \ + src/dvdcss/dvdcss.h \ + src/dvdcss/version.h + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = src/libdvdcss.pc + +if APIDOC +all-local: apidoc +install-data-local: install-apidoc +uninstall-hook: uninstall-apidoc +endif + +apidoc: stamp-doxygen + +stamp-doxygen: doc/doxygen.cfg src/libdvdcss.c src/dvdcss/dvdcss.h + doxygen $< + touch $@ + +tools: test/csstest$(EXEEXT) test/dvd_region$(EXEEXT) + +clean-local: + -rm -Rf stamp-doxygen doc/doxygen_sqlite3.db libdvdcss.spec doc/html + +install-apidoc: + $(MKDIR_P) $(DESTDIR)$(htmldir) + for file in doc/html/*; do \ + $(INSTALL_DATA) $$file "$(DESTDIR)$(htmldir)" || exit 1; \ + done; + +uninstall-apidoc: + -rm -Rf $(DESTDIR)$(htmldir)/*.png $(DESTDIR)$(htmldir)/*.html $(DESTDIR)$(htmldir)/*.css $(DESTDIR)$(htmldir)/*.js + +.PHONY: apidoc tools diff --git a/libdvdcss/NEWS b/libdvdcss/NEWS new file mode 100644 index 0000000..370f995 --- /dev/null +++ b/libdvdcss/NEWS @@ -0,0 +1,192 @@ +Changes between 1.4.2 and 1.4.3: +-------------------------------- + + * Fix opening non-ASCII paths in Windows + * Fix potential buffer overflow if PATH_MAX is reached + + +Changes between 1.4.1 and 1.4.2: +-------------------------------- + + * Fix buffer overflow when region mask is 0x0 + * Fix invalid free on Open + + +Changes between 1.4.0 and 1.4.1: +-------------------------------- + + * Fix crashes in cache directory creation + * Fix cases where the cache directory was not used + + +Changes between 1.3.99 and 1.4.0: +--------------------------------- + + * Add key caching on Android + * Fix leaks, win32 build breakage, file descriptor initialization + * Expose version.h + + +Changes between 1.3.0 and 1.3.99: +--------------------------------- + + * Drop support for HP-UX. + * Drop support for Windows 9x and Windows NT. + Windows 2000 is now required. + * Replace BeOS support by Haiku support. + * Add dvdcss_open_stream() to public API. This allows installing custom + callback functions for accessing DVD, e.g. over the network. + * dvdcss_error() now returns "const char *" instead of "char *". + * Drop support for MSVC versions before 2010. + * Raw device access now errors out if the device cannot be opened. + * Miscellaneous cleanups to code, documentation, build system. + + +Changes between 1.2.13 and 1.3.0: +--------------------------------- + + * Dropped deprecated, undocumented API: + - the function dvdcss_title() + - the type dvdcss_handle + - the variable dvdcss_interface_2 + * Drop support for Windows 98 and Windows NT 4.0. + Windows 98 SE with IE 5.0 and Windows NT 4.0 SP4 with IE 5.0 are required. + * Support for Android + + +Changes between 1.2.12 and 1.2.13: +---------------------------------- + + * Drop BSD/OS and Windows 95 support. + * Rewrite most of the build system and simplify it. + * System-dependent code cleanup + * Move to Git and rewrite the history to get proper authorship. + * Drop LaTeX documentation. + * Fix build on various systems including MSVC. + + +Changes between 1.2.11 and 1.2.12: +---------------------------------- + + * Fix regression with RPC-I drive handling. + + +Changes between 1.2.10 and 1.2.11: +---------------------------------- + + * improvements with RPC-II handling + * more robust key retrieval + * fixes for MinGW compilation + * fixes for OS/2 compilation + * various bug fixes for small issues, memleaks, crashes and build problems + + +Changes between 1.2.9 and 1.2.10: +--------------------------------- + + * DVD drive autodetection + * new dvdcss_is_scrambled() function + * various failure recovery improvements + * accept "X:\", as well as "X:" as device name + * various bug fixes + +Changes between 1.2.8 and 1.2.9: +-------------------------------- + + * more robust key caching + * support for cache directory tags + * improved seeking on Win32 + * support for Solaris libsmedia library + +Changes between 1.2.7 and 1.2.8: +-------------------------------- + + * Win32 fix for encrypted DVDs + * workaround for strange discs that report read errors seemingly at random + +Changes between 1.2.6 and 1.2.7: +-------------------------------- + + * key caching activated by default + * fix for collisions between cached keys + * packaging improvements for Debian + * packaging improvements for RPM-based distributions + +Changes between 1.2.5 and 1.2.6: +-------------------------------- + + * compilation fix for most Unixes + +Changes between 1.2.4 and 1.2.5: +-------------------------------- + + * key cache support + * improved robustness in case of read errors + * now builds under Cygwin + * now builds under Microsoft Visual C++ + +Changes between 1.2.3 and 1.2.4: +-------------------------------- + + * Administrator privileges are no longer required under Windows NT/2000/XP. + +Changes between 1.2.2 and 1.2.3: +-------------------------------- + + * many Windows bug fixes + * workaround for drives which prevent key decryption + +Changes between 1.2.1 and 1.2.2: +-------------------------------- + + * fix for the "ioctl_ReadTitleKey failed" bug on RPC2 drives + * better error checking + * improved documentation + * OS/2 port + +Changes between 1.2.0 and 1.2.1: +-------------------------------- + + * fix for discs with a mismatched region + * QNX port + +Changes between 1.1.1 and 1.2.0: +-------------------------------- + + * fix for a crash when an unencrypted sector is found on a scrambled disc + * stability enhancements + +Changes between 1.1.0 and 1.1.1: +-------------------------------- + + * compilation fixes for BeOS, IRIX, OpenBSD + +Changes between 1.0.0 and 1.1.0: +-------------------------------- + + * merged all patches from the Ogle group + * lots of bug fixes + * HP-UX port + * better error recovery + * third descrambling implementation + +Changes between 0.0.3 and 1.0.0: +-------------------------------- + + * stable API + * OpenBSD port + * NetBSD port + * Mac OS X port + +Changes between 0.0.2 and 0.0.3: +-------------------------------- + + * fix to access the whole device under Win32 + * BSD/OS port + * Solaris port + +Changes between 0.0.1 and 0.0.2: +-------------------------------- + + * internal key cache mechanism + * stability fixes diff --git a/libdvdcss/README.md b/libdvdcss/README.md new file mode 100644 index 0000000..83a7b96 --- /dev/null +++ b/libdvdcss/README.md @@ -0,0 +1,76 @@ +# Goals and feature + +**Libdvdcss** is a portable abstraction **lib**rary for **DVD** decryption. + +It is part of the **VideoLAN** project, which among other things produces **VLC**, a full video client/server streaming solution. + +**VLC** can also be used as a standalone program to **play video streams** from a hard disk or a DVD. + + +**Libdvdcss** currently supported platforms are **GNU/Linux**, **FreeBSD**, **NetBSD**, **OpenBSD**, **Haiku**, **Mac OS X**, **Solaris**, **QNX**, **OS/2**, and **Windows NT 4.0 SP4** (with IE 5.0) or later. + +## Building and installing instructions for Libdvdcss + +See the [INSTALL file](https://code.videolan.org/videolan/libdvdcss/-/blob/master/INSTALL) for full instructions. + + +## Running libdvdcss + + +The behavior of the library can be changed by setting two environment variables : + +`DVDCSS_METHOD={title|disc|key}`: method for **key decryption** : + +- **title** : By default the decrypted title key is guessed from the encrypted + sectors of the stream. Thus it should work with a file as well as + the DVD device. But decrypting a title key may take too much time + or even fail. With the **title method**, the key is only checked at + the **beginning of each title**, so it will not work if the key + changes in the middle of a title. + +- **disc** : The disc key is **cracked first**. Afterwards all title keys can be + decrypted **instantly**, which allows checking them often. + +- **key** : The same as the "disc" method if you do not have a file with player + keys at compile time. If you do, disc key decryption will be faster. + This is the **default method** also employed by libcss. + + +`DVDCSS_VERBOSE={0|1|2}`: libdvdcss **verbosity** + +- **0**: no error messages, no debug messages (this is the default) +- **1**: only error messages +- **2**: error and debug messages + + +## Troubleshooting + + +A **mailing-list** has been set up for support and discussion about +libdvdcss. Its address is: + + + +To subscribe or unsubscribe, go [here](http://mailman.videolan.org/). + + +When reporting **bugs**, try to be as **precise** as possible (which OS, which +distribution, what plugins you were trying, and so on). + +## CoC + +The [VideoLAN Code of Conduct](https://wiki.videolan.org/CoC) applies to this project. + +## Licence + +**Libdvdcss** is released under the **General Public License**, ensuring it will stay free, and used only for free software products. + +## Resources + + +The [VideoLAN web site](http://www.videolan.org/) is a good start for +information about MPEG and DVD playback. + +Have a look at the [support section](https://www.videolan.org/support/) to look for answers. + +You can also have a look to [the documentation](https://videolan.videolan.me/libdvdcss/). diff --git a/libdvdcss/configure.ac b/libdvdcss/configure.ac new file mode 100644 index 0000000..fd9b20a --- /dev/null +++ b/libdvdcss/configure.ac @@ -0,0 +1,255 @@ +dnl library version number +m4_define([dvdcss_major], 1) +m4_define([dvdcss_minor], 4) +m4_define([dvdcss_micro], 3) +m4_define([dvdcss_version],[dvdcss_major.dvdcss_minor.dvdcss_micro]) + +AC_INIT(libdvdcss, dvdcss_version, , , https://www.videolan.org/developers/libdvdcss.html) +AC_CONFIG_SRCDIR([src/libdvdcss.c]) + +AC_PREREQ(2.50) +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip subdir-objects]) +AM_MAINTAINER_MODE([enable]) +dnl Enable silent rules only when available (automake 1.11 or later). +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +LT_INIT([win32-dll]) + +AC_CONFIG_HEADER(config.h) +AC_CONFIG_MACRO_DIR([m4]) + +dnl The libtool version numbers (DVDCSS_LT_*); Don't even think about faking this! +dnl +dnl immediately before every release do: +dnl =================================== +dnl if (the interface is totally unchanged from previous release) +dnl DVDCSS_LT_REVISION ++; +dnl else { /* interfaces have been added, removed or changed */ +dnl DVDCSS_LT_REVISION = 0; +dnl DVDCSS_LT_CURRENT ++; +dnl if (any interfaces have been _added_ since last release) +dnl AGE ++; +dnl if (any interfaces have been _removed_ or _incompatibly changed_) +dnl AGE = 0; +dnl } +dnl +dnl If you want to know more about what you are doing, here are some details: +dnl * DVDCSS_LT_CURRENT is the current API version +dnl * DVDCSS_LT_REVISION is an internal revision number which is increased when the API +dnl itself did not change +dnl * DVDCSS_LT_AGE is the number of previous API versions still supported by this library +dnl * libtool has its own numbering scheme, because local library numbering schemes +dnl are platform dependent +dnl * in Linux, the library will be named +dnl libname.so.(DVDCSS_LT_CURRENT - DVDCSS_LT_AGE).DVDCSS_LT_AGE.DVDCSS_LT_REVISION + +DVDCSS_LT_CURRENT=4 +DVDCSS_LT_AGE=2 +DVDCSS_LT_REVISION=0 + +AC_SUBST([DVDCSS_LTVERSION], [$DVDCSS_LT_CURRENT:$DVDCSS_LT_REVISION:$DVDCSS_LT_AGE]) + +AC_PROG_CC +AC_HEADER_STDC + +AC_C_CONST +AC_C_INLINE +AC_TYPE_SIZE_T + +AC_CHECK_HEADERS([unistd.h sys/param.h sys/uio.h pwd.h]dnl + [errno.h sys/types.h sys/stat.h fcntl.h io.h]) + +AC_CHECK_DECL([O_BINARY], [], + [AC_DEFINE([O_BINARY], [0], [Define O_BINARY if missing])], + [ + #if HAVE_SYS_TYPES_H + # include + #endif + #if HAVE_SYS_STAT_H + # include + #endif + #if HAVE_FCNTL_H + # include + #endif + ]) + +AC_SYS_LARGEFILE + +AC_CACHE_CHECK( + [for posix mkdir()], + [css_cv_mkdir_posix], [ + AC_COMPILE_IFELSE([AC_LANG_SOURCE([ +#ifdef HAVE_IO_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +int mkdir(const char *path, mode_t mode); + ]) + ], + [css_cv_mkdir_posix=yes], + [css_cv_mkdir_posix=no]) + ]) + +AS_IF([test "$css_cv_mkdir_posix" = "no"], [ + AC_DEFINE([HAVE_BROKEN_MKDIR], 1, [Define if you have a broken mkdir]) +]) + +dnl +dnl Check the operating system +dnl + +case x"${host_os}" in + xdarwin*) + CFLAGS="${CFLAGS} -no-cpp-precomp" + ;; + x*cygwin* | x*msys*) + CFLAGS="${CFLAGS} -mwin32" + AC_DEFINE([_WIN32_IE], 0x0501, [Define to '0x0501' for IE 5.01 (and shell) APIs.]) + ;; + xos2*) + LDFLAGS="-Zbin-files" + ;; + x*msvc*) + SYS_MSVC=1 + AC_DEFINE([_WIN32_IE], 0x0501, [Define to '0x0501' for IE 5.01 (and shell) APIs.]) + ;; + x*mingw* | x*wince* | x*mingwce*) + AC_DEFINE([_WIN32_IE], 0x0501, [Define to '0x0501' for IE 5.01 (and shell) APIs.]) + ;; + x*) + ;; +esac + +dnl +dnl libdvdcss: check for DVD ioctls +dnl + +dnl default is no +CAN_BUILD_LIBDVDCSS=0 + +dnl for windoze +AC_CHECK_HEADERS(windows.h,[ + AC_CHECK_HEADERS(winioctl.h,[ + CAN_BUILD_LIBDVDCSS=1 + ],,[ + #include + ]) +]) + +dnl for Unix +AC_CHECK_HEADERS(sys/ioctl.h,[ + CAN_BUILD_LIBDVDCSS=1 + AC_CHECK_HEADERS(sys/cdio.h sys/dvdio.h linux/cdrom.h dvd.h) + BSD_DVD_STRUCT=0 + LINUX_DVD_STRUCT=0 + OPENBSD_DVD_STRUCT=0 + dnl + dnl Old FreeBSD: sys/cdio.h + dnl + AC_EGREP_HEADER(dvd_struct,sys/cdio.h,[ + AC_DEFINE(DVD_STRUCT_IN_SYS_CDIO_H, 1, + Define if defines dvd_struct.) + AC_EGREP_HEADER(struct dvd_struct,sys/cdio.h,[ + BSD_DVD_STRUCT=1],[LINUX_DVD_STRUCT=1; OPENBSD_DVD_STRUCT=1]) + ]) + dnl + dnl Newer FreeBSD: sys/dvdio.h + dnl + AC_EGREP_HEADER(dvd_struct,sys/dvdio.h,[ + AC_DEFINE(DVD_STRUCT_IN_SYS_DVDIO_H, 1, + Define if defines dvd_struct.) + AC_EGREP_HEADER(struct dvd_struct,sys/dvdio.h,[ + BSD_DVD_STRUCT=1],[LINUX_DVD_STRUCT=1]) + ]) + dnl + dnl Linux: linux/cdrom.h + dnl + AC_EGREP_HEADER(dvd_struct,linux/cdrom.h,[ + AC_DEFINE(DVD_STRUCT_IN_LINUX_CDROM_H, 1, + Define if defines DVD_STRUCT.) + LINUX_DVD_STRUCT=1 + ]) + dnl + dnl Solaris: sys/scsi/scsi_types.h, sys/scsi/impl/uscsi.h + dnl + solaris_uscsi=yes + AC_CHECK_HEADERS([sys/scsi/scsi_types.h sys/scsi/impl/uscsi.h], [], + [solaris_uscsi=no; break;]) + AS_IF([test "$solaris_uscsi" = "yes"], [ + AC_DEFINE(SOLARIS_USCSI, 1, Have userspace SCSI headers.) + ]) + dnl + dnl Darwin + dnl + AC_CHECK_HEADER(IOKit/storage/IODVDMediaBSDClient.h,[ + AC_DEFINE(DARWIN_DVD_IOCTL, 1, Have IOKit DVD IOCTL headers) + DVDCSS_LDFLAGS="-Wl,-framework -Wl,CoreFoundation -Wl,-framework -Wl,IOKit" + ]) + dnl + dnl Final tests to check what was detected + dnl + if test x$LINUX_DVD_STRUCT = x1; then + AC_DEFINE(HAVE_LINUX_DVD_STRUCT, 1, + Define if Linux-like dvd_struct is defined.) + if test x$OPENBSD_DVD_STRUCT = x1; then + AC_DEFINE(HAVE_OPENBSD_DVD_STRUCT, 1, + Define if OpenBSD-like dvd_struct is defined.) + fi + else + if test x$BSD_DVD_STRUCT = x1; then + AC_DEFINE(HAVE_BSD_DVD_STRUCT, 1, + Define if FreeBSD-like dvd_struct is defined.) + fi + fi +]) + +CC_CHECK_CFLAGS_APPEND([-Wall -Wextra]) +CC_FLAG_VISIBILITY([ + CC_ATTRIBUTE_VISIBILITY([default], [ + CFLAGS="${CFLAGS} -fvisibility=hidden" + ]) +]) + +AM_CONDITIONAL(SYS_MSVC, test "${SYS_MSVC}" = "1") + +AC_ARG_ENABLE([doc], + AS_HELP_STRING([--disable-doc], [Disable building (with Doxygen) and installing API documentation @<:@default=auto@:@>])) + +AS_IF([test "x$enable_doc" != "xno"], [ + AC_PATH_PROG([DOXYGEN], [doxygen]) +]) + +AS_IF([test "x$DOXYGEN" = "x"], [ + AS_IF([test "x$enable_doc" = "xyes"], [ + AC_MSG_ERROR([You need Doxygen to build API documentation]) + ]) +]) +AM_CONDITIONAL([APIDOC], [test "x$DOXYGEN" != "x"]) + +AC_PATH_PROG([GIT], [git]) +AM_CONDITIONAL([GIT], [test "x$GIT" != "x"]) + +dnl export library version number +DVDCSS_VERSION_MAJOR=dvdcss_major() +DVDCSS_VERSION_MINOR=dvdcss_minor() +DVDCSS_VERSION_MICRO=dvdcss_micro() +AC_SUBST(DVDCSS_VERSION_MAJOR) +AC_SUBST(DVDCSS_VERSION_MINOR) +AC_SUBST(DVDCSS_VERSION_MICRO) + +AC_SUBST(DVDCSS_LDFLAGS) +AC_OUTPUT([ + Makefile + libdvdcss.spec + doc/doxygen.cfg + src/libdvdcss.pc + src/dvdcss/version.h +]) diff --git a/libdvdcss/doc/doxygen.cfg.in b/libdvdcss/doc/doxygen.cfg.in new file mode 100644 index 0000000..71abe61 --- /dev/null +++ b/libdvdcss/doc/doxygen.cfg.in @@ -0,0 +1,2293 @@ +# Doxyfile 1.8.6 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = @PACKAGE_NAME@ + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = @PACKAGE_VERSION@ + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = + +# With the PROJECT_LOGO tag one can specify an logo or icon that is included in +# the documentation. The maximum height of the logo should not exceed 55 pixels +# and the maximum width should not exceed 200 pixels. Doxygen will copy the logo +# to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = @abs_builddir@ + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = NO + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce a +# new page for each member. If set to NO, the documentation of a member will be +# part of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. +# +# Note For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by by putting a % sign in front of the word +# or globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO these classes will be included in the various overviews. This option has +# no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = NO + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable ( YES) or disable ( NO) the +# todo list. This list is created by putting \todo commands in the +# documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable ( YES) or disable ( NO) the +# test list. This list is created by putting \test commands in the +# documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable ( YES) or disable ( NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable ( YES) or disable ( NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES the list +# will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. Do not use file names with spaces, bibtex cannot handle them. See +# also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error ( stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO doxygen will only warn about wrong or incomplete parameter +# documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = YES + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT = @abs_top_srcdir@/src/dvdcss/dvdcss.h \ + @abs_top_srcdir@/src/libdvdcss.c + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = *.c \ + *.h + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = *_private.h + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER ) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = YES + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = YES + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES, then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = NO + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional user- +# defined cascading style sheet that is included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet file to the output directory. For an example +# see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the stylesheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler ( hhc.exe). If non-empty +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated ( +# YES) or that it should be included in the master .chm file ( NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index ( hhk), content ( hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated ( +# YES) or a normal table of contents ( NO) in the .chm file. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom stylesheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using prerendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /

          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

          FBa%hNTbzz(d3>$P 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℘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

      A3tnP3CH#H4YjM#!%ZH50w|@jN95~E0wdqx@azE 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ɬ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

    2. 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%0AZ_Our!T?yo>H0fTW);X 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

    GSt=A^ujPD}tGe#k3~k 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�Lhs+cx6wN?Q)6L3Cw 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 z%0A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